In my mind there are three different types of programs you might find when looking for CS or CS-related degrees. When choosing a school to attend, it is important to understand what their focus is going to be. If what you want out of a program doesn’t align with what they are teaching, you’ll run the risk of dissatisfaction. I’ll call the three school Computer Science (CS) , Software Craftsmanship (SC), and Information Technology (IT).
The first type of school is probably the oldest. Most degrees will be offered with this title although some are offered as Computer Engineering. The focus of these programs is to prepare you for research. They’ll cover a lot of the theory behind computing (predicate algebra, complexity theory, computational theory, etc.) and the practical classes will often be more survey than in depth practice. Many times you’ll find these schools don’t focus much on the quality of the coding you are required to do.
The second type is the hardest to distinguish. I use the term Software Craftsmanship instead of Software Engineering because schools like Seattle University offer Software Engineering degrees that are similar to, but not quite the same as what I have in mind. That program appears to be more about software development systems management than programming. This school is teaching you to go into the industry. They teach what is needed to be a systems programmer. The focus will be on knowledge that can be applied. This means a little less math and a little more programming. This sort of program doesn’t ignore things like algorithm complexity (because that is useful), but perhaps does so in a manner that is more programming-centric rather than math-centric. Operating systems, compilers, graphics, etc. are all classes you should expect to take. One school which set out explicitly to be of this sort is Northface University (now called Neumont).
The third type of program I call an IT degree. This is most often offered by community colleges, commuter colleges (like City University), and low-end state colleges. It’s not exclusive to these sort of schools, however. These programs are designed to be practical, but in a different way than the software craftsmanship. The focus is on those skills needed to work in an IT shop. That means, the sort of place where you implement back-end line of business software and/or support it. They teach a lot of SQL, Web development, networking, etc. Usually these schools will teach operating systems and algorithms, but not at a very deep level.
It is my assessment that most schools teach either CS or IT and that a very large number of students take the wrong sort. No that many students start into school and want to do research in computer science. Most want to apply it. If you want to work at a software development shop, the best fit is a school designed to teach software craftsmanship. Unfortunately, not many schools offer this. Why is this the case? I suspect it has to do with the roots of computer science. When computers were new, the first programs offered in academia were offered in math departments. This is responsible for the math-bias of most CS programs. Professors are rewarded for publishing research, not for implementing working programs. This means that they teach what they study. I.e. they teach for research because that is their focus.
Most people graduating with a CS degree are not really ready to contribute to business. They don’t understand testing. They aren’t very good at debugging. They have never been required to write maintainable code nor to maintain someone else’s code. There’s a steep learning curve in your first job. It doesn’t have to be this way. We could spend more time teaching people the art of systems software creation and less time teaching them how to prove that their for loop will exit.
I tend to think more programs should offer a software craftsmanship focus because that is what most people attending the schools will be doing when they graduate. I’m sure there are many who disagree though. If you are one of them, let me know what I’m failing to take into account.