On Co-De we view computational thinking as a collection of five core elements. Each course focuses on training one or several of these skills.

This overview is also available as a PDF-document for teachers and students:

#### Abstraction

Abstraction is about removing all details and data that will not contribute on finding a solution for the problem at hand. Instead, try to focus on information that is key to developing a solving method. By abstracting the information, you might get a better view on the problem.

Example:

When we draw on paper, we need information about colors, dimensions, (geometric) forms, the level of detail… Other aspects such as the background noise or the scent of the plants in the drawing are not important. Real-world objects that will not fit in the canvas we will not look at either.

#### Generalization

There are two forms of generalization:

1) Generalizing the problem

Example:

We can generalize “drawing a circle with a certain diameter” to “drawing several circles with different diameters”.

You can complete the first problem by using a round object that has the same size as the circle that you would like to draw. By going around the object with your pen, you can copy the circular form of the object on paper. You can now draw as many circles with that specific diameter as you would like. What if you were to draw other circles, with different diameters? You would need to look for many different objects of the corresponding size.

Alternatively, you could create a compass by fixing a string around your pen. If you vary the length of the string, you can draw circles with a different radius. In this way it becomes much easier to draw different circles, while you only need to keep one object. Hence, we’ve found an approach that is much more general.

2) Generalizing the solving method

Example:

Generalizing “a solving algorithm for a system of linear equations with coefficients in N” to “a solving algorithm for a system of linear equations with coefficients in Q”.

#### Decomposition

Decomposition is about dividing a complex problem into smaller, usually simpler, subproblems that can be solved individually. Afterwards the solutions of those subproblems can be combined to form a solution of the general problem.

1) Decomposition into multiple instances of the same problem.

Example:

When you have to solve a difficult mathematical operation, you will probably try to subdivide it into easier summations or multiplications. In the end you can then make the sum of the results:

2)  Decomposition into subproblems where each subproblem handles a different aspect of the general problem.

Example:

If you plan to prepare a birthday cake to treat your fellow students, you can decompose this into the following subproblems: (a) collect all ingredients, (b) find a good recipe, (c) follow the steps of the recipe as specified. All those subproblems you can solve independently (but of course in the right order).

#### Algorithmic thinking

Algorithmic thinking is about finding an algorithm that can solve your problem. An algorithm is a sequence of steps or instructions, that you should follow in the right order and that will lead you to a solution.

Example:

A recipe for chocolate pudding explains step by step what you should do with your ingredients to prepare the pudding. The sequence of steps in a kitchen recipe is an algorithm.

#### Evaluation

• Is your soving method efficient enough?
• Are all steps necessary?
• Does your method find a solution fast enough?
• Are there any other methods that could work faster?
• Which resources or tools do you need for your solving method or solution?
• Example: is a compass and ruler without measurements enough? [This is sufficient material to devide an angle in two equal pars, but you would need to take measurements if you want to draw a circle with a specific radius.]
• How much space do you need to implement your solution?
• Example: when you want to move, you might want to try to put your closet in the elevator, but it could be more efficient to disassemble it first.
• Is the description of your solution method optimal? (size, transparency…)
• Do you use all known resources? (you might be able to reuse ideas from previous problems and their solving methods)

You should think about all these aspects before, during and after the design phase of your solving method. Designing a good technique to handle the problem might take several iterations.

Example:

You have a bag of M&M’s that you want to sort per color with the following method:

1. You take all red M&M’s from the bag and put them in a seperate pile
2. You take all blue M&M’s from the bag and put them in a seperate pile
3. You take all yellow M&M’s from the bag and put them in a seperate pile
4. You take all green M&M’s from the bag and put them in a seperate pile
5. You take all orange M&M’s from the bag and put them in a seperate pile
6. You take all brown M&M’s from the bag and put them in a seperate pile

These steps will definitely work, but actually the last step is not necessary. After the first five steps, your bag only contains brown M&M’s so you’ve already sorted all M&M’s.