[HN Gopher] SICP: The only computer science book worth reading t...
       ___________________________________________________________________
        
       SICP: The only computer science book worth reading twice? (2010)
        
       Author : pieterr
       Score  : 139 points
       Date   : 2024-11-16 17:23 UTC (5 hours ago)
        
 (HTM) web link (simondobson.org)
 (TXT) w3m dump (simondobson.org)
        
       | jph wrote:
       | SICP is available for free:
       | https://web.mit.edu/6.001/6.037/sicp.pdf
       | 
       | If you want to get it elsewhere, the full info is: Structure and
       | interpretation of computer programs by Hal Abelson and Jerry
       | Sussman (MIT Press. 1984. ISBN 0-262-01077-1).
        
       | neilv wrote:
       | The article has a broken link for the free copy:
       | 
       | https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
       | 
       | https://web.mit.edu/6.001/6.037/sicp.pdf
       | 
       | I hadn't seen a blessed PDF version until today. Circa 2001, only
       | the HTML version was freely available, and someone converted it
       | to TeXinfo: https://www.neilvandyke.org/sicp-texi/
       | 
       | If anyone wants to work through SICP today, you can run the code
       | in MIT Scheme, or in DrRacket:
       | https://www.neilvandyke.org/racket/sicp/
        
         | xdavidliu wrote:
         | one thing to note is that the second chapter's "picture
         | language" is not supported in MIT Scheme in 2024. There used to
         | be a package but it's like 2 decades out of maintenance. In Dr.
         | Racket however, there is a package specifically for working
         | through those problems.
        
         | owl_vision wrote:
         | Dr Racket has SICP and HTDP as a teaching pack.
        
         | jgon wrote:
         | The texinfo version was I believe the source for the really
         | nice HTML5 version if you want to read it in a browser, but
         | with nice formatting that the MIT original version:
         | https://sarabander.github.io/sicp/
        
         | kkylin wrote:
         | For anyone wishing to try: the maintainers of MIT Scheme no
         | longer provide a .dmg but you can download and build the x86_64
         | version of MIT Scheme. The current release (v12.1) works on a
         | Mac running Sequoia with Intel CPU or on Apple silicon via
         | Rosetta. But the native code compiler (not necessary for SICP
         | AFAIK) is a little broken. (Anecdotally it worked on macOS
         | prior to Monterey, so maybe an Apple-supplied dependency
         | changed. Haven't tracked down the issue.)
         | 
         | All of that is to say: if you do not need MIT Scheme and don't
         | want to fuss with compiling it, then Racket might be a better
         | way to go.
        
       | agumonkey wrote:
       | My second reading made me dig the footnotes and references, and
       | there's a big world of beauty out there too. IIRC there's a paper
       | where Sussman and some team made a custom design programmable
       | processor to compute celestial bodies properties (trajectories).
       | Mind bending as usual.
        
       | jasonpeacock wrote:
       | Original version: https://mitp-content-
       | server.mit.edu/books/content/sectbyfn/b...
       | 
       | Javascript version: https://sourceacademy.org/sicpjs/index
        
         | ElD0C wrote:
         | And the Python version: http://www.composingprograms.com/
        
           | xdavidliu wrote:
           | this is not the Python version of SICP. It's a different book
           | inspired by SICP. There's no "picture language" in chapter 2,
           | and there's no "metacircular evaluator" and "register
           | machine" in chapter 5.
        
       | munchler wrote:
       | > The computer revolution is a revolution in the way we think and
       | in the way we express what we think. The essence of this change
       | is the emergence of what might best be called procedural
       | epistemology -- the study of the structure of knowledge from an
       | imperative point of view, as opposed to the more declarative
       | point of view taken by classical mathematical subjects
       | 
       | Ironic, given the increasing use of functional programming in
       | domains where old-fashioned imperative/OO programming used to
       | reign alone.
        
         | namaria wrote:
         | I think in the context of the book 'procedural epistemology'
         | encompasses all programming, not just what you'd call
         | procedural programming.
        
           | munchler wrote:
           | Hmm, I don't think so. Functional programming is definitely
           | based on the "declarative point of view taken by classical
           | mathematical subjects".
        
             | namaria wrote:
             | I disagree since the book is using a functional programming
             | language to advance the idea that CS is about procedural
             | epistemology as opposed to the declarative stance of maths.
             | 
             | The idea that a 'procedural programming paradigm' exists in
             | contrast with a 'functional programming paradigm' is
             | blogspeak imho.
        
       | abeppu wrote:
       | > In fact, I'd go further and say that it's the only computer
       | science book of that age that I'd happily and usefully read again
       | without it being just for historical interest: the content has
       | barely aged at all. That's not all that unusual for mathematics
       | books, but it's almost unheard of in computer science, where the
       | ideas move so quickly and where much of what's written about is
       | ephemeral rather than foundational.
       | 
       | I recall that when MIT stopped teaching with SICP, one of the
       | main claims was that programming now is often not about thinking
       | abstractions through from first principles, and creating some
       | isolated gem of composing definitions. Instead, we interact with
       | and rely on a rich ecosystem of libraries and tools which often
       | have individual quirks and discordant assumptions, and
       | engineering then takes on a flavor of discovering and exploring
       | the properties and limitations of those technologies.
       | 
       | I think now, (some) people also are at the point of not even
       | directly learning about the limitations and capability of each
       | tool in their toolbox, but leaning heavily on generative tools to
       | suggest low-level tactics. I think this will lead to an even
       | messier future, where library code which works on (possibly
       | generated) unit tests will bear some fragile assumption which was
       | never even realized in the head of the engineer that prompted for
       | it, and will not only fail but will be incorporated in training
       | data and generated in the future.
        
         | FredPret wrote:
         | I think just like traditional engineers have to learn physics,
         | computer people should learn these fundamentals for exactly the
         | reason you outline.
         | 
         | Then, when you hit the job market, you learn the ecosystem of
         | what other engineers have built and you work in that context.
         | 
         | In this way, you can eventually reach extreme productivity.
         | Just look at humanity's GDP over the last 200 years.
        
         | chongli wrote:
         | _I recall that when MIT stopped teaching with SICP, one of the
         | main claims was that programming now is often not about
         | thinking abstractions through from first principles, and
         | creating some isolated gem of composing definitions._
         | 
         | Which is a category mistake that they actually address in the
         | lectures. SICP is not a programming course, it's a computer
         | science course. Computer science is not about computers, let
         | alone programming, just as geometry is not about surveying
         | instruments and astronomy is not about telescopes.
         | 
         | When they stopped teaching SICP -- in response to the pressure
         | to teach more modern tools -- they abandoned their scientific
         | principles to satisfy commercial concerns. They stopped
         | teaching computer science and became a vocational school for
         | the tech industry.
        
           | PittleyDunkin wrote:
           | > SICP is not a programming course, it's a computer science
           | course.
           | 
           | I don't see what you mean by this at all. Furthermore this
           | doesn't strike me as a useful distinction when a) it doesn't
           | cover most topics labeled by consensus as "computer science"
           | and b) it very clearly does teach a great deal about
           | programming.
           | 
           | Why not say it teaches computer science and programming
           | skills? Why do these have to be exclusive? There's obviously
           | a great deal of overlap in general.
        
           | imglorp wrote:
           | The quote was about "programming by poking" which I take as
           | highly relevant to actual distributed software. It meant (1)
           | systems are more built by integrating many components, and
           | (2) for many reasons, the components are not understood by
           | the integrator and (3) they must resort to experimentation to
           | validate how things actually work.
           | 
           | Unless you have a TLA+ model of all your components and how
           | they interact, I would argue you don't understand your
           | distributed system either, for all inputs.
           | 
           | https://web.archive.org/web/20160505011527/http://www.poster.
           | ..
        
           | medo-bear wrote:
           | > They stopped teaching computer science and became a
           | vocational school for the tech industry.
           | 
           | Sheldon always said that MIT is a trade school
        
         | chambers wrote:
         | I've witnessed how abandoning first principles undermines the
         | evolution of a system. If our mental model of a system is not
         | formalized into first principles (i.e. a high-level
         | specification), then successive generations of engineers will
         | have to re-learn those principles through trial-and-error.
         | They'll introduce mutations and dependencies between the
         | mutations-- and when they leave, the next generation of
         | maintainers will repeat the process. Generations of mutations
         | eventually create a brittle, calcified creature of a system
         | which people fear to touch with a ten foot poll.
         | 
         | I imagine people who were taught SICP would be more respectful,
         | if not inclined, towards a formal articulation of a system's
         | principles.
         | 
         | This philosophy is described in depth in the original 1985
         | article https://gwern.net/doc/cs/algorithm/1985-naur.pdf and in
         | more accessible language in
         | https://www.baldurbjarnason.com/2022/theory-building/. You can
         | also observe engineers opposing/misunderstanding the need for
         | specification in https://news.ycombinator.com/item?id=42114874
        
       | alabhyajindal wrote:
       | I really wanted to like SICP but Lisp throws me off. I love
       | Haskell and Standard ML however! Did others have a similar
       | experience? Might be interesting to read a book similar in spirit
       | to SICP but using a different language as a vehicle (No, I don't
       | want to do SICP in JavaScript).
        
         | horeszko wrote:
         | I think there is a Python version if that floats your boat
        
         | rustybolt wrote:
         | I really wanted to like SICP and I probably would have if I
         | read it 15 years ago. I started reading it last month and I
         | found it to be too broad. It covers too much interesting
         | mathematical principles and then jumps to the next one right
         | when it starts to get interesting. In other words, it's too
         | shallow.
         | 
         | It probably doesn't help that I've seen many courses/documents
         | that are (in hindsight) derivatives from SICP, so I have the
         | nagging thought "not this _again_ " when a topic is introduced
         | in SICP.
        
           | cess11 wrote:
           | It's written for engineers, they already know the math, but
           | they don't know how to design and implement virtual machines,
           | objects, compilers and whatnot that it shows how to do.
        
         | hluska wrote:
         | I can identify with that - Lisp throws me off (because I'm not
         | smart enough). But I ended up forcing myself to work through it
         | and learned a tremendous amount because I'm not smart enough to
         | work with a lisp. It felt like I spent so much time just
         | reading through the code that I ended up learning more than I
         | would in a language I'm comfortable with.
         | 
         | There is a Python version of SICP. I have never worked through
         | it or even given it more than a cursory scan so this is not an
         | endorsement more just a link to prove it exists:
         | 
         | https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
        
         | linguae wrote:
         | You might be interested in a 1987 article titled "A Critique of
         | Abelson and Sussman or Why Calculating is Better than Scheming"
         | (https://dl.acm.org/doi/10.1145/24697.24706), where the author
         | advocates the use of KRC or Miranda as alternatives to Scheme.
         | I don't know much about KRC, but Miranda is a statically-typed
         | functional programming language that influenced Haskell.
        
       | owl_vision wrote:
       | i'd also recommend "Concrete Abstractions: An Introduction to
       | Computer Science using Scheme" by Max Hailperin, Barbara Keiser,
       | Karl Knight.
       | 
       | http://www.gustavus.edu/+max/concrete-abstractions.html
        
         | shrubble wrote:
         | I concur, I am learning from it now...
        
       | whobre wrote:
       | I don't quite get the cult status of SICP. I read it and it's a
       | fine beginner programming book, but nothing more.
        
         | jgon wrote:
         | Just so we're clear, this is a "beginner programming book" that
         | has you create a scheme interpreter, then a register machine
         | simulator, then a compiler out of your interpreter that will
         | then have its compiled code run on the register machine
         | simulator, by the final chapter.
         | 
         | This is probably the part where you'd step up and post a link
         | to your repo with solutions to the exercises to back up your
         | talk, but generally I only see this sort of casual dismissal
         | from people who haven't actually worked through the book.
        
           | dbtc wrote:
           | I commend your righteous indignation. Made me smile. Flame
           | on!
        
         | liontwist wrote:
         | I don't understand this comment. If you master the material you
         | know more than 90% of engineers in the field.
        
           | aleph_minus_one wrote:
           | > If you master the material you know more than 90% of
           | engineers in the field.
           | 
           | Telling someone that he/she is smarter than 90% of the people
           | is _not_ a praise. :-)
        
             | bdangubic wrote:
             | amen... just look at 90% of people at the DMV :-)
        
       | Upvoter33 wrote:
       | There are some great books, and every book means something
       | different to each person who reads it.
       | 
       | K&R influenced a generation of programmers.
       | 
       | Hennessy and Patterson influence a generation of architects.
       | 
       | etc. etc.
       | 
       | It's not just SICP.
       | 
       | But the greater point: a book can be meaningful, and we can
       | always use more good ones.
        
       | myleshenderson wrote:
       | I've been programming for 25 years and have owned the book for
       | about 10 years. I just recently started to work through it and
       | started with Dr. Racket.
       | 
       | There are things to love about Dr. Racket: hovering over a
       | variable and visually seeing its connections to other places in
       | the code is really cool. But ultimately I was a bit frustrated
       | that it wasn't vs code.
       | 
       | So I stood up an configuration that let me use vs code (cursor
       | actually) to work through the exercises. The LLM integration into
       | cursor is cool as you can give it your code and whatever
       | narrative you wrote and ask for feedback.
       | 
       | I am a tiny way through the exercises but having turned my code,
       | the responses that I write, and the feedback that I get from the
       | LLM into a static site.
       | 
       | It's been a fun way to spend a little time. For sure, I'm not
       | getting the full benefit of working through SICP just with my own
       | thoughts (without the aid of an LLM), but it's neat to see how
       | you can integrate an LLM into the exercise.
        
       | docandrew wrote:
       | I'm working through it now, for someone with a computer
       | engineering, EE or math background I think this is a great
       | resource to get started with CS fundamentals.
        
       | spit2wind wrote:
       | Programming Pearls is another book that rereads well. It's also
       | short, too, which makes rereading it possible.
        
       | scop wrote:
       | I'm slowly making my way through it a second time and thoroughly
       | enjoying it. The first time through it seemed quite abstract,
       | albeit only because of my completely lack of real world
       | programming. The second time through it a revelation as I now
       | have a strong base of experience through which to understand it
       | (experience which it also, informs!).
       | 
       | I am using Elixir's Livebook to take notes and complete the
       | exercises. It is very helpful to have a live notebook tool while
       | reading it!
        
       | __turbobrew__ wrote:
       | It's interesting, SICP and other many other "classic" texts talk
       | about designing programs, but these days I think the much more
       | important skill is designing systems.
       | 
       | I don't know if distributed systems is consider part of "Computer
       | Science" but it is a much more common problem that I see needs to
       | be solved.
       | 
       | I try to write systems in the simplest way possible and then use
       | observability tools to figure out where the design is deficient
       | and then maybe I will pull out a data structure or some other
       | "computer sciency" thing to solve that problem. It turns out that
       | big O notation and runtime complexity doesn't matter the majority
       | of the time and you can solve most problems with arrays and fast
       | CPUs. And even when you have runtime problems you should profile
       | the program to find the hot spots.
       | 
       | What computer science doesn't teach you is how memory caching
       | works in CPUs. Your fancy graph algorithm may have good runtime
       | complexity but it completely hoses the CPU cache and you may have
       | been able to go faster with an array with good cache usage.
       | 
       | The much more common problems I have is how to deal with fault
       | tolerance, correctness in distributed locks and queues, and
       | system scalability.
       | 
       | Maybe I am just biased because I have a computer/electrical
       | engineering background.
        
         | llm_trw wrote:
         | You're in luck. Part 5 of the book is about building a virtual
         | machine to run lisp simalated at the register lelvel:
         | https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
         | 
         | Writing a network between n such machines is left as an
         | exercise to the reader.
        
         | KerrAvon wrote:
         | If you knew how to design programs you could run it all on a
         | single box and wouldn't have to design "systems."
         | 
         | I'm being slightly facetious, but only slightly. If you really
         | think everything is solvable with arrays, you are not going to
         | scale well and of course you're going to need to throw a lot
         | more hardware at the problem.
        
         | tkiolp4 wrote:
         | I find books like SICP interesting and not very useful. I love
         | reading them because I like this stuff, but I don't get to
         | apply their teachings in real world software. It's a problem
         | because naturally I want to spend my time reading these kind of
         | books, but if I do that I would be jobless. I need to divide my
         | time between reading pearls like SICP and boring
         | Kafka/Postgres/Golang/K8s/AWS documentation.
        
           | lovecg wrote:
           | I don't find them useful in the sense of directly applying
           | practical techniques in my day job, but I consider them
           | somewhat necessary background reading to get into the right
           | state of mind. You can very quickly tell when someone never
           | acquired any academic knowledge in this area (or never played
           | with functional languages or similar pastimes) - you can't
           | explain to those people why modifying global variables all
           | over the place in a large program is a bad idea and other
           | things like that. They just nod along skeptically and then
           | somehow keep stumbling into the same kind of mess over and
           | over.
        
         | soegaard wrote:
         | Have you seen
         | 
         | "Software Design for Flexibility: How to Avoid Programming
         | Yourself into a Corner" by Chris Hanson and Gerald Jay Sussman
         | 
         | It's from 2021.
        
           | pipes wrote:
           | I hadn't, that looks excellent.
        
         | pipes wrote:
         | True. However I find that most junior and even experienced
         | programmers struggle with tactical level coding. I'm really
         | suffering with this right now because the small component I'm
         | tasked with making a small change to is annoyingly stateful and
         | deals with 2 abstractions at once. (It processes files and uses
         | the file system and database to store it's state). I'm shocked
         | how badly it has been thought out. I've spent days trying to
         | avoid doing what has gone before, bits bolted on that make it
         | even more difficult to understand. It really seems that pull
         | request culture has just led to any old crap being approved
         | because no one has the band width to think deeply about the
         | actual code. Bring back in person code reviews !
        
         | ozim wrote:
         | Well CS and software dev in trenches moved a bit.
         | 
         | There are still jobs where people write frameworks, database
         | engines or version control tools. Those jobs require heavy CS
         | and algorithms, data structures day to day. But there are less
         | of those jobs nowadays as no one is implementing db engine for
         | their app they just use Postgres.
         | 
         | Other jobs that is vast majority is dealing with implementing
         | business logic. Using database with understanding how it works
         | in details is of course going to produce better outcomes. Yet
         | one still can produce great amount of working software without
         | knowing how indexes are stored on disk.
         | 
         | Also a lot of CS graduates fell into a trap where they think
         | their job is to write a framework - where in reality they
         | should just use frameworks and implement business logic- while
         | using CS background to fully understand frameworks already
         | existing.
        
       | taeric wrote:
       | Curious to hear folks opinion on the newer Software Design for
       | Flexibility: How to Avoid Programming Yourself into a Corner
       | (https://www.amazon.com/gp/aw/d/0262045494)?
        
         | golly_ned wrote:
         | It's a much, much denser successor to sicp. I hadn't succeeded
         | in self-studying with it despite strong lisp/scheme chops and
         | strong affinity for sicp.
        
       | MikeTaylor wrote:
       | Just dropping in to say that The Elements of Programming Style is
       | worth reading three times -- and I have read it many more times
       | than that, and benefitted from it. Here's my review (from 2010)
       | if you're interested:
       | https://reprog.wordpress.com/2010/03/06/programming-books-pa...
        
       | debo_ wrote:
       | SICP helped me understand early on that there were many models of
       | programming, even though I'd learned a limited number in my
       | undergraduate. It was one of the books that helped me feel
       | equipped to read the docs of any language, library or framework
       | and have some notion of how to orient myself.
        
       | anon115 wrote:
       | its watever
        
       | jnordwick wrote:
       | I took cs61a at Berkeley as my very first computer science class
       | I couldn't program I never tried to so scheme was my first
       | language.
       | 
       | My ta told me that everybody should take the class twice when you
       | first come in and when you're graduating.
       | 
       | When you first take it especially if you know other languages
       | like C at the time you don't get the full depth of the problems
       | you're given a great introduction and you think you understand
       | everything but you don't realize the depth of complexity. Message
       | passing the metacircular evaluator, continuations as the basis of
       | all flow control, etc
       | 
       | You think they are neat tricks that you understand the curriculum
       | because you can do the homework you don't understand how those
       | neat tricks are really the basis of everything else you'll do.
       | 
       | When you're graduating you've had time to go through all your
       | classes you realize just how foundation was principles are and
       | you get so much more out of the book.
       | 
       | Well I didn't take the class a second time I need help grade and
       | TA for a couple semesters.
       | 
       | I work as a quant developer and in trading now and even though my
       | field has nothing to do with that I still think it's the basis of
       | me as a developer.
        
         | golly_ned wrote:
         | My same experience. For much of the rest of the cs curriculum I
         | felt like we had already to some extent covered the main ideas
         | in 61a with sicp.
        
       | globular-toast wrote:
       | My favourite part of SICP and something that has stuck with me
       | for years is the idea of "wishful programming". That is where you
       | build something top-down by simply wishing you had the lower-
       | level routines. Then, of course, you actually go and build those
       | lower-level routines until you reach the bottom. I find this way
       | of thinking works really well with test-driven development. Write
       | a test against functionality you _wish_ you had, then go and
       | fulfill that wish. Most developers seem to build stuff bottom-up
       | and then end up with something that isn 't really what anyone
       | wished for.
        
       ___________________________________________________________________
       (page generated 2024-11-16 23:00 UTC)