This article explores the concept of "change locality" as a practical test for evolutionary architecture, emphasizing the ability of a team to make localized business changes without needing global context. It identifies "boundary drift" as a primary cause for the loss of change locality, where the actual path of change deviates from the system's structural boundaries. The article proposes strategies like redistributing mechanics, exposing policies, and rehearsing exception paths to restore and maintain change locality in complex, evolving systems.
Read original on InfoQ ArchitectureChange locality is a critical property in evolutionary architecture, asserting that a business capability has locality when the responsible team can make changes without needing to reconstruct the entire system. It means the understanding required for a change should be proportional to the change's scope. For example, updating address UI should not require understanding the entire delivery model, but changing address policy might appropriately involve coordination with fulfillment and fraud teams, provided that coordination is explicit.
Key Questions for Change Locality
For a team to confirm change locality for a capability, they should be able to answer three questions without global context: 1. What can change here? 2. What contract protects neighboring work? 3. What evidence proves the change is safe?
Boundary drift occurs when the initial hypotheses about system boundaries—which decisions or components should change together—no longer align with the actual paths of change required by the business. This misalignment often stems from product expansion, team reorganizations, platform responsibilities shifting, or supporting capabilities becoming core. The result is that a team, like a checkout team for an e-commerce system, might still "own" a request (e.g., changing an address) but no longer owns all the decisions determining its safety (e.g., warehouse cutoffs, fraud rules, delivery partner instructions).
This drift leads to disproportionate cognitive load, where a local-looking request requires understanding complex, non-local context. Signals include features touching many systems with unclear ownership, incidents relying on tacit knowledge from specific engineers, lengthy onboarding due to uncodified knowledge, or extensive code review threads on small changes due to disagreement on correct behavior.
Architects can restore change locality through deliberate trade-offs and structural interventions. The core idea is to make decisions clear and keep them with the teams that understand them. This involves:
Example: Address Change Request
To restore locality for an address change request: * Fulfillment service exposes an API to determine if an order can be changed, including cutoff times and fraud status. * Fraud service exposes specific fraud rules and checks through its own API. * Checkout team consumes these explicit services and policies, allowing it to safely implement address changes by orchestrating calls and reacting to clear decisions, rather than inferring complex business rules.