When Code Review Turns into Judgment
14 min read

When Code Review Turns into Judgment

Code review is one of the engineering practices most often called “a sign of a healthy team.” Almost every tech organization runs it, almost every engineer agrees it’s important, and almost every article about software quality recommends it. But there’s one question rarely asked: is the code review you run today actually achieving the goal you think it is? This article is an honest reflection on what happens when a well-intentioned practice — the weekly code review meeting — slowly shifts into something that actually damages the learning culture within a team.

The Anatomy of the Weekly Code Review Meeting

The typical weekly code review meeting in many teams looks like this: one hour every week, all engineers attend, code is opened on a projector or shared screen, then discussion runs until time runs out. The stated goals are usually three: engineers know how each other’s code is written, there’s shared learning, and there’s alignment on quality standards.

In intent, all of this is correct. There’s nothing wrong with any of those three goals. The problem isn’t the goals — the problem is the gap between the goals and what actually happens in the room.

Notice the pattern that almost always repeats in such sessions:

sequenceDiagram
    participant Lead as Tech Lead
    participant Senior as Senior Engineer
    participant Junior as Junior Engineer

    Lead->>All: "Okay, let's review team A's PR first"
    Senior->>All: Explains the code context
    Lead->>All: "Here it's better to use pattern X"
    Senior->>All: "Right, and we should also do Y"
    Note over Junior: Wants to ask but holds back
    Lead->>All: "Anything to add?"
    Note over Junior: Silence
    Senior->>All: "Seems clear enough"
    Lead->>All: "Okay, next PR"

Discussion happens, but only at one layer. The junior engineer is in the room — but not truly present in the conversation.


Two Personas That Almost Always Appear

After observing many code review meeting sessions, two behavioral patterns almost always emerge, and both are reasonable responses to an unconductive situation — not reflections of the individuals’ character.

Persona 1: The Passive, Wary Junior

Junior engineers in code review meetings are often in survival mode, not learning mode. They’re physically present, nodding at the right moments, sometimes smiling when someone jokes — but their minds are busy with social risk calculations.

Not technical risk. Social risk.

The questions spinning in their heads aren’t “how does this pattern work?” but “will this question make me look stupid?”, “will this comment be seen as irrelevant?”, or “will the senior next to me think I’m incompetent if I don’t understand this?”

This isn’t excessive insecurity. It’s a very rational response to an environment where mistakes are made in public. When you don’t know exactly where the line is between “a question that shows curiosity” and “a question that shows inability,” the safest choice is silence.

And silence is the most effective way to stop learning.

Persona 2: The Senior Who Dominates Without Realizing It

Senior engineers who dominate code review meetings almost always do so with good intentions. They want to help. They have context. They can see problems others can’t. So they speak.

The problem isn’t their intention — it’s the effect.

Every time a senior speaks, the space for others to think narrows. Not because the senior cuts people off, but because in an asymmetric conversation, greater volume and confidence naturally pull the discussion’s gravity to one point. Other engineers start waiting for the senior to finish speaking before confirming, instead of exploring on their own.

What’s more dangerous: seniors often give a “final answer” too quickly. A question is raised, the senior immediately answers with the best solution they know — and the discussion ends there. Yet the greatest value of code review isn’t in the answer, but in the process of reaching the answer.

flowchart TD
    A[A technical question arises] --> B{Who speaks first?}
    B -- Senior --> C[Senior gives a complete answer]
    B -- Junior --> D[Junior voices a hypothesis]
    C --> E[Discussion ends — everyone agrees]
    D --> F[Senior responds, adds context]
    E --> G[Junior never gets a chance to think for themselves]
    F --> H[Junior learns how to think, not just answers]
    G --> I[Shallow learning]
    H --> J[Deep learning]

The difference between these two paths isn’t about who’s smarter. It’s about the order of speaking, and who’s given the space to be wrong first before being corrected.


Three Structural Problems Often Overlooked

