For the most part, it was like any other sales meeting. Robert sat in a dark conference room with the potential client's CTO, COO and a few other managers. A projector lit up the whiteboard with PowerPoint slides and screenshots from their in-house billing system. Janice, the CTO, went over the automated billing application and related processes so that Robert, an IT consultant, and his team could develop a proposal for maintaining it.

One thing seemed off, however. Janice spoke in absolutes, "When you start the contract ..." At first, Robert figured he was just that good in his pitch, and that she had already made a decision. But as Janice presented the Web application and its history, Robert realized it was something else. She was trying to sell him on taking the contract.

The Beginning of the End

The billing system started like so many other application disasters. In 2001, the company wanted to automate its billing process. After an extensive search of IT vendors, it decided to take the familiar route. The company asked employees if they "knew someone who could do the project" and hired the receptionist's second-cousin's father-in-law. He had apparently worked as a mainframe operator, kept a Pentium 133 in the basement running Windows 95 and had recently read a book about VB.

Two years and a few hundred thousand dollars later, the Web-based, automated billing system was finally deployed. It worked for a full three months before completely grinding to a halt. The father-in-law twice removed, now programmer, who was still onsite doing training, rushed in to save the day by working non-stop for a week to deploy a new version of the application and database.

As the months passed and the monthly programming expenses remained incredibly high, the CTO wondered when they would be able to move into the "support" phase of the project. The programmer responded by saying that he had been billing them the "support rate" all along, but that he could cut them a deal if they signed a two-year contract with a $10,000/month-retainer.

While the company considered the offer, the system ground to a halt once again. Suspiciously, it was almost exactly a year since the previous system-wide collapse. Once again, the programmer worked non-stop for several days and completely redeployed the software and database to correct the problem. He pointed out that this was exactly why they needed a maintenance contract. And that was why Robert was sitting in their conference room, learning about the application.

Web of Deceit

Without any further ado, Janice launched Internet Explorer to show Robert how the Web application worked. It presented a login screen that looked suspiciously like the Windows 2000 login prompt. As she typed in a name and password, Robert realized that it was Windows 2000.

The "Web" application worked by loading the Microsoft Remote Desktop ActiveX component in the browser and having the user run a desktop application on a remote computer. Janice didn't quite realize this, and didn't seem too happy when Robert mentioned that they'd have to buy Terminal Server CALs for each user of their "Web" application.

The UI was impressively outrageous. There were 20 different tabs, each with randomly placed controls, and a shared "working area" that contained even more controls. Users had to be careful not to accidentally "clear" the working area by inadvertently launching another action.

Janice mentioned that the "Web" application protected itself from concurrent access by allowing only a single user at a time. They had to implement this feature after simultaneous users would "stomp" over one another's data. Though easy to fix through CreateMutex(), Robert was amazed at all the code the programmer must have used to create this feature.

Years of Living Dangerously

Another feature of the application was the two buttons labeled "2005" and "2006" above the tab strip. Janice mentioned that this represented the "billing year," and needed to be set properly or the system would not generate properly. Prior to the last emergency fixes, the buttons were labeled "2004" and "2005."

Next stop on the application tour was the database. It was an Access database that sat on the same Windows 2000 server. And just like the app, the database used just about every design anti-pattern imaginable. Tables consisted primarily of TEXT(50) columns and no relationships were set up. Following suit with the "2005" and "2006" buttons from the application, there were tables named "2005Data" and "2006Data." There was also "2003Data" and "2004Data."

With only a few months before the new year, Robert asked what they were going to do in 2007. Janice, jaded and flustered, responded: "I think I'm going to be sick."

In the end, Robert's company declined the maintenance contract at any price point. Although they offered to assist in rewriting the system from scratch as a proper Web application with a real maintenance lifespan, the potential client declined. It eventually found some poor chump to maintain it.

I Think I'm Going To Be Sick was originally published in Alex's DevDisasters column in the February 1, 2008 issue of Redmond Developer News. RDN is a free magazine for influential readers and provides insight into Microsoft's plans and news on the latest happenings and products in the Windows development marketplace.