Several years ago my wife and I set out to renovate our home. Neither of us had any experience, but we had a vision. Little did we know that we would wind up in a real life rendition of the Tom Hanks movie, The Money Pit. As with any project, there are several ways to get started, and really only one of two possible outcomes, success, or failure. There are decisions to be made during each step in the journey, and often times it is difficult if not impossible to know how everything will turn out in advance.
The renovation project began with acquiring permits, interviewing various contractors, working with a drafter to help pen the blueprints for our dream home. Coincidently, our drafter’s name was Penn. We spent a few months planning, or at least thinking we were planning, but we were really still just dreaming about what will happen at that point. Meanwhile, the drafter finished the blueprints and secured the permits to start working. A local bank set us up with a construction loan, and we were in business. The only thing left to do was choose a contractor to do the work. To backtrack a bit, the reason for the renovation was not entirely by design. In fact, I thought I could do it myself and ended up demolishing our bathroom and kitchen. Standing in the rubble, I quickly realized there was no way I can put it back together again. Rule number one, know your limits.
In October of that year, we finally settled on a small contracting business who agreed to do everything we wanted in just 80 days. There were of course many choices, but budget and reputation factored into our decision. The bank we worked with hinted they would be a good choice, and the price/timeline seemed ideal…not the best, but reasonable. I actually can probably write an entire book on the what happened next, and someday I would like to, but for now, I just want to point out a few of the things that went wrong.
Managing a construction project is very similar to software design. The General Contractor provides oversight, plans out milestones, and dispatches small teams of workers to take care of various tasks to reach each milestone. The bank then pays the contractor at each successful milestone. There is some level of precedence in carrying out various tasks, but some tasks can be accomplished independently. In a nutshell, first pour the foundation, then frame the house, add in windows, and once the house is relatively waterproof, the electricians run the wiring, plumbers run pipes, then the general contractor takes over again and closes up the walls, installs cabinets and other fixtures, then appliances, paints, and once again electricians and plumbers return to finish their work, then finally install flooring, and one massive run-on sentence later, it is done. While those steps took place, my wife and I visited stores to pick out appliances and materials. That seems simple enough, but I almost forgot, we also needed to have the plumbers install the main plumbing lines before pouring the foundation. If we had forgotten to do that first, it would have been a nightmare. For the most part, the general contractor does not mind too much about when the subcontractors can do their part since there is always something for their team to work on. Sound familiar?
Ideally, everything can be separated in a way that the various teams can handle their tasks without stepping on one another’s toes. Unfortunately, if mismanaged, it is very easy to screw things up. In our case, the contractor did not take just 80 days, but instead waited until after the rainy season (about 80 days) to get started. Then, just two woefully unqualified people arrived to do the brunt of the work, neither of whom was capable of even reading the blueprints. They began to implement their own designs and wasted money on unnecessary materials. I ended up visiting the site daily to point out things they did wrong, and they were not simple fixes. For example, they mistakenly installed a window directly behind the toilet. Directly behind, not above. I asked, “In what world does this make sense?” The contractor replied, “You can maybe put a plant on the toilet to block the neighbors.” He also thought it strange until I directed him to the blueprints, and it dawned on him he should have been following those. Keep in mind, this is a very small snapshot of the incompetence that occurred daily.
The plumbers and electricians had to postpone their work on several occasions due to the bottleneck of incomplete work. The appliances and cabinetry arrived months before they could be installed and got damaged even before installation. When the contractor finally opened the boxes he called me at work to complain that one kitchen cabinet was missing. I rushed back because I had counted and checked the boxes myself months prior. When I arrived, there were three unopened boxes and three spaces for cabinets not yet installed. I asked what the problem was, and he said it must be the wrong cabinet because there is no way it will fit. I looked down at the boxes, turned the box upright, and asked, “What about now?” “Ohh, yes, I see now.” he said. The solar water heater company arrived first and installed pipes before the plumbers did their work, which in turn caused them to reroute main plumbing through different parts of the house and required the general contractor to build new false walls. The electricians arrived last and did their best. Finally, the flooring got installed before most other things had completed and ultimately the plumbers forgot to connect the pipes and ended up flooding the house. That is the gist of how 80 days turned into 1.5 years.
If this story feels familiar, it is probably because you have experienced similar defeat (perhaps while building Meteor apps). In software engineering, even the greatest of design patterns can get jacked up from poor planning, poor communication, or poor quality work. In other words, do your research, work together or independently while being mindful of others, and know your limits.