There’s been a lot of nattering about the usefulness, or lack thereof, of a college-level CS degree to a programmer. The most recent of which to cross my transom, is this post, but I think it all started with a post by Joel. The problem with this debate is that it presupposes three things, all of which are patently false, that:
- Computer science and programming are seperate things, and that it’s possible to know one without knowing the other,
- That it is possible, at least in theory, to teach students everything (or most everything) they need to know in “the real world”, in a reasonable amount of time (four years), and
- That the point and purpose of a CS education is to give you those “real world” skills.
The last point is particularly important, as it raises the question: what is the point and purpose of getting a CS education, if not to give you “real world” skills? The point and purpose of a CS education is this: to teach you how to learn the real world skills you need.
Of course, this is not the answer that either the students or the employeers wanted to hear, as it has several disquieting implications for both.
There was an interesting episode from my days as a CS student to illustrate what I mean. I went to college back in the old days, when men were men, and CS departments taught Pascal. For the first several years of my college degree, Pascal stood me in good stead. And then, one day, I had a shock- not one, but two different courses I was taking required me to know C. Here’s the kicker- there was not one class at the college I could take that would teach me C. Not one. How unfair was that? Their attitude, when the issue was brought up, was “we’ve taught you Pascal, we’ve taught you assembly language- here’s a copy of K&R, figure it out.”
Although I was annoyed by it at the time, in retrospect it was one of the most important things they taught me. Back then, the big important languages were (other than C) Fortran and Cobol. Most of the languages considered important now hadn’t even been invented yet- Perl, Python, Ruby, Haskell, Erlang, Ocaml, Java, C#, all of these were still in the future. C++ existed, but not in a form that most C++ programmers would recognize- no templates, no STM, no Boost. Heck, no exceptions. Even if they had wanted to teach me what I need to know today, they couldn’t- because it hadn’t been invented yet.
This is why it’s impossible, even in theory, to teach the students everything they’ll need to know. Even as simple a question as what programming language(s) to teach them- assume you’re going to be in the industry for fourty years. That means the people retiring this year (at age 65) graduated from college in 1968. Consider how far the programming field has moved in the last fourty years. Knowing everything there is to know about Fortran-66 and Algol-68 isn’t as impressive as it once was.
But the problem goes deeper than that. There is a huge difference in the skill sets needed by different parts of the industry. Let’s take an example- Joel recommends that students cooperate on a big project, like a video game. This is a great idea… if the students all go on to get jobs in the video game industry. If they go on to get jobs working on enterprise apps, they have a problem- they spent all that time learning C++ and DirectX, when they should have been learning Java and SQL. And so on. And what development methodology? Extreme programming and Scrum? Great… until the students get a job at a place doing classical waterfall. Hint, as the new kid on the block, you don’t get to change the entire teams methodology just to be similiar to what you learned in school, right or wrong.
On a finer grain level, every programming shop is different. Even if you hire someone with many “real world” years of experience doing what you’re doing, using the same language you’re using, there is going to be a ramp up cost. They’re going to have to learn the code base, the structure of the team, who to go ask which question of, etc. I call it “learning where the restrooms are and where they hide the paperclips.” The difference is that the “pro” is going to have a much shorter ramp up time than the fresh faced kid out of college. At least, you hope so.
There are fundamentals, concepts and ideas that carry across all software projects in all languages. But an education focused only on the common fundamentals is by definition incomplete- it doesn’t teach you all the non-fundamental stuff you need for a particular project, precisely because that stuff isn’t common with all other projects, elsewhen (or even most projects, most times).
Which brings me to my next point, the idea that computer science and programming are two seperate topics, and that it’s possible (even beneficial) to know one but not the other. I seen the attitude go both ways, but by far the most common is the assumption that you can know programming without computer science. Joel, for example, condemns all of computer science on the basis of one class he took, and dropped after a single lecture. It is a mark of true ignorance to hold the opinion “if I don’t know it, than it ain’t important”. Way to encompass the breadth and depth of the discipline before pontificating on the subject, Joel.
One of the dirty little secrets of computer science is that it’s mostly history. No, I’m not kidding. Pcik any CS book you care to- say, this one, or
In “A Deepness in the Sky”, Vernor Vinge introduced the idea of a “programmer-archaelogist”. I love this idea- because half of knowing programming is just knowing the history. And, as the saying goes, programmers who do not understand history are doomed to reimplement it- poorly. Which means that to a large extent it’s possible to learn a lot of computer science the hard way, just by being in the industry long enough to see things invented and then reinvented. Then you too get to shout out “look, kids- Big Ben! Parliment!” as they go by yet again.
People laugh when I saracastically say “yeah, let’s reinvent the wheel- only this time, let’s make it hexagonal, instead of square- I bet we’ll get a much smoother ride that way!” But then someone new comes along with a brand new language, still using reference counting garbage collection because they haven’t read this book yet, and don’t know what’s already been done. Or don’t care- and I’m not sure which of ignorance and apathy is the more damning indictment. The truth of the matter is that the vast majority of programmers are reinventing wheels simply because they don’t know that it’s already been invented (and fire and agriculture!).
Personally, I blame it on Microsoft. In order to sell you a new box of bits every two years, they have to first convince you that the box of bits you already have is somehow worthless (as opposed to two years ago, when it was obviously worth a great deal). This gives rise to the myth of permanent revolution. You’re still using that old, obsolete, two years ago peice of software? Get with the now, baby- that archaic crap is so five minutes ago. It’s all different now- dump that old stuff and buy all new stuff!
True story- a couple of years back, there was a question posted to slashdot. The questioner was taking a course in compilers, which the professor was teaching out of this seriously old and antiquated text book, and what textbook should they be using? I was halfway through a response that the correct textbook to be using was the dragon book, when I noticed that was the book in question. The kid had assumed that since the book had come out 12 years ago, it was completely invalid, and how we’re building compilers these days is completely different.
The truth is that programming advances, when they happen (and we’re not just happily going in circles), is an agglutinative process. New ideas build on old ideas. There is a lot of interesting stuff going on in compilers, but to understand them, you need to know the basics, the history.
The other part of computer science is adding new ideas- in some sense writting new history. This is the point where the hard-nose realist programmers start jumping up and down, screeching, and hurling feces. The ideas the academics come up with are “pointless”, “worthless”, even “academic” (pity the culture that uses “smart” and “wise” as insults). They have no relationship to the real world, and real programmers.
Let’s investigate that, shall we? Over in the Java camp, the big debate is over including closures into the language. The C# people, meanwhile, are congratulating themselves over following SPJ’s advice and ditching the scary M-word when introducing Linq, and starting to look at transaction memory. And so on. Where do these ideas come from? Academia. To the extent I’ve been able to determine, that the industry as a whole has managed to make any progress at all (as opposed to just continually reinventing the same bad ideas), is due primarily due to the academics.
Yeah, there have been a lot of bad ideas academics have come up with over the years. So? Two words for those who beleive that industry isn’t guilty of exactly the same problem: Microsoft Bob.
No, the academics don’t productize their work. And maybe, just maybe, that’s a good thing. Maybe that isn’t their job. Think back to the question I raised earlier, as to what language you could have taught students in 1968 (the one retiring now) that’d still be relevent today. There is one- Lisp. The least pragmatic, most theoretical, most academic language of the era. When garbage collection became the “in thing” back in the 90′s, the people who knew Lisp weren’t surprised. They’d been using garbage collection for decades at that point. And closures aren’t foreign to them either. It seems to take a couple of decades for the academic idea to become sufficiently distanced from it’s academic origin for it to be acceptable to “real world” programmers. Studying computer science now gives you a several decade leg up.
All you have to lose is your ignorance.
Related posts:
Pingback: Binary Code » Two Thoughts on Computer Science Courses
Pingback: Simmoril’s Domain » If It’s Worth Having, It’s Worth Working Hard For
Pingback: Enfranchised Mind » What Good is a CS Degree II: The Response
Pingback: Paper Trail » Blog Archive » In Defense Of Computer Science
Pingback: Value of computer science degree « Randomicity’s Weblog
Pingback: Scott’s Blog » Fixing Computer Science
Pingback: Enfranchised Mind » Jeremy Pavleck on Updating Technical Skills (with Graphs!)
Pingback: Encephalosponge » Blog Archive » The premise of education
Pingback: Enfranchised Mind » But what is it good for?
Pingback: Upped The Recent Post/Popular Post Widget Count | Enfranchised Mind