Tuesday, March 16, 2010

Of Course I'm Done, Can't You See the Wall?

Across the street from where I work, they're putting up a large office building. We have lots of windows, so I sometimes gaze at the work going on there. Lots of big machinery, lots of people, and lots of progress from week-to-week. Sometimes, when I watch the big machinery "doing its thing," I wonder if I went into the wrong career. Nothing I do will look that cool.

I don't know anything about building houses, buildings or much at all. I did build a rabbit hutch when I was a kid. I've even put up a tent or two, though that usually required help from my wife. But, I've built software.

I was pondering, as I watched the construction of the building, how it must compare to building software. I imagined a large project schedule with all of the tasks that must be done, the dates and their dependencies, etc. I figure it must be pretty difficult to keep everything moving forward, ensuring that the right materials were on-site at the right time, etc. I started to think more about how it compares to building software.

Among other things, one of the more interesting differences has to do with the visual element. As a manager, how do you know that the software is "done?" Well, when the testing team says that it's done. But, that might be too late. Wouldn't it be nice to know from the developers when they're done building software? Of course...just ask them. But, what if they're wrong?

Though an obvious over-simplification, when building a house or even a large office building, when someone claims they're done, a quick inspection is all it usually takes (again, it's an over-simplification, as some parts of "done" are more complex than looking at a wall and saying, "Yup, I guess you're right...you finished the wall 'cause there it is!"). For software, that's not that easy. Some software is easier than others. Applications that are predominantly interface-related (i.e. desktop apps or web apps) are much easier because there *is* a visual element, though whether everything behind it is done or not is a different story.

Ultimately, testing determines whether the software meets the requirements. Newer methods of testing up-front or driving development via tests help to understand "doneness" sooner than later. Unfortunately, many projects are not that sophisticated.