The
big software programs that run on PCs today consist of thousands and sometimes
even millions of lines of source code (the step-by-step instructions
that give the program its functionality and personality). That’s a lot to keep
track of and (as with anything made by people) flaws can creep in.
Software
can be as complex as any mechanical orchestration of gears, shafts, pulleys,
bearings, levers, switches, and so on. But unlike physical machinery, software
is almost entirely abstract it’s a set of electronic instructions. You can’t
just hold it in your hand or put a wrench on it to tighten it up; that makes it
harder to examine for strength, robustness, resiliency, and integrity.
It’s
difficult to watch software’s inner workings in action:
There
is rarely something you can actually watch. Even a word-processing program
consists of mostly mathematical calculations, data buffers, table lookups,
device management, and other steps that mostly push electrons around, far removed
from what we see on the screen.
Challenges
like this make it difficult to know whether a complex software program is
error-free and whether it does exactly what it’s supposed to do and
nothing else.