What would you put in a Computer Science Curriculum?
Dan Zambonini wrote a cool paper: What would you put in a Computer Science Curriculum?
His premise is as follows:
We get a number of resumés trickling through every week, with a fair proportion coming from Computer Science graduates. I look at the list of modules they’ve studied, and although they sound very interesting, there seems to be little relevance to the current jobs market.
Again, the problem is that there is confusion between Computer Science and what either Information Technology or Software Engineering: degrees in either of those prepare you for the job market, a degree in Computer Science doesn’t. Or at least, not in the way Dan expects.
This sets aside, his list of requirements for what could be described as an Applied Computer Science degree is interesting:
- The basics of Programming (variables, data types, references, pointers, scope, error handling, iteration, core algorithms – searching, sorting, etc.)
- Basic mathematics, basic statistics
- Patterns and Anti-Patterns (With real world examples, not just theory)
- Real world Databases (Normalisation and De-normalisation, SQL, Indexing)
- Basics of good code architecture: Loose Coupling, etc.
- OO Design, Interfaces, etc.
- The importance and tools of Planning: Spec’ing,, UML etc.
- Architectures: client/server, SOA, P2P, etc.
- A ‘Big’ language or two (Java, C#, C/C++)
- A scripting/’agile’ language or two (PHP, Perl, Python, Ruby)
- XML (DOM/SAX, XSLT/XPath, etc.)
- Economics, Business Studies, Costing Projects, Commercial pressures
- Copyright, Privacy, Data Protection
- Project/Time Management
- Internationalisation, Localisation, Encoding, Unicode
- Grammar, punctuation, concise and clear writing
- Interface Design, Usability, Accessibility, HCI
- Security
- Code Reading
- Common Protocols (TCP/IP, HTTP, SMTP, FTP)
- Testing, Debugging, Performance, Re-factoring
- Problem analysis
- Source control, change management
- The typical Software lifecycle
- Metadata, Information Architecture, etc.
- The basics of GIS
- Touch typing
- Health and safety (nutrition?)
I’m particularly fond of his mention of XML:
And, quite surprisingly, only 1 course mentioned XML, which was in an optional module. Is there any modern software these days that doesn’t use XML? So why can’t computer science graduates tell me when to use SAX and when to use DOM?
Well, Dan, because a) their professors don’t know when to use SAX and when to use DOM b) Computer Science is not concerned with the difference between SAX and DOM, but rather with the difference between building a buffer and not building a buffer when parsing a tree. However, software engineers and information technologists should know when to use DOM and when to use SAX.
(I got this through Ed Bilodeau’s blog.)
Disclaimer: I am one of the few university professors to offer a university-level course on XML (in French).
Montreal, Canada 
Follow on
The discussion is also fairly interesting. The list is good, but most of the items could be a course in themselves. In the 2 years that you’re taking CS classes, there’s no way that all of this would be covered.
I noticed that most of those items were offered as elective classes at my school, yet I didn’t take them. Some looked boring, and some looked like something that I would be able to grok on my own, if I ever needed to learn about them. Maybe there’s something to that.
I can predict many more discussion like this. Hopefully students and universities will get smarter about it.
Comment by didier — 13/9/2005 @ 18:04
2 years? Hmmm… No, I think this is meant for a 4 years degree (US-style).
This being said, I agree that covering all of that in one degree is a lot to ask.
I suspect that Dan would be happy if some of it would be covered. I think what he is saying is that almost none of it is covered.
Myself, I think it is a mistake to assume students can grok all of this on their own quickly. Some of this stuff is really not trivial. You’ll end up on the job market and who is going to teach you? Nobody.
Comment by Daniel Lemire — 13/9/2005 @ 19:15
It is very interesting discussion.
Comment by Yuhong YAN — 13/9/2005 @ 23:08
Daniel, I did mean 2 years: most US programs involve roughly 2 years of classes in general education and 2 years of classes in your proper major.
It’s true: I can’t learn some of the topics listed without spending some serious time on them: security, HCI, networking, OO programming, etc. And there emerging areas that are being neglected in universities but are popular in the industry right now.
I guess that what I was trying to point out is that most of the stuff I see in this list are technology-specific too, and are tied to specific software: source control, xml, UML and building tools like make and ant. I learned about these in my software engineering course and design project. I assume that other CS programs have similar courses where these things are formally introduced.
Comment by didier — 14/9/2005 @ 7:34
I think Dan’s looking for some form of trade school training, setup to get the student “a job”. It’s funny because my own requirements for who I need to hire start with the list Dan puts in the “little relevance” bucket:
neural networks, computer vision, artificial intelligence, robotics, compiler engineering, machine learning, quantum computing, Bayesian networks, embedded systems.
In fact, I’ll hire anyone who got an A in UCSD’s undergrad compiler design on that single fact alone. If you can write a fully functional compiler as an undergrad, you have a job with me. Seriously, I’m hiring, send me your resume.
Maybe my requirements are unusual because we’re dealing with unusually hard problems, but almost on a daily basis I lament that my folks don’t know more classification, machine learning, statistics, more math, more computing theory…
On the other hand, it pains me on almost as frequent a basis just how much people know about the minute details of J2EE and how ready they are to use it in each and every situation, whether it’s called for or not.
Computer *Science* should stay focused on science. I’m not hiring a “Java guy”, I’m hiring an intelligent guy who can pick up whatever language we’re using, along with whatever the relevant protocols and specifications are. Standards and specifications change; fundamentals of computer science don’t (or do much more gradually). I don’t mind what we do with “Information Technology” degrees or training, but please let’s not turn CS into a set of technology certification courses.
Put another way, I can teach a science guy how to use XML on the job, but I can’t teach a Java guy science on the job.
Comment by Parand Tony Darugar — 14/9/2005 @ 11:16
Parand: excellent comment. However, it might difficult for someone with a CS degree to “learn” IT because he will lack some of the business and other soft issues, and no, I don’t think they are easy to pick up.
But should we turn CS degrees into IT or software engineering degrees… no, why do it? Let’s have IT, software engineering, informations systems and computer science be distinct degrees for different people leading to different job.
This is an issue only because people are still confused by the names.
Comment by Daniel Lemire — 14/9/2005 @ 11:22
[...] What would you put in a Computer Science Curriculum? [...]
Pingback by Daniel Lemire’s blog » My most commented posts so far — 2/1/2006 @ 23:45