Engineering Culture

Building a Review Culture That Doesn't Make Engineers Dread PRs

Priya Nair Priya Nair
· · 6 min read
Small diverse engineering team in a candid collaborative meeting

Code review is one of the few places in an engineering team's workflow where people are explicitly evaluated by their peers. That social dynamic is almost never acknowledged in process documentation, which tends to treat review as a purely technical activity — "verify correctness, check style, leave comments." But engineers know better. A review that says "why would you do it this way?" lands differently than one that says "this approach works, though have you considered X for the long-term maintainability reason?" The words are almost interchangeable. The experience of being on the receiving end is not.

Teams that develop healthy review cultures don't do it by accident. The patterns are learnable and reproducible, but they require active cultivation by tech leads and engineering managers. And they require confronting a few assumptions about what review is actually for.

The fundamental purpose question

Ask ten engineers what code review is for and you'll get roughly three camps. Camp one: review is a quality gate — its purpose is to prevent bad code from merging. Camp two: review is a knowledge-sharing mechanism — its purpose is to spread understanding of the codebase across the team. Camp three: review is a mentorship channel — its purpose is to help engineers grow.

None of these is wrong. They're all true simultaneously. But the failure modes of treating any single purpose as primary are distinct and worth naming.

Quality-gate-only culture produces adversarial review dynamics. Reviewers look for reasons to block. Authors become defensive about their choices. The review becomes a negotiation rather than a collaboration. Subtle bugs still slip through because the reviewer is focused on catching mistakes rather than understanding the change. Counterintuitively, pure quality-gate thinking often produces worse quality outcomes than a more collaborative model, because adversarial review discourages authors from flagging their own uncertainties ("if I mention that I'm not sure about the edge case here, will they block me?").

Knowledge-sharing-only culture produces reviews that are long, discursive, and slow. Every PR becomes a design discussion. Authors feel like their judgment isn't trusted. Cycle time stretches because reviewers are thoroughly exploring the solution space rather than evaluating the specific change in front of them.

Mentorship-only culture disadvantages senior engineers who feel their work is being held to a different standard than juniors' and creates implicit hierarchies about who reviews whom. It also fails the team's quality and knowledge-sharing goals when senior engineers are reviewing junior work but getting no review on their own.

The teams that make review work hold all three purposes simultaneously. Quality gate: yes, we're blocking things that shouldn't merge. Knowledge sharing: we leave comments even on correct code when there's a pattern worth naming. Mentorship: we calibrate feedback to where the author is, not just what the code needs.

Psychological safety as a precondition

Engineers who don't feel safe having their code criticized won't take risks in their code. They'll write the conservative solution. They'll avoid the creative approach they're not sure about. They'll ship slightly worse code rather than flag their own uncertainty and invite scrutiny.

Psychological safety in review doesn't mean protecting people from hard feedback. It means creating conditions where hard feedback doesn't carry social cost beyond the feedback itself. An engineer who gets a tough review — "this approach has a race condition in the concurrent path, here's why" — should walk away thinking "that was useful, I learned something." They should not walk away thinking "that reviewer thinks I'm a bad engineer."

The behavioral practices that build psychological safety in review are well-documented in the research on feedback effectiveness. Separating observation from judgment: "this function returns undefined in the error path" rather than "this is wrong." Framing suggestions as questions when appropriate: "have you tested this against a zero-length input?" rather than "you didn't test the empty case." Acknowledging good decisions explicitly — not as hollow praise but as genuine signal: "using a queue here instead of direct invocation was the right call for the latency characteristics you described."

We're not saying soft framing is always the right move — there are situations where directness is exactly what a senior engineer needs and where softening the feedback would obscure the severity. The point is that default-to-collaborative framing costs nothing and builds the kind of relationship where, when you do need to be direct about a serious problem, the directness lands as useful rather than as an attack.

The difference between blocking and suggesting

One of the most practical changes a team can make is being explicit about whether a review comment is a blocking change request or a non-blocking suggestion. Different platforms handle this differently — some have native "resolve before merge" vs. "informational" comment types; others leave it implicit. Implicit blocking is a significant source of friction.

When reviewers don't signal intent, authors have to interpret. And under time pressure, the safest interpretation is that every comment is blocking, which creates review-by-negotiation: author resolves or argues every single comment before requesting a re-review, reviewer comes back with new comments, repeat. The cycle time on a 200-line PR with 15 comments can easily span three days of async back-and-forth that adds almost no quality value.

Making explicit the distinction between "this must change before merge" (correctness issue, security concern, API contract violation) and "this is worth discussing but doesn't block" (style preference, alternative approach, design-level discussion) compresses review cycles substantially. Authors address the blocking comments promptly and can merge with the non-blocking comments as open discussion threads. Reviewers who know their preferences will be registered as preferences rather than blocked on start asking for what they actually want.

Norms around comment tone and reviewer scope

A pattern that damages review culture reliably: reviewers who use review comments to lobby for larger architectural changes that the PR isn't trying to make. "This function works, but this entire module should probably be refactored to use the new event sourcing pattern we discussed." This comment is not useful on a PR that is fixing a specific bug. It's a design discussion that deserves a separate thread, not a blocker on an unrelated change.

The engineering practice of separating concerns applies to review comments as much as to code structure. A review comment's scope should be the change in front of you. If you have concerns about the broader design, raise them in a separate discussion, link to them from the comment if you want the connection noted, and don't block the PR on a problem that the PR doesn't introduce.

Teams that establish this norm explicitly — review comments are scoped to the PR; architectural concerns go elsewhere — find that review cycles compress and that architectural discussions actually happen in a format conducive to discussion rather than being buried in review comment threads where only the two people in the conversation see them.

What the best engineering teams do differently

Across engineering teams that report high satisfaction with their review process, a few patterns show up consistently. First, they have a written review guide — not a rigid checklist, but a document that articulates what they're trying to accomplish in review, how to calibrate between blocking and non-blocking feedback, and what kinds of comments are considered off-scope. The act of writing it forces the team to surface their implicit norms, which is where most of the misalignment lives.

Second, they distribute review responsibility actively rather than defaulting to whoever knows the code best. Routing all reviews to the one engineer who wrote a given module creates a bottleneck and prevents knowledge distribution. Spreading review responsibility means slower reviews for any individual PR, but produces a team where multiple engineers have context on every part of the codebase — which pays off compounding dividends in incident response, onboarding, and resilience when someone is out.

Third, they treat review culture as something that needs maintenance, not a problem that gets solved once. New engineers join and bring their previous team's norms. Senior engineers get busy and revert to drive-by approvals. The review quality drifts unless someone is actively watching it and calling out when the norms slip. That's an engineering management function, and teams that do it well have managers who take it seriously — not with process overhead, but with visible, consistent modeling of what good review looks like.

The teams that have made this work find that review stops being a tax on shipping and starts being a mechanism that makes shipping safer and teaches the team continuously. That's not a utopian goal — it's achievable with intentional practice, and the ROI on getting there is real.

Commitloom catches the bugs this article describes.

Free plan. No credit card. Set up in two minutes.

Start free
Priya Nair
Priya Nair
CEO & Co-Founder, Commitloom

Priya spent seven years as a staff and principal engineer before founding Commitloom. She writes about code review, engineering culture, and AI-assisted development.