Do We Need A New Kind of CS Degree?
Joel Spolsky suggests that we should have something called a BFA in Software Development. That is, a Bachelor's in Fine Arts focused on creating software. I think he's onto something. I've called for something similar in the past. Presently there are two sorts of degrees that seem to be offered in the market. There are what I call IT degrees that are designed to help a person operate in the information technology field. They teach database programming, visual basic, web design, etc. They don't generally teach hard-core programming. There are also the traditional CS degrees which are geared toward doing research in computer science. Their roots in the math departments of old show and there is a strong emphasis on proofs and mathematical modeling. There is a need for a 3rd option. What Joel calls the BFA in Software Development and what I called Software Craftsmanship is a degree that teaches someone the art of programming. The graduate from a CS school knows how to prove the correctness of a for loop and can characterize an algorithm as NP-complete, but doesn't have much practical experience. There is a certain class of person that shys away from the math required for a CS degree today but who would make a great programmer. Mot of the time these people take a few classes and then quit school to fend for themselves on the open market. If we offered a program that taught better programming techniques focusing on different sorts of languages, longer-term projects, more design patterns/oo, debugging, testing, etc., I think we would find the uptake to be solid. There are a lot of people that want to program but don't want to do research. They also don't want to be a DBA in the back end of some giant corporation. Today, there is no program at the college level for a person like this.
As a counterpoint, several professors are claiming that today's CS programs aren't mathematical enough. I see their point. There are places that need more formal methods. The lack of a BFA in Software Development is probably partially at fault here. CS programs are becoming watered down because students don't want the formal methods. Perhaps splitting the CS degree into CS and SD would help create a pipeline of those who are trained in formal methods and also create a pipeline of those who are trained in creating working software in an efficient manner.
The authors also attack the use of Java as the first programming language. Joel also wrote an excellent post about this a couple years back. This is something I can support. Java is too easy. It's a fine language for writing production code, but it doesn't force the programmer to understand the underlying computer. It hides too much of what is really going on. This means that when the abstraction leaks, those who have only learned Java don't know what to do. They don't understand pointers and memory. They haven't had to write low-level programs of their own and don't understand how those parts might be doing things. They don't interact closely with the OS and don't understand what it might be doing which is causing problems. Anyone who learns to program in C or C++ can learn Java (or C#). The reverse is not true.
Comments
Anonymous
January 09, 2008
The comment has been removedAnonymous
January 09, 2008
Hey Steve! I think this is a good idea. CS degree is more like a doctorate and an SD degree would be like a nurse-practitioner. It's really just a matter of what people want to get into. Right now the "nurses" in software really don't have a validating degree. The nurse-practitioners could also take on some additional requirements such as using photoshop, doing technical writing etc. The CS degree would be all about OS-level development, mathematical correctness and maybe even involve exposure to chip design. The CS degree of that sort is what UW teached when I got my degree there. The SD/nurse degree is what Business/IT department taught.Anonymous
January 09, 2008
@Mike, I think you have the SD degree wrong. It's not what is taught at Business/IT departments. It's hard-core, but about programming, not about formal models. It would be OS courses and Database courses and Compiler courses, just not computational theory courses. Let's take an example from UIUC. The security courses there teach a lot of formal proof methods. They don't teach about buffer overflows or cross-site scripting. Yet most people doing real security work today are worried more about implementaiton problems than provably correct algorithms. We teach people to invent AES in a CS program, but unfortunately, we aren't teaching people to implement it. We need to do both.Anonymous
January 10, 2008
The comment has been removedAnonymous
January 14, 2008
The comment has been removed