I reread this a couple of days ago. Lots of things Dijkstra writes could be said easily today.
Some good quotes:
A reason for mentioning this is to point out that, by developing a keen ear for unwarranted analogies, one can detect a lot of medieval thinking today.
After all, it is no longer the purpose of programs to instruct our machines; these days, it is the purpose of machines to execute our programs.
We could, for instance, begin with cleaning up our language by no longer calling a bug a bug but by calling it an error. It is much more honest because it squarely puts the blame where it belongs, viz. with the programmer who made the error. The animistic metaphor of the bug that maliciously sneaked in while the programmer was not looking is intellectually dishonest as it disguises that the error is the programmer’s own creation.
And this concludes my technical excursion into the reason why operational reasoning about programming is “a tremendous waste of mental effort” and why, therefore, in computing science the anthropomorphic metaphor should be banned.
And, again, the corollary is that we should reason about programs without even mentioning their possible “behaviours”.
Needless to say, that system completely hid the fact that, all by itself, a program is no more than half a conjecture. The other half of the conjecture is the functional specification the program is supposed to satisfy. The programmer’s task is to present such complete conjectures as proven theorems.