The story of our BPM Engine’s birth (Embeddable Human Workflow Service) and the role of ElasticSearch in it.

In 2013 we bagged a development project from one of the largest fresh produce company in the world based out of USA to build half a dozen custom workflows and incrementally add more workflows in the future. One of our senior architect went onsite to their location for requirement, environment , Systems dependencies study and from that he arrived with a solution design and implementation plan which includes project sizing, effort, cost & timeline etc.

The client wanted to to build the workflow application in Force.Com platform because their Trade Promotions Management (TPM) system was built in Force.com but we decided not to go with that the reason being it is very proprietary and lot of custom built applications were already in Microsoft .NET stack and it made sense to stick to MS.NET as the support from Microsoft also guaranteed and good.

During the study our team learnt that each workflow request details (I mean the data captured in the workflow request or attributes) are completely different. You can consider a typical example of a workflow requests are (For security reason, I cannot reveal the actual request form but similar)

  1. Expense claims approval request
  2. Hiring approval request (Hiring request)
  3. Leave approval request
  4. Travel approval request
  5. Loan approval request

With my experiences from full stack BPM solutions implementation (product evaluation, procurement, training and implementation) in Infosys back in 2006, I realized that we need to build a light weight BPM engine. Commercially off the shelf BPM engine was out of question due to the complexities it brings in, licensing cost, infra requirement, consultants demand their and their exorbitant salary etc! also I wiped out windows workflow foundation which IMHO is a failure framework form Microsoft and SharePoint is more for document workflow hence custom build in .NET was the proposal we put forward and were able to got their IT team approval to move-ahead.

The Design Challenge

Being an ALT.NET advocate, I wanted the design based on SOLID principles (loose coupling, plug & play, scalable etc.) as the client also given enough and reasonable time for the project and they were very co-operative. More than the BPM engine the design challenge is Workflow Request Domain Model (Data model), I wanted to keep one single code base and one single domain model for all the workflow request so the natural choice of the database is Document Database / schema less (No SQL) but the customer felt it is risk because of the first time implementation in the enterprise and not time tested in their environment hence seeking approval from various groups inside the enterprise might take longer time or will not get approval due to lengthy approval process and policies involved in it so as an alternate I suggested to store it in single table in a single column as JSON (like in No SQL) with a compromise  that We cannot query the request object as it involves string parsing or loading the domain model as POCO collections in the client (.NET) which is not advisable and it will not scale as time passes and data grows.”

(Note: The above design is against RDBMS concept but it just works(Ed) as Jason Fried says in his book “Rework”)

