Tuesday, March 17, 2009

I should be happy, but...

Honestly, I don't quite know how I feel about this. "This" being the reported uptick in Computer Science majors/degrees, per the New York Times. Or, in the case of Bachelors degrees, a decrease in the rate of decline, which isn't an increase per se, but is enough to be good news...in a math-y sort of way. (Pssst! That's the second derivative for you folks in Calculus this semester!)

Maybe it's the fact that I'm having a crisis of faith in education--and trust me, that's saying a lot--lately. From my own experience, there seems to be no happy medium between the two flavors of Computer Science education.

In the University version (again, in my experience), you're taught concepts that come into play less than half the time. Honestly, most of my work life revolves around working with databases. The question of whether to use a binary sort vs. a bubble sort or whether the problem is NP-complete just does not rule my workaday life.

In the Tech. School version, you're mainly taught how to use the tools and the ins and outs of whatever languages the school specializes in. But in my subjective experience, you're largely left to hack out a solution with little thought for the underlying algorithms--assuming you even come into contact with the term "algorithm."

Although I have an ever-so-slight preference for the Tech. School version, both systems fall well short of the mark in what I think differentiates even the average developer from the person who's just making a living writing code. Issues of personality aside, three simple questions should be suffice to answer the question of employment offer vs. rejection letter:
  1. Can this person communicate with techies and non-techies?
  2. How well does this person problem-solve?
  3. Does learning new things light this person up?
Point First: Communication. There is no substitute, and after a college degree, no excuse for not knowing how. A higher percentage of your development career will be spent working with humans, not computers. Technical brilliance is not a free pass. Frankly, I have no use for cowboy coders. Seriously. I don't care how brilliant they are. In the long run, they're more trouble than they're worth, even if you have a situation where you can isolate their work. (And that even if they're not prima-donnas.) Sooner or later you'll pay for it in the resentment of their more pedestrian team-mates who who have to color inside the lines week in and week out. (Not to mention--horrors!--document stuff the whole time.)

Point Second: Problem-solving. This is where I feel that both approaches to computer science education fail in epic proportions. Basically, you spend somewhere between two to four years writing new code from scratch. That's horse-hockey. Not to put too fine a point on it, but "software development" is just shorthand for "fixing some idiot's crap code for a living." In a perfect world, every assignment would involve making a borked program work before you're allowed to add your little stamp of individuality via a mind-numbingly boring "enhancement."

Point Third: Learning. Yet again, from my limited experience, I don't think I've once been asked on an application (much less in an interview) what I'm working on in my spare time. Or even what I don't know but haven't made time to learn yet. Honestly, if it weren't for the brutal hours of the industry, I'd love to see college degrees in Comp. Sci. expire unless new coursework is taken. Other professionals lose their certifications without continuing education, and few things become stale faster than a technical degree.

So, as much as I'd like to see a healthier interest in software development--if only to make it tougher for the suits to buy more H1-Bs from our Congresscritters--I hope that the ultimate effect is to re-legitimize computer science as a viable craft. By my algebra, we've mostly lost about a quarter-generation of programmers. That can't be good.