Your architecture can't outperform your organization
- Cognitive load is finite: Every team has a limited mental budget. When a developer needs to understand three repositories, two pipelines, and four API contracts for a trivial change, the problem isn't technical — it's organizational.
- Conway's Law is not a metaphor: Organizations produce systems that mirror their communication structures. If you don't design the org chart, the org chart will design your architecture for you.
- Three types of load, one priority: Extraneous load (tools, processes, infrastructure) causes the most damage and is the easiest to reduce. Internal platforms and bounded contexts are the solution.
- Measure before you scale: If the system doesn't fit in a team's head, it doesn't fit in production. Teams that manage their cognitive load deploy faster and with fewer failures (DORA).
There is a question rarely asked in architecture reviews: how many concepts does a developer need to hold in working memory to make a safe change in this system?
We design microservice architectures with dozens of components, choose between Kafka and RabbitMQ, debate whether to use gRPC or REST… but we ignore the fact that every human team has a finite cognitive budget. And when that budget is exhausted, it doesn’t matter how elegant your architecture diagram is: delivery velocity collapses, bugs multiply, and burnout silently takes hold.
The industry has treated software architecture as a purely technical problem for decades. But empirical evidence points in a different direction: the optimal architecture is not the one that minimizes technical coupling, but the one that respects the cognitive limits of the teams that maintain it.
1. Conway’s Law: The Constraint No One Wants to Accept
In 1968, Melvin Conway published a paper in Datamation that went relatively unnoticed at the time but is now considered one of the foundational texts of organizational software engineering: How Do Committees Invent?. Its central thesis is devastating in its simplicity:
“Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.”
This is not an anecdotal observation. It is a structural constraint. If your backend team only talks to your frontend team during sprint demos, your API will end up with an interface that reflects that disconnect. If three teams share responsibility for a monolith, you will end up with three different architectural styles coexisting in the same repository.
Fred Brooks, in his classic The Mythical Man-Month (1975), quantified part of the problem: the number of communication channels between n people grows according to the formula . A team of 5 has 10 channels. A team of 10 has 45. A team of 15 has 105. The growth is quadratic, and with it grows the coordination cost, the risk of misunderstandings, and the friction to deploy.
The practical implication is uncomfortable: you cannot design the ideal architecture without first designing the organization that will maintain it. And if your org chart is already defined and non-negotiable, then your architecture is too — whether you like it or not.
2. The Three Types of Cognitive Load in Software Development
Cognitive Load Theory, formulated by educational psychologist John Sweller in 1988, establishes that human working memory has a limited capacity. George A. Miller had already documented this in his famous 1956 paper, The Magical Number Seven, Plus or Minus Two: we can simultaneously hold between 5 and 9 items in working memory. No more.
Matthew Skelton and Manuel Pais, in their influential book Team Topologies (2019), adapted this theory to the context of software development, classifying cognitive load into three types:
Intrinsic Load: The Complexity of the Domain
This is the mental effort inherent to the task the team solves. Understanding the business rules of a pricing engine, designing the data model of a booking system, or implementing a distributed consensus algorithm — all of that is intrinsic load. It is necessary and valuable. You cannot eliminate it without trivializing the problem.
Extraneous Load: The Accidental Complexity of the Environment
This is the mental effort caused by inadequate tools, bureaucratic processes, missing documentation, or opaque infrastructure. When a developer spends 45 minutes configuring a local development environment, or needs to understand three different CI/CD systems to deploy a change, they are consuming cognitive budget on tasks that add no value to the product.
This is the most destructive type of load because it is invisible in sprint reviews. Nobody presents a slide saying “this sprint, 30% of our capacity went to fighting the deployment pipeline.”
Germane Load: Productive Learning
This is the effort invested in creating lasting knowledge: mastering a new architectural pattern, deeply understanding the business domain, or improving the internal structure of code. It is the type of load we want to maximize, because it generates compounding returns over time.
The real problem in most organizations is that extraneous load devours the space that should be occupied by germane load. Teams are so busy fighting infrastructure, navigating unfamiliar repositories, and deciphering inherited configurations that they have no mental capacity left to think about the design of the software they build.
3. How to Detect That a Team Is Overloaded
Cognitive overload rarely manifests as a spectacular failure. It expresses itself in more subtle, and therefore more dangerous, ways:
- The inverted “bus factor”: Only one person on the team truly understands how a critical part of the system works. Not because they are exceptionally brilliant, but because the cognitive load required to understand that component exceeds the capacity of any newcomer.
- Growing onboarding times: If a new developer needs more than 2-3 weeks to make their first meaningful contribution, it is likely that the project’s extraneous load is excessive.
- Trivial changes requiring complex coordination: If updating a field in a form requires modifying three repositories, two API contracts, and coordinating with another team for deployment, the architecture has exceeded the team’s cognitive capacity.
- Constant synchronization meetings: When teams need daily cross-team syncs to avoid breaking things, organizational coupling is mirroring technical coupling.
The DORA research program (DevOps Research and Assessment) has consistently demonstrated that organizations with loosely coupled teams — those that can test, deploy, and modify their services independently — exhibit significantly higher deployment frequencies and lower failure rates. This is no coincidence: decoupled teams are teams with managed cognitive load.
4. Team Topologies: Designing the Organization Before the Architecture
If Conway’s Law is the constraint, Team Topologies is the framework that turns it into an advantage. Instead of fighting the reality that the organization shapes the architecture, Skelton and Pais propose the Reverse Conway Maneuver: deliberately designing the organizational structure to produce the desired architecture.
The model defines four fundamental team types:
Stream-Aligned Teams
These are the primary teams. Each one is responsible for a complete value stream: a business capability from end to end. Their goal is to minimize handoffs and maximize autonomy. The ideal size is 5-9 people — not coincidentally, Miller’s range for working memory.
Platform Teams
Their mission is to reduce extraneous load for stream-aligned teams. They provide self-service tools, APIs, and infrastructure that abstract away operational complexity. A good platform team makes deploying as simple as git push. A bad platform team creates another layer of bureaucracy that everyone else must learn.
Complicated-Subsystem Teams
These encapsulate technical domains that require specialized knowledge (machine learning, financial calculation engines, signal processing). They exist to prevent that complexity from contaminating the cognitive load of stream-aligned teams.
Enabling Teams
These are temporary and function as internal consultants. They help stream-aligned teams adopt new practices or technologies without having to spend their own cognitive budget on exploration.
The key to the model is not the team types themselves, but the constraint that binds them: every team has a limited cognitive budget, and the system architecture must respect that limit. If a stream-aligned team needs to understand Kubernetes infrastructure to deploy, the platform team isn’t doing its job. If a team needs to coordinate with three other teams to ship a feature, the bounded contexts are poorly defined.
5. Bounded Contexts as Team-Domain Alignment
The concept of Bounded Context from Domain-Driven Design, formalized by Eric Evans in Domain-Driven Design: Tackling Complexity in the Heart of Software (2003), fits Team Topologies like a glove. A bounded context defines a semantic boundary within which a domain model is consistent and complete. Outside that boundary, the same terms may mean different things.
When you align a team with a bounded context, you achieve something that few architectures accomplish by accident:
- Semantic autonomy: The team owns the language and rules of its domain. It doesn’t need to negotiate with other teams over what “customer” or “transaction” means in its context.
- Independent deployment: If the bounded context is well-designed, internal changes require no external coordination.
- Bounded cognitive load: The team only needs to deeply understand its own context. Interactions with other contexts are managed through explicit contracts (APIs, events, anti-corruption layers).
The most frequent mistake is designing bounded contexts along technical boundaries (one context for the database, another for the API, another for the frontend) instead of along business domain boundaries. When contexts are aligned with the domain, the team structure and system architecture reinforce each other. When they are not, every team needs to understand pieces of the domain that belong to others — and cognitive load skyrockets.
Conclusion: If It Doesn’t Fit in a Team’s Head, It Doesn’t Fit in Production
The next time you sit down to design an architecture, before choosing between a monolith and microservices, before deciding whether the event bus will be Kafka or RabbitMQ, ask the question that truly matters: how many concepts does a team need to hold in working memory to maintain this system?
If the answer exceeds the capacity of a team of 5-9 people, you have an organizational design problem, not a technical one. And no technology in the world will solve an organizational problem.
Conway saw it in 1968. Brooks quantified it in 1975. Skelton and Pais systematized it in 2019. The DORA research program confirms it empirically every year. Cognitive load is a physical constraint of software development, as real as network latency or the speed of light. Ignoring it is like designing a bridge without calculating the maximum load its pillars can bear.
The world’s most sophisticated software architecture will fail if the team maintaining it cannot understand it. And the simplest system will succeed if the teams building it have the autonomy, context, and mental space to do their job well.
Design the organization. The architecture will follow.




