What’s in a CS degree?

Posted: 28 January 2008 by Jason Adams in Uncategorized
Tags: , , , , , , , ,

Just what value is there in getting a degree in Computer Science (CS)? Are new graduates competent programmers? Is that the purpose of a CS degree? Should companies be spending money to train new hires out of college in the programming languages and practices that they use?

Robert Dewar is a professor emeritus at NYU in computer science, and he believes that the status of software engineers in America is in danger due to general incompetence of new graduates. The long and the short of it is that after the dot-com bubble burst, and computer science enrollment at universities plummeted, schools restructured their programs to be more fun. Essentially, they were dumbed down. Specifically, the focus has shifted away from math and the theory of computation. Students are not taught a wide range of programming practices, but instead are trained to rely on large software libraries in a sort of “cookbook” approach. That is, students can assemble a solution to a known problem (in Java), but they are woefully undertrained for solving actual problems in the wild with “more practical” programming skills.

Dewar cites Ada as a language frequently used by a company he helped found and that it is getting harder and harder to recruit people with the proper skillset. What is most interesting to me is that he attributes students’ inability to tackle tougher programming problems to the teaching of Java as the first programming language in schools. For each programming language, there are certain mental paradigms that you learn. One thing you only touch on briefly in Java are pointers. You have to know about them if you do any sort of serious code in terms of pass-by-value versus pass-by-reference, but the complexity level is nothing compared to C/C++.

But Java is only part of it, Dewar says. The real problem is the reduction of focus on math and algorithms. In my CS program, I was required to take two math and one statistics class, three classes on algorithms (two of them introductory), and one on the theory of computation. There were a few of the standard CS classes like computer architecture, operating systems, etc. One thing I complained about in my last semester was the fact that I didn’t feel like I had been taught to program expertly in any particular language. A classmate said the purpose wasn’t to teach us a particular language, but to think like a programmer. We would become experts in a particular language in our jobs.

There is some merit in that idea, and I believe that is the intent of what Dewar is talking about. He’s not saying we should become Java or C# gurus by the time we’re done with college, but we should be able to switch to any language and be able to pick up the concepts that the language relies on. Sufficient knowledge of computer architecture is also something every programmer should have.

Here is my theory. CS students are being sufficiently taught to be software engineers. All the stuff Dewar talks about, I have heard of in some of my undergrad classes (which was at the University of South Carolina, by the way). The problem comes from the ease of passing those classes. I would help other people in some of my more advanced classes, and they would be tripped up on simple programming concepts sometimes. It wouldn’t look good for a program to have half the kids failing, but in truth, they probably should. College is the American bar mitzvah for young people nowadays. At least if your families are relatively affluent. It’s easy to get in to many schools and it’s easy to skate by without really getting the topic. Is it because failing a student hurts revenue (no more tuition)?

In the end, you are responsible for your own competence. The school can’t make you learn anything, it’s all up to you. Maybe there are better languages to teach new students, but maybe there aren’t. Maybe it doesn’t really matter, just like learning Chinese as your first language doesn’t make you better at math than learning English. The key is that you can’t rely on one single skillset to take you through life.


