Problem solving is the process of creating a solution for a problem. This skill is required for many careers in modern life, but it’s rarely defined or taught. It’s normally assumed to be a trait, not a skill that can be learned and developed. This assumption is incorrect. It’s especially required in programming, as programmers often face new problems.

Problem-solving ability is proportional to working memory, and working memory is the top indicator of expertise. Therefore, an expert has greater problem-solving ability, at least in his or her field of expertise. That means they can solve complex problems in their field with greater ease than novices.

The typical process of solving a problem starts with breaking that problem into smaller independent pieces. This continues until the pieces can no longer be subdivided, or they fit within working memory. Once this is complete, the second stage begins.

In the second stage, smaller problems are solved. There are three fundamental methods for this. The least productive method is to try things at random. While this is unproductive, it’s often a necessary first step for a completely unknown problem. The slightly better method is to start with a solution to a similar problem and adjust it. This creates a fast solution and is often the method people choose. Solutions created in this manner are rarely fully optimized, but that may not be required. The last and best method is to think through the problem logically and create a logical solution. Sometimes this doesn’t work, but when it does, it can create optimal solutions. This is the solution from first principles.

That’s all there is to problem-solving. Some individuals are unable to create a solution from first principles. It seems to be related to inhibitory control, which is often proportional to intellect. Different minds work differently, so if you have trouble creating new paradigms, then focus on the second method. Learn all the solutions you can find. Each will provide a great starting point for a new solution. If you are in the exceptionally or profoundly gifted category, then learn the concepts found in other solutions. You can learn from anything, even solutions to problems outside of your field of expertise. Each solution uses concepts that can be understood and reapplied.

The ability to solve problems is a skill, but like all skills, it must be properly applied. Before solving a problem, you must know exactly what that problem is. Each problem must be clearly defined. Sometimes it takes more work to clearly define the problem than it takes to solve it. You may only have a vague idea of what the problem is, or the problem may involve expertise you don’t have. Programming often involves other disciplines, such as accounting, engineering, math, or science. To solve these problems, you must first learn that skill or work closely with another expert.

The next step is QA. QA must be performed on every solution before implementation begins. A mathematician applies a solution to the given problem and ensures it works. A programmer working with neural nets applies the neural net equation to a set of test data to gauge its response. Problem-solving is no different. A great programmer doesn’t need to code a project to know if it will work or not. They can determine it directly from the design. As a programmer, you should be able to look at a design, know if it works, approximate the run-time (assuming well-optimized code), and assess usability.

All problems have multiple solutions. The best problem solvers can create multiple solutions for each problem. Each solution should be analyzed, and the best one chosen.