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.