Skip to content

Commit dd6b829

Browse files
committed
Address feedback
1 parent 4d93f89 commit dd6b829

File tree

1 file changed

+54
-8
lines changed

1 file changed

+54
-8
lines changed

patterns/architect-for-flow.md

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
- [Fast flow through small batches](#fast-flow-through-small-batches)
1313
- [Co-creation, codesign, and coevolution](#co-creation-codesign-and-coevolution)
1414
- [Benefits](#benefits)
15+
- [Out of scope](#out-of-scope)
1516
- [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)
1621
- [Examples](#examples)
1722

1823
## Context
@@ -44,6 +49,8 @@ This requires aligning business domains, team ownership, services/products, and
4449
- coordination and hand-offs are minimised
4550
- learning happens early and often
4651

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+
4754
## The mindset
4855

4956
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:
8794
- Builds, deploys, operates, and improves what they own
8895
- Optimises for outcomes and flow, not hand-offs
8996

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.
9198

9299
### Services, products, and ownership
93100

@@ -98,6 +105,13 @@ Architecting for flow means aligning:
98105
- Runtime boundaries
99106
- Team ownership
100107

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+
101115
A common smell is when:
102116

103117
- Multiple teams must change their services together
@@ -110,11 +124,12 @@ Instead:
110124
- Ownership boundaries should be obvious
111125
- Dependencies should be explicit and intentional
112126

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+
113129
### Bounded contexts and domain alignment
114130

115131
Clean **bounded contexts** are essential to flow. Key principles:
116132

117-
- Split systems vertically by domain, not horizontally by technical layers
118133
- Avoid shared databases across bounded contexts
119134
- Encapsulate data, logic, and behaviour within each context
120135
- Accept duplication where it reduces coupling and coordination
@@ -157,24 +172,55 @@ This is a deliberate move away from big up-front designs.
157172

158173
## Benefits
159174

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:
161183

162184
- Flow must not compromise quality, strong automation is essential (testing, security, deployment)
163185
- 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
165187
- Reuse is not the primary goal, build components for clear ownership and flow, reuse is a secondary benefit, not a justification
166188

167189
There is usually a sweet spot between monoliths and over-distributed systems.
168190

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+
169195
## Practical guidance
170196

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
175202
- 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
176207
- 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
177208

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+
178224
## Examples
179225

180226
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

Comments
 (0)