Back to Newtonix.bot

Scaling Team Architecture

December 2024 • 11 min read • Engineering Leadership

"Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations." - Melvin Conway, 1967

Conway's Law isn't just an academic observation — it's a practical reality that will shape your system architecture whether you plan for it or not. After leading engineering teams from 3 to 50+ people, I've seen how team structure directly impacts code quality, system design, and ultimately business outcomes.

Why Conway's Law Matters More as You Scale

The 2-Person Team: Everything is Possible

With two engineers, you can build anything. Communication is instant, decisions are fast, and you can refactor the entire codebase over lunch. Your architecture can be as elegant or messy as you want because coordination overhead is near zero.

The 8-Person Team: Cracks Begin to Show

Suddenly, not everyone knows everything. Features start stepping on each other. Someone breaks the build, but nobody knows who. You need process, but not too much process. This is where Conway's Law starts to bite.

The 20-Person Team: Conway's Law Takes Over

If you haven't intentionally designed your team structure, Conway's Law will design it for you. Teams will naturally organize around the existing codebase, creating rigid boundaries that mirror your messy architecture.

Real example: A startup I advised had a monolithic Node.js app with 18 engineers. All 18 engineers touched the same codebase daily. Merge conflicts were constant, releases took hours to coordinate, and simple changes required 6 people to review. Conway's Law was screaming at them to split the teams, but they were afraid of microservices complexity.

The Team Topology Patterns That Work

1. Feature Teams (Most Common, Often Wrong)

Organizing teams around features seems intuitive: the checkout team, the user management team, the analytics team. But features often cut across multiple system boundaries.

When it works: When features map cleanly to system components

When it fails: When features require coordination across multiple services

2. Platform Teams (Infrastructure-Focused)

Teams responsible for the underlying infrastructure, developer tools, and shared services.

The platform team mandate:

  • Make other teams more productive
  • Reduce cognitive load for feature teams
  • Own the "boring" but critical infrastructure

3. Stream-Aligned Teams (Business Value-Focused)

Teams organized around a flow of work from concept to customer value. This is often the most effective pattern for startups.

Example stream-aligned teams:

  • Growth team: Everything from signup to first value
  • Core product team: Main user workflows and features
  • Enterprise team: B2B features, compliance, admin tools

The Communication Patterns You Need to Design

High-Bandwidth vs. Low-Bandwidth Connections

Not all team connections are created equal. Some teams need to talk constantly, others rarely.

High-bandwidth connections:

  • Teams working on the same user journey
  • Teams sharing significant code or data
  • Teams with tight coupling requirements

Low-bandwidth connections:

  • Platform teams and feature teams (well-defined APIs)
  • Teams in different product areas
  • Teams with different release cycles

The Interface Design Pattern

Teams should interact through well-defined interfaces, just like software modules.

// Team interfaces should be as clear as code interfaces
class PaymentTeam {
    // Clear API contract
    async processPayment(amount, paymentMethod, customerId) {
        // Implementation details hidden from other teams
        return { transactionId, status, errors }
    }
    
    // Clear data ownership
    owns: ['payment_transactions', 'payment_methods', 'billing_addresses']
    
    // Clear SLA commitments
    sla: {
        availability: 99.9,
        responseTime: 200, // ms
        errorRate: 0.1 // %
    }
}

The Technical Strategies That Enable Team Scaling

Database Boundaries = Team Boundaries

The fastest way to create team conflicts is to have multiple teams modifying the same database tables.

Database ownership patterns:

  • Each team owns specific tables/schemas
  • Cross-team data access through APIs only
  • Shared read-only data through replication
  • Event-driven updates for cross-team data sync

Independent Deployability

Teams that can't deploy independently can't work independently.

Deployment independence checklist:

  • ✅ Separate repositories for separate teams
  • ✅ Independent CI/CD pipelines
  • ✅ Backward-compatible API changes
  • ✅ Feature flags for coordinated releases
  • ✅ Database migration strategies

