Skip to content

The Wizards (2): Harold Abelson on controlling complexity and real vs idealised systems

So in computer science we’re in the business of formalising this how-to, imperative knowledge. How to do stuff. And the real issues of computer science are of course not of telling people how to do square roots, because if that was all there was it would be no big deal. The real problems come when we try to build very very large systems. Computer programs that are thousands of pages long, so long that no-one can really hold them in their heads all at once. And the only reason that that’s possible is because there are techniques for controlling the complexity of these large systems. And these techniques of controlling complexity are what this course is really about. And in some sense that’s really what computer science is all about.

Now that may seem like a very strange thing to say, because a lot of people besides computer scientists deal with controlling complexity. A large airliner is an extremely complex system, and the aeronautical engineers who design that are dealing with immense complexity. But there’s a difference between that kind of complexity and what we deal with in computer science, and that is that computer science in some sense isn’t real.

You see, when an engineer is designing a physical system that’s made out of real parts, the engineers who worry about that have to address problems of tolerance and approximation and noise in the system. So for example, as an electrical engineer I can go off and easily build a one-stage amplifier, or a two-stage amplifier, and I can imagine cascading a lot of them to build a million-stage amplifier but it’s ridiculous to build such a thing because long before the millionth stage the thermal noise in those components way at the beginning is going to get amplified and make the whole thing meaningless.

Computer science deals with idealised components. So we know as much as want about these little program and data pieces that we’re fitting things together. So we don’t have to worry about tolerance. And that means that in building a large program, there’s not that much difference between what I can build and what I can imagine, because the parts are these abstract entities that I know as much as I want, I know about them as precisely as I’d like. So as opposed to other kinds of engineering, where the constraints on what you can build are the constraints of physical systems, the constraints of physics and noise and approximation, the constraints imposed in building large software systems are the limitations of our own minds. So in that sense computer science is like an abstract form of engineering, the kind of engineering where you ignore the constraints that are imposed by reality.

Harold Abelson – Structure and Interpretation of Computer Programs, Lecture 1

I'd love to hear your thoughts and recommended resources...