Technicians or Versatilists?
Joel Spolsky had an excellent post discussing his views on restructuring CS programs in colleges to be more attractive to potential students and produce better programmers. His Bachelor of Fine Arts in Programming curriculum includes more project and software lifecycle work, plus some liberal arts classes, minus some of the more advanced theoretical topics typical to CS programs.
I love the sound of this program as I really enjoyed a similar program at my college where I took liberal arts electives and got to do a decent amount of project work my senior year (and a lot of it in a part time job during my junior and senior years). I did have to take some of the more advanced theory classes and learned from them, just not too much that I've had to apply in my everyday work.
Joel got on this topic by referencing an article in Crosstalk, the Journal of Defense Software Engineering which is revealingly titled Computer Science Education: Where Are the Software Engineers of Tomorrow?
I would sum up the article as follows: the writers use the programming language Ada for projects (presumably military related) where security and reliability are paramount. Large frameworks and external libraries are mostly useless to them in this environment. They cannot find as many recently graduated computer scientists as they would like to fill these jobs because the type of programming involved is very math intensive and low level. What is to blame for this shortage of qualified individuals?
... Java has become the most widely used language in introductory programming courses. We consider this to be a misguided attempt to make programming more fun, perhaps in reaction to the drop in CS enrollments that followed the dot-com bust.
... The result is a student who knows how to put a simple program together, but does not know how to program.
So, the authors make the opposite recommendation of Joel and suggest that CS curricula be modified to include more theory, more math, a lot of C and of course some Ada if possible.
Which one is more persuasive? Actually, they are arguing past each other. They disagree on the fundamental purpose of a CS degree. Joel wants a graduate to have a wide breadth of problem solving skills, including non-technical ones and project experience, and the Crosstalk authors would like a graduate to have a well defined and deep set of technical skills. Or to put it more simply, the argument is about whether a CS major should be a technician or a versatilist.
As a consultant for a company that takes on a wide variety of types of problems, I come down on the versatilist side of the equation. From a popularity standpoint (i.e. attracting students to a major), I also think the versatilist style as embodied by a BFA in Programming is attractive to more students than an even more technically oriented program. However, when it comes down to it, there is no substitute for good technical skills and we'll always need good technicians.
I think Joel is a little loose in his terminology in saying that:
When I said BFA, Bachelor of Fine Arts, I meant it: software development is an art, and the existing Computer Science education, where you're expected to learn a few things about NP completeness and Quicksort is singularly inadequate to training students how to develop software.
While I may not find it too appealing, the projects that the Crosstalk authors refer to definitely involve software development and I can see why they want people with absolutely excellent technical depth to develop systems for the harsh conditions of a military environment. So, I don't expect the standard CS curricula to disappear any time soon, but I hope colleges follow Joel's advice to start offering more versatilist programs to live side by side with the traditional, offering students interested in programming plenty of ways to explore that interest.