Code Review as a Senior Engineer: Beyond Finding Bugs
By Carlos Diaz · January 18, 2024 · 3 min read
I used to think a good code reviewer was someone who caught the most bugs. After several years of reviewing code daily across distributed teams, I have come to think that framing undersells what review is actually for - the bugs a review catches are the least valuable thing it produces, because bugs are also caught by tests, staging environments, and monitoring. What review uniquely provides is design feedback and shared context, and neither of those exists anywhere else in the development process.
A review that starts with design questions - does this change belong in this module, does it introduce a coupling the team will regret in six months, does it leave the code easier or harder to change next time - catches problems that no test suite can catch, because tests verify behavior, not architecture. I try to separate feedback explicitly into what must change before merge and what is a suggestion for later, because unlabeled feedback creates exactly the kind of ambiguity that turns a fifteen-minute review into a two-day back-and-forth.
Tooling should absorb everything that does not require human judgment. Linters, formatters, and automated style checks running in CI mean a human reviewer never has to comment on a missing semicolon or an inconsistent import order, which frees up review time entirely for the things that actually require a person - architecture, business logic correctness, and whether the change matches the intent behind the ticket.
Speed and reciprocity are the cultural practices that make review sustainable at a team level. A pull request that sits for two days does not just block one engineer, it invites merge conflicts and encourages people to batch even more changes into the next PR to avoid going through review again, which is precisely the wrong direction. Reviews should also be reciprocal - juniors reviewing seniors, not just the reverse - because that is what actually distributes ownership of the codebase's quality standards across the whole team instead of concentrating it in a few senior engineers.
The team dynamic I am aiming for is one where knowledge circulates faster than any individual could document it, and where no single person is a bottleneck or a single point of failure for understanding any part of the system. Review, done well, is the mechanism that gets you there.
Key Takeaways
- Review design first: does this change belong here, and does it ease future change?
- Separate 'must change' from 'could improve' explicitly to remove ambiguity.
- Let linters and CI checks absorb style feedback so human review time goes to architecture.
- Fast reviews protect team flow; a stale pull request invites conflicts.
- Reciprocal reviews - juniors reviewing seniors too - spread ownership across the team.

