Yesterday Roger referred me to Joel Spolsky’s Law of Leaky Abstraction, which (and the mentioned Back to Basics) I read , and today I read his The Perils of JavaSchools, a great piece on the “dumbing down” of CS curriculum by switching to Java from “harder” languages like Scheme, and avoiding topics like pointer and recursion. He says:
You need training to think of things at multiple levels of abstraction simultaneously, and that kind of thinking is exactly what you need to design great software architecture.
I followed a link in the article to another great piece Beating the Averages by Paul Graham, where the original programmer of Yahoo Store described how they created a web store builder in LISP. He calls those “easy” high-level language Blub, and says:
As long as our hypothetical Blub programmer is looking down the power continuum, he knows he’s looking down. Languages less powerful than Blub are obviously less powerful, because they’re missing some feature he’s used to. But when our hypothetical Blub programmer looks in the other direction, up the power continuum, he doesn’t realize he’s looking up. What he sees are merely weird languages. He probably considers them about equivalent in power to Blub, but with all this other hairy stuff thrown in as well. Blub is good enough for him, because he thinks in Blub. … By induction, the only programmers in a position to see all the differences in power between the various languages are those who understand the most powerful one.
This is very enlightening. I remember a few painful days when I had to deal with LISP when I took an AI course back in UIUC. It’s nothing but Lots of Infuriating and Spurious Parenthesis, that’s exactly how I felt. Seems like I missed out a lot. Graham quoted Eric Raymond saying:
Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.
Both Spolsky and Graham mentioned basic CS stuff like lambda calculus and lexical closure. Wish I’ll have time to learn those things.
If teaching in Java is dumbing down CS student, is the whole automated code generator thing (e.g. in Model Driven Development) dumbing down the whole programmer profession?