Solving problems
Knowledge is knowing where the answers might lie. Solving problems is knowing how to apply the knowledge you have to solve a thing.
Elon Musk has a great 5-step engineering process to solve technical problems.
I like to be methodical when approaching and solving problems I have.
For me solving a problem usually involves going through these four steps:
- Find what the problem I want to solve is.
- Break the problem down to smaller parts I can solve.
- Work on solving the task and nothing else.
- Solve the problem.
1. Find what the problem is
Most often the difficulty of solving some task is simply due to it not being clearly expressed for me. I get the majority the tasks I work on from my task manager 2Do, GitHub issues and TODO:
's in the code. And I make sure that I understand fully well what the problem actually is before solving it.
2. Break the problem down to smaller parts
Once I found and understand what it is I want to solve. I look into it more and see if I can try to break down the problem into smaller parts I can work on. Often times this might not be necessary and I can start working on the task immediately but in times when the task I need to solve is either hard or stated too vaguely, I break it down further into parts that I can pick up and work on individually.
Usually I break things down using MindNode. I break down a problem into series of steps I can approach solving and then go through each of the steps to solve what I originally wanted to solve, modifying and adjusting things in light of newly found insights.
It often looks like this. Where LA and epictools are two tasks/projects with subtasks.
MindNode lets you focus in on one of the nodes for better focus.
Can also use arrows with descriptions for more high level views. Above is example of one brainstorming session.
Often times I do the decoupling of the task inside the app I am working in itself, be it a code editor (as comments) or 2Do (as note).
Other times I sketch problems out in FigJam or Excalidraw collaboratively with others.
Sometimes I doodle things on iPad with Procreate or Notes apps.
3. Work on solving the task and nothing else
I make sure to do the one task I have at hand with no distractions.
4. Solve the problem
As mentioned in research, I mostly use Google for searching mixed in with DuckDuckGo. I heavily use Dash for documentation and Dictionary for searching the wiki. I also use IRC and various forums specific to the problem I am solving.
I often remind myself of how to effectively ask questions so as to respect other people's time and maximize chances of getting a good answer.
Sometimes I already know the answer given my past experience without conducting help outside and the only thing left is to apply the solution I have.
In some cases, a problem may be complex enough that it needs time thinking more about it. Researching various possible solutions and things you could use. And playing with possible solutions and ideas in your head until you reach something worthwhile you can spend time implementing. This talk by Rich Hickey covers this point quite well.
Notes
- I learned about the Feynman technique. Just write down how the thing you’re trying to learn works (a bug, a technique, anything) until you hit a wall in your understanding. This makes the boundary of your understanding explicit. Often, it’s surprising how much you actually do understand before hitting the wall, but before you build confidence, there’s a bias to assume the amount you don’t understand is greater than it really is. Make the boundary explicit, and then you have a specific point to push forward from, rather than kind of a cloud of doubt and anxiety. This made it clear that I knew more than I felt I knew, and at the very least helped me hone in on specific questions to ask.
- Usually the easiest way to solve a problem is to not have it.
- When someone comes to you with a problem, before you start to fix it, ask “What are you trying to achieve?”
- Reframing your problem can be a potent way to find solutions. “How can I grow?” Open, generic, often not actionable. “What’s stopping me from growing?” Direct, specific, insightful, and it requires radical honesty and self awareness.
- When confronted with a problem I don’t understand: don’t just guess. Investigate.
- The first step to solve any problem is to recognize what problem spaces you are in.
- Tell me what would have to be true to do x by y.
- Debugging technique I've been perfecting recently: when it's late at night and I've been banging my head on some bug (but have my mind fully wrapped around the symptoms), go to sleep. In the morning, usually solve it within 15 minutes. Subconscious really knows what it's doing.
Links
- Ask HN: What has made you a better problem solver in software engineering? (2019)
- Pen and Paper Programming: what notation, if any, do you use? (2020)
- Tools/practices to manage deeply nested thought-stacks? (2020)
- Problem-solving tips
- How to scope work (2020)
- Problem solving - Introspecting on improving my product problem solving skills.
- Ask HN: How to improve my abstract thinking? (2020)
- Ask HN: How can I “work-out” critical thinking skills as I age? (2020)
- Ask HN: How to Think Clearly? (2020)
- Problem Solving Techniques (2020)
- Start with pen and paper (HN)
- 4 Different Perspectives to Solve Problems (2020)
- Hammock Driven Development - Rich Hickey (Summary)
- Adding is favored over subtracting in problem solving (2021) (HN)
- How to Learn Complex Things Quickly: A Guide (2021) (HN)
- Using Paper for Everyday Tasks (2021) (Lobsters)
- Move fast, but understand the problem first (2021) (HN)
- Ask HN: What problem are you close to solving and how can we help? (2021)
- How I Write Code: Pen and Paper (2021) (HN)
- I Don't Understand This (Yet) (2021) (HN)
- Decomplication: How to Find Simple Solutions to Hard Problems (2016)
- Focused and Diffuse: Two Modes of Thinking (2019) (Tweet)
- Getting Unstuck (2021)
- How to think like a detective (2021) (HN)
- Elon Musk's 5-Step Protocol for Successful Engineering (2021)
- The programmer's brain in the lands of exploration and production (2021)
- System Dynamics: Systems Thinking and Modeling for a Complex World (2020)
- A Few Notes on Problem Solving (2022)
- Problem solving strategies in a graduate real analysis course (2010) (HN)
- How to program it
- Practical Guide to Solving Hard Problems (2022) (HN)
- Ask HN: Books recommendations on developing critical thinking? (2022)
- Contributing to Complex Projects (2022)
- Developers spend most of their time figuring the system out (HN)
- Questions for a new technology (2019)