Be Software Architecture Wise
Be Wise Apps

Leer en español · Lire en français · Auf Deutsch lesen

Section 11.5 of 11.8 · Advanced · 24 min read

Team Topologies and socio-technical design

Video lesson

5 min · narrated, with captions
Listen only (audio)
Read the transcript

Who owns each part of a system matters as much as how the parts are drawn. In this lesson you'll learn to design teams and software together, using Team Topologies.

Think of a restaurant group. Each restaurant's kitchen serves its own diners, from start to finish. A central supplier delivers ingredients and equipment to every kitchen from a simple catalogue, so the cooks needn't run a farm. A specialist pastry workshop makes the one product that's too difficult for every kitchen to master. And a visiting head chef spends a few weeks teaching a kitchen a new technique, then leaves. Team Topologies gives software organisations the same four kinds of team.

Conway's law says a system tends to copy the way its teams communicate. So deciding how teams are formed, and what each one owns, is an architectural decision. Team Topologies, by Matthew Skelton and Manuel Pais, first published in 2019, aims for fast flow: a steady stream of small changes, with little waiting between teams. Its teams are long-lived, and usually five to nine people. For architects, this changes the job. A service boundary is only good if some team can own it fully.

Most teams should be stream-aligned: aligned to one flow of change, such as ordering, and owning it end to end, right through to running it in production. They're the default. The other three types exist to reduce their burden. A platform team provides internal services, such as pipelines, runtime and observability, as a product. Other teams consume it through self-service. That's the X-as-a-Service mode. An enabling team of specialists helps another team gain a capability, here reliability, and then moves on. That's the facilitating mode. A complicated subsystem team owns a part that needs rare expertise, such as the dispatch algorithm. Here it works in collaboration with the couriers team, for a limited time. Collaboration should be time-boxed. And if a team meant to use a service keeps needing meetings, the interface or the boundary is probably wrong.

Team cognitive load is the total a team must hold in its heads to build, run and change what it owns. Overload it, and you get slow delivery, fragile on-call and knowledge stuck in one or two people. So size responsibilities deliberately. Give each domain to a single team. A team can usually handle two or three simple domains, but a team with a complex domain should own nothing else. Reduce extraneous load, the difficulty that comes from how the work is set up rather than from the domain itself, with platforms, automation and good documentation. And when something grows too big for one team, split it along a fracture plane. A bounded context is usually best. Splitting by technology alone, such as mobile and back end, is generally the weakest choice.

Here's the food delivery platform's redesign. It has thirty eight engineers in five teams, one per technical layer. An idea takes about six weeks to reach production, and all the teams coordinate their releases every fortnight. First, map the streams. Of the last fifty features, forty four fell mainly in one of three flows: customer ordering, restaurant partners and delivery. Second, check the fracture planes. These are already separate bounded contexts, so the code can follow. And courier assignment uses a solver only three engineers understand: a candidate complicated subsystem. Third, size the teams: three stream-aligned teams of seven, a dispatch team of five, a platform team of nine and an enabling team of three. Still thirty eight people. Fourth, choose interaction modes, with end dates. Everyone uses the platform as a service from day one. Delivery and Dispatch collaborate for one quarter, and the enabling team helps Ordering for eight weeks. After two quarters, most features should be delivered by one team without a coordinated release. Persistent cross-team work would show a boundary to revisit.

Reorganising teams doesn't restructure a tightly coupled codebase. For months, new teams will fight the old architecture, so plan team changes and architecture changes as one programme. A common mistake is renaming existing teams with these labels, while ownership, funding and interaction stay the same. Another is a platform team that works through tickets and approvals, so others wait for it. That's a bottleneck, not a platform.

The full section covers team APIs, the thinnest viable platform, and every fracture plane. Next, in Section eleven point six, we look at modernising legacy systems. See you there.

What you need to know

Team design is architecture work

Chapter 3 showed that Conway's law is not a curiosity but a force: the system a group of teams builds tends to copy the way those teams communicate. If that is true, then deciding how teams are formed, what each owns and how they interact is an architectural decision, with consequences as lasting as choosing a database or an integration style. The discipline of designing software structure and team structure together is called socio-technical architecture.

