- Spend some time with the problem
- “What would make this easy?”
- Make it like something familiar
- Make it concrete
- Look for shortcuts and refine
- What worked? Why? Can it be combined with something else or consolidated?
- What didn’t work? Why? Do I need that? Can we bypass the problem entirely?
- What should be changed to improve? Is that feasible?
- Repeat with a smaller version of the big cycle.
Example: Coding Problems
- Understand Requirements (Understand the problem)
- Specify Input/Output (understand the problem)
- Question assumptions (understand and what would make this easy)
- Think and explore solutions (applying what woudl make this easy and is this like something I’ve seen before)
- Describe an implementation (make it concrete)
- Walk through the implementation with sample input (test)
- Implement in code (make it concrete, test and refine)
Steps 3-6 get cycled, occasionally revisiting 1 and 2.
Example: Engineering Problem
My process for designing a widget to solve a problem with my 3D printer is
- Specify the requirements. That is, what do I need this widget to do (Understand the problem)
- Scope the problem. What don’t I need it do? (Understand)
- See what’s been done before (Understand and what woudl make this easy, is this like something familiar)
- Sketch a solution (Understand the problem and what would make this easy, make it concrete)
- Design a print (make it concrete)
- Print and apply (make it concrete, test and refine)
- Repeat 3-5 (test and refine, unless things are really not working, then go back to 1)