Thuan: Code reviews are where I get into the most trouble with English. I wrote a PR comment: “This code is wrong. Fix it.” The developer was upset for a week.

Alex: Text has no tone. In person, that might sound like helpful feedback. In a PR comment, it sounds like an attack. Written English requires extra care because there’s no facial expression or voice tone to soften your message.

Thuan: So how do I say “this code needs to change” without making enemies?

Alex: With the same directness — but different framing.

The Code Review Tone Guide

Alex: Every PR comment falls on a spectrum:

ToneExampleImpact
🔴 Hostile”This is wrong.”Developer feels attacked
🟡 Direct but cold”This should use a map instead of a loop.”Functional but feels rude
🟢 Constructive”Consider using a map here — it would simplify the logic and improve readability.”Developer learns and improves
💡 Teaching”Nice approach! One thought: a map might be cleaner here since we’re transforming each item. What do you think?”Developer feels respected

Rule of thumb: For junior developers, aim for 💡. For peers, 🟢 works. Never use 🔴.

PR Comment Phrases by Situation

Requesting Changes

Instead of…Write…
”This is wrong""I think there might be an issue here. [Explanation]"
"Fix this""Could you take a look at this? I think [suggestion]"
"This doesn’t make sense""I’m having trouble following the logic here. Could you add a comment or simplify?"
"Why did you do it this way?""I’m curious about the approach here — what was the reasoning?"
"Don’t use this pattern""I’d suggest [alternative] instead — it handles [edge case] better”

Common Comment Prefixes

Use these prefixes to signal intent:

PrefixMeaningExample
nit:Nitpick, optional, cosmetic”nit: consistent naming — use userId instead of user_id
suggestion:Non-blocking improvement idea”suggestion: extracting this into a helper function might improve readability”
question:Genuinely asking, not criticizing”question: will this handle the case where items is null?“
blocking:Must fix before merge”blocking: this SQL query is vulnerable to injection. Let’s use parameterized queries.”
praise:Something good!“praise: really clean solution. I like how you handled the edge cases.”

Thuan: Prefixes! That’s so simple and solves so many misunderstandings.

Alex: Exactly. When reviewers use prefixes, the author knows: “Is this a must-fix or just a suggestion?” It removes all ambiguity.

Giving Positive Feedback

Many reviewers only comment on problems. That makes code review feel like punishment. Balance it:

SituationComment
Clean code”This is really well-structured. Nice job.”
Good pattern”Great use of the strategy pattern here.”
Thorough tests”Love the test coverage, especially the edge cases.”
Improvement”This is much better than the previous approach. 👍“
Learning”TIL! I didn’t know about this API. Thanks for using it.”

Thuan: I never leave positive comments. I only comment when something’s wrong.

Alex: That means your team associates your name on a PR with “problems.” Start leaving one positive comment per review. It changes the entire dynamic.

Receiving Code Review Feedback

Thuan: What about when someone reviews my code and leaves harsh comments?

Alex: Here’s how to respond professionally:

When the Feedback Is Valid

SituationResponse
Agree with the change”Good point. Updated.”
Need to think about it”Let me think about this — I’ll update before EOD.”
Agree but want context”You’re right. I initially did it this way because [reason], but your approach is better.”

When You Disagree

SituationResponse
Different trade-off”I see your point. I went with this because [reason]. But I’m open to changing it — what do you think about [compromise]?”
Performance vs readability”I optimized for performance here because this runs 10K times per request. Would a comment explaining the approach be enough?”
Not worth changing”I hear you. My concern is that refactoring this now would touch [X files]. Could we add a follow-up ticket instead?”

When Comments Are Rude

Rude CommentProfessional Response
”This is bad code""Could you be more specific about what you’d change? I’d like to understand your concern."
"Why would you do this?""There were a few factors: [reason]. Would you suggest a different approach?"
"I would never do it this way""I’m open to alternatives. What approach would you recommend?”

Golden Rule: Never respond to heat with heat. In async text, tone escalates fast.

Writing PR Descriptions That Save Time

Thuan: My PR descriptions are usually one line: “Fix search bug.”

Alex: That forces every reviewer to read all the code to understand what’s happening. A good PR description saves everyone time:

PR Description Template

## What
Brief description of the change.

## Why  
The problem or requirement this solves.

## How
Technical approach — key decisions and trade-offs.

## Testing
How you tested this. What to verify during review.

## Screenshots (if UI change)
Before / After screenshots.

Example

## What
Fix checkout failing for carts with 50+ items.

## Why
Bug #1234: Large carts caused an unbounded DB query 
that timed out after 30 seconds.

## How
- Added pagination to the cart query (20 items per batch)
- Added index on `cart_id` column
- Added test for carts with 100+ items

## Testing
- Unit test: `test_large_cart_checkout` (added)
- Manual test: tested with 200 items on staging
- Performance: query time dropped from 30s to 200ms

## Notes
- No migration needed, index is added automatically
- This changes the API response shape for `/cart` 
  (now paginated). Updated API docs.

Thuan: That PR description answers every question before anyone asks.

Alex: And it makes reviewing faster. Reviewers know what to focus on: “Check the pagination logic and the new index.”

Team-Level Code Review Culture

Thuan: As a tech lead, how do I set the code review culture?

Alex: Establish team norms:

Suggested Team Agreements

AgreementWhy
”PR reviews within 24 hours”Unreviewed PRs slow the whole team
”Use comment prefixes: nit/suggestion/blocking”Removes tone ambiguity
”One positive comment per review”Makes reviews less punishing
”Author resolves comments”Clear ownership of follow-up
”Disagreements → 5-min call”Text arguments are a waste of time

Setting Expectations (Email/Slack Message)

“Hey team, I’d like to propose some code review norms:

  1. Please review PRs within 24 hours
  2. Use prefixes: nit:, suggestion:, blocking:
  3. Leave at least one positive comment per review
  4. If a discussion has more than 3 back-and-forth comments, jump on a quick call

These are suggestions — let’s discuss in our next retro and decide together.”

10-Minute Self-Practice

The Comment Rewrite (5 min)

  1. Open a recent code review you gave
  2. Find your most “direct” comment
  3. Rewrite it using: prefix + suggestion + reason
  4. Example: “This is wrong” → “suggestion: consider using a Map here — it handles duplicates automatically and simplifies the lookup logic”

The PR Description Practice (5 min)

  1. Open your latest merged PR
  2. Rewrite the description using the template (What/Why/How/Testing)
  3. Use it as a template for your next PR

What’s Next

Your code reviews are now constructive and clear. Next post: Talking to Non-Technical Stakeholders — translating tech to business language for people who don’t know (or care) what an API is.


This is Part 10 of the English Upgrade series. Related: English Upgrade #5: Technical Writing — extend your PR writing skills to docs and ADRs.

Also see: Tech Coffee Break #8: CI/CD — because good PRs are part of good pipelines.

Export for reading

Comments