Code review is where velocity goes to die
Review latency scales exponentially with change size and context switching costs.
By git11 Engineering · Sun Mar 29 2026 · 5 min read
The average pull request sits idle for 18 hours before the first human comment. In a high-traffic monorepo, that delay doubles every time a developer context switches to a new feature. Code review is the single largest bottleneck in modern software delivery.
Most teams treat review as an asynchronous luxury. They wait for a gap in their schedule to check github.com/pulls. This approach guarantees stale branches and frequent merge conflicts. You are not waiting for feedback; you are waiting for a lack of focus.
The size problem
Review time does not scale linearly with lines of code. A 10-line change takes 5 minutes to approve. A 500-line change takes 5 hours to start and 2 days to finish. Large PRs trigger a psychological barrier called review fatigue.
- Break changes into units under 200 lines.
- Use stacked pull requests to manage dependencies between small increments.
- Separate refactoring from functional changes into distinct commits.
- Delete dead code in its own PR to avoid distracting the reviewer.
When a PR exceeds 400 lines, the defect detection rate drops by half. Reviewers stop looking for logic errors and start looking for typos. You gain speed in the short term by skipping small PRs, but you pay in technical debt and production incidents.
The cost of context switching
Every time a reviewer stops their work to check your code, they lose 20 minutes of deep work. If they wait until the end of the day, your branch is already out of sync with main. This is the synchronization tax.
- Reviewers prioritize their own tickets over unblocking others. 2. Authors start new work while waiting, creating more WIP.
- Context for the original PR fades, making feedback harder to implement. 4. Merge conflicts accumulate as other developers land their code.
We see teams attempt to solve this with Slack notifications. A bot posts to #eng-deploys every time a PR opens. This creates noise, not action. Developers mute the channel and go back to their IDE.
Automated gatekeeping
Human reviewers should never comment on formatting, linting, or basic type safety. These tasks belong in your CI pipeline. If a human mentions a missing semicolon or an unused import in src/utils/helpers.ts, your tooling has failed.
- Check for
eslintorprettiererrors in a pre-commit hook. - Run unit tests and integration tests before the PR is assigned.
- Use a
CODEOWNERSfile to automate reviewer assignment based on file paths. - Implement strict type checking in
tsconfig.jsonto catch primitive errors.
If the CI fails, the PR should be invisible to reviewers. A developer should only see a PR when the machine is satisfied. This saves the most expensive resource in your company: senior engineer attention.
Designing for the reviewer
Most PR descriptions are useless. A title like "Update user logic" provides no signal. The reviewer must open git diff and reconstruct your mental model from scratch.
Write PR descriptions that explain why, not how. The code shows how the change works. The description must explain the business logic or the bug being squashed. Link the Jira ticket or the GitHub issue explicitly.
The feedback loop
Nitpicks are the primary cause of friction. A nitpick is a suggestion that does not affect functionality or correctness. It is a matter of style preference. Label these clearly so the author knows they are optional.
- Mark non-blocking comments with
nit:. - Use
(suggestion)for alternative implementations that aren't strictly better. - Reserve
blockingtags for security vulnerabilities or logic bugs. - Approve the PR if the logic is sound, even if the style is imperfect.
The goal is to ship working software. Perfecting the aesthetic of a private function is a waste of time. Trust your teammates to make reasonable choices.
Tooling bottlenecks
GitHub's web interface is not built for high-velocity review. Scrolling through 50 files in a browser is slow. The UI hides large diffs and requires manual pagination. This friction discourages thorough review.
Engineers should use CLI tools like gh or specialized review clients. Reviewing code directly in the IDE allows for better navigation. Jumping to a definition in lib/api/client.go is faster than searching the web UI.
Measuring review health
Stop tracking total lines of code. Instead, track mean time to first comment and cycles to merge. A high number of cycles indicates a communication breakdown or a lack of architectural alignment.
If a PR requires more than three rounds of feedback, the developers should move to a call. Text is a poor medium for resolving complex architectural disagreements. 10 minutes on Zoom replaces 48 hours of back-and-forth comments.
- Gather the author and the lead reviewer. 2. Walk through the diff together.
- Agree on the changes immediately. 4. Commit the fixes and merge.
The culture of speed
Velocity is a byproduct of culture. If your culture values "thoroughness" over "unblocking others," your pipeline will always be full. You must incentivize quick turnarounds.
Make code review a first-class task in your sprint. It is not "extra" work performed after the real work is done. If a PR is waiting, it is the highest priority item for the team. A feature is worth zero until it is merged into main.
Limit the number of open PRs per developer. If a developer has three open PRs, they should not be allowed to open a fourth. This forces them to focus on landing their current work before starting something new. High work-in-progress (WIP) is the most common cause of engineering stagnation.