When a code review meeting doesn’t go as expected, the first instinct is usually to blame individuals: the senior who’s too dominant, the junior who’s too passive, the lead who doesn’t facilitate well. But this is too easy a conclusion and often wrong.

The real problem is at the structure level — not the people level.

1. Too Much Power Imbalance for One Room

When a junior engineer, mid-level engineer, senior engineer, tech lead, and possibly an engineering manager are all in one room discussing code, you’re creating conditions where equal discussion is almost impossible to happen naturally.

Power imbalance in engineering teams isn’t just about job titles — it also comes from:

  • Years of industry experience
  • Depth of knowledge in a specific domain
  • How long someone has been on the team
  • Established technical reputation
  • Who’s been “right” most often in previous discussions

All these factors create an implicit hierarchy that isn’t written anywhere but is felt by everyone in the room. And in an implicit hierarchy, people in lower positions won’t speak freely — especially to voice disagreement or confusion.

Power imbalance can’t be solved by just saying “all opinions are welcome here.” Words aren’t enough to change an already-formed social dynamic. It takes a format change, not just an intention change.

2. Code Review Is a Thinking Activity, Not a Meeting Activity

There’s a very fundamental but very wrong assumption hidden behind the weekly code review meeting: that critical thinking about code can be done optimally in a meeting format with limited time.

Try imagining what’s needed to review code well:

  • Understanding the business context behind the built feature
  • Understanding the technical constraints that existed when the code was written
  • Tracing the logic flow from start to finish
  • Imagining edge cases that might occur
  • Comparing with possible alternative implementations
  • Considering the impact on other parts of the system

All of these are cognitive activities requiring deep focus, flexible time, and the freedom to stop, think, come back, and think again. A 1-hour calendar slot meeting can’t accommodate all of this.

What happens is that review becomes structurally shallow. Not because the people are incompetent — but because the format doesn’t allow depth. The review that happens in a meeting focuses on what’s easiest to see: variable naming, inconsistent code structure, missing comments, or familiar patterns. Deeper things — is this abstraction right, is the boundary between these components healthy, will this decision create technical debt in 6 months — are almost never discussed because they need more than 1 hour for just one PR.

3. Seeing Isn’t the Same as Learning

There’s an implicit belief behind the “let’s look at code together” format: that exposure to other people’s code automatically produces learning. But this is the same logic as believing that watching someone swim will teach you how to swim.

Real learning requires more than just seeing. It needs:

  • Context: why was this decision made?
  • Exploration: what are the alternatives?
  • Mistakes: what would happen if this was done differently?
  • Reflection: what can I apply from this to my own work?

When engineers sit in a code review meeting and watch code already explained by the person who wrote it, most of them are only receiving an explanation without active cognitive processing. They’re not learning how to think about code — they’re just receiving conclusions about code.


When the Focus Shifts from Code to People

There’s a very specific moment when code review loses its purpose, and that moment usually doesn’t happen dramatically — it happens slowly, almost imperceptibly, through very subtle language shifts.

Notice the difference between these two framings:

Framing A (focus on the system):
"This PR uses eager loading, which means we fetch all
relations at once. In this scenario it might be fine, but it's
worth considering if the dataset grows."

Framing B (focus on the person):
"Why is this using eager loading? This is inefficient."

Technically, both convey the same information. But psychologically, they create very different atmospheres. Framing A invites discussion. Framing B creates defensiveness.

And once the atmosphere shifts toward defensiveness, the learning culture collapses. An engineer whose code was “dissected” in public won’t go home motivated to write better code — they’ll go home wanting to avoid PRs that are too “visible” in the future.

stateDiagram-v2
    [*] --> HealthyReview: Focus on the system and decisions
    HealthyReview --> Discussion: Open questions are raised
    Discussion --> SharedUnderstanding: Engineers build context together
    SharedUnderstanding --> LearningHappens: The team grows together

    [*] --> DysfunctionalReview: Focus on the code and who wrote it
    DysfunctionalReview --> Defensiveness: Criticism is felt as an attack
    Defensiveness --> Withdrawal: Engineers choose silence
    Withdrawal --> LearningStops: The team stagnates

