Quite early in my career as a computer programmer I came to the realization that the computer was a kind of universal machine. Given the right peripherals, it could print books, play music, build cars, and so many other things that one might imagine. In fact, imagining it was the first step in accomplishing it with a computer. With computers the key was to associate binary numbers with ever more sophisticated abstractions until you subsumed the problem domain in your digital model.
In recent years I have become aware of the fact that there are different categories of software. There is entertainment software that has little in the way of safety concerns associated with it. I don’t think anyone has ever been killed because of a bug in a game.
Then there is the other end of the spectrum, safety critical software. This includes such domains as automobile engine software that can cause an engine to explode if the parameters are set too far from nominal. Or flight software that can mean the difference between a safe landing and flaming death.
Between these two extremes are various levels of concerns when it comes to software accuracy. One of the examples in this middle area are financial programs that, while they can’t directly cause death, can reek havoc with peoples lives and reputations.
Software is comprised of a broad spectrum of applications each one with a more or less safety critical implication. One size does not fit all. Some software can be churned out as fast as the programmer can hit the keys with minimal programming and no one will be hurt. Other software needs lots of analysis, study, and design, followed by careful implementation and test. And even though all of this is done, we are still going to find bugs in the system. Software is a reflection of the programmers mind and all minds are flawed to some degree or another.
There are steps that can be taken. Breaking things down into small, clear steps, ensuring that multiple people examine code and understand it so that they can help catch errors before they can escape into production systems. And a commitment to professionalism by programmers on a par with our fellow creators from other engineering disciplines.
For the bulk of my career people have been amazed that computers can do the things they do at all. We are only now beginning to ask the more important questions about which tasks should be entrusted to computers and how much are we willing to spend to get software right. We have spent so many years on the quest for ever more impressive features we have forgotten the principle of staying with software that has proven to yield safe results. Forego some of the flashy features in order to ensure the soundness of the features that are already implemented. And remember, just because you can solve a problem with a computer, doesn’t always mean you should.