Philosophy
Have a clear understanding of a problem.
Decompose it into subproblems can be matched to existing solutions.
Analyze the tradeoff between existing solutions and provide appropriate abstraction.