ast month, Computer Research Associates released their annual Taulbee Survey
(of North America's computer science programs. According to their numbers, enrollment declined nearly 20 percent between 2002 and 2003.
Predictably, the survey inspired some hand-wringing among software pundits and department chairs. Most attribute the decline to economics. With the bursting of the dot-com bubble and growing concerns about overseas outsourcing, many students see a dim future in software.
That's what bothers me: A financially motivated drop in enrollment implies that the surge of previous years had the same root cause. For a while I hoped that an increasing interest in the actual building of software meant that geek culture was going mainstream. Maybe people stopped thinking of programming as a weird little niche for weird little people. My own (slightly defensive) interpretation of the statistics goes like this: Who wants to work with a bunch of nerds all day if sales reps earn just as much?
To its credit, tech culture turned "geek" from an epithet into mark of pride. But embracing the technophile identity has alienated potential converts, and trained developers to think almost exclusively in acronyms. Until non-programmers have a better idea what it is we do, money will remain the primary reason for entering the field. People who find they actually enjoy programming will remain happy accidents.
The Wrong Motivators
Like a lot of my generation, I started programming almost by mistake. Encouraged by the newly forming dot-com bubble, I applied for my first job a couple years out of collegeunder the impression that all "computer guys" got an office, a pinball machine, and stacks of money. My qualifications included a single undergraduate computer-science course and a full set of fingers and toes.
| There's something permanent-feelingalmost Platonicabout a really good algorithm or object model, something universal, like a theorem, or a symphony.|
To my continuing surprise, they gave me the job. But I arrived for my first day with trepidation, half-expecting ceaseless drudgery and rain-man-type co-workers. Programming had that kind of reputation among my friends. One even asked me, did I really want to be a "code monkey?" As it turns out, I did. And although my fantasy of retiring before my 10th high-school reunion didn't materialize, I found an intellectual challenge, a creative outlet, and another thing I never expected: beauty.
That sounds strange: "beautiful source code." At first, aesthetic source code makes as much sense as a pretty oil rig or a nice-looking chemical plant. But I'm not talking about superficialities here. It's true that everyone's programming is different, identifiable even. White space and sensible variable names contribute greatly to the readability of a block of code. But good code is beautiful on a much deeper level. There's something permanent-feelingalmost Platonicabout a really good algorithm or object model, something universal, like a theorem, or a symphony.
Take sorting for example. Out of the myriad ways to order a list sequentially, some are prettier than others. Freshmen typically learn the Bubble sort first, which isn't without charm: It's easy to implement and easy to understand. But it's also somewhat naive, a little bit tacky, and works much harder than it needs to by comparing every element to every other (O(n²) for the mathematically inclined). Most offices have a great martyr, someone who works really hard all day long (you know because he talks about it constantly) but doesn't accomplish more than anyone else. The bubble sort is the workplace martyr of the algorithm world.
The Quick sort on the other handnow that's elegant. The idea here is to reduce the number of unnecessary comparisons. And the result is a… well… quicker sort ( O(n logn) ), without adding much code or complexity. Of course the Quick sort is typically much faster than the Bubble sort, because it's more efficient. But it's no stretch to call the Quick sort smarter, classier, and more elegant than its hardworking counterpart.
You might object that all this talk about "aesthetics" and "beauty" obscures the real issue. And it's true that all the virtues of sorting algorithms can be distilled into more concrete qualitiesperformance in this case. But just because the Quick sort is actually fast doesn't make it any less beautiful. The very best developers have at least this in common: They can think at higher levels of abstraction than the rest of us. So think of aesthetics that way. Aesthetic language gives us an evaluative abstraction, a way of talking about the quality of an implementation or a design beyond just a ruler and a stopwatch.
Good Luck in Accounting!
It's easy for a programmer to get lost in the technology. When we talk about XML, JavaBeans, and correlative subqueries, it's easy to understand why non-developers feel intimidated. But the fundamental appeal of programming isn't quite as esoteric as some might think: It's an expression of human creativity and intellect. Almost 40 years ago, Donald Knutha founding father of software engineeringwrote that "the process of preparing programs for a digital computer is especially attractive because it not only can be economically and scientifically rewarding, it can also be an aesthetic experience much like composing poetry or music."
So to all the young people who opted out of computer science programs these last couple of years because we can't pay you enough money, I say this: We didn't want you anyway, you bunch of quitters. Fine. Go be graphic artists or junior managers or analysts or something.
Oh. This too: You might be missing out.