The most dangerous part of this dynamic: usually no one explicitly realizes it. Everyone feels the session is running “normally.” Discussion exists. Technical points are made. But behind it all, junior engineers slowly learn that the safest thing is to write the least controversial code — not the code most right for the problem at hand.


The Cumulative Effects That Aren’t Visible

One dysfunctional code review session doesn’t immediately damage a team. But when the same pattern repeats every week for months, the cumulative effects can be very serious.

Junior Engineers Stop Exploring

Juniors who grow up in an environment where mistakes are judged in public tend to adopt a rational but self-destructive strategy for their development: minimizing exposure risk. That means they prefer the “safest” and most familiar solutions — not because those are best, but because they’re easiest to defend when questioned in code review.

Exploration stops. Creativity shrinks. And after a few years, you have senior engineers who are very good at following existing patterns, but unaccustomed to thinking from first principles.

Senior Engineers Lose Challenge

The paradox is that an environment making juniors silent also harms seniors. When no one dares to ask naive questions, seniors lose the chance to test whether their assumptions are still valid.

“Naive” questions from juniors are often the sharpest questions: “Why do we do this this way?” is a question that should be asked regularly, but in an unsafe environment, no one wants to ask it.

Senior engineers who are never challenged tend to calcify — their thinking becomes rigid, the patterns they favor become the only patterns they recommend, and the context they consider narrows to what they already know.

The Team Loses Healthy Disagreement Space

Healthy organizations need a space where people can disagree without social consequences. A dysfunctional code review meeting slowly removes that space. Engineers learn that agreeing is safer than debating, that silence is safer than asking, and that conformity is more valued than innovation.

The result is a team that looks harmonious on the surface but actually has no mechanism to detect and fix its own architectural errors.


What Teams Actually Need

Understanding the structural problems above helps us design better alternatives. Not to eliminate code review — but to separate the goals that have been crammed into one format that can’t contain them all.

Async Review as the Default

The most effective code review is the one that happens when the reviewer has time and focus to truly think. Meaning async, not a meeting.

A reviewer who opens a PR at a time they choose, without the social pressure of the room, and with enough time to trace context, will give a far more substantial review than a reviewer seeing the code for the first time in front of everyone.

This doesn’t mean there’s no discussion. It means discussion happens via comments, which have a very different nature from oral discussion: more written, more thinkable before being delivered, and more usable as future reference.

Separate Knowledge Sharing from Code Review

If the goal is shared learning, use a format actually designed for it: tech talks, architecture discussions, or lesson learned sessions. This format differs from code review in one crucial way: the focus isn’t on specific code written by someone, but on the concept, pattern, or decision to be shared.

When you separate “this is code written by person A” from “this is a pattern we want to discuss,” psychological safety immediately improves dramatically. Discussion becomes about ideas, not about people.

flowchart LR
    A[Code Review] --> B[Async PR Review]
    A --> C[Pair Programming]

    D[Knowledge Sharing] --> E[Tech Talk]
    D --> F[Architecture Decision Record]
    D --> G[Lesson Learned Session]

    H[Standards Alignment] --> I[Linters and Static Analysis]
    H --> J[Team Convention Doc]
    H --> K[RFC Process]

    style A fill:#fff3e0,stroke:#fb8c00
    style D fill:#e8f5e9,stroke:#43a047
    style H fill:#e3f2fd,stroke:#1e88e5

The three goals often crammed into one weekly meeting actually need three different formats. When you separate them, each format can be optimized for its own purpose.

Make Psychological Safety an Explicit Priority

Psychological safety isn’t something that happens automatically because “our team is open.” It’s built through concrete signals sent consistently by the people with the most power in the team.

