Joel Spolsky has a new essay up on the perils of teaching Java in Computer Science schools. His point boils down to "Java is not hard enough, so the marginal students aren't dropping out."
I say Joel is wrong. Or, rather, he is so right that he is wrong.
Let's start with where Joel is right: Forcing students to learn pointers and functional programming is a good way to weed out the kids who don't have the natural talent to be great programmers. If you are focused on creating stars (or, as Joel is, on recognizing and recruiting stars as employees) you need some way to separate the sheep from the goats, and sheep who have problems understanding recursion are never going to understand doubly de-referenced pointers or continuations.
Let me stop here for a moment and point out that I believe star programmers have a natural talent, something that cannot be taught. And, in the case of stars, the only thing a difficult CompSci program is doing is helpfully mark them as such. Because they have this natural talent they will pick up whatever they need as they go even if they never see the inside of a CompSci classroom!
What Joel wants is for the schools to mark the stars for him. He wants to be able to select from incoming resumes by looking for the appropriate degree, even if it means he is going to miss out on the stars who, for whatever reason, didn't have a chance to go to a fancy school with a LISP programming requirement. (If you read his essay linked above you will note the irony: he expends considerable wordage castigating HR departments who GREP for Java in the resumes.) This is the first reason Joel is wrong.
The second reason is more subtle; the world needs more than the few star programmers we have can give. Yes, if you are hiring Software Architects, Programmer Leads, Systems Programmers, or Tool Developers you need stars. But the world has changed in a fundamental way in the last generation; we are so dependent on software in business and government that, without it, things would collapse. The amount of code that needs to be written exceeds the capability of the stars. (This despite the fact that a star is considerably more effective individually.) You need programmers in the trenches who will never be stars but, given clear specifications and a good software architecture as a framework (created by stars), can fill in the gaps for you.
In fact, I believe just about everyone can learn to program — and should. Let me give you an example based on singing; pretty much everyone can sing and, with a little training, most people can sing fairly well. Certainly some people have a natural talent for singing and will eclipse the rest, but if the world needed singers in every bar and church chorus you couldn't get enough stars to do it. You would need to train mediocre singers and have them sing songs written and made famous by the stars. Furthermore, if you wanted people singing in every business you would probably want some of your sales clerks, dock workers, and wait-persons to be able to sing as part of their job. In fact you would probably want singing taught to everyone in public schools, partially so that most people could sing and partially so that you could identify the future stars early, and encourage them.
Programming should be the same way. To some extent the ability to write small programs and understand how programs work is an essential ability that nearly everyone should have. Yet Joel is right when he says 'dumbing down CompSci' is a bad thing. But he is missing the real point: Everyone should learn some programming and as many people as possible should learn programming to the Java/C#/Visual Basic level. What we truly need (and what Joel is really asking for) is a Juilliard of computer programming.
But, before that can happen, we need to acknowledge that programming stars are born, not made. And, like all divas, programming stars tend to be more difficult personally. This a shift the business world seems to have trouble with. Witness the focus of so many businesses (including Joel's) on CompSci degrees (even dubious ones) over accomplishments in the real world.
And, yes, I am bitter about that for a reason.
I say Joel is wrong. Or, rather, he is so right that he is wrong.
Let's start with where Joel is right: Forcing students to learn pointers and functional programming is a good way to weed out the kids who don't have the natural talent to be great programmers. If you are focused on creating stars (or, as Joel is, on recognizing and recruiting stars as employees) you need some way to separate the sheep from the goats, and sheep who have problems understanding recursion are never going to understand doubly de-referenced pointers or continuations.
Let me stop here for a moment and point out that I believe star programmers have a natural talent, something that cannot be taught. And, in the case of stars, the only thing a difficult CompSci program is doing is helpfully mark them as such. Because they have this natural talent they will pick up whatever they need as they go even if they never see the inside of a CompSci classroom!
What Joel wants is for the schools to mark the stars for him. He wants to be able to select from incoming resumes by looking for the appropriate degree, even if it means he is going to miss out on the stars who, for whatever reason, didn't have a chance to go to a fancy school with a LISP programming requirement. (If you read his essay linked above you will note the irony: he expends considerable wordage castigating HR departments who GREP for Java in the resumes.) This is the first reason Joel is wrong.
The second reason is more subtle; the world needs more than the few star programmers we have can give. Yes, if you are hiring Software Architects, Programmer Leads, Systems Programmers, or Tool Developers you need stars. But the world has changed in a fundamental way in the last generation; we are so dependent on software in business and government that, without it, things would collapse. The amount of code that needs to be written exceeds the capability of the stars. (This despite the fact that a star is considerably more effective individually.) You need programmers in the trenches who will never be stars but, given clear specifications and a good software architecture as a framework (created by stars), can fill in the gaps for you.
In fact, I believe just about everyone can learn to program — and should. Let me give you an example based on singing; pretty much everyone can sing and, with a little training, most people can sing fairly well. Certainly some people have a natural talent for singing and will eclipse the rest, but if the world needed singers in every bar and church chorus you couldn't get enough stars to do it. You would need to train mediocre singers and have them sing songs written and made famous by the stars. Furthermore, if you wanted people singing in every business you would probably want some of your sales clerks, dock workers, and wait-persons to be able to sing as part of their job. In fact you would probably want singing taught to everyone in public schools, partially so that most people could sing and partially so that you could identify the future stars early, and encourage them.
Programming should be the same way. To some extent the ability to write small programs and understand how programs work is an essential ability that nearly everyone should have. Yet Joel is right when he says 'dumbing down CompSci' is a bad thing. But he is missing the real point: Everyone should learn some programming and as many people as possible should learn programming to the Java/C#/Visual Basic level. What we truly need (and what Joel is really asking for) is a Juilliard of computer programming.
But, before that can happen, we need to acknowledge that programming stars are born, not made. And, like all divas, programming stars tend to be more difficult personally. This a shift the business world seems to have trouble with. Witness the focus of so many businesses (including Joel's) on CompSci degrees (even dubious ones) over accomplishments in the real world.
And, yes, I am bitter about that for a reason.


Comments
I feel strongly that every educated person should understand the basic outline of quantum mechanics.
"Ok, sure, anyone can learn calculus -- but at what rate?!"
Anytime someone says that everyone should learn something, the person is ignoring two things. First, no matter what you think, not everyone can learn whatever it is you think is necessary to this. It's not that uncommon to be quite literate but unable to do basic math (i.e., liberal arts/humanities majors), a level of logic skills prerequisite to programming. Second, the lives of the vast majority of will not automagically be improved if everyone else learns the same sorts of skills or field of knowledge. This can be more generall stated as, whatever you think that everyone needs to learn, you are wrong. How would a singer's life be made better by knowing computer science, or mechanics, or calculus, or anything under the sun? Maybe it would, but there is no way to know a priori, hence any such statement must be incorrect. Further, if everyone could write code, almost nobody would be paid well to do it because you could always find some sucker who would write code nearly as good but for half the price (not quite Zeno's paradox, but close).
Not to mention the fact that CS is pure logic and, strictly speaking, doesn't require a computer any more than Kepler did to work through 70 iterations to converge on fits for orbital parameters by hand. Or the fact that programming is not the same thing as computer science (yes, the traditional comp sci person's hobbyhorse). Or the fact that I've just thrown out three fragments in a row for emphasis (take that, composition majors!). Computers just make things a lot faster and easier since people have to carry less in their heads while doing so. I figured these things out as a physics undergrad taking leveling courses in case I decided to go to grad school in CS because I'd have arguments with my friend, the head TA for our CS department's introductory classes.
What I am saying is that programming should be something everyone knows a little about, many people can do at a workmanlike level, and a few (naturally talented) folk do as masters of the craft. But that is a shift in the way programmers are viewed and, among other things, requires recognizing that programmers are not equal. And the main reason they aren't equal is the same reason that not every guitar player can be Jimi Hendrix.
CompSci or no CompSci.
Though the stratification of a field, that's sorry to see, because it means stricter credentialization in the future...
But enough with the explicit, let's get medieval. Spolsky doesn't want computer scientists, he wants applied mathematicians. Take his obsession with "fixed point theory", which his description paints as a generalization of the calculus of variations (he even used the word functional, with a different meaning, but failed to have his memory jogged about the mathematical meaning and behavior of functionals -- how's that for your mental agility!). This not something your run-of-the-mill freshmen at the best schools will grasp instantly. Notice that while Sussman's CS Scheme book is a standard at MIT, Sussman's Physics Scheme book is a nice afterthought, i.e., it's a standard at exactly zero schools. Meaning, after having just perused the intro MIT curriculum/format (an "active engagement" scheme, little 's'), I can personally guarantee you that the MIT physics department is not using that book, both because it is Langrangians from day one and because the book would have to be rewritten to be used in an active engagement environment.
And if Mr. Spolsky wants a weed-out course, he should come back after taking a class that uses David Griffiths' quantum book.
And, as to David Griffiths' quantum book, I'm afraid that would weed me out. I often say that I understand just enough math to comprehend the Theory of Relativity, but only enough math to appreciate how I will never truly grok Quantum Theory. (Let's leave aside String Theory for now, I can mentally visualize up to four dimensions but my math and my visualization abilities break down above that. So a lot of String Theory is just hand-waving for me.)
My point? I'm a damn good programmer in general, and I understand object orientation at a deep level in particular. I can use software patterns to design software architectures and APIs. I know how things work underneath the hood, so Joel's Law of Leaky Abstractions doesn't cause me much trouble. I can learn a new programming language or API in a couple of weeks and be more proficient than most programmers who have years of experience with those technologies in a couple of months. But I am never going to be a physicist. That requires a talent I just don't have...
Which is what I was saying.
I'm glad to know that Mr. Spolsky is good at what he does. And if he weren't, I doubt you'd find what he has to say useful or worth commentary, eh? Still, that's what I gathered from his description of what he wants to see coming out a CS program. Mainly I was truly and deeply irked by his implicit message that the world should be ordered so as to make his job easier, which won't extend the same courtesy to the rest of us (which is why I started a separate thread for my assessment of his post, separating it from my commentary on your post).
I don't think we can assume that most people are even capable of learning programming to the Visual Basic level. Heck, I run into people who can't even learn HTML.
I mean, I would have assumed that anyone who wasn't actually brain-damaged was capable of opening up a VB window and changing one word to a different word, or commenting out a single line of code, when they have been given EXPLICIT instructions about what to do. And yet...
Maybe it's generational. I haven't yet TRIED to explain HTML or VB to anyone under twenty-five.
What I meant was that most people (prefereably just about everyone) should learn at least HTML and some Javascript, or to that level with whatever language. And as many people as possible (recognizing that some can't) should learn to the Java or VB level — these are the worker-bee programmers I talked about.
As for the rest? Well, these are the natural talents I mention, and they should learn to the extent of their ability. And they will with or without a CompSci school because people with some talent tend to become obsessive about the thing they have a talent for. (That is one of the signs of having a talent, I think.)