Code Review, Pull Requests and Issues

3."Can't Reproduce"

A

In this chapter

We'll learn code review from both sides — how to make your pull request easy to review and how to review others' well — and how to write issues and bug reports someone can actually act on, explained as a house inspection and a doctor's notes, using Anna's 31 comments and her "Can't reproduce" bug report.

14–16 min

The Problem in Real Life

Anna's bug report to the mobile team said: "Seat map broken on iPhone. Please fix ASAP." Liam's reply: "Can't reproduce. Works on mine. Closing." She's annoyed — it is broken; she saw it.

John reads both the report and her 31-comment pull request side by side. "Same lesson, twice. In both cases you knew things the reader didn't. Your PR didn't say what it changed or why. Your bug report didn't say which iPhone, which screen, or what 'broken' looked like. The reader had to guess — and guessing is slow, or impossible."

J

"Can't reproduce" usually means "you didn't tell me enough".

John

Making the Reader Guess vs. Giving Them Everything They Need

Huge, unexplained PRs

A big change with no description takes hours to review — and gets 31 comments.

Reviews that hurt or don't help

Vague or harsh comments slow everyone down; so do reviews that just say "LGTM".

Bug reports nobody can act on

"It's broken" can't be fixed — the developer needs to see it happen.

Code Review, Pull Requests, Issue Tracking and Bug Reports

The house inspection analogy: a good house inspector gets a clear plan of what was built and what changed. They check the important things first (wiring, foundations), point out problems clearly with a suggested fix, separate "must fix" from "nice to have", and also say what was done well. Code review is a house inspection — and both the builder and the inspector have a job to do (Act 18 introduced the basics).

  • As the author — make it easy to inspect: keep PRs small (one idea per PR; under a few hundred lines when possible). Review your own diff first — you'll catch half the comments yourself. Write a description: what changed, why, how to test, screenshots, and anything you're unsure about (Act 18's PR template). Answer every comment — fix it, or explain politely why not — and don't take comments personally.
  • As the reviewer — inspect what matters: review soon (waiting days blocks people); read the description first; look at correctness, tests, readability, security before style (formatters handle style — Act 07). Ask questions instead of giving orders ("What happens if ticketCount is 0?"). Mark priority: blocking vs "nit:" (optional). Suggest a fix. Say what's good. If a thread goes back and forth more than twice, talk instead.
  • What 31 comments really meant: Anna's PR was 900 lines, mixing three features, with a one-line description. Most comments were about names (chapter one) and missing "why" (chapter two). Split into three PRs with good descriptions, the same work would probably have had a handful of comments.
  • Issue tracking — the team's to-do system: teams track work as issues (tickets) in tools like Jira, Linear or GitHub Issues (Act 18's stories, tasks and bugs). Each has a type, priority, labels (mobile, payments), an assignee and a status. PRs link to the issue they solve (Fixes #412), so the history connects the problem, the discussion and the code.
  • Bug reports — the doctor's notes: a doctor can't treat "I feel bad". They need: where it hurts, since when, what makes it worse, what you've already tried. A bug report someone can act on contains: a clear title (what, where); steps to reproduce (numbered, exact); expected vs actual result (Act 17); environment (device, OS, browser, app version, account type, test or production); evidence (screenshot, screen recording, error message, log excerpt with request ID); frequency (every time? 1 in 5?); and impact (how many users, how bad).
Table — Anna's bug report: before and after
PartBeforeAfter
TitleSeat map broken on iPhoneSeats in rows A–C can't be tapped on iPhone SE
Steps(none)1. App v4.2.0 on iPhone SE, iOS 18.1 · 2. Riverside show · 3. Tap row A–C
Expected / actual"broken"Seat selected / nothing happens; rows D+ work
Environment"iPhone"iPhone SE, iOS 18.1, app 4.2.0, production
Evidence(none)Screen recording
Frequency(none)Every time on SE; fine on iPhone 15
Impact"ASAP"~8% of iOS fans; most expensive seats
Table — Review comments: blocking vs. nit
CommentPriority
This returns a negative price when ticketCount is 0 — could we return 0 or throw?Blocking
There's no test for exactly 10 tickets (the group boundary).Blocking
nit: maybe groupPrice instead of priceForGroup? Either is fine.Optional
Nice — splitting the discounts into small functions makes this very easy to follow.Praise

Anna's rewritten bug report: Title: Seat map: seats in rows A–C can't be tapped on iPhone SE (small screen). Steps: 1. Open the app (v4.2.0) on an iPhone SE, iOS 18.1. 2. Open any Riverside Arena show. 3. Tap any seat in rows A–C. Expected: the seat is selected. Actual: nothing happens; rows D and below work. Frequency: every time on iPhone SE; works on iPhone 15. Evidence: a screen recording, and a note that the "Back" bar seems to cover the top rows. Impact: about 8% of iOS fans use small iPhones; front rows are the most expensive seats.

The result: Liam reproduces it in two minutes on a simulator set to iPhone SE — an invisible bar was sitting over the top rows on small screens. Fixed the same day. He reopens the issue, links his PR (Fixes #412), and writes: "Perfect report. Thank you."

Key Takeaway

Code review is a house inspection with two jobs. Authors keep PRs small, review their own diff first, explain what, why and how to test, and answer every comment. Reviewers respond soon, check correctness, tests, readability and security before style, ask questions, mark blocking vs nit, suggest fixes and praise good work. Issues are tracked with type, priority, labels and links. A bug report someone can act on has a clear title, exact steps, expected vs actual, environment, evidence, frequency and impact.

Why This Matters

Pull requests, reviews and issues are where most professional communication about code happens. Being easy to review, reviewing kindly and usefully, and writing bug reports that get fixed the same day make you someone everyone wants to work with — and they save the whole team hours every week.

The bug report worked because Anna wrote it for her reader. John points out that the same is true of every message she sends — to developers, to Samantha, and when she's stuck and needs help.

Next