In the entrepreneurship world, there is only one skill that’s the most important in the 5 life cycles of an entrepreneur and that’s problem-solving skills. It lies somewhere in-between;
1) Identifying a problem that needs a good solution.
2) Coming up with a solution or a better solution than the already existing solution
3) Creating the solution in form of a product or a service and
4) Packaging, promoting and marketing the product.
5) Rinsing and repeating.
This skill is very important because, without it, you have nothing to sell.
You can identify a very big problem in the society existing inside a big industry, the way forward is to find the solution to that problem before developing it into a billion dollar idea that might turn in enough money for your startup, but when you don’t have the solution to the problem you are stuck in-between crossroads until a great solution shows up.
Let’s drill this down into the programming world. With every precious line of code you punch out, that’s you steadily taking tiny steps through the path leading to the solution to the problem you want your app/software to solve. That makes problem-solving an incredible skill to cultivate.
To effectively think like a programmer you should have the skill of problem-solving running through your veins because that’s what you will be doing every blessed day you live on earth as a programmer.
Before we proceed I would like to let you know that if you think you are not a logical thinker or you don’t possess what it takes to be good at this profession, don’t panic, even the best genius developers out there that engage in spinning out the most unimaginable works of wizardry using codes were once hunted by these same evil thoughts.
I assure you, you can do this. Just like every other thing on planet earth, it’s still learnable.
My goal here is to teach you the way to learn and get good at solving problems so that you can apply it smartly to every problem you encounter in your career as a programmer.
By the end of it, you’ll know exactly what steps to take to be a better problem-solver.
Almost all employers prioritize problem-solving skills first before any other thing else.
Problem-solving skills are almost unanimously the most important qualification that employers look for more than your experience, your programming languages proficiency, debugging, and system design etc.
Demonstrating computational thinking or the ability to break down large, complex problems is just as valuable (if not more so) than the baseline technical skills required for a job.” — Hacker Rank (2018 Developer Skills Report)
Here are the steps:
First things first, you need to understand the problem. Know exactly the question emitting from the problem. Most hard problems are hard because you don’t understand them.
How do you know when you understand a problem? When you can explain it in plain English. Do you remember being stuck on a problem, you start explaining it, and you instantly see holes in the logic you didn’t see before? Most programmers know this feeling.
This is why you should write down your problem, doodle a diagram, or tell someone else about it (or thing… some people use a rubber duck).
“If you can’t explain something in simple terms, you don’t understand it.” — Richard Feynman
Don’t dive right into solving without a plan thinking that somehow hope you will finally find your way through. That’s the problem most programmers tend to make, dont fall into that trap. Plan your solution! Nothing can help you if you can’t write down the exact steps.
Don’t start punching in codes straight away. Give your brain time to analyze the problem and process the information.
To get a good plan, answer this question:
“Given input A, what are the steps necessary to return output B?”
Programmers have a great tool built in to help them with this… that’s called Comments!
This is the most important step of all. Pay close attention here.
Do not make the mistake of trying to solve one big problem. You will grow grey hairs before you are done.
Instead, break it into sub-problems guided by the plan you’ve stated out in section two(2). These sub-problems are much easier to solve.
Then, solve each sub-problem one after the other. Begin with the simplest and forge ahead to the most complicated. The simplest I am referring to are the ones you know the answer or you are somehow close to that answer. And again, simplest here also means this sub-problem being solved doesn’t depend on others being solved.
Once you’ve solved all your sub-problem, connect the dots.
Connecting all your “sub-solutions” will give you the solution to the original problem. Congratulations!
This technique is a cornerstone of problem-solving. Remember it and put it at the back of your brain, that part you stored the details to all the beautiful things you don’t want to forget in life.
That’s it, you have your three steps right away. With these steps to mastering problem-solving skills and now you can develop yourself into the world-class programmer, you’ve always wished to become.
But wait… here are some more that will help you further.
What if you are Stuck?
In some cases you will be stuck or you find yourself in a confused situation that you can’t even solve a sub-problem, even the one that’s supposed to be the simplest. What are you going to do?
Don’t worry, it’s not your fault, this happens to everyone, even the best of the bests!
The difference is the best programmers/problem-solvers are more curious about bugs/errors than irritated.
In fact, here are three things to try when facing a whammy:
Mojority of your time spent writing codes for an app will be spent scrolling back and forth your your solutions trying to find where you went wrong. Programmers used an ugly word for this and it’s called DEBUGGING (in fact, this is all a debugger does).
According to Andrew Singer, the art of debugging is figuring out what you really told your program to do rather than what you thought you told it to do.”
Step back a little, a good view is best achieved when you take a few steps away from the code. Look at the problem from another perspective. Is there anything that can be abstracted to a more general approach?
“Sometimes we get so lost in the details of a problem that we overlook general principles that would solve the problem at a more general level.
The classic example of this, of course, is the summation of a long list of consecutive integers, 1 + 2 + 3 + … + n, which a very young Gauss quickly recognized was simply n(n+1)/2, thus avoiding the effort of having to do the addition.” — C. Jordan Ball
Sidenote: Another way of reassessing is starting anew. Delete everything and begin again with fresh eyes. I’m serious. You’ll be dumbfounded at how effective this is.
Ahh, good ol’ Google. You read that right. No matter what problem you have, someone has probably solved it. Find that person/ solution. In fact, do this even if you solved the problem! (You can learn a lot from other people’s solutions).
Don’t look for a solution to the big problem. Only look for solutions to sub-problems. Why? Because unless you struggle (even a little bit), you won’t learn anything. If you don’t learn anything, you wasted your time.
Practice Practice Practice!
Don’t expect to be great after just one week. If you want to be a good problem-solver, solve a lot of problems!
It’ll only be a matter of time before you recognize that “this problem could easily be solved with <insert concept here>.”
How to practice? There are options out the wazoo!
Chess puzzles, math problems, Sudoku, Go, Monopoly, video-games, cryptokitties, blah… bla… bla….
In fact, a common pattern amongst successful people is their habit of practicing “micro problem-solving.” For example, Peter Thiel plays chess, and Elon Musk plays video-games.
But what are video-games all about? That’s right, problem-solving!
So, what you should do is find an outlet to practice. Something that allows you to solve many micro-problems (ideally, something you enjoy).
For example, I enjoy coding challenges. Every day, I try to solve at least one challenge (usually on Coderbyte).
Like I said, all problems share similar patterns.