It was 3:17 AM in the wintry place where the blizzard ruled over the land with its unforgiving wind. There was a college kid staring at his monitor, writing lines of codes, and the program constantly challenged the brain with frustrating bugs. It had been 3 hours, everyone was sleeping like a baby, and the outside was haunted by snowy wind. He understood the problem, but couldn't figure out how to solve it, or kind of practice and tools he should use. Suddenly, the big "what-if" moment passed by. The kid started typing fast like a mad prisoner dashing to the escape hole. When keystrokes fell silent, voilà, the frustrating bug was gone. The kid felt materializing a cartharsis inside the brain, expanding bright neurons to the uncharted.
A few months later, this kid faced the same problem again while writing another program. He rewinded the time back in his memory, grabbed his previous solution, and returned back to the present time. This time, the kid made his solution even better because he learned some lessons from his suffering. 3 hours became 7 minutes. The kid enjoyed a deep sleep on that night.
"How do I solve this ideally, based on what I know and the tools I can use?"
Problem Solving is one of the critical traits of a skilled software engineer. Yet, it is very hard to define what this skillset is about and how to improve this, because it stimulates our metacognitive behavior to do so. It's not merely about how well a person does debugging and fixes errors. Also, it's not about how many languages and libraries a person knows. It's about how well a person can design a solution from his current knowledge and experiences. It's exactly like a traditional storytelling model with heroism: a hero faces his hardship, tries to figure out an answer, and the climax arrives. Tony Stark falls and rises again with his new solution; thus, he becomes stronger with new knowledge leading to new discoveries. This is very broad perspective because when it comes to solving problems, the person needs to consider various topics, from functional requirement to performance.
Don't know how to make the logic for this feature? Have you broken down the feature into enough tasks to make it simple? What kind of data structure can you use? What could go wrong if you use this particular for-loop at this line? What if this doesn't guarantee more than one result item? As your Problem Solving skill improves and grows, you start becoming detailed-oriented and curious in many angles, which leads to asking more synthesis questions to your approach.
One great thing about the internet is the ubiquitous access it provides to knowledge you want to learn. You are not the only one who has suffered your particular problem. In fact, there are many people on this planet, who have gone through your pain in the past. They came up with their own solution, and we start to see a pattern of their solution: Best Practice. There are many open source projects and libraries from Github, Bitbucket, Mercurial, and so on, to distribute their solution and helping tools for helping your Problem Solving to grow. At Tivix, we have several Open-Sourced Django libraries on Github to reduce your burdens while providing more solving tools for you to use. More tools and best practices you know, your knowledge expands to make you more capable of thinking how to think in more angles in front of your problem. Are you tired of typing same bash commands over and over again? Can't imagine yourself doing that again on Staging and Production server too? You are not the only one.
"How should I grow my Problem Solving skill?"
A bunch of trials by fire? Nah, you already got burned many times, and you know you hate it. Know what you know and don't know. Look at other people's public solutions and best practices. Learn how they did it and why they did it that way. Look for open source libraries and/or developer blog posts. Re-iterate your problem and solve it by yourself after learning new things. The importance of Problem Solving is higher than before as the current industry trend focuses on several buzzwords: Big Data, Machine-Learning, Scalability, Distributed, Performance. Every startup and app company want their business implementation to be solid, scalable, fast, and attractive. Although these are Big Data & Data Science fields, now the development trend is about tolerance and performance with huge data and transactions as the platform user base is growing every day. How am I supposed to design an app backend that can handle millions of user activities with numerous data columns? Grow your Problem Solving. That's a start.
Photo credit to Ladyheart