John Ousterhout, Professor at Stanford
I already read this book two times and probably I will do many more, the idea of teaching design to people is very interesting. I like the idea that software development is in most aspects related to creative work like painting and music. Specially, the design phase is really difficult to master and probably to teach as well.
Working code is not enough
You need to practice! A lot!
Define semantics to eliminate exceptions. Minimize the number of places to handle exceptions
Try to find big abstraction! Depth is more important than length
Classes should be deep! Information hiding is good
Error that people make the most: too many, too small, too shallow classes
You should make the common case, really really easy