Note: We didn’t had any need to query the workflow request hence it was easy to go with the above approach but what-if if the need comes in the later stage? The Answer was “No SQL” i.e. we had a plan of importing the workflow data into the document database like (reporting server / de-normalized database) and fire-up JSON based queries and present the result. Even if we import into the Document database, it will demand strongly typed objects (domain model) which we didn’t had in our design (we used C# dynamics and leveraged DLR) …this is the requirement for RAVENDB whereas MongoDB accepts any JSON/ schema without strongly typed domain model which is an optional one [This is where ElasticSearch came into the picture and our initial design embraced it without any hassle]

I was very specific in the design to cut short the #. Of lines of code, encourage code re-use and leverage DLR (Dynamic Language Runtime) capabilities of the .NET which Microsoft released to promote C# as dynamic language like Python etc. We took following decisions

  1. Use C# dynamics and no separate domain model or view model for each workflow request and any domain per say.
  2. All data has to be first class JSON citizen so that in the future we can migrate to Document database (No SQL like MongoDB or Raven DB)
  3. Use Massive Micro ORM layer which built on C# dynamics (DLR) which will cut the data access code to sub zero.
  4. For workflow status querying, we designed a standard workflow table which has dedicated fields for direct querying but the entire request object is stored in a single text field JSON so we are free to store anything. This will help us to import into schema less DB like Mongo etc. in the future
  5. First time to develop in ASP.NET MVC and making our controller act as RESTful end point using content negotiation.
  6. Build a generic Audit trail engine based on “Event Sourcing Design Pattern”. All the data stored as JSON
  7. Build workflow engine by leveraging proven design patterns (i.e. Chain of responsibilities, Strategy, Specification)
  8. Plus all our standard architecture, tools and frameworks i.e. Spring.Net for DI & AOP, JSON.NET for JSON serializing & de-serializing, client side template, ASP.NET controllers for view rendering and RESTfy

We finished the development and thoroughly tested our design; all worked well as expected however we did continuous fine-tuning.

What is the role of Elasticsearch?

We realized the potential of the work we did for this client and we thought why not we create it as a product; also as we learnt from our pre-sales pipeline that many companies live with manual excel based workflows or custom developed rudimentary workflow tools with tightly coupled business rules which is hard to modify. The cost of the workflow products are huge which SME cannot afford and many don’t want to go for cloud based tools as they feel their data is not secured, all of this encouraged us to make this as generic workflow engine!

When we approached the prospects, most wanted the solution in Open Source Platform and not in MS.NET stack plus their need is also querying the workflow requests so we decided to re-write it in JAVA/PLAY framework with MongoDB & My SQL as Backend and Elasticsearch for Querying and reporting engine.

For Elasticserach querying, we ran a scheduled job which will push the workflow request into RabbitMQ queue and a listener will pick up from the queue and push it into the Elasticsearch Server and builds up the index. We wrote bunch of elasticsearch JSON based queries to pull the results and weaved into our UI layer. This is up and running in-house @ Vmoksha, nearly 10 internal workflows built in this design and rolled out to production which caters 150 of our employees on daily basis. The result from elastic search is lightening fast.

What are the other places we use ElasticSearch @ Vmoksha?

Apart from BPM, we heavily use ElasticSearch to store custom index of the data from our Applicant Tracking System (ATS) built in Open Source Rails based tool REDMINE and on top it we wrote Elasticsearch Scalar queries to power our dashboards, also we use ElasticSearch to pull our P&L data from custom SQL server database and present it in our Executive and Financial Dashboard, Our CRM metrics dashboard is powered by Elasticsearch where the data is coming from SQL Server.

Architecture of our (Vmoksha’s) vBPM, Embeddable Human Workflow Service

We have it in two flavors MS.NET & JAVA (PLAY). vBPM expose its functionalities as RESTful services and can be easily accessed from any client i.e. mobile, web, windows etc. and it is technology agnostic. The Input to the vBPM & output from the vBPM is JSON which is very light weight in nature and easy to consume from any type of client. Security is implemented using Json Web Token (JWT)

TBD : ElasticSearch & RabbitMQ are optional components hence not depicted in the diagram. I am working in creating a new diagram and once done this will be updated.

image

Workflow Designer : vBPM persist the workflow definition in the MySql tables (Workflow & actors table). It will have a rudimentary web based user interface to configure the workflows and steps, alternatively one can setup the workflow by directly entering the data in to the MySql tables.

Workflow Execution Engine : It is a Java class file which implements Chain of responsibility (CoR) design pattern. All of the functionalities of the workflow are exposed as RESTful apis. Once the workflow instances are kicked-in, this will read the workflow meta data and accordingly execute the instance. The actors of the workflow steps will be identified using CoR & Workflow rules.

Business Rules Engine : It is a a Java class file implemented using Strategy Design pattern tied together with CoR through Spring DI & AOP

Activity Monitor : During workflow process execution, the state of the workflow can be queried through Activity Monitor which can be presented in the client layer. This will be exposed as REST api.

ElasticSearch & RabbitMQ is optional components for high performance searching & querying.

SLA Manager : At workflow level & at workflow step level, SLA can be configured. The Workflow execution engine will monitor the cross over of the SLA and raises corresponding alerts and notifications which again will be a configurable template at workflow & step level.

Alerts & Notification : Custom alerts can be sent to the interested parties. Alert templates is a configurable parameter for every workflow and workflow actions. Email & SMS alerts can be sent. The system having a provision to configure any email & sms gateway through provider model design pattern.

External API invoker : The system has a provision to invoke external APIs and use their result as input for workflow routing.

How iBeacon can be leveraged for a real life scenario – Beep beep bus has arrived

Apple iBeacon (BLE based proximity sensors) are gaining huge attractions and opened lot of use cases in our day to day activities.

Bus Notifier

Mid last year I sourced dozens of Gimbal proximity sensors from US all the way to Japan and then to our India Office (No direct shipment to India hence I requested my acquaintance in Japan for help) for our lab purpose “Vmoksha Labs” for doing R&D using Proximity Sensors. For various reasons it was idle for many months until 3 Engineering students met me in the month of Dec 2014 to guide them for their Engineering academic projects in mobility….I proposed a use case using Gimbal proximity sensor (Beep beep bus has arrived)… which we published in our official blog http://vmokshagroup.com/vmbeacon-app/ by our Architect Princeton Paul Arokyaraj. (Image designed by our UX Architect Archana) Please read it and it is really interesting.

As of today, the engineering students converted the use case into a real life Android App which they are going to present as part of their final year project and we are showcasing it to our prospects and technology geeks…

Note: Our IOT division is handling many client projects which are interfacing with hardware and sensors. If you are looking for partner who develops mobile, IOT apps with hands on hardware knowledge then reach us @ information@vmokshagroup.com

We @ Vmoksha Technologies implemented Google MDM solution to distribute corporate apps to our employees

image

 

Last week we rolled out Google Mobile Device Management (MDM) solution @ Vmoksha Technologies Pvt. Ltd. to park all of our corporate Android Mobile applications in a secure manner in compliance with ISO27001 information security standards. With this we enabled “corporate owned, personally enabled (COPE) devices and employee owned devices as part of vmoksha’s bring your own device (BYOD) program

Actually we were evaluating open source MDM product WSO2 and almost finalized to implement but then we understood that Google itself provides MDM and it makes sense for us because we already use Google Apps for  business [Email, Calendar, Drive etc.] hence no integration & setup overheads (i.e. Loading Users, Defining Policies etc.) and the critical mass are Android users.

How to upload corporate android apps in PLAY Store?

Uploading Enterprise android apps into PLAY store is same as uploading apps for public except the app distribution is restricted to your windows domain [email domain]. This can be enabled by checking “Only make this application available to users of my Google Apps domain name (vmokshagroup.com)

A sample scree of ours is given below

image

 

How to download and install apps?

Once app is uploaded by the administrator into the Google PLAY store, employees can download and install the app directly from their android mobile device PLAY store PROVIDED THE DEVICE IS REGISTERED AND APPROVED BY YOUR GOOGLE BUSINESS APPS ADMINISTRATOR.

The device can be registered thru “Device Policy” android app as shown below. Once the device is registered, an email will go your Google business apps administrator to approve the device (and user) which make sure that the device can be remotely administered and controlled. In case the device was stolen or the employee leaves the organization the administrator can uninstall the apps, wipe out data (restrict access) etc. from Google MDM control panel over the wire.

 

Screenshot_2014-12-07-20-11-33

Once the above setup is through, we can see a new category listed under APPS – > CATEGORIES – > <your organization name> as shown below, clicking on <Your Organization name> will list all the apps [as per the access control defined for that user in the policies]. Clicking on each app, one can see the details of that app, install, uninstall, total downloads etc. like any other apps in the Google PLAY store.

Screenshot_2014-12-07-20-07-37Screenshot_2014-12-07-20-34-24Screenshot_2014-12-07-20-07-56

Inbound Email processor using Node.JS Mail-Notifier

I have written a simple but full fledged inbound email processor application using mail-notifier npm which internally uses imap & mailparser. The complete source code is in my Git Repository for download or clone

image

[Note: Image created using Lucid chart online diagramming tool]

In this application, I have taken care of the following business functionalities

  1. Continuously look for all incoming email messages
  2. When email arrived, process it and form a modified email JSON object with the following properties
    • From
    • To
    • Subject
    • Plain Text Body
    • Message ID
    • Date of the email
    • Attachments
  3. Keep the configurations in a separate config file i.e. Email credentials, Mongo connection string etc.
  4. Save the email object into Mongo DB store
  5. Save the email object as .txt/.json file in “uploads” folder
  6. Iterate through attachments if any and store it in “uploads” folder [TODO: MongoDB GridFS]

 

How to run the application?

  1. Clone the repository or download the zip and extract into a folder
  2. set the SMTP configuration in “config.js” – use your email credentials
  3. Set MongoDB configuration – this is optional; if you don’t need it then comment out following line in “mailprocessor.js”
    1. db.save(JSON.stringify(msg));
  4. Set mongo collection as “emails” – This is applicable only if point # 3 is valid.
  5. run “npm update” – this will download all the dependent node_modules recognized from the package.json
  6. run “node mailprocessor.js”

 

Why I created this?

  • Business Motive – We have our home-grown helpdesk / ticketing system for our employees to make any kind of support tickets online however employees are comfortable in sending helpdesk tickets thru email to helpdesk@ourdomain.com; it is our process that the helpdesk / IS team should make a ticket entry for every request received thru email. This application is built to automate ticket creation from email.
  • Passion – I wanted to try out in Node.JS as it is very simple due to the availability of loads of ready made NPMs but choosing the correct npm is the key
  • No full-fledged sample – During the course of development I could not find complete references and samples easily i.e. mailparsing, attachments etc. I collected lot of references from stackoverflow Q&As

Scope for improvement (or TBD)

  1. Email filters and rules to process only those emails which matches a specific condition
  2. Store the attachments in the MongoDB GridFS

Miscellaneous

  •  JavaScript IDEWebMatrix, it is free from Microsoft and simple to use with ability to integrate with Git Repo
  • MongoDB Query Analyser – MongoVUE

Colourful calendar icons useful for web widgets and phoneGap mobile app list views

We needed to display list of holidays in a small web widget & Mobile list view as shown in the below screenshots which we created as html, css calendar icons in different colors for each day in a week. We could have used images but it demands multiple images or we could have used font-awesome/glyph icons but it has limited support for colours [gradient effects etc.]. HTML/CSS3 is simple and elegant.

imageScreenshot_2014-11-30-21-09-51   image

You can see the sample html & css code live in my jsFiddle. Alternatively the html & css snippets is kept in my Gist

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>colorful calendar icons</title>
<style type="text/css">
/*
Css gradient generated from http://www.colorzilla.com/gradient-editor/
Calendar HTML/Css source reference from http://line25.com/wp-content/uploads/2012/date-icon/demo/index.html
*/
.cal-container {
width: 30px;
}
.date {
background: #fefefe;
background: linear-gradient(top,#fcfcfc 0,#dad8d8 100%);
background: -moz-linear-gradient(top,#fcfcfc 0,#dad8d8 100%);
border-radius: 5px;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-radius: 5px;
box-shadow: 0 0 15px rgba(0,0,0,.1);
-moz-box-shadow: 0 0 15px rgba(0,0,0,.1);
-webkit-box-shadow: 0 0 15px rgba(0,0,0,.1);
margin-top: 5px;
}
.date p {
font-family: Helvetica,sans-serif;
font-size: 12px;
font-weight: 700;
text-align: center;
color: #9e9e9e;
vertical-align: middle;
padding: 2px 0;
}
.date p span {
font-size: 10px;
font-weight: 700;
color: #fff;
text-transform: uppercase;
display: block;
border-radius: 0 0 5px 5px;
-moz-border-radius: 0 0 5px 5px;
-webkit-border-radius: 0 0 5px 5px;
padding: 2px 0;
}
.date p span.mon {
background: #e5e696;
background: -moz-linear-gradient(left,rgba(229,230,150,1)0,rgba(209,211,96,1)100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,rgba(229,230,150,1)),color-stop(100%,rgba(209,211,96,1)));
background: -webkit-linear-gradient(left,rgba(229,230,150,1)0,rgba(209,211,96,1)100%);
background: -o-linear-gradient(left,rgba(229,230,150,1)0,rgba(209,211,96,1)100%);
background: -ms-linear-gradient(left,rgba(229,230,150,1)0,rgba(209,211,96,1)100%);
background: linear-gradient(to right,rgba(229,230,150,1)0,rgba(209,211,96,1)100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e5e696', endColorstr='#d1d360', GradientType=1);
}
.date p span.tue {
background: #ffa84c;
background: -moz-linear-gradient(left,rgba(255,168,76,1)0,rgba(255,123,13,1)100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,rgba(255,168,76,1)),color-stop(100%,rgba(255,123,13,1)));
background: -webkit-linear-gradient(left,rgba(255,168,76,1)0,rgba(255,123,13,1)100%);
background: -o-linear-gradient(left,rgba(255,168,76,1)0,rgba(255,123,13,1)100%);
background: -ms-linear-gradient(left,rgba(255,168,76,1)0,rgba(255,123,13,1)100%);
background: linear-gradient(to right,rgba(255,168,76,1)0,rgba(255,123,13,1)100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa84c', endColorstr='#ff7b0d', GradientType=1);
}
.date p span.wed {
background: #627d4d;
background: -moz-linear-gradient(left,rgba(98,125,77,1)0,rgba(31,59,8,1)100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,rgba(98,125,77,1)),color-stop(100%,rgba(31,59,8,1)));
background: -webkit-linear-gradient(left,rgba(98,125,77,1)0,rgba(31,59,8,1)100%);
background: -o-linear-gradient(left,rgba(98,125,77,1)0,rgba(31,59,8,1)100%);
background: -ms-linear-gradient(left,rgba(98,125,77,1)0,rgba(31,59,8,1)100%);
background: linear-gradient(to right,rgba(98,125,77,1)0,rgba(31,59,8,1)100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#627d4d', endColorstr='#1f3b08', GradientType=1);
}
.date p span.thu {
background: #b3dced;
background: -moz-linear-gradient(left,rgba(179,220,237,1)0,rgba(41,184,229,1)50%,rgba(188,224,238,1)100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,rgba(179,220,237,1)),color-stop(50%,rgba(41,184,229,1)),color-stop(100%,rgba(188,224,238,1)));
background: -webkit-linear-gradient(left,rgba(179,220,237,1)0,rgba(41,184,229,1)50%,rgba(188,224,238,1)100%);
background: -o-linear-gradient(left,rgba(179,220,237,1)0,rgba(41,184,229,1)50%,rgba(188,224,238,1)100%);
background: -ms-linear-gradient(left,rgba(179,220,237,1)0,rgba(41,184,229,1)50%,rgba(188,224,238,1)100%);
background: linear-gradient(to right,rgba(179,220,237,1)0,rgba(41,184,229,1)50%,rgba(188,224,238,1)100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3dced', endColorstr='#bce0ee', GradientType=1);
}
.date p span.fri {
background: #6bba70;
background: -moz-linear-gradient(left,#6bba70 0,#6bba70 100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,#6bba70),color-stop(100%,#6bba70));
background: -webkit-linear-gradient(left,#6bba70 0,#6bba70 100%);
background: -o-linear-gradient(left,#6bba70 0,#6bba70 100%);
background: -ms-linear-gradient(left,#6bba70 0,#6bba70 100%);
background: linear-gradient(to right,#6bba70 0,#6bba70 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#6bba70', endColorstr='#6bba70', GradientType=1);
}
.date p span.sat {
background: #f2825b;
background: -moz-linear-gradient(left,#f2825b 0,#e55b2b 50%,#f07146 100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,#f2825b),color-stop(50%,#e55b2b),color-stop(100%,#f07146));
background: -webkit-linear-gradient(left,#f2825b 0,#e55b2b 50%,#f07146 100%);
background: -o-linear-gradient(left,#f2825b 0,#e55b2b 50%,#f07146 100%);
background: -ms-linear-gradient(left,#f2825b 0,#e55b2b 50%,#f07146 100%);
background: linear-gradient(to right,#f2825b 0,#e55b2b 50%,#f07146 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2825b', endColorstr='#f07146', GradientType=1);
}
.date p span.sun {
background: #a90329;
background: -moz-linear-gradient(left,#a90329 0,#8f0222 44%,#6d0019 100%);
background: -webkit-gradient(linear,left top,right top,color-stop(0%,#a90329),color-stop(44%,#8f0222),color-stop(100%,#6d0019));
background: -webkit-linear-gradient(left,#a90329 0,#8f0222 44%,#6d0019 100%);
background: -o-linear-gradient(left,#a90329 0,#8f0222 44%,#6d0019 100%);
background: -ms-linear-gradient(left,#a90329 0,#8f0222 44%,#6d0019 100%);
background: linear-gradient(to right,#a90329 0,#8f0222 44%,#6d0019 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#a90329', endColorstr='#6d0019', GradientType=1);
}
@-moz-document url-prefix() {
.date,.date p span {
padding: 5px 0;
}
}
</style>
</head>
<body>
<div class="cal-container">
<div class="date">
<p>17 <span class="mon">May</span></p>
</div>
</div>
<div class="cal-container">
<div class="date">
<p>18 <span class="tue">May</span></p>
</div>
</div>
<div class="cal-container">
<div class="date">
<p>19 <span class="wed">May</span></p>
</div>
</div>
<div class="cal-container">
<div class="date">
<p>20 <span class="thu">May</span></p>
</div>
</div>
<div class="cal-container">
<div class="date">
<p>21 <span class="fri">May</span></p>
</div>
</div>
<div class="cal-container">
<div class="date">
<p>22 <span class="sat">May</span></p>
</div>
</div>
<div class="cal-container">
<div class="date">
<p>23 <span class="sun">May</span></p>
</div>
</div>
</body></html>

view raw
Calendar-icons
hosted with ❤ by GitHub

Elegant & Re-usable diagrams for Architecture, System Design, Pre-Sales & Proposal activities etc.

If you are a Solution Architect or Presales team members then I am sure you would have prepared numerous diagrams for proposals, system design, Business Process flows etc. using varieties of tools i.e. MS Visio, Excel, Word and online tools like draw.io, lucid chart and many more…

I use all of these above tools but most predominantly Excel for stunning diagrams. Some of my diagrams I made it as excel template for re-usability which you can get it here and modify as per your need.

Sample Diagrams of mine…. [ Inspirations of the diagrams are from internet, reference books and some are my own ideas but I usually create it as fresh] . Download the excel template here.

Application Architecture

image

 

Layered Architecture [MS Patterns & Practices]

 

image

Release Management

image

 

Inter-layer / Component Flow of data [Martin Fowler’s EAA]

image

 

Schedule & Release Plan

image

 

Shift Coverage Matrix

image

Documents Collaboration

TBD

Enterprise Service Bus [Service Agents]

TBD

Stay tuned to check for numerous business process flow [Swim Lane] Visio diagrams soon.

If you get benefit from this template, please drop me an email @ senthilsweb@gmail.com or post it in the comments section which will encourage me to contribute more like this.

We are looking for MS.NET Technical Architects

Vmoksha-LogoWe have two openings for Microsoft .NET Technical Architect. Please see the job details below

Job Description:

  1. Requires advanced technical knowledge and a thorough understanding of the customer needs
  2. Contributes to the development, delivery and maintenance of technology-based business solutions
  3. Ability to draft Proposals, Technical Architecture / document & presentations.
  4. Review during various stages of development life cycle
  5. Integration and System Testing
  6. Implementation and Deployment
  7. Ability to respond and accept production issues and coordinate with stake holders
  8. Strong Analytical abilities, Communication skills, Client Interfacing skills

Required IT Skills:

  1. Core .NET , XML/XSL, JQUERY, JSON, AJAX, ASP.NET, WCF, MS SQL Server, Oracle / My SQL,  SQL Server Reporting Services, MS Visio, VSS/CVS/SVN
  2. Strong knowledge in Design Patterns and Principles, Enterprise Application Architecture, Project Estimations & Sizing, Resource Planning
  3. Preferable –  Cloud exposure (Windows Azure or equivalent), Experience on open source technologies such as NHibernate, Spring.Net, RabbitMQ, Node.JS, Rhino Service Bus/NServiceBus, NOSQL i.e. MongoDB, Redis, RavenDB databases would be a plus , Experience in performance testing using custom [or] commercial tools & profilers, Continueous Integration tools like Cruise Control.Net / Team City, MS TFS would be a plus.

Job Location: Bangalore, may require to travel onsite (Primarily to Europe or USA) on need basis.

If you feel that your profile meet the skill sets then send your profile to senthilnathank@vmokshagroup.com

ms.netalt.netspring.netnhibernateredminerabbitmqcruisecontrol.net

Some of our Highlights

We follow Object orientation approach and prefer to code against interface

We follow hybrid Agile PLM

Our MS.NET group is ALT.NET

We like SMART work than HARD work

We are passionate programmers

We are process oriented

We collect metrics and measure them often

We like to solve our customer problems through simple solutions

…and many more! come and join our family

Vmoksha Technologies, Technology Consulting Group a.k.a TCG group Photo during 2011 Christmas celebrations

TCG Group Photo

Bottom left to right: Bandita Choudhury, Ranjitha, Karthiga Baskaran, Paulomi Deb Roy.

Standing left to right row # 1: Asharani Mayaganahalli Shivanna, Arpana Chopra, SivaPrasad Jerripothula, Parandama Reddy Yarava, Senthilnathan Karuppaiah, Suraj Mustoor, Anubhav Srivastava, Princeton Paul Arockiaraj.

Standing left to right row # 2: Ankit Jaiswal, Suresh M, Nikhil Mishra, Ram Kapil Yerra, Srinivasa Raju, Karthik Devaraj, Narayanaswamy Gadamsetty, Chiranjeevi Cherukuri.