Comments
  1. Melinda Weathers says:

    Yeah, as a CS Teaching Assistant, I was surprised at how many programming assignments just didn’t work. More surprisingly, in my class with the other Teaching Assistants where we would grade each other’s projects, many of their projects didn’t work either!

    This degree business is a bit of a touchy subject with me since I don’t have a CS degree, and I haven’t decided if it makes sense to go back and get one or not. So this was an interesting post.

  2. Jason Adams says:

    From a personal development perspective, I would think that going back to take some more math and algorithms courses would probably benefit you more than trying to fulfill the requirements of a degree, since they are sometimes arbitrary and/or ridiculous. Of course, if all you are missing are those classes, that would work out well. I’m always the wrong person to ask whether you should go back to school. My answer is unequivocally “YES!!!!!1111zomglol1123eleventytwo111″

  3. brokenbokken says:

    This is a good article. I agree that the concepts needed to become a good software engineer are taught, but most students just don’t grasp them. I think it’s better to teach practices than languages. Who cares that I can program in 13 different programming languages if I can’t even produce a decent architecture?

    As an IT Consultant, I have begun to realize how important it is to focus away from a specific language and focus more on the basic concepts, commonly used algorithms, and best practices. Anyone can pick up a book and learn to program in a language, but without a foundation that crosses the programming language barrier, you’re just a code monkey.

  4. Chris says:

    I fear I may be making an argument in defense of bad CS, but here I go anyway. Let’s realize that the world exploded with demand for developers only a short while ago. Up until the late 1980s, getting a CS degree was a bit like getting a degree in logic: only seriously smart, internally motivated individuals did it. Often, these were people who had been playing with programing since they were kids, so they already knew how to write code. Therefore, a program could be focused on algorithm development and math and not scare off potential enrollment.

    It wasn’t until the 1990s that the demand for developers became so great that just about anyone who could read an O’Reilly book could get a job writing code. CS programs began advertising themselves (quite of their own accord) as the hottest ticket on campus — the best way to get a great job fast. So they attracted an entirely different sort of student (the sort with no background in actual programming). Now, CS programs are seen a lot like accounting programs: just dull job training.

    And there’s something good about this. Because the world needs a lot of code written. So, if standard libraries help average people write code that gets the job done, so be it. Would you really expect the average construction worker to have a degree in architecture? How many houses would get built if that were the case?

    So, in defense of code monkeys, there’s a lot of code to be written, and the logicians sure ain’t gonna do it.

  5. Josh says:

    I’ve read other articles about this very topic – I believe Joel on Software discussed it last year, or perhaps two years ago (or maybe even older and I only read it that recently). They brought up the same points. They then had a link to a test which requires at least – probably more than – passing familiarity with several real CS topics: functional programming (particularly, aspects of lambda calculus and how they’re used in programming) and pointers.

    I feel my education in CS was pretty good, but then again I started before the dot-com-boom (although only by a few years). I did not learn how to expertly program in any particular language, but was taught the paradigms, tools, and capabilities of many languages: Pascal and C for modular and system programming, Lisp for functional programming, MIPS RISC Assembler for low-level programming (though we only “ran” our programs on a MIPS emulator for Windows that greatly over-simplified I/O – but the point wasn’t to learn I/O in assembly but to be familiar with assembly, how it is an analog to the way modern processors function, and how it was a precursor to higher-level languages), and Smalltalk for object-oriented programming. I then had a junior-level class that was a survey of programming languages and paradigms which projects in C++ and Prolog. The focus wasn’t on learning everything about a particular language, but learning concepts – like OOA/OOD, functional programming, decomposition and abstraction, and (everyone’s favorite) pointers.

    Prolog, the declarative language that relies on a predicate calculus resolution engine, was the coolest – but also seemed the least practical due to the level of abstraction in which one had to work in order to accomplish even simple concepts – like data structures. It is cool because it is different and makes for great problem-solving exercises. Despite its impracticality for most problem domains, it is absolutely essential for others.

    I do agree that newer graduates and students – since the dot-com-boom – seem to be taught some of these concepts more superficially. And, as Melinda also observed, it was scary how many students had great difficulty really grasping some of the programming concepts but were still able to pass.

    I’m fairly certain that math and science are still at the core of Georgia Tech’s program – which required a decent bit of physics, calculus, and lab science of all science and engineering students. And when I was there I had to take some painful algorithm classes, too (I can think of at least one sophomore class and one junior class). But that isn’t enough for CS. Skills needed by serious software engineers (vs. code monkeys) include a much greater ability to think abstractly. I think this is where learning lambda and predicate calculus really pay off. This level of abstraction requires a different way of looking at problems – something that can’t simply be learned while learning match and science or while learning how to program in a particular language.

  6. [...] around out there, trying to figure out just where we’re going wrong. Recently I wrote about Robert Dewar’s views on where CS education has failed. He made the case that graduates of most CS programs are incompetent and that employers have to go [...]

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>