Learning the art of programming, like most other disciplines, consist of first learning the rules and then learning when to break them.
Joshua Bloch