A great start is the SOLID object oriented principles from "objectmentor":
- Single Responsibility Principle
- Open Closed Principle
- Liskov Substitution Principle
- Interface Segregation Principle
- Dependancy Inversion Principle
That said, learning good design is a practical skill, you need to get some experience building larger and larger programs to really feel the benefits and understand the costs of different approaches.
Two other skills interact with this. One is learning how to refactor code that is poorly designed and evolve it towards a better design. This means you don't have to get the design perfect up front, you can make mistakes, learn from them, and still make progress on your project. Another is learning to use version control, for much the same reasons (and many more).