Build to change instead of build to last
• Understand the end user needs and the domain before designing components
• Identify sub-systems in your product and consider layers and components to abstract them and identify the key interfaces
• Use an incremental and iterative approach to designing the architecture
• Learn from company history, document your decisions and identify and mitigate key risks