Building Evolutionary Architectures: Support Constant Change
Building Evolutionary Architectures: Support Constant Change
Authors: Neal Ford, Rebecca Parsons, Patrick Kua
Publisher: O’Reilly Media
Year: 2017
Core Concept
Building Evolutionary Architectures introduces fitness functions as quantifiable measures to guide architectural decisions and ensure systems can evolve safely over time without degrading their desired characteristics.
Key Highlights
Fitness Functions
- Definition: An objective integrity assessment of architectural characteristics
- Purpose: Automate governance and ensure architectural qualities remain intact during evolution
- Types: Atomic (single dimension), holistic (multiple dimensions), triggered (event-based), continuous (always running)
- Examples: Cyclomatic complexity checks, performance budgets, security scans, dependency metrics
Incremental Change
- Guided evolution: Change small parts of architecture iteratively rather than big-bang rewrites
- Reversibility: Design decisions that can be undone or adjusted based on feedback
- Appropriate coupling: Balance between too rigid and too loose coupling based on business needs
- Last responsible moment: Delay irreversible decisions until you have maximum information
Architectural Characteristics
- -ilities that matter: Identify which quality attributes (scalability, security, performance, etc.) are critical for your system
- Trade-offs: Explicitly document architectural trade-offs and their business justification
- Quantifiable metrics: Turn abstract qualities into measurable fitness functions
Practical Patterns
- Strangler Fig Pattern: Gradually replace legacy systems by intercepting calls and routing to new implementation
- Branch by Abstraction: Enable parallel development paths without feature branches
- Consumer-Driven Contracts: Let service consumers define their expectations as executable tests
- Sacrificial Architecture: Build knowing parts will be replaced when understanding improves
Engineering Practices
- Continuous delivery: Enable rapid, safe deployment of changes
- Infrastructure as code: Version and test infrastructure changes like application code
- Hypothesis-driven development: Treat architectural decisions as experiments to validate or refute
- Database migrations: Version database schemas and enable incremental evolution
Key Takeaways
- Architecture is never done - Systems must evolve continuously to meet changing business needs
- Make evolution safe - Fitness functions provide guardrails for architectural change
- Defer decisions strategically - Wait until you have better information, but not so long you’re blocked
- Optimize for change - Design for replaceability rather than reusability
- Automate governance - Turn architectural standards into executable checks
- Embrace trade-offs - Every architectural decision involves compromises; make them explicit
Who Should Read This
- Staff and principal engineers responsible for system architecture
- Technical leads navigating architectural modernization
- Engineering managers fostering evolutionary design cultures
- Anyone dealing with legacy systems that need incremental improvement
Bottom Line
This book shifts architectural thinking from “design it right upfront” to “design for continuous evolution.” By introducing fitness functions and proven patterns, it provides practical tools for Staff Engineers to guide systems through constant change while maintaining quality.