shadowing variables • avoid cyclic dependency • avoid inheritance • avoid mutation • prefer explicit dependency • prefer stateless functions • pure functions are testable • … I can just apply functional techniques instead of switching to a functional language