Science fiction writers like to write in trilogies. Who am I to argue with the greats? This week, I’d like to conclude my analysis of the CS undergrad with a theoretical discussion of what I would rather see occur in the undergraduate curriculum. Interestingly of note, Dan Zambonini of O’Reilly (probably my favourite CS book publisher) had an entry in his blog on this topic . I may borrow some ideas of his.
As Dan put it there is a mismatch between education and skills. I couldn’t say it better myself:
Part of this mismatch (between education and skills) could be caused by the misguided notion that 'Computer Science' graduates don't necessarily go into 'Software Engineering', so are taught a more scientific approach, rather than vocational. However, the Computer Science graduates I know have software/programming careers, not science.
As Dan also points out, many universities try to attract CS majors with the potential of game design. While games are fun and game programming is challenging, the jobs aren’t all there, and it gives graduates a strong sense of false hope to think they’re going to get a career in game design because they concentrated on it in college.
The future of CS majors in my opinion should be a Computer Science/Software Engineering basis. There are two main problems: (a) the courses being taught are frequently outdated and (b) the curriculum does not contain much software engineering practice.
First, let me start by stating the courses I think need to be totally rethought: The entire progression from Discrete Mathematics to Theory of Computation to Programming Languages. These courses teach students an introduction to functional programming languages. First, they’re taught in scheme, a language invented for and used only in the classroom. I don’t think courses should ever use a language for more than an example or two that is developed solely for educational experimentation. A more modern approach such as “ml” would be been more helpful to students, as would a more detailed explanation of what a functional language is, and WHY we’re solving problems using one. As far as I can tell, very few students gain any useful skills from any of these core courses. These courses could be accomplishing much more with a better foundation.
Second, what is taught is too impractical. Operating systems may teach students a few system calls in C++, but it fails to really teach much about modern operating systems. We need courses on modern tools. We need web-programming courses (as far as I understand we have one currently being taught). We need courses in more than just scripting languages and basic database design. We need XML, DOM, XSLT, CSS. We need more theory of code architecture: coupling, OO design and interfaces, the importance of planning, specing, UML.
All things considered, I suppose what I’m saying is that much of the QSE concentration I’m taking I believe should be worked into the curriculum. True, we have two semesters of design, but by senior year it’s too late to expect 6 credits of design to teach everything we need to know about process. Process should start the curriculum not end it.