Computational Thinking

At the most practical and applied level, what we mean by "computational thinking" is habits of thought needed to generate solutions to real world problems that can be implemented in computational machines: the intellectual skills necessary to get computers to do things we want them to do.

But we can also think about computational thinking more generally. We can extract those habits of thought as a general approach to grappling with complex problems and generating and assessing solutions to them.

In the face of complexity, our first reflex is abstraction. We step back, think slowly, and see the thing in levels. We ignore multiple levels of detail so that we can focus on the highest level shape of the thing. We are on the look out for the generic and for recurring patterns. What kind of thing is this? What is its shape? Can we describe it in the most general terms, naming things, perhaps, that we know we can further investigate later. This will often mean an appreciation for the hierarchical structure of the thing or problem.

Our next reflex is to build a model. By "model" we mean all the ways of symbolizing ideas or problems or solutions. A model is a symbolization using an established set of tools or medium with known behavior and relationships: math, law, Lego, isometric sketching. But even as we start to model, we are not forgetting abstraction: detail is deferred whenever possible.

We decompose the problem into subproblems and we are alert to recurring patterns. We are thinking spatially, paying attention to proximity and connectivity and inclusion/subsumption, and temporally, attending to sequence, duration, and synchrony.

The computational thinker is [ Homo faber] ("man (sic) the (tool) maker") in the extreme. The urge to model here is not the urge of the miniaturist, but that of the machinist. We want to build model elements that are reusable, generic tools that can perform in multiple contexts via parameterization, modules that relieve us of repetitive actions.

Computational thinking means analyzing problems, designing, implementing, and evaluating solutions with tools that help to assess

  • complexity What kind of problem is this? How does a solution scale in time, space, people?
  • efficiency How does the cost of the solution compare to the benefit? Is there a better way to do it? Is it feasible given constraints?
  • evolution and change How robust is a solution in the face of change? How will the solution be managed and maintained?
  • consistency and completeness Do all the parts of a system agree with one another? Does the system handle all possible cases?
  • security How will the rules that our solution depends on be enforced? How will boundaries be patrolled?
  • tradeoffs Systems may link properties that vary indirectly - space-time, design objectives - how do we manage decisions among such tradeoffs?
  • validation What is the connection between an abstraction and the real world? How do we know whether to trust the model?

Inspired by List of principles of Computer Science