3 Laws of Good Software Architecture
Law 1: Good architecture enables architects to have a minimum of irrevocable decisions.
Law 2: To make decisions revocable you need to design for flexibility.
Law 3: To make use of flexibility one needs to refactor mercilessly.