Despite its obvious significance as an economic, intellectual and creative activity, computer programming has been little written about by historians of science and technology. This is perhaps in part because as a highly technical activity programming is difficult for many historians to write about authoritatively, and in part because, as a hybrid techno-scientific activity, it does not fit neatly into established disciplinary categories. Programming is at once art, science, and technology. In this ambitious, insightful and complicated book, Mark Priestley provides a history of programming that breaks from the usual emphasis on the purely intellectual history of computer science. Programming for Priestley is about more than just the computer, and he convincingly ties together the various developments, some practical, some theoretical, that made possible the mechanization of mental activities so central to our modern, automated society. The focus, however, is on the relationship between practical innovations in mechanized computation and data processing and theoretical developments in mathematical logic.
The story of programming, Priestley argues, is part of the larger history of the industrial revolution, and in particular the nineteenth-century fascination with all things mechanical. It is in this larger context, which Priestley regards as simultaneously social, economic and philosophical, that he situates the work of Charles Babbage, perhaps the most widely worshipped of the patron saints of modern computing. In a succinct and yet detailed account of Babbage's Difference Engine, which as ‘physical embodiment of a single algorithmic process’ did not actually require programming, and the (never constructed) Analytical Engine, which was (in theory, at least) programmable, Priestley develops his definition of programming as the ‘science of operations’, the organization of mental activities into formats capable of being mechanized (p. 49). According to this understanding, programming transcends both computation as a specific form of mental activity and the electronic computer as a particular technology. Along these lines, Priestley very carefully and convincingly argues that it is a ‘misleading anachronism’ to think of Babbage's contributions in terms of modern computing (p. 49). This is not to diminish Babbage's accomplishments, he notes, but only to appreciate them in their own terms, and to understand better their real significance and legacy.
By defining programming in terms of the science of operations, and not computer science, Priestley is able to explore two related but distinct strands of development that he argues are too often conflated in the historical literature. The first is the mechanization of arithmetical and data-processing operations, as embodied in Babbage's Difference Engine, Herman Hollerith's punch-card tabulating machines, and the pioneering electro-mechanical (and early electronic) computers of the 1930s and 1940s. The second involves developments in mathematical logic and the study of computability, in particular the work of of Kurt Gödel and Alan Turing. Turing is, of course, a (perhaps the) seminal figure in computer science, to the point that our current definition of a computer revolves around a logical abstraction known as a Universal Turing Machine. For Priestley, however, Turing's work as a logician, however fundamental, was not so much brilliantly original as it was representative. Borrowing on the work of the sociologist and historian of science Andrew Pickering, Priestley describes the work of Turing as ‘bridging’ the gap between the practical techniques of mechanized computation and the theoretical work of contemporary mathematical logicians. By incorporating (or, to borrow again from Pickering's schema, transcribing) ideas from mathematical logic, in particular techniques for developing a formal language of operations, Turing is able to bring to the mechanization of mental operations a theoretical rigour and respectability that it had previously lacked.
The tension between theory and practice pervades Priestley's nuanced treatment of the history of computer programming. For example, his evaluation of the Harvard Mark I and University of Pennsylvania ENIAC focuses more on continuity with earlier traditions of mechanical computation and practical engineering than on novel developments in logic. Even the work of John von Neumann, whose 1949 Draft Report on the EDVAC is often hailed, along with Turing's earlier work on computability, as a foundational text in logical design, is instead reinterpreted in terms of practical engineering concerns, rather than theoretical insights. The influence of logic on early electronic computing was at best ‘indirect’, according to Priestley, ‘mediated by the ideas of cybernetics and in particular the idea that the electronic stored-program computer could be understood not merely as an electronic calculator, but as a device essentially analogous with the brain’ (p. 154). It was only in the late 1950s that theoretical concepts from philosophy, mathematics and linguistics were rigorously applied to computer programming. Priestley identifies ALGOL 60 as exemplary of these attempts to marry programming notation and formal language into a coherent tool for pursuing a research agenda in theoretical computer science. Borrowing from the language of Thomas Kuhn, Priestley describes ALGOL 60 as a ‘paradigmatic achievement in the field of programming languages’ (p. 229).
This is a book written for specialist historians, and is priced accordingly. It includes a great deal of technical material that, despite Priestley's skill at making complex ideas comprehensible, might nevertheless be intimidating to many readers. But this is nevertheless an important book, and one which will be of interest and use to a broad range of scholars working on topics in mathematics, logic, computing or the history of information technology more generally. This is not a social or labour history of programming, and as such does not provide much of a sense of what it meant to work as a programmer, or to construct an identity around the emerging technoscience of programming. But what this book does it does well, and there is no comparable work encompassing such an impressive breadth of material or detail. For historians of computing, The Science of Operations will become an essential text.
