I have been longing to read the Structure and Interpretation of Computer Programs (SICP) for a long time – a lot of great programmers tout it as one of the ‘books‘ to read. In May I completed JS Allonge (a somewhat challenging read but got to understand the Y-combinator Alhamdulillaah) and I felt it was a good time to learn more about the SICP book; afterall how many 30-year old computing books still remain relevant?
The general consensus is that SICP is a classic every programmer should read and that it’ll make you a better programmer by changing the way you think. Reading such glowing appraisals awakened my interest (who doesn’t want to become a rockstar programmer?) and I decided to do it. However, there is a catch – reading the book is not enough, you have to do all the exercises! So I resolved to do all the exercises and read for at least 25 minutes daily (1 pomodoro).
The exercises appear deceptively simple until you try to solve them! Then you realize they are just as deceptively difficult!! For example, an exercise asks you to find the two largest numbers out of a set of three – I bet a lot of people can write this in their sleep. However since the book expects programs to be written in Scheme; and Scheme variables haven’t been discussed yet, you have to make do without variables – now try that!
The good thing though is that the exercises are designed to fit the current context and buttress learning. Mathematical concepts and computer science principles are expertly interwoven into surprisingly simple explanations and real-life scenarios. Scheme is a nice language too – provided you can get past the scourge of parentheses.
Solving the exercises has been another eye-opener; I typically have to force myself to persevere. Alhamdulillaah I have been able to solve questions I typically would think were beyond me (I am probably too lazy). If I can’t solve a question in 25 minutes, I look for a solution online (see resources below); at times, I just want to compare my approach to others.
Here are some programming-perception changing concepts I picked up in the past few months:
1. Scope
A scope is just a group of expressions in which a binding has a name; it really does not have to be a function or class.
2. Free and bound variables
Free variables are those not defined in a procedure while bound variables are defined in it. Imagine the procedure below
function variable(){ var a =1; var b = 2; return a + b; }
a and b are bound variables however + isn’t; it’s a free variable. Now try to think of what will happen if the ‘+’ operator can be bound to another value (quite possible in some languages). The original procedure works properly because the free variables are what they are expected to be; if they are changed, then you end in no mans land. Powerful right?
3. Recursive/Iterative processes and procedures:
Most recursive procedures can be re-written to spawn iterative processes. While this involves a couple of tricks, the performance and memory gains might require such fixes. Also not every recursive procedure spawns recursive processes, some actually are iterative in execution (see tail recursion).
Resources
If you are interested in reading the SICP books; here are a couple of helpful resources
3. Solutions to SICP Exercises
4. Bill the Lizard; he undertook the SICP journey before me
5. Eli Bendersky, he also undertook the SICP journey some time ago
Quotes from the SICP book
Programming is like chess; you might know the rules but not know the strategy, tactics and methods
The ability to visualize the consequences of the actions under consideration is crucial to becoming an expert programmer, just as it is in any synthetic, creative activity…
To become experts, we must learn to visualize the processes generated by various types of procedures. Only after we have developed such a skill can we learn to reliably construct programs that exhibit the desired behavior.
Conclusion
Finally, believe! You can do it, just persevere when it gets tough…
so how much time did you take to finish it, I am planning to start it and want to know how much of a time commitment it would be roughly (I am a beginner in Programming CS, have done Udacity CS 101 only till date and some programming in python)
LikeLike
It took me about a year and I spent about 25 minutes daily. Most people took about a year too. I would say you should go for it – definitely worth it.
LikeLike