Author: Harold Abelson and Gerald Jay Sussman · Published: 1985 · Genre: Programming, Computer Science
The biggest strength of Structure and Interpretation of Computer Programs is that it teaches you how to think about programs, one layer of abstraction at a time, until you have written an interpreter for the language you are using. Its biggest weakness is that it is hard going, with math-heavy examples and demanding exercises in Scheme, a language few readers will use at work. Read it if you want to understand computing deeply rather than pick up a job skill, and budget weeks, not evenings.

The core ideas
Written with Julie Sussman for MIT’s introductory course 6.001, which used it until 2007, the book is nicknamed the Wizard Book after its cover. The second edition appeared in 1996.
- Abstraction with procedures. Early chapters show the difference between recursive and iterative processes, and how a procedure that calls itself can still run as a loop. Higher-order procedures take and return other procedures, so patterns like summation or finding a fixed point are written once.
- Abstraction with data. Using rational numbers as an example, the book builds abstraction barriers so code that uses data doesn’t depend on how it is stored. It then covers lists, trees, symbolic differentiation, Huffman encoding trees and generic operations that dispatch on type.
- State and its costs. Introducing assignment breaks the simple substitution model of evaluation and forces a more complex environment model. Streams, built with delayed evaluation, offer a way to model change over time without mutable state.
- Metalinguistic abstraction. The centerpiece is the metacircular evaluator, a Scheme interpreter written in Scheme. The authors then modify it into a lazy evaluator, a nondeterministic evaluator and a logic programming language.
- Down to the machine. The last chapter simulates register machines, explains garbage collection and builds a compiler.
What’s great
- Ideas over syntax. Scheme has almost no syntax, so from the first hour you are learning concepts rather than language rules.
- The interpreter payoff. Writing an evaluator demystifies programming languages. Once you have built eval and apply yourself, scoping rules and evaluation order stop being mysteries.
- Free and well supported. MIT Press makes the full text available online, and the 1986 video lectures by Abelson and Sussman are freely available too.
- A clear philosophy. The preface’s point that programs are written for people to read, and only incidentally for machines to run, shapes everything that follows.

What’s weak
The examples assume mathematical comfort. Newton’s method, numerical integration and symbolic differentiation appear early, which puts off readers without a calculus background. The authors of How to Design Programs criticized exactly this, arguing that the book demands too much domain knowledge from beginners, and wrote their own curriculum partly in response.
Scheme is also a barrier for many modern readers. A JavaScript edition, adapted by Martin Henz and Tobias Wrigstad, appeared in 2022 for those who want familiar syntax.
The book says little about practical software engineering: no testing, no libraries, no large codebases. When MIT replaced 6.001 with a Python-based course, Sussman explained that engineering had changed, and that programmers now spend much of their time working with libraries they don’t fully understand rather than composing small, well-understood parts. Finally, the exercises are hard and there are no official solutions, which makes self-study slow.
Who should read it
Computer science students, motivated self-learners and experienced programmers who want the foundations they skipped. Comfort with algebra and some calculus helps. If it proves too steep, work through How to Design Programs first, then return. The 1996 second edition is the standard text.
Rating: 4.5/5
Image credits — Featured image: Image by A.M. Kuchling via Flickr, CC BY 2.0, cropped. In-article images: Image by andreasolsson.se via Flickr, CC BY-SA 2.0; Image by Daderot via Wikimedia Commons, CC0.


