Imagine we’re starting a software project together this year. It will run in production, and serve a large amount of live customer traffic. Its lifespan may look like this:
If this cycle of maintenance is long enough, it can overweight the cost of all previous stages. I do have projects which are considered “finished”: all the features are there, and as much as you can’t make a hammer any better, neither can I any of these projects. But for the most part, the software story is a little different: it’ll always be a recipe, but the kitchen, ingredients, pans or people will change over time. These adjustments cost money.
My guess is that with the majority of production software, the graph from above is true. We put a lot of effort upfront and make something that works well. And then we keep running it, patching bugs, enhancing it, patching bugs in these enhancements, and so on. We do it forever. Or at least, for a very long time. People who wrote the code may not be around anymore, so you need to train new people. Not only NASA has this problem.
In that sense software is a complete opposite to computer hardware. A supercomputer can cost $100M, but energy to keep it alive is $10M a year. You only run it for maybe three years, it becomes too slow and you decommission it. Supercomputer lifespan ruled by the aging of the silicon is the same as your smartphone. Two years and we get bored.
You should focus on optimizing maintenance
Joint Stike Fighter is close to what software maintenance is about. The cost estimate for the JSF program is $1.508T dollars, where $379B is development. The $1123B is maintenance.
Life expectancy: till 2070.
Next time you stick five incoherent lines into your code with hopes that “we will fix it later”, imagine how “later” will feel like for someone who will look at your code. Fifteen years from now. Or fifty.