Computational thinking was popularized in a March 2006 article in Communications of the ACM by Jeannette Wing. In 2010, she published a more concise definition (see link here for her article about the evolution of these definitions):
Computational Thinking is the thought processes involved in formulating problems and their solutions so that the solutions are represented in a form that can be effectively carried out by an information-processing agent (Cuny, Snyder, and Wing, 2010).
I have been thinking a lot about this definition (as seen here in [email protected] from last September and in my blog in April). This is a definition that most people can agree with. The problem is when you use it to define curriculum. What does it mean to represent a problem in a form that can be effectively solved by a computer? What do we teach to give students that ability?
Computers are designed. The problem form changes. We can make computers easier to use.
Human-computer interface designers and programming language designers are all about making it easier to represent problems in a computable form. A good user interface hides the complexity of computation. Building a spreadsheet is much easier than doing the same calculations by hand or writing a program.
I have been digging deeper into the literature on designing domain-specific programming languages. The empirical research is pretty strong. Domain-specific programming languages lead to greater accuracy and efficiency than use of general-purpose languages on the same tasks (e.g., see here). We are learning to make programming languages that are easy to learn and use. Sarah Chasins and colleagues created a language for a specific task (web scraping) that users could learn and use faster than existing users of Selenium could solve the same task (see blog post here).
So, what should we teach in a class on Computational Thinking, to enable students to represent problems in a form that the computer can use? What are the skills and knowledge they will need?
- Maybe iteration? Bootstrap: Algebra showed that students can learn to build video games and learn algebraic problem-solving, without ever having to code repetition into their programs.
- Booleans? Most students using Scratch don’t use "and", "or", or "not" at all (see paper here). Millions of students solve problems on a computer that they find personally motivating, and they don’t seem to need booleans.
Our empirical evidence suggests that even expert programmers really learn to program within a given domain. When an expert programmer switches domains, they do no better than a novice programmer (see blog post here). Expertise in programming is domain specific. We can teach students to represent problems in a form that the computer could solve in a single domain, but to teach them how to solve in multiple domains is a big time investment. Our evidence suggests that students graduating with a four year undergraduate degree don’t have that ability.
Solving problems with a computer does require skills and knowledge different from solving them without a computer. That’s computational thinking. We will never make the computer completely disappear. The interface between humans and computers will always have a mismatch, and the human will likely have to adapt to the computer to cover that mismatch. But the gap is getting smaller all the time. In the end, maybe there’s not really that much to teach under this definition of computational thinking. Maybe we can just design away the need for computational thinking.