Your Schema Is a Contract You Can't Easily Break
You can redeploy code in seconds. You cannot undo a migration. The most consequential decisions in a production backend aren't in the application layer — they're in the database.
Large PRs don't just slow down code review — they fundamentally change the incentives of the reviewer. Here's what actually happens when a 2,000-line diff lands in your queue.
You've seen it. A pull request appears in the queue: 47 files changed, +2,341 −891. The title is something like 'Implement user settings and fix related issues.' The description is three sentences. It's been open for four days.
Someone will eventually approve it. Not because they reviewed it thoroughly. Because they opened it, scrolled for ninety seconds, felt the familiar pressure of not wanting to be the person blocking the release, and clicked approve.
This is not a discipline problem. It's a systems problem. Large pull requests don't fail because engineers are lazy — they fail because the cognitive demands they place on reviewers make meaningful review functionally impossible.
Code review has an effective working memory limit. A reviewer can hold a mental model of maybe 200–400 lines of changes before the model starts to collapse. Beyond that, they're no longer reviewing — they're skimming for obvious errors and hoping the tests cover the rest.
This isn't a failure of effort. It's a failure of context. To review a change meaningfully, you need to understand what it's trying to do, what it touched to get there, and what the downstream effects are. That's easy for 80 lines. It's nearly impossible for 2,000 — especially when those 2,000 lines span a bug fix, a refactor, a new feature, and three unrelated cleanup commits.
A large PR doesn't get a thorough review from one person. It gets a shallow review from everyone — each reviewer hoping someone else caught what they missed.
The conventional argument against large PRs focuses on review time — the bigger the diff, the longer it takes to merge. That's true, but it's the smallest part of the problem.
The real cost is feedback delay. When you batch three weeks of work into one PR, you're not just asking for a review — you're asking for a verdict on three weeks of assumptions. If the architectural decision you made in week one was wrong, you find out in week four, after you've built everything on top of it. The rework isn't just the wrong code. It's the right code you wrote on top of the wrong code.
Small, focused PRs get reviewed faster not just because they're shorter, but because reviewers can engage with them fully. A 150-line PR with a clear scope gets meaningful feedback. That feedback arrives while the author still has the context to act on it quickly. The iteration loop stays tight.
A consistently large PR size is usually a symptom of one of three things: the team hasn't learned to decompose work into shippable slices; the author is uncomfortable shipping incomplete work and waits until everything is 'done'; or the codebase makes incremental changes hard because everything is tightly coupled.
Small PRs make good review possible — they don't guarantee it. Reviewers also have a responsibility to engage with what they're given, not just approve to keep the queue moving.
Good review asks: does this code do what it claims to do? Does it do anything it doesn't claim to do? Is this the right place for this logic? Would I be able to debug this at 2am? It doesn't ask: does this match my personal style preference? Would I have implemented this differently?
The most useful review comment is the one that changes the outcome of the code. The least useful is the one that changes the variable name. Both take roughly the same effort to write. One of them matters.
Approval is not the goal of code review. Understanding is. Approval without understanding is just risk transfer — you're moving the problem from the author to the reviewer to production.
If your team tracks anything about pull requests, track time-to-first-meaningful-comment, not time-to-merge. Merge time is influenced by too many factors outside the reviewer's control — priorities, blockers, calendar. Time to first meaningful comment measures whether review is actually happening.
A team where PRs get a real response within a few hours, regardless of size, is a team where authors get early signal, catch wrong turns quickly, and build the habit of writing code that's easy to explain. That compounds.
You can redeploy code in seconds. You cannot undo a migration. The most consequential decisions in a production backend aren't in the application layer — they're in the database.
Most monitoring setups tell you what broke. Good observability tells you what's about to break. The difference isn't the tooling — it's what you choose to measure.