Sunday, September 28, 2008

Is programming necessary?

I think Mark Guzdial is really smart and really neat. So when he talks, I tend to think hard about what he has to say. Mark recently said some things that I would (VERY) roughly interpret to mean that programming is central to computer science. I also think Robb Cutler is really smart, and I know he disagrees. Robb thinks we could teach introductory CS at the K-12 level without any programming at all. This left me with a lot to think about, but finally I hit upon an analogy. 

Programming is to computer science as experiments are to chemistry (or other sciences). It is THE central tool to the discipline. Being able to do it is an important skill. But it isn't actually central to the K-12 introductory experience. You could teach intro chemistry without doing any hands-on experiments. In some ways, the students would have a lesser experience, but most of them would be able to learn all the relevant concepts without actually doing them. Similarly, I think you could easily construct an introductory CS course that didn't have programming. 

I agree with Robb that frequently the programming gets in the way of understanding. Kids get so caught up in debugging that they don't really understand the logic of the program. They lose sight of the problem that the program is supposed to solve because the problems that they're focused on are of the "it won't compile" variety. Who knows if the proposed solution (the program) is a good solution to the problem, we can't tell if it won't even run! (Okay, we the experienced programmers can tell. But the student can't.)

I was a biochemistry major and I took two years of high school chemistry (thus the root of my analogies!). I was a junior in college before I understood WHY you do experiments. It was all cookbook to me until then, completely disconnected from anything we learned in lecture. I figured they made you do it so you would have the experience of having done it so you could get a job following those kinds of instructions in the future. "Oh yes sir, I've done many titration experiments." I became a chemistry teacher and despite my experience, I advocate for having students do experiments. 

There are many reasons for students to run experiments. It gives them lab skills which they can't get any other way - reading about titration is very different from actually having to work a stopcock correctly. For kids who are kinesthetic learners, or ones who need to SEE to understand, it helps them understand the concepts discussed in class. It can help them understand the scientific method in a different way and can help them understand the very nature of science research. (One of the reasons that I hated experimentation is that there's experimental error. It's all so beautiful and perfect in theory.) It's the same with programming and computer science. In introductory science classes, we use experiments judiciously, allowing students to gain the benefits but recognizing that there's a lot of material to cover and much of it is not best comprehended through direct experimentation. We should do the same with programming. 

We should introduce students to programming as a tool without having it be the focus of introductory courses. Have them do it some, sure, but not at the expense of understanding the big ideas - most of which aren't about programming at all. Help students understand that programming is a tool, not an endpoint. 


  1. Great post! I agree---we should be focusing on the idea of algorithms and algorithmic thinking and the other "big ideas" as well as programming. The problem is that we've sold computer science *as* programming for so long that now our students (at least at the college level) *expect* to do just programming. My students are sort of thrown for a loop when we spend class time talking about the algorithms rather than just starting with the code.

  2. What exactly is "Computer Science"? I teach "Computer Science" and I am still not sure. We teach an apps course to our 5-8 grade kids and this is included in our CS curriculum. The Technology I course is a combination of advanced Office, how to buy a computer (lots of vocab), a very basic A+ course, some history and some current affairs. The Tech II is how to fix computers, networks, projectors, etc when they do not want to work. These courses are part of our CS curriculum. We also offer Programming. What does a good middle school/HS CS curriculum consist of? Our CS curriculum was designed by me so it fits my knowledge set. But is it the best way to go? One glitch in trying to answer this question is I have yet to find a university that has a CSEd degree. CS degrees are a dime a dozen (I have one, it is worth about a dime). My local university (Univ of Montana) offers a TechEd degree but it is an apps and gadgets degree. Very little in the way of computers other than how to make Office work. CSEd is ignored and I am not sure why. I read a lot about the shortage of qualified CS teachers. I wonder why.

  3. Jane, I totally agree. I think it's a horrible loop we're in where we focus so much on programming in introductory courses that students naturally think CS = programming. Then if we try later to correct that perception, they're resistant and have to 'unlearn' it. We SAY that CS != programming but then our actions and curriculum refute what we say.

    Anonymous, you bring up some good points. One of the problems we have as a discipline is that we don't have a one-sentence answer to "What is Computer Science?". I am working on a presentation about what MS CS is (or can be) and I will post some of my thoughts separately, hopefully in the next day or two

  4. I *wish* I had had some programming at some point in school!!

  5. I agree, but I might even go one step further and say not that programming is like chemistry experiments, but that programming is like knowing how to run reactions or something---it's a tool for doing experiments to test hypotheses about computation. Not all experiments require it, but quite a few do.

    I do think it's a shame that many talented people end up outside of CS because of first-year "weed-out" programming courses.