You know how there's a thing called "precalculus" in high schools? Covers trig, logarithms, etc.?
I feel like SICP would be a perfect text for introductory CS, if there were a "pre-CS" course in high schools that was essentially equivalent to the current 100-level Discrete Mathematics courses.
Come into programming already knowing set theory, graph theory, computational complexity, etc. and SICP will make perfect sense.
It is described here in an excellent talk about the challenges of curriculum design https://youtu.be/5c0BvOlR5gs note the end of the talk he discusses how Calculus is secretly taught to them as well by keeping track of a video game state over time. Going from Bootstrap->SICP would be possible too.
That's a completely separate idea from what I'm suggesting, though.
You don't need to already understand programming to be able to use SICP. SICP doesn't need an intro (or to be modified), it is an intro. What you need to already understand, is math. Specifically, the kinds of math that SICP uses in its examples and problems—which aren't taught in high-school, but totally could be (100-level Discrete Maths has very few prerequisites; you could theoretically learn it in elementary school, though practically not, for mental-development reasons.)
SICP is, essentially, a book to teach programming to "mathematicians who have not necessarily ever heard of a computer." It works wonderfully when used as such. But the less mathematical grounding you have, the harder you'll struggle.
It's exactly like a textbook for one of those "Communications for Business" courses. If you're not a business student, then it'll be a bad communications textbook, because all the examples and problems are business-related.
In that talk though, he discusses the impossible task of introducing new course electives/mandatory courses to public middle or high schools, how the school board and teachers will simply drop the rigor if it's a mandatory course making it yet another useless class or how students will never end up taking it as an elective as their elective timeslots fill with remedial assistance courses.
You are right though I wish there was a course that taught set theory and complexity in HS. Anybody interested in learning both at the same time, there are intro discrete math books that also teach intro programming https://cs.wheaton.edu/~tvandrun/dmfp/ but not in the full CS101 coverage of SICP.
> (100-level Discrete Maths has very few prerequisites; you could theoretically learn it in elementary school, though practically not, for mental-development reasons.)
Typical introductory discrete math textbooks list high school precalculus as a prerequisite and recommend an introductory calculus course as very helpful additional background. You would have to teach something significantly different to someone with the background of a typical middle school / early high school student, because they are lacking quite a bit of the expected background concepts, terminology, and notation.
These subjects could certainly be taught to elementary school students, but slowly and with a lot of build-up and practice, over the course of years. The limiting factor is not primarily “mental development” (as in, some inherent change of brain wiring that inevitably happens with age) but rather substantial amounts of practice, prior exposure to related ideas, time spent digesting them, stamina/attention span/confidence at solving technical problems, etc.
I was introduced to lisp through "A Gentle Introduction to Symbolic Computation".
Honestly, I think it is a superior intro-book for genuine beginners, compared to SICP, and a quick perusal of the two will allow most people to come to a conclusion not only about the level at which they are pitched, but which one is pedagogically superior for them in terms of both structure and writing.
> Because Common Lisp is such a complex language, there are a few places where I have chosen to simplify things to better meet the needs of beginners. For example the 1+ and 1- functions are banished from this book because their names are very confusing.
Are they? I don't know if I remember hearing anyone complain about those before.
I haven't seen it articulated either, but I am not a fan of these either. They look like cheesy, whitespace-dependent: infix: (1+ 1) yields 2 and kind of looks like (1 + 1). What?
In TXR Lisp, which is quite CL-like in some places and deliberately so, I used the names succ, ssucc, and sssucc for adding 1, 2, 3, and 4. The inverses are pred, ppred, and pppred.
These are vaguely inspired by Hofstader's S0, SS0, SSS0 ... in Gödel, Escher, Bach as well a by caar, cddr, ... plus the dim memory of operators called succ and pred in Pascal).
It is a misconception that incoming MIT freshmen know programming. Some of them might (and a few of them will be world class programmers), but these classes are designed for people who don't know programming, at all and believe it or not great majority will be people who never coded anything. I TA'ed SICP in both MIT and Berkeley (they have a pretty similar class derived from original SICP book, some parts of it is in Python, some in Scheme, some in SQL) and most students believe these classes are for geniuses or for people who already know programming. Wrong, the whole point of SICP is to teach it, and once students try hard they see for themselves that they can learn programming.
That's true, but all of them have/had a lot more "mathematical maturity" than most programming 101 students today (who are often middle/high school students, university students who didn't do particularly well in high school mathematics, or even independent learners coming to programming from non-STEM backgrounds).
SICP is not an introduction to programming as much as it is an introduction to computer science.
I mean, one of the key lectures is about differential calculus. Do you realize that at most universities, CS 101 students are not assumed to have taken calculus. Hell, a large fraction of CS 101 students will NEVER take calculus (non-majors who will instead opt for college algebra).
But that example itself is actually more of a red herring. The point is that the mathematical maturity does provide a lot of extremely useful background thinking/problem-solving skills that most CS 101 students haven't yet developed and will be developing for the first time in CS 101.
Self-study SICP without any previous programming experience would be exceedingly tough.