Brian Harvey: Why SICP matters
eecs.berkeley.edu
eecs.berkeley.edu
I like Python, and use it in industry. Ruby, Go, and C also. In the past, I wrote Common Lisp professionally as well. I do not pine for Scheme or CL, although both had some of their own unique charm. Nevertheless, I think Brian's sentiments about Scheme's clarity in stripping away what can seem to be the 'magic' in programming while maintaining an absolutely rigorous representation that can actually be executed are spot-on. There will be plenty of time in practical work to reintroduce some magic to make practical tasks easier, but there is but a precious few years -- or indeed, just a semester -- to examine the structure of abstraction at its very core.
> Steve Russell said, look, why don't I program this eval..., and I said to him, ho, ho, you're confusing theory with practice, this eval is intended for reading, not for computing. But he went ahead and did it. That is, he compiled the eval in my paper into IBM 704 machine code, fixing bug, and then advertised this as a Lisp interpreter, which it certainly was. So at that point Lisp had essentially the form that it has today...
a shorter version from "History of Lisp" page 9:
> S.R. Russell noticed that eval could serve as an interpreter for LISP, promptly hand coded it, and we now had a programming language with an interpreter.
While this is offered as an excuse for switching away from SICP, I don't like this either.
Programming paradigms are the perfect introduction to programming. First, it naturally teaches you one of the most fundamental concepts in computer science (abstraction) by example; with the SICP approach, you learn about abstractions by constructing your own idioms for abstractions within a programming paradigm!
Second, applications become easier and easier to develop the more one learns to break out of a single paradigm and borrow ideas and tools from each as needed - otherwise, it's easy to get stuck in a rut and miss a simple but elegant solution to the problem at hand. Being able to cross-pollinate features or ideas idiomatic in one language to another gives you a Leatherman instead of an x-acto knife.
Having a fundamental grasp of programming paradigms makes programming languages feel like a second skin, rather than an obstacle sitting between the brain and the binary output.
"Perhaps in time the applications-first approach will spark a revolution as profound as the one that followed SICP, but it hasn't happened yet."
Put the way he's written described it, "a curriculum organized around applications", I don't think it will. You have it right: too many trees, not enough forest.
Does anyone who has taken the new MIT curriculum have any comments?
It was a mighty fine course and text-book. But where's the revolution?
Where are the guys that were taught SICP that went on to do "revolutionary" things?
And if they do exist, how do they compare to a control group that just learned with UNIX/C/C++ and the like?
(Downvotes? I thought we're taking compute SCIENCE here. Where's the science and the proof? If one didn't know any better he would have thought I was stoned for insulting some holy scripture...)
From SICP:
'Underlying our approach to this subject is our conviction that "computer science" is not a science and that its significance has little to do with computers.'
(Don't know about the downvotes or anything. Just thought that was like vaguely funny.)
How true! I hated CS61A when I was in it, and I thought nothing was practical and everything was a trivial example. Sorry Brian! I failed to grasp the depth of all the 'trivial' examples. I never appreciated the complexities of the class until I started being a TA for it, and I never truly loved the class until I lectured it.
Notes, homeworks, etc, available here: http://www-inst.eecs.berkeley.edu/~cs61a/su10/
Spot on. This describes exactly my experience of my Pascal-based course back in 1986 - and it was way more than half. I didn't come across SICP until 10 years later, and it was a revelation, I didn't realise how much more productive an introductory course could be.
And of course, the book is awesome too. And it rewards repeat readings.
[1] http://ocw.mit.edu/courses/electrical-engineering-and-comput...
Edit: Uh, why downvote? Not complaining, just curious; I have done this before for plaintext articles and will do it again, but only if it's welcome.
My experience with SICP is a case of after the fact. I've learned and wrote LISP codes long before touching SICP. The learning process was reading existing source codes and going through reference materials. It's not until I went through SICP that suddenly all these concepts and ideas became so clear.
If everything is always forced to justify itself commercially, then everything will implode into a hideous, hollow caricature of itself. Everything becomes a flashy excercise in deceit and con artistry if it wants to survive. Quality and substance can never hope to win against marketing.
I agree whole-heartedly with what he's said in this piece and hope that others can continue to reap the value of SICP. It's made me a clearer thinker and better programmer.
One might say that SICP is unique in as much as it transcends coding as an act of "slinging code at a screen", pushing readers to think carefully about the nature and design of their programs. That's only a sliver of what it does, but it's ever so easy to miss that as a beginning programmer.
Yeah, it definitely takes discipline to get through, but it's quite rewarding.
"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."
Please!
Because I'm skeptical of the use of transforming SICP into a "tutorial" style. It's the kind of book that you need to read and think about.
Having said that, finding a REPL that's compatible with it can take a little bit of time. Personally I quite like GambitC which I seem to recall is fairly compatible.
& check instructions here: http://www.neilvandyke.org/racket-sicp/
[0] http://www.biwascheme.org/ among many others
Of course, prof. Guttag is really a big-shot and seems like no one could say anything, but I cannot even properly describe how much worse it was than CS61A by Brian Harvey.
It is not just Python, it is ugly Python, boring Python, without any hint of elegance it could be. No list-set-dict comprehensions, which is what makes Python interesting, very few slicing examples and one or two use of yield.
I must say that usage of classes was reasonable - only when there were even a small advantage to structure the code this way, but it is just boring stuff.
Each lecture of CS61 keeps you alert and awake, and curious, time passes unnoticed, and you almost feel how a new connections growing in your brain,) while in 6.00CS you're forcing yourself to to stay alert, almost yawning.
So, if one is engaged in self-education just do CS61A and old 6.001 classic videos. After you can skim trough all those mainstream Python-based courses very quickly with great ease. I can do 4-5 lectures per day.)
http://inst.eecs.berkeley.edu/~cs61a/sp11/
but the lecture webcasts link seems to be broken
http://webcast.berkeley.edu/course_details_new.php?seriesid=...
Macros might be hard to fully understand at first, but the core idea is really simple. They're also extremely powerful: they let you change the actual syntax of a program and give you extremely fine-grained control over virtually everything.
> it is ugly Python, boring Python, without any hint of elegance it could be. No list-set-dict comprehensions, which is what makes Python interesting
I disagree that list-set-dict comps is most of what makes Python interesting. Its meta programming is more interesting IMO.
Not implying at all that Scheme has no meta programming or lacking meta programming. Instead I'd argue it's more powerful than Python's.
Please don't attempt to rebut with Real World Haskell, unless you have read the book and gone on to build a widely deployed application.