I came across Dan Zambonini’s blog posting “What would you put in a Computer Science Curriculum?” recently. Definitely interesting, but I think he misses the point of a CS degree. It’s not meant to teach all sorts of low-level, specific, real-world tasks. The problem is that for every list of skills Dan can come up with (and a few are heavily slanted towards his specialties, I noticed), I can come up with another that would arguably be just as useful to someone in the “real world” who was trying to get a programming job. The true point of a CS degree is to teach the underlying theory of computation, algorithms, networks, etc. Also don’t forget the Math - all the aforementioned topics require a good understanding of mathematics. Once the erstwhile grad starts working, they can apply what they learned and will pick up what they need over time (and will do it much more quickly then if they went to a “trade school” CS program like Dan describes). Let’s face it - some real-world skills need an understanding of theory, for example algorithm optimization, or crafting a parser while writing a domain-specific language. If you are looking for real-world experience in a college grad, your hiring practices need adjustment, or go ahead and hire someone with an MIS degree, who learned very little math and theory, but plenty of Java - just know that you are getting someone who might be incapable of venturing outside of the domain you hired them for. As one who graduated from a CS program myself (UMASS Amherst), years later I am glad my curriculum included plenty of theory. That’s not to say that I didn’t program - I did plenty of that while I was there, also. My Senior course on compiler design included theory (itself presumed discrete math, the theory of languages and grammars, and algorithm design), but also included a semester-long project crafting a real compiler. It was built up in pieces as the semester progressed, and we learned the parts we needed to continue. To be fair, Dan’s list of topics does include some good basics - like database theory and writing skills. I would be less worried about having experience with language “X”, again, someone well-versed in theory can pick up a new computer language very quickly (This article talks about the flawed way in which many students are taught to “program” - by learning a specific language’s syntax, rather than actually learning to solve problems with computers). If I were hiring a programmer fresh out of a CS program, here is what I would like to see at a minimum:
  • Calculus, discrete math, statistics
  • Technical writing
  • Algorithm design and analysis
  • Computer architecture
  • Theory of Networks
  • Theory of computer languages
  • Theory of computation
  • Some experience with the various types of languages by domain - functional, logic, procedural
  • Database theory
  • Software engineering
  • Computer Security
Technorati Tags: ,

[Post to Yahoo Buzz]  [Post to Delicious]  [Post to Digg]  [Post to Reddit]  [Post to StumbleUpon]