Pairing & Mob Sessions for Go Teams
Knowledge transfer patterns for idioms and concurrency.
Go idioms are learned through feedback loops on real code.
Structured pairing and mobbing compress months of trial-and-error into focused sessions that also spread review culture.
Summary
Pairing and mobbing are deliberate formats for sharing toolchain habits, error-handling patterns, and concurrency review judgment.
They complement reading paths and checklists with live explanation of why a reviewer would block a PR.
Short sessions with clear agendas outperform unstructured screen sharing.
Recipe
Quick-reference recipe card - copy-paste ready.
## 90-minute onboarding pair (template)
1. (15m) Navigator walks module layout + CI README
2. (25m) Driver fixes one golangci-lint issue with navigator coaching
3. (25m) Joint read of one concurrent code path; run go test -race
4. (15m) Debrief: three idioms to apply + one PR to open before next session
5. (10m) Schedule next session + assign pre-read linkWhen to reach for this:
- First two weeks of Go onboarding for experienced hires
- Before a engineer's first concurrency-heavy PR
- After an incident to replay timeline and tests
- When review comments repeat the same idiom gap across multiple authors
Working Example
A team runs a weekly concurrency mob on a staging bug: elevated goroutine count after deploy.
// Mob examines this pattern together - driver shares screen
func (s *Service) poll(ctx context.Context) error {
for {
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(time.Second):
if err := s.tick(ctx); err != nil {
return err
}
}
}
}// Refactor outcome the mob aims for - ticker with defer Stop
func (s *Service) poll(ctx context.Context) error {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return ctx.Err()
case <-ticker.C:
if err := s.tick(ctx); err != nil {
return err
}
}
}
}What this demonstrates:
time.Afterin loops allocates timers; idiomatic fix usesNewTickerandStop.- Mob reads production metrics first, then code, then writes a regression test.
- Navigator asks driver to run
go test -racebefore merging the fix. - Session notes link to the PR and update a team gotchas doc.
Deep Dive
How It Works
- Driver owns keyboard; navigator asks questions, spots missed errors, and cites team standards.
- Mob extends to 3+ people with one driver rotating on a timer; best for incidents and design spikes.
- Sessions should end with artifacts: PR link, checklist update, or ADR bullet - not only verbal agreement.
Session Types
| Format | Duration | Best for |
|---|---|---|
| Onboarding pair | 60-90 min | Toolchain, first PR, godoc norms |
| Review pair | 30-45 min | Pre-submit review of author's PR |
| Concurrency mob | 60-120 min | Channels, mutex scope, errgroup |
| Incident replay mob | 45-90 min | pprof, logs, deploy correlation |
| API design mob | 60 min | Exported surface before coding |
Go Notes
// Pairing drill: table-driven subtest skeleton reviewers expect
func TestLimiter(t *testing.T) {
cases := []struct {
name string
n int
want int
}{
{"zero", 0, 0},
{"one", 1, 1},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
if got := Limiter(tc.n); got != tc.want {
t.Fatalf("got %d want %d", got, tc.want)
}
})
}
}Use drills like this when review feedback says "add cases" but the author has not seen exemplar tests in your repo.
Facilitation Rules
- Rotate roles every 20-30 minutes in mobs.
- Silence phones; one conversation at a time.
- Park unrelated refactors in a "later" list visible to the group.
- Prefer repo tasks over synthetic kata after week one so imports and CI match reality.
Gotchas
- Unbounded mob without agenda - sessions decay into passive watching. Fix: publish a three-bullet agenda before calendar invite.
- Same senior always navigates - creates single-point review culture. Fix: rotate navigators monthly.
- Skipping
-raceduring concurrency pairs - hires think green tests mean safe concurrency. Fix: make race run a session exit criterion. - No written follow-up - insights die when people switch tasks. Fix: two-minute debrief note in ticket or wiki.
- Pairing only juniors - seniors also need pairing when touching unfamiliar domains (operators, WASM). Fix: schedule cross-level pairs on new stacks.
- Recording without consent - violates policy or comfort. Fix: ask explicitly; default to written notes only.
Alternatives
| Alternative | Use When | Don't Use When |
|---|---|---|
| Self-serve reading path | Hire needs quiet focus time | Concurrency or review culture is the gap |
| Formal classroom training | Large cohort onboarding same week | Team-specific repo layout matters |
| Async review only | Distributed time zones | Hire has not yet seen exemplar PR discussion |
| Agent-assisted solo work | Boilerplate tests and docs | Teaching judgment on API shape and safety |
FAQs
How often should new Go hires pair?
Daily or every other day in weeks 1-2, then twice weekly until day 60. Reduce as review rework rate falls.
What is the ideal mob size?
Three to five engineers. Above six, airtime per person drops unless you use strict rotation.
Should pairing replace code review?
No. Pairing is learning; review is accountability. Paired code still goes through normal PR process.
Remote pairing tools?
IDE live share, screen share with driver control swap, or tuple-style pairing. Test audio before deep concurrency dives.
How do we measure pairing ROI?
Track review rework rounds, time-to-first merge, and hire confidence surveys at 30 and 60 days.
Can mobs happen on production incidents?
Yes for replay after mitigation. Avoid live production edits during the mob unless incident commander approves.
What pre-reads help?
Link one site page (for example Effective Go Reading Path block) and one exemplar merged PR per session theme.
Do pairs need the same time zone?
Overlap 2-4 hours for real-time pairing; otherwise use review-pair async with recorded loom and written questions.
How long until pairing tapers?
When hire passes items 13-18 on the 30/60/90 checklist with minimal rework, usually around day 45-60.
Should product managers join mobs?
Optional for API design mobs. Skip routine implementation pairs unless they are contributing acceptance criteria.
Related
- Onboarding Go Specialists - where pairing fits in ramp layers
- Team Onboarding Basics - example 9 pairing agenda
- Go SME Onboarding Checklist (30/60/90) - pairing evidence rows
- Code Review Culture for Go - norms pairs should teach
- Effective Go Reading Path - pre-read spine between sessions
Stack versions: This page was written for Go 1.26.x (Green Tea GC default, go fix modernizers - verify patch at build), chi (latest - verify at build), gin (latest - verify at build), echo (latest - verify at build), google.golang.org/grpc (latest - verify at build), sigs.k8s.io/controller-runtime (latest - verify at build), kubebuilder (latest - verify at build), tinygo (latest - verify board targets at build), wazero (latest - verify at build), and golangci-lint (latest - verify linter set at build).