Section650

Writing

TopicDelivery
Reading4 min

Why Smaller User Stories and Pull Requests Make Better Engineering Teams

A story that was too big on day one makes a pull request nobody can review and a release nobody can roll back. Smaller stories, PRs and rollouts fix different problems, and a team needs all three.

By Ka Lun Chan · Engineering leadership · Delivery / Leadership

It usually starts with the user story

Here’s a hypothetical most engineering managers will recognize. A developer picks up “Add document upload to the application form.” It turns out to mean an upload component, a storage integration, virus scanning, file validation, a permissions change, a status update and an email. The acceptance criteria are two lines. Ten days later a pull request lands with a few thousand changed lines, and it sits for another week because nobody can hold it in their head long enough to approve it.

The developer didn’t do anything wrong. The story was too big before anyone typed a line of code, and everything downstream, from the review to the testing to the release, inherited that size.

Smaller stories fix planning problems

Split that story into pieces a user or a tester can see: the upload, then validation, then scanning, then the status and notification. Each piece gets acceptance criteria that fit on a card and mean the same thing to the developer, QA and the product manager. Estimates get more honest, because people estimate an afternoon far better than a fortnight. Dependencies show up in planning instead of on day eight. When the business changes its mind halfway through, which it will, you reprioritize the remaining pieces instead of abandoning a half-built feature nobody ends up needing. Product gets something shipped every sprint and feedback while it can still change the plan. Engineering gets a sprint that ends with finished work instead of a story carrying over for the third time.

Smaller pull requests fix review problems

A reviewer can read three hundred lines carefully. Nobody reads three thousand carefully, and the approval that eventually lands on a huge PR is mostly an act of trust. Small PRs get real review: someone notices the missing authorization check, the query inside the loop, the retry with no backoff. Feedback gets specific instead of “looks fine, I guess.” Merge conflicts shrink because branches live for days, not weeks. When production breaks, the change that caused it is small enough to find and to revert. And an engineer who doesn’t know that part of the codebase can follow a small PR and learn from it, which is how knowledge spreads without a meeting.

Smaller releases fix the big-bang problem

The same logic applies to what you ship. A feature that goes live all at once, to everyone, on a Thursday afternoon, has the largest possible blast radius and the vaguest failure signal: something is slow, and it could be any of twelve changes. Rolling out in smaller pieces, behind a flag or to a slice of users first, means you learn from real traffic while the exposure is small, you can turn one thing off without rolling back everything, and support knows exactly what changed when the tickets arrive. Small stories and small PRs are what make small releases possible.

Fast for one person, slow for the team

The developer who ships the whole feature in one PR feels productive, and in a narrow sense they were. Then two reviewers lose an afternoon to it, QA can’t tell which behaviors to test, the release slips while someone untangles a conflict, and a bug that would have been obvious in a small change goes out with everything else. Add it up and the fast path was the slow one. Individual coding speed is easy to see and easy to celebrate. Team throughput is what the business actually gets.

Smaller doesn’t mean more process

Breaking work down takes some thought up front, and not everything needs to be tiny. A one-line config change doesn’t need a story, and a feature that genuinely is one coherent change can be one PR. The test is whether a piece is understandable, reviewable, testable and worth something on its own. Splitting a story into twenty tickets that each depend on the other nineteen fails that test as badly as the original monolith did.

Whose job this is

Both of ours. Product managers define increments that are small and still valuable, which is harder than writing one big requirement and far more useful. Engineering leaders help the team cut the implementation into changes they can review and ship. Neither gets to hand a developer a paragraph and hope. It’s the same reason good teams don’t expect everyone to know everything: shape the work so nobody has to.

Smaller stories and smaller pull requests solve related but different problems. Stories are about planning, prioritization and delivery. PRs are about review, collaboration and getting the code right. One story often needs several PRs, and that’s fine. The goal was never more tickets. It’s less complexity per step and a shorter distance between writing something and finding out whether it works.

Short answers

Why are smaller user stories better?

Each piece can be understood, estimated and tested on its own. Acceptance criteria fit on a card, dependencies show up in planning rather than mid-sprint, and when priorities change the team reprioritizes the remaining pieces instead of abandoning a half-built feature.

Why are smaller pull requests better for code quality?

A reviewer can read a few hundred lines carefully and notice a missing authorization check or a query inside a loop. A few thousand lines get approved on trust. Small PRs also mean fewer merge conflicts, changes that are easy to find and revert when production breaks, and code other engineers can learn from.

Does one user story need one pull request?

No. Stories solve a planning problem and PRs solve a review problem, so one story often ships as several PRs. The aim is less complexity per step, not a particular ratio of tickets to PRs.

Why roll out features in smaller pieces?

A feature released to everyone at once has the largest blast radius and the vaguest failure signal. Releasing behind a flag or to a slice of users first lets the team learn from real traffic while exposure is small, and turn one thing off without rolling everything back.

Optimize for the team’s clock

The fastest engineer on the team can’t make the team fast. The size of the work can.

Good engineering teams measure how long it takes for a change to be understood, reviewed, tested and safely in front of users, not how quickly one person closes a ticket.

How I improve execution with small, safe changes Talk about how your team ships