Thursday, January 24, 2008

On Computer Science Degrees

I graduated in 1996 from a fairly prestigious computer science program. It took me 5 and a half years to get the degree, which only put me about nine months behind the average CS student (and that was having a wife and two kids by the time I graduated). Through most of my degree, I was also punishing myself extra by working full time (to support said wife and kids). There were days that I wanted to call professor:sleep(infinity). on my professors, not the least of which because I knew I'd never be using this stuff in real life. Now, nearly 12 years later, I can honestly say that I was SO wrong.

It is now interesting to look around at the debate that seems to be raging about whether Computer Science degrees are useful, whether a more vocational approach should be favored, and whether anything learned in academia is valuable to those of us who build software instead of write papers for a living. To get a feel for the argument, you can see What Good is a CS Degree, No Disrespect, and The Perils of Java Schools. The choice of blogs here is intentional. I admit to my bias: Computer Science degrees are essential, and, furthermore, as Joel says, they have to be hard. Unless your desire is to be a technician.

Now, the caveat in there is that if all you have is a CS degree, with nothing else on your resume, you better have one-heck of an interesting project that you worked on in school. I've been involved in hiring through most of my 14 years of real-world experience and I've found two things to be generally true of people with a good CS degree:

People with a Good CS Degree Can Solve Problems

Computer science is about abstraction, in many ways. In fact, if you look at any given running system, you will see many layers of abstraction: From the bottom up, the OS abstracts the hardware and the run-time abstracts the OS. Coming from the other end, you generally have requirements that abstract a business need and a DSL (or an API...same thing) that abstracts pieces of those requirements. Sitting in the middle is the application: the domain of the programmer. And one thing that computer science programs are good at doing is teaching people to think abstractly.

Unfortunately, this is not the end of the discussion. If it were, there would be no debate. That leads us into my second finding:

People with a Good CS Degrees Cannot Always Code

I remember interviewing a recent graduate from a reasonable computer science program. He had recently been awarded his Master's degree. He was a good thinker, but it became increasingly clear in the interview that all he could do was think. He didn't have a shred of code in him.

Coming out of a computer science program expecting to have all of the bases covered is not realistic. The CS degree gives a very solid foundation, but it is still only a foundation. Unfortunately, because of experiences like mine above, I won't take a CS degree as evidence alone that you will be able to learn to develop software. I want to see that you have really coded, either in a part-time job or internship, in a real project at school, or a personal or open source project. I'm not looking for perfect code (I still haven't found my own perfect code); I'm just looking for proof that the rubber has met the road somewhere.

My final observation about this:

Sometime, Somewhere, You Will Need It

I can't count how many times I said, "I'll never use this." Like I'm ever going to write a compiler. Sure, I'm going to write an operating system. The only people who will use probabilities are the people teaching them. Whine, whine, whine. I freely admit it. I also regret it.

You see, I did write that compiler - it was a DSL for doing SQL-like queries against a content management system.

Oh, and I did write that operating system - it was a scheduler for a game.

And, yeah, about that probability class - I'm now learning all about searching and relevance ranking.

Sure, I never had to go "all the way", but the classes didn't teach that anyway. The classes laid a foundation. They showed me the toolkit I have available. And, to date, while the interfaces to the tools may have changed somewhat (rubber instead of plastic handles), the toolkit hasn't really evolved that much in that last 10 years. I'm not seeing anything to indicate that it will be changing much in the next ten.

Fortunately, so far, I'm doing OK (I think) even given the things I never thought I'd use. With hindsight now, I wonder how much better off I'd be if I had embraced it and said, "I wonder how I'll be able to use this," instead of complaining that I never would. Remember, programming is an abstraction. Among all the other abstractions above, it is also an abstraction between what needs to be done and the best way to get it done, and that is what the Computer Science degree is all about.

No comments: