by Edsger W. Dijkstra, 1972 ACM Turing Award Lecture:
We all know that the only mental tool by means of which a very finite piece of
reasoning can cover a myriad of cases is called "abstraction"; as a result the
effective exploitation of his powers of abstraction must be regarded as one of
the most vital activities of a competent programmer. In this connection it might
be worthwhile to point out that the purpose of abstraction is not to be
vague, but to create a new semantic field in which one can be absolutely precise.
The tools we are trying to use and the language or notation we are using to
express or record our thought are the major factors determining that we can
think or express them at all!
The competent programmer is fully aware of the strictly limited size of his
own skull; therefore he approaches the programming task in full humility.
Programming will remain very difficult.
The best way to learn to live with our limitation is to know them.
In computer programming our basic building block has an associated time grain
of less than a microsecond, but a program may take hours of computation time.
I do not know of any other technology covering a ratio of 10^10 or more.
This challenge, viz. the confrontation with the programming task, is so unique
that this novel experience can teach us a lot about ourselves. It should deepen
our understanding of the processes of design and creation; it should give us better
control over the task of organizing our thoughts. If it did not do so, to my taste
we should not deserve the computer at all!