The Service Ownership Model

Every service should have exactly one team responsible for it. No shared ownership, no unclear boundaries.

// Clear service ownership manifest
{
    "service": "user-authentication",
    "owner": "platform-team",
    "contacts": {
        "primary": "alice@company.com",
        "secondary": "bob@company.com",
        "slack": "#platform-oncall"
    },
    "responsibilities": [
        "User registration and login",
        "Password reset flows",
        "OAuth integrations",
        "Session management"
    ],
    "sla": {
        "availability": 99.95,
        "response_time": 100,
        "support_hours": "24/7"
    }
}

The Management Patterns That Scale

The Two-Pizza Rule

Teams should be small enough to be fed by two pizzas (roughly 6-8 people). Larger teams create coordination overhead that kills productivity.

When teams get too big:

  • Split by feature vertical
  • Split by technical layer (frontend/backend)
  • Split by user segment (consumer/enterprise)

The Squad, Tribe, Chapter Model

Popularized by Spotify, this model balances autonomy with alignment:

  • Squads (teams): Cross-functional, autonomous, focused on specific mission
  • Tribes (groups of squads): Collection of squads working in same general area
  • Chapters (skill groups): People with similar skills across squads
  • Guilds (communities of interest): Looser groups around shared practices

The Decision Rights Framework

Clear decision rights prevent cross-team conflicts and delays.

Decision types:

  • Squad decisions: Implementation choices, tooling, local processes
  • Tribe decisions: Technical standards, inter-squad coordination
  • Architecture decisions: Cross-tribe technical choices, major technology changes
  • Business decisions: Product priorities, resource allocation

Common Anti-Patterns to Avoid

The Shared Team

Having a team that "helps" other teams usually creates bottlenecks and unclear ownership.

Instead of shared teams, create:

  • Self-service platforms
  • Clear consultative relationships
  • Temporary embedded team members

The Matrix Organization

Having people report to multiple managers or work on multiple teams simultaneously kills accountability.

The Component Team

Teams organized around technical components (database team, frontend team) rather than business value often create handoff delays.

The Transition Strategies

From Monolith Team to Multiple Teams

Phase 1: Create clear code ownership

  • Assign different parts of monolith to different teams
  • Establish API contracts between code modules
  • Implement code review policies that respect boundaries

Phase 2: Extract services gradually

  • Start with least-coupled components
  • Focus on high-change-rate areas
  • Maintain backward compatibility during transition

Phase 3: Full team autonomy

  • Independent deployment pipelines
  • Separate data stores
  • Team-owned metrics and alerting

The Platform Team Evolution

As you scale, you need teams that make other teams more productive:

Platform team progression:

  1. DevOps team: Manages infrastructure and deployments
  2. Platform team: Creates self-service tools and frameworks
  3. Developer experience team: Optimizes entire developer workflow
  4. Internal platform product: Treats developer experience as a product

Measuring Team Effectiveness

Leading Indicators

  • Deployment frequency: How often teams can deploy
  • Lead time: Time from code commit to production
  • Cross-team dependencies: How often teams block each other
  • Cognitive load: How much teams need to know about other teams' systems

Lagging Indicators

  • Time to restore: How quickly teams can fix issues
  • Change failure rate: How often deployments cause problems
  • Employee satisfaction: How teams feel about their autonomy and impact
  • Business velocity: How quickly features reach customers

The Bottom Line

Team architecture is system architecture. You can't optimize one without considering the other.

Start with Conway's Law as a design principle, not an accident. Organize teams around the system boundaries you want, not the ones you have. Invest in team autonomy through technical practices that enable independence.

Remember: Perfect team structure doesn't exist. The goal is to minimize coordination overhead while maximizing value delivery. The best team structure is the one that evolves with your business needs.

Struggling with team scaling or organizational design? Let's discuss how to align your team structure with your technical architecture.

💬 Share Your Thoughts

Have insights to share or questions about this post? I'd love to hear from you!