The process of computational thinking leads to problem solving approaches. Problem solving approaches are a foundation of algorithms that can be turned into code. Problem solving is an essential skill for a computer scientist. There exist a number of general algorithm design techniques, but there exists no “recipe” or a “bag of tricks” for solving any problem. Students become better problem solvers when they enjoy the creative process, learn common techniques, learn from mistakes, and build up their confidence. We list main misconceptions that arise.
- People are either born to be good problem solvers/puzzle solvers or they are not.
Yes, a few people seem to be natural problem/puzzle solvers. However, hardworking and persistent students often achieve just as much. Students will become better problem solvers/puzzle solvers through practice and learning when to apply known techniques .
- There exist extensive on-line resources of algorithms or programs so that whenever I need to solve a new problem, I can find a similar solution. All I need to do is make modifications.
There exist a few general algorithm design techniques. It may look like there is a bag of tricks and techniques that can be used to solve every problem. Unfortunately, this is not the case. Coming up with algorithms requires creativity as well as an understanding of whether and how known techniques can be applied or modified.
- The first solution or algorithm one comes up with is often the best one.
Typically not true. A first solution demonstrates that there is a solution, but often improvements are possible. See, for example, Finding the lighter suitcase.
- I thought about a solution long enough and I can’t find one. There probably is none.
That can be the attitude of an overly confident student or someone who hasn’t been engaged in many problem solving activities. Proving that there is no solution is often hard, if possible at all. See, for example, the Case of the mutilated chessboard.
- Once my program works on selected inputs, I can be pretty sure that it always produces the correct answer.
Can be a dangerous attitude with life threatening consequences in the real world. Correctness by example is not correctness. A programmer needs to learn effective testing and debugging techniques to help ensure their solution will work with most, if not all, inputs. Even after testing a debugging, unexpected input can cause problems. Debugging and testing code are challenges for the software industry.
- There is little value in coming up with incorrect solutions.
A lot can be learned from mistakes. There can be a lot of creativity and value in solutions that are not correct. One learns from understanding where they fail (it is a form of debugging).
- If there are two different solutions, one is typically better than the other.
This is sometimes true. There are better and worse solutions. However, often there are several good solutions for a problem. An important question is how better is defined. Many problems have multiple solutions and what is better is not always easy to figure out. See, for example, the two solutions for summing the digits in an integer.
- Converting a well specified algorithm into a program is easy.
The effort needed depends on the coding experience and the level of difficulty of the problem. Seemingly straightforward algorithmic tasks at times turn out to be a challenge to implement and debug.
- Explaining the solution to a student is just as good a learning experience as the student finding the solution herself/himself.
Students become better problem solvers by solving problems, by trying what works and what does not work, by drawing conclusions that broaden their algorithmic thinking skills. Doing this for them – by giving them solutions or hints that leave no room for creativity – eliminates this experience and removes the related learning experience.