/sicp-abrantes-study-guide

My study guide for SICP

Primary LanguageSchemeMIT LicenseMIT

My personal study guide for SICP

1 What is this GitHub repository?

This is my attempt to systematize my study of one of the best computer science books of all time (some say "the best"), the Structure and Interpretation of Computer Programs (SICP), written by Hal Abelson, Jerry Sussman and Julie Sussman.

This book was created for the mythical 6.001 Massachusetts Institute of Technology (MIT) discipline, which for 27 years (1980 to 2007) was considered the highest-level programming discipline in existence. More than 100 universities around the world have adopted this book.

In fact, from the point of view of MIT teachers, you could not be considered a "true" computer scientist if you did not understand the content discussed in the SICP. Some quotes to support that vision:

I've only ever seen one great book on the subject of computer programming: Structure and Interpretation of Computer Programs (Abelson and Sussman; MIT Press). If you're already a great programmer, it will take you an evening to read the first few chapters and you'll discover a precision vocabulary for discussing what you've spent 10 years learning the hard way. If you're not already a great programmer, I would have thought that these few chapters would save you from having to spend years flailing around in the dark. Unfortunately, there doesn't seem to be a substitute for practical experience. Sidenote: the authors used to have a review wall outside their offices at MIT. University professors from around the world writing in scientific journals said "finally I understand what all this computer science stuff is about; this is the most brilliant book ever. I'm glad that we're using it to teach freshmen now." In the center was a review from Byte magazine: "I didn't understand any of this book."

The best computer science book in the world.

MIT set the bar very high for these courses, creating a required course (6.001) and a textbook (Abelson & Sussman’s Structure and Interpretation of Computer Programs) which were used at dozens or even hundreds of top CS schools as the de facto introduction to computer science. (You can, and should, watch an older version of the lectures online.)

The book should be read by every self-respecting computer scientist. Because of its clarity, simplicity, and wit, this work is highly recommended to anyone seeking an understanding of the emerging paradigms of computer science.

  • Mitchell Wand (American Scientist)

Structure and Interpretation of Computer Programs (SICP) is one of the true programming classics. It's a well-deserved position; SICP is simply the best programming book I've ever read. I made my first pass through it a year ago but deliberately postponed my review; reading SICP completely changed the way I approach programming. [...] SICP is one of the most important books in our field.

The book should be obligatory for anyone involved in teaching computer science at degree level: it will convince them that inside computer science there really is a true science trying to get out.

  • David Barron (The Times Higher Education Supplement)

Although there are also criticisms of the SICP, many programmers are now returning to study it and saying that it has not yet been overcome (What I Have (Re)-learned From SICP).

A quick Google search for "sicp study guide" will show dozens and more dozens of recent reports from individual SICP studies, even if MIT itself is no longer offering this discipline in its new curriculum.

This GitHub repository is my individual study guide for SICP. I'm starting now in, February 2019, and I intend to finish within 1-2 years. Feel free to use the materials and codes I will put here and send me suggestions and criticisms (abrantesasf at gmail dot com).

Have a nice SICP!

2 Initial difficulty: how to study?

The main difficulty I had, before starting, was to define a method, a plan for the study that used the resources available on the internet beyond the book itself. I spent almost 2 months looking for material on the internet, and here's the problem: there is a lot of material from SICP and MIT 6.001 on the internet, but all of this stuff is completely disorganized, not systemized, with many different versions depending on the year/term when 6.001 was taught at MIT, and so on. The main sources that I found were:

Other usefull resources founded:

The main difficulties I encountered when starting my studies were the following:

  • MIT OCW x Video Lectures: since the lessons available at MIT OCW are from 2005 and the video lectures from 1986, the lessons (and also the lecture notes) do not exactly match the videos. This creates a reasonable difficulty: you have to match the new lessons with the old videos, and this is not always obvious. Some old videos are covered in two or more new classes, and vice versa. You will have to adapt yourself to this.
  • The version of Scheme used in 6.001 classes is Scheme 7.5.1, already very old. The most current version of Scheme is 10.1 and this may cause incompatibility problems with the original code.

For all these difficulties there is no optimal recipe for the individual study of SICP. Everyone needs to find the method that works best for themselves. My study plan is as follows:

  1. From the features of MIT OCW, try to follow the suggested schedule as follows:
  1. Study the material of the recitations available on the internet (see above), concerning the content of the readings and videos.
  2. Answer the problem sets and projects available at MIT OCW and the internet (see above)
  3. Answer the problems on SICP book (and on Instructor's Manual).

Files created during my study will be organized into subdirectories that will indicate the chapter and the corresponding section of the book.

3 Summary

As my study progresses, I will add here links to files and codes. Please note: the content listed below is much larger than the content that was originally used in MIT 6.001, as the original course had 1 semester (13-16 weeks) duration. I'm not in a hurry and so I included more stuff.