tolgacelik.net
All posts
·4 min read

Code Review Culture: The Practice That Makes or Breaks a Team

Done well, code review raises a team's standard over time. Done badly, it kills motivation. Thirteen years of lessons on what actually matters in review.

code-reviewteamengineering-cultureleadership

Picture two teams. Same language, same stack, same seniority distribution. One team's code gets cleaner over the years; their juniors level up; the codebase stays maintainable. The other gets the opposite.

The biggest single difference: code review culture.

This piece distills what I've learned across 13 years of working in different review cultures.

What code review is and isn't

Is:

  • A learning channel
  • A way to lift code quality to the team's level
  • Knowledge sharing ("why does this exist, how does it work")
  • Bug catching (a side effect)

Isn't:

  • A space to criticize juniors
  • A place to impose personal preference
  • A debate over style/formatting (linters do that)
  • A status display

If the team understands these distinctions, you have the foundation of a good culture.

What good review comments look like

Structure

Context + suggestion + reason + alternative (when needed):

"This function does three different things — validation, transformation, save. Could we split them? It would be easier to test and someone might want to reuse one part. Maybe validateInput, transform, save?"

vs.

"This function is too long. Split it."

The first invites thinking. The second damages the relationship and offers no path forward.

Frame as questions

"Why is this written this way?" "Could we look at it as X?" — these invite. "This is wrong" provokes defense.

A comment opens a discussion. An assertion opens an attack.

Mark severity

Not every comment carries equal weight. Mark them:

  • blocking: this PR shouldn't merge
  • suggestion: you could change this; not a blocker
  • nit: small detail, optional
  • question: I want to understand; not a change request

nit: and q: prefixes are common. Authors can prioritize.

What the author should do

Read it yourself first

Before opening a PR, read your own diff. As if you were the reviewer. You'll find a bunch of issues. It saves the reviewer's time, your speed, and the quality bar.

Write a real PR description

Don't title your PR "fix bug." Use the description:

## What changed?
- Fixed cache invalidation race condition

## Why?
- Under high traffic, two instances writing the same key
  concurrently produced stale state

## How tested?
- New unit test added (`test_concurrent_invalidation`)
- Race scenario simulated locally

## Risk?
- Low. Logic change limited to the lock path.

This takes five minutes. It's critical for the reviewer to understand the change and ask the right questions.

Be open to constructive feedback

If you disagree, explain. If you agree, say so quickly. Discussion can continue as long as it's not personal.

"That's a fair point, I'll change it" is not weakness — it's professionalism.

What the reviewer shouldn't do

Comment on style (the linter's job)

prettier, eslint, black, gofmt — these auto-fix style. If you're commenting on style in a PR, your team's tooling needs work. Fix that, don't blame the human.

Re-litigate every prior decision

The author is writing inside a long-standing architectural decision. The PR is not the place to ask "why are we using Redis?" That conversation belongs to a wider forum.

Don't be authoritative outside your expertise

"I haven't used this library, but I think X is wrong" — don't post that. If you don't know, ask.

Don't block by being slow

If 24 hours pass and you still haven't reviewed, hand it to someone else. Don't block someone for three days. You're choking the team's flow.

Speed: same-day review

PR opens → first comment within 8 hours. This is critical for flow.

In practice:

  • First thing in the morning: peek at your own PRs
  • 11am: review window (30 min)
  • 4pm: review window (30 min)
  • Urgent? Slack, signal it

Without this discipline, "pending PRs" piles up, no one starts new ones, motivation dies.

Pair review

For a complex PR, written review isn't enough. Schedule 30 minutes, share screen, walk through it together. Faster, deeper, less friction.

Author walks through the code, reviewer asks "why?" in real time. What would have been five rounds of written comments resolves in 30 minutes.

Closing

Code review culture is more about team culture than tech. Good review = learning + leveling up + respect. Bad review = ego + conflict + suspicion.

This culture is set by the tone of the team's leaders. How a senior engineer behaves in review is what juniors learn from. Two years later half the team is reviewing the way the senior did — for better or worse.

Pick which version you want, and start.

ShareLinkedInX
Get the next one in your inbox

Long-form notes on distributed systems, production stability, AI-assisted shipping. No spam, easy to unsubscribe.

Email only. Stored on this server. Never sold or shared.

Comments

No comments yet. Be the first.

Leave a comment

Never shown publicly. Only used if I need to reply.