DEV Community

Cover image for Code Reviews Are Theater — And We All Know It
Tarek Mostafa
Tarek Mostafa

Posted on

Code Reviews Are Theater — And We All Know It

There is an old, bitter joke in software engineering that remains painfully true:

"A 10-line pull request gets 15 comments. A 500-line pull request gets 'LGTM 👍'."
We tell stakeholders that code reviews are our ironclad safety net. We claim they protect production from bugs, enforce security standards, and preserve architectural integrity.
Engineering managers point to pull requests as proof of quality assurance.
It’s a lie. In 90% of software teams, code review is pure theater.
It’s security theater. It’s compliance theater. It’s a collective ritual designed to make us feel responsible while catching almost nothing that actually matters in production.

Here is why the code review process is broken—and what actually catches bugs.

1. The Bikeshedding Trap: Linting by Humans

Look at the comments on your team’s pull requests over the last month. What do you actually see?

  • "Can we rename tempUserList to users?"
  • "Please use a ternary operator here instead of an if-else."
  • "Missing newline at the end of the file."
  • "Should we extract this 4-line helper into a separate utility file?" This is not engineering; this is human linting. When reviewers don't understand the complex domain logic or the distributed implications of a change, they latch onto what is easy: formatting, syntax preferences, and personal style. It gives the reviewer the dopamine hit of "contributing," while doing zero to verify whether the SQL query will trigger a full table scan under peak load. > Rule of thumb: If a human reviewer has to comment on formatting, whitespace, or naming conventions, your CI tooling has failed. Computers should check syntax; humans should evaluate architecture. ---

2. The GitHub Diff Viewer Cannot Simulate Distributed Systems

Let’s be honest about human cognitive limits:
No human brain can execute a multi-threaded, asynchronous distributed system inside a browser diff window.
When an engineer reviews an 800-line diff on GitHub:

  • They cannot see the state of the database locks.
  • They cannot feel the 300ms network latency to the payment provider.
  • They cannot predict how Kafka consumers will rebalance under backpressure.
  • They cannot see whether the downstream service's payload serializer handles null values gracefully. Production bugs don't happen because someone wrote a slightly clumsy loop. They happen because of boundary interactions, concurrency races, and unexpected system states. A green-and-red flat text comparison on a screen is completely blind to all of these. ---

3. The "LGTM" Tax and Sprint Velocity Fatigue

Code reviews in typical agile teams suffer from toxic incentives:

  1. Pull Requests are queues: An open PR is a blocker. It halts velocity.
  2. Reviewing takes deep context: Understanding someone else's 400 lines of complex business logic requires at least 45 minutes of uninterrupted focus.
  3. Engineers are interrupted constantly: Context switching is expensive. What happens when an engineer is pinged for the fourth time in Slack to "Please review my PR so I can merge before standup"? They skim the files. They check that the CI build passed. They look for obvious typos. Then they type "LGTM" (Looks Good To Me) and click Merge. The rubber stamp is stamped. The process checkbox is checked. If the system crashes in production tomorrow, everyone shrugs: "Well, it went through review!" Responsibility is diffused, accountability vanishes, and the bug still made it to production. ---

4. What High-Performance Teams Do Instead

If async PR reviews are theater, how do elite teams actually prevent catastrophes without drowning in bureaucracy?

A. Automate Every Trivial Check (Strict CI)

No PR should ever reach human eyes if it hasn't passed strict automated formatting, type checking, security vulnerability scanning, and contract tests.
If an argument can be settled by an automated rule (like ESLint, Prettier, or Black), configure it and never debate it in a PR again.

B. Architectural Alignment Before Code is Written

The biggest bugs are architectural mistakes, not syntax typos.
Reviewing architecture after someone wrote 1,000 lines of code is a recipe for disaster (no one wants to reject a week of work).
Review ideas through RFCs (Request for Comments), 1-page design docs, or a 10-minute whiteboard session before the first commit.

C. Micro-PRs (< 200 Lines)

The moment a PR exceeds 300 lines, the probability of a meaningful bug being found drops to near zero. Enforce small, atomic PRs with bounded blast radius.

D. Shift Review Questions from Syntax to Operational Contracts

Stop asking: "Is this code pretty?"
Start asking operational questions:

  • How does this service behave when the external dependency times out?
  • What metrics or alerts will fire if this fails silently?
  • Can this change be rolled back safely without breaking data consistency?

* What is the database blast radius if traffic spikes 10x?

The Reality Check

Code review isn't inherently evil. When two engineers who deeply understand the domain sit down and dissect an operational edge case, it is invaluable.
But treating asynchronous, superficial GitHub PR approvals as a guarantee of software quality is delusional.
It’s time to stop worshipping the process and admit the truth: if your quality assurance strategy relies on human beings spotting runtime bugs in a web browser diff, you don't have a QA strategy.

You have a ritual.

What is the most ridiculous, nitpicky comment you’ve ever received on a pull request?
Drop it in the comments below—let's share some PR trauma.

Author's Note: If your team wants a concrete framework to replace "code review theater" with real operational safety, I documented the complete architectural blueprints and worksheets in The Unshakeable Developer (now available on Amazon).

You can also grab the open-source Pull Request Review Covenant & Production Audit Sheet for free directly from the GitHub repository.

Top comments (0)