9. Design for evolution 
In the cloud, business requirements, technologies, and user expectations change rapidly. Designing for evolution ensures your application can adapt to new demands, integrate emerging technologies, and remain maintainable over time. This approach reduces technical debt and helps future-proof your solution. 
All applications change over time, to fix bugs, add new features, or bring in new technologies. If all parts of the application are tightly coupled, it becomes very hard to introduce changes. A change in one part may break another or cause changes to ripple through the code base. 
For example, if your application is built using microservices, you can update a single service to add a new feature or fix a bug without redeploying the entire system. This minimises risk and allows for faster innovation. 
 
Best Practices 
- Loose Coupling: Design your application with loosely coupled components, where only part of a single service needs to be updated.  
 
- Deploy services independently: Design your application and release process so each service can be updated on its own. This allows faster safer rollouts of bug fixes and new features.  
 
- Keep domain logic out of gateways: Use gateways only for infrastructure tasks like routing, load balancing, authentication, or protocol translation. Avoid embedding domain knowledge to prevent heavy dependencies.  
 
- Use modular architecture: Break your application into modules or microservices that can be developed, deployed, and scaled independently.  
 
- Embrace API-first design: Use APIs to decouple services and enable easier integration with new systems or features.  
 
- Automate testing and deployment: Implement CI/CD pipelines to streamline updates and reduce risk when making changes.  
 
- Version your APIs and services: Support backward compatibility and smooth transitions when introducing new features.  
 
- Document dependencies and interfaces: Maintain clear documentation to help teams understand how components interact and what can change safely. 
 
By designing for evolution, you ensure your application remains adaptable, maintainable, and ready for future business and technology changes. 
For more details, see Microsoft’s guidance on designing for evolution. 
 
10. Build for the needs of the business 
Every technical decision should be driven by clear business objectives. Building for the needs of the business ensures that your application delivers real value, supports strategic goals, and remains cost-effective and sustainable. This approach helps avoid over-engineering, wasted resources, and solutions that don’t meet user or stakeholder expectations. 
For example, if your business requires high availability for customer-facing services, prioritise redundancy and failover in your architecture. If cost control is a key objective, leverage auto-scaling and reserved instances to optimise cloud spend. 
 
Best Practices 
- Engage stakeholders early and often: Collaborate with business leaders, end users, and other stakeholders to understand requirements, priorities, and constraints.  
 
- Translate business requirements into technical specifications: Ensure that features, performance targets, and compliance needs are clearly documented and mapped to architectural decisions.  
 
- Define business objectives: Define the recovery time objective (RTO), recovery point objective (RPO), and maximum tolerable outage (MTO).  
 
- Document SLAs and SLOs: Document the service level agreement (SLAs) and service level objectives (SLOs) required by the business.  
 
- Plan for growth: Design your solution to handle more users, higher transaction volumes, and larger data storage without major architectural changes. Keep the service and data models flexible to accommodate evolving business requirements.  
 
- Prioritise features based on business impact: Focus development effort on capabilities that deliver the greatest value or address the most critical risks.  
 
- Design for agility: Build flexibility into your architecture so you can respond quickly to changing business needs, market conditions, or regulatory requirements.  
 
- Manage costs: In the cloud, you pay for what you use. Understand pricing models for compute, storage, network, and other services to avoid unexpected expenses.  
 
- Monitor business outcomes: Use metrics and feedback loops to measure how well your application supports business goals and adjust as needed. 
 
- Consider failure risks: Design your solution architecture with availability and redundancy.  
 
By building for the needs of the business, you ensure your Azure solutions deliver measurable value, remain cost-effective, and adapt to evolving requirements. 
For more details, see Microsoft’s guidance on building for business.