Everyone is saying that it's one of the best books for CS, and you can learn a lot from it, but I feel they're just bluffing because no one explains WHAT they have learnt exactly.
They can't explain what they've learned, because SICP covers so much ground. The best way I can explain is by negative examples. SICP is not:<p>- A learn X in 7 days book<p>- A technique driven solution book (cookbook)<p>- A quick overview of the new hotness library/language/api/framework<p>- A list of all the functions that you should know<p>- A reprinting of the half complete wiki documentation of a weekend github toy<p>- A one off read that you dump in the recycle bin<p>SICP gives grounding to some of the core problems in computer science. I've returned to it several times, and I always learn something from what I've missed before. Understanding how functions/closures/namespaces/objects all interrelate, how to think in recursion, building higher order programs from pieces, it even covers simple examples of VMs. It's a very strong entry text that has stood the test of time, and is still providing value. Few texts in comp-sci can say the same. SICP does a good job of connecting the theory of comp-sci with a real language without overwhelming the student with absurd language syntax problems.<p>When any one asks me to recommend a computer book I recommend SICP. Best of all no one has to take my word for it, the book is free. <a href="https://mitpress.mit.edu/sicp/" rel="nofollow">https://mitpress.mit.edu/sicp/</a> go read it and form an opinion.<p>Who is SICP not for? If you are at a high level with programming with multiple languages under your belt, most of this would seem like a refresher. If you really "know" VMs then this is going to very low level stuff. If you want a quick read to learn the syntax for scheme this is not the book for you.
I'm reading SICP at the moment and have to say it's been a real eye opener.<p>I'm finding that seeing concepts I take for granted when I'm programming being built up from first principles changes the way I think about the languages I use.<p>I'm not sure it's made me a better programmer, but it has given me a better understanding of why programming languages are the way they are.
I recently looked at SICP again after first reading it many years ago. I had retained the overall impression that SICP demonstrates how to build many of the celebrated creations of computer science - interpreters, compilers, databases, logic programming systems, circuit simulators - using a very simple programming language with just a few constructs.<p>But I had forgotten many of the details. Here is just one:
in 3.1.1, Local State Variables, SICP shows how to, in effect, define classes and create objects using only function definition with lambda and set! (that is, assignment) in the definition body. The function you define this way is a like a class, the functions it returns
are like instances. So you can do all this without any specifically object-oriented language features. This occupies just a few pages near the beginning of a long book - the whole book is dense with worked-out ideas like this.
What SICP teaches is how to use various types of abstractions to build software.<p>(It is lacking syntactic abstraction, as provided by Common Lisp macros, but one can argue that metalinguistic abstraction, which is covered, supercedes syntactic abstraction).<p>Also, for normal programmer, it works (along with the videos) like a mind-openner: you won't understand programming the same way after having studied it. It has a mind-freeing effect.