← Back to context

Comment by zeroCalories

12 days ago

I always see people gush over this book, but is it still worth reading for someone that already has a ton of experience programming?

I started reading it around a year ago with the personal goal of doing every exercise. I'm not done yet (almost done with chapter 4). It has definitely taken a lot of my time, but it really has changed my thinking about a lot of language constructs I find in other languages.

For instance, the part about tagging objects with their type reshaped my thinking about static type systems in general. Static typing, for example in C, is essentially just moving the location of the type tag from existing at runtime within the struct, to the "analysis" phase of the compiler. It's a pretty simple idea, but it made the "degree of dynamism" tradeoff click in my head. All the information _has_ to exist somewhere, and the only question is where. And Scheme is just at an extreme where the _everything_ is stored dynamically.

  • > Static typing, for example in C, is essentially just moving the location of the type tag from existing at runtime within the struct, to the "analysis" phase of the compiler.

    See also "shift left"

    > All the information _has_ to exist somewhere, and the only question is where.

    Not entirely sure what you mean about this, but not all type information has to exist somewhere. Sometimes things get encoded into a type that might never be represented otherwise -- like whether an integer is a width or a height, or whether a string is a name or an address.

    • whether something (a variable) is a width or a height is encoded somewhere in the code because if the variable is a width it makes its usage different than if it is a height.

      Then the code is written to make sure you never make the mistake of sending a width to a height, because that would be silly.

      The type (width or height) is represented as logic in the code.

      theoretically - if you have a type system that allows you to know something is a width or height you can often reduce logic to keep track of these things but my experience is that level of granularity in your typing reduces dynamism too much. I would rather keep track of that in code (as it probably will have to deal with it anyway) than make my type system deal with it.

      15 replies →

    • At the extreme end, and with no claims of scalability, you have shell: everything is a string.

      I'm skeptical that sophisticated type systems need to exist.

      Perhaps I should dust off my copy and start reading SICP

"Don't cast your pearls before swine".

When I was younger I used to passionately defend those things I've seen as beautiful, but after years experience talking with people passionate about their fields and learning and those who never will be: If you lack the innate curiosity to explore those things others have declared marvelous, then this book will offer you no value.

Every time I crack this book open I get excited and I've read it multiple time and one most of the exercises. I can think of few other books that really expose the beauty and simultaneously strong engineering foundations of software.

You have "tons of experience programming" and sound like you've already decided you know what needs to be known (otherwise why even ask rather than just read it free online), I doubt this will offer you anything you haven't already seen before.

  • > If you lack the innate curiosity to explore those things others have declared marvelous, then this book will offer you no value.

    > Every time I crack this book open I get excited and I've read it multiple time and one most of the exercises. I can think of few other books that really expose the beauty and simultaneously strong engineering foundations of software.

    ---

    https://news.ycombinator.com/item?id=7667825 and others)

    > Every programmer occasionally, when nobody’s home, turns off the lights, pours a glass of scotch, puts on some light German electronica, and opens up a file on their computer. It’s a different file for every programmer. Sometimes they wrote it, sometimes they found it and knew they had to save it. They read over the lines, and weep at their beauty, then the tears turn bitter as they remember the rest of the files and the inevitable collapse of all that is good and true in the world.

    I recommend (not ironically) Double Binded Sax by the group named Software.

    • > I recommend (not ironically) Double Binded Sax by the group named Software.

      After you finish that, I recommend queuing up Friedrich Nietzsche by Klaus Schulze.

  • > otherwise why even ask rather than just read it free online

    Not GP, but my time is limited, so asking "is this something an experienced programmer would find worthwhile and insightful" is a fair question.

    • To be honest I'd recommend just taking a look. It's been 10 years since I first encountered the book (and programming) and I'm sure the lessons can be found elsewhere.

      But I find the book a marvel of pedagogy and rank it as maybe one of the greatest textbooks of all time across disciplines. The lessons are packed so densely yet so concisely that you'll appreciate different things on successive reads.

      If you're experienced it will also read very easily and quickly so it then becomes quite an easy and enjoyable skim and then you don't have to rely on other people's accounts of whether it is or isn't worth your time.

  • Might find it beautiful, but I'm also just f'in busy. Why do you think that if I enjoyed it I would've already done it? Enjoying things is great but it's not my main desideratum for doing something

    • Then it's not for you and you can do something else, like commenting about why you should read it.

It definitely is a "classic" book for a good reason.

I think it really depends on your actual formal education, how valuable this book will be to you. If you have a CS degree basically everything in there should have been covered during your studies, you already know how to operate on trees, recursive algorithms and how to build an interpreter. The main value to you would have been seeing it all come together in one place.

If you don't have that kind of education I believe it is extremely valuable to see programming from a theoretical perspective. The book is very good at laying out a cohesive narrative of how you go from very basic structures to complex programs and how these programs can be executed by a computer. The highlight definitely is the implementation of lisp in lisp.

There were also chapters, mostly towards the end, which I think aged quite poorly and seemed mostly irrelevant. I don't think there is much lost by skipping them.

I think it is, and if you don't want to take my word for it, John Carmack thinks the same :)

