System Design Space
Knowledge graphSettings

Updated: April 16, 2026 at 10:57 AM

Evolutionary architecture in practice

hard

A breakdown of Alexander Polomodov's talk on how incremental changes, fitness functions, and deliberate coupling keep architecture changeable as products and teams grow.

Evolutionary architecture becomes real not on slides, but when the product grows, teams scale, and the cost of change starts slowing the business down. This chapter focuses on that transition from an attractive idea to an everyday engineering necessity.

Its practical value comes from linking customer growth, integrations, and organizational complexity to concrete choices: step size, change boundaries, component coupling, fitness functions, and the signals that show when the current structure is no longer holding.

In architecture walkthroughs, it gives you pragmatic language for evolution: why not everything should change at once, how to choose a safe migration sequence, and why deferring a change can sometimes matter as much as making one.

Practical value of this chapter

Adoption in practice

Shows how evolutionary approaches are applied in real product teams and delivery processes.

Change boundaries

Helps choose safe architecture step size and migration sequence.

Progress metrics

Teaches measurable signals for whether architecture change is improving the system.

Interview pragmatism

Provides practical language for what to change now, defer later, and why.

Source

Evolutionary architecture in practice

A breakdown of Alexander Polomodov's talk on keeping architecture changeable as the product grows.

Перейти на сайт

Evolutionary architecture becomes a practical concern when the product grows, the team scales, and the cost of change starts affecting delivery speed and system quality directly.

In this chapter, evolutionary architecture is treated as the ability to change a system safely through small steps, keep important quality attributes under control with fitness functions, manage coupling deliberately, and preserve clear guardrails around each architectural quantum.

Why this topic appears

The topic becomes real when stream-aligned teams appear, lead time starts growing, and the system increasingly mirrors the way teams communicate and divide ownership.

Drivers of change

  • As the customer base and product portfolio grow, every architectural change becomes more expensive.
  • The more integrations connect products, the more dependency and coordination overhead the system accumulates.
  • As teams split by product flow, the architecture starts reflecting organizational boundaries more directly.

Key idea

Architecture should make change easier, not become the main obstacle to growth. The evolutionary approach exists to preserve quality while constant change is happening.

What architecture means here

Architecture as a set of important decisions

These are decisions that are hard and expensive to reverse, so they should never be made casually.

Architecture as boundaries and trajectory

It defines not only how the system is shaped today, but also how it will be able to evolve tomorrow.

What makes architecture evolutionary

Video

Talk: Evolutionary architecture in practice

Tinkoff Agile Conference 2021: how to turn architecture evolution from an idea into an engineering practice.

Перейти на сайт

Incrementality

Small changes are easier to design, test, roll out, and roll back when necessary.

Controllability

Changes should stay inside clear boundaries for quality, risk, and cost.

Why this matters

  • Engineering: small changes are easier to build and verify.
  • Delivery: smaller releases are safer and faster to roll back.
  • Product: new capabilities are easier to connect to specific architecture changes.

Three pillars of evolutionary architecture

Book

Building Evolutionary Architectures

The book behind the practical frame: incremental change, executable constraints, and controlled evolution.

Читать обзор

Incremental changes

The system should support small steps instead of waiting for one massive rewrite.

Fitness functions

Automated checks keep architectural constraints alive in day-to-day engineering.

Appropriate coupling

Components should depend on each other only as much as the problem actually requires.

Visual evolution map

Flow of change

Incremental changes

1/3

Small steps are easier to implement, verify, and release safely.

Fitness functions

2/3

Checks preserve quality and keep important constraints from drifting.

Appropriate coupling

3/3

Components can evolve independently instead of pulling each other around.

Formula

Incrementality + controllability

Without controllability, even useful increments slowly turn into chaos.

Guardrails

Quality attributes and acceptable budgetsAutomated checks in CIClear team ownership boundariesDecision logs and decision contextRegular coupling reviews
Goal: preserve the speed of change without sacrificing quality, resilience, or predictability.

Why increments alone are not enough

Uncontrolled iterations eventually turn the system into spaghetti, both in the code itself and in the integration layer between services. A prototype can survive that for a while; a production system needs explicit limits that protect the structure.

Fitness functions and quality attributes

In this part, it helps to separate maintainability, auditability, and usability: each one constrains architecture differently, and all of them require executable rules rather than informal team memory.

What it is

A fitness function is a measurable check that confirms the system remains fit for change within predefined limits.

Characteristics

availabilitymaintainabilityauditabilityusabilityscalabilitysecurity

How to build the frame

  • Define the quality attributes that actually matter.
  • Set priorities and acceptable tolerance ranges.
  • Translate those limits into metrics, tests, and architectural rules.
  • Automate the checks and run them on every meaningful change in CI.

Tools mentioned in the talk

  • ArchUnit — dependency and layer rules through unit tests in Java.
  • Danger — automated change and review checks inside CI.
  • FitV / Fitness Validator — an internal tool for monitoring architectural rules and technical debt.

Coupling and component stability

Book

Clean Architecture

Helps explain how stability and abstraction affect the controlled evolution of components.

Читать обзор

Stable Dependencies Principle (SDP)

Dependencies should point toward components that are more stable.

Stable Abstraction Principle (SAP)

The more stable a component is, the more abstract it should be.

Stability metrics

Instability I = Ce / (Ca + Ce)
Abstraction A = Na / Nc

Ce means outgoing dependencies, Ca means incoming dependencies.

Main Sequence

Zone of Pain

Stable but overly concrete components are hard to extend and expensive to change.

Main Sequence

A healthy balance between stability and the right level of abstraction.

Zone of Uselessness

Overly abstract components that almost nobody depends on.

When architecture needs to change

One team can no longer hold it together

No single team can keep the whole system in mind, and manual coordination starts multiplying.

Delivery is slowing down

Lead time grows, and cross-team blocking becomes a visible part of the work.

Cognitive complexity has become too high

Routine changes require too much context about the system, the people, and the integrations.

Architecture changes are almost always tied to team changes: under Conway's Law, the system eventually starts mirroring how people communicate and divide responsibility.

What to do next

  • Define the critical quality attributes and the limits you are willing to tolerate.
  • Turn those constraints into automated checks in CI and into everyday engineering practice.
  • Review component coupling regularly and watch for degradation signals before they become systemic problems.
  • To go deeper, continue with the book summary on evolutionary architecture and then compare it with the Clean Architecture material.Read review

Related chapters

Enable tracking in Settings