If you want to learn how to solve problems you should have a clear idea of what problems you’re trying to solve. Software developers typically solve computational problems. The branch of scholarship that’s most relevant is computer science. Within computer science, in my humble opinion, the areas that are most practical to computational problem solving are flowchart diagrams, writing pseudo-code, algorithm design, and design patterns.
It’s hard to overstate how important having a good plan is when trying to solve programming problems. Flowcharts and pseudo-code are two of the most effective ways to model problems, break them down, and then model possible solutions. If you’re not diagramming problems and writing pseudo-code. I would urge you to start there.
Beyond pseudo code and diagrams, learning about algorithms and design patterns are critical to solving problems. If you learn about algorithms and their design you’re well on your way to learning how to crush problems on Codewars. Design patterns are more geared to solving problems related specifically to creating, structuring, and determining the behavior of the building blocks of an application.
Once you have a basic understanding of all four areas, I think the only way to get better at problem solving is to solve problems. Codewars, Coderbyte et al. are a good option for practicing writing algorithms. Building projects from scratch is a way to practice both writing algorithms and implementing design patterns.
With regard to algorithms I would reccommend checking out this free self-paced course offered by Stanford. I have not taken it yet, but it’s on my 2018 to do list.
@GreenApple76’s link Solving Problems Breaking It Down is also highly recommended. I actually used Job Sonmez’s process to solve interview problems. The only thing Jon didn’t emphasize was diagramming the problem. I think diagrams are an excellent tool for thinking through problems, especially control flow problems.
There is one other topic that is important to computational problem solving: Discrete Math. Anybody that’s serious about getting good at solving computational problems, at some point should build a solid foundation in Discrete math. I’m mentioning it last because it’s arguably not necessary for holding a software development job. That said, it’s almost certainly one of the topics that will make you monumentally better at solving computational problems if you can learn how to practically apply it.