The Process

  1. Define and Identify the problem.

    • Can you define and express the problem in numbers? (e.g. computing speed is so slow it takes more than 10 minutes to do x, this method has 20% more memory usage than the other method etc.)
    • Think if that problem is even worth solving.
  2. Analyze the root cause of the problem

    • What exactly is the problem? Find the root cause
    • Why do you think it’s a problem?
    • Find where the bottleneck lies.
    • Understand the mechanism (what goes under the hood?): input and output
    • Complicated domains and subjects are mostly due to multiple layers of abstraction.
    • Keep dividing until you narrow down to the core reason.
  3. Solution Design

    • Approach in 1st principle
    • Check the latest trials from others
    • Read, experiment, debate about it
  4. Implement the design

    • Fail fast and iterate a lot. Done is better than perfect
    • Make it work first, then refine it

Keep iterating this cycle until you solve it. There is no more secret sauce, only grind.

Axioms

  1. An individual cannot know every detail about everything but one can go through a lot to find and fix a problem. You don’t need to know everything until you start solving the problem. You get to know along as you try to solve it. In other words, most knowledge should be a byproduct of trial and error, not earned by memorizing things and preparing for school exams.
  2. Understand what is changeable and what isn’t in the given environment/system. What is changeable becomes a tradeoff/design problem. If you don’t like the given system, break it and start from a more fundamental area. You have two choices: build on top or destroy.