dx-career6 min read

Code Review Habits That Raise the Whole Team

Review practices that spread context, reduce rework, and make junior engineers stronger—without turning PRs into style wars or approval bottlenecks.

Code review is where your team’s standards become real. Not in the handbook, not in the linter config—in the comments someone leaves at 4 p.m. when they could have rubber-stamped and gone home. Habits that raise the team treat review as teaching plus risk reduction, not gatekeeping or a venue for clever sarcasm.

This post assumes you already use pull requests and CI. It focuses on behaviors senior ICs and leads can model tomorrow. It links naturally to writing RFCs that unblock decisions when change is too big for one PR, TypeScript for full-stack teams that ship when types carry design intent, and avoiding any with practical patterns when review catches boundary shortcuts.

Optimize for learning, not ego

Google’s code review guidelines distinguish what must block merge from what can be nits. Adopt that split explicitly on your team:

  • Blockers — Correctness, security, data loss, broken contracts, missing tests for risky paths.
  • Strong suggestions — Simpler design, clearer names, alignment with patterns the team already uses.
  • Nits — Formatting already handled by tooling, subjective taste, “I would have done it differently” without a concrete benefit.

When you block, say why and point to a doc or example. “This breaks our idempotency rule for webhooks—see handler X” beats “this feels wrong.” When you nit, prefix nit: so authors can batch fixes without renegotiating priority.

Junior engineers learn fastest when comments connect to principles, not authority. “We avoid N+1 here because…” links behavior to the backend patterns you document or your observability standards—not “because I said so.”

Review the change, not the person

Assume good intent. Ask questions before accusing:

  • “What happens if the queue is empty here?”
  • “Did you consider the rollback path if the migration partial-fails?”

That tone keeps psychological safety high enough that people admit uncertainty early—before production teaches the lesson.

Avoid drive-by redesigns on unrelated lines. If the PR scope creeps, ask for a follow-up ticket instead of expanding the diff in review. Large PRs deserve pushback at open time, not twenty rounds of comments. Pair that norm with estimating work without lying so “small PR” is a plan, not a wish.

Spread context on every merge

The hidden product of review is shared mental model. Habits that compound:

  • Summarize in the PR description — Author explains user-visible effect, test plan, and rollout. Reviewers should not reverse-engineer intent from a 40-file diff.
  • Link the ticket or RFC — Traceability for PM and future auditors.
  • Call out non-obvious tradeoffs in the description — “Chose synchronous call because volume is low; async tracked in TICKET-123.”

Reviewers add value when they connect dots across services: “This duplicates validation in the billing service—can we import the shared Zod schema from runtime truth at the edges?”

Rotate who reviews which areas. Siloed ownership creates bus factor and slows vacations. A simple round-robin beats “only Alice touches auth.”

Speed and fairness

Slow review is a tax on flow. Team norms that help:

  • SLA — First response within one business day for normal PRs; same day for hotfixes.
  • Size limits — Target reviewable diffs; split features behind flags.
  • Office hours — Complex PRs get a 15-minute sync instead of fifty async messages.

GitHub’s best practices for pull requests recommend small, focused changes and clear descriptions—platform features like draft PRs and suggested changes support those norms.

When someone is always the bottleneck, that is a staffing or delegation problem. Train two reviewers per critical area. Escalate to leads when architectural disagreement persists—sometimes the right outcome is an RFC, not comment ping-pong.

Security and production mindset

Review is a last line before deploy, not the only line. Still, catch classes of bugs that linters miss:

  • Missing authorization on new routes.
  • Logging secrets or PII.
  • Unbounded queries or fan-out.
  • Feature flags defaulting to “on” without kill switch documentation.

Point reviewers at your org’s checklist; external frameworks like OWASP Code Review Guide help calibrate what “deep” means for web apps.

For infra or env and secrets changes, require a second pair of eyes from someone who has run a production deploy—not only the author’s teammate on the same feature.

Feedback that sticks

People remember one actionable insight per PR more than ten micro-nits. Prioritize:

  1. Fix anything that could hurt users or data.
  2. Teach one pattern they can reuse.
  3. Defer stylistic debates to automation.

End positive when you can: “Nice test for the edge case on expired sessions.” Recognition costs nothing and reinforces good habits.

When the same mistake repeats, fix the system: add a lint rule, a template, a short internal doc—not repeated shame in comments. That is how review culture scales past a dozen engineers.

Review and career growth

Public engineering brand grows when you review in public open source with the same respect you use internally—see public engineering brand as a senior IC. Internal review is often where people first see how you think under pressure.

For leads, review load is a signal: if you only nit CSS, you are under-leveraged. Spend review energy on boundaries, observability, and product correctness—themes that match building AI-powered software products in 2026 when your stack includes agents and tools.

When to approve with follow-ups

Perfection is not the bar; safe incremental progress is. Approve when blockers are resolved and follow-ups are tracked:

  • “Approve with follow-up ticket for metrics on the new path.”
  • “Approve; please add a runbook link before deploy.”

Do not merge known data-loss bugs because the deadline is loud. Do merge a solid MVP with documented debt when rollback is tested—that is product judgment, not lax review.

Raising the team through review is slow work. It pays off in fewer incidents, faster onboarding, and PR threads that future hires read to learn how you build—not how you win arguments.

Automate the boring stuff so humans focus on judgment

Linters, formatters, and typecheckers should not consume review oxygen. Adopt eslint --fix, Prettier, and CI gates so human review time goes to architecture and product correctness—themes covered in TypeScript for full-stack teams. When a comment repeats three times, codify it: a custom ESLint rule, a snippet, or a checklist in the PR template.

CODEOWNERS files help route risky areas to trained reviewers without making one person a permanent bottleneck—rotate ownership quarterly so knowledge spreads.

Reviewing tests as first-class citizens

Tests are documentation of intent. Ask:

  • Does the test fail if the bug returns?
  • Are edge cases named the way support will describe them?
  • Are integration tests scoped so CI stays fast enough to run on every PR?

The Testing Trophy framing from Kent C. Dodds helps teams argue proportionally about unit versus integration coverage without fundamentalist wars. Reviewers who skim tests invite regressions—especially around auth, payments, and error contracts.

Remote and async review etiquette

Distributed teams live in timestamps and time zones. Leave review when your local day ends with a note if blockers remain—“will finish first hour tomorrow”—so authors are not guessing. Use suggested changes for trivial fixes; reserve long threads for design questions.

Record decisions in the PR description after sync calls so async teammates see outcomes. That habit mirrors RFC decision sections and prevents “we agreed in Zoom” amnesia.

When you are the author

Receiving review well is half the culture. Respond to each thread: fixed, deferred with ticket, or explained. Do not dismiss nits angrily if the team agreed tooling should handle them—fix or configure tooling instead.

If review stalls, ask directly: “What would make this safe to merge?” Escalate early rather than letting PRs rot. Stale PRs demoralize everyone and invalidate estimates tied to shipping dates.

Let's talk