This step reframes design patterns as responses to recurring design forces, not reusable templates or universal best practices.
A design force is a structural pressure in your system—often driven by business change, technical constraints, team structure, quality goals, or long-term evolution. These forces show up as friction: brittle tests, ripple effects from small changes, conditional sprawl, tight coupling, or slow feature delivery.
The key discipline is learning to detect recurring tension before introducing abstraction.
You identify forces by:
-
Observing repeated pain across sprints
-
Analyzing change frequency and co-changing files
-
Watching for conditional explosion
-
Examining test friction and isolation challenges
-
Noticing ripple effects from minor changes
-
Recognizing cognitive overload or hesitation to modify code
Only after clearly naming the force should you evaluate patterns. Each pattern optimizes for one side of a tension while introducing cost—indirection, complexity, more types, and cognitive overhead.
The core exercise is simple but rigorous:
“Because we need ______, we are experiencing ______.”
If you cannot state the force precisely, introducing a pattern is architectural guesswork.
Mastery is not knowing many patterns.
It is recognizing when a recurring force justifies their trade-offs.