Well, I graduated from a film school. I have minimal knowledge of math and engineering (I dropped out of engineering after my second year). I still find a ton of value in SICP.
I think it is completely OK to recommend SICP. It is just that it is not an easy book; it requires effort. That effort required varies from reader to reader, and it may require you to go fetch another book and study for a while before coming back. It is OK to be challenged by a good book. A similar thing happens with TAoCP as well, heck, that book set was so above my pay grade that sometimes I had to go wash my face with cold water and think.
Now, what I think is important is to know when to recommend SICP or not. Someone says they want to learn programming basics fast because they’re in some bootcamp and need a bit of background to move on, then you’d be better recommending something more suitable.
As for alternatives for SICP for those who don’t want to dive too deep into math and engineering, I really enjoy How To Design Programs which I’ve seen being described as “SICP but for humanities”.
As for alternatives for SICP for those who don’t want to dive too deep into math and engineering, I really enjoy How To Design Programs which I’ve seen being described as “SICP but for humanities”.
The only trouble with SICP is that it was written for MIT students, all of whom love science and are quite comfortable with formal mathematics. Also, most of the students who use SICP at MIT have already learned to program computers before they begin. As a result, many other schools have found the book too challenging for a beginning course. We believe that everyone who is seriously interested in computer science must read SICP eventually. Our book is a prequel; it’s meant to teach you what you need to know in order to read that book successfully. Generally speaking, our primary goal in Parts I-V has been preparation for SICP, while the focus of Part VI is to connect the course with the kinds of programming used in “real world” application programs like spreadsheets and databases. (These are the last example and the last project in the book.)
Some of Bryan Harvey’s lectures on Scheme are available on YouTube. There used to be more, as I recall, but some are private now. A shame—I remember enjoying his lectures a lot.
I have to say comments like these and the GP are reassuring. I’m working through it now as an experienced programmer trying to formalize my foundational computer science stuff and just having a hard time digging in on the start. Not that I’m uncomfortable with recursion or Big O stuff, it’s just very information dense and hard to “just read” while keeping all the moving parts in your head space.
He also wrote a series of books called “Teaching Computer Science LOGO Style” or similar (He’s the author of USCB Logo).
I really enjoyed those books as I’m an avid LOGO fan. I’m still kinda sad that dynaturtles are effectively going to die because the only implementation still even remotely extant is LCSI’s Microworlds.
I’ve been wanting to learn Racket for a while. It’s next on my list after Javascript. Sadly it takes me years to truly grok a programming language to any level of real mastery :)
Bonus points: Even if you could care less about Scheme/LISP you learn recursion!
After struggling hard at trying to understand recursion in my freshman year with Concurrent Clean (the teachers pet language, a bit Haskell-like), this book made everything click. It also made me fall in love with Scheme because of its simplicity and functional high level approach. After the nightmare of complexity and weird, obscure tooling of Clean, this was such a breath of fresh air.
I don’t get The Little Schemer. There doesn’t seem to be a point to it, something it’s working towards. I feel like I should be enlightened in some way in the end, but it just seemed to end without doing anything special. What am I missing?
I like this approach. Recommend SICP, but make it SUPER clear that it’s a difficult book. It’s OK to get to a point where you say “This is over my head” and for those who are up for it, there’s an additional challenge there of “OK now take the next step! Learn what you need in order to understand”.
Not everyone has the time or the patience for that, but as long as we’re 1000% clear in our recommendations, I think recommending SICP is just fine.
However IMO it is THE WORST to recommend SICP to people who are looking for a quick and easy way to learn to program or learn the rudiments of computer science.
I quite enjoyed reading through SICP a few years ago and don’t have a very strong grasp of math or physics (though I am a big fan of Lisp). While it’s certainly not entry-level, it’s got some great code examples that aren’t the boring and contrived crap examples that fill most textbooks. I agree that it’s probably a bad idea to hand it to someone who’s never programmed before, but usually it’s recommended to relatively experienced programmers with some awareness of Lisp, who are interested in books that change the way you approach programming (it certainly changed mine). It’s a bit of a self-selecting audience, and I’ve never seen it mentioned outside of HN or lobste.rs-like communities.
It’s not the type of book that really helps you land a job, but if you want to get a deeper understanding how Lisp programmers think about problems, it’s one of the best (along with The Little Schemer). It’s not considered a classic just because of the smug lisp weenies ;)
If you can’t continue or finish a book, you get nothing from it.
I wholeheartedly disagree. Technical books especially are rarely written to be read from cover to cover. Find the useful parts of the book that interest you and skip the rest.
That’s too bad, it wasn’t my intention to be negative. Though I can imagine my guesses could be seen as cynical.
I wholeheartedly disagree. Technical books especially are rarely written to be read from cover to cover. Find the useful parts of the book that interest you and skip the rest.
“continue” in the quote you mentioned is my weasel word.
It is my goal to read through SICP eventually. I keep trying every few years.
That doesn’t change the purpose the book was written for, which was my point - a companion textbook for a course is something meant to be worked through, typically.
Might it not depend on what you’re looking to get out of the experience?
SICP offers a sincere challenge for many people, and there’s certainly a GOOD argument to be made that for those who choose to rise to that challenge the payback will be substantial.
However I often see SICP recommended to people who just want to learn how to program, or gain a grasp of basic/high level CS concepts. It strikes me that SICP may not be the best way to guide people into the pit of success :)
I don’t recommend every programmer read SICP, but for me personally it was one of the most insight-dense books I’ve ever read. If someone asks me for my ten favorite books on programming (or even my twenty favorite books on any topic), it’s gonna be on the list.
I think the author is wrong that it’s poorly written, because you can’t evaluate well-writtenness without considering the intended purpose. e.g. the best and most-recommended advanced math books are typically quite hard to read even for a math student, and downright unpleasant for those unfamiliar with what one might call “the effective way to learn math”. They wouldn’t be improved by making them appear “well-edited”.
That said, I wouldn’t recommend Rudin to someone looking for “a good math book”. And I don’t think programmers should read SICP unless they’re interested in a particular kind of engagement with the theory and practice of building software.
I think the author is wrong that it’s poorly written, because you can’t evaluate well-writtenness without considering the intended purpose. e.g. the best and most-recommended advanced math books are typically quite hard to read even for a math student, and downright unpleasant for those unfamiliar with what one might call “the effective way to learn math”. They wouldn’t be improved by making them appear “well-edited”.
They’d be improved quite a bit, IMO. Writing well, teaching well, and doing math well are three extremely different skills. I’ve seen people who are good at all three explain advanced math topics, and they’re miles ahead of even highly-recommended advanced math books. But they had to spend a lot of time actively improving their teaching and writing, which isn’t something that’s as incentivized by academia as doing math well is.
I get it. I got mired down in SICP and never finished, but for me The Little LISPer was that kind of insightful and dare I say even inspiring experience.
People are different, brains are different, and we all bring very different things to the table when it comes to books.
Some people have the capacity to read and love challenging books. If that is you, you are not the audience of this post. I don’t think you’d disagree that most people are not like you.
Very important context for this discussion! It’s okay to like challenging books, but you have to accept that there are many good books that aren’t nearly as challenging as SICP. Recommend those first!
And a final guess is that books that are worth reading might not always be well-written. This is the most unfortunate guess of all. I don’t disagree that sometimes it is necessary to learn from poorly-written books. But I begrudge this because of how much joy I get from reading well-written books, fiction and non-fiction
This is also likely the most common reason. Writing a good book is really, really hard, and writing a good book about challenging content is even harder. So there are a lot more books with good content than well-written books with good content.
I have a feeling my guesses apply to recommendations in general: music, art, film, musicals, restaurants, etc.
Here’s a fourth guess for you: “must-read” books are also well-known books. My personal favorite book on software is Data and Reality, but most people haven’t heard of it, while they have heard of SICP.
My personal favorite book on software is Data and Reality
A beautiful book. It transcends the technical genre into something like art or philosophy. In many ways – the style, the larger themes it keeps circling about from different directions – it reminds me of Philosophical Investigations.
nearly as challenging as SICP. Recommend those first!
Totally fair. SICP is just one that came to mind. My intent in the post was to talk about the general challenge of recommendations not solely to focus on SICP.
“must-read” books are also well-known books.
I think about the word “classic” a lot. “That book is a classic.” Well I’ve tried to read a number of these classics and I often don’t know what to make of them. “Classic” and “well-written” are also separate ideas.
I’ll still keep trying to get better at reading. And improve my stamina.
I actually think that SICP is one of the best books, and a stellar recommendation. If you want to take it at a slower pace you can follow along with the original video lectures. This it what I did and it was a lot of fun even though I didn’t finish it on my first reading. The book/course teaches very important concepts that are fundamental to programming and computing and it provides a value that I do not see in other programming textbooks.
I think the issue with this thought process (and the parent post) is that it assumes that everyone will have the same experience with a book. I’m not sure where that idea would come from though - would you expect to be able to understand a math textbook without effort?
Basically this boils down to “I had a bad experience with this book, so no one should recommend it.”
Edit: another way to think about this. Personally, I get nothing of out of “instructional” videos. I can’t focus, the tempo is all wrong, and watched content just has no retention for me. Does that mean that no one should suggest videos as a learning resource? Of course not! Many people love learning from those videos and get a lot out of that style of content. The efficacy it has for me doesn’t have any bearing on how effective it will be for someone else.
…would you expect to be able to understand a math textbook without effort?
then
Personally, I get nothing of out of “instructional” videos.
Maybe you need to try harder, did you really expect to get anything out of the videos without effort?
Seriously, though, why is failure to get much out of Famous CS Book chalked up to a lack of effort (it’s not just you, other threads in this discussion contain the same accusation / assumption), but failure to learn from a YouTube video is just a difference in how you learn versus other people?
I think you misread or misunderstood what I wrote - it’s not different, and that was my point. I don’t tell other people they shouldn’t try to learn from videos, because I know that they are valuable resources for the people who learn well from them. I recognize that’s something valuable to others even though it isn’t valuable to me.
Now flip it around. Just because someone doesn’t enjoy/can’t understand/can’t internalize information from a certain type of book doesn’t mean that the well-regarded book shouldn’t be recommended. It means that individual should probably not consider books like that in the future.
Then why the thing about effort? Effort has nothing to do with it if we’re talking about different learning styles. And yet, I repeatedly see people accuse others of low effort because they didn’t get anything from a famous CS or math text.
I think the issue with this thought process (and the parent post) is that it assumes that everyone will have the same experience with a book. I’m not sure where that idea would come from though - would you expect to be able to understand a math textbook without effort?
I agree with the first sentence, but the second half of the second sentence (after the hyphen) just seems totally unrelated. You’re accusing the person of not putting in enough effort, yet you claim that it’s about learning styles.
Just going to pop in and point out that there is no evidence for learning styles being a thing. Yes, engaging multiple sensory modalities leads to better retention. No, different individuals don’t do significantly differently with particular modalities in the absence of major issues (blind people obviously can use visual, etc.).
I think you’re picking on words and ascribing your own slant/opinions to them. This will probably be the last response that I’m going to write in this chain.
I’m not ascribing any virtue to either learning style - that’s something you appear to be doing. Who’s to say that “effort” isn’t an important part of the different learning style? Maybe, for some people, the effort of reading the book is what allows the information to sink in, while for others it’s an impediment to their learning?
For the record, I can’t get through most math papers due to the effort I’d need to put in to understand their notation, and I have a strong foundation in math. I usually read others’ summaries and then augment my understanding with the paper as a reference. I don’t think this makes me “worse” - but I do know that I could do it myself if I had the patience for it (because I’ve done it before).
The question was “Would you expect to be able to understand a math textbook without effort?”. I know that I cannot honestly answer no to that question.
The best compiler book I ever read was Per Hansen’s On Pascal Compilers; Wirth of course also writes broadly and well on compilers.
Something that the Dragon Book covers that a lot of others don’t though is a broad view of parsing theory. Many books tend to discuss recursive descent parsing and call it a day. If they cover other parsing mechanisms, it’s often only a brief mention.
Indeed, my complaint with the dragon book is that it’s mostly a book about parsers, not compilers which is not what I’d signed up for when I picked it up. It does touch on other topics, but very superficially, and I felt kinda cheated.
Also, even seen as a good book on parsing, it needs an update – the 2nd edition mentions neither parser combinators nor PEGs/packrat parsing, which are important, well-known techniques these days, but were still very new when the 2nd edition was published (2006).
I feel the same about ‘the dragon book’. it’s a terrible book.
The dragon book was the text for my undergraduate compilers course. It
was heavy on theory and light on practice. I think it makes a poor
undergrad textbook, but that doesn’t make it a poor book in general. It
has its place; I’m not going to slam it. That place may not be in an
undergrad course though.
As for SICP, I’ve read about 2/3 of it. This was extracurricular
reading for me when I was an undergrad. I should really pick it up
again and finish it. I worked my way through it, trying things in my
Scheme interpreter as I went, and had quite a lot of “aha” moments. I’m
not great at math and have no physics background whatsoever. In fact I
started out majoring in philosophy.
It’s a reference book for compiler algorithms, it’s not really an intro guide. I’ve very rarely cracked my copy open, but I usually know what I’m looking for before I’ve opened it.
Generally, I find reference books less useful since google (or DDG :)) is usually gets me the answer I need faster.
My problem with the dragon book was that I tried to read it using a horrible translation into Brazilian Portuguese. Whoever translated it had no idea about computing jargon and used wrong Portuguese terms in the translation. Things like string became the Portuguese word for yarn, and so on, it was horrible. So, it is not that the dragon book has problems, but my experience with it sucked and it kinda spoiled me against it. That’s when I went looking for other books and found SICP and others.
People do not seem to understand cognitive load & the impacts of overwhelming a developer. Most people i know (including myself for most of my life) “tough” it out, but the effects don’t disappear, & those who fail at a particular task (like myself and many others ive seen) often dont come back for more, /or develop an inferiority complex.
It’s been extremely frustrating to learn in the past year that it wasn’t just me, but how we are taught & teach cs. As I’ve worked on myself as a person its gotten easier to read dense books, but I do not feel smarter. Instead feel validated in my frustration at the level of mind games you have to go through to understand these things as the author puts them.
Teaching is a skill, it is not easy but it should be practiced. It should not be aimed for the smartest kid the room, much closer to the reverse. This is a good thing.
I find that there is a cultural divide between the Americas and the old continent when it comes to educational material, and I may even dare to extend that to non-fiction. In France, for instance, you always start with the formal theory and may only see any examples when doing exercises, while most often in the new world you will see practical examples first as a way to present the theory. I find that SICP is one of the rare examples of books that strikes a balance between both styles, and manages to keep fundamental concepts and theory clearly articulated and presented through a crafted sequence of exercises. Around me, I see a dire need for a more formal understanding of fundamental concepts. Too many people are stuck at the level of terminologies specific to a programming language or worse, a library, and are unable to identify or articulate the fundamental mechanisms at play. This creates a growing divide where new generations of developers are losing their literacy and become technicians, instead of engineers or scientists.
Every time I’ve tried to start SICP so far I’ve given up. I usually fail to complete books I start (I did finish The Little Schemer though), so I wouldn’t pin that entirely on SICP, but I do resonant with the comments here on its style and prose; to me that aspect of it is particularly painful. A book that starts with a thesis that programming is really no more than a tool of expressing thought or something is likely to lose me, for better or for worse. That’s just me though.
I can also relate this to a microelectronics textbook I had in college, Sedra and Smith. It has good reviews and approving blurbs from other EE professors, but when I sat down to read a section that covered whatever was in the latest homework, I could barely parse it. It may have been full of correct statements, but it just did not feel like it was written in a way for someone who has never understood the material before to understand. I found that a lot of popular undergrad textbooks are like this.
If you can’t continue or finish a book, you get nothing from it.
oh wow I don’t agree with this at all (for nonfiction). Loads of books have one or two stellar chapters that resonate for decades while the rest of the text is forgotten about, rarely discussed, or becomes superseded in due time with newer, more insightful ideas.
I own the first two editions of SICP and have read the 1st, but this happened early 90s with minimal Internet connection and less choices for material. I will buy the Javascript edition too. Last week I told a person, that reading SICP is like competing a triathlon. If you want to do it, be prepared for such, but if you want to learn, it does not have to be a triathlon. I only recommend SICP for the joy of reading SICP.
I strongly agree with the premise that it doesn’t matter how much information is in a book if you don’t read it. When recommending a book to someone, or just choosing one for myself, I try to be sensitive to that. One habit I picked up that helps is that I’m willing to skim a book if it’s not fun to read. I figure getting through it and only absorbing 20% is better than giving up and getting 0%.
And a final guess is that books that are worth reading might not always be well-written.
My experience is that this is very true, especially as you get into deeper material. The intersection of people who know some obscure difficult topic and people who can write well gets smaller and smaller the more obscure the topic is. Eventually you have to decide between reading something poorly written by someone who’s at least got the goods, an enjoyable read that misses the mark, or potentially no book at all. Given that choice, I’ve learned to grind through mediocre writing to get to the material inside.
My trick—and I’m totally serious—is to leave the book in the bathroom and not take my phone with me in there. You can get through anything if it’s in relatively short bursts and you don’t have anything better to do.
I think the problem here is as much this problematic notion of ‘developers’ is an extremely unhelpful abstraction for what we’re talking about.
Imagine that in the civil engineering world we called people who make benches and people who make bridges some equivalent catch-all term like ‘constructors’. You’d have blog posts from Chair Industry Thought Leaders saying ‘Stop Telling Constructors they need to know Calculus’ and simultaneously 18 year olds applying to do Civil Engineering at univeristy/college, in order to one-day build bridges, wouldn’t even get past the entrance exams if they didn’t know what the chain rule was (i.e. basic calculus, which SICP assumes you know as part of a motivating early example, iirc).
Constructors would be talking past each other on Maker News about how you can’t possibly design supporting structures without knowing calculus, it would be professionally negligent, buses full of school children will die etc, whilst other constructors would counter that they just sold their chain of Swing Seat shops for $100M to Lowe’s and they never once studied Calculus in all their life so stop being such elitist gatekeeping douchebags.
It’s the same with ‘developers’. Obviously you need caluclus as a pre-requisite in almost any scientific or [non-software] engineering discipline, Machine Learning, Signal Processings, computer vision, whatever it happens to be. Many people taking any form of technical degree at a research university will go on to be in one of these camps.
But there are also millions of people just making chairs and they can live happy and productive lives without having come across the chain rule, or needing to.
There is no great discrepancy here unless you insist on viewing these disparate camps as part of the same mass, and then it all breaks down.
I enjoyed this blog post, and it inspired me to update a page on website that lists the books I’ve read to indicate which ones I highly recommend - http://stratus3d.com/about/books-i-have-read/. Even though it’s been many years since I’ve read most of the books on that list it was surprisingly easy remember which ones were excellent and worth recommending.
I completely agree with “Don’t recommend books you haven’t read.” I also have some fields like probability where I learned it from a person and from papers, so I have no book to recommend. I also have fields where the book I read may be superseded by a better recommendation, but I haven’t read that, so I am hesitant to recommend anything. Networking is an example of this.
Now, SICP is not a good first book to learn how to write programs. That is true, and no one should recommend it for that anymore. There are better options as others have pointed out. But
the prose itself is so dense and archaic
This I don’t see. SICP is beautifully written. You cannot skim it, and you cannot parse it as a series of analogies and idioms. You have to directly engage with what it is saying, not what your brain wants to shape it into saying to avoid reading and engaging with every word. This is not an issue of poor writing, but an issue of insufficient literacy. The same is true of Knuth’s work. I’ve only read parts of TAoCP, but the parts I have read have all been utterly lucid. The same issue applies in non-technical fields. Escape from Rome and The Nature of Order and Sokolowski’s Introduction to Phenomenology are all beautifully written, but must be read closely. The same is true of much poetry.
If you had a hard time reading a book or it took you too long to read it (yes, this threshold is different for everyone), don’t recommend it
That’s the real intelligence signalling right there. “I had hard time reading this book, surely you can’t stomach it”.
How about recommend the book if you liked it, and explain why it’s worth the effort?
One guess is intelligence signalling. That it is human nature for a person to suggest a book in an attempt make herself look smart rather than to best assist the person asking for a suggestion.
I think there’s SOME of this but I also think we need to look at SICP in specific in the context it was originally written for.
It was written as a textbook for an introductory CS course at MIT, right? Anyone who has tried to work through one of MIT’s edX/open courseware courses online knows that it’s NOT easy, and a couple friends of mine who attended MIT gave me the key to understanding why - the course/lecture/textbook are only a part of the learning process at MIT.
Recitations - the time when you practice what was taught in the lecture and work individually with TAs to help enhance your understanding of what was presented, seem like a critical missing piece to me.
Viewing this book outside of its context, I agree entirely with the author and while I enjoyed battering my head against the SICP brick wall, I ultimately came away bloody and unsuccessful.
I wouldn’t be a programmer if not for SICP. I didn’t read much of it but the insights those few chapters I read gave me right when I was starting out (I had only tried learning a bit of Ruby from random websites) not only gave me the tools to understand a bit of what was going on but also a great fascination for CS and programming languages.
I couldn’t earnestly recommend it because I never read it all (I should fix that someday) but SICP was the book that made it all click together for me.
I was a grad student TA for intro computer science for a couple years. The professors who designed the class had a near-holy reverence for that book (perhaps due to MIT’s reputation alone).
There were some good ideas in the course. In particular, the idea that programming languages and compilers can be simple and built from first principles is really powerful. At the same time, modern software engineers can just trust that the compiler is doing what it’s supposed to, and the job is much more about figuring out how to put disparate pieces together from large preexisting components than build anything from first principles.
Meanwhile I’m not even sure that anything you teach in Introduction to Computer Science is really going to have that much value, other than helping students decide if it’s the right degree for them. And building an interpreter in Scheme is not really a realistic sampling of the field.
My university did switch to a more conventional intro course using Python a couple years after I left.
For my part… I gave a presentation at a local meetup about what we were teaching in Intro CS at the university and why. Which lead to connections that lead to me leaving grad school and getting a really good job. So it worked out!
I felt the same way about The Mythical Man-Month. It’s extremely sexist: no “engineers” or “developers”, always “men”, “man-hours”, etc. I had to put it down after 20 pages because every page was like this.
It’s got an incredible core message but desparately needs an updated 21st Century edition.
MMM in particular has another problem. Some of the advice on it is timeless, the rest is archaic. After having two it I would not recommend anyone else read it without a dump truck of salt on hand.
But it requires such a level of competence in math and physics
is this true? I know the book starts with Newton’s method of square roots, but it’s not tasking you with deriving the formula, it just asks you to implement it. And where does physics come in?
If you mean “beautiful and well-written in a strict prose sense” - then SICP is a well-written book, and I don’t
If you mean “appropriate to the domain; in this specific case, because the domain is education: teaches the student efficiently and easily” then I can see SICP as not being particularly well-written; it is, as you and others have stated, very dense, and I can easily imagine (or maybe even recommend) other books that are easier and faster to learn from.
Other commentators: the author writes “The core goal of a book recommendation is for the reader to get enjoyment or education from it.” and that’s absolutely true; SICP is an enjoyable book, but I’m not convinced that it is a particularly good book for getting education from. Education is the process of helping other learn stuff, which necessarily means that that stuff has to be made accessible, and SICP doesn’t do the best job at this.
I say this as someone who adores Lisp, and has spent the past few months carrying SICP around in my backpack.
Well, I graduated from a film school. I have minimal knowledge of math and engineering (I dropped out of engineering after my second year). I still find a ton of value in SICP.
I think it is completely OK to recommend SICP. It is just that it is not an easy book; it requires effort. That effort required varies from reader to reader, and it may require you to go fetch another book and study for a while before coming back. It is OK to be challenged by a good book. A similar thing happens with TAoCP as well, heck, that book set was so above my pay grade that sometimes I had to go wash my face with cold water and think.
Now, what I think is important is to know when to recommend SICP or not. Someone says they want to learn programming basics fast because they’re in some bootcamp and need a bit of background to move on, then you’d be better recommending something more suitable.
As for alternatives for SICP for those who don’t want to dive too deep into math and engineering, I really enjoy How To Design Programs which I’ve seen being described as “SICP but for humanities”.
A side note, but another book that can work well as a prequel (or alternative) to SICP is Simply Scheme. In fact, that’s exactly how the authors describe the book.
Some of Bryan Harvey’s lectures on Scheme are available on YouTube. There used to be more, as I recall, but some are private now. A shame—I remember enjoying his lectures a lot.
I found the first chapter or two of SICP to be uncomfortably math heavy. But my recollection is that after those, it’s relatively smooth sailing.
I have to say comments like these and the GP are reassuring. I’m working through it now as an experienced programmer trying to formalize my foundational computer science stuff and just having a hard time digging in on the start. Not that I’m uncomfortable with recursion or Big O stuff, it’s just very information dense and hard to “just read” while keeping all the moving parts in your head space.
Brian Harvey is amazing.
He also wrote a series of books called “Teaching Computer Science LOGO Style” or similar (He’s the author of USCB Logo).
I really enjoyed those books as I’m an avid LOGO fan. I’m still kinda sad that dynaturtles are effectively going to die because the only implementation still even remotely extant is LCSI’s Microworlds.
I haven’t played with it but I know that Racket has a
lang logo
and turtle graphics.I’ve been wanting to learn Racket for a while. It’s next on my list after Javascript. Sadly it takes me years to truly grok a programming language to any level of real mastery :)
In the realm of alternatives to SICP to teach programming, I’ve really enjoyed The little schemer and follow-up books.
I love that book. Did you read through the latest one? The Little Typer. I haven’t yet moved past the seasoned schemer.
The latest one is in the virtual book pile. But I’d like to get to it eventually. Thanks for the reminder. :)
The Little LISPer and its descendants are seriously pure sheer delight in book form.
They embody all the beautiful playfulness and whimsy I LOVE in computers that has been sucked out of so much happening today.
Bonus points: Even if you could care less about Scheme/LISP you learn recursion!
After struggling hard at trying to understand recursion in my freshman year with Concurrent Clean (the teachers pet language, a bit Haskell-like), this book made everything click. It also made me fall in love with Scheme because of its simplicity and functional high level approach. After the nightmare of complexity and weird, obscure tooling of Clean, this was such a breath of fresh air.
I really need to sit down and work through The Little Typer :)
I don’t get The Little Schemer. There doesn’t seem to be a point to it, something it’s working towards. I feel like I should be enlightened in some way in the end, but it just seemed to end without doing anything special. What am I missing?
I like this approach. Recommend SICP, but make it SUPER clear that it’s a difficult book. It’s OK to get to a point where you say “This is over my head” and for those who are up for it, there’s an additional challenge there of “OK now take the next step! Learn what you need in order to understand”.
Not everyone has the time or the patience for that, but as long as we’re 1000% clear in our recommendations, I think recommending SICP is just fine.
However IMO it is THE WORST to recommend SICP to people who are looking for a quick and easy way to learn to program or learn the rudiments of computer science.
This post strikes me as sour grapes.
I quite enjoyed reading through SICP a few years ago and don’t have a very strong grasp of math or physics (though I am a big fan of Lisp). While it’s certainly not entry-level, it’s got some great code examples that aren’t the boring and contrived crap examples that fill most textbooks. I agree that it’s probably a bad idea to hand it to someone who’s never programmed before, but usually it’s recommended to relatively experienced programmers with some awareness of Lisp, who are interested in books that change the way you approach programming (it certainly changed mine). It’s a bit of a self-selecting audience, and I’ve never seen it mentioned outside of HN or lobste.rs-like communities.
It’s not the type of book that really helps you land a job, but if you want to get a deeper understanding how Lisp programmers think about problems, it’s one of the best (along with The Little Schemer). It’s not considered a classic just because of the smug lisp weenies ;)
I wholeheartedly disagree. Technical books especially are rarely written to be read from cover to cover. Find the useful parts of the book that interest you and skip the rest.
That’s too bad, it wasn’t my intention to be negative. Though I can imagine my guesses could be seen as cynical.
“continue” in the quote you mentioned is my weasel word.
It is my goal to read through SICP eventually. I keep trying every few years.
Surely SICP is a counterexample, given it was written as the core textbook for MIT’s introductory computer science courses?
SICP hasn’t been used for intro CS at MIT since 2008.
The course(s) now use Python, apparently.
https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs#Coursework
That doesn’t change the purpose the book was written for, which was my point - a companion textbook for a course is something meant to be worked through, typically.
Might it not depend on what you’re looking to get out of the experience?
SICP offers a sincere challenge for many people, and there’s certainly a GOOD argument to be made that for those who choose to rise to that challenge the payback will be substantial.
However I often see SICP recommended to people who just want to learn how to program, or gain a grasp of basic/high level CS concepts. It strikes me that SICP may not be the best way to guide people into the pit of success :)
I don’t recommend every programmer read SICP, but for me personally it was one of the most insight-dense books I’ve ever read. If someone asks me for my ten favorite books on programming (or even my twenty favorite books on any topic), it’s gonna be on the list.
I think the author is wrong that it’s poorly written, because you can’t evaluate well-writtenness without considering the intended purpose. e.g. the best and most-recommended advanced math books are typically quite hard to read even for a math student, and downright unpleasant for those unfamiliar with what one might call “the effective way to learn math”. They wouldn’t be improved by making them appear “well-edited”.
That said, I wouldn’t recommend Rudin to someone looking for “a good math book”. And I don’t think programmers should read SICP unless they’re interested in a particular kind of engagement with the theory and practice of building software.
They’d be improved quite a bit, IMO. Writing well, teaching well, and doing math well are three extremely different skills. I’ve seen people who are good at all three explain advanced math topics, and they’re miles ahead of even highly-recommended advanced math books. But they had to spend a lot of time actively improving their teaching and writing, which isn’t something that’s as incentivized by academia as doing math well is.
I get it. I got mired down in SICP and never finished, but for me The Little LISPer was that kind of insightful and dare I say even inspiring experience.
People are different, brains are different, and we all bring very different things to the table when it comes to books.
Very important context for this discussion! It’s okay to like challenging books, but you have to accept that there are many good books that aren’t nearly as challenging as SICP. Recommend those first!
This is also likely the most common reason. Writing a good book is really, really hard, and writing a good book about challenging content is even harder. So there are a lot more books with good content than well-written books with good content.
Here’s a fourth guess for you: “must-read” books are also well-known books. My personal favorite book on software is Data and Reality, but most people haven’t heard of it, while they have heard of SICP.
A beautiful book. It transcends the technical genre into something like art or philosophy. In many ways – the style, the larger themes it keeps circling about from different directions – it reminds me of Philosophical Investigations.
Totally fair. SICP is just one that came to mind. My intent in the post was to talk about the general challenge of recommendations not solely to focus on SICP.
I think about the word “classic” a lot. “That book is a classic.” Well I’ve tried to read a number of these classics and I often don’t know what to make of them. “Classic” and “well-written” are also separate ideas.
I’ll still keep trying to get better at reading. And improve my stamina.
I actually think that SICP is one of the best books, and a stellar recommendation. If you want to take it at a slower pace you can follow along with the original video lectures. This it what I did and it was a lot of fun even though I didn’t finish it on my first reading. The book/course teaches very important concepts that are fundamental to programming and computing and it provides a value that I do not see in other programming textbooks.
I feel the same about ‘the dragon book’. it’s a terrible book. everyone who hasn’t read it recommends it. it’s really unhelpful
I found it very helpful when I read it.
I think the issue with this thought process (and the parent post) is that it assumes that everyone will have the same experience with a book. I’m not sure where that idea would come from though - would you expect to be able to understand a math textbook without effort?
Basically this boils down to “I had a bad experience with this book, so no one should recommend it.”
Edit: another way to think about this. Personally, I get nothing of out of “instructional” videos. I can’t focus, the tempo is all wrong, and watched content just has no retention for me. Does that mean that no one should suggest videos as a learning resource? Of course not! Many people love learning from those videos and get a lot out of that style of content. The efficacy it has for me doesn’t have any bearing on how effective it will be for someone else.
then
Maybe you need to try harder, did you really expect to get anything out of the videos without effort?
Seriously, though, why is failure to get much out of Famous CS Book chalked up to a lack of effort (it’s not just you, other threads in this discussion contain the same accusation / assumption), but failure to learn from a YouTube video is just a difference in how you learn versus other people?
I think you misread or misunderstood what I wrote - it’s not different, and that was my point. I don’t tell other people they shouldn’t try to learn from videos, because I know that they are valuable resources for the people who learn well from them. I recognize that’s something valuable to others even though it isn’t valuable to me.
Now flip it around. Just because someone doesn’t enjoy/can’t understand/can’t internalize information from a certain type of book doesn’t mean that the well-regarded book shouldn’t be recommended. It means that individual should probably not consider books like that in the future.
Then why the thing about effort? Effort has nothing to do with it if we’re talking about different learning styles. And yet, I repeatedly see people accuse others of low effort because they didn’t get anything from a famous CS or math text.
I agree with the first sentence, but the second half of the second sentence (after the hyphen) just seems totally unrelated. You’re accusing the person of not putting in enough effort, yet you claim that it’s about learning styles.
Which is it? Learning styles? Or lack of effort?
Just going to pop in and point out that there is no evidence for learning styles being a thing. Yes, engaging multiple sensory modalities leads to better retention. No, different individuals don’t do significantly differently with particular modalities in the absence of major issues (blind people obviously can use visual, etc.).
I think you’re picking on words and ascribing your own slant/opinions to them. This will probably be the last response that I’m going to write in this chain.
I’m not ascribing any virtue to either learning style - that’s something you appear to be doing. Who’s to say that “effort” isn’t an important part of the different learning style? Maybe, for some people, the effort of reading the book is what allows the information to sink in, while for others it’s an impediment to their learning?
For the record, I can’t get through most math papers due to the effort I’d need to put in to understand their notation, and I have a strong foundation in math. I usually read others’ summaries and then augment my understanding with the paper as a reference. I don’t think this makes me “worse” - but I do know that I could do it myself if I had the patience for it (because I’ve done it before).
The question was “Would you expect to be able to understand a math textbook without effort?”. I know that I cannot honestly answer no to that question.
The best compiler book I ever read was Per Hansen’s On Pascal Compilers; Wirth of course also writes broadly and well on compilers.
Something that the Dragon Book covers that a lot of others don’t though is a broad view of parsing theory. Many books tend to discuss recursive descent parsing and call it a day. If they cover other parsing mechanisms, it’s often only a brief mention.
Indeed, my complaint with the dragon book is that it’s mostly a book about parsers, not compilers which is not what I’d signed up for when I picked it up. It does touch on other topics, but very superficially, and I felt kinda cheated.
Also, even seen as a good book on parsing, it needs an update – the 2nd edition mentions neither parser combinators nor PEGs/packrat parsing, which are important, well-known techniques these days, but were still very new when the 2nd edition was published (2006).
The dragon book was the text for my undergraduate compilers course. It was heavy on theory and light on practice. I think it makes a poor undergrad textbook, but that doesn’t make it a poor book in general. It has its place; I’m not going to slam it. That place may not be in an undergrad course though.
As for SICP, I’ve read about 2/3 of it. This was extracurricular reading for me when I was an undergrad. I should really pick it up again and finish it. I worked my way through it, trying things in my Scheme interpreter as I went, and had quite a lot of “aha” moments. I’m not great at math and have no physics background whatsoever. In fact I started out majoring in philosophy.
It’s a reference book for compiler algorithms, it’s not really an intro guide. I’ve very rarely cracked my copy open, but I usually know what I’m looking for before I’ve opened it.
Generally, I find reference books less useful since google (or DDG :)) is usually gets me the answer I need faster.
What were the issues with the dragon book? I found it explained a lot of things students were having difficulty with back when I was a TA.
My problem with the dragon book was that I tried to read it using a horrible translation into Brazilian Portuguese. Whoever translated it had no idea about computing jargon and used wrong Portuguese terms in the translation. Things like
string
became the Portuguese word foryarn
, and so on, it was horrible. So, it is not that the dragon book has problems, but my experience with it sucked and it kinda spoiled me against it. That’s when I went looking for other books and found SICP and others.Yes.
People do not seem to understand cognitive load & the impacts of overwhelming a developer. Most people i know (including myself for most of my life) “tough” it out, but the effects don’t disappear, & those who fail at a particular task (like myself and many others ive seen) often dont come back for more, /or develop an inferiority complex.
It’s been extremely frustrating to learn in the past year that it wasn’t just me, but how we are taught & teach cs. As I’ve worked on myself as a person its gotten easier to read dense books, but I do not feel smarter. Instead feel validated in my frustration at the level of mind games you have to go through to understand these things as the author puts them.
Teaching is a skill, it is not easy but it should be practiced. It should not be aimed for the smartest kid the room, much closer to the reverse. This is a good thing.
I find that there is a cultural divide between the Americas and the old continent when it comes to educational material, and I may even dare to extend that to non-fiction. In France, for instance, you always start with the formal theory and may only see any examples when doing exercises, while most often in the new world you will see practical examples first as a way to present the theory. I find that SICP is one of the rare examples of books that strikes a balance between both styles, and manages to keep fundamental concepts and theory clearly articulated and presented through a crafted sequence of exercises. Around me, I see a dire need for a more formal understanding of fundamental concepts. Too many people are stuck at the level of terminologies specific to a programming language or worse, a library, and are unable to identify or articulate the fundamental mechanisms at play. This creates a growing divide where new generations of developers are losing their literacy and become technicians, instead of engineers or scientists.
Every time I’ve tried to start SICP so far I’ve given up. I usually fail to complete books I start (I did finish The Little Schemer though), so I wouldn’t pin that entirely on SICP, but I do resonant with the comments here on its style and prose; to me that aspect of it is particularly painful. A book that starts with a thesis that programming is really no more than a tool of expressing thought or something is likely to lose me, for better or for worse. That’s just me though.
I can also relate this to a microelectronics textbook I had in college, Sedra and Smith. It has good reviews and approving blurbs from other EE professors, but when I sat down to read a section that covered whatever was in the latest homework, I could barely parse it. It may have been full of correct statements, but it just did not feel like it was written in a way for someone who has never understood the material before to understand. I found that a lot of popular undergrad textbooks are like this.
oh wow I don’t agree with this at all (for nonfiction). Loads of books have one or two stellar chapters that resonate for decades while the rest of the text is forgotten about, rarely discussed, or becomes superseded in due time with newer, more insightful ideas.
I own the first two editions of SICP and have read the 1st, but this happened early 90s with minimal Internet connection and less choices for material. I will buy the Javascript edition too. Last week I told a person, that reading SICP is like competing a triathlon. If you want to do it, be prepared for such, but if you want to learn, it does not have to be a triathlon. I only recommend SICP for the joy of reading SICP.
I strongly agree with the premise that it doesn’t matter how much information is in a book if you don’t read it. When recommending a book to someone, or just choosing one for myself, I try to be sensitive to that. One habit I picked up that helps is that I’m willing to skim a book if it’s not fun to read. I figure getting through it and only absorbing 20% is better than giving up and getting 0%.
My experience is that this is very true, especially as you get into deeper material. The intersection of people who know some obscure difficult topic and people who can write well gets smaller and smaller the more obscure the topic is. Eventually you have to decide between reading something poorly written by someone who’s at least got the goods, an enjoyable read that misses the mark, or potentially no book at all. Given that choice, I’ve learned to grind through mediocre writing to get to the material inside.
My trick—and I’m totally serious—is to leave the book in the bathroom and not take my phone with me in there. You can get through anything if it’s in relatively short bursts and you don’t have anything better to do.
I think the problem here is as much this problematic notion of ‘developers’ is an extremely unhelpful abstraction for what we’re talking about.
Imagine that in the civil engineering world we called people who make benches and people who make bridges some equivalent catch-all term like ‘constructors’. You’d have blog posts from Chair Industry Thought Leaders saying ‘Stop Telling Constructors they need to know Calculus’ and simultaneously 18 year olds applying to do Civil Engineering at univeristy/college, in order to one-day build bridges, wouldn’t even get past the entrance exams if they didn’t know what the chain rule was (i.e. basic calculus, which SICP assumes you know as part of a motivating early example, iirc).
Constructors would be talking past each other on Maker News about how you can’t possibly design supporting structures without knowing calculus, it would be professionally negligent, buses full of school children will die etc, whilst other constructors would counter that they just sold their chain of Swing Seat shops for $100M to Lowe’s and they never once studied Calculus in all their life so stop being such elitist gatekeeping douchebags.
It’s the same with ‘developers’. Obviously you need caluclus as a pre-requisite in almost any scientific or [non-software] engineering discipline, Machine Learning, Signal Processings, computer vision, whatever it happens to be. Many people taking any form of technical degree at a research university will go on to be in one of these camps.
But there are also millions of people just making chairs and they can live happy and productive lives without having come across the chain rule, or needing to.
There is no great discrepancy here unless you insist on viewing these disparate camps as part of the same mass, and then it all breaks down.
I enjoyed this blog post, and it inspired me to update a page on website that lists the books I’ve read to indicate which ones I highly recommend - http://stratus3d.com/about/books-i-have-read/. Even though it’s been many years since I’ve read most of the books on that list it was surprisingly easy remember which ones were excellent and worth recommending.
I completely agree with “Don’t recommend books you haven’t read.” I also have some fields like probability where I learned it from a person and from papers, so I have no book to recommend. I also have fields where the book I read may be superseded by a better recommendation, but I haven’t read that, so I am hesitant to recommend anything. Networking is an example of this.
Now, SICP is not a good first book to learn how to write programs. That is true, and no one should recommend it for that anymore. There are better options as others have pointed out. But
This I don’t see. SICP is beautifully written. You cannot skim it, and you cannot parse it as a series of analogies and idioms. You have to directly engage with what it is saying, not what your brain wants to shape it into saying to avoid reading and engaging with every word. This is not an issue of poor writing, but an issue of insufficient literacy. The same is true of Knuth’s work. I’ve only read parts of TAoCP, but the parts I have read have all been utterly lucid. The same issue applies in non-technical fields. Escape from Rome and The Nature of Order and Sokolowski’s Introduction to Phenomenology are all beautifully written, but must be read closely. The same is true of much poetry.
That’s the real intelligence signalling right there. “I had hard time reading this book, surely you can’t stomach it”. How about recommend the book if you liked it, and explain why it’s worth the effort?
I think there’s SOME of this but I also think we need to look at SICP in specific in the context it was originally written for.
It was written as a textbook for an introductory CS course at MIT, right? Anyone who has tried to work through one of MIT’s edX/open courseware courses online knows that it’s NOT easy, and a couple friends of mine who attended MIT gave me the key to understanding why - the course/lecture/textbook are only a part of the learning process at MIT.
Recitations - the time when you practice what was taught in the lecture and work individually with TAs to help enhance your understanding of what was presented, seem like a critical missing piece to me.
Viewing this book outside of its context, I agree entirely with the author and while I enjoyed battering my head against the SICP brick wall, I ultimately came away bloody and unsuccessful.
I wouldn’t be a programmer if not for SICP. I didn’t read much of it but the insights those few chapters I read gave me right when I was starting out (I had only tried learning a bit of Ruby from random websites) not only gave me the tools to understand a bit of what was going on but also a great fascination for CS and programming languages.
I couldn’t earnestly recommend it because I never read it all (I should fix that someday) but SICP was the book that made it all click together for me.
I was a grad student TA for intro computer science for a couple years. The professors who designed the class had a near-holy reverence for that book (perhaps due to MIT’s reputation alone).
There were some good ideas in the course. In particular, the idea that programming languages and compilers can be simple and built from first principles is really powerful. At the same time, modern software engineers can just trust that the compiler is doing what it’s supposed to, and the job is much more about figuring out how to put disparate pieces together from large preexisting components than build anything from first principles.
Meanwhile I’m not even sure that anything you teach in Introduction to Computer Science is really going to have that much value, other than helping students decide if it’s the right degree for them. And building an interpreter in Scheme is not really a realistic sampling of the field.
My university did switch to a more conventional intro course using Python a couple years after I left.
For my part… I gave a presentation at a local meetup about what we were teaching in Intro CS at the university and why. Which lead to connections that lead to me leaving grad school and getting a really good job. So it worked out!
I felt the same way about The Mythical Man-Month. It’s extremely sexist: no “engineers” or “developers”, always “men”, “man-hours”, etc. I had to put it down after 20 pages because every page was like this.
It’s got an incredible core message but desparately needs an updated 21st Century edition.
You’re going to have a hell of a time reading the classics. Those guys even had slaves.
In all seriousness, if you can’t read things written by people in very different cultural contexts, you’re the one missing out.
MMM in particular has another problem. Some of the advice on it is timeless, the rest is archaic. After having two it I would not recommend anyone else read it without a dump truck of salt on hand.
is this true? I know the book starts with Newton’s method of square roots, but it’s not tasking you with deriving the formula, it just asks you to implement it. And where does physics come in?
What is meant by a “well-written book”?
If you mean “beautiful and well-written in a strict prose sense” - then SICP is a well-written book, and I don’t
If you mean “appropriate to the domain; in this specific case, because the domain is education: teaches the student efficiently and easily” then I can see SICP as not being particularly well-written; it is, as you and others have stated, very dense, and I can easily imagine (or maybe even recommend) other books that are easier and faster to learn from.
Other commentators: the author writes “The core goal of a book recommendation is for the reader to get enjoyment or education from it.” and that’s absolutely true; SICP is an enjoyable book, but I’m not convinced that it is a particularly good book for getting education from. Education is the process of helping other learn stuff, which necessarily means that that stuff has to be made accessible, and SICP doesn’t do the best job at this.
I say this as someone who adores Lisp, and has spent the past few months carrying SICP around in my backpack.