“Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.” Conway’s Law is not just an observation—it’s a design principle. After leading a team of 12 engineers managing 60 microservices serving 28,000 customers, I’ve learned that your team structure determines your architecture more than any technology choice. Fighting Conway’s Law is futile; instead, use it intentionally.
Understanding Conway’s Law in Practice
The relationship between organization and architecture is bidirectional:
Organization Shapes Architecture:
- Teams build systems reflecting their communication patterns
- Organizational boundaries become system boundaries
- Coordination costs drive architectural decisions
- Team specialization influences technology choices
Architecture Shapes Organization:
- System structure suggests natural team divisions
- Technical dependencies create organizational dependencies
- Architectural complexity demands specialized roles
- Platform boundaries define team responsibilities
The key insight: you cannot optimize architecture without considering organization, and vice versa. They must evolve together.
Anti-Patterns: When Structure and Architecture Diverge
The Monolith with Specialized Teams
Structure: Teams organized by technical layer
- Frontend team
- Backend team
- Database team
- Infrastructure team
Architecture: Monolithic application with layered architecture
Why It Fails:
- Feature delivery requires coordinating all teams
- Bottlenecks at team boundaries
- Each team optimizes their layer, not the whole
- Changes require synchronized releases
- No team owns end-to-end features
This is the classic enterprise anti-pattern. Every feature requires a ticket queue through multiple teams. Velocity plummets.
Microservices with Monolithic Team
Structure: Single team responsible for all services
Architecture: 20+ microservices with complex dependencies
Why It Fails:
- Cognitive load exceeds team capacity
- Cannot achieve microservices’ independence benefits
- Deployment coordination still required
- Operational burden overwhelming
- Benefits of microservices without organizational scaling
You’ve distributed your architecture but not your teams. You get all the complexity of microservices without the velocity benefits.
The Reverse Conway Maneuver Failure
Structure: Reorganize teams to match desired architecture
Architecture: Existing monolith or misaligned services
Why It Fails Without Architecture Changes:
- Teams blocked by architectural dependencies
- Cannot deliver independently
- Frustration as structure promises autonomy but architecture prevents it
- Eventually revert to old structure or thrash
You cannot reorganize your way to better architecture. Structure and architecture must change together.
Successful Patterns: Aligned Teams and Architecture
Team-Per-Service (Small Scale)
Structure: Dedicated team for each service
- 3-5 engineers per service
- Full ownership from code to operations
- Cross-functional skills within team
Architecture: Microservices with clear boundaries
- Service boundaries match team boundaries
- Minimal cross-service coordination
- Well-defined APIs between services
When It Works:
- 5-10 services
- 20-40 engineers total
- Services have distinct domains
- Teams can maintain full-stack skills
When It Breaks Down:
- Too many services for available engineers
- Services too small to occupy a team
- Inconsistent practices across teams
- Duplicated effort on common problems
This pattern works well for startups and small companies. The ratio of teams to services (1:1) becomes unsustainable at scale.
Domain-Aligned Teams (Medium Scale)
Structure: Teams own a domain, multiple services
- 6-10 engineers per team
- Team owns 3-10 related services
- Domain expertise concentrated
- Internal specialization within team
Architecture: Service clusters by domain
- Services within domain highly cohesive
- Clear boundaries between domains
- Inter-domain communication via stable APIs
- Services in domain share data stores
Domain Examples:
- User domain: authentication, profiles, preferences
- Order domain: cart, checkout, order management
- Inventory domain: product catalog, availability, pricing
- Notification domain: email, SMS, push notifications
When It Works:
- 30-100 microservices
- 50-200 engineers
- Clear domain boundaries exist
- Domains evolve independently
This is the sweet spot for most organizations at scale. Teams are large enough to handle operational load and small enough for coherent communication.
Platform Team Pattern (Large Scale)
Structure: Domain teams + platform teams
- Domain teams: build business features (6-10 engineers each)
- Platform teams: build infrastructure and tools (5-15 engineers)
- Ratio: 4-6 domain teams per platform team
Architecture: Business services + platform services
- Domain services implement business logic
- Platform services provide infrastructure capabilities
- Clear abstraction layers
- Self-service infrastructure
Platform Responsibilities:
- Deployment and CI/CD infrastructure
- Monitoring and observability platforms
- Data infrastructure and pipelines
- API gateways and service mesh
- Developer tooling and templates
When It Works:
- 100+ microservices
- 200+ engineers
- Infrastructure complexity significant
- Domain teams need focus on business logic
When It Breaks Down:
- Platform team becomes bottleneck
- Too much abstraction hides necessary complexity
- Platform doesn’t align with domain needs
- Over-engineering of platforms
The platform team pattern enables domain teams to move fast by handling infrastructure complexity. The key is making platform capabilities self-service.
Organizational Patterns for Microservices
The Two-Pizza Team
Amazon’s principle: teams small enough to be fed by two pizzas (6-10 people).
Architectural Implications:
- Service scope must fit team cognitive capacity
- Teams need full-stack capabilities
- Minimize cross-team dependencies
- Clear ownership boundaries
Team Capabilities Required:
- Backend development
- Frontend development (if applicable)
- Infrastructure/DevOps
- Testing and quality
- On-call operations
Small teams require broader skills. Specialization happens across teams, not within them.
The Service Mesh Team Topology
Structure:
- Service teams: own business services
- Mesh team: owns service mesh infrastructure
- SRE team: operates production infrastructure
Architecture:
- Service mesh handles cross-cutting concerns
- Business services focus on domain logic
- Clear separation of concerns
Division of Responsibilities:
- Service teams: business logic, APIs, data models
- Mesh team: routing, retries, circuit breaking, observability
- SRE team: capacity, reliability, incidents
This separation allows specialization. Service teams don’t need deep networking knowledge. Mesh team can optimize infrastructure globally.
The Enabling Team Pattern
Structure:
- Feature teams: deliver business value
- Enabling teams: improve capabilities of feature teams
- Temporary assignment to feature teams
- Knowledge transfer, not long-term embedded
Purpose:
- Introduce new technologies
- Improve practices
- Solve common problems
- Spread expertise
Architectural Impact:
- Consistency across services
- Adoption of best practices
- Technology evolution
- Pattern replication
Enabling teams help scale expertise without centralizing decisions.
Managing Service Dependencies Through Team Structure
Service dependencies create team dependencies. Minimize both.
Dependency Patterns to Avoid
Hub-and-Spoke Dependencies:
- One service depended on by many
- Team owning hub becomes bottleneck
- Changes require extensive coordination
- Hub team cannot move quickly
Circular Dependencies:
- Services depend on each other
- Teams must coordinate all changes
- Cannot deploy independently
- Architectural smell indicating poor boundaries
Deep Dependency Chains:
- Service A depends on B depends on C depends on D
- Changes cascade across teams
- Debugging requires multi-team effort
- Failures propagate unpredictably
Dependency Patterns That Work
Layered Dependencies:
- Clear direction of dependencies
- Lower layers stable, well-defined
- Higher layers change independently
- Platform → Domain services → User-facing services
Choreographed Event-Driven:
- Services publish events
- Other services subscribe
- No direct runtime dependencies
- Teams coordinate through event schemas, not synchronous calls
Strangler Fig for Legacy:
- New services gradually replace old
- Dedicated team for legacy system
- Other teams build new services
- Clear migration path
Scaling Team Structure with Architecture
As you grow, both must evolve:
0-50 Engineers: Single Team or Small Teams
Structure: One team or 2-3 teams Architecture: Monolith or small microservices Focus: Product-market fit, rapid iteration
50-200 Engineers: Domain Teams
Structure: 5-15 teams organized by domain Architecture: Domain-oriented microservices Focus: Scalability, team autonomy, platform emergence
Key Transition:
- Break monolith along domain lines
- Form domain teams aligned with services
- Extract common infrastructure to platform team
- Establish architecture review process
200-1000 Engineers: Platforms and Domains
Structure: Multiple platform teams + many domain teams Architecture: Platform services + domain services Focus: Platform maturity, consistent practices, efficiency
Key Additions:
- Dedicated platform teams for major subsystems
- Enabling teams for practice improvement
- Architecture guild for coordination
- Self-service infrastructure
1000+ Engineers: Multiple Platforms and Business Units
Structure: Business units with embedded platforms Architecture: Multi-tenant platforms, federated services Focus: Business unit autonomy, shared platforms, efficiency
Organizational Complexity:
- Platform teams serve multiple business units
- Federated governance
- Shared infrastructure teams
- Technology standards boards
Communication Patterns and Architecture
Team communication shapes architectural communication.
High-Bandwidth Communication → Tight Coupling
Teams that communicate constantly can maintain tightly coupled services:
- Shared data stores
- Synchronous APIs
- Frequent schema changes
- Coordinated deployments
This works for teams sitting together. Breaks down with remote teams or organizational distance.
Low-Bandwidth Communication → Loose Coupling
Teams that communicate infrequently need loosely coupled services:
- Event-driven integration
- Versioned APIs with compatibility
- Asynchronous communication
- Independent deployment
This is necessary for distributed teams or cross-organization integration.
Inverse Conway Maneuver
Restructure teams to achieve desired architecture:
Process:
- Design target architecture
- Identify required team boundaries
- Restructure teams to match
- Refactor architecture to align
- Iterate as architecture evolves
Example:
- Want: Independent deployment of user, order, inventory domains
- Current: Teams by frontend/backend, services mixed
- Restructure: Create user team, order team, inventory team
- Refactor: Extract services for each domain, define APIs
- Result: Teams can deploy independently
This is powerful but requires commitment. Half-measures create misalignment.
Decision Rights and Architecture
Who decides what shapes both organization and architecture.
Centralized Decision Making
Pattern: Architecture review board approves designs Architecture: Consistent, standardized, potentially rigid Team Impact: Slower decisions, less autonomy, lower ownership
Decentralized Decision Making
Pattern: Teams decide their implementation Architecture: Diverse, experimental, potentially chaotic Team Impact: Fast decisions, high autonomy, risk of fragmentation
Federated Decision Making
Pattern: Teams decide locally, coordinate on shared concerns Architecture: Consistent at interfaces, diverse internally Team Impact: Balanced autonomy and coherence
Implementation:
- Teams own internal architecture
- Shared API standards and protocols
- Architecture guild for coordination
- Clear escalation for cross-team decisions
Federated decision making scales better than centralized but requires discipline.
Practical Recommendations
Start With the Team
When designing architecture, start with team structure:
- How many teams do you have?
- What are their capabilities?
- How do they communicate?
- What are their boundaries?
Then design architecture that matches.
Evolve Together
Change team structure and architecture together:
- Reorganizing without refactoring creates frustration
- Refactoring without reorganizing creates confusion
- Coordinate changes for smooth transition
Optimize for Communication
Minimize required communication between teams:
- Co-locate highly coupled teams
- Use async communication for loosely coupled teams
- Make dependencies explicit
- Reduce dependency fan-out
Measure Alignment
Track metrics that indicate alignment:
- Percentage of changes requiring multi-team coordination
- Lead time for features (lower is better)
- Number of cross-team dependencies per service
- Team autonomy index (can team deploy independently?)
Conclusion
Conway’s Law is not a bug to be fixed—it’s a feature to be leveraged. Your organization and architecture will converge whether you plan it or not. The question is whether you guide that convergence intentionally or let it happen accidentally.
The most successful architectures I’ve seen share common organizational patterns:
- Teams aligned with service boundaries
- Clear ownership and responsibility
- Minimal cross-team dependencies
- Platform teams enabling domain teams
- Federated decision making
When you’re designing your next system, don’t start with technology. Start with teams. Understand your organizational structure, communication patterns, and capabilities. Then design an architecture that amplifies those strengths rather than fighting them.
Your architecture will look like your organization chart. Make sure your organization chart looks like the architecture you want.