What is a Computer Science Degree good for?
When I was going to school at MIT about 15 years ago, it seemed to me that most of the people getting computer science degrees and excelling in them were people deeply entrenched in the mathematical concepts of programming such as recursion, pointers, iterative styles, parallel and threading theory. Now whether it was MIT's intent or not, a computer science degree from MIT got you well-primed for doing things like creating your own programming language, solving hard optimization problems such as grid computing, defining your own GUI system, AI and the like, and in fact a lot of people I knew who graduated with MIT computer science degrees did exactly that. Computer Science was not something you took to simply learn how to program. You took Civil Engineering for that. Ironically the class at MIT that taught you C-Programming was offered by the Civil Engineering department, not the Electrical Engineering and Computer Science department.
In Joel Spolsky's article The Perils of JavaSchools, I sensed a bit of snobbery in his comments.
"I've seen all kinds of figures for drop-out rates in CS and they're usually between 40% and 70%. The universities tend to see this as a waste; I think it's just a necessary culling of the people who aren't going to be happy or successful in programming careers."
My first thought, when reading that was, Do you really need a computer science degree to be successful in a programming career, and secondly, should all programming courses be geared for computer science majors?
I took 6.001 (and survived :), the Introductory Comp Sci class at MIT that Joel claims should be what all intro comp classes should be like. I chose to major in Mechanical Engineering, not because I didn't want to be a programmer, but because I did not want to solve Grid theory problems which it seemed that was what an MIT Computer Science education was good for. I was instead interested in the mundane questions of life and wanted the fastest road to get there. Solving problems that would simply bore my MIT Comp Sci counterparts to death really peeked my interest. I was more concerned about building my ping pong game to play with than the poke and peek code I needed to write to get there. While I marveled at my genius to write such a tight piece of code at such a young age, it was more out of necessity than to create a piece of artwork to be admired. My related observation was that as a Mechanical Engineering graduate, I could easily become a programmer that the masses needed, and in fact already was, but as a CS major I could not so easily migrate to Mechanical Engineering and the like.
I suspect there are a lot of universities out there whose main purpose is to churn out fairly competent programmers, and then there are some who strive to do a little more than that, such as MIT. So what is a computer science degree good for depends on which university you come from. I tend to think that MIT has the right idea about a computer science education and that the more common programming problems of life should be left to other majors. Programming as we know it is changing. It is becoming more specialized, and it really has very little to do with the tenets of computer science.
Do Computer Science Majors make better Programmers?
There are basically two kinds of programming - programming designed to solve computer science problems such as how do you work in 1/n time or create a system that makes it possible to write 1/10th the code to achieve 10 times what you had before, and then there are the other problems that you try to solve once you've got this speed and efficiency; how best to put all this power and efficiency to good use. The second is what I will refer to as business programming. Programming has changed a lot in the past 10 years. In order to produce a fairly competent piece of business software, it is no longer necessary to know the intricacies of recursion and pointers or how the bits and bytes harmonize. While it's handy to know these things, it is not the be and end all. People also expect more for their efforts. For example when we talk about a string, we don't need to know that a string is implemented as an array of characters with the first element being defined as the address of the string or know the difference between big-endian and little-endian. These are computer science problems, not something that your general business programmer will run into on a day to day basis. Such minutiae while interesting are so abstracted away from general life that they have little relevance. Instead just general problem solving is of high-priority. Componentization has also reached an unimagined level. I don't need to know how to build a report writer; I just need to know how to integrate it with my problem domain.
For what I call Business Programming - the day to day nuts and bolts that make business work and give business advantage, it is important to have a good foundation in your choice of domains.
Domains are wide and varied - such as statistics, finance, mechanics, database optimization, network theory, airline industry, molecular biology, environmental planning and the like. Some cross into the realms of computer science and computer engineering, but many do not. Domain knowledge is almost as hard and sometimes harder to acquire as is a good foundation in computer science. So when you have a complex domain such as life insurance, statistics, and biology you tend to value a person's domain knowledge just as much as or if not more than their programming prowess. Before it was much easier to explain domain knowledge to a computer scientist than it was for a computer scientist to explain programming to a domain expert. Now especially with engineering fields and mathematical fields, that is no longer the case. This is because engineering disciplines already provide a good problem-solving background and programming with all its added abstractions is becoming closer and closer to pure problem-solving with black-boxed components. In fact we are beginning to see a renewed interest in domain specific languages (DSL) or what some call mini-languages. Domain specific languages are highly optimized for a specific domain because they use the short-hand lingo intrinsic to that domain. For example you have SQL designed specifically for database problems, Html for web, R for statistical problems, various macro languages to solve graphical problems, gis mapping problems and the like.
As a Mechanical Engineering major I did a lot of programming and my thesis was in fact a computer program, but it was highly-focused in systems control theory concepts that a general computer science major would not be privy to and would be hard to explain to anyone who had not taken a control theory course.
So if you need to build a new OS or DBMS or solve grid-computing problems, hire a computer scientist. If your needs are more mundane as are most, think twice. From my experience pure computer science majors get bored when they can not debate about this OO model over that or the merits of this language over that and have to deal with general user needs. While having a foundation in computer programming and general computer problem solving skills is still important, one does not need to major in computer science to get that and god for bid if all programming classes look like 6.001. In fact most of what you learn is not in school, because while tools are becoming easier to use, there are also a lot more of them to know about and learn. Look around and you'll see that a large number of people who consider themselves programmers and are very good programmers were not computer science majors.