Donald Knuth (1981) The Art of Computer Programming (1968) (Link to Matt Fuller's notes.) In the first of a seven volume set, Knuth begins: 'The process of preparing computer programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it can be an aesthetic experience much like composing poetry or music.' (1981: v; extending an even earlier quote that strikes an analogy with recipes in a cookbook). The art of programming in his sense is somewhat close to the craft of programming (in line with current cultural policy in the UK at least). Perhaps the interest in aesthetics should be no surprise to someone such as Knuth as a mathematician, and the special relationship between computers and mathematics. Despite this co-dependence, he is keen to point to the 'interesting work' taking place in 'nonnumerical computer programming' in which translating languages and the 'development of "software" (programs to facilitate the writing of other programs), and the simulation of various processes from everyday life' as the subject of this volume (1981: vi). Knuth wishes to point out the depth of this relationship: 'The construction of a computer program from a set of basic instructions is very similar to the constructions of a mathematical proof from a set of axioms.' (1981: ix) He quotes Ada Lovelace to prove the point: 'Many persons who are not conversant with mathematical studies imagine that because the business of [Babbage's Analytical Engine] is to give results in numerical notation, the nature of the processes must consequently be arithmetical and numerical, rather than algebraical and analytical. This is an error. The engine can arrange and combine its numerical quantities exactly as if they were letters or any other general symbols; and in fact it might bring out its results in algebraical notation, were provisions made accordingly.' (1981: 1) Knuth's project is best described as the 'analysis of algorithms', and he playfully sets out the instructions for reading the book rather like an algorithm in itself in the section 'Procedures for Reading this set of Books', unwittingly evoking the work of OuLiPo, and perhaps particularly Calvino's 'How I Wrote One of My Books' (1995): '1. Begin reading this procedure, unless you have already begun to read it. Continue to follow the steps faithfully; [...] 3. Set N equal to 1; 4. Begin reading chapter N. Do not read the quotations which appear at the beginning of the chapter; 5. Is the subject of the chapter interesting you? If so, go to step 7; if not, go to step 6. 14. Are you tired? If not, go back to step 7; 15. Go to sleep. Then, wake up, and go back to step 7.' (1981: xv-xvi) Along similar lines, a series of codes are introduced to guide the reader through the exercises. Perhaps he is drawing an analogy here between the writing of the book and the programming of a computer - he points to a number of key issues: 'A programmer is greatly influenced by the language in which he writes his programs', and also points out that a machine will act idiosyncratically and become redundant over a relatively short time (1981: x & xi). The analogy to language goes further in terms of 'input-output (abbreviated to 'I/0') of data (note: data is the plural of datum), with the input often referred to as reading and output as writing. Subroutines are labour-saving devices for programming, introduced by Babbage for his Analytical Engine as a library of routines - later to be dynamically linked. Computers involve carefully structured relationships between data elements in storage systems, databases, libraries. A programmer needs to understand these dynamic relationships to be able to manipulate the system as a whole. For instance, Knuth makes an analogy in describing 'topological sorting' as requiring to find a way to arrange the glossary so that no term is used before it is defined' (1981: 260) rather like the Dewey system. In another set of dynamic structural relationships, 'trees' can be seen to grow in a 'bottom-up' or defy nature in a 'top-down' manner as ancestors and descendents accordingly (1981: 308-9) - more often cast in conventional terms as parents giving rise to children in the heterosexist breeding analogies. Dymanic storage algorithms can be used to manipulate the data. An algorithm is simply a process or set of rules to be followed in calculations or other problem-solving operations (especially by a computer). The term has a historical relation to 'algorism' as the process of doing arithmetic using Arabic numerals (originating from the title of the book Kitab al jabr w'al-muqabala (Rules of restoration and reduction) written by the Persian author Abu Ja'far Mohammed ibn Musa al-Khowarizmi, c. 825). In the eighteenth century, Leibnitz used the latin term algorithmus infinitesimalis to denote ways of calculation with infinitely small quantities. By 1950, Euclid's algorithm denoted the process to find the greatest common divisor of two numbers.