Structure and Interpretation of Computer Programs

This is demanding material—and that's why it works. Master the fundamental ideas of computation that shaped generations of programmers.

9 modules9 available~7 hours total

About This Course

This course is not about learning Python syntax. It is about learning how programs work.

The material is challenging. That's the point. SICP has a reputation for being difficult because it asks you to think deeply about ideas most courses gloss over. Expect to struggle—and expect to grow. The AI tutor is with you at every step.

Through classic SICP ideas adapted to Python, you will learn to reason about computation, abstraction, state, and interpreters—the foundations behind all modern software systems.

Originally developed at MIT by Harold Abelson and Gerald Jay Sussman, SICP teaches the fundamental ideas of computation. This course adapts the core SICP curriculum into Python, following the approach pioneered by UC Berkeley's CS 61A.

The course progresses from simple abstractions (functions) through compound data, state and mutation, object-oriented design, and finally to building your own interpreter. Each module includes video lectures with interactive checkpoints, the original SICP reading material, and hands-on lab exercises in Python.

Based on Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman (MIT Press, 1996), adapted to Python following UC Berkeley CS 61A.

Prerequisites

  • Basic Python fluency (variables, if/else, loops, defining functions)
  • Comfort with simple math (algebra-level)
  • No prior CS theory or functional programming experience required

What You Will Learn

  • Use higher-order functions, closures, and lambda expressions to write expressive, reusable code
  • Trace program execution using the environment model (frames, scoping, name lookup)
  • Think recursively and analyze recursive vs iterative processes
  • Design programs using data abstraction and abstraction barriers
  • Process sequences and trees with map, filter, reduce, and recursive traversal
  • Reason about mutation, aliasing, and identity in Python
  • Use classes, inheritance, and polymorphism effectively
  • Build a working interpreter for a small programming language

Terminology Mapping

How classic concepts map to the terminology used in this course.

ClassicThis Course (Python)
Procedure / Higher-order procedureFunction / Higher-order function
Lambda expressionLambda expression (same concept)
Environment model of evaluationEnvironment diagrams (frames & scope)
Recursive / iterative processRecursive / iterative process (no tail-call optimization in Python)
Pairs (cons, car, cdr)Tuples, lists, or closure-based pairs
Data abstraction (constructors + selectors)Data abstraction (same pattern, using functions or classes)
Sequences (lists)Python lists, generators, comprehensions
Message passingDispatch functions / methods
Generic operations / data-directed programmingPolymorphism / duck typing
Metacircular evaluatorInterpreter written in Python

Your Learning Path

Each module builds on the last. Take your time—the AI tutor is with you at every step.

1

1.6 Higher-Order FunctionsFunctions as first-class values, closures, and the summation abstraction

Learn to pass functions as arguments, return functions as values, and use lambda expressions. See how one general pattern (summation) replaces many specific functions—the key idea behind abstraction.

45 minVideo lectureReading materialLab exercises
2

1.7 Environment DiagramsHow names get values, and how evaluation actually proceeds

Build a mental model for how Python tracks names and values. Trace function calls through frames, understand name lookup and shadowing, and see why closures work.

30 minVideo lectureReading materialLab exercises
3

1.8 Recursive FunctionsRecursive vs iterative processes, tree recursion, and memoization

Understand recursive function definitions, trace call stacks, and distinguish linear from tree recursion. Learn when recursion leads to exponential blowup and how memoization tames it.

40 minVideo lectureReading materialLab exercises
4

2.2 Data AbstractionConstructors, selectors, and the power of abstraction barriers

Separate the use of data from its implementation. Build rational number arithmetic behind a clean interface, then see that even functions can serve as data.

50 minVideo lectureReading materialLab exercises
5

2.3 SequencesLists, the signal-processing view, and lazy evaluation with generators

Process data with map, filter, and reduce. See sequences as pipelines, master list comprehensions, and discover Python generators for lazy, memory-efficient computation.

45 minVideo lectureReading materialLab exercises
6

2.5 TreesRecursive data structures and tree traversal patterns

Represent hierarchical data as trees. Learn the tree ADT (constructor + selectors), and master recursive patterns for aggregation, transformation, and search over tree structures.

40 minVideo lectureReading materialLab exercises
7

2.6 Mutable DataState, identity, and why mutation breaks substitution

Introduce mutation into the picture. Understand nonlocal, aliasing dangers, the mutable default trap, and the fundamental trade-off: mutation enables state modeling but makes reasoning harder.

35 minVideo lectureReading materialLab exercises
8

2.7 Object-Oriented ProgrammingObjects as an alternative abstraction boundary

Organize state and behavior into classes. Connect OOP back to closures and message passing, then explore inheritance, method resolution, and how polymorphism enables multiple data representations.

60 minVideo lectureReading materialLab exercises
9

3.1-3.5 InterpretersRebuilding the evaluator to understand computation itself

The capstone: build a working interpreter in ~100 lines of Python. Understand parsing, the Eval/Apply cycle, environments inside the interpreter, and how a language can describe itself.

90 minVideo lectureReading materialLab exercises