I’ve been a fan of Jeannette Wing’s crusade to teach computational thinking since I read her 2006 CACM article on the subject a couple years ago. And, a few weeks back, she spoke at Northwestern about computational thinking, so I got to see her live. (Slides from a 2008 version of her talk are here.)

In brief, the notion of incorporating computational thinking into our curriculum means teaching the fundamentals of thinking algorithmically, much as we now (are supposed to) teach the fundamentals of thinking mathematically. Wing makes a good argument that this is different from “just” teaching mathematics in a different way: according to her, computational thinking borrows from both mathematics and engineering, in that its goal is to solve problems as well as possible, given material constraints.

(As an aside, Wing sees three main categories of computational constraints: time, space and power. Time and space are “classical” complexity measures, of course; she is predicting that questions like, “How much electrical power does it take for a machine to solve this?” will become increasingly important in both theory and practice.)

Wing stumped the audience with the following question:

How old were you when you first understood recursion?

I’m sure a lot of people in that room — and a lot of people reading this blog — started programming at a “prodigious” age. Still, did you understand recursion before you had it explained to you in college? Two of my friends are professional classical musicians, and I bet they “understood recursion” quite young (because of choir, fugues and change-ringing), even though they both hate math. I’m not sure whether young programmers do, though.

The real question, of course, is:

When should recursion be introduced into the curriculum, and which concepts should precede it?

Wing doesn’t know the answer, and she expects the pedagogical studies needed to address this question might last beyond her lifetime.

**The question I didn’t ask**

To illustrate computational thinking in action, Wing showed a diagram of the layout of the coffee shop at the NSF. The layout was inefficient: it forced customers to create traffic jams if they wanted to put cream in their coffee, lids on their cups, etc. Wing said that, due to her computational thinking, she thought, “Pipelining!” and she analyzed how to improve the situation. She realized that most of the problems would be mitigated simply by moving the lids from one location to another, so she suggested to the management that they move the lids, and explained why. They declined to change things. End of story.

What I wonder is: Did she pick up her own lid and carry it with her when she ordered coffee? An individual solution like that is suboptimal, for sure, but she would have avoided some of the traffic if she had done it. Plus, maybe other customers would get the point, and do it too. If anyone would do it, I imagine she would. Still, I wonder, because, if she had, wouldn’t she have mentioned that in the talk?

This lid-carrying example of mine is silly, of course, while Wing’s message is profound. But I have a point: computational thinking is necessary but insufficient. What is needed is computational *action*. People need to be able to make an analysis, and also to *act upon it*. That’s what I see needs to be in the “grand curriculum” of how society raises the next generation, more than just a list of mental tools divorced from practical, social application. The ability to *make your analysis matter*.

So… I’m curious. :-) How old were you when you first understood recursion?

Wing, J. (2008). Computational thinking and thinking about computing Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences, 366 (1881), 3717-3725 DOI: 10.1098/rsta.2008.0118

Action is very cool! It requires not only realizing a challenge, but also proposing solutions, which is *very* different to just identifying the challenges.

In the article she correctly hastens to add that computer programming is distinct from computational thinking. I wonder if elementary computer programming (the kinds they teach in schools) as it relates to computational thinking can be likened to the elementary arithmetic / geometry taught in schools as it relates to mathematics.

I was supposed to have learned recursion (via Towers of Hanoi) in my intro programming course, but it didn’t quite sink in. Shortly after my course, I watched lectures from a 1980′s MIT course on intro to programming. The professor demonstrated recursion using a physical Towers of Hanoi. He picked up all disks but the largest one and moved them to the middle peg. Then he picked up the largest disk and moved it to the last peg. Finally he picked up the disks from the middle peg and placed them on top of the largest disk on the last peg. I immediately stopped the video and coded up Towers of Hanoi to solidify my understanding.