On the Foundations of Computing
Giuseppe Primiero
Reviewed by John Symons and Syed Abumusab
On the Foundations of Computing
Giuseppe Primiero
Oxford: Oxford University Press, 2019, £40.00
ISBN 9780198835653
Philosophy of computer science has become a lively and diverse enterprise. While there are many ways into the field and many distinct kinds of contribution that philosophers can make, Giuseppe Primiero’s On the Foundations of Computing will provide an excellent starting point for philosophers who are new to these topics. Primiero has a distinctive philosophical voice and this book presents his comprehensive philosophical perspective on computing very well. His contributions to philosophy of computation are significant and this book makes them clear. The book provides enough mathematical and engineering background to equip interested readers to join the fun in an informed manner. In addition to beginners, it will be of great interest to philosophers of science who take an interest in computing for reasons we discuss below. This book does not, nor is it intended to, provide an introductory survey of philosophy of computer science. Rather, it is a systematic philosophical introduction to foundational issues in the science itself.(1)Those seeking an introduction to the philosophy of computer science have an increasing range of options for that purpose. Two prominent sources are Angius et al. ([2021]), and William Rapaport’s ([unpublished]) regularly updated online textbook. These are accessible surveys (both regularly updated) of the major issues.
Primiero takes mathematics, engineering, and experimentation to be the three foundational areas of computing and the book is divided into three corresponding parts. Discussion of the mathematical foundations of computing occupies the largest part of the book and this is where Primiero’s expertise shines through most strongly. The discussion of engineering foundations in Part II will be useful for philosophers of computation and the connections between his treatment of mathematics and engineering are very illuminating. Readers familiar with Primiero’s important articles on miscomputation and other kinds of error will find his earlier arguments located helpfully in a broader context. Some of the most fascinating contemporary topics in the book appear in Part III in his discussion of computing as an experimental science. This final section is the shortest and least developed portion of the book, but it contains many insights and will likely inspire fruitful new research programmes in the philosophy of computer science.
Primiero’s way of carving up the foundations of computing signals a philosophical decision. As he notes, his tripartite picture of foundations echoes Amnon Eden’s ([2007]) description of the rationalist, technocratic, and scientific perspectives on the subject mater. He would agree that there are other plausible ways of carving up the foundations of computer science. Arguably, topics like information, networks, and even design could also claim to have some place among the foundational areas of computing. It is also notable that there is no discussion of increasingly pressing topics related to ethics and social values. While one cannot reasonably demand that everything be covered in a single book, the decision to adopt this particular picture of the foundations to the exclusion of social and political considerations signals a choice that ought to have been defended more fully.
It is also the case that there are points of cross-fertilization that too neat a division into three distinct areas risks overlooking. Primiero is sensitive to the overlap of topics and would recognize, for example, that philosophers of science who neglect the engineering constraints on computing risk giving too much weight to formal abstraction in their understanding of the role of computation in science. Likewise, in the other direction, engineering-driven discussions of software verification and testing that neglect the formal characteristics of software risk falling into an unilluminating kind of pragmatism.
Because of the ambitious nature of Primiero’s project and given his goal of covering these three foundational areas of computer science, researchers in specific areas will find things to disagree with. For example, we find nits to pick in his discussion of verification, his limited treatment of computational complexity, and in the role of computation in scientific modelling and simulation. Consider, too, the scope of the project: Primiero understands computing to include not only its academic manifestation in computer science departments but also its industrial and corporate role in business computing, and its pervasive presence in our social lives. Understood in these terms, computing becomes a sprawling and elusive topic (or perhaps a set of topics) and inevitably the scope of his project cannot be as inclusive as advertised. For example, the social and political factors that are involved in computing are barely touched upon and while Primiero is certainly sensitive to these matters, they are not a significant part of his story as mentioned above. Thus, the book is strongest (and it is very strong) when it is focused on theoretical and engineering questions. Given this, it is probably best understood as a treatment of the foundations of computer science rather than the foundations of computing. There is a significant difference between computing as it manifests itself in our social and commercial lives and the academic discipline of computer science.
In any event, it is, in fact, the emergence of the conceptual foundations of the academic discipline of computer science that serves as the focus of the book and future efforts to address these foundational issues will need to engage with this book. He demonstrates that computer science is both a mathematically grounded science, an art involving engineering principles, and an experimental method of sorts. Furthermore, he persuasively shows that it is the interplay of these three aspects that makes computer science such a fascinating field. In this regard—as a philosophy of an influential special science that gives rise to many open philosophical questions—Primiero’s book will be of interest to all philosophers of science.
Primiero sets himself three distinct missions in the book: to explain how debates over the foundations of mathematics in the early twentieth century gave rise to computer science, to explain the engineering challenges and advances that have shaped contemporary computing, and to show the relationship between computing and experimental inquiry. Along the way, Primiero follows a chronological approach that will shed useful insight into historical debates concerning the disciplinary status of computer science. Is computer science a formal enterprise like mathematics, is it more like a natural science, or is it an engineering discipline? The discipline has struggled with its self-image and computer science has retained vestiges of this identity crisis in its current disciplinary form. Computing is a human enterprise and this book will help philosophers explore the ways in which social values, engineering constraints, and mathematical limitations structure the trade-offs that shape computational systems.
The first part of the book requires very careful attention and study from the reader. It should be studied rather than simply read. Primiero provides a technically detailed but brief overview of the crisis for the foundation of mathematics in the early twentieth century. He surveys logicist, finitist, and intuitionist approaches to foundations and shows their relationship to the emergence of computer science. Two chapters deal with the decision problem and neighbouring topics. From there, he provides an overview of Turing machines, the halting problems, and debates around the verifiability of programs. This is familiar territory, and traditionally educated analytic philosophers will find no surprises here. However, this material is delivered telegraphically at times and Primiero assumes that the reader is capable of comprehending the formal presentation of these topics. While students in computer science with a little background in discrete mathematics will have no difficulty here, for the most part, philosophy students in the Anglo-American world are no longer equipped with sufficient background in logic to tackle the material in Part I easily. Thus, if the book is being used as a textbook in a course directed to philosophy students, instructors could supplement their study of Part I with Richard Epstein and Walter Carnielli’s ([2000]) very approachable book. Epstein and Carnielli cover much of the same material in their book as Primiero does in Part I in a very accessible and easy style. Primiero’s point here is less a matter of introducing novices to the relationship between the foundations of mathematics and computability; rather, his goal is to establish the connections between logic and software engineering.
In the 1970s Donald Knuth ([1974]) characterized computer science as the study of algorithms. In Chapter 6, Primiero introduces various approaches to the nature of algorithms and the coverage here is exceptionally good. Primiero connects questions of implementation and complexity in his discussion of the nature of algorithms in a way that sets the stage very well for his discussion of engineering in the second part of the book. More detailed discussion of computational complexity would be desirable here given that this is a very short chapter devoted to a vast, lively, and fascinating topic. Readers will undoubtedly find themselves eager to dive deeper into this and other topics.
Primiero goes through the growth of hardware, software, and implementation debates (Chapters 9–12). He has an interesting discussion of the nature of Moore’s law and its limitations. In Chapter 11, he discusses various issues concerning miscomputation, an area of research to which he has contributed important work. Chapter 12 is a fascinating treatment of the development of software engineering. In his discussion of programming, it would have been interesting to see how he connects the trade-offs involved in labour, attention, skill, and error with his own account of miscomputation (Fresco and Primiero [2013]). These chapters will help the reader situate themselves within the history of the foundation of computing. Throughout the book Primiero admirably puts together the many moving pieces of the history of the foundations of computing.(2)For a history that provides a broader overview of the engineering, commercial, and socio-political aspects of computing, see (Ceruzzi ([2003]).
The last section of the book concerns experimental computing and its implications in modelling, testing, and the validation of hypothesis. Again, the overarching historical narrative that Priemiro provides is illuminating. In Chapters 14 and 15, Primiero reviews the methods of experimental computing. He discusses the set-up, viability of models, and their implementation. He then moves to some prominent epistemological issues surrounding experimental computer science. This was the weakest of the book’s three parts. There is a vast literature on the role of computing in science and while he offers many valuable insights and suggestions, the arguments of this section are generally less well developed. Nevertheless, his book maps out some of the philosophically important aspects of hypotheses in computation, modelling and simulation, and validation. In Chapter 15, our impression was that Primiero is attempting to introduce a methodologically formal treatment to the discussion of the experimental foundations of computer science. We heartily applaud this effort. There are many open questions here (see, for example, Winsberg [2019]), and the discussion here helpfully regiments the landscape of questions for future research.
Philosophers, historians, and social scientists find computer science to be a fascinating topic of study and in recent decades there has been an abundance of great work. How does Primiero’s philosophical perspective differ from the perspective of computer scientists themselves? Compare with Peter Denning and Craig Martell’s ([2015]) excellent Great Principles of Computing: In its coverage, Primiero’s book is similar to Denning and Martell’s. However, Primiero offers a more systematic treatment of the issues and asks harder and more critical questions than they do. For example, in the discussion of miscomputation, Primiero offers a discussion of the nature of error in computational systems that goes well beyond what we ordinarily find in computer science textbooks or popular surveys. Furthermore, he offers his own philosophical account of levels of abstraction that sheds light on the diverse kinds of errors that appear in the practice of software engineering. In doing so, Primiero provides a theory of miscomputation rather than simply describing its various manifestations. While the book lacks Denning and Martell’s conversational friendliness, Primiero’s precision and systematicity is far superior and more than compensates. Primiero provides a well-organized treatment of the foundational topics rather than a simple tour of the issues. However, if one is new to these topics, reading both books together would be a good idea. Primiero expects readers to work, especially in the more formal sections of the book, but readers will find that the investment pays off.
In order to provide a historically informed and conceptually sophisticated assessment of foundational issues, Primiero attempts to provide as much background material as is necessary. At many points, this is masterfully executed; in addition to helping bring novices along for the ride, there are real insights scattered throughout the introductory sections. Independently of the philosophically ambitious goals of the project, Primiero has produced a valuable resource for newcomers. Concerns expressed about Part I aside, anyone entering the field of philosophy of computer science will greatly benefit from studying it. In this respect it is the most effective book of its kind currently available.
Primiero’s book marks an important moment in the development of the philosophy of computer science and should be read by all philosophers with an interest in the sub-discipline. It will also be of interest to a broader readership of philosophers of science concerned with a rigorous formal approach to the conceptual foundations of computer science.
John Symons
University of Kansas
johnfsymons@gmail.com
Syed Abumusab
University of Kansas
syedmusab@ku.edu
Notes
(1) Those seeking an introduction to the philosophy of computer science have an increasing range of options for that purpose. Two prominent sources are Angius et al. ([2021]), and William Rapaport’s ([unpublished]) regularly updated online textbook. These are accessible surveys (both regularly updated) of the major issues.
(2) For a history that provides a broader overview of the engineering, commercial, and socio-political aspects of computing, see (Ceruzzi ([2003]).
References
Angius, N., Primiero, G. and Turner, R. [2021]: ‘The Philosophy of Computer Science’, in E. N. Zalta (ed.), The Stanford Encyclopedia of Philosophy.
Ceruzzi, P. E. [2003]: A History of Modern Computing, Cambridge, MA: MIT Press.
Denning, P. J. and Martell, C. H. [2015]: Great Principles of Computing, Cambridge, MA: MIT Press.
Eden, A. H. [2007]: ‘Three Paradigms of Computer Science’, Minds and Machines, 17, pp. 135–67.
Epstein, R. L. and Carnielli, W. A. [2000]: Computability: Computable Functions, Logic, and the Foundations of Mathematics, London: Wadsworth.
Fresco, N. and Primiero, G. [2013]: ‘Miscomputation’, Philosophy and Technology, 26, pp. 253–72.
Knuth, D. E. [1974]: ‘Computer Science and Its Relation to Mathematics’, The American Mathematical Monthly, 81, pp. 323–43.
Rapaport, W. J. [unpublished]: Philosophy of Computer Science.
Winsberg, E. [2019]: ‘Computer Simulations in Science’, in E. N. Zalta (ed.), The Stanford Encyclopedia of Philosophy.