Remote Work Tools

Async Pair Programming Workflow Using Recorded Walkthroughs and GitHub

Pair programming has long been celebrated as a powerful technique for knowledge sharing, code quality improvement, and team cohesion. But for distributed teams spread across time zones, traditional synchronous pair programming sessions can feel impossible to schedule. Enter async pair programming—a methodology that captures the benefits of pairing while respecting everyone’s timezone, focus time, and work style.

This guide walks you through implementing an async pair programming workflow using screen recordings and GitHub that maintains the collaborative spirit of traditional pairing while eliminating the scheduling headaches.

Why Async Pair Programming Matters

Traditional pair programming requires two developers to be online simultaneously, typically using screen sharing tools like Zoom, VS Code Live Share, or Tuple. While effective, this approach creates several challenges for distributed teams:

Async pair programming solves these problems by replacing live screen sharing with recorded walkthroughs that reviewers can watch on their own schedule. The key is structuring these recordings to maximize their effectiveness.

Setting Up Your Async Pair Programming Framework

The Core Workflow

The async pair programming workflow consists of four main phases:

  1. Driver creates a recorded walkthrough of their implementation approach
  2. Navigator reviews the recording and provides feedback
  3. Driver addresses feedback through additional recordings or code changes
  4. Final review and merge after both parties agree

This cycle can repeat as needed until the code meets quality standards.

Required Tools

For an effective async pair programming setup, you’ll need:

Step 1: Driver Creates the Implementation Walkthrough

When you’re driving (implementing), start by recording a walkthrough before or during your coding session. This isn’t about showing every keystroke—it’s about explaining your thought process.

What to Include in Your Recording

Your walkthrough should cover:

  1. The problem: What issue are you solving? Reference any related issues or PRs.
  2. Your approach: Walk through the overall strategy before diving into code.
  3. Key decisions: Explain why you chose this implementation over alternatives.
  4. Potential concerns: Be transparent about tradeoffs or areas of uncertainty.
  5. Specific code sections: Highlight the most important or complex parts of your implementation.

Example Recording Script

"Hey team, I'm working on the user authentication refactor (issue #123).
My approach is to extract the auth logic into a separate service class.

Here's my thinking:
1. First, I'm adding a new `AuthService` that handles all token operations
2. I'm updating the controllers to call this service instead of directly accessing tokens
3. The main change is in lines 45-78 where I've added the refresh token logic

One concern: I noticed we might have a race condition when tokens refresh
simultaneously. I've added a basic lock but would love feedback on whether
this is sufficient.

Key files to review:
- `src/services/auth_service.dart` (new file)
- `src/controllers/user_controller.dart` (modified)
- `tests/auth_service_test.dart` (new tests)

Link to the PR: [URL]
Let me know if you have questions!"

Step 2: Creating Effective PR Descriptions for Async Review

Since your navigator won’t be able to ask live questions, your PR description needs to be enough to stand alone.

PR Template for Async Pair Programming

## Overview
Brief description of what this PR implements and why.

## Changes Made
- [ ] Change 1: Description
- [ ] Change 2: Description

## Approach
Explain the overall implementation strategy.

## Recording
[Embed Loom/video link here]

## Questions for Reviewer
- Specific question 1
- Specific question 2

## Testing
- [ ] Unit tests added/updated
- [ ] Manual testing completed
- [ ] Edge cases considered

Closes #issue-number

Step 3: Navigator Reviews and Provides Feedback

As the navigator, your job is to watch the recording carefully and provide constructive, specific feedback through GitHub comments.

How to Give Effective Async Feedback

  1. Watch the entire recording before commenting—don’t jump to conclusions
  2. Be specific: Reference line numbers, function names, or timestamps
  3. Distinguish between blocking and non-blocking feedback
  4. Ask questions instead of making demands when you’re uncertain
  5. Acknowledge good decisions alongside areas for improvement

Feedback Template

## Review Summary
[1-2 sentence overall impression]

### Strengths
- What works well in this implementation

### Concerns
1. **Line 45 - Potential race condition**: I noticed...
   - Suggestion: Consider adding a lock here...

2. **Design consideration**: The current approach...

### Questions
- What happens when the API returns an error in this scenario?

### Nitpicks (non-blocking)
- Minor style preferences that aren't worth blocking on

Step 4: Addressing Feedback and Iterating

When you receive feedback, address it systematically:

  1. Clarify questions through PR comments if you need more context
  2. Make requested changes and explain what you changed
  3. Record a follow-up walkthrough if the changes are significant
  4. Request re-review once you’ve addressed all blocking feedback

Example Response to Feedback

Thanks for the review! I've addressed your feedback:

1. **Race condition (line 45)**: Added a mutex lock as suggested.
   See commit `abc123`.

2. **Design consideration**: I considered a separate class but decided
   to keep it in the service for now to minimize code churn. Happy to
   revisit in a follow-up if needed.

3. **Error handling**: Added proper error propagation in the updated
   recording: [new link]

Requesting re-review. Let me know if the new recording answers your
questions!

Integrating with GitHub Features

Using GitHub Actions for Async Workflow

Automate parts of your async pair programming with GitHub Actions:

name: Async Pair Programming
on: [pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Check PR has recording
        run: |
          if ! grep -q "recording\|loom\|video" ${{ github.event.pull_request.body }}; then
            echo "Error: PR must include a recording link"
            exit 1
          fi

Using GitHub Discussions for Deeper Discussions

For complex decisions that go beyond code comments, create a GitHub Discussion linked to your PR. This keeps the conversation organized and searchable.

Best Practices for Success

Set Clear Expectations

Maintain Human Connection

Iterate and Improve

Common Pitfalls to Avoid

  1. Recordings without context: Don’t just show code—explain your thinking
  2. Vague feedback: “This seems wrong” isn’t helpful; be specific
  3. Skipping follow-up recordings: If changes are significant, record them
  4. Ignoring timezones entirely: Check when your reviewer is likely to be online
  5. Perfectionism: Async pair programming is about collaboration, not getting everything perfect on the first try

Built by theluckystrike — More at zovo.one