I prefer Norvig's "Design of computer programs" over this: https://www.udacity.com/course/design-of-computer-programs--...
I learned how to build a vocabulary for the problem domain first, and then use the vocabulary to solve the actual problem through this course. Norvig has great examples on bottom-up problem solving approach.