Wednesday, August 10, 2011

Computer Science Around Programming

Alfred Thompson posted Computer Science Before Programming, where he starts by considering the new trend of courses that teach introductory CS without relying on programming-first. He quickly moves into a discussion of different levels of programming languages and focuses on the question of whether "post-syntax" languages such as Scratch, Alice, and Kodu expose the right concepts, such as how loops work.

I think that even when we focus and try hard, we all too often fall into the trap of thinking that the big ideas of programming are synonymous with the big ideas of computer science. We all learned CS through programming first, and it's our mental model of how it works. Changing such an ingrained mental model, especially when nearly everyone around you is reinforcing the model, is hard.

I believe that programming is to computer science as experimentation is to other sciences. It is the work of professionals in the field. It is how we develop new ideas. And it is a skill that must be learned before it can be used in a meaningful way.

We don't make students experimentally derive all we know about science from first principles - we tell them the formula for acceleration, the value of the force of gravity, the periodic table of elements. We don't make them figure these things out, and it's a good thing because usually they don't have the skill or tools to accurately measure these known quantities.

Now, some people will be saying, "but we TELL them about conditionals and loops and parameters and abstract classes!" Those are big ideas of programming. Not of computer science.

Here are some of the big ideas of computer science:
  • The design of things is impacted by the assumptions and experience of the people who make them.
  • The computational devices we use affect our society. And related: there are ethical implications to computational tools.
  • What is computing good for and what is it bad for?
  • How do we abstract details to model problems and find solutions?
  • What does it mean that computers run on binary when we have beautiful user interfaces?
I can teach every one of those, and lots of others, with no formal programming languages. Programming would only get in the way of what could be a rich discussion and deep understanding.

Students should experience programming - it's empowering and fun and an important part of computer science. But we shouldn't confuse the skill of programming with the concepts of computer science.


  1. I'm curious how you present the "big ideas" topics. Described as-is, they don't sound very exciting. I think the CS Intro courses have to fill two needs:

    * As a gen-ed course, they should expose students to these big ideas.
    * As a stepping stone to CS1, they should prepare CS majors for the next course and get students who are on the fence excited about it.

    While the big ideas easily fulfill gen-ed requirements, I'm not sure they do much to inspire a new generation of computer scientists.

    I'd like to throw a question out for discussion:

    Take any traditional science, such as physics. What are the big ideas, which every person ought to know? Off the top of my head:

    * Conservation of energy, matter, etc.
    * Fundamentals of Newtonian physics (force, velocity, mass)
    * Thermodynamics
    * The "big ideas" are just visual manifestations of many other ideas. Those ideas are core to more advanced courses.

    What do physics researchers do? Now, I'm not a physics researcher so I can only conjecture that they spend much of their time working on those "other ideas" that form the basis of the big ideas, such as the relationship between time, matter, and energy. Or the interactions of subatomic particles. Or grand unification of the four forces.

    What do computer science researchers do? Are they working on ideas related to the big ideas? I suspect not. Most of them are dreaming up new algorithms, figuring out how to apply those algorithms to products and services, and exploring new computational models (quantum, for example).

    If they are working on areas related to the big ideas, they are probably actually cognitive scientists (HCI, UI), sociologists (societal impacts of computation), or philosophers (ethics).

    I'm not discounting the big ideas you mentioned. On the contrary, I think they are important to teach. But how do you inspire your students to take the NEXT course?

  2. Good Article.The regular course was Reeling and Writhing, of course, to begin with; and then the different branches of Arithmetic.