Compy Ed: Blogging about Computer Science Education

Saturday, February 10, 2007

What Do Computer Science Majors Need?

Filed under: computer science, education — compyed @ 9:06 pm

Computer science is a relatively young major. It’s mostly been in existence since 1980, maybe 10 years more in a few universities. How does one go about creating a new major? Presumably, you follow what’s worked before. And yet that may make little sense for computer science.

Since computer science uses the word “science”, it makes some sense to follow what’s been done in other sciences. In particular, many sciences have labs. The reason is simple. How many people have chemicals in their dorms? Or frogs? Or a voltmeter? This equipment is not only expensive, but some of it is downright dangerous. It makes sense to keep this equipment in a lab, and let students use it with supervision.

This is the model some universities took to teach computer science. At one point, this made some sense too. Computers were, at one point, very expensive, costing 2000 dollars or more. The earliest Macs were nearly 2500 dollars. And this was in 1984! This was a significant investment by parents, even if they were savvy enough to realize that having a computer might help students move ahead. Some PCs were above 3000 dollars or more.

Universities bore the brunt of this cost for many years, and it didn’t become really affordable until about 1995, when thousand dollar computers became more commonplace. While a thousand dollars is still pricey, realize 15 years had passed, and people were that much more wealthy, and so this represented a smaller chunk of change than it did in 1980.

Still, universities often lag, not looking at the world outside their ivory towers, and keeping to the same standards that they have kept for years and years and years. Do labs even make sense? Many universities now assign projects outside of class, expecting students to devote 10-20 hours (or more!) a week to their programming assignments. These are times far in excees of a typical 3 hour lab, but the experience gained from this is invaluable.

I have no numbers, but I believe the initial steps of learning how to program have a steep learning curve. It requires, even among the best programmers, some time to make mistakes, work through debugging, and so forth, to get proficient. Much like riding a bike, you don’t usually get it right away.

To get to the point, I want to say that the lab was created at some universities for computer science majors because they used a tried-and-true principle. Copy what seems to work. Labs seemed to make sense in the early days of computer science, but make a lot less sense now, because most students own their own computers. It’s sad that such an investment needs to be made to be successful as a computer science major, but these days, that’s what it takes.

But, there’s another more profound issue. How do we teach computer science majors how to program? Many computer science professors were not truly programmers. They were mathematicians. They believe the pinnacle of computer science is solving hard problems, typically involving math. Anything that appears to require brute force coding is seen as mere engineering, meant for grunt workers.

Of course, most of this was a defensive reaction, in an effort to avoid learning how to program. The problem is that these people are also the same folks that are teaching our kids to program. Perhaps no other major has those who teach so unwilling to learn what they are teaching. Fortunately, this is changing. As new professors come in, they have been trained to deal with the frustrations of programming. And yes, programming in frustrating.

Now, teachers are supposed to be teaching, thus sharing some of the student’s pains. They decide that some aspects of programming are indeed far too painful, for too menial, so they use their superior skills at programming, and hide details from the students. Students therefore don’t install compilers, they don’t deal with bad documentation, they don’t have to upgrade their software, and so forth.

All of this is perfectly fair. If you introduce all these challenges too early on, students will lack the skills to succeed, when they think someone else, someone smarter, will take care of these difficulties for them. Computer science is strange that way. The average computer science major must pick up a lot of stuff about computers on their own, everything from what is a USB port, what is Ethernet, what is HTML, what is CSS, to some basics of installing software. These are things that are not taught in computer science because they are deemed to be unimportant, and more critically, to be transient. The difficulties of today may not help you solve the difficulties of tomorrow. When HDMI replaces component, when USB replaces RS-232 or serial cables, all this technology simply becomes obsolete mere years after they were first introduced. Can you even get a laptop that will let you hook up to your phone line anymore?

But all of this is hidden from students. Why? For one, maybe the people teaching it lack this knowledge. For another, it helps the weaker students get by. Yet, is it enough for them to make a living? Ask yourself when you teach what does a programmer need to be successful?

In the end, the answer is not a specific skill like programming in Java, but the willingness and ability to learn despite poor resources to do so.

These days, I can point to the following skills that students should have, but probably don’t.

  • Debugging using a debugger (and how to do so)
  • Version control, and how it works
  • Related to that, branching/merging
  • How to profile both time and memory
  • How to learn to use a new piece of software or a library
  • How to design a solution and weigh pros and cons of that solution
  • How to use a bug tracking system. How to report a bug.
  • How to test.

Most of this is rarely taught. If a student is lucky, it’s covered in a decent software engineering program.

Ask yourself, what does a computer science major need. The list may be longer than you think.

No Comments Yet »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Blog at WordPress.com.