Structure and interpretation of computer programs

I wrote this five years after reading SICP
Often called the wizard book, SICP is considered a timeless classic that I will always hold dear to my heart for introducing me to computer science. I originally intended to become a mathematician, and I saw people online saying SICP is a good introduction for those who are mathematically minded. I was also an Emacs user back then (now a Vimmer), so I naturally had some interest in Lisps.
The book and its exercises were challenging at first, because I had little to no programming experience, but the wizard within me persisted. As I got better, I started having a blast reading through it and working through the exercises. My favorite exercise is 2.6, where you are asked to implement church numerals. To think that lambda calculus is so general and powerful that it could construct the numbers we take for granted was joyful experience for me. I still find it hilarious that exercise 2.16 tricked me into spending hours working on an unsolvable problem. Oh and the exercises where you had to make your own computer algebra system! So many memorable problems were explored within the book.
SICP touches a lot of topics. Functional and imperative programming, data structures, the consequences of mutability, the expression problem, concurrency, message passing, interpreters, VMs, etc. You know a book is comprehensive when you start not knowing how to program and end with making your own language! Nearly every CS course I took in university was discussed at some point in SICP. The programming language Scheme is not important. It’s just a vehicle for teaching those concepts. I think its comprehensive and language-agnostic approach to computer science makes it a great introduction.
My favorite part is how it drills into your mind the important principle of abstraction. Time and time again, it shows how unrelated problems are all solved by creating primitives, along with their means of combination to form abstraction layers that describe the system. One quote that has stuck with me:
… the technology for coping with large-scale computer systems merges with the technology for building new computer languages, and computer science itself becomes no more (and no less) than the discipline of constructing appropriate descriptive languages.
As great as it is, I never understood why many people made grand claims about SICP, like “It will fundamentally change how you program” or “your programs will reach a higher plane of existence”. Perhaps I do not share their sentiment because it was my first introduction to computer science and I don’t have anything to compare it against. I did gain a lot from it, but I don’t think there’s anything magical in it that you couldn’t find elsewhere.
The book was not perfect either. Some exercises like 1.13, felt out of place. They weren’t hard per se, just felt irrelevant to what the authors were trying to teach. Furthermore, one can argue that starting with functional programming, with recursion, lexical scopes, and higher order functions is perhaps elegant, but less intuitive than the traditional approach of starting with imperative programming. If I were to teach a grandma computer science, then I imagine she’ll have an easier time grasping variables, mutability, and loops over recursion and closures. Over time, as she gets accustomed to procedural systems, we can gently introduce her to functional programming, the advantages of immutability, and the elegance of higher order functions. I only sought a functional-first approach because I badly wanted to view computers as abstract systems, but most people don’t care about that (yet).
Overall, even though I think the book is a bit overrated, I genuinely loved it and I think it’s a great introduction to computer science.