“I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shafted every now and then, and after a while we began to take their complaints seriously. We began to feel as if we really were responsible for the successful, error-free perfect use of these machines. I don’t think we are, I think we’re responsible for stretching them, setting them off in new directions, and keeping fun in the house.
I hope the field of computer science never loses its sense of fun. Above all, I hope we don’t become missionaries. Don’t feel as if you’re Bible salesmen. The world has too many of those already. What you know about computing other people will learn. Don’t feel as if the key to successful computing is only in your hands. What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.”
– Alan Perlis, in the dedication section of the book.
Rewording the quote above, Structure and Interpretation of Computer Programs is a book helps you to “see the machine as more than when you were first led up to it, that you can make it more.” The book doesn’t just teach you to code – it teaches you new ways – better ways to think about fundamental things like data, computers, instructions and the notion of thinking itself.
The book is not only full of pointers to other disciplines like mathematics and physics (at one point the authors draw parallels between a world line and a stream of data), but also contains numerous intriguing facts (like how Fermat wrote “I have discovered a truly remarkable proof, but this margin is too small to contain it”, for a theorem in one of his notebooks and it took mathematicians over 300 years to prove it and how Heron of Alexandria was developing algorithms to find square roots in the first century A.D.).
What makes it even better is the fact that imperative programming is not introduced until page 200. The authors introduce functional programming first – in fact they even show how complex mathematical tasks like computing integrals can be done using only functional programming with far more elegance.
The icing on the cake is that it contains extremely refined information and beautiful ways to think about a wide range of topics from Computer Science. To name a few, it talks about recursion, mathematical notation like Big O, creating small languages for specific purposes (the so called “Domain Specific Languages”), a huge variety of data structures, advantages and pitfalls of concurrency, linguistic abstraction (a large portion of chapter 4 is about writing an interpreter for Lisp in Lisp itself), databases, compilers, computer organization and architecture (all of chapter 5 is about this low level stuff).
Once again, paraphrasing the quote above, I hope I don’t sound like a “Bible salesman” for SICP. However, I sincerely believe that you should at least try to read SICP, irrespective of your profession. It will not only teach you about computers (which is always useful to know about, especially in today’s world), but also superior ways to think.