The words “computer science” seem to mean different things. Some use it to talk about making web pages, others to talk about computational complexity theory or category theory. As I argue in the intro to this book, it’s more than the combination of both. Here’s why.
The term “computer science” broadly encompasses all activities around the design, manufacturing, application and analysis of computing systems. As highlighted in yesterday’s post on what “science” is, it includes both the quest for abstract knowledge (“theoretical computer science”) and engineering aspects where innovation takes place; the engineering aspects can be further divided between “foundational engineering”, ie computer systems engineering, and “applicative engineering” where computers are used to serve mankind’s needs or interests.
Today I will skip theoretical computer science (where category theory, complexity theory or algorithm design and analysis occur) and applicative engineering (where “making web pages” occurs); instead I want to talk about the middle activity, which is where my own expertise lies.
Computer systems engineering is the subset of “computer science” related to the design of the computing artifacts, i.e. the design of tools that can be subsequently applied by the IT industry to mankind’s interests. We illustrate the further sub-fields of computer engineering in the figure below, namely: electrical engineering, software engineering, computer architecture and systems architecture. The foundational part of computer systems engineering is inspired by, and based on knowledge and ideas from natural sciences, such as biology and physics, and philosophy, such as the theoretical work of George Boole, Alan Turing, Alonzo Church and Claude Shannon; its outcome, i.e. computing systems, is then instantiated in computing applications, such as home appliances, cars or medical equipment.
In contrast to some fields of technology that can distribute the various activities to separate groups of people, creating a divide of social roles between “scientists,” assumed to be out of touch with the needs of daily life, and “engineers,” assumed to be out of touch with fundamental theory, computer science is peculiar in that it requires all its practitioners to be both skilled engineers and competent fundamental and experimental scientists. This is a characteristic shared by all fields where the produced systems are complex assemblies of parts themselves complex, deployed in complex situations; avionics, high-speed trains and spatial equipment are other such fields. The reason is that for the composition of complex pieces into a complex system to be tractable by human practitioners, first a model of the parts’ behavior must be devised, to simplify the mental image manipulated in the creative process in the next step. For example, when computer architects assemble caches and processors into a multi-core microprocessor chip, they do not keep track of the individual composition of the components in terms of p-type and n-type transistors; instead they manipulate an idealized model of their behavior derived from previous implementations by the experimental and analytic scientific inquiry. This abstraction process happens at all levels of composition, from the grouping of silicon crystals into semiconductors to the grouping of individual processing units into networks of computing clusters.
Historically, computer science was first an isolated field whose end applications were restricted to defense and high-profile business administration. States (for defense) and large companies (for business) could fund single organizations with large research facilities to design their systems. When computers became useful to other applications with more democratic audiences, the audiences could no longer directly fund single, large organizations. The design of computing tools became distributed across distinct organizations carrying the innovation process at different levels, and interacting together to combine systems. A key enabling factor for this division of concerns was the invention of the general-purpose computer, which allowed to separate the designers of hardware from the designers of software into distinct communities.
Tomorrow will be about general-purpose computing and its value for humanity.