You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: patterns/architect-for-flow.md
+54-8Lines changed: 54 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,12 @@
12
12
-[Fast flow through small batches](#fast-flow-through-small-batches)
13
13
-[Co-creation, codesign, and coevolution](#co-creation-codesign-and-coevolution)
14
14
-[Benefits](#benefits)
15
+
-[Out of scope](#out-of-scope)
15
16
-[Practical guidance](#practical-guidance)
17
+
-[Principles](#principles)
18
+
-[Practices](#practices)
19
+
-[How to measure flow](#how-to-measure-flow)
20
+
-[Common anti-patterns](#common-anti-patterns)
16
21
-[Examples](#examples)
17
22
18
23
## Context
@@ -44,6 +49,8 @@ This requires aligning business domains, team ownership, services/products, and
44
49
- coordination and hand-offs are minimised
45
50
- learning happens early and often
46
51
52
+
This is a deliberate application of [Conway's Law](https://martinfowler.com/bliki/ConwaysLaw.html) which states that software architecture tends to mirror the communication and coordination structures of the organisation. By shaping team boundaries, ownership, and interfaces together, we make sure organisational design reinforces fast, independent flow instead of constraining it.
53
+
47
54
## The mindset
48
55
49
56
Modern architecture recognises that software systems do not exist in isolation. Their behaviour, quality, speed of change, and reliability are shaped just as much by people, team structures, incentives, and ways of working as by code, infrastructure, or technologies.
@@ -87,7 +94,7 @@ Each independent value stream is owned by a **stream-aligned team**. That team:
87
94
- Builds, deploys, operates, and improves what they own
88
95
- Optimises for outcomes and flow, not hand-offs
89
96
90
-
Architecture should reduce the need for teams to coordinate in order to deliver change.
97
+
Architecture should reduce the need for teams to coordinate in order to deliver change. In practice this means "reversing" [Conway's Law](https://www.agileanalytics.cloud/blog/team-topologies-the-reverse-conway-manoeuvre), which is intentionally designing teams, communication paths, and ownership boundaries so that the resulting architecture naturally supports fast, independent delivery.
91
98
92
99
### Services, products, and ownership
93
100
@@ -98,6 +105,13 @@ Architecting for flow means aligning:
98
105
- Runtime boundaries
99
106
- Team ownership
100
107
108
+
Teams should anchor this alignment on business outcomes rather than lists of features. For example, in a cancer screening domain:
109
+
110
+
- Outcome: "Increase uptake of bowel cancer screening invitations by 2% in the next year"
111
+
- Feature: "Add a reminder SMS template for screening invitations"
112
+
113
+
The outcome describes the change in behaviour or value you want to see, the feature is one possible intervention. Architecturally, ownership, data, and interfaces should be shaped so that stream-aligned teams can experiment with multiple features in pursuit of the same outcome.
114
+
101
115
A common smell is when:
102
116
103
117
- Multiple teams must change their services together
@@ -110,11 +124,12 @@ Instead:
110
124
- Ownership boundaries should be obvious
111
125
- Dependencies should be explicit and intentional
112
126
127
+
Some domains are naturally cross-cutting, such as shared notification services, analytics, or identity. In a cancer screening context, a notification capability (for example NHS Notify) might send reminders across Bowel, Breast, and Cervical screening services. These cross-cutting capabilities are usually best owned by platform or enabling teams (at organisation scale, not just within a single digital area), exposed through clear APIs and contracts, and governed with explicit service level objectives (SLOs). Typical shared capabilities include messaging infrastructure, observability stacks, and identity/SSO services. Platform and enabling teams should optimise for the flow of the stream-aligned teams they support, not for their own internal roadmap, ensuring shared services make it easier (and faster) for value streams to deliver change.
128
+
113
129
### Bounded contexts and domain alignment
114
130
115
131
Clean **bounded contexts** are essential to flow. Key principles:
116
132
117
-
- Split systems vertically by domain, not horizontally by technical layers
118
133
- Avoid shared databases across bounded contexts
119
134
- Encapsulate data, logic, and behaviour within each context
120
135
- Accept duplication where it reduces coupling and coordination
@@ -157,24 +172,55 @@ This is a deliberate move away from big up-front designs.
157
172
158
173
## Benefits
159
174
160
-
Systems architected for flow tend to deliver strong outcomes. However
175
+
Systems architected for flow tend to deliver strong outcomes. Typical benefits include:
176
+
177
+
- Shorter lead times from idea to production and higher deployment frequency
178
+
- Reduced coordination overhead between teams, with fewer hand-offs to deliver change
179
+
- Improved reliability and faster incident recovery due to clearer ownership and boundaries
180
+
- Better morale and engagement, as teams have autonomy and a clear sense of purpose
181
+
182
+
Important caveats and trade-offs:
161
183
162
184
- Flow must not compromise quality, strong automation is essential (testing, security, deployment)
163
185
- More components ≠ better as over-fragmentation increases cognitive load and operational cost, small or simple systems may benefit from a well-structured modular monolith
164
-
- Distributed systems introduce complexity, network failures has to be factored in, versioning challenges become a norm, observability becomes mandatory
186
+
- Distributed systems introduce complexity, network failures have to be factored in, versioning challenges become the norm, observability becomes mandatory
165
187
- Reuse is not the primary goal, build components for clear ownership and flow, reuse is a secondary benefit, not a justification
166
188
167
189
There is usually a sweet spot between monoliths and over-distributed systems.
168
190
191
+
## Out of scope
192
+
193
+
This pattern is intentionally narrow in what it tries to solve. It does not optimise for maximum reuse across the entire organisation, nor does it address all cross-cutting concerns (for example security or regulatory compliance) on its own. Those concerns are covered by complementary principles and practices. Architecting for flow should be combined with them, not treated as a replacement.
194
+
169
195
## Practical guidance
170
196
171
-
- Split systems by bounded context, not by technical layers
172
-
- Avoid shared databases between components
173
-
- Ensure components interact only via public APIs (external to the internal service API)
174
-
- Design services so a single team can change and deploy them independently
197
+
### Principles
198
+
199
+
- Split systems vertically by bounded context or domain, not purely by technical layers
200
+
- Avoid shared databases between components or bounded contexts
201
+
- Ensure components interact only via public, well-defined APIs
175
202
- Align repositories, pipelines, and runtime ownership with team boundaries
203
+
204
+
### Practices
205
+
206
+
- Design services so a single team can change and deploy them independently
176
207
- Apply this pattern to existing systems as well as greenfield work, techniques like the [Strangler Fig](https://martinfowler.com/bliki/StranglerFigApplication.html) pattern can help evolve legacy systems safely
177
208
209
+
### How to measure flow
210
+
211
+
Flow is only useful if teams can see whether it is improving. Guidance on how to measure this is covered in the [engineering metrics](../insights/metrics.md) section of the framework. These measures should be used as feedback loops to guide architectural and organisational changes, not as targets to game. The goal is to make it easier for teams to deliver small, safe, independent changes more often.
212
+
213
+
### Common anti-patterns
214
+
215
+
When architecting for flow, some recurring anti-patterns make independent delivery much harder:
216
+
217
+
- Shared "integration" databases owned or written to by multiple teams
218
+
- "Platform" teams acting as gatekeepers for most changes
219
+
- Services sliced primarily by technical layers (UI, API, DB) rather than by domain or value stream
220
+
- "API gateways" that accumulate significant domain logic and tight coupling between services
221
+
222
+
These are usually signs that Conway's Law is working against you, the architecture reflects centralised ownership and tightly coupled communication paths. Use them as prompts to realign teams, domains, and boundaries so value streams can move independently.
223
+
178
224
## Examples
179
225
180
226
We have examples of live systems where this pattern has been applied in practice and continues to evolve. If you would like to explore concrete examples, including what worked well, what was learned, and where trade-offs were made, please get in touch. These systems can be discussed collaboratively and used as shared learning opportunities to help teams apply the pattern effectively in their own contexts.
0 commit comments