Some concrete signals that can be sent:

  • A senior engineer publicly asking “I’m not sure this is the best way, does anyone have another view?” — this gives implicit permission for juniors to also be uncertain.
  • A lead responding to “naive” questions with enthusiasm and gratitude, not with an explanation that makes the asker feel stupid.
  • Review comments that always start with understanding the context before giving advice — “I see this uses X, is there a specific reason? If there’s no constraint, Y might be easier to maintain.”

There’s no magic formula here. But the principle is consistent: signals that not knowing is a valid starting point, not a weakness to hide.


Distinguishing Healthy from Unhealthy Code Review

Not all code review meetings are bad. Some sessions run very well. The key is being able to recognize the difference.

AspectHealthy Code ReviewDysfunctional Code Review
Discussion focusSystem, decisions, trade-offsSpecific code and who wrote it
Who speaksAll levels, taking turnsMostly seniors and leads
Response to questionsExplored togetherAnswered directly by the most senior
Feeling after the sessionCurious and wanting to exploreRelieved it’s over
Follow-upDiscussion continues asyncEverything ends in the meeting
Junior engineersActively ask and opinePassive, just listen
Mistakes treated asLearning opportunitiesSomething needing explanation

Look at the last row carefully. How a team treats mistakes is the most accurate indicator of whether its learning culture is healthy. Not how often they hold review sessions, not how senior the reviewers are, and not how detailed the comments given are.

“Blame-free post-mortem” is a popular concept for production incidents — but the same principle applies to code review. A review focused on “how can this system be better” is always more productive than a review focused on “why was this written this way”.

Lessons for Engineers at Every Level

This reflection isn’t just for tech leads or engineering managers. There are specific lessons for every position.

For Junior Engineers

If you find code review meetings tense, you’re not alone and you’re not wrong. That’s a reasonable response to a format that indeed wasn’t designed for your comfort. What you can do: find a reviewer you trust and start the discussion via async comments before the session — this is a far safer way to explore understanding without public pressure.

More importantly: distinguish between your own unanswered questions and questions that were answered but you didn’t understand the answer. Both are valid to ask. Not understanding isn’t a weakness — it’s a signal that the explanation needs improvement.

For Senior Engineers

Your technical ability is very valuable. But in discussion sessions, the ability most needed from you isn’t the ability to give correct answers — it’s the ability to ask questions that make others think deeper.

Try a simple experiment: in the next review session, hold back from being the first to speak. Let others fill the void. You might be surprised at the quality of thinking that emerges when that space is available.

For Tech Leads and Engineering Managers

The code review meeting format you choose sends a stronger signal than anything you say about learning culture. If you say “all opinions are equally valuable” but the format places everyone in one room with a clear hierarchy, the message received is the second one.

A question worth asking regularly: who spoke in the last session, and who didn’t? Does the distribution reflect a healthy team?


Summary

  • Good intentions don’t guarantee a healthy format — the weekly code review meeting was created with noble goals, but its format can create effects opposite to its purpose.
  • The problem is in the structure, not the individuals — passive juniors and dominant seniors are rational responses to an environment not designed for equality. Don’t blame the people, change the format.
  • Power imbalance can’t be neutralized with words — as long as all hierarchy levels are in one room discussing code, truly equal discussion is almost impossible to happen naturally.
  • Code review needs deep focus, not a calendar slot — good review takes time to understand context, trace logic, and imagine edge cases. A meeting format can’t accommodate this.
  • Separate three goals into three formats — code review (async PR), knowledge sharing (tech talks, lesson learned), and standards alignment (linters, convention docs, RFCs) need different formats because their purposes differ.
  • Psychological safety is the foundation of learning — without the safety to be wrong and not know, there are no questions, no discussion, and no growth. It’s built through consistent signals from the people with the most power in the team.
  • Distinguish focus on the system vs focus on the person — “why was this written this way?” and “there’s an interesting trade-off in this decision” discuss the same topic but create very different atmospheres.
  • Mistakes are the best culture indicator — how a team treats mistakes in code review reflects whether its learning culture is healthy more accurately than any metric.

Portfolio