In July of 1986, Hal Abelson and Jay Sussman gave a series of lectures. The topic was The Structure and Interpretation of Computer Programs.

In the first lecture, Abelson gives a description of programming (which I’ve edited lightly) that I don’t think has been bested since:

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 idealized components. We know as much as we want about these little program and data pieces that we’re fitting things together. We don’t have to worry about tolerance. And that means that, in building a large program, there’s not all that much difference between what I can build and what I can imagine.

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. It’s the kind of engineering where you ignore the constraints that are imposed by reality.

It’s even better when Hal says it: