(^166) 97 Things Every Programmer Should Know
Testing Is the Engineering
Rigor of Software
DEVELOPERS LOVE TO USE TORTURED METAPHORS when trying to explain
what it is they do to family members, spouses, and other nontechies. We fre-
quently resort to bridge building and other “hard” engineering disciplines.
All these metaphors fall down quickly, though, when you start trying to push
them too hard. It turns out that software development is not like many of the
“hard” engineering disciplines in lots of important ways.
Compared to “hard” engineering, the software development world is at about
the same place the bridge builders were when the common strategy was to
build a bridge and then roll something heavy over it. If it stayed up, it was
a good bridge. If not, well, time to go back to the drawing board. Over the
past few thousand years, engineers have developed mathematics and physics
they can use for a structural solution without having to build it to see what
it does. We don’t have anything like that in software, and perhaps never will
because software is in fact very different. For a deep-dive exploration of the
comparison between software “engineering” and regular engineering, “What
is Software Design?”, written by Jack Reeves in C++ Journal in 1992, is a clas-
sic.* Even though it was written almost two decades ago, it is still remarkably
accurate. Reeves painted a gloomy picture in this comparison, but the thing
that was missing in 1992 was a strong testing ethos for software.