Code Review for Small Teams: Reviews That Catch Things Without Eating Days
Big-company code review processes are built for a problem small teams don't have: coordinating hundreds of engineers. When a team of two to five copies that process, one of two things happens. Either every PR waits days for a review that arrives as a comment storm, or the team quietly stops reviewing at all.
Both outcomes are the same failure: review becomes friction, and friction becomes avoidance. The fix isn't a lighter process, it's a correctly sized one.
What review is actually for
Three things, in priority order:
- Knowledge sharing. After a review, more than one person understands the change. If the only person who understands the billing module goes offline for a week, no amount of process saves you.
- Catching the bugs machines miss. Wrong business logic, an edge case nobody handled, a migration that will lock a busy table.
- Consistency. Naming, structure, patterns that match the rest of the codebase.
Notice what's missing: catching syntax errors, style nits, and formatting. A linter catches those for free, and a human comment saying "add a space here" costs goodwill that you'll want back later. Run the formatters in CI and spend the human attention on points one and two.
Keep PRs small, keep reviews fast
Review quality collapses as PR size grows. A 200-line PR gets real feedback; an 1,800-line PR gets a vague LGTM, and the reviewer's attention on the next one gets shorter because they remember the last one.
What keeps PRs reviewable on a small team:
- One PR per logical change. If the description contains the word "and" more than once, it's usually two PRs.
- A description that says what changed and why, in three lines. Not a novel.
- Review the way you'd want to be reviewed: comments as questions ("what happens if this returns 0?") rather than verdicts. Questions get answered; verdicts get argued.
And agree on a response time. "Reviews happen within a few hours during the workday" is a team norm you can actually keep; "someday" turns into stale PRs that get rebased and re-reviewed from scratch. On a two-person team, review the other person's PR first thing in the morning: it costs ten minutes and both of you ship the same day.
A short checklist for the reviewer
Skip the checklists with fifty items, because nobody runs them. This one fits in your head:
- Does the change do what it says? Read the description, then the diff.
- What happens on failure? Every network call, file write, and external API turns into an error path eventually.
- Is anything untested that shouldn't be? Not 100% coverage, just the paths where a future change will break something silently.
- Does this make the codebase simpler or more complicated? A feature added at the cost of a new subsystem deserves a harder look than a clean fix.
- Authorization. Can user A reach user B's data through this new endpoint? This is the most-forgotten check in app development, and the most expensive to miss.
What not to review
Internal churn (renames, reformatting, dependency bumps that don't change behavior) doesn't need a human read. Batch it into its own PR labeled as mechanical, glance at the diff stats, merge it. Mixing mechanical changes into feature PRs buries the real diff under 400 lines of import reshuffling, and the reviewer stops reading exactly where they needed to start.
Neither should review gate trivial work. A typo fix in copy doesn't need a second pair of eyes and a deploy slot. Teams that require review for everything end up with reviews for nothing.
The payoff
Review on a small team is a knowledge-sharing habit with a bug-catching side effect. Ten focused minutes per PR, same day, beats a multi-day review queue that everyone routes around, and beats no review at all, where every load-bearing module has exactly one person who understands it.