The Failure of Undergraduate Computer Science Programs

Posted on: Thursday, Oct 29, 2009

I started my college career as a Computer Science major, with some basics already under my belt and an eagerness to learn “complicated, college-level programming”.  By December of my Sophomore year, I had finished the lower-division CS courses, but was left unimpressed.  Most of them were clearly designed to be “weeder courses”, classes forced on the students for the express purpose of encouraging people to drop the major.  This is a common strategy for CS, which is easy to complain about, but definitely has its merits.  The problem is these complex concepts should be taught, not buckshot down students’ throats by inarticulate (but tenured) professors.  I had one, single college CS professor that was a good teacher.  Scratch that, a great teacher.  He taught us SPARC Assembly programming, about as low-level and dry as you can get, but he made it interesting!  You still had to have the brain power to grok it, but you actually went to class to learn, not because it was a masochistic exercise.  Sadly, his great teaching was the exception to the rule.

At the time though, this didn’t strike me as strange.  As a Freshman in college, you take the status quo for what it is.  “This must be how it’s done,” I thought.  My true disillusionment came when working on a side project of mine, with several Seniors in the CS department.  They could crank out code, yes, but it was buggy, poorly documented, and only version controlled because I wouldn’t look at it if it didn’t come from our CVS tree.  These were students finishing up their degrees!  I decided if that was the education I could expect, I’d be better off switching majors.  I could use my side projects to expand my programming knowledge, and get something different, but useful out of the official classes.

As it turns out, I wasn’t wrong.  Earlier this week, noted programmer Joel Spolsky wrote the following:

“It is amazing how easy it is to sail through a Computer Science degree from a top university without ever learning the basic tools of software developers, without ever working on a team, and without ever taking a course for which you don’t get an automatic F for collaborating. Many CS departments are trapped in the 1980s, teaching the same old curriculum that has by now become completely divorced from the reality of modern software development.

Where are students supposed to learn about version control, bug tracking, working on teams, scheduling, estimating, debugging, usability testing, and documentation? Where do they learn to write a program longer than 20 lines?

Many universities have managed to convince themselves that the more irrelevant the curriculum is to the real world, the more elite they are. It’s the liberal arts way. Leave it to the technical vocational institutes, the red-brick universities, and the lesser schools endowed with many compass points (“University of Northern Southwest Florida”) to actually produce programmers. The Ivy Leagues of the world want to teach linear algebra and theories of computation and Haskell programming, and all the striver CS departments trying to raise their standards are doing so by eliminating anything practical from the curriculum in favor of more theory.”

(excerpt from Capstone projects and time management, 10/26/09)

If you haven’t heard of Joel, he’s one of the top programmer-bloggers in the world.  If your job in any way involves programming or working with programmers, I highly suggest you start reading his stuff right now.

Clearly, my observations of the CS program years ago weren’t far off the mark.  Learning the detailed theories is incredibly useful, but almost worthless without the practical knowledge to go along with it.  Heck, even something as simple as version control would be stupidly simple to incorporate into the curriculum.  Example: “Whatever you have checked into your SVN project trunk at the time of the deadline is what you’re graded on.”  Wow!  That wasn’t hard at all!  But do the universities do this?  It’s almost 2010, and the answer is still No.

This is why the vast majority of companies want people with “3-5 years of experience”.  Having a CS degree fills a checkbox, it’s not 4 years of experience.  If a student relies solely on their university for their education, they’ll end up with a sheet of paper that says they’re Great(tm), but they won’t know the first thing about actually building a real software product as part of a team.  The company that hires the inexperienced new grad then has to pay the price of teaching them what they should have learned in school.  Only the kids that get great internships and/or work on side-projects, anything outside of school really, come out with practical knowledge.

When CS grads tell me they’re going to develop their next web app by emailing and FTPing files around, I used to want to smack them.  Now I know, I should go smack their teachers and departments.  Come on slackers, you can be better than this!