The Academic Board of the National Centre for Computing Education in England has released a white paper: Practical programming in computing education. The goal of the paper is one that I strongly support:
This white paper argues for the fundamental importance of practical programming as a central element of our young people’s computing education.
They are concerned that the implementation of the 2014 English computing curriculum might swing too far towards being a theoretical discipline, and be divorced from programming, the stuff that makes computing magical. I share their concerns. For example, I fear that teaching computational thinking without a computer leads to a boring mathematics or philosophy class, without the automation that Alan Perlis described in 1961 gives us new tools for thought.
The white paper may swing too far into programming for making, blurring the lines between computer science and software engineering. They write:
The whole purpose of computer science is to help us build things. As Fred Brooks put it: "the natural scientist builds in order to study; but the engineer studies in order to build." He goes on: "I submit that by any reasonable criterion the discipline we call ‘computer science’ is in fact not a science but a synthetic, an engineering, discipline. We are concerned with making things, be they computers, algorithms, or software systems." In reality, computer science is both (and much more too). However, studying in order to build is a fundamental part.
So building things (programming) is not an optional add-on to the subject: it is a key raison d’etre of the subject itself.
The authors of this white paper are arguing against a purely theoretical framing of computer science. To achieve that goal, they push hard on the pendulum in the opposite direction, towards building, making, and engineering. I won’t quote more of the white paper here, but I reacted to how they saw computer science connecting to social science, e.g., that social science teaches how to study people and that can result in making better software—as opposed to programming being a tool to further social science education.
The challenge that the authors of the white paper face is an old one in computing—it’s a hard field to categorize. Peter Denning and Peter Freeman wrote in 2009 that categorizing computer science as engineering alone is fruitless. Computer science has aspects that are engineering, science, and mathematics, but is really a new paradigm entirely.
During the pandemic, I worked with colleagues at the University of Michigan’s College of Literature, Science, and the Arts (LSA) to answer the question: What is computing within liberal arts and sciences? What do LSA students need to know about computing? With my co-chair Gus Evrard and a task force from across campus (see our final report here), we came up with three themes that describe how computing appears within LSA:
- Computing for Discovery: Scientists in both the natural and social sciences use computation to advance knowledge. I learned from the task force a critical difference between computational science and data science: computational scientists create models that reify their theories, then simulate those models to test their theories. This is the use of computing that Perlis was promoting for all students in 1961.
- Computing for Expression: Computing has created new ways for humans to communicate with one another, from social media and email to blockbuster motion pictures and data visualizations. Scholars in liberal arts and sciences both use computing for expression (which is a form of building/making) and study how computing is being used for expression (which is more analysis).
- Computing for Justice (also called "critical computing"): Computing can encode bias and inequities that exacerbate social ills, or it can be used to support our democratic institutions. A new book by Mehran Sahami and his colleagues, System Reboot: Where Big Tech Went Wrong and How We Can Reboot (website), offers an accessible introduction to the challenges and opportunities in a critical perspective on computing. In the 1960’s, scholars such as C. P. Snow and Peter Naur posited that it was necessary for everyone to learn about computing to provide democratic oversight on powerful new computational technologies (see essay on their words).
There are aspects of "making" in these three themes, but not always from an engineering perspective. Computational scientists and artists often write brief snippets of code to try out an idea or generate a piece of a bigger solution, then they throw that code away. Their use is more "bricoleur" than "planner" (Turkle & Papert). Critical computing scholars at the University of Michigan tell me they want their students to be "conversational programmers"—they need to be able to talk to technology developers, but not become engineers themselves. Our best approaches to teaching conversational programmers include programming, but they’re not the same approaches as when we teach computing as engineering.
I strongly agree with the authors that programming is a critical aspect of computing education. Setting an agenda for a curriculum that effects millions of students requires a broad perspective—we want the theoretical/analytical and the engineering/making, as well as many purposes in between. Let’s define computing education to support students in all the ways they will be using computing in their lives and careers.
Mark Guzdial is professor of electrical engineering and computer science in the College of Engineering, and professor of information in the School of Information, of the University of Michigan.