Maybe 'Design of computer programs'?
https://www.udacity.com/course/design-of-computer-programs--...
Or study some of Peter Norvig's code for solving poker hands, sudoku etc.?
It's not obvious how to build abstractions at the right level, or to change those abstractions as requirements change.