Can you teach someone to think? This was a question my father asked me when I was young. Of course, you can teach someone to read, write, and do math. But how do you teach someone to think?
Let's think about it for a moment. A quick perusal of psychology textbooks will list anywhere from 3-7 types of thinking, each with non-overlapping types. For example, some will include critical and analytical thinking, creative and abstract thinking, convergent and divergent thinking, or concrete thinking. Others will consist of memory and recall, applying and analyzing, evaluating and creating. Finally, some distinguish scientific from philosophical thought. [ed. note: I philosophically disagree with this distinction].
In the past ten years, computational thinking has emerged as a 'new type' of thinking, inspired by computing and the incalculable impact it has had on society. But what exactly is computational thinking, and can you teach it?
Computational thinking is a mental framework for problem-solving.
It is a set of tools to carry out a process that has three main steps.
- Identify a problem and break it down into its parts.
Inspired by how computers solve problems, computational thinking first requires taking a complex problem and deconstructing it. The problem could also be a process or a system. But underneath, processes are still problems: how do we build a system? How can we make this process more efficient?
- Solve each small problem.
Consider each step required to solve each part of the problem. This is where specific concepts in computer science come into play and are tools in the toolkit for problem-solving. Logic, algorithms, decomposition, pattern recognition, abstraction, evaluation, and the like. Recall, the first 'computers' were people, often women, who computed long mathematical algorithms by hand. How? By breaking down big problems, working on a single part, often in parallel teams, step by step.
- Build the solutions back together.
The last step is key, where the parts are re-built back into the whole. The fluidity between two states—the parts and the whole— is critical. Similar to how computer programming is writing step-wise code to give instructions to a computer to do something. Computational thinking is step-wise problem solving to find the solution. Computer scientists often think in terms of input-output. This last step ensures that the parts work together and the problem (input) is solved (output).
Two examples of how I've applied computational thinking to my work illustrate the breadth of problems this approach can solve.
The problem: I see a challenge to build a web app to make header images. The first step, break it down into its parts: get images (from where?), resize (only if too big, small, or wrong aspect), place text on top (where, which color), serve on a website (where, how). The second step, solve each of these components individually. The last step is to put them together into the app and use them weekly for image generation (see header!). But this is a toy example. Does it work in real life? Does it work on things that matter?
The problem: science is slow, and the impact of discoveries is challenging to predict. The first step, break it down into its parts: science is slow because hypotheses are often wrong. The impact of discoveries is variable because discovering something genuinely new or making new connections between established fields requires serendipity. The second step, solve each of these problems individually: use data to develop better hypotheses and measure the hypotheses' novelty by benchmarking to known connections. The last step is to put them together. I've been working on a project to carry out this exact task for the past couple of years. It's called data-driven hypothesis, and it's a labor of love.
These two examples don't give justice to the breadth of applicability for computational thinking. Computational thinking is not building apps or computer programming. Computational thinking is also not simply computer literacy. Instead, computational thinking is an approach that leverages modern tools to solve modern problems.
So how can we teach computational thinking? Well, first, we break down the challenge into its parts. Next, we identify the individual components of computational thinking and how a student can learn each of these. Finally, we take these parts and build them together into a curriculum. The approach to teaching computational thinking simply requires a little computational thinking.