Also, don't let OOP run your world. Your job is to write software that does stuff. It may be neat to completely encapsulate every object in such a way that Dog inherits from Animal, but if, right now, you only need a Dog, don't waste time working on Animal.
Chances are, you'll know when you need to use inheritance because you'll find yourself writing similar code on similar objects.
I found that after learning about Design Patterns I suffered about 6 months of pattern-itus where everything I wrote had be use design patterns.
That's why I recommended the Refactoring to Patterns book specifically -- it's about getting working code first and then patternising it when it's needed (same with Fowlers Refactoring too, but Refactoring to Patterns is more explicit about this).
The main programming philosophy I follow is:
1. Get the code working
2. Make it faster, smaller, and easier to maintain, if that is what is needed.
This is also why I like Test Driven Development -- it makes the refactoring easier with regression testing.
With all these book referrals, maybe I should set up one of those Amazon pass-through sites to make comission