There's an old video [0] where he talks in-depth about his explorations of functional programming. It's perhaps a bit more about Haskell than about SICP, but in it he's also quite enthusiastic about what a veteran programmer can still learn from this book.

[0] https://youtu.be/1PhArSujR_A?si=OD8pGYsoGC7RXPVG&t=125

Experience in software development isn't linear so depending on which path your experience has taken it could be very insightful and useful, or it could be stuff you already know.

I'd say for the vast majority of developers, experienced or otherwise, it's a good read.

That book was my first programming class and programming ever: CS61A at Berkeley. When I started taking it, one of the TAs said that the ideas in the class were wasted on us - they seemed simple but we wouldn't grasp the fullness of the ideas until we had more experience. He said the class should be required to take twice: your first and last class.

It gives you basics of things like recursion and message passing that are easy to use immediately (well, once you figure them out -- it took me two weeks to be able to write even the simplest recursive function), but there are large conceptual things you won't really see the depth in until you have more experience. The last project is the meta-circular evaluator - writing a scheme program to interpret scheme programs. It is difficult to understand that without having a lot of other background.

Even then along the way learning things like exceptions as implemented through call/cc might be a little too much for a beginner programming. The book is in some ways talks about concepts way outside of a beginner's comfort zone.

Whether it's worth reading isn't a question others can answer for you, but "a ton of experience programming" definitely doesn't imply it isn't worth reading as it's perfectly possible to get through an entire programming career without encountering the ideas and ways of thinking that you'll find in it.

Depends on what you learned during that "ton of experience programming." My only regret was that I had, but stupidly ignored, the MIT course notes that preceded publication of SICP. I didn't realize what I had missed until many years later when I sat down to work my way through SICP. I coulda been a contender.

Depends on the kinds of experience. If you have experience writing compilers and interpreters - probably not a lot. If your experience is in application development you might learn a lot.

I worked through it after years of practical experience as a self-thought programmer, and I learnt a lot (and found it quite challenging, especially the mathy parts).

That depends entirely on what kind of a ton of experience you have. If you have written Java/PHP/Python/JS for 20 years, SICP might teach you lots of new tricks. If you have worked a lot with functional languages, probably fewer, but still probably some in later parts of the book.

  • I'd worked exclusively with functional languages and assignment operators implemented as lambdas blew my mind more so than all the monads in Haskell.

    • I'm still working through chapter 1 and, despite having some previous Scheme experience, let being syntactic sugar for lambdas just blew my mind the other day.

I used it as a teaching aid to help colleagues from our application teams get the background and skills to work on our core platform. I certainly got a lot out of it because I had to do all the exercises, and I think if i hadn’t had to prepare like that I would have skimmed more and gained less. But I already had a background that covered a lot of the same areas.

So it is going to depend a lot on your background and the effort you put in. It may be better done as part of a reading group where you can discuss the exercises than on your own as some are meant to highlight why certain approaches are hard and are not commonly used.

I'd say it is less about your experience with programming and more about your interest in it. SICP has quite a profound style that's in between academic and poetic. For me, it was both fundamentally informative and inspirational. So, if you feel like structuring your computer science foundation and like an imaginative approach to programming and math that favors aesthetics, give it a try.

I’d say read the first chapter. If it doesn’t excite you at this point in your career it might not be for you and that’s ok.

I’d say it’s actually more valuable to people with programming experience. It gave me a greater appreciation for solving complicated problems in elegant ways. And perhaps ambition to solve other more practical but still complex problems in similarly elegant ways.

I would say yes. I read it when I was already an experienced programmer and I still found it worth it. Scheme is one extreme in terms of styles of programming languages, and it allows the authors to present a certain way of thinking about programming that was still new to me that is natural in Scheme.

I’d personally say especially so. I’m guessing those taking it as freshman are missing out on 75% of the good stuff.

It’s free online. And YouTube has lectures from the authors- presented in all their early 80’s glory.

Yes. But instead of taking my word for it why don’t you just start reading it and decide for yourself?

  • Do you really need this explained? It's a 600 page technical book and people have a limited amount of time to sort through everything that exists.

    • Have you never been to a book store?

      You don't have to read every word of a book to understand if it's interesting to you. I purchased a bunch of technical books the other day that I had never heard of based on opening them up, reading a bit of the intro and flipping through the examples.

      Relatively few of my favorite books have come through recommendations compared to those that I have come across through serendipitous discovery.

      For anyone who has no time to browse books, then most of the best books in existence would be of little interest to that person.

    • > It's a 600 page technical book

      > why don’t you just start reading it and decide for yourself?

      A journey of a thousand miles....

    • this book is at the top of the list of near every list of best programming books of all time. its worth reading. is it an easy read? no. its sort of like the Illiad. Not an easy read. But worth it for anyone who wants to be considered well read.

    • > It's a 600 page technical book

      You do understand that you don't have to read an entire book before forming an opinion, right?

      > sort through everything that exists

      "Book that has been considered a classic for forty years and was used as the intro text at MIT for decades" is a long, long way from "everything that exists".

      9 replies →

No. If you want a deeper understanding of programming, write your own static analysis / theorem prover.