With a constant stream of new tools, frameworks, techniques, and paradigms, the software development ecosystem is constantly changing. In the past five years alone, incremental advances in core engineering practices for software development have inspired the industry to recognize how architecture itself must evolve to meet constantly changing user demands. In this thoroughly updated edition, authors Neal Ford, Rebecca Parsons, Patrick Kua, and Pramod Sadalage provide real-world case studies that take into account the recent, growing support for the evolution of software development.
In three parts, this book covers:
• Mechanics: Part I includes chapters that define the mechanics of evolutionary architecture—how teams use techniques and tools to build fitness functions, deployment pipelines, and other mechanisms for governing and evolving software projects
• Structure: Part II includes coverage of architecture styles and design principles around coupling, reuse, and other pertinent structural considerations for cleaner evolution over time
• Impact: Part III examines the intersection of the engineering practices presented in Part I and the structural considerations from Part II
Neal Ford is a director, software architect, and meme wrangler at Thoughtworks. Dr. Rebecca Parsons is Thoughtworks’ chief technology officer. Patrick Kua is a seasoned technology leader with more than 20 years of experience. Pramod Sadalage bridges the divide between database professionals and application developers as director of data and DevOps at Thoughtworks.
Author(s): Neal Ford, Rebecca Parsons, Patrick Kua, Pramod Sadalage
Edition: 2
Publisher: O'Reilly Media
Year: 2022
Language: English
Commentary: Publisher's PDF | Published: December 2022 | Revision History: 2022-11-22: First Release
Pages: 262
City: Sebastopol, CA
Tags: Software Engineering; Best Practices; Software Architecture; Evolutionary Architecture
Cover
Copyright
Table of Contents
Foreword to the First Edition
Foreword to the Second Edition
Preface
The Structure of This Book
Case Studies and PenultimateWidgets
Conventions Used in This Book
Using Code Examples
O’Reilly Online Learning
How to Contact Us
Additional Information
Acknowledgments
Part I. Mechanics
Chapter 1. Evolving Software Architecture
The Challenges of Evolving Software
Evolutionary Architecture
Guided Change
Incremental Change
Multiple Architectural Dimensions
How Is Long-Term Planning Possible When Everything Changes All the Time?
Once I’ve Built an Architecture, How Can I Prevent It from Degrading Over Time?
Why Evolutionary?
Summary
Chapter 2. Fitness Functions
What Is a Fitness Function?
Categories
Scope: Atomic Versus Holistic
Cadence: Triggered Versus Continual Versus Temporal
Case Study: Triggered or Continuous?
Result: Static Versus Dynamic
Invocation: Automated Versus Manual
Proactivity: Intentional Versus Emergent
Coverage: Domain-Specific Fitness Functions?
Who Writes Fitness Functions?
Where Is My Fitness Function Testing Framework?
Outcomes Versus Implementations
Summary
Chapter 3. Engineering Incremental Change
Incremental Change
Deployment Pipelines
Case Study: Adding Fitness Functions to PenultimateWidgets’ Invoicing Service
Case Study: Validating API Consistency in an Automated Build
Summary
Chapter 4. Automating Architectural Governance
Fitness Functions as Architectural Governance
Code-Based Fitness Functions
Afferent and Efferent Coupling
Abstractness, Instability, and Distance from the Main Sequence
Directionality of Imports
Cyclomatic Complexity and “Herding” Governance
Turnkey Tools
Legality of Open Source Libraries
A11y and Other Supported Architecture Characteristics
ArchUnit
Linters for Code Governance
Case Study: Availability Fitness Function
Case Study: Load-Testing Along with Canary Releases
Case Study: What to Port?
Fitness Functions You’re Already Using
Integration Architecture
Communication Governance in Microservices
Case Study: Choosing How to Implement a Fitness Function
DevOps
Enterprise Architecture
Case Study: Architectural Restructuring While Deploying 60 Times per Day
Fidelity Fitness Functions
Fitness Functions as a Checklist, Not a Stick
Documenting Fitness Functions
Summary
Part II. Structure
Chapter 5. Evolutionary Architecture Topologies
Evolvable Architecture Structure
Connascence
Connascence Intersection with Bounded Context
Architectural Quanta and Granularity
Independently Deployable
High Functional Cohesion
High Static Coupling
Dynamic Quantum Coupling
Contracts
Case Study: Microservices as an Evolutionary Architecture
Reuse Patterns
Effective Reuse = Abstraction + Low Volatility
Sidecars and Service Mesh: Orthogonal Operational Coupling
Data Mesh: Orthogonal Data Coupling
Summary
Chapter 6. Evolutionary Data
Evolutionary Database Design
Evolving Schemas
Shared Database Integration
Inappropriate Data Entanglement
Two-Phase Commit Transactions
Age and Quality of Data
Case Study: Evolving PenultimateWidgets’ Routing
From Native to Fitness Function
Referential Integrity
Data Duplication
Replacing Triggers and Stored Procedures
Case Study: Evolving from Relational to Nonrelational
Summary
Part III. Impact
Chapter 7. Building Evolvable Architectures
Principles of Evolutionary Architecture
Last Responsible Moment
Architect and Develop for Evolvability
Postel’s Law
Architect for Testability
Conway’s Law
Mechanics
Step 1: Identify Dimensions Affected by Evolution
Step 2: Define Fitness Function(s) for Each Dimension
Step 3: Use Deployment Pipelines to Automate Fitness Functions
Greenfield Projects
Retrofitting Existing Architectures
Appropriate Coupling and Cohesion
COTS Implications
Migrating Architectures
Migration Steps
Evolving Module Interactions
Guidelines for Building Evolutionary Architectures
Remove Needless Variability
Make Decisions Reversible
Prefer Evolvable over Predictable
Build Anticorruption Layers
Build Sacrificial Architectures
Mitigate External Change
Updating Libraries Versus Frameworks
Version Services Internally
Case Study: Evolving PenultimateWidgets’ Ratings
Fitness Function-Driven Architecture
Summary
Chapter 8. Evolutionary Architecture Pitfalls and Antipatterns
Technical Architecture
Antipattern: Last 10% Trap and Low Code/No Code
Case Study: Reuse at PenultimateWidgets
Antipattern: Vendor King
Pitfall: Leaky Abstractions
Pitfall: Resume-Driven Development
Incremental Change
Antipattern: Inappropriate Governance
Case Study: “Just Enough” Governance at PenultimateWidgets
Pitfall: Lack of Speed to Release
Business Concerns
Pitfall: Product Customization
Antipattern: Reporting Atop the System of Record
Pitfall: Excessively Long Planning Horizons
Summary
Chapter 9. Putting Evolutionary Architecture into Practice
Organizational Factors
Don’t Fight Conway’s Law
Culture
Culture of Experimentation
CFO and Budgeting
The Business Case
Hypothesis- and Data-Driven Development
Fitness Functions as Experimental Media
Building Enterprise Fitness Functions
Case Study: Zero-Day Security Vulnerability
Carving Out Bounded Contexts Within Existing Integration Architecture
Where Do You Start?
Low-Hanging Fruit
Highest Value First
Testing
Infrastructure
Case Study: Enterprise Architecture at PenultimateWidgets
Future State?
Fitness Functions Using AI
Generative Testing
Why (or Why Not)?
Why Should a Company Decide to Build an Evolutionary Architecture?
Why Would a Company Choose Not to Build an Evolutionary Architecture?
Summary
Index
About the Authors
Colophon