Thursday, December 21, 2006

The hazards of nepotism

(Hat tip: Thd Daily WTF.)

One of the advantages of being a contractor -- well, aside from getting paid nearly twice as much -- and aside from not having to work unpaid overtime -- is that being "on call" is generally not part of the job description. The whole 2AM-Oh-Crap-A-Batch-Job-Failed call followed by a six-hour I-Have-No-Idea-How-To-Fix-This-Crap debug session that's chased down with the Oh-Crap-It's-8Am-And-Time-To-Go-To-Work realization -- that pleasure is reserved for full-time employees. That's what Ivan D. believed, right up until he got a 2AM call of his own: we desperately need your help to find a screw in the warehouse; none of the full-timers are responding!
<snip>
In many warehouses, a delayed order would not be reason enough to wake up a developer, especially a contract developer. However, this particular warehouse stocked millions of airplane parts that were urgently requested by inbound and outbound flights. They called Ivan up because a gate-full of passengers were anxiously waiting for their already-delayed intercontinental flight to depart. A single screw was all that was needed to finish the routine maintenance and send everyone on their way.

The warehouse system is, to put it gently, a mess. It was written by the CTO's two nephews. True, they didn't know the languages they were going to be programming in, but there are lots of books on the languages, and both nephews can read. So eventually, it would work out.

Ivan arrived at the warehouse a little after 2:30AM and was greeted by a frantic foreman who immediately showed him the error message. It was fairly straight-forward: the database query from the RF scanner was timing out. Ivan took a peek at the change logs and saw that one of the nephews deployed a new version of communication module shortly before he left for the day. Whoops.

Ivan opened up the VB project and found the code that was causing the problem. It looked something like this: Set rsStock = objConn.Execute("SELECT * FROM [Inventory]") While Not rsStock.EOF If rsStock("ItemId") = intItemId Then Call SendItemToTransmitter(rsStock) End If rsStock.MoveNext Wend It turns out that bringing millions of rows down from the database into a VB application just to look for a single row is a bit slow. Fortunately, it was an easy fix, so Ivan simply added a WHERE clause to the query, compiled the code, and deployed it. Within minutes, the warehouse worker was able to use his RF scanner to locate the screw and send it to the plane. Everyone -- from the foreman to the network administrator -- was astonished that Ivan was able to fix the bug so quickly.

So, the nephews don't always write the best possible code. And since they're in charge, any tendency toward pointy-hairedness can be a problem.

Later that morning, Ivan arrived back at work feeling happy and refreshed. A few people thanked him again and his manager (the other nephew) asked to speak with him immediately. Ivan figured it'd be an official thank-you-for-saving-the-day thing. Not quite: the boss went off on him, criticizing him for coming in at an unauthorized time, making an unauthorized software change, and for compromising the integrity of the warehouse system.

Here in the States, this is a matter of the individual policy quirks of an owner. It will impact the productivity of one company. In countries where things like this are mandated by law or strict custom, the effect is to lower the productivity of an entire country's workforce. This is one of the reasons why overseas labor may cost less per hour. Thing is, you may be getting exactly what you pay for.

No comments: