One of the most influential texts in computer science is Structure and Interpretation of Computer Programs. Before changing to a Python-based approach, MIT used this book for their introductory programming course. It is freely available with a number of resources thanks to the textbook site. When perusing the list of schools using SICP, I see that all of them are universities/colleges, which leads me to my question.

Is SICP appropriate for an advanced high school computer science course?

In particular, I'm thinking of students who have taken two years of AP Computer Science, so they would have completed a year of CS50 AP and a year of Java. I see that UC Berkeley has a self-paced CS class that works through it. I understand that some things are at the university level for a reason, but I am trying to bridge the gap between post-AP CS classes in high school and intro CS classes in college.

  • $\begingroup$ I watched the videos. At ½ way they had covered everything I know, including object orientation, but had not yet introduced variable mutation. It made me go “Wow”, and realise how little of the time we need to mutate a variable. $\endgroup$ – ctrl-alt-delor Jul 16 '17 at 15:58
  • $\begingroup$ It also may be that they would not list high schools that use the book. Those lists are a marketing decision, and high schools are not the primary audience that they market to. A top university may potentially be dissuaded by seeing high schools on a list for a book they are considering adopting. $\endgroup$ – Ben I. Jul 17 '17 at 5:04

First, I love SICP. I took and later TA'd 6.001. Like many MIT grads, I tried to teach it where I became a professor, and, like most who attempted it, decided not to do so again.

The main reason it is rarely successful outside of MIT isn't the difference in student quality but the difference in the support the school can offer. If I remember correctly, at MIT, there were three lectures a week, two recitation sections, one tutorial section (approximately 4 students meeting for an hour with a graduate TA), and many staffed lab hours. A high school or small college cannot generally provide that level of support. Also, when taught outside MIT, it is usually as a junior-level course, and students still usually find it overwhelming. (An exception is UC Berkeley, which taught it successfully for many years at the freshman level.)

I am not saying a high school class could not succeed, just that it would be very difficult, and the amount of work required would be exceptional.

It might also be hard to motivate students to work so hard on something so abstract, when they could be learning app development, computer games, or another more immediately rewarding topic with less effort.

In summary, I would advise against using SICP for a class at the high school level, although I do think it is possible to supervise an independent study with a sufficiently motivated and sophisticated individual or small group of students.


Absolutely, the book is a gem. It's filled with great insightful stuff right from the foreword. One such gem:

computer language is not just a way of getting a computer to perform operations but rather that it is a novel formal medium for expressing ideas about methodology. Thus, programs must be written for people to read, and only incidentally for machines to execute

Now, as to why I consider this book appropriate for High-School CS is this:

essential material to be addressed by a subject at this level is not the syntax of particular programming-language constructs, nor clever algorithms for computing particular functions efficiently, nor even the mathematical analysis of algorithms and the foundations of computing, but rather the techniques used to control the intellectual complexity of large software systems

The book doesn't focus on learning the language but instead on solving some problem. It builds from a explaining basic primitive type to using those to create abstractions and complex stuff.

The language used, Scheme (a dialect of lisp), is great for this purpose. The authors explain various concepts clearly. here's a good example explaining compound procedures.

Now, as pointed out by fellow community folks here, managing the material is a bit hard and I believe that one don't have to cover the entirety of the book but cover enough so that people can infer as how to solve a particular problem given to them.

  • $\begingroup$ Nice answer, and welcome to Computer Science Educators! $\endgroup$ – Ben I. Jul 19 '17 at 17:34
  • 1
    $\begingroup$ I have been in private beta but was not happy about it. :( Now, it seems to getting better. $\endgroup$ – T K Sourabh Jul 20 '17 at 14:58
  • $\begingroup$ Then welcome back! :) $\endgroup$ – Ben I. Jul 20 '17 at 15:01
  • 1
    $\begingroup$ Could you also address why you think high school teachers/students are able to manage the material, not just whether the material is worthwhile? $\endgroup$ – Ellen Spertus Jul 21 '17 at 2:58
  • 1
    $\begingroup$ Sure. Sorry I delayed answering this. @EllenSpertus Thanks :) $\endgroup$ – T K Sourabh Jul 28 '17 at 10:18

The book is quite deep. I'd only consider it in secondary school if the students typically go off to top universities, MIT, Cambridge, Berkeley, or similar. Otherwise, I's strongly suggest that they get a deeper knowledge of whatever language they already know.

Java version 8 has extensions that permit learning much about functional programming, for example.

Learning lots of languages shallowly isn't really a path to success. Of course Scheme and Java are sufficiently unlike that studying both opens new thought processes to the student that learning both Java and Ruby would not.

But learning how to become a true expert in one language gives you a powerful tool for whatever you want to do.

It is often a shock when a top student at a top secondary school winds up at, say MIT and finds themselves just average.

  • 1
    $\begingroup$ Although we like to expose our students at NCSSM to more than one language, so they see the commonalities. B''sides it is not languages that are important, it is the problem-solving process. Languages are tools. Architectures vary according to purpose. $\endgroup$ – ncmathsadist Jul 18 '17 at 1:44
  • $\begingroup$ I think there is nothing wrong with being exposed to lots of different languages and environments, including non-programming things like Matlab, a home-brew digital design simulator created by a prof, a robot arm system created by another prof, and so on. My first resume out of college had a list of languages in alphabetical order, beginning with APL, about 14 in total. Nothing shameful about that. I did earn money with C and eventually mastered it. But lex and yacc came in handy a few times. My solution was almost always "develop a DSL for this problem" and I didn't work much overtime, ever. $\endgroup$ – Scott Rowe Oct 14 '18 at 21:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.