Saturday, July 18, 2009

Subvert the dominant paradigm

Earlier this week, Alfred Thompson posed the question, "what would you do if the lights (and power) went out in your computer science classroom?" At nearly the same time, I was interviewed about "computer science tools" as part of someone's dissertation research. One of the questions was, "if you had to choose only one tool to work with and couldn't have any others, which would you choose?"

Both Robb Cutler and Chad Clites have the best answer: use pencil and paper.

I am saddened to admit this was not my first answer.

The dominant paradigm of computing education is to teach technology. In the APCS course, are we really teaching the major concepts of computer science? Or are we really teaching Java, and using some of those concepts along the way? It's endemic in the way we talk about our curriculum. We teach "programming with Alice" or "simulations with Flash". If we're teaching simulation-building, why does it matter what tool we use? But we get caught up in the tools, partly because we tend to love them, and the concepts and ideas become, at best, co-equal, and more often subsumed in importance.

The reality is that my current curriculum would not move forward without power. I've faced this problem repeatedly over the last three years and it hasn't been pretty. Last year I spent the first week of school without access to my classroom, having to teach outside. So instead of starting the "real" curriculum (animation with Flash), I did CS Unplugged activities. Sure, I think my students got something out of learning about sorting and searching. But the reality is that the lessons were totally disconnected from the curriculum. The ideas weren't reinforced throughout the year, the concepts weren't connected to anything else they learned, and I suspect that few of them remember anything about it.

We need a new kind of curriculum, that is concept-centered, more like math and science curricula, that sends implicit and explicit messages to the students about what is important, and where what is important is the concepts, not the technology. In the same way that experiments are the implementation of science, but what we teach is scientific thinking and important concepts and knowledge, we need to have programming and computing be the implementation of computer science, but teach computational thinking and important concepts and knowledge. The computer needs to be a tool, not the center of the program.


  1. I agree completely. This all ties in with that nagging doubt I have about how we teach computer science in general. And perhaps how we DO computer science is also a little wrong. A chicken and egg problem. IF we teach it wrong we do it wrong but if we don't do it right how can we teach it right? Computer science should be more reliable. More like engineering or other sciences. or like Math. But its not. Why is that?

  2. After a few years of taking and teaching CS courses (I started with punch cards) it always seems that the students and the teachers want to start programming at the computer, ie. hack something in and see if it works then debug. From my admitted limited time in the industry the pros start with pencil and paper, lay out the program using some flow diagram technique, pseudo code the program and then code it in. About 80% of their time was in design, 20% was coding on the computer. I look at how I and others teach, how texts are written and how the kids learn and it is all backwards. In fact, design is sometime skipped altogether. It is not as fun as hacking in code and testing for ever.

  3. But isn't the lure of taking a high school computer science class--the computer?

    If we make cs another hs "book learn" subject, none of the students will choose it as an elective.

    And we already have problems with enrollment. In fact, if the numbers don't go up, they've threatened to cancel the program in my hs.

    I agree with you, we need to relook at how we teach cs.

    But in hs, we just need to pull 'em in.