The use of computers has enabled impressive advancements in many scientific disciplines. Attributing this progress to the mere acceleration of arithmetic would be oversimplifying. In recent years, the term computational thinking has been used to describe what really makes the difference. The term was first introduced by Jaennette Wing: »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«.
The ideas that computers enable a new kind of thinking go back (at least) to Paperts seminal memo »Twenty Things to Do With a Computer« (Papert 1971): »Concepts from the sciences of computation […] have deeply affected thinking in biology, psychology and even the philosophy of mathematics«. In order to understand this new way of thinking, we turn to the discussion of a couple of examples, some of which are widely used in the literature.
We explain computational thinking using a series of examples such as shotgun sequencing to decode the human genome that Jeannette Wing used in a later article. The specific method that enabled this breakthrough was »unthinkable« before computers became commonplace. Using computers to »scale mathematics up« creates new possibilities for problem solving that were impossible without computers. While it was of course conceivable that massively scaled up mathematics could be used to solve problems, the availability of computers, and the experiences of using computers in problem-solving contexts increases the »conceivableness« of such approaches.
Another example is using code to understand the resolution of the really counterintuitive Monty Hall problem (Selvin 1975): there are three boxes, but only contains a valuable item; after you choose a box, the host shows you that another box is empty. Do you now stick with your original guess, or do you switch to the unopened box?
In the lecture, we stage a »live« coding session to write a simulation of the Monty Hall problem. By running the simulation 10.000 times, we can show that the proven but wildly disputed solution (switch boxes) is in fact the better strategy. More importantly, we can show that the code represents this insight in a simple and beautiful way, as the choice of box before the reveal does not play a role in how the outcome is determined. It becomes obvious that code is not only the tool to solve a problem, but also a new form of knowledge representation. Computational thinking can then be understood as a core skill in a »representational shift« that we are currently witnessing. This consequently leads to the thought that programming could be another cultural skill like reading, writing, or arithmetic in the future. Also, taking code as knowledge representation serious puts a new significance on the dichotomy between open source and closed source software.
The »code as knowledge representation« thread can also be found in Raymond Listers cognitive developmental stages of code understanding. He shows how code is much more than instruction; it represents knowledge, and it can even be used to make an argument. Again, this offers an additional layer of meaning for students to think about code and coding, which they will be doing a lot during their studies.
Where appropriate we also make excursion into history. We look at the history of computer programming, and explain how programming once was the predominant model for interaction with computers, and how that changed over time. We revisit the »software crisis«, and explore the changes in the idea of how programming should be done over time, as presented in Jörg Pflügers essay »Writing, Building, Growing«. This section closes with a quote from Alan Kays Turing Award acceptance speech, where he poses that we still don’t understand the actual scope of what computing is going to be,
Stefan Szeider from the Algorithms and Complexity group at TU Wien is invited to introduce students to the core principles of algorithmic thinking: specification, segmentation, abstraction, scalability and reduction. Discussing these principles, he exposes the students to concepts like runtime, efficiency and complexity, which form part of the core vocabulary students will need to talk about algorithms in their further studies.
We close this chapter by building a bridge to design thinking by discussing the deficits the rationalistic approaches of computational thinking exhibit when used to approach wicked problems. We show how Jaennette Wing expanded the original »Two A’s of Computational Thinking« - Abstraction and Automation - into a three-step process, adding Analyses to create an iterative loop that more acurately reflects how we solve real-world problems. We revisit the critical reflection on the rationality of thought in problem solving from the closing section of mathematical thinking, and briefly introduce the concept of »wicked problems«, previewing core concepts of what will be discussed in the next chapter, design thinking.
Next: design thinking
Calls for discussion
Where do you think we could improve this chapter? Are we missing essential bits?
We always appreciate ideas for exercises that can help students comprehend computational thinking core concepts, especially for students with little or no coding experience.
Which memorable examples do you use to illustrate computational thinking that you think could help us?