Structure and Interpretation of Computer Programs

July 2, 2012 10:19

A few years back I decided to learn a bit more about computer programming. While I’ve taken several programming courses, they were mostly designed to teach a language with a few additional concepts thrown in incidentally. But I never had formal instruction in the underlying principles of computer programs in particular — what might be called software engineering.

I started by working through an introductory text on software design. Then I went through book on algorithms, in order to understand in depth some of the methods I was vaguely familiar with. Eventually I wanted to take on the fundamentals of computer operation (at the abstract level — as for architecture of electronic computers, I’d already covered it well). One book that was pointed at over and over when I looked for advice is the one mentioned in the title: Structure and Interpretation of Computer Programs . You can read the full text online for free. This book, despite being first published over 20 years ago, is considered a classic and still one of the best ways to learn how computer programs work.

At present I’ve worked about halfway through the book on my own. I’ve been reading the sections and working all the questions at the end of each. I expect the remainder to be slightly tougher as it’s mostly concepts I’m not as familiar with. Given the book’s popularity, I’ve been able to find a number of online resources to assist me. Now I’m adding to that with my own journey through this book.

I’m not the first one to go through this, of course. There is some value in seeing new solutions to the same problems, but what I’m hoping to add in my approach is some material for testing the solutions you come up with. Since I know for some people this may be their first time learning these concepts I’m not jumping into full-blown testing right away. The goal at any rate is not to have this be a complete and rigorous system of solution-checking but an encouragement to add onto it yourself. Consider it a starting point.

You can get started by going through the Github repository. Each section will have a post dedicated to it here as well.