The most influential practical framework for doing this is Team Topologies, by Matthew Skelton and Manuel Pais (IT Revolution, 2019; second edition 2025). It starts from a simple aim, fast flow: a steady, sustainable stream of small changes from idea to production, with little waiting between teams. It then offers a small vocabulary for designing organisations that achieve it: four team types, three interaction modes, a limit called team cognitive load, and a technique for finding the seams along which software and teams can be split.

Several premises run through the approach. The team, not the individual, is the unit of delivery: work is given to teams, ownership belongs to teams, and teams are long-lived, so that they accumulate knowledge of their domain and code instead of being assembled for a project and scattered afterwards. Teams are small, usually five to nine people, because trust and shared understanding decline quickly beyond that size (the authors draw on Robin Dunbar's research on group sizes). And team boundaries should be designed for the flow of change, not for the convenience of reporting lines or the history of who built what.

For architects this changes the job. A proposed service boundary is only good if some team can own it fully; a proposed team is only viable if the code it owns lets it work without asking permission from three other teams. The architect who draws boxes without asking who will own each one is designing half the system.

The four fundamental team types

Team Topologies argues that almost every team in a software organisation should be one of four types. The point of so few types is clarity: each type has a different purpose, a different way of measuring success and a different relationship with the other teams, so knowing a team's type tells everyone what to expect from it.

A stream-aligned team is aligned to one flow of change: a product, a customer journey, a user group or a business capability. It owns its part end to end, from discovery through build to running it in production, and should be able to deliver most changes without waiting for anyone. Stream-aligned teams are the default and should be the large majority; the other three types exist to reduce their burden.

A platform team provides internal services (deployment pipelines, a runtime environment, observability, data infrastructure) as a product that stream-aligned teams consume through self-service. A good platform is judged by its users' speed, not by its own feature list. An enabling team consists of specialists who help other teams acquire a capability they lack, such as test automation, observability practices or a new framework, and then move on; its success is measured by the other team no longer needing it. A complicated-subsystem team owns a part that needs rare expertise, such as a pricing engine built on actuarial models, a route-optimisation solver or a video codec, so that stream-aligned teams can use it without having to master it. The book stresses that this type should be used sparingly and only where the specialism is genuine.

The four team types compared

Team typePurposeOwnsHealthy signsFood-delivery example
Stream-alignedDeliver a continuous flow of change for one part of the businessFeatures, code, data and operation of its stream, end to endReleases independently; most changes need no other team; on-call load is bearableCustomer ordering team: menus shown to customers, basket, checkout, order tracking
PlatformReduce the cognitive load of stream-aligned teams through self-service internal productsInternal platform services, their documentation and their reliabilityTeams adopt it voluntarily; onboarding a new service takes hours, not weeksDelivery platform team: pipelines, container runtime, logging and metrics, event broker
EnablingClose capability gaps in other teams, then leaveKnow-how, guides, examples; not production code of other teamsEngagements are time-boxed and end with the other team self-sufficientReliability enabling team coaching teams on service level objectives and incident practice
Complicated subsystemEncapsulate a specialism too deep for every stream-aligned teamOne specialist component behind a clear interfaceConsumers use it as a service without needing the specialists in the roomDispatch optimisation team: the algorithm that assigns couriers to orders

Team types and interaction modes

The four Team Topologies team types and the three interaction modes between themfacilitatingEnablingreliability coachingOrderingstream-alignedRestaurantsstream-alignedCouriersstream-alignedDispatchcomplicatedsubsystemcollaborationX-as-a-Service(self-service)Platform teampipelines, runtime, observability, datacollaboration (time-boxed)X-as-a-Servicefacilitating
Most teams are stream-aligned; a platform serves them as a service, an enabling team facilitates, and a complicated-subsystem team works closely with one stream for a limited time.

Three interaction modes

Team types say what teams are; interaction modes say how they work together. Skelton and Pais argue that ambiguous, ad hoc interaction between teams is a major source of delay, because every unplanned conversation is a dependency. They therefore recommend that every pair of teams that must interact chooses one of three modes deliberately, for a stated period.

In collaboration, two teams work closely together on a shared goal, with blurred responsibilities, for example while discovering how a new capability should be split. It produces fast learning but costs both teams capacity and cognitive load, so it should be time-boxed. In X-as-a-Service, one team provides something (an API, a platform capability, a library) that another consumes with little or no collaboration; this scales well but only works once the boundary is well understood and the interface is good. In facilitating, one team, typically an enabling team, helps another learn or remove an obstacle.

The modes are meant to change. A common sequence is discover then settle: a platform team collaborates with one stream-aligned team for a few weeks to design a new capability, then turns it into a self-service offering and moves to X-as-a-Service. The modes also work as a sensing mechanism. If a team that is supposed to consume a service as a service keeps needing meetings, the interface or the boundary is probably wrong; if two teams have been collaborating for a year, they may really be one team, or the split between them may be in the wrong place.

The three interaction modes

ModeWhat it looks likeUse whenCost or warning sign
CollaborationTwo teams work as one on a shared problem for a while; joint design sessions, shared backlog itemsDiscovering a new boundary, technology or capability where nobody yet knows the right interfaceHigh cognitive load on both teams; if it lasts indefinitely, the boundary is probably wrong
X-as-a-ServiceOne team consumes an API, platform or component that another provides, through documentation and self-serviceThe boundary and interface are well understood and stableSlow to adapt if the interface is poor; constant support requests show it is not yet a real service
FacilitatingCoaching, pairing, examples and short workshops that help a team gain a capabilityA team lacks a skill or is blocked by an obstacle it can learn to removeTurns into doing the other team's work, which builds dependency instead of capability

Cognitive load as a design constraint

The idea of cognitive load comes from educational psychology. John Sweller's cognitive load theory, first published in 1988, started from the observation that human working memory can hold and process only a few new items at a time, so instruction should be designed not to overload it. The theory distinguishes intrinsic load (the inherent difficulty of the material), extraneous load (difficulty caused by the way the task is presented) and, in later work, germane load (effort that builds lasting understanding). Researchers still debate whether germane load is a separate category, and Team Topologies uses all three as a practical heuristic rather than a measurement.

Section 3.7 introduced the team version of this idea: the total a team must hold in its heads to build, run and change what it owns. What matters here is how to use it as a design constraint. When an architecture assigns a team more than it can understand, the effects are predictable: slower delivery, shallow fixes, fragile on-call, knowledge concentrated in one or two people and, eventually, departures. These are the same symptoms often blamed on poor engineers or poor code.

The book offers rules of thumb for sizing a team's responsibilities by domain complexity: give each domain to a single team; a team can usually handle two or three simple domains; a team that owns a complex domain should own nothing else; and no team should own two complicated domains. Teams can also be asked directly, for example with a short survey on how well they understand their systems, how confident they feel when on call and how much time goes on tooling rather than the domain. Rising ticket queues, long onboarding times and frequent handovers to the one person who understands a component are useful indirect signals.

The architectural responses mirror the three kinds of load. Reduce extraneous load with platforms, automation, paved paths and good documentation. Bound intrinsic load by drawing service and module boundaries so that each team's share of the domain is coherent and of a manageable size, and by putting deep specialisms behind complicated-subsystem interfaces. Protect germane load by leaving time for learning, which is where enabling teams help.

Team APIs and the thinnest viable platform

If teams interact through deliberate modes, each team needs a clear face to the rest of the organisation. Team Topologies calls this the team API: everything the team offers and expects. It includes the technical API (endpoints, events, libraries and their versioning and deprecation rules) but also the human interface: documentation and onboarding guides, the team's roadmap and current priorities, its working practices, the channels where it can be reached, how to request work from it and what response times to expect.

Writing a team API down is a cheap and revealing exercise. It forces a team to say what it owns, which usually exposes unowned services and contested data, and it gives other teams a way to interact without a meeting. Many organisations keep it as a short page in the team's repository, reviewed each quarter alongside the architecture documentation.

The platform deserves particular care because it is where good intentions most often go wrong. A platform built as a large internal project, with a long roadmap and mandatory adoption, can easily add cognitive load rather than remove it. Skelton and Pais recommend the thinnest viable platform: the smallest set of services, documentation and standards that genuinely speeds up its users. For a small organisation that may be a well-kept page listing the cloud provider services teams should use and how; for a large one it may be an internal developer platform. Platform engineering is covered in depth in Chapter 10; the essential point here is that a platform is a product whose customers are other teams, and it should be designed and measured as one.

Fracture planes: where to split software and teams

When a part of the system has grown too big for one team, it has to be split, and the split must work for both the code and the teams. Team Topologies calls the natural seams along which software can be divided fracture planes. The book lists several, and the first is usually the best: a bounded context from domain-driven design, because a boundary that follows the language and rules of the business tends to keep related changes together.

The others are useful when they line up with a real difference in how parts of the system must be treated. Splitting along a technology boundary alone (for example a mobile team and a back-end team) is generally the weakest choice, because most changes then cross it, which is the layered team structure Conway's law warns about.

Fracture planes with food-delivery examples

Fracture planeSplit whenExample
Business domain (bounded context)Parts of the domain have their own language, rules and expertsOrdering, restaurant onboarding and courier management as separate contexts
Regulatory complianceOne part is subject to rules that should not burden the restCard payment handling kept in a small, audited scope for PCI DSS
Change cadenceSome parts change daily and others yearlyPromotions and campaigns change weekly; invoicing rules change rarely
Team locationTeams work in time zones with little overlapA courier operations team in another country owns courier onboarding
RiskSome parts can tolerate experiments and others cannotRecommendation experiments separated from order acceptance
Performance isolationOne part has very different load or latency needsLive courier location updates separated from menu browsing
TechnologyA part needs a genuinely different technology stackA legacy restaurant tablet integration that only runs on old hardware
User personasDifferent user groups have different needs and journeysCustomers, restaurant staff and couriers each have their own app and team

Conway's law, the inverse manoeuvre and its limits

Team Topologies is, in effect, a toolkit for the inverse Conway manoeuvre that Section 3.7 described: decide the architecture you want, then shape teams and interaction modes so that Conway's law pushes the system towards it. Its additions are practical. Team types say what kind of team should own each part; interaction modes say which team boundaries are meant to be thin (X-as-a-Service) and which are temporarily thick (collaboration); cognitive load says how much each team can own; fracture planes say where to cut.

The limits from Section 3.7 still apply and are worth restating in this setting. Reorganising teams does not restructure a tightly coupled codebase: for months after a reorganisation the new teams will fight the old architecture, which is why team changes and architecture changes should be planned as one programme. Boundaries that are hardened into teams too early make mistakes expensive, so many organisations keep uncertain boundaries inside one team or one modular monolith until they have evidence. And frequent reorganisations destroy the long-lived team knowledge the approach depends on.

Practitioners also disagree about how literally to apply the framework. Supporters value the shared vocabulary, which turns vague complaints (we keep waiting for the data team) into designable questions (what interaction mode do we want with the data team, and what would make it X-as-a-Service?). Critics warn that the four types are often applied as labels to an unchanged organisation, that real teams sometimes mix types (a platform team that also owns a complicated subsystem) and that the framework says little about funding, management structure or incentives. Both points are fair: the types are a design aid, not an org chart, and the authors themselves present them as a starting point for continuous adjustment.

Worked example

Worked example: redesigning the food-delivery teams around streams

The food-delivery platform has grown to 38 engineers in five teams organised by technical layer: mobile apps, web front end, back-end API, database and operations. Lead time from idea to production is about six weeks, releases are coordinated fortnightly across all teams, and the last three incidents each took several hours because nobody owned a whole customer journey. The architect and engineering leaders redesign the organisation in five steps.

1. Map the streamsEvent storming and a review of the last 50 features show three main flows of change: customer ordering (menus, basket, checkout, tracking), restaurant partners (onboarding, menus, opening hours, payouts) and delivery (courier onboarding, assignment, live tracking). 44 of the 50 features fell mainly in one of them.
2. Check the software's fracture planesOrdering, restaurants and delivery are already separate bounded contexts with their own services and databases (Section 11.1), so the code can follow. Courier assignment uses an optimisation solver that only three engineers understand: a candidate complicated subsystem. Card payments stay with Ordering but in a small, separately audited module (regulatory fracture plane).
3. Size teams by cognitive loadThree stream-aligned teams of 7 (each with mobile, web, back-end, testing and operations skills). A complicated-subsystem team of 5 for dispatch optimisation (the three specialists plus two engineers learning the domain). A platform team of 9 that owns pipelines, the container runtime, observability and the event broker. A small enabling team of 3 for reliability practices. Total: 38.
4. Choose interaction modesStream-aligned teams consume the platform as X-as-a-Service from day one, using its existing pipelines. Delivery and Dispatch collaborate for one quarter to redesign the assignment interface, then move to X-as-a-Service. The enabling team facilitates Ordering for eight weeks (service level objectives, on-call runbooks), then moves on to Restaurants.
5. Publish team APIs and measureEach team writes a one-page team API, every service and database table gets exactly one owning team, and leaders track lead time, deployment frequency, cross-team tickets per feature and an on-call confidence survey every quarter.
Result to look forAfter two quarters, most features should be delivered by one team without a coordinated release; persistent cross-team work would show a boundary to revisit.

The redesign starts from flows of change and the software's existing boundaries, not from the current reporting lines.

Specialists are concentrated only where the domain demands it (dispatch), and the platform exists to reduce load on stream-aligned teams, not to control them.

Interaction modes come with end dates, so the organisation is expected to evolve rather than be fixed in a new chart.

Before and after

Before and after: food-delivery teams reorganised from technical layers to stream-aligned, platform, enabling and complicated-subsystem teamsBefore: one team per technical layer (38 engineers)Mobile apps team (8)Web front-end team (6)Back-end API team (12)Database team (5)Operations team (7)One feature, such asscheduled orders, needsall five teams:4 hand-offs, 5 backlogs,1 shared release trainNobody owns a customeroutcome end to endAfter: teams aligned to streams of changeOrdering (7)customers, checkoutRestaurants (7)onboarding, menusDelivery (7)couriers, trackingEnabling (3)reliability, time-boxedDispatch optimisation (5)complicated subsystemX-as-a-Servicefor every teamDelivery platform (9): pipelines, runtime, observability, data
Layer teams force every feature through every team; stream-aligned teams supported by a platform, an enabling team and one specialist team can deliver most features alone.

Questions people ask

Are component teams always wrong?

Not always. A team owning a shared component can be the right choice when the component needs deep specialism (a complicated subsystem) or is offered as a genuine self-service product (part of a platform). It becomes a problem when most features need changes in the component and the stream-aligned teams have to queue for it.

Where do architects sit in this model?

Usually not as a separate gatekeeping team. Architects often act like an enabling team, helping stream-aligned teams make good decisions and keeping system-wide qualities visible, and they take part in designing the team structure itself. Section 11.4 discusses how governance can work without gates.

How often should team boundaries change?

Rarely and deliberately. Interaction modes are expected to change every few months; team membership and ownership should be stable for much longer, because long-lived teams are where domain and system knowledge accumulates.

Check your understanding

Name three things a team API contains besides its code interfaces.

For example its documentation and onboarding guides, its roadmap and priorities, its working practices, the channels where it can be reached and how to request work from it.

Why are interaction modes expected to change over time?

Because collaboration suits discovering a new boundary, and once the boundary and interface are understood the teams should settle into X-as-a-Service; modes follow how mature the boundary is.

What is the thinnest viable platform, and why aim for it?

The smallest set of services, documentation and standards that genuinely speeds up the teams using it; a larger platform risks adding cognitive load instead of removing it.

Why is a front-end and back-end team split usually a weak fracture plane?

Because most features cross it, so every change needs both teams, hand-offs and coordinated releases, which is the layered structure Conway's law turns into a layered, coupled system.

Next · 11.6Legacy modernisationWhy big rewrites fail and how to modernise safely instead: the seven Rs, the strangler fig, branch by abstraction, parallel runs, change data capture, anti-corruption layers and careful data migration.Continue →

Sources and further reading

Have a question about this section? ArchitectBot, the course’s AI study assistant, answers from the course first.

Ask: “We have separate front-end, back-end and database teams and every feature takes weeks. How would I propose a move to stream-aligned teams without breaking everything?”