Mark Guzdial posted about computational thinking on his Computing Education blog, and a discussion ensued about the differences between algorithmic thinking and computational thinking. As a bioinformatician, I see plenty of value to both ways of thinking, but some important distinctions between them. First, let me define the terms, as different assumptions about what they mean can derail any sort of meaningful discussion.

**Algorithmic thinking** is thinking about how to accomplish a particular end. It is detail-oriented thinking about methods. For a wet-lab biologist, this is the sort of thinking that goes into developing a new lab protocol. For a computer programmer, this is what goes into the design of data structures and programs. I’m not really including debugging as part of this concept, as I see that as a separate skill. Indeed, those whose designs are good may have had less need to develop strong debugging skills, while those who have to fix up other people’s code may have developed strong debugging skill without having thought much about algorithms.

**Computational thinking** is thinking about data by using computers to summarize, massage, or transform data into a more easily understood form. The algorithms are not the key here, though good algorithms may well be needed to do the desired computation. In computational thinking, the focus is on the data and the interpretation of the data, and the algorithms are just tools available to help with that.

Here is a simple example: Computational thinking is needed to decide to plot the probability of passing a class as a function of the grade in the prerequisite class. Deciding whether to use sorting or hashing to make that plot and how to estimate the probability of passing from the raw data in the grade records requires algorithmic thinking.

In bioinformatics, we often distinguish between two types of research (or students or curricula): tool-using and tool-building.(I touched on this in one of my first blog posts.) Algorithmic thinking is needed for tool building, while computational thinking is needed for tool using. Neither is inherently better or more valuable than the other: both are essential (though not always in the same person) to make progress.

Mark Guzdial in his post gave some examples of empirical thinking (looking at data), and called it computational thinking, though he used no computation on the data. I think that this confusion on his part actually makes his main point stronger: that high school students are not taught computational thinking, and have no idea how to go about using computers to analyze data. Students get some empirical thinking in science classes, and some students get algorithmic thinking in computer science or math classes, but rarely are they exposed to the need to do more with data than some pocket calculator manipulations, and rarely do they have to think about how to transform their data into meaningful, interpretable information.

Very interesting differentiation between algorithmic and computational thinking. This is certainly one of the better summary descriptions of computational thinking I’ve seen (despite having read the Report of a Workshop on The Scope and Nature of Computational Thinking at http://www.nap.edu/catalog/12840.html and other such works) but it still leaves me very unsatisfied.

I think I’ll stick to teaching algorithmic thinking and formal ways to express it (programming) and hope that the data I have students work with is rich enough that they also think computationally, whatever that means.

Comment by Hélène Martin — 2010 August 12 @ 21:01 |

I think that both algorithmic teaching and computational thinking need to be taught, but not always in the same classes. Most computer science classes are about teaching algorithmic thinking, since there is such a shortage of instruction in it elsewhere. Computational thinking needs to be more widely taught, in the math and science classes that can benefit from computation.

Bioinformatics (also known as computational biology) needs to teach both, often switching from computational to algorithmic as we go from what we need to compute to how we need to compute it.

Comment by gasstationwithoutpumps — 2010 August 13 @ 08:57 |

I still have a hard time seeing the two as separate. As you say, Mark’s example doesn’t involve computation, which makes it hard to see where the computational thinking is. I’m having a hard time imagining how he could do computation on that data without using algorithmic thinking. I understand your idea of tool using, but figuring out how to properly use a tool seems like an algorithmic task to me, even if it’s possibly less sophisticated than what’s required for creating a tool. Similarly, most algorithms need to be run on some sort of data so it’s going to be difficult to train algorithmic thinkers without first giving them a good sense of data, how it’s represented, and what’s worth computing with it.

It seems most applications require both. Can they truly be isolated from each other and taught separately?

Comment by Hélène Martin — 2010 August 16 @ 20:49 |

Most real work involves many modes of thinking, and it is indeed rare to find a task that is purely one thing or another.

Computer science classes often teach algorithmic thinking with almost no regard for the data. For example, sorting is often taught with arbitrary integers as keys, or arbitrary strings, totally divorced from any meaning for the keys (other than numerical or lexicographic order). This is almost pure algorithmic thinking.

Computational thinking may require algorithmic thinking, particularly for more complex computations, but many of the simpler computational thinking approaches (summarize the data with a mean and standard deviation, fit a trend line, do moving averages to smooth the data) can be easily done with off-the-shelf tools that require no algorithmic thinking. I think that there is some value in separating the notions when designing a curriculum, to make sure that both are covered adequately. It is very easy to dive into algorithms without stepping back to figure out

whywe want to do the computation, and also very easy to get swept up in available tools without lifting the lid to show how they work.Comment by gasstationwithoutpumps — 2010 August 16 @ 21:35 |

This is a very interesting article. Thanks for clearly differentiating between algorithmic and computation thinking. I did notice though that while you stated “high school students are not taught computational thinking, and have no idea how to go about using computers to analyze data”, you didnt mention any solutions to this problem. I am an undergraduate research assistant working on getting middle and high school students interested in computer science, and this topic is very relevant to my research. There are some things (i.e. programming with Alice, botball, Google AppInventor) that we do to show and help students write programs/games/program robots/etc. but we are looking for new ways to help them really understand what they are doing (i.e. the “back end” of programming). Do you have any ideas or have you heard of anything that might help with this? We really want them to understand algorithmic and computation thinking, since understanding and knowing how to use these concepts will help them be better programmers.

Comment by Jen Dana — 2011 February 22 @ 08:32 |

I don’t think that there is a quick fix to get students to think computationally or algorithmically. Certainly teaching programming and debugging helps them think algorithmically.

Computational thinking is best done in a science or social studies course, analyzing and modeling data. Doing it in a programming course is not really the right place—the emphasis there should be on algorithmic thinking and reducing the computation needed to get a desired effect. Physics courses are excellent for modeling and social science courses (particularly government and economics, but also psychology) excellent for statistical data analysis.

I think that http://modeling.asu.edu/modeling-hs.html has some ideas about teaching physics based on modeling.

Comment by gasstationwithoutpumps — 2011 February 22 @ 09:23 |

[…] I’ve posted on computational thinking twice before: Algorithmic vs. Computational Thinking and Computational Thinking Lesson […]

Pingback by Computational Thinking « Gas station without pumps — 2011 March 27 @ 10:11 |