# Computational Thinking¶

Computational thinking is a name we give to describing the underlying patterns that guide the development of computer science curriculum.

There are four key patterns that are frequently discussed when we talk about computational thinking.

1. abstraction – focusing on the important information only, ignoring irrelevant detail.
2. algorithms - developing a step-by-step solution to the problem, or the rules to follow to solve the problem.
3. decomposition - breaking down a complex problem or system into smaller, more manageable parts.
4. pattern recognition – looking for similarities among and within problems.

We have to added the concept of expandability and bias to these concepts:

1. explainability - can a computer explain why it took a specific action or made a specific recommendation?
2. bias - is the result of the suggestion made by a computer skewed in a direction that makes it unfair to a group of people?

## Other Common Design Patterns¶

Although we have many different coding groups that are appropriate for beginners, there are several computer science concepts that we encourage everyone to adopt in your coding group curriculum.

Events - What events start a program? What events change the behavior of a program?

Loops - How do repeat a set of tasks?

Variables - How do we reference a common value and make our programs easier to change?

Conditionals - How do we change program behavior based on rules. How do we use comparisons to do this? How do we implement if/then/else or switch/case logic to be easy to understand and maintain?

Functions - How do we group code sections together and give them names?

Function Parameters - How do we pass values to functions? How can parameters make functions more widely reusable? Why would we want to check the types of an input parameters? What happens when we pass invalid data types to a function?

Data types - What is the difference between a string of characters, an integer, a floating point number or a datetime? How do we use the right datatype and type checking to keep our programs reliable?

Data Structures - How do you create and manage lists, dictionaries, arrays and complex data structures?

Sensors - How do we gather input from the real world?

Output - How do we display text or graphic output on a small display screen or print statements to a serial console for debugging?

Feedback - how do we prompt users for input and respond to changes in output

Debugging - How do we find problems in our code? How can we stop execution of our code using a debugger? How do we inspect the value of variables when a program has paused?

Drawing - Drawing to a graphics device is a great way to learn other concepts where you get quick visual feedback. Drawing can be our on ramp to drawing charts and graphs. See our SVG Labs for excellent examples of learning to program with graphics.

Recursion - What happens when a function calls itself? How can you draw trees that have many smaller branches?

Commenting - How do we put hints in our code for others to better understand our code? How do comments make code more maintainable?

Scope - How do we protect variables from unintended updates? How do we use global variables sparingly. How do we use local variables and when should move variables from global to local or vice versa?