In previous article (Introduction to Problem-Solving) I have outlined some of the relevant research regarding problem-solving. In this article I will touch some points which may help programmers to enhance their problem-solving ability. As it has been mention in previous article : problem-solving abilities are considered as one of the key skills of programmers, therefore learning more about how we solve and not solve problems could possibility brings us further. Here are several tips which may help you regarding problem-solving.
Learn instead of solving the problem
Problem solving is not equal to learning. Now days finding solutions to many programming problems on internet is relatively easy. If you are faced with a problem and you could have solved with quick copy/paste and some code refactoring, you might argue that you have solved problem. Indeed you might have, however you should question yourself whether you have really learned what is the root-cause of the problem. What did you learn out of it, if similar problem rises again can you solve it immediately? The point is you should focus on learning as much as solving single problem solving.
Pure coding can bring you only up to certain point, therefore try to understand the technologies that you are working on it, instead of memorizing superficially. One helpful method might be to learn concepts behind technologies that you are using. Architectural decision behind technologies can help you to solve many different problems, as well as gives you insight when a problem rises. Therefore instead of just using certain technology try to understand what is behind the scenes. Why is it build way it is build, what are the errors? What are the pros and cons?
Take it easy
Trying to learn things quickly results in poor problem-solving skills. This means, slower learning leads better problem-solving skills. When you are estimating time that you need to learn a new language be modest. Just because there is a book called “Teach Yourself 5 databases in 24 Hours” that does not mean you will learn how all 5 databases works. Take it easy and take time to learn.
Practice makes perfect
Exactly, well maybe not. Practise is great because it will allow you to do some of the task automatically, therefore you won’t be occupying your mind, which means available resources can be used for other tasks. Nevertheless, practice is not the guarantee of superior performance however type of practice does matter therefore try to find what is the type of practice that suits you best. For instance: reading other peoples code to gain insight of how they solve problems might be a good practice. Other examples might be, contributing in open source projects, pair programming or finishing incomplete code of other people.
Get a grasp of abstraction
My personal believe is to be a good software developer you need a very good understanding of abstraction. In computer science abstractions are used everywhere. Therefore you have to train your self to understand abstraction. However, this is a relatively hard one. When you are building a system try to make a generic as possible. When you are writing a class try to make a class that can be used for more than one job.
Explain what you know/learn to other people
Talking with people about technical problems and possible ways to solve them should help you as well. And, no I am not talking about brainstorming. I am talking about problem representation, by trying to explain some one who does not have insight the technologies or the problem you have, what you do is you constantly fetch the information from your memory. The beautiful part is that problem representation that you have changes over time. Eventually, you should have a different view than you had initially. This could be accomplish also with writing, it could be technical blog or you could help people on question/answer sites such as stackoverflow.
Give a room for failure
Except the fact that you can not solve everything, and it is best to get help. Being modest, it is a good character trade, and it will allow you to learn from others.
Do not solve all at once
If you have rather large complex task/problem do not try to solve all at once. Divining problems smaller will allow you to solve them quickly and easily so you could solve one after another. However, you can break large complex problems into smaller problems, and solve one by one.
Trial & Error
Well this is not the best one, but it is most used one if you are learning something new. Despite it should not be couraged so much, sometimes it can be helpful to try things quickly then formulating and solving abstractly. However level of trial and error, should be kept small and quick. Also it should be educative.
All learners are not same
All learners are not same, find what suits you best. Some learn best by reading books, some learn best by watching tutorials. Therefore it is important that you find out what is best for you. Just because a book can teach you everything you need to know about a certain technology that does not mean everybody understands it. Some people likes to try out and reading may not be their thing. Long story short: there is more than one way to learn, and you should choose what fits you best.
There are so far no guidelines, neither theories of how to get better in problem solving, or how to solve problems. However, as you can see in most of the arguments important point is learning and problem representation, therefore how you perceive, analyze and categorize a problem is very important.