Building Evolutionary Architectures, 2nd Edition

Book description

The software development ecosystem is constantly changing, providing a constant stream of new tools, frameworks, techniques, and paradigms. Over the past few years, incremental developments in core engineering practices for software development have created the foundations for rethinking how architecture changes over time, along with ways to protect important architectural characteristics as it evolves. This practical guide ties those parts together with a new way to think about architecture and time.

Publisher resources

View/Submit Errata

Table of contents

  1. Foreword to the First Edition
  2. Foreword to the Second Edition
  3. Preface
    1. The Structure of This Book
    2. Case Studies and PenultimateWidgets
    3. Conventions Used in This Book
    4. Using Code Examples
    5. O’Reilly Online Learning
    6. How to Contact Us
    7. Additional Information
    8. Acknowledgments
  4. I. Mechanics
  5. 1. Evolving Software Architecture
    1. The Challenges of Evolving Software
    2. Evolutionary Architecture
      1. Guided Change
      2. Incremental Change
      3. Multiple Architectural Dimensions
    3. How Is Long-Term Planning Possible When Everything Changes All the Time?
    4. Once I’ve Built an Architecture, How Can I Prevent It from Degrading Over Time?
    5. Why Evolutionary?
    6. Summary
  6. 2. Fitness Functions
    1. What Is a Fitness Function?
    2. Categories
      1. Scope: Atomic Versus Holistic
      2. Cadence: Triggered Versus Continual Versus Temporal
      3. Case Study: Triggered or Continuous?
      4. Result: Static Versus Dynamic
      5. Invocation: Automated Versus Manual
      6. Proactivity: Intentional Versus Emergent
      7. Coverage: Domain-Specific Fitness Functions?
    3. Who Writes Fitness Functions?
    4. Where Is My Fitness Function Testing Framework?
    5. Outcomes Versus Implementations
    6. Summary
  7. 3. Engineering Incremental Change
    1. Incremental Change
      1. Deployment Pipelines
      2. Case Study: Adding Fitness Functions to PenultimateWidgets’ Invoicing Service
      3. Case Study: Validating API Consistency in an Automated Build
    2. Summary
  8. 4. Automating Architectural Governance
    1. Fitness Functions as Architectural Governance
    2. Code-Based Fitness Functions
      1. Afferent and Efferent Coupling
      2. Abstractness, Instability, and Distance from the Main Sequence
      3. Directionality of Imports
      4. Cyclomatic Complexity and “Herding” Governance
    3. Turnkey Tools
      1. Legality of Open Source Libraries
      2. A11y and Other Supported Architecture Characteristics
      3. ArchUnit
      4. Linters for Code Governance
      5. Case Study: Availability Fitness Function
      6. Case Study: Load-Testing Along with Canary Releases
      7. Case Study: What to Port?
      8. Fitness Functions You’re Already Using
    4. Integration Architecture
      1. Communication Governance in Microservices
      2. Case Study: Choosing How to Implement a Fitness Function
    5. DevOps
    6. Enterprise Architecture
      1. Case Study: Architectural Restructuring While Deploying 60 Times per Day
      2. Fidelity Fitness Functions
    7. Fitness Functions as a Checklist, Not a Stick
    8. Documenting Fitness Functions
    9. Summary
  9. II. Structure
  10. 5. Evolutionary Architecture Topologies
    1. Evolvable Architecture Structure
      1. Connascence
      2. Connascence Intersection with Bounded Context
    2. Architectural Quanta and Granularity
      1. Independently Deployable
      2. High Functional Cohesion
      3. High Static Coupling
      4. Dynamic Quantum Coupling
    3. Contracts
      1. Case Study: Microservices as an Evolutionary Architecture
    4. Reuse Patterns
      1. Effective Reuse = Abstraction + Low Volatility
      2. Sidecars and Service Mesh: Orthogonal Operational Coupling
      3. Data Mesh: Orthogonal Data Coupling
    5. Summary
  11. 6. Evolutionary Data
    1. Evolutionary Database Design
      1. Evolving Schemas
      2. Shared Database Integration
    2. Inappropriate Data Entanglement
      1. Two-Phase Commit Transactions
      2. Age and Quality of Data
      3. Case Study: Evolving PenultimateWidgets’ Routing
    3. From Native to Fitness Function
      1. Referential Integrity
      2. Data Duplication
      3. Replacing Triggers and Stored Procedures
      4. Case Study: Evolving from Relational to Nonrelational
    4. Summary
  12. III. Impact
  13. 7. Building Evolvable Architectures
    1. Principles of Evolutionary Architecture
      1. Last Responsible Moment
      2. Architect and Develop for Evolvability
      3. Postel’s Law
      4. Architect for Testability
      5. Conway’s Law
    2. Mechanics
      1. Step 1: Identify Dimensions Affected by Evolution
      2. Step 2: Define Fitness Function(s) for Each Dimension
      3. Step 3: Use Deployment Pipelines to Automate Fitness Functions
    3. Greenfield Projects
    4. Retrofitting Existing Architectures
      1. Appropriate Coupling and Cohesion
      2. COTS Implications
    5. Migrating Architectures
      1. Migration Steps
      2. Evolving Module Interactions
    6. Guidelines for Building Evolutionary Architectures
      1. Remove Needless Variability
      2. Make Decisions Reversible
      3. Prefer Evolvable over Predictable
      4. Build Anticorruption Layers
      5. Build Sacrificial Architectures
      6. Mitigate External Change
      7. Updating Libraries Versus Frameworks
      8. Version Services Internally
      9. Case Study: Evolving PenultimateWidgets’ Ratings
    7. Fitness Function-Driven Architecture
    8. Summary
  14. 8. Evolutionary Architecture Pitfalls and Antipatterns
    1. Technical Architecture
      1. Antipattern: Last 10% Trap and Low Code/No Code
      2. Case Study: Reuse at PenultimateWidgets
      3. Antipattern: Vendor King
      4. Pitfall: Leaky Abstractions
      5. Pitfall: Resume-Driven Development
    2. Incremental Change
      1. Antipattern: Inappropriate Governance
      2. Case Study: “Just Enough” Governance at PenultimateWidgets
      3. Pitfall: Lack of Speed to Release
    3. Business Concerns
      1. Pitfall: Product Customization
      2. Antipattern: Reporting Atop the System of Record
      3. Pitfall: Excessively Long Planning Horizons
    4. Summary
  15. 9. Putting Evolutionary Architecture into Practice
    1. Organizational Factors
      1. Don’t Fight Conway’s Law
      2. Culture
      3. Culture of Experimentation
      4. CFO and Budgeting
    2. The Business Case
      1. Hypothesis- and Data-Driven Development
      2. Fitness Functions as Experimental Media
    3. Building Enterprise Fitness Functions
      1. Case Study: Zero-Day Security Vulnerability
      2. Carving Out Bounded Contexts Within Existing Integration Architecture
    4. Where Do You Start?
      1. Low-Hanging Fruit
      2. Highest Value First
      3. Testing
      4. Infrastructure
      5. Case Study: Enterprise Architecture at PenultimateWidgets
    5. Future State?
      1. Fitness Functions Using AI
      2. Generative Testing
    6. Why (or Why Not)?
      1. Why Should a Company Decide to Build an Evolutionary Architecture?
      2. Why Would a Company Choose Not to Build an Evolutionary Architecture?
    7. Summary
  16. Index
  17. About the Authors

Product information

  • Title: Building Evolutionary Architectures, 2nd Edition
  • Author(s): Neal Ford, Rebecca Parsons, Patrick Kua, Pramod Sadalage
  • Release date: November 2022
  • Publisher(s): O'Reilly Media, Inc.
  • ISBN: 9781492097549