December 30, 2005

Old school

Joel Spolsky demonstrates what he calls his "descent into senility" in a classic "kids these days" rant, about how today's programming courses are too easy because they use Java. He sums it up at the end with a version of the old joke,

A: In my day, we had to program with ones and zeros.
B: You had ones? Lucky bastard! All we got were zeros.

On his way to the punch line, he tells us "Java is not, generally, a hard enough programming language that it can be used to discriminate between great programmers and mediocre programmers". This is in contrast to the old-school courses based on Scheme and C, whose difficulty Spolsky remembers as "astonishing". Spolsky "struggled through such a course, CSE121 at Penn". He tells us that he "watched as many if not most of the students just didn't make it. The material was too hard. I wrote a long sob email to the professor saying It Just Wasn't Fair. Somebody at Penn must have listened to me (or one of the other complainers), because that course is now taught in Java."

Now he wishes that my colleagues in computer science at Penn hadn't listened to him, because he feels that today's Java-based courses don't teach about pointers (which are a central issue in C programming) and recursion (which is central in Lisp). And according to him,

beyond the prima-facie importance of pointers and recursion, their real value is that building big systems requires the kind of mental flexibility you get from learning about them, and the mental aptitude you need to avoid being weeded out of the courses in which they are taught. ...

Nothing about an all-Java CS degree really weeds out the students who lack the mental agility to deal with these concepts.

He compares this to the gatekeeper function once played by Latin and Greek:

... in 1900, Latin and Greek were required subjects in college, not because they served any purpose, but because they were sort of considered an obvious requirement for educated people. In some sense my argument is no different that the argument made by the pro-Latin people (all four of them). "[Latin] trains your mind. Trains your memory. Unraveling a Latin sentence is an excellent exercise in thought, a real intellectual puzzle, and a good introduction to logical thinking," writes Scott Barker. But I can't find a single university that requires Latin any more. Are pointers and recursion the Latin and Greek of Computer Science?

I suspect that the "Latin trains your mind" argument became prominent just when the real practical reasons for a grounding in classical languages had largely vanished, and when obligatory teaching of Latin was therefore under successful attack. In the seventeenth century, an educated person needed to know Latin in order to read the current literature: Newton's Philosophiae Naturalis Principia Mathematica was published in Latin in 1687, and was not translated into English until 1729. But long before 1900, it was difficult to find practical arguments for the role of Latin in career development, outside of Catholic theology and a few areas of history and literature. Latin (and to a lesser extent Greek) had been reduced to the status of a cultural common ground for (the more traditionally-minded strata of) the educated and professional classes, and a barrier to entry into those strata.

And just as Spolsky was wrong in 1987 if he believed that it was the use of Scheme in Penn's CSE 121 that made it too hard, he's wrong now to complain that the use of Java means that such courses now necessarily fail to ground students in foundational concepts such as pointers and recursion. A colleague who has recently taught that course writes:

This is total BS. Java has pointers (has Spolsky ever heard of NullPointerException?), and we spend a lot of time on recursion and data structures, and very little time on OOP terminology. It also demonstrates the cult attitude of a certain kind of programmer, with rites of passage, the chosen and the fallen, etc. We teach in Java because it is the best compromise for a set of conflicting requirements. It's only people who can't teach who rant on about "pure" approaches. Reminds me of a certain kind of academic "radical" activist of my youth.

Well, in fairness to Spolsky, he does lead with a jokey admission that he's descending into senility, and he quotes from the start of Monty Python's Four Yorkshiremen skit:

“You were lucky. We lived for three months in a brown paper bag in a septic tank. We had to get up at six in the morning, clean the bag, eat a crust of stale bread, go to work down the mill, fourteen hours a day, week-in week-out, and when we got home our Dad would thrash us to sleep with his belt.”

(And do read the rest of it, if you haven't done so recently.)

I went to a secondary school where Latin was still required, and I think that I benefited from it. However, that's mainly because grammar, logic and rhetoric are a good foundation for a general education, and careful analysis of admired works in a foreign language is a good way to provide that foundation. My objection to language education today is not that schoolchildren are no longer required to learn Latin, but that most of them are no longer taught linguistic analysis of any sort at all.

I suspect that there's a similar basis for Spolsky's frustration at the quality of job applicants that happen to be coming his way these days. If they can't "rip through a recursive algorithm in seconds, or implement linked-list manipulation functions using pointers as fast as they could write on the whiteboard", it's because they haven't learned the relevant concepts and skills, not because their intro programming courses didn't use LISP and C.

Senility and Monty Python jokes aside, there are some serious and important educational issues here. But it just confuses matters to focus on Scheme and C or Latin and Greek, instead of on pointers and recursion or IPA and parsing.

[I guess I should add that other undergraduate computer science courses at Penn require the use of other languages, including not only Scheme and C/C++, but also OCaml, Prolog, Python and Matlab, depending on what makes sense for the content and structure of the course in question. I believe that this is typical of good computer science programs in the U.S. these days. ]

[Update 1/9/2006: Since some people are still linking here, I'll add a link to a thoughtful post by a current Penn undergrad, and to Bill Poser's terminological disquisition.]

Posted by Mark Liberman at December 30, 2005 04:17 PM