A software mogul usually Bill Gates, but sometimes another makes a speech. If the automobile industry had developed like the software industry, the mogul proclaims, we would all be driving $25 cars that get 1,000 miles to the gallon. To which an automobile executive retorts, Yeah, and if cars were like software, they would crash twice a day for no reason, and when you called for service, they’d tell you to reinstall the engine.
In a very real sense, the software engineer creates models of physical situations in software. The mapping between the model and the reality being modeled has been called the intellectual distance between the problem and a computerized solution to the problem [ ]. A fundamental principle of software engineering is to design software products that minimize the intellectual distance between problem and solution; however, the variety of approaches to software development is limited only by the creativity and ingenuity of the programmer. Often it is not clear which approach will minimize the intellectual distance, and often different approaches will minimize different dimensions of the intellectual distance.
For now, we really need to learn to be like doctors. They are able to say, quite comfortably and confidently and with conviction, "These things are never certain." Doctors seldom if ever state with certainty what the outcome of any procedure might be. Yet software managers, operating in a far less disciplined and less data-driven environment... blithely promise features, dates, and outcomes not especially susceptible to prediction.
A final essential difficulty arises from software's inherent invisibility. Software can't be visualized with 2-D or 3-D geometric models. Attempts to visually represent even simple logic quickly becomes absurdly complicated, as anyone who has ever tried to draw a flow chart for even a simple program will attest.