Problem-solving skills seem to be undervalued among engineering and developers, in particular. Getting better at problem-solving can lift your developer career, shape the way you think about problems and accelerate logical thinking. I can't emphasize enough how important it is for engineers. Let's have a look at how problem-solving using computational thinking can help.
What exactly is Computational Thinking?
A short definition from Wikipedia is following:
In education, computational thinking is a set of problem-solving methods that involve expressing problems and their solutions in ways that a computer could also execute.
Before programming the solution to a problem, we need to understand a problem and find ways to solve it. This process involves initial thinking about the problem, its limitations, and desired outcome. Our solution, the algorithm, should be logical and well-suited for a computer-based solution. You need exactly to understand what do you want to tell a computer to do and how better to represent the solution. Thinking through problems this way is Computational Thinking. Computational Thinking allows us to take complex problems, understand what the problem is, and develop solutions. We can present these solutions in a way that both computers and people can understand.
It is an iterative process so many iterations could be possible in the process.
Computational Thinking consists of 4 foundational parts
- Problem Identification
- Pattern Recognition
Let's briefly take a look at each of these.
When identifying problems we need to think about the following:
Topic: What is the big problem we're trying to solve? Can you form a problem statement out of it? Is the problem statement broad or too vague, something unclear?
Data: What data or information do you have at the moment that can contribute to a problem-solving approach? What other data or information you might need?
Feasibility: Can you solve the problem given what you know? Is this problem solvable with a computer?
Decomposition, also known as factoring is a process of breaking down a complex problem/system into smaller solvable sub-problems which lead to solving a bigger problem.
You have your problem statement. Can you break your big problem down into smaller sub-problems that are more straightforward to solve?
If the problem statement is too big, it is difficult to see how you can go about developing a conceptual solution
If you can decompose your big problem into smaller sub-problems, you can start to think about how you can solve those smaller, specific sub-problems.
Solving sub-problems can help you arrive at a solution for your original problem statement
You can use flow charts, a tree structure, or other visual tools to help with this.
Pattern Recognition is a process of recognizing similar patterns or characteristics that can potentially lead to solving a problem.
Can you identify similar/familiar patterns or characteristics that can lead you to a potential solution?
Finding the similarities or patterns can help us to solve these problems more efficiently.
Things to think about...
Have you seen solutions to similar problems previously that we can use here? Can you think of similar problems that have been solved before that could help you address these problems?
How is this problem the same or different from other problems you have identified or addressed?
Abstraction is a process of identifying
- the most important parts that are relevant to the problem
- non-essential aspects that can be ignored or are not suitable/helpful for solving a problem.
Can we identify non-essential aspects of a problem that can be ignored?
This involves filtering out, or ignoring, aspects of the problem or any patterns you might have identified in order to concentrate on the necessary aspect of the problem or potential solution.
Are some parts of the problem less relevant to a successful outcome?
Problem Solving Using Computational Thinking at Coursera
I recently completed a course called "Problem Solving Using Computational Thinking" - University of Michigan and had a lot of fun doing it. I can highly recommend enrolling in it, that's a great start to computation thinking and problem solving for beginners.
The course includes an introduction to computational thinking and a broad definition of each concept, a series of real-world cases that illustrate how computational thinking can be used to solve complex problems, and a student project that asks you to apply what they are learning about Computational Thinking in a real-world situation. This project will be completed in stages (and milestones) and will also include a final disaster response plan you'll share with other learners like you.
This course is designed for anyone who is just beginning programming, is thinking about programming or simply wants to understand a new way of thinking about problems critically. No prior programming is needed. The examples in this course may feel particularly relevant to a High School audience and were designed to be understandable by anyone.
The final task of this course was to develop an algorithm responding to a potential natural disaster/critical situation or threat at a known location.
Background and Context
My topic was "Response to a new wave of coronavirus COVID-19 (SARS-CoV-2) pandemic".
I am assuming the role of Governing Mayor of Berlin, Germany, and I have to decide whether or not I should introduce a new lockdown period in response to another wave of coronavirus disease COVID-19. I just learned that the number of new cases grew significantly compared to the last quarter and still growing. What actions should I take?
I went through a few iterations of Problem Identification, Decomposition, Pattern Recognition, and Abstraction using a graphical organizer.
Final task was rated 20 from 20 points:
I've completed the course with 100% Grade
Other technics for problem-solving
What other problem technics do you know? How do you approach problem-solving in your daily life, at work, or at home in different situations?
This article is using ideas, wordings, and quotes from the following sources/authors: