Here is an except from Donald Knuth’s 1974 paper “Structured Programming with go to Statements”. There is a well known quote at the end of the second paragraph :
The improvement in speed from Example 2 to Example 2a is only about 12%, and many people would pronounce that insignificant. The conventional wisdom shared by many of today’s software engineers calls for ignoring efficiency in the small; but I believe this is simply an overreaction to the abuses they see being practiced by penny-wise-and-pound-foolish programmers, who can’t debug or maintain their “optimized” programs. In established engineering disciplines a 12% improvement, easily obtained, is never considered marginal; and I believe the same viewpoint should prevail in software engineering. Of course I wouldn’t bother making such optimizations on a one-shot job, but when it’s a question of preparing quality programs, I don’t want to restrict myself to tools that deny me such efficiencies.
There is no doubt that the grail of efficiency leads to abuse. Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
Yet we should no pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only after that code has been identified. It is often a mistake to make a priori judgments about what parts of a program are really critical, since the universal experience of programmers who have been using measurement tools has been that their intuitive guesses fail. After working with such tools for seven years, I’ve become convinced that all compilers written from now on should be designed to provide all programmers with feedback indicating what parts of their programs are costing the most; indeed, this feedback should be supplied automatically unless it has been specifically turned off.
The quote to which I am referring – that “premature optimization is the root of all evil” – is, from time to time, used fait accompli to assert that any time spent optimising is time wasted – something that is clearly not the case when considering the quote in context.
There are a lot of other good ideas in Knuth’s article, many still quite relevant to software engineering. The full article (which can be obtained via citeseerx) is, primarily, a contribution to a discussion of the time on the use of go to statements – another topic often reduced to a simple, extreme position, attributed to Edsger Dijkstra. Knuth’s paper makes it clear that Dijkstra did not hold so tightly to that position himself.
This is the sort of paper that I find to be a fascinating read, with both historical and technical value.
The final page of the article contains the following quote :
A disturbingly large percentage of the students ran into situations that require go to‘s, and sure enough, it was often because while didn’t work well to their plan, but almost invariably because their plan was poorly thought out.
Which brought to mind another quote that I had seen recently, this one from George Orwell :
A man may take to drink because he feels himself to be a failure, and then fail all the more completely because he drinks. It is rather the same thing that is happening to the English language. It becomes ugly and inaccurate because our thoughts are foolish, but the slovenliness of our language makes it easier for us to have foolish thoughts.
It seems quite valid to say that there is a connection between our language and our expression (in terms of ideas, spoken word, programs, and more).
When trying to find a source for Orwell’s words (which you can find here), I was heartened to find these sentences follow those quoted above :
The point is that the process is reversible. Modern English, especially written English, is full of bad habits which spread by imitation and which can be avoided if one is willing to take the necessary trouble.
Which I believe is also applicable to the expression and optimisation of computer programs.
This is a delightful and insightful article. Thanks very much!
When I first watched the BBC adaptation of Pride and Prejudice I wondered if the rigid requirements of the language as spoken by their class in their time forced them to consider their words more carefully, and so also forced them to consider their ideas more carefully. I presume that’s what Orwell was getting at.
On topic: Visual Studio, with its auto-completion and excellent debugging and tracing tools, is turning me into a lazy programmer. “Wonder if this’ll work?” I say, as I press F5.
Nice article.
Although it doesn’t bode well for written English given the rampant spreading of phonetic English used by teens for messaging with phones and internet.