Checklist · Software Engineering

Code Review Checklist

Review for the things that actually cause incidents — correctness at the boundaries, failure behaviour, and reversibility — in an order that puts the expensive questions before the cheap ones.

Markdown. No sign-up, no email.

Change: _______________ Reviewer: _______ Date: _______

Order matters. Style comments are cheap and satisfying, and a review that opens with them rarely reaches the questions that prevent incidents. Work down the list.

1. Before reading the code#

  • [ ] What problem does this solve? If the change does not say, ask before reviewing
  • [ ] Is this the right problem to solve now?
  • [ ] Is the change small enough to review properly? If not, say so and stop — a 900-line review is a rubber stamp with extra steps
  • [ ] Does the description explain the approach, not just restate the diff?

2. Correctness where it is usually wrong#

  • [ ] Empty input, single item, maximum size
  • [ ] Null, missing, and explicitly-set-to-nothing treated distinctly where they differ
  • [ ] Off-by-one at every boundary
  • [ ] Concurrent execution — can two of these run at once, and what happens?
  • [ ] Time zones, daylight saving, and dates near month and year boundaries
  • [ ] Numeric precision where money is involved
  • [ ] Encoding assumptions on anything that came from outside

3. Failure behaviour#

  • [ ] What happens when the thing it calls fails? Named, not assumed
  • [ ] Timeouts set on every external call
  • [ ] Retries only where a retry can succeed, and with backoff
  • [ ] Retry safety — is the operation idempotent, or can it be repeated harmfully?
  • [ ] Partial failure leaves a consistent state
  • [ ] Errors reach somewhere a person will see them
  • [ ] Failure messages say what to do, not only what went wrong

"What happens when this fails?" is the highest-yield question in code review. Ask it about every call that leaves the process.

4. Reversibility#

  • [ ] Can this be rolled back? If not, that is a design decision — is it a deliberate one?
  • [ ] Database changes are backward-compatible with the currently deployed code
  • [ ] Behind a flag if it is risky, and the flag has a removal plan
  • [ ] Data migrations can be re-run safely

5. Security, proportionate to what it touches#

  • [ ] Input from outside is validated at the boundary
  • [ ] Authorisation checked where the data is fetched, not in the caller
  • [ ] Queries parameterised
  • [ ] Output encoded for its destination
  • [ ] No secret in code, configuration file, log line or error message
  • [ ] Logs do not contain personal data that will outlive its purpose

6. Tests#

  • [ ] Would the tests fail if the code were wrong? Check one deliberately
  • [ ] The specific bug being fixed has a test that fails without the fix
  • [ ] Boundaries and failure paths tested, not only the happy path
  • [ ] Tests assert on behaviour, not on internals that will change on the next refactor
  • [ ] No new flaky test — if it needs a fixed wait, it is not finished

7. Change to existing behaviour#

  • [ ] Anything depending on the old behaviour has been identified
  • [ ] Interfaces others consume are versioned or unchanged
  • [ ] Output shape unchanged, or every consumer updated
  • [ ] Removed code is genuinely unused — checked, not assumed

8. Fit#

  • [ ] Consistent with how this codebase already does things
  • [ ] No new pattern introduced without a stated reason — one codebase with three approaches to the same problem is more expensive than any of them
  • [ ] No dependency added without a reason and a look at what it pulls in
  • [ ] Abstraction earns its place — one caller does not need an interface

9. Readability, last#

  • [ ] Names say what the thing is
  • [ ] Comments explain why, never what
  • [ ] Nothing surprising left unremarked
  • [ ] A stranger could follow the main path in one read

10. As the author, before requesting review#

  • [ ] Read the diff yourself first
  • [ ] Removed debugging output, commented-out code and unrelated changes
  • [ ] Said what you are unsure about — it directs the reviewer to where they are most useful

Sign-off#

NameDate
Author
Reviewer

Back to Software Engineering