Almost twenty years ago, the publication of Structure and Interpretation of Computer Programs (SICP) changed the teaching of introductory courses in computer science. Unlike most of its competitors, which usually introduce the syntactic constructs of a programming language with examples, SICP discusses important and fundamental concepts of programming and computing. To achieve that, SICP introduces Scheme as a lightweight language and then uses it as a sketchpad for illustrating deep concepts. With SICP, Scheme and functional programming (FP) spread around the world.
While SICP raises the level of discourse, it also suffers from three major problems. First, it does not contain any explicit discussions of program design knowledge. As a result, teaching SICP does not prepare students for the rest of a typical computing curriculum. Second, SICP uses complex domain knowledge to illustrate the power of programming, which obscures the underlying program design knowledge. Third, Scheme isn't as simple as it appears. So, it, too, can be an obstacle to learning about design. Once people realized these problems---especially the first one---they withdrew, and Scheme lost its luster for many instructors of introductory curricula.
In this paper we analyze the structural constraints of the typical computer science curriculum and interpret SICP and Scheme from this perspective. We then discuss how our new book, How to Design Programs, overcomes SICP's problems. We hope that this discussion helps instructors understand the structure and interpretation of introductory courses on computer science.