Building High-Performing Distributed Engineering Teams

September 28, 2020

Six months into remote-first work, patterns have emerged. Some distributed teams are thriving. Others are struggling. The difference isn’t the tools—it’s the practices.

Here’s how to build high-performing distributed engineering teams.

What Makes Distributed Work

The Advantages

talent:
  - Hire the best, regardless of location
  - Access to global talent pool
  - Diverse perspectives and backgrounds

productivity:
  - Fewer interruptions
  - Flexible schedules
  - Deep work time possible

cost:
  - Reduced office costs
  - Salary arbitrage (carefully)
  - No commute time

resilience:
  - Not dependent on single location
  - Business continuity built-in
  - Time zone coverage

The Challenges

communication:
  - No hallway conversations
  - Context lost in async
  - Harder to read people

collaboration:
  - Time zone coordination
  - Spontaneous discussions harder
  - Whiteboarding is different

culture:
  - Connection requires intention
  - Onboarding more difficult
  - Trust harder to build

management:
  - Can't see who's struggling
  - Performance visibility different
  - Micromanagement temptation

Communication Practices

Default to Writing

Writing forces clarity:

## Good written communication

### Context
We're seeing increased latency on the orders API
during peak hours (2-4pm UTC).

### Investigation
Checked database queries - no issues
Checked memory usage - normal
Found: Connection pool exhaustion during bursts

### Proposal
Increase connection pool from 10 to 25
Add connection pool metrics to dashboard
Set alert at 80% pool utilization

### Questions
- Any concerns with increased connection count?
- Should we also add connection timeout handling?

### Decision needed by
Friday, for next week's deployment

Synchronous When Needed

Reserve real-time for what needs it:

async_appropriate:
  - Status updates
  - FYIs and announcements
  - Simple questions
  - Code reviews
  - Most decisions

sync_appropriate:
  - Complex problem solving
  - Sensitive conversations
  - Brainstorming sessions
  - Team building
  - Urgent issues

Time Zone Strategy

Make time zones work for you:

overlap_strategy:
  # Find 2-4 hours of overlap
  team_a: US West (PST)
  team_b: EU (CET)
  overlap: 8-10am PST = 5-7pm CET

  # Use overlap for:
  - Sync meetings
  - Real-time collaboration
  - Handoffs

  # Outside overlap:
  - Independent work
  - Async communication
  - Documentation

Documentation Culture

Document by Default

If it’s not written, it doesn’t exist:

Document:
- Architecture decisions (ADRs)
- Team processes
- Runbooks for operations
- Meeting decisions (not just agendas)
- Project context and rationale
- How things work

Don't document:
- Things that change constantly
- Trivial procedures
- Information better found in code

Accessible Knowledge Base

team-handbook/
├── getting-started/
│   ├── onboarding-checklist.md
│   ├── local-setup.md
│   └── first-week.md
├── processes/
│   ├── code-review.md
│   ├── deployment.md
│   └── incident-response.md
├── architecture/
│   ├── overview.md
│   └── adr/
│       ├── 001-database-choice.md
│       └── 002-api-versioning.md
└── team/
    ├── team-agreements.md
    ├── meeting-schedule.md
    └── decision-log.md

Meeting Practices

Fewer, Better Meetings

meeting_guidelines:
  required:
    - Agenda shared in advance
    - Right attendees (and only them)
    - Clear purpose and desired outcome
    - Time limit respected
    - Notes and decisions captured

  default_meeting_free:
    - Mornings (focus time)
    - Fridays (wrap-up, learning)

  async_alternatives:
    - Weekly written updates instead of status meetings
    - Recorded demos instead of live demos
    - Document discussions instead of brainstorm meetings

Effective Remote Meetings

video_meeting_practices:
  - Camera on (unless bandwidth issues)
  - Mute when not speaking
  - Use chat for questions
  - Designated note-taker
  - Record for those who can't attend
  - Start and end on time

facilitation:
  - Explicit turn-taking
  - Check-in with quiet participants
  - Use reactions/polls
  - Share screen for context

Team Connection

Intentional Social Time

Connection doesn’t happen by accident:

recurring_social:
  weekly:
    - Virtual coffee chat (random pairs)
    - Team social hour (optional, no agenda)

  monthly:
    - Team game or activity
    - Show and tell (non-work)

  quarterly:
    - Virtual offsite (longer format)
    - Team retrospective on culture

  annually:
    - In-person gathering (if possible)

Personal Connection

Build relationships beyond work:

practices:
  - 1:1s include personal check-in
  - Share life events (voluntarily)
  - Celebrate wins and milestones
  - Know something about each teammate
  - Random pairing for social chats

Onboarding Remotely

Structured First Week

## Remote Onboarding: Week 1

### Day 1: Welcome
- [ ] Welcome video call with manager
- [ ] Team introductions (video calls, 15min each)
- [ ] Equipment and access setup
- [ ] Onboarding buddy assigned

### Day 2: Technical Setup
- [ ] Development environment
- [ ] First code checkout and build
- [ ] Architecture overview session

### Day 3-4: First Contribution
- [ ] Pair programming with buddy
- [ ] First PR (small, safe)
- [ ] Code review introduction

### Day 5: Reflect
- [ ] 1:1 with manager
- [ ] Week 1 retrospective
- [ ] Questions addressed

Buddy System

New hires need dedicated support:

buddy_responsibilities:
  - Available for questions (not their manager)
  - Daily check-ins first week
  - Pair programming sessions
  - Cultural introduction
  - Advocate for their success

buddy_selection:
  - Experienced team member
  - Capacity for support
  - Good communicator
  - Positive attitude

Trust and Autonomy

Output Over Activity

Measure results, not hours:

trust_indicators:
  what_matters:
    - Work delivered
    - Quality of contributions
    - Team collaboration
    - Meeting commitments

  what_doesnt_matter:
    - When they're online
    - How quickly they respond
    - Visible "busyness"
    - Presence in Slack

Clear Expectations

Trust requires clarity:

expectations:
  responsiveness:
    async: Same business day (4-8 hours)
    urgent: Within 1 hour (during work hours)
    after_hours: Only for emergencies

  availability:
    - Core hours: 10am-3pm local (for overlap)
    - Otherwise: Flexible
    - Calendar reflects actual availability

  communication:
    - Update status when unavailable
    - Block calendar for focus time
    - Let team know about absences

Manager Practices

Regular 1:1s

More important remotely:

one_on_one:
  frequency: Weekly (at least)
  duration: 30-45 minutes
  agenda_ownership: Report's meeting

  typical_flow:
    - Personal check-in (how are you, really?)
    - Their topics first
    - Blockers and support needed
    - Feedback (both directions)
    - Development and growth
    - Your topics (if time)

Visibility Without Surveillance

Stay connected without hovering:

do:
  - Read their PRs and contributions
  - Attend team discussions
  - Ask how things are going
  - Watch for signs of struggle
  - Be available when needed

dont:
  - Monitor online status
  - Require constant updates
  - Interrupt deep work
  - Check response times
  - Track keystrokes

Key Takeaways

Remote work is different, not worse. Teams that intentionally build practices for distributed work can be more productive, more inclusive, and more resilient than those stuck in co-located patterns.