Excellent article. I'm immensely glad and lucky to have had Brian Harvey as a professor, and this echoes exactly what he taught us and the general teaching at Berkeley: that the concepts of programming and computer science were of paramount importance, and that you should understand them in the abstract.
To this day, this is why I value a good theoretical CS education, why I value university education, and why I continue to look back on and use my supposedly theoretical and impractical CS education with great respect.
This is so true: "learning another programming language isn't a big deal; it's a chore for a weekend. I tell my students, 'the language in which you'll spend most of your working life hasn't been invented yet, so we can't teach it to you. Instead we have to give you the skills you need to learn new languages as they appear.'" Can you imagine how valuable it was to be told that from the start?
He's right about scheme too: part of the value of using Scheme or Lisp is its inherent crazy unfamiliarity to the great majority of students. The first thing when you see all those parentheses and weird paradigms is "woah, this is unlike anything I've seen before." And that's perfect. You don't get lost in things you think you already know—you learn concepts fresh and the language, because it's so weird and wild and totally abstract and you can't imagine using it for any real project—is as malleable and temporary as modeling clay. You get to make things with it that teach you about art, and how to look at things, how to see infinity—not about the properties of the materials in your hands.
For this reason among others, it's profoundly disappointing to me that Berkeley has switched their introductory language to Python. As great as it is, it's no Scheme, if only for the fact that its popularity and usefulness as a language detracts from the underlying concepts. I have to think Brian Harvey fought this change, had he not retired and lost some influence.
"Every five years or so, someone on the faculty suggests that our first course should use language X instead; each time, I say "when someone writes the best computer science book in the world using language X, that'll be fine.'"
SICP was, in retrospect, a masterpiece of education. Someone sat down and thought about exactly these concepts and how best to elucidate them without getting in the way of the connections being made. The new trend toward applications-focused education feels to me like the wrong direction, and I don't think I would get as good an education today as I did learning abstract concepts theoretical computer science taught as the most important part.
Sure, it's fun and attractive to think about applying what you learn to the revolution at hand quickly, making mobile apps and designing robots and putting everything together into useful applications, but you can learn all that stuff after a couple semesters of awesome CS core theory anyway. And while you might get frustrated for those 2 years as an 18-year-old hotshot upstart startup-minded student, in 10 years you'll look back on it and think, "wow, that really was the most important part."
Sounds like Berkeley are making a huge mistake and losing sight of what a University is there for. They seem to have moved to a more practical approach than theoretical approach.
This is the type of approach that is more appropriate to a Technical College than a major University. This new approach almost seems like teaching civil engineers how to weld and rivet in order to build bridges, rather than deeply understanding the mathematical theory behind stress and vectors.
The intro courses, while in Python, still use many of the concepts and text of SICP, so it's not all gone. Many of the concepts translate well, and it's not the end of the world or even a slippery slope—I think that would be overreacting.
There's nothing fundamentally wrong with using a newer and more useful language to teach these concepts—after all, as Harvey always said, the language doesn't really matter. However, it's conceding to rationality just slightly, and you're right, a University, especially Berkeley in my mind, is a place where you're free to learn concepts and think theoretically without needing to find a real-world application for at least a couple years. They should keep that as a core value, and I certainly hope they do even as they use more modern languages.
Does MIT even use Scheme for their intro CS courses anymore? Harvey's article makes it sound like they switched to Python when they went from a "curriculum organized around topics" to a "curriculum organized around applications" - it seems to be the trend everywhere.
MIT did indeed switch from Scheme to Python for their introductory courses (though I've heard they still use Scheme in some more advanced courses).[1][2]
However, I recall that a little later some MIT graduate students started teaching their own version of the classic SICP-based course. I can't seem to find a link to it now, unfortunately. I wonder how that turned out, and if they're still teaching it now.
Brian Harvey was also teaching his own version of the old CS61A last I heard, but he may be retiring after this year. (I've been hearing about him retiring pretty much since I started at Berkeley 5 years ago, for what it's worth).
Actually switched entirely to Python and Java. In theory a lot of SICP is taught in the 6.005 Elements of Software Construction course, but since it uses Java, to use Pauli's phrase, for that purpose it's not even wrong.
Nope, scheme is still being taught in the "Python class". The final project is writing a Scheme interpreter in Python, so students still get to learn Scheme.
But there are still areas, lets say for example civil engineering, where you need to know about building materials, some physics and math to do your job. In CS, on the other hand, if you know how to put together a few web pages in Python and solve half a dozen brain teasers you may get a job in a very good company.
You're missing my point, which was about priority order.
Most people are going to college hoping to get a job. They're learning because they're told they have to learn, so they do a bad job learning. In a field like civil engineering, you can't graduate unless you pass classes that are simply unpassable without learning some stuff. (I have a friend going through aerodynamics right now and I'm hearing about everything he's learning.)
This is kind of a microcosmic version of what we're seeing in general: we see people as workers first and human beings second. The universities and the kids are following suit.
We created elementary schools. The children who attended them surpassed their peers. Employers began to require them as a signal of competence. Eventually, being such a "universal good", elementary education became a public service of the state.
Then we created secondary/"grammar" schools. The children who attended them surpassed their peers, who had only attended elementary school. Employers began to require a secondary-school education as a signal of competence. Eventually, being such a "universal good", secondary education became a public service of the state.
Then we created universities...
---
Although the inductive step is valid, there's a problem in the assumptions: we already had universities for thousands of years before the introduction of elementary or secondary education!
The traditional "liberal education" of The University, where the upper-class and the cunning go to cloister themselves with one-another and thus boost their mutual productivity in all sorts of status-signalling arts (sounds sort of like TED, doesn't it?) has come crashing head-first into the rising bar of minimum-expected human competence. Success in secondary school no longer tells you anything about a person's class or cunning, and that's forced employers to look for increasingly-lofty-and-meaningless trust-signals. So "everyone who's anyone" expects to go to university now, from the spoilt valley-girl to the farm bumpkin.
Perhaps, in the end, if we want to preserve the "usefulness" of university, we'll chop off the undergraduate portion of it and call that "tertiary school" or something. Everyone gets to go, it occurs at community colleges, probably most of the material comes from Khan Academy and the like. Then the rich and the cunning can go to The University after that.
> No one cares about getting an education. They just want a job.
Internal vs. external motivation?
Maybe some day, when programming is no more needed for anything useful, it can really flourish as an art. Like painting, when its principal real-world reason-to-be was supplanted by photographing.
E.g. I don't understand the obsession of quest to invent always _more and more_ optimal algorithms, because often the less optimal ones are more interesting and elegant.
Honest interest from someone who doesn't know: While I know this is happening at least some other places in the US (it happened to the one I went to and to at least one a friend attended), is it largely limited to this country, or are other countries seeing similar issues?
My university (Helsinki University of Technology) changed the freshman course from SICP to Java in the beginning of the century. The reason was Nokia, who wanted Java programmers straight from the school.
Nowadays they're using Python.
I'm very disappointed I didn't have a chance to study that course. I read the book last year and did some exercises by my own. I never had so much fun with any CS book than I had with SICP.
Nokia. That company just keeps giving. Some universities in Finland fell into that very same trap a second time and moved towards the holy triad of C#, .Net and Windows Phone. Utter shortsighted idiocy
It is the difference between encouraging plasticity (true creativity, etc.) and indoctrination (control), the latter which is considered must, when cranking out armies of soldiers, clerks and corporate programmers.
Thanks for the input. I just started learning Clojure and it's blowing my mind... I felt sorry for some friends in college that started with Scheme but now I'm realizing I missed something pretty beneficial.
"woah, this is unlike anything I've seen before." - it so totally isn't, if you know Ruby and to a lesser extent JS, both popular languages. It's a funky syntax coating on a fairly normal dynamic language, with about three quirks (tail calling, homoiconicity, and call/cc) all of which are more of interest academically than practically.
My university also started off the CS programme with Scheme in the mid 90's when I went, and it was a great leveller. Maybe half the kids had been programming a lot before starting uni, and the other half hadn't, and by starting with Scheme, everyone was at the same level, which built a lot of confidence among the ones that hadn't been programming before.
Five years later or so, the great teacher that ran the CS intro course quit, someone else took over, and switched to Java. Typical. :-/
I don't think "quirks" is the right word for tail calling and homoiconicity, and those are powerful features that I miss in practical situations all the time in lesser languages.
That's an intro course for non-majors. Scheme is use in the curriculum for majors (the 151 course), but it uses the How to Design Programs text, not SICP. The Honors curriculum uses Haskell as its functional language, with touches on some other bits.
On a personal note, I learned using SICP up at Northwestern, but I'd be hard-pressed to justify it to a non-engineering school. Much of the math used in it hits harder on the engineering-style calculus (compute all the things!) than a more discrete math-y style that would be more appropriate for CS programs with a closer affinity to a math department (or schools like the UofC, which does not have an engineering program at all).
To this day, this is why I value a good theoretical CS education, why I value university education, and why I continue to look back on and use my supposedly theoretical and impractical CS education with great respect.
This is so true: "learning another programming language isn't a big deal; it's a chore for a weekend. I tell my students, 'the language in which you'll spend most of your working life hasn't been invented yet, so we can't teach it to you. Instead we have to give you the skills you need to learn new languages as they appear.'" Can you imagine how valuable it was to be told that from the start?
He's right about scheme too: part of the value of using Scheme or Lisp is its inherent crazy unfamiliarity to the great majority of students. The first thing when you see all those parentheses and weird paradigms is "woah, this is unlike anything I've seen before." And that's perfect. You don't get lost in things you think you already know—you learn concepts fresh and the language, because it's so weird and wild and totally abstract and you can't imagine using it for any real project—is as malleable and temporary as modeling clay. You get to make things with it that teach you about art, and how to look at things, how to see infinity—not about the properties of the materials in your hands.
For this reason among others, it's profoundly disappointing to me that Berkeley has switched their introductory language to Python. As great as it is, it's no Scheme, if only for the fact that its popularity and usefulness as a language detracts from the underlying concepts. I have to think Brian Harvey fought this change, had he not retired and lost some influence.
"Every five years or so, someone on the faculty suggests that our first course should use language X instead; each time, I say "when someone writes the best computer science book in the world using language X, that'll be fine.'"
SICP was, in retrospect, a masterpiece of education. Someone sat down and thought about exactly these concepts and how best to elucidate them without getting in the way of the connections being made. The new trend toward applications-focused education feels to me like the wrong direction, and I don't think I would get as good an education today as I did learning abstract concepts theoretical computer science taught as the most important part.
Sure, it's fun and attractive to think about applying what you learn to the revolution at hand quickly, making mobile apps and designing robots and putting everything together into useful applications, but you can learn all that stuff after a couple semesters of awesome CS core theory anyway. And while you might get frustrated for those 2 years as an 18-year-old hotshot upstart startup-minded student, in 10 years you'll look back on it and think, "wow, that really was the most important part."