The Humble Programmer-
Or, the attitude and outlook of programmers in the developing world of programming.
I Beginnings
A) The first computers
1) Unique, single-copy machines- not mass produced
2) The computers tended to be much more fantastic, and therefore more
prominent, important, than the programmers, who were seen somewhat as
zookeepers existing to provide the care and feeding of the great beasts.
3) Programmes had only local significance and would soon become
meaningless- little of the programmer's work would have lasting
influence.
4) Programs had to be clever and cunning in order to achieve results with
strangely limited machinery.
** Two major opinions about programming in that period: "A really competent programmer should
be puzzle-minded and very fond of clever tricks." and "Programming was nothing more than
optimizing the efficiency of the computational process."
5) The general expectation was that as computers developed, their greater
capabilities would make programming less of a challenge because the
major difficulty of the era, insufficient machinery, would have been
solved.
6) Instead, as computers became more powerful, their possible
applications became more complex and more difficult to program.
II Third Generation computers
A) Devloped in the mid-sixties. According to Dijkstra, retarded computing science by up to
10 years.
1) Designed with price/performance ratio as a main objective. Performance
goal results in 'internal housekeeping activities of doubtful necessity.'
Price, if meant as price paid for hardware, results in a machine design
that is difficult to program for.
2) People tend to confuse good sales revenue with quality design.
B) Software of the time period
1) The subroutine library, first developed by the EDSAC in Cambridge,
England, survived the (paraphrase) large overhead implied by the 'great
number of explicitly named registers of the arithmetic unit' of third
generation computers. Whoo. Go Subroutines.
2) The birth of FORTRAN- 'a successful coding technique, but with very
few effective aids to conception.' Ignore if possible, so as not to bind
oneself to low-level programming habits.
3) LISP- "The most intelligent way to misuse a computer." This is a good
thing, because it means that it lends itself to thinking outside the box.
4) ALGOL 60- Algorithmic Language- important impact on abstract thought.
5) PL/1- the language of features. Too many features, according to Dijkstra,
who equates users to addicts. Features prevent individual thought.
III Programming in the future (post 1972)
A) Dijkstra's vision: more powerful programs, at a fraction of the current cost in man-years,
virtually free of bugs. (One can only wish.) Such a revolution he considered likely because:
1) The world recognized a need for change. Large, sophisticated system
design loomed huge like a vision of doom.
2) Computers were becoming cheaper, therefore, the software must become
cheaper if users were to consent to purchase it. When computers were expensive,
one would expect programs to be expensive also. When computers become less
expensive, they would expect programming costs to drop as well.
3) The change was potentially technically feasible, if one limited oneself to
'intellectually manageable programs' and followed certain guidelines.
a) If only intellectually manageable programs are options,
choices are easier to cope with.
b) Intellectually manageable programms result in a reduction
in solution space.
c) One ought to program by asking what a proof of correctness
would be, and then solving the problem of satisfying the proof.
d) Use Abstraction.
e) Avoid clever tricks, which are language dependent and tend
to confine your thinking to the abilities of a certain language.
Don't confuse 'richer' or 'more powerful' languages with better
modes of thinking. Human thought is affected by the language it
uses. Use abstraction whenever possible.
f) Solve problems by using a hierchy or factoring into smaller parts.
B) Reasons people might not take Dijkstra's suggestions (interesting as a cultural commentary).
1) Established and conservative computer users, such as those on a
university campus, won't want to change.
2) Political opposition. And this simply must be quoted.
"The first effect of teaching a methodology - rather than disseminating knowledge - is
that of enhancing the capacities of the already capable, thus magnifying the difference in
intelligence. In a society in which the educational system is used as an instrument for the
establishment of a homogenized culture, in which the cream is prevented from rising to the
top, the education of competent programmers could be politically impalatable."
IV. Conclusion: more powerful programming will be possible if programmers remain humble and
approach the task with respect for the operational parameters of their own minds, allowing
their strengths and weaknesses to work for them instead of against them.
Sidenote: http://www.webopedia.com/DidYouKnow/Hardware_Software/2002/FiveGenerations.asp
1st Generation: 1940-1956 Vacuum Tubes. Machine language programming.
2nd Generation: 1956-1963 Transistors. Assembly languages. Cobol and Fortran being developed.
First computers to store instructions in their memory.
3rd Generation: 1964-1971 Integrated Circuits. Keyboards, monitors, operating systems.
4th Generation: 1971- Present: Microprocessors.
The Intel 4004 chip was developed in 1971, the year prior to the address of this speech.