Sucking at CS is a depressingly easy thing to do. If you have trouble with math, logic, or writing, your odds of excelling in computing science are pretty small. If you don’t like pulling things apart until you can see their fundamental structures, you’re in trouble. If you didn’t play with Lego and don’t see why anyone would, you aren’t doing so well.
There’s nothing inherently wrong with sucking at CS, of course. Many disciplines are at least as hard, and as easy to suck at, as CS — math, music, physics, painting, and motorcycle racing are the first five to come to my mind. The world is full of terribly difficult pursuits. Most of the people who excel at these pursuits are deeply and intrinsically motivated to them — you’d no more be able to keep Knuth from writing code than you’d be able to keep Mozart from writing music.
I’m not going to address the question of whether these talents are innate or acquired. One can surely be born with a mind that works well at computing science, just as one can surely develop such a mind through diligent effort. Similarly, mutatis mutandis, with intrinsic motivation.
The problem is that, thanks to the Computer Revolution and more recently the Dot-Com Boom, a thundering herd of otherwise perfectly talented people have decided that an education in computing science would get them a great (or at least stable) job and oodles of money in stock options that might (one day) vest into something more useful than ass-paper. These people are extrinsically motivated, and while there’s nothing wrong with wanting a decent job that might make you an unlikely bazillionaire that wanting isn’t going to make you a competent computing scientist.
I’ve written about this before, of course. Joel Spolsky started the ball rolling (for me, at least) with:
More recently, other people have weighed in, chiefly due to a paper by Robert Dewar and Edmond Schonberg:
- Where Are the Software Engineers of Tomorrow? (original paper)
- Who Killed the Software Engineer? (Datamation)
- Who did Kill the Software Engineer? (Ekinoderm)
In short: we have too many CS students, and most of them suck.
So the thundering herd mentioned above thunders its way into CS departments around the continent, dramatically raising enrollment figures. This is, essentially, Christmas in September for those departments: more students means more money (from the university administrations and, in many cases, the government) and more prestige. It looks great on paper for the department and for the university.
Of course, there’s a problem: most of these students can’t handle the tough and often mindfucking subjects that are central to good computing science — formal languages and automata, propositional and predicate logic, data structures, algorithms, calculus, linear algebra, graph theory, and above all the mental discipline of decomposing a problem into a complete set of mutually synergistic and tractably implementable subproblems (among others). Department administrators can’t allow these students to fail: to do so would damn them just as high enrollments exalted them. The students themselves are rarely motivated to throw themselves into these problems: they just want a good job, not (necessarily) an intellectual challenge, and while the theory of computing science is apposite to their jobs it doesn’t seem immediately “relevant”.
When “relevance” (as measured by reading job advertisements and counting the buzzwords) meets curricular revision (with an eye towards lowering the failure rate), they have drunken monkey sex and the end result is a JavaSchool. Lest you think that Java is the only problem, I’ll quote from the Datamation article:
To sum up Dewar’s argument: today’s college computer science programs aren’t rigorous enough, and don’t promote in-depth thinking and problem solving. Instead, in an effort to boost enrollment, CS programs focus on easily accessible curricula, and so fail to prepare students to compete with their international peers.
One of the article’s main points (one that was misunderstood, Dewar tells me) is that the adoption of Java as a first programming language in college courses has led to this decline. Not exactly. Yes, Dewar believes that Java’s graphic libraries allow students to cobble together software without understanding the underlying source code.
But the problem with CS programs goes far beyond their focus on Java, he says.
“A lot of it is, ‘Let’s make this all more fun.’ You know, ‘Math is not fun, let’s reduce math requirements. Algorithms are not fun, let’s get rid of them. Ewww – graphic libraries, they’re fun. Let’s have people mess with libraries. And [forget] all this business about ‘command line’ – we’ll have people use nice visual interfaces where they can point and click and do fancy graphic stuff and have fun.”
Dumb down the curricula (often at the explicit request of many of the students), and you dumb down the graduating class. You’re still going to graduate some really sharp computing scientists — the sort of people who go on to make a bazillion dollars by applying that recondite CS theory — because you simply cannot stop them from constantly and aggressively improving their art. On the other hand, you’ll graduate a thundering herd of half-assed programmers, who all go out and get jobs at Microsoft and IBM and the like.
You run into real problems when Microsoft and IBM and all their little friends realize that they can hire better programmers for less money by outsourcing their projects to places like India. This doesn’t trouble the really good programmers — they’re all trying to get jobs at Fog Creek or money from Y Combinator or finish their Ph.D. dissertations. It does trouble the thundering herd, though, because they went into CS as a career, not as a productive and occasionally unhealthy addiction.
And just like that, CS enrollment drops through the floor.
“Quick! Enrollment’s dropping! Take out the hard courses! Make CS more fun!“
Those of us who’re into the theory recognize this as a positive feedback loop. It’s not a good place to be. Lower enrollment means dumber programmes means less-employable graduates means lower employment….
The irony of all this is that it’s at best a sideshow to the people who’re inexorably drawn to computing science. Those are the people who drive computing progress and create improbably successful startups every decade or so; they are the people whom the thundering herd seeks to imitate. They’re still signing up for CS degrees, they’re still relentlessly improving themselves, and they’re still doing the vast majority of important, innovative computing.
(And they’re probably still playing with Lego.)

More schools should start separate “IT/information management” curricula for the students who are interested in computing but aren’t capable enough to deal with automata, algorithms etc.
I wanted to be a programmer until I realized I absolutely despised with my entire soul anything to do with algorithms.
Not that I wasn’t good at them. I was. I just wanted them all to die, die, die.
Then I became a photojournalist, and life was much better.
Are really good programmers really trying to get jobs at Fog Creek? Don’t get me wrong–I am a big fan of Spolsky’s writing–but surely, there are more interesting problems to be solved than writing bug-tracking software in .NET?
I agree, except on “the irony of all this is that it’s at best a sideshow to the people who’re inexorably drawn to computing science”. I wasn’t drawn to CS until I took some CS courses in university. Only afterwards I have realized how shallow the CS education really was. So, it is not a sideshow, it is a very sad proposition to those who perhaps naively believe the university CS education as a way to get started in CS.
Oh, BTW, I do agree with the rest of your article. Today’s graduating CS population should only exist as a limited elite subset of what it actually is. However, computing will inevitably become more and more ubiquitous, and we’ll need to deal with more technical problems. Thus, I’m not interested in growing the number of people who graduate with CS degrees, but rather, finding those potentially excellent CS students who were detracted from CS and went on to study physics, engineering, piano tuning, motorcycle maintenance, or what have you. There are many approaches to make CS more appealing to the mainstream–from books like Freakonomics for CS or WYSIWYG application- or game-development tools for kids and non-technical folks. If you have ideas, I’d like to hear them.
I think the best move for a CS curriculum would be to move it towards something almost entirely theoretical. First programming course in something like Smalltalk or Pascal, subsequent courses using LISP and Haskell. Lots of algorithms, math, design and engineering, absolutely NO “practical stuff”. Then, offer a one year after-degree program on current technologies.
This way, graduates come out with the required theoretical knowledge and some experience with things that aren’t four years old.
Light gray text on a white background. This looks nice with lorem ipsum at the design stage but is *ahem* not ideal otherwise.
It’s more like why America sucks at education.
You guys have elite universities, good universities, okay universities and TONS of not-so-good universities.
These not-so-good universities keep popping up bad students.
Besides, what do you expect? everybody to get an A? Bell-shaped curve, bell… bell.. bell..
But anyhow, let’s substitute “CS students suck at CS” with “Most software company sucks except Google, Microsoft, FogCreek” then you’ll figure out that all of us work at a sucky company (^_^)
I shall reply to these comments in reverse chronological order.
Ted: I’m amused that you think I’m writing about American universities. I’ve been complaining about Canadian CS standards lately. (Oh, and you ought to re-read your stats textbooks; the normal distribution doesn’t hold for all statistical populations.)
In any case, I believe you’ve willfully missed my point.
Mr. Diedrich: This ain’t my CSS. You’re welcome to buy me some wordpress.com credits if you’d like me to change it. Still, thanks for your comment; I’ll keep an eye out for a more strongly contrasting (free) theme if I can find one that doesn’t look like ass.
Reid: I favour teaching assembly language (something sane; perhaps 68k) and straight C in the first and maybe second years, followed by Common Lisp and Haskell.
TK: Thanks for your insights, but if you weren’t intrinsically drawn to CS you really oughtn’t speak for those who were. I’m glad to hear that you’ve found an interest in the subject, though.
Adam: Maybe this is just my happy fantasy world leaping out of my brain onto my keyboard, but I imagine that those who are drawn to Fog Creek are less interested in developing FogBugz and more interested in working in an environment where their talents are recognized and catered to.
Mike: I’m pleased to hear that you found a vocation which you don’t hate. Best of luck with your endeavours.
JR: There are plenty of tech colleges around which do exactly that. One of the themes of my rant (which everyone seems to have missed; my fault) is that it’s better to do that at which you excel than to try to wedge yourself into a discipline which you despise.
Thanks for showing up, though, folks; I hope you stick around for the politics. (Except you, “ted”: die in a fire.)
Is it not cliche to always think the generations beneath us are worse than we are. I think software today is a testament to how far we have progressed. Modern systems are much more advanced than anything 10 to 25 years ago and all built by, in your opinion sucky CS students. I’m amazed by how many people think the days of EMACS and VI in UNIX were somehow a testament to being a REAL PROGRAMMER. You can remember all that Automata crap that was shoved down our throats in college, I’m perfectly happy making money.