The easiest and most popular place for Incompetents to hide is within the ranks of professional contractors. It's an easy job. Generally, the first few weeks are slow; everyone is so busy (hence the need for a contractor in the first place) that they have no time to train someone new. The next few weeks are equally slow, as only small and easy-to-understand tasks are dolled out. By the time anyone discovers the gross incompetence (if it's discovered at all), there's only a week or two left in the contract and they just let slide. And then The Incompetent moves on to his next contact.
Seasoned Incompetents are excellent at what they do: they look great on paper, know how to talk the talk, and definitely know how to avoid the walk. Mark B's company was fleeced by such an Incompetent. But this contractor, however, made one big mistake: he went to a smaller shop that actually needed and expected someone to help them out.
From the Incompetent's perspective, it seemed like any other contract. Some company needed a few weeks of work done on some C#-based web service. However, on his first day, the company did something a little unexpected. They handed him detailed specifications of what needed to be coded and thorough instructions on how to get started.
In a situation such as this, The Incompetent would normally bombard his coworkers with endless questions about process and configuration. But every question he could think of asking was already addressed in the documentation. He had no choice but to say that he'd get started right away.
Through his few weeks, The Incompetent gave daily status reports, all which said that progress was moving along as planned. Occasionally, he'd mention some problem, but say that he was able to sort it out by himself. No one really had time to check up on him, but it seemed things were going fairly well and everyone was confident in The Incompetent's ability to get the job done.
At the beginning of his last week, The Incompetent sent an email saying that everything was finished, so Mark sat down with him to see where things were at. The view that greeted Mark was shocking; it's not that the code was bad, it simply wasn't there. Nothing was actually finished. To confirm this suspicion, Mark printed off a change report to see all that The Incompetent had done:
Changes in File: editChannel.aspx
320 Ins: //now where do I retrive the contactChannelID from
321 Ins: //hmm!!!!
322 Ins: //OK I've added contactChannelID to the customer object
323 Ins: //not sure if I should have done that but it solves an immediate problem.
339 Ins: //so we've now got our hands on the valitidity minutes value
340 Ins: //so we now have to do some datdiff tests
341 Ins: //we have the AuthenticationInfoDateTime that holds a string rep
342 Ins: // of a datetime value... here comes some casting
343 Ins:
344 Ins: DateTime startingtime = Convert.ToDateTime(AuthenticationInfoDateTime).ToUniversalTime();
346 Ins: DateTime currenttime = DateTime.Now.ToUniversalTime();
348 Ins: DateTime howLong = startingtime.Subtract(currenttime);
Changes in File: authenticate.aspx
134 Ins: //hmmmm!!!!! - I can get the password out of the AuthenticationInfo
135 Ins: //so we can build a string to hash and != against and throw an exception.
136 Ins: //hmmm!!!!!
137 Ins:
138 Ins: StringBuilder hashString = new StringBuilder();
139 Ins: //just to be on the safe side cast the buggers to strings and trim them
Mark went straight to the CTO to explain what had happened. The CTO was a bit skeptical; perhaps The Incompetent simply forgot to check in everything to source control? They both went to his desk to for an explanation, but found that the contractor simply up and left. The only trace that remained was the following note.
In the end, Mark and two other developers put in a long weekend to finish up all the work that The Incompetent was supposed to do. As for The Incompetent, he's likely working on another contract, this time at a larger company.