Skip to content

Commit 82b8e6a

Browse files
committed
Address feedback
1 parent dd6b829 commit 82b8e6a

File tree

1 file changed

+47
-46
lines changed

1 file changed

+47
-46
lines changed

patterns/architect-for-flow.md

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
- [Core concepts and how they fit together](#core-concepts-and-how-they-fit-together)
88
- [Independent value streams (Lean Thinking)](#independent-value-streams-lean-thinking)
99
- [Stream-aligned teams (Team Topologies)](#stream-aligned-teams-team-topologies)
10-
- [Services, products, and ownership](#services-products-and-ownership)
11-
- [Bounded contexts and domain alignment](#bounded-contexts-and-domain-alignment)
12-
- [Fast flow through small batches](#fast-flow-through-small-batches)
13-
- [Co-creation, codesign, and coevolution](#co-creation-codesign-and-coevolution)
10+
- [Services, products, and ownership (Socio-technical alignment)](#services-products-and-ownership-socio-technical-alignment)
11+
- [Bounded contexts and domain alignment (Domain-Driven Design)](#bounded-contexts-and-domain-alignment-domain-driven-design)
12+
- [Fast flow through small batches (Continuous Delivery / Accelerate)](#fast-flow-through-small-batches-continuous-delivery--accelerate)
13+
- [Co-creation, co-design, and co-evolution](#co-creation-co-design-and-co-evolution)
1414
- [Benefits](#benefits)
1515
- [Out of scope](#out-of-scope)
1616
- [Practical guidance](#practical-guidance)
@@ -40,27 +40,27 @@ Architecting for flow means intentionally shaping systems around:
4040
- Clear bounded contexts
4141
- Loosely coupled services and products
4242

43-
The primary goal is not technology elegance, reuse, or theoretical purity. The goal is fast flow, which is the ability for teams to deliver small, incremental changes frequently, with confidence.
43+
The primary goal is not technical elegance, reuse, or theoretical purity. The goal is fast flow, the ability for teams to deliver small, incremental changes frequently, with confidence.
4444

45-
This requires aligning business domains, team ownership, services/products, and architecture boundaries so that:
45+
This requires aligning business domains, team ownership, services and products, and architectural boundaries so that:
4646

47-
- teams can work independently
48-
- changes are small and low-risk
49-
- coordination and hand-offs are minimised
50-
- learning happens early and often
47+
- Teams can work independently
48+
- Changes are small and low risk
49+
- Co-ordination and hand-offs are minimised
50+
- Learning happens early and often
5151

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.
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 co-ordination structures of the organisation. By shaping team boundaries, ownership, and interfaces together, we ensure organisational design reinforces fast, independent flow rather than constraining it.
5353

5454
## The mindset
5555

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.
56+
Modern architecture recognises that software systems do not exist in isolation. Their behaviour, quality, speed of change, and reliability are shaped as much by people, team structures, incentives, and ways of working as by code, infrastructure, or technology.
5757

58-
Poorly shaped architectures create:
58+
When architecture is not aligned with flow, it can lead to:
5959

6060
- Change coupling across teams
61-
- Slow delivery and high coordination costs
61+
- Slow delivery and high co-ordination costs
6262
- Fragile systems and risky releases
63-
- Unhappy, frustrated engineers and users
63+
- Reduced satisfaction among engineers and users
6464

6565
Well-shaped architectures enable:
6666

@@ -76,27 +76,27 @@ Architecting for flow is therefore a business optimisation strategy, not just an
7676

7777
### Independent value streams (Lean Thinking)
7878

79-
An **independent value stream** is the fundamental building block. Each value stream:
79+
In Lean Thinking, a **value stream** is the end-to-end flow of activities required to deliver value to a specific user or customer outcome. In this pattern, an independent value stream is one where a team can make most day-to-day changes without needing co-ordinated work from many other teams. An independent value stream is the fundamental building block. Each value stream:
8080

8181
- Is aligned to a business subdomain
8282
- Is owned by a single stream-aligned team
8383
- Delivers business outcomes, not just features
8484
- Can be developed and deployed independently
8585

86-
Architecture should make independence real, not just aspirational.
86+
Architecture should help turn independence from aspiration into day-to-day reality.
8787

8888
### Stream-aligned teams (Team Topologies)
8989

9090
Each independent value stream is owned by a **stream-aligned team**. That team:
9191

92-
- Owns the product or service end-to-end
92+
- Owns the product or service end to end
9393
- Makes day-to-day product and technical decisions
9494
- Builds, deploys, operates, and improves what they own
9595
- Optimises for outcomes and flow, not hand-offs
9696

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.
97+
Architecture should reduce the need for teams to co-ordinate in order to deliver change. In practice, this means "reversing" [Conway's Law](https://www.agileanalytics.cloud/blog/team-topologies-the-reverse-conway-manoeuvre), intentionally designing teams, communication paths, and ownership boundaries so that the resulting architecture naturally supports fast, independent delivery.
9898

99-
### Services, products, and ownership
99+
### Services, products, and ownership (Socio-technical alignment)
100100

101101
Architecting for flow means aligning:
102102

@@ -112,10 +112,10 @@ Teams should anchor this alignment on business outcomes rather than lists of fea
112112

113113
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.
114114

115-
A common smell is when:
115+
A common sign of misalignment is when:
116116

117117
- Multiple teams must change their services together
118-
- Features require cross-team coordination by default
118+
- Features require cross-team co-ordination by default
119119
- Teams share databases or internal implementation details
120120

121121
Instead:
@@ -124,21 +124,21 @@ Instead:
124124
- Ownership boundaries should be obvious
125125
- Dependencies should be explicit and intentional
126126

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.
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 organisational 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 roadmaps, ensuring shared services make it easier (and faster) for value streams to deliver change.
128128

129-
### Bounded contexts and domain alignment
129+
### Bounded contexts and domain alignment (Domain-Driven Design)
130130

131-
Clean **bounded contexts** are essential to flow. Key principles:
131+
In Domain-Driven Design, a **bounded context** is a clear boundary within which a specific domain model, language, and set of rules apply consistently. Different bounded contexts can use different models and terms for the same real-world concept, as long as the seams and integration points between them are explicit and well-defined. Clear bounded contexts are essential to flow. Key principles include:
132132

133133
- Avoid shared databases across bounded contexts
134134
- Encapsulate data, logic, and behaviour within each context
135-
- Accept duplication where it reduces coupling and coordination
135+
- Accept duplication where it reduces coupling and co-ordination
136136

137137
Bounded contexts reduce change coupling, allowing teams to move independently. Collaborative techniques such as [EventStorming](https://www.eventstorming.com/) are strongly encouraged to identify meaningful domain boundaries.
138138

139-
### Fast flow through small batches
139+
### Fast flow through small batches (Continuous Delivery / Accelerate)
140140

141-
Flow improves when teams:
141+
Continuous Delivery and the Accelerate research both show that teams achieve better outcomes when they work in **small, independently releasable batches** rather than large, infrequent changes. Small batches reduce risk, shorten feedback loops, and make it easier to understand, test, and recover from problems. Flow improves when teams:
142142

143143
- Deliver small slices of value
144144
- Deploy frequently
@@ -147,50 +147,51 @@ Flow improves when teams:
147147

148148
Architecture should actively support:
149149

150-
- Independent deployments
151-
- Progressive delivery
152-
- Feature toggling
153-
- Observability and fast feedback
150+
- [Independent deployments](./deployment.md)
151+
- [Progressive delivery](./little-and-often.md)
152+
- [Feature toggling](../practices/feature-toggling.md)
153+
- [Observability](../practices/observability.md)
154+
- [Fast feedback](./fast-feedback.md)
154155

155-
Large, coordinated releases are a sign that flow is being constrained by architecture.
156+
Large, co-ordinated releases often indicate that flow may be constrained by architectural or organisational choices.
156157

157-
## Co-creation, codesign, and coevolution
158+
## Co-creation, co-design, and co-evolution
158159

159160
Architecting for flow is not a one-off design activity. It requires a **co-creation approach**, where:
160161

161162
- Engineers, product managers, domain experts, and users collaborate
162163
- Architecture evolves incrementally
163164
- Decisions are revisited as learning increases
164165

165-
Architecture should be **codesigned and coevolved** with the system:
166+
Architecture should be **co-designed and co-evolved** with the system:
166167

167168
- Changes are made in small, safe steps
168169
- Learning feeds back into design
169170
- Teams continuously improve both the product and the architecture
170171

171-
This is a deliberate move away from big up-front designs.
172+
This shifts emphasis from big up-front design towards more incremental, learning-driven design.
172173

173174
## Benefits
174175

175176
Systems architected for flow tend to deliver strong outcomes. Typical benefits include:
176177

177178
- 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+
- Reduced co-ordination overhead between teams, with fewer hand-offs to deliver change
179180
- Improved reliability and faster incident recovery due to clearer ownership and boundaries
180181
- Better morale and engagement, as teams have autonomy and a clear sense of purpose
181182

182183
Important caveats and trade-offs:
183184

184185
- Flow must not compromise quality, strong automation is essential (testing, security, deployment)
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
186-
- Distributed systems introduce complexity, network failures have to be factored in, versioning challenges become the norm, observability becomes mandatory
187-
- Reuse is not the primary goal, build components for clear ownership and flow, reuse is a secondary benefit, not a justification
186+
- More components ≠ better as over-fragmentation increases cognitive load and operational cost, and small or simple systems may benefit from a well-structured modular monolith
187+
- Distributed systems introduce complexity, network failures must be factored in, versioning challenges become the norm, and observability becomes mandatory
188+
- Reuse is a valuable outcome but not the primary goal here, components should first support clear ownership and flow, with reuse as a secondary benefit
188189

189190
There is usually a sweet spot between monoliths and over-distributed systems.
190191

191192
## Out of scope
192193

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+
This pattern is intentionally narrow in what it tries to solve. It does not optimise for maximum reuse across the 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.
194195

195196
## Practical guidance
196197

@@ -203,8 +204,8 @@ This pattern is intentionally narrow in what it tries to solve. It does not opti
203204

204205
### Practices
205206

206-
- Design services so a single team can change and deploy them independently
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
207+
- Design services so that a single team can change and deploy them independently
208+
- Apply this pattern to existing systems as well as greenfield work, techniques such as the [Strangler Fig](https://martinfowler.com/bliki/StranglerFigApplication.html) pattern can help evolve legacy systems safely
208209

209210
### How to measure flow
210211

@@ -215,11 +216,11 @@ Flow is only useful if teams can see whether it is improving. Guidance on how to
215216
When architecting for flow, some recurring anti-patterns make independent delivery much harder:
216217

217218
- Shared "integration" databases owned or written to by multiple teams
218-
- "Platform" teams acting as gatekeepers for most changes
219+
- Platform teams that sit on the critical path for most changes
219220
- 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+
- "API gateways" that accumulate significant domain logic and create tight coupling between services
221222

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+
These patterns often suggest that organisational and architectural structures may be reinforcing centralised ownership and tight coupling. Use them as prompts to realign teams, domains, and boundaries so value streams can move independently.
223224

224225
## Examples
225226

0 commit comments

Comments
 (0)