When tasked with finding an analogy for the software development process, I came up with roads. This was greatly inspired by the surface we were driving upon at the time.
Planning
Before you can begin construction you must have an idea where you want your road to go, and what it should do. Is it for normal car traffic, or are we shipping space shuttles to launching pads? What platform are we building on? and how many users are you expecting? All these initial questions are important and will greatly affect the path taken to create the road. A poor choice of platform will give you large problems in the future, as will underestimating the number and type of users.
Your road must be able to coexist with other roads, and the behaviour has to be consistent. Having people drive on the left while they normally drive on the right will cause problems. You may even have to integrate your road with the overall roading network, and hook onto a much larger highway.
Working with a developer you can expand on these requirements and create an initial specification. This specification should contain enough information that the developer can go and create a more detailed document of the overall project.
If the developer were instead to start work immediately this can create even more work. “Oh did I say bicycles? I meant buses”
Construction
During development a variety of problems will be encountered. While a good planning stage can reduce the problem frequency and severity, there are some things that are totally unexpected.
You may also spend a large amount of time standing around waiting for stuff to compile.
Testing
As your project nears completion and you start letting users test it, they will find problems. Pot holes develop and in some cases require immediate attention to avoid potential disaster. This will not be helped by unfamiliarity with your new product and inadequate road markings or signage.
Maintenance
Over time more users will hear of your road and want to use it. These users may be of the large tanker variety and want to use your road in ways that it wasn’t designed for. In some cases you may be able to reuse part of your existing road, while in others a complete redesign is needed.
Roads also require a minimal level of maintenance and do wear out over time. More pot holes appear, users start installing accessories that cause problems, or even changes in basic requirements due to unforeseen vehicle types.
Eventually your road will no longer be able to meet the demands of your users. Competitor’s roads serve their needs better, or your road just fails to work with their new car. In the end while there will always be users who still want to use your road; the cost of maintenance may be too high.
“Software is never finished, it is only abandoned” – Unknown