How to "Problem-Solve" Like A Pro!
Experienced developer explains the phrase "problem-solving skills" to mere mortals.
Introduction
One of the most frequently asked questions by beginners or junior developers is, "what does it mean when job ads or interviewers ask about 'problem-solving' skills?" or some variant of it.
This question is a tricky one to answer. Not because it's difficult but because the ones answering the question usually fall into the trap of regurgitating the same old answers that left the beginners confused in the first place.
Typical Answer
The typical answer goes something like this:
Problem-solving skills are when programmers break big problems down into smaller problems. They solve the smaller problems individually, then put the solved pieces back together for a larger solution. This generally requires a lot of experience working as a developer and there is no direct or easy way to train for this, other than gaining experience.
Why This is the Wrong Answer
Factually speaking the answer above is correct. However, there is nothing actionable that can be found in the text above that beginners or juniors can learn from.
The reason this kind of answer, and this way of thinking, requires experience is because of the way the definition is approached. What does it mean to bring it down into smaller problems? That on its own makes no sense. What do you break it down to? How do you know you've broken it down to small enough problems?
This is all very vague. No wonder it leaves people with the impression that problem-solving skills aren't easy to learn and require a lot of experience. The worst part is, this leaves people, especially beginners and juniors, thinking there is one right way to approach each problem, and once they have some experience they will also reach this nirvana where they will be able to break down problems with their eyes closed.
Does all this mean beginners and juniors should not be expected to be able to solve problems? Au contraire! We just need to approach the definition and explanation of problem-solving skills from a different angle.
The Right Answer
Problem-solving skills aren't unique to programming so the claim that you would need experience in programming to be able to effectively figure out how to utilize this skill is a bit misguided, in my opinion.
The part about knowing how to break large problems down into smaller ones is fairly accurate. But how do you approach that?
Legos
We are all familiar with Legos. They are awesome!
But they also help us understand problems the same way you're required to understand problems in programming.
If you start with blocks spread all over in front of you, it is quite a difficult task to imagine what you could build with them. However, when you know what you want to build, you can start to collect the basic building blocks that will help you get to your goal. There is very little familiarity with the building blocks required before you can start to put together something to create what you want.
Similarly, with programming, you need an understanding of the basic building blocks, and the basic tools and understand how to use them. And when you're shown a large problem, all you have to do is break that problem down to, and this is important, specific programming building blocks that you have learned about.
This is the way The C Programming Language by K&R is designed. They start with the very basic building blocks and then show how you can create different things using those blocks.
In my opinion, this should be the core concept in programming education anyway. Writing code isn't that complicated. Breaking things down isn't that complicated either. The fact that this concept has been overcomplicated shows a failure in how we train our software developers.
Losing Weight
Another way to think about problem-solving is how people approach losing weight. It doesn't take a genius to understand you can't lose 30 pounds in a day. Most everyone approaches this task broken down into smaller chunks of realistic targets.
Conclusion
That's all these highly sought-after skills are. Understand the basic building blocks of the technology you are using to solve problems and it isn't going to take you years to figure out how to break larger problems into smaller ones. The only advantage to having some years of experience using the same building blocks is that you are able to find and use the basic building blocks faster. However, this is no different from doing anything else in life. Practice makes perfect.
The focus should be not on hiring people who "have problem-solving skills" since this is a meaningless criterion. The focus should be on hiring people who understand what to break the large problems down to...what are the most basic building blocks.
And in my experience, this is a lot easier to search for, test for, and train for.