How to recommend books, or, stop recommending SICP(notes.eatonphil.com)
notes.eatonphil.com
How to recommend books, or, stop recommending SICP
https://notes.eatonphil.com/recommending-a-book.html
20 comments
> But uh, yeah, all of y'all recommending SICP as an intro to programming need to stop. Your target audience, if they take up programming at all, as a hobby, as a profession, or as a way to help them do their real work, is probably not going to use Scheme.
Some of us are working on that, and that's all I'm gonna say right now. And yeah, maybe that's not going to work out. Anyone see a white whale around here?
> Plenty of copies of TAOCP sit unread on bookshelves for this same reason also.
I'd say that TAOCP is more of a reference work than a course textbook. It's a completely different kind of book to SICP.
Some of us are working on that, and that's all I'm gonna say right now. And yeah, maybe that's not going to work out. Anyone see a white whale around here?
> Plenty of copies of TAOCP sit unread on bookshelves for this same reason also.
I'd say that TAOCP is more of a reference work than a course textbook. It's a completely different kind of book to SICP.
> Some of us are working on that, and that's all I'm gonna say right now.
Some sort of Guix thing? Near as I can tell, Guix is the second biggest attempt to mainstream Scheme (the first being Brendan Eich's failed attempt to embed Scheme in Netscape Navigator, resulting in JavaScript).
Some sort of Guix thing? Near as I can tell, Guix is the second biggest attempt to mainstream Scheme (the first being Brendan Eich's failed attempt to embed Scheme in Netscape Navigator, resulting in JavaScript).
> Some sort of Guix thing?
Nah, this is very small and rough at the moment -- may never come to anything. But it's fun to work on.
> the first being Brendan Eich's failed attempt to embed Scheme in Netscape Navigator, resulting in JavaScript
What a different (and better, IMO) world we'd be in if he'd managed to sneak that by the suits... ah, well.
Nah, this is very small and rough at the moment -- may never come to anything. But it's fun to work on.
> the first being Brendan Eich's failed attempt to embed Scheme in Netscape Navigator, resulting in JavaScript
What a different (and better, IMO) world we'd be in if he'd managed to sneak that by the suits... ah, well.
A lot of JS bloat could have been eliminated if it had lisp-like macros.
Arguably, the problem is conflating programming as a job with CS degrees. CS degrees cover very little of what day-to-day programming looks like. They're a useful theoretical underpinning, but as the saying goes, "In theory, theory and practice are the same. In practice, they are not."
So, if you go through SICP as an intro to learning those theoretical underpinnings, it's probably pretty good, but you'll also want some more 'real-life' programming experience. If you read SICP expecting some deep insights into programming as a job, then it's probably not going to help.
So, if you go through SICP as an intro to learning those theoretical underpinnings, it's probably pretty good, but you'll also want some more 'real-life' programming experience. If you read SICP expecting some deep insights into programming as a job, then it's probably not going to help.
I think SICP is extremely well written and worth a read. I know its contents are slightly controversial (Maths! Functional Programming! Scheme! Lots of Silly Parentheses!) and now a bit oldish - the course on which this book is based was created around 1980. There are roughly a dozen books which try to be an improved version of SICP. Still, it's a classic and it has inspired a lot of people.
The original group for which the book was written are computer science students. As such it is only partly about learning 'Scheme' (actually only a small subset) or 'Programming'.
Originally one wanted to teach how to do software engineering from the ground up: build an evaluator, a compiler, a register machine, ... This style now is a bit out of fashion and the education switched to a different approach: assemble available Python modules. Still I like the SICP approach to give students a deep understanding how to build up from basics.
In the Lisp world, there are books like Winston/Horn 'Lisp' (which adapts some content from SICP) or 'PAIP' from Peter Norvig, which are also challenging. 'Lisp' is more interested in teaching actual programming in a larger language and 'PAIP' teaches programming by exposing students to larger programs and larger code examples. Still both give the students, like SICP, a lot of inspiration to experiment with the provided topics and examples.
There are other books/courses based on Logo, Scheme, Oz, etc. which address some of the complaints about SICP.
SICP now is also available in a JavaScript edition.
https://en.wikipedia.org/wiki/Structure_and_Interpretation_o...
The original group for which the book was written are computer science students. As such it is only partly about learning 'Scheme' (actually only a small subset) or 'Programming'.
Originally one wanted to teach how to do software engineering from the ground up: build an evaluator, a compiler, a register machine, ... This style now is a bit out of fashion and the education switched to a different approach: assemble available Python modules. Still I like the SICP approach to give students a deep understanding how to build up from basics.
In the Lisp world, there are books like Winston/Horn 'Lisp' (which adapts some content from SICP) or 'PAIP' from Peter Norvig, which are also challenging. 'Lisp' is more interested in teaching actual programming in a larger language and 'PAIP' teaches programming by exposing students to larger programs and larger code examples. Still both give the students, like SICP, a lot of inspiration to experiment with the provided topics and examples.
There are other books/courses based on Logo, Scheme, Oz, etc. which address some of the complaints about SICP.
SICP now is also available in a JavaScript edition.
https://en.wikipedia.org/wiki/Structure_and_Interpretation_o...
I'm sorry but this post is ridiculous.
By following the advice in it no one would ever recommend a book that requires knowledge/reasoning skills beyond a high school level.
This goes for literature too.
I also call bullshit on his definition of "Goals". There are plenty of books whose content is valuable enough that the work put into extracting the information is more than worth the effort.
The correct message is to understand who your audience is before you make any recommendations.
By following the advice in it no one would ever recommend a book that requires knowledge/reasoning skills beyond a high school level.
This goes for literature too.
I also call bullshit on his definition of "Goals". There are plenty of books whose content is valuable enough that the work put into extracting the information is more than worth the effort.
The correct message is to understand who your audience is before you make any recommendations.
> Written for freshman at MIT, it is ostensibly an entry-level text. But it requires such a level of competence in math and physics, and the prose itself is so dense and archaic, that I couldn't imagine suggesting it to anyone.
It’s also a complement to a course, the implications here being that chapters and examples are to be discussed in class and that a certain amount of lab-work has to be performed as well for the concepts to sink-in. But It’s not for everyone. I couldn’t see a bootcamp based on this book for instance.
It does assume a fair bit of math and physics knowledge (or a curiosity for such) because it was written with engineering students in mind who, for some of them, were encountering a computer for the first time of their lives. [0]
> 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.
This is clickbait. SICP has been used for decades and is extremely well regarded as an introductory book. Maybe the OP lacked the fundamentals required for approaching it. If the authos has a CS degree, that reflects poorly on the program he completed.
> If you love challenging books, you are neither the norm nor the audience of this post.
But the MIT freshman this book was written for definitely are.
[0] https://youtu.be/-J_xL4IGhJA
It’s also a complement to a course, the implications here being that chapters and examples are to be discussed in class and that a certain amount of lab-work has to be performed as well for the concepts to sink-in. But It’s not for everyone. I couldn’t see a bootcamp based on this book for instance.
It does assume a fair bit of math and physics knowledge (or a curiosity for such) because it was written with engineering students in mind who, for some of them, were encountering a computer for the first time of their lives. [0]
> 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.
This is clickbait. SICP has been used for decades and is extremely well regarded as an introductory book. Maybe the OP lacked the fundamentals required for approaching it. If the authos has a CS degree, that reflects poorly on the program he completed.
> If you love challenging books, you are neither the norm nor the audience of this post.
But the MIT freshman this book was written for definitely are.
[0] https://youtu.be/-J_xL4IGhJA
Today OP “taught” me that if a book requires careful effort to fully understand, then the book is badly written. Likewise, if a book is hard, the reader shouldn’t ever be expected to push through that difficulty and should instead seek an easier and simpler take on the same topic.
If these are the OP’s habits of mind, then hard pass on anything else he thinks.
If these are the OP’s habits of mind, then hard pass on anything else he thinks.
The way I think about this is you have to have the appropriate prerequisites, whether it's a technical book or not.
Here's a loose analogy: you shouldn't take college calculus if you don't already know arithmetic and algebra. And maybe you shouldn't read SICP if you haven't taken its prerequisites either.
Here's a loose analogy: you shouldn't take college calculus if you don't already know arithmetic and algebra. And maybe you shouldn't read SICP if you haven't taken its prerequisites either.
I'm glad it was recommended to me.
> If you love challenging books, you are neither the norm nor the audience of this post.
If you read books on programming and computer science in general you are not the norm, and perhaps shouldn't be the audience of this post either?
> the prose itself is so dense and archaic
I'm not sure what in particular you feel is archaic, but density is a selling point here. One of the things that makes SICP attractive is the high information density. There are already too many books that are full of fluff that appears to exist only to hit a page count.
> it requires such a level of competence in math and physics
Can you give some specific examples of the math and physics that you think are beyond the capabilities of a bright high school graduate (that seems like a reasonable minimum bar to expect for someone picking up a book targeted at freshmen at MIT)?
> If you love challenging books, you are neither the norm nor the audience of this post.
If you read books on programming and computer science in general you are not the norm, and perhaps shouldn't be the audience of this post either?
> the prose itself is so dense and archaic
I'm not sure what in particular you feel is archaic, but density is a selling point here. One of the things that makes SICP attractive is the high information density. There are already too many books that are full of fluff that appears to exist only to hit a page count.
> it requires such a level of competence in math and physics
Can you give some specific examples of the math and physics that you think are beyond the capabilities of a bright high school graduate (that seems like a reasonable minimum bar to expect for someone picking up a book targeted at freshmen at MIT)?
> Can you give some specific examples of the math and physics that you think are beyond the capabilities of a bright high school graduate (that seems like a reasonable minimum bar to expect for someone picking up a book targeted at freshmen at MIT)?
Just look at some of the examples right at the start of the book, in the first chapter:
> This section describes two methods for checking the primality of an integer n, one with order of growth Theta(sqrt(n)), and a 'probabilistic' algorithm with order of growth Theta(log n).
> ...
> Fermat's Little Theorem: If n is a prime number and a is any positive integer less than n, then a raised to the nth power is congruent to a modulo n.
> ...
> When we first introduced the square-root procedure, in section 1.1.7, we mentioned that this was a special case of Newton's method. If x -> g(x) is a differentiable function, then a solution of the equation g(x) = 0 is a fixed point of the function x -> f(x) where [complex formula] and Dg(x) is the derivative of g evaluated at x.
As someone who has a masters degree in CS, I agree with OP. People mostly recommend SICP to beginners because they want to sound smart, not because it's a good intro to programming.
Just look at some of the examples right at the start of the book, in the first chapter:
> This section describes two methods for checking the primality of an integer n, one with order of growth Theta(sqrt(n)), and a 'probabilistic' algorithm with order of growth Theta(log n).
> ...
> Fermat's Little Theorem: If n is a prime number and a is any positive integer less than n, then a raised to the nth power is congruent to a modulo n.
> ...
> When we first introduced the square-root procedure, in section 1.1.7, we mentioned that this was a special case of Newton's method. If x -> g(x) is a differentiable function, then a solution of the equation g(x) = 0 is a fixed point of the function x -> f(x) where [complex formula] and Dg(x) is the derivative of g evaluated at x.
As someone who has a masters degree in CS, I agree with OP. People mostly recommend SICP to beginners because they want to sound smart, not because it's a good intro to programming.
You really don’t need to understand the math or how to prove anything about Fermat’s theorem, fixed points, or primality. It’s just the “business context” surrounding the requirements, which are specified well enough. I agree it might cause some unnecessary confusion if the reader is not able to put it “in a box” and just look at the algorithm, but really, putting it in a box works.
Later on there is a bunch of differential equations. I’ve been taught about differential equations for a week or two in calculus but I couldn’t solve one to save my life. It doesn’t matter. Solving the exercises doesn’t require it.
Later on there is a bunch of differential equations. I’ve been taught about differential equations for a week or two in calculus but I couldn’t solve one to save my life. It doesn’t matter. Solving the exercises doesn’t require it.
> This section describes two methods for checking the primality of an integer n, one with order of growth Theta(sqrt(n)), and a 'probabilistic' algorithm with order of growth Theta(log n).
The book explains order of growth a few pages before this example, so the only assumed knowledge here is what a prime number is, which seems very reasonable.
> Fermat's Little Theorem: If n is a prime number and a is any positive integer less than n, then a raised to the nth power is congruent to a modulo n.
That's the concise definition of Fermat's Little theorem, that he then proceeds to explain in detail. Again, not presupposed knowledge, but something new to learn. He explains congruent modulo, so you are expected to know what prime numbers are, and what positive integers are. Again, CS books from MIT are not for you if you don't know those two things.
> When we first introduced the square-root procedure, in section 1.1.7, we mentioned that this was a special case of Newton's method. If x -> g(x) is a differentiable function, then a solution of the equation g(x) = 0 is a fixed point of the function x -> f(x) where [complex formula] and Dg(x) is the derivative of g evaluated at x.
This one assumes that you understand the material from section 1.1.7. I think you've succeeded in making a case for reading the book and completing the exercises in order, but not that it places unreasonable expectations on its reader.
The book explains order of growth a few pages before this example, so the only assumed knowledge here is what a prime number is, which seems very reasonable.
> Fermat's Little Theorem: If n is a prime number and a is any positive integer less than n, then a raised to the nth power is congruent to a modulo n.
That's the concise definition of Fermat's Little theorem, that he then proceeds to explain in detail. Again, not presupposed knowledge, but something new to learn. He explains congruent modulo, so you are expected to know what prime numbers are, and what positive integers are. Again, CS books from MIT are not for you if you don't know those two things.
> When we first introduced the square-root procedure, in section 1.1.7, we mentioned that this was a special case of Newton's method. If x -> g(x) is a differentiable function, then a solution of the equation g(x) = 0 is a fixed point of the function x -> f(x) where [complex formula] and Dg(x) is the derivative of g evaluated at x.
This one assumes that you understand the material from section 1.1.7. I think you've succeeded in making a case for reading the book and completing the exercises in order, but not that it places unreasonable expectations on its reader.
It's been a few years since I tried to breach it but I'm your normative (arts education) audience for this and SICP's frontloading of higher-level math was a showstopper for me. I won't point you to examples but will say that How to Design Programs succeeded where SICP failed. Gregor Kiczales' How to Code, a MOOC based on HtDP is a masterwork of teaching that starts with the student drawing basic shapes and filling them in with color.
I think people who were raised on the more technical fare often have a blindspot for how unapproachable programming can be to liberal arts people like me. The assumed knowledge can be greatly discouraging. We so often need a new vector that speaks to how we learned to conceive of the world.
I think people who were raised on the more technical fare often have a blindspot for how unapproachable programming can be to liberal arts people like me. The assumed knowledge can be greatly discouraging. We so often need a new vector that speaks to how we learned to conceive of the world.
Arguably, the problem is one of audience. SICP is a dense book, but a liberal arts background is NOT the target audience in any way. Computer Science degrees evolved out of math and electrical engineering - those kinds of students are SICP's target audience.
HtDP does target liberal arts, and is a pretty good intro to programming, but either it or the course around it is not a great introduction to the kind of things covered in a CS degree.
Having taken and TA'd in-person course that corresponds with the MOOC about 8 years back (plus other courses)... the MOOC may be good as a standalone course, but the in-person version didn't know its audience. (Also, my understanding is that UBC has since stopped using the HtDP course as the intro for it's CS degree track.)
Business/arts students who took the course and no more CS courses did okay, but many CS track students were poorly served. It provided no real basis for understanding the data structures, logic, proofs, and low level stuff that showed up in later courses. My theory is that the course was so focused on the approach and specifics of the solutions that it never explained the why - so the programming knowledge didn't transfer well to anything other than the Racket-based HtDP environment.
It's also a miserable course to take for anyone with previous programming experience. The typing is arbitrary and not enforced by anyone but those marking the assignments. The dev environment was (maybe is?) quirky as all get-out. The libraries themselves are restrictive, or perhaps the libraries available for more interesting things aren't taught in the course - I never checked, I just wanted to get it over with.
That's not to say it was an awful course - TAing it, I definitely met students that benefited from it. However, HtDP and the course are not a SICP replacement - the targets are just too different.
HtDP does target liberal arts, and is a pretty good intro to programming, but either it or the course around it is not a great introduction to the kind of things covered in a CS degree.
Having taken and TA'd in-person course that corresponds with the MOOC about 8 years back (plus other courses)... the MOOC may be good as a standalone course, but the in-person version didn't know its audience. (Also, my understanding is that UBC has since stopped using the HtDP course as the intro for it's CS degree track.)
Business/arts students who took the course and no more CS courses did okay, but many CS track students were poorly served. It provided no real basis for understanding the data structures, logic, proofs, and low level stuff that showed up in later courses. My theory is that the course was so focused on the approach and specifics of the solutions that it never explained the why - so the programming knowledge didn't transfer well to anything other than the Racket-based HtDP environment.
It's also a miserable course to take for anyone with previous programming experience. The typing is arbitrary and not enforced by anyone but those marking the assignments. The dev environment was (maybe is?) quirky as all get-out. The libraries themselves are restrictive, or perhaps the libraries available for more interesting things aren't taught in the course - I never checked, I just wanted to get it over with.
That's not to say it was an awful course - TAing it, I definitely met students that benefited from it. However, HtDP and the course are not a SICP replacement - the targets are just too different.
> Can you give some specific examples of the math and physics that you think are beyond the capabilities of a bright high school graduate (that seems like a reasonable minimum bar to expect for someone picking up a book targeted at freshmen at MIT)?
I'm going to stop you there. If you think that jumping into approximating square roots via newton's method is not a "high level of competence in math and physics" then you have lived in a completely different world than I did. And the issue isn't knowledge (that's shared in plenty of detail in the book), but the maturity of mathematical reasoning.
The level of calculus taught to me in high school (and college) was at the same level as Algebra and Trigonometry. It was taught as a tool for engineers to use, not as a framework for building your own tools (proof-based calculus). The only people around me that reached that level of mathematical maturity were Maths, Physics, and Computer Science majors. And often it wouldn't "sink in" until around junior year for them.
> The \sqrt(x) = the y such that y >= 0 and y^2 = x.
This is an extremely dense mathematical sentence that requires a high level of mathematic maturity to understand that the author isn't just throwing that out randomly. It wasn't until I took a formal proofs/introduction to analysis course that it sunk in that a mathematical definition isn't just a sentence describing a new piece of vocabulary but is instead a highly technical engineering spec for a mathematical tool.
And until I made that transition I couldn't follow the flow of the logic, implications of the ideas/problems presented, or see the bigger picture of how these things fit together. They were technically accessible to me (I could read and understand the words and problems), but they completely lacked coherence to me.
I'm going to stop you there. If you think that jumping into approximating square roots via newton's method is not a "high level of competence in math and physics" then you have lived in a completely different world than I did. And the issue isn't knowledge (that's shared in plenty of detail in the book), but the maturity of mathematical reasoning.
The level of calculus taught to me in high school (and college) was at the same level as Algebra and Trigonometry. It was taught as a tool for engineers to use, not as a framework for building your own tools (proof-based calculus). The only people around me that reached that level of mathematical maturity were Maths, Physics, and Computer Science majors. And often it wouldn't "sink in" until around junior year for them.
> The \sqrt(x) = the y such that y >= 0 and y^2 = x.
This is an extremely dense mathematical sentence that requires a high level of mathematic maturity to understand that the author isn't just throwing that out randomly. It wasn't until I took a formal proofs/introduction to analysis course that it sunk in that a mathematical definition isn't just a sentence describing a new piece of vocabulary but is instead a highly technical engineering spec for a mathematical tool.
And until I made that transition I couldn't follow the flow of the logic, implications of the ideas/problems presented, or see the bigger picture of how these things fit together. They were technically accessible to me (I could read and understand the words and problems), but they completely lacked coherence to me.
Book recommendation lists are about inflating one's ego. I would look uncultured if I recommended the books I actually enjoy and derive value from (or, more poignantly, actually read).
I /highly/ recommend SICP as a first introduction to programming.
I /highly/ recommend SICP as a first introduction to programming.
Now I really want to know what you're reading.
But uh, yeah, all of y'all recommending SICP as an intro to programming need to stop. Your target audience, if they take up programming at all, as a hobby, as a profession, or as a way to help them do their real work, is probably not going to use Scheme. They're not going to give a single flying fuck that a small language nucleus can give rise to a whole kundalini of programming concepts and approaches. And when they see the unrelenting mathiness of SICP, they're going to doze off. Plenty of copies of TAOCP sit unread on bookshelves for this same reason also.
I've gone from being a Lisp, Jazz, Aikido guy to a Visual Basic, Punk Rock, MMA guy. At the end of the day, what counts is getting it done with a minimum of fuss, not beauty or orthogonality or any of those other concepts. If you want to teach people programming, teach them to program things they care about in a language they are likely to use.