Hi Marko,
I think it's difficult to teach the material of APOSD unless students are actually building systems, so they can experience the impact of their design choices. In my class, the time when students start to "get it" is when they have turned in their first projects (which are nontrivial) and they get code reviews from me: I point out places where their code is too complicated, show how the complexity arises because they have violated one of the principles from APOSD, and then show how the code can be made simpler by following the principles. Without all of the details of code they have written, and also the opportunity to rewrite, it's hard to appreciate the principles. For example, pseudo-code might not seem too complicated, but when you have to write code that actually compiles and runs, all of the subtle dependencies and complexities appear.
It would be great if there was a way to teach software design without a significant effort in actually writing code, but I haven't found it yet. If anyone should figure out a way, I'd love to hear about it!
-John-