Hacker News new | ask | show | jobs
by 0x7E3 1604 days ago
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)?

3 comments

> 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.

> 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.

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.

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.

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.

> 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.