Engineering Practice
Giving and receiving review without the friction
Diego, two weeks into a new team, opens his first PR and gets back a comment that just says: “Why is this a Map?” He spends an hour rewriting it as an object, re-pushes, and gets: “No, the Map was fine — I was asking why not a Set.” The reviewer meant a thought, not a change; Diego read it as a blocker. Down the hall, Lena gets “this whole approach is wrong” with no alternative on a PR she shipped under deadline, and quietly stops asking that reviewer for early feedback. Neither comment was malicious. Both were ambiguous about two things every comment must answer: how important is this, and what do you want me to do?
Every comment carries an implicit severity — make it explicit
The single biggest source of review friction is unlabeled severity. A reviewer drops “consider extracting this” and the author can’t tell if it’s a hard blocker, a suggestion, or idle musing — so they either over-react (rewrite something that was fine) or under-react (ignore a real concern). The fix is a tiny, durable convention: prefix every comment with its weight. Conventional Comments formalizes this — labels like nit:, suggestion:, issue:, question:, praise:, and thought:, optionally marked (blocking) or (non-blocking). The label is the contract: a nit: is explicitly droppable, an issue: (blocking) must be resolved before merge, a question: wants an answer not a change. Google’s guidance lands in the same place: prefix genuine nits with “Nit:” so the author knows it’s polish, not a gate.
This matters because the two things a comment must answer — how important and what to do — are exactly what reviewers leave implicit under time pressure. Severity tagging makes the first explicit; making the comment actionable makes the second explicit. “This is confusing” is a verdict; “extract validateOrder so the early-return path is obvious — happy to pair if useful” is something the author can act on without a round-trip. When the reasoning isn’t obvious, state it: “this allocates on every request; cache it on the module” teaches, where “don’t allocate here” just commands.
| Label | Means | Author should | Blocks merge? |
|---|---|---|---|
issue: (blocking) | Real defect / correctness / security | Fix or discuss before merge | Yes |
suggestion: | A concrete better option | Consider; apply if it improves health | Usually no |
question: | Reviewer doesn’t understand yet | Answer — may need no code change | Until answered |
nit: | Trivial polish, reviewer’s taste | Take it or leave it | No |
praise: | Genuinely good work | Nothing — it’s a signal | No |
Attack the code, not the author — and the author’s prep beats every reviewer
Review is a social act, and the failure modes are social. “This whole approach is wrong” attacks the person’s judgement; “this approach breaks under concurrent writes — here’s the race” attacks the code and hands over a fact. The difference isn’t politeness theatre; it’s whether the author can engage with the substance or has to defend their competence first. Psychological safety is load-bearing: when people fear that a PR is a competence exam, they ship smaller, hide uncertainty, and stop asking for the early feedback that catches the biggest mistakes — exactly what happened to Lena. A reviewer who blocks to assert status rather than to improve the code (Parkinson’s bikeshedding — twelve comments on a variable name while the design flaw ships untouched) has inverted the purpose.
The most under-appreciated finding in the SmartBear study flips the usual focus from reviewer to author. Author preparation — annotating your own diff with explanations before anyone reviews it — had a dramatic effect: across all reviews with at least one author-preparation comment, defect density was never above 30, and most commonly zero. The mechanism is that explaining your change forces you to re-think it, and you catch your own bugs in the act of justifying them — the review’s value starts before the reviewer arrives. The related ego effect compounds it: knowing a peer will read your code makes you write it cleaner in the first place. So the highest-leverage reviewer-side habit (clear, tagged, actionable comments) is matched by an author-side one (annotate the diff, narrate the non-obvious decisions) that finds defects no reviewer ever sees.
Why this works
Receiving review well is a skill, not a personality trait, and it’s the other half of the loop. Assume good intent, separate your ego from the diff, and treat every comment as information about the code rather than a verdict on you. Push back when you disagree — “I chose a Map because lookups dominate; a Set loses the value” — because a review is a conversation, not a compliance check. But pick the hill: relitigating a nit: burns the goodwill you’ll want when an issue: (blocking) is genuinely wrong. The authors who grow fastest are the ones who mine review comments for the model behind them, not just the line-level fix.
Resolve disagreement on facts, escalate on judgement
Most review threads die quietly when both sides ground the discussion in the code: a benchmark, a failing test, a concrete race condition. “I think it’s cleaner” versus “I think mine is cleaner” is unresolvable and corrosive; “here’s a test that fails on your version” ends it. When a thread can’t be settled on facts — it’s a genuine judgement call about design direction — the senior move is to escalate, don’t entrench: pull in a third opinion or the area owner, timebox the debate, and let the change land if it improves health. Google’s standard is explicit that “not perfect” is never a reason to block; “makes the codebase worse” is. A reviewer who holds a PR hostage over taste is optimizing for being right over the team shipping.
The throughput cost of getting this wrong is measurable. Excessive nitpicking — unlabeled, non-actionable, taste-driven comments — has been estimated to cause 20–40% velocity losses, and worse, it obscures the serious problems by burying the one blocking comment under ten cosmetic ones. So the discipline isn’t only kindness; it’s signal hygiene. Tag severity so the author can triage. Make comments actionable so they don’t bounce. Praise real work so the channel isn’t pure negativity. And keep the human attention — yours and the author’s — pointed at design, correctness, and intent, which is the only thing review is actually for.
You're reviewing a PR with one real concurrency bug and several style/taste preferences. How do you write the review?
Why does prefixing comments with severity labels (nit/suggestion/issue/question) reduce review friction?
What did the SmartBear study find about author preparation (annotating your own diff)?
Order a low-friction review exchange that keeps attention on substance:
- 1 Author annotates the diff, narrating the non-obvious decisions before requesting review
- 2 Reviewer tags each comment's severity (issue/suggestion/nit) and makes it actionable
- 3 Reviewer attacks the code with a concrete fact, not the author's judgement
- 4 Author triages: fixes blockers, answers questions, takes-or-leaves nits, pushes back with facts
- 5 A genuine judgement split is escalated to a third opinion, not entrenched
- 01A reviewer writes 'consider extracting this' on a function and the author can't tell if it's required. What two things does every comment need to make explicit, and how do you encode them?
- 02What did SmartBear find about the author's role in defect detection, and why does psychological safety matter for review?
Review friction is mostly a communication failure, and two questions fix most of it: how important is this comment, and what do you want me to do. Tag severity with a small durable convention — nit, suggestion, issue, question, praise, optionally blocking or non-blocking — so the author can triage instead of guessing, and make every comment actionable with the reasoning attached so it doesn’t bounce back as a round-trip. Aim at the code, not the author: ‘this breaks under concurrent writes, here’s the race’ lets the author engage with a fact, where ‘this whole approach is wrong’ makes them defend their competence and quietly stop seeking the early feedback that catches the biggest mistakes. The most overlooked lever lives on the author’s side — the SmartBear study found that annotating your own diff drove defect density to near zero, because explaining a change forces you to re-examine it, and the ego effect means you write it cleaner just knowing it’ll be read. Resolve disagreements on facts, escalate genuine judgement splits rather than entrenching, never block over taste, and keep the channel clean — tagged, actionable, with real praise — so the one serious comment isn’t buried under ten cosmetic ones. Done this way, review spreads knowledge and raises the bus factor instead of becoming a status game.