Archive for the 'Software Development' Category

An Outsourcing “Mess”

Recently I dealt with a software development company that used an outsourced development model which comprised the following locations:

  • India: Development centres comprising dozens of developers.
  • Canada: Technical management and some development.
  • USA: Data center hosting test and production servers.

My exposure to the company was relatively brief but from what I saw and heard the model was a mess.  It was a mess because:

  • There were software quality issues and inadequate quality metrics.
  • There were network communication latency and availability issues between India and North America.  Acquiring high volumes of software artefacts from India was a time consuming process and there were regular network outages.
  • Language and time zone differences created communication issues between India and Canada.
  • The huge time zone difference sometimes required Canadian personnel to regularly meet during evening hours when Indian personnel were available.

Pretty standard issues that have plagued outsourcing since it became in vogue.

I am sure some of their quality issues can be addressed with the introduction of better practices and tools.   But I bet that a number of quality issues are directly related to the software development being done in a different country, in a radically different time and “language” zone.

I am not suggesting that all software development outsourcing models are subject to quality issues.  And I am not suggesting that a well thought out strategic approach to developing an outsourcing partnership is going to yield a mess.  However, I’ve been “around” outsourcing enough now to know that if the company in question added up all the hidden costs of their outsourced model (related to poor quality, management/translation overhead, communication, etc), they would likely find the costs savings to be either minimal or non existent compared to a “home sourced” model.

A “home sourced” model includes what I see as the very viable rural sourcing approach as provided by companies such as Rural SourcingMonty Hamilton has recently taken over as CEO, and has big plans to increase and improve the company’s presence and profile.  Rural Sourcing’s labor cost is reported to be about $60/hour, around double what it would cost in India but at least half the cost of using a big consultancy.  So, although the “on paper” labor rate is higher than the Indian labor rate, taking the hidden costs of oursourcing into account should make a rural sourced rate of $60/hour very attractive.  Costs are certainly very important but think of the huge advantages of having your development team based in North America and within a reasonable time zone.  It’s especially advantageous when developing business oriented solutions that require extensive collaboration and communication around the team of peers (and I’m including team leads and management as well in the term “peers”!).  Of course, that comparison will be changing as the Indian market changes to address the current economic conditions and what I’m seeing as an ever increasing propensity by businesses to either not outsource, or to “backshore” their tech shops.

Back to the company in question that’s got itself in an outsourcing “mess”.  I would love to be involved in building the business case to move that company from an Indian based development centre to a rural sourced presence somewhere in North America.  I think it would be a slam dunk win for backshoring.

Technorati Logo , ,

MSIL Foray

Recently I took a dive into the world of Microsoft Intermediate Language (MSIL).  Why? I didn’t yet have the source code for an assembly I was referencing and I needed to remove a date validation constraint that was affecting the solution.  This is how I resolved the situation:

  • Disassembled the assembly into Microsoft Intermediate Language (IL) using the Microsoft IL Disassembler (ildasm.exe) located in “C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin”.
  • Edited the MSIL file and updated the date validation code to pass validation.
  • Assembled the IL back into an assembly using the Microsoft IL Assembler (ilasm.exe) located in “C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322″.

Pretty straight forward except for having to learn some MSIL.  Oh, and there was also the effort required to identify the area of code in question.  To cut that story short, I’ll simply say that I pinned down the boolean variable that was used to determine if today’s date was within or outside of the hard coded date range … and that variable is simply “named” variable “2″. I searched the MSIL file for all areas where variable “2″ was updated and then came across the date validation logic that I had to amend.

Following is the MSIL code snippet containing the date validation check which I’ve amended to pass validation by “widening” the year values.  This snippet is asking the question: Is the current date between Oct 3, 2009 and Aug 7, 2000? If so, then the “date invalid” flag is set to true, otherwise leave the “date invalid” flag as false.

  • IL_0017: Get the current date and push it on to the stack.
  • IL_001c: Push the value 0×7d9 (2009) on to the stack.
  • IL_0021: Push the value 10 on to the stack.
  • IL_0023: Push the value 3 on to the stack.
  • IL_0024: Instantiate a DateTime instance for the date Oct 3, 2009. This will pop the year, month, and day values from the stack leaving the current date (from IL_017) at the top of the stack.
  • IL_0029: Compare the current date to Oct 3, 2009 and place the result on the stack.
  • IL_002e: Load the value 0 on to the stack.
  • IL_002f: Compare the value 0 (from top of stack) to the DateTime::Compare result (second from top on the stack) and branch to IL_004a if greater than or equal. In other words, if “Now” is greater than or equal to Oct 3, 2009, branch to IL_004a where the date validation flag is set to true, meaning “failed validation”.
  • IL_0031 to IL_0048: Compare “Now” to the date Aug 7, 2000 and branch to IL_004c if “Now” is greater than or equal to Aug 7, 2000. In other words, branch past the code that sets the date validation flag “invalid” (value of 1).
  • IL_004a to IL_004b: Push the value 1 (true, in this case) on to the stack and store that value (stloc) in location 2 (”variable 2″). In order words set the “date is invalid” variable to true.
Technorati Logo ,



Bad Behavior has blocked 76 access attempts in the last 7 days.