DevForge LogoDevForge
Learning Tracks

The 10 PR Journey

Ten pull requests, in order, from one we review ourselves to one a real project keeps. You are not aiming for ten checkmarks. You are aiming for one contribution you can talk about for fifteen minutes, and nine that made it possible.

Milestones signed off0 / 10

Roughly one milestone every two weeks — about a semester. Milestones 7, 9 and 10 will overlap, and should.

The six rules

A closed PR still counts.
Every milestone except the last completes on a good reflection, not on a merge. You do not control whether a maintainer merges you; you control what you learned.
No pull request before the issue.
From milestone 3 onward you comment first and wait for a reply. Unannounced PRs are the single fastest way to waste a maintainer's afternoon.
One repo, at least three milestones.
Depth beats breadth. Maintainers review known names properly and drive-by contributors barely at all — and you cannot do milestone 10 in a codebase you met last week.
Milestones 1 and 2 stay in-house on purpose.
You do not take training wheels into a stranger's repository. Learn the mechanics where the cost of getting it wrong is a teammate's five minutes.
Reflections are due within 48 hours of the review.
Written at the end of the semester they are fiction. Written the same week they are the thing you actually bring to an interview.
The goal is one deep story, not ten checkmarks.
No interviewer is moved by ten pull requests. They are moved by one you can explain for fifteen minutes. The other nine are what make that one possible.

The ten milestones

PR 01This workbook One evening

Sign the workbook

Open a pull request against this workbook adding your own entry. Your first PR is to us, not to a stranger.

Done when
  • You worked on a branch, not on main — your PR shows one file changed, not forty
  • A senior member left at least one review comment
  • You pushed a follow-up commit that addressed it (not a new PR)
  • Merged

Committing to main on your fork, then wondering why the PR contains everyone else's work. If your diff has files you did not touch, close it and start the branch again.

Also answer: Which part of fork → branch → commit → PR did you have to look up? Be honest — everyone looks something up here.

PR 02A DevForge repo Two to four evenings

Fix something that is ours

A real code change in a DevForge repo — the portal, a club project, a script. Real review, forgiving maintainer.

Done when
  • An issue exists and is assigned to you before you write code
  • The diff is under ~50 lines
  • CI is green without anyone re-running it for you
  • Reviewed by a maintainer and merged

Picking something too big because it sounded more impressive. If your diff passes 100 lines at milestone 2, you chose wrong — split it or pick again.

Also answer: How long between understanding the bug and having a fix? Where did that time actually go — reading, setup, or typing?

PR 03A real outside project About a week of watching one repo

File a bug nobody can dismiss

A reproducible issue on a real outside project. No code in this milestone at all.

Done when
  • Exact version, OS, and commit SHA
  • Minimal steps a stranger can follow without asking you anything
  • Expected behaviour vs. what actually happened, stated separately
  • You searched the existing issues first and linked the closest one you found
  • A maintainer responded — any response counts, including 'duplicate'

"It doesn't work." Also: filing before searching. Being a duplicate is fine if you say what you searched for; being unreproducible is not.

Also answer: Paste the maintainer's first reply verbatim. What did it assume you already knew?

PR 04A real outside project About a week

Add a test for something that already works

Cover existing untested behaviour. No behaviour change. This is the highest-acceptance PR a beginner can open.

Done when
  • You broke a line of the source on purpose and watched your test fail — output pasted in the reflection
  • It follows the repo's existing test conventions, not your own
  • You can run the full suite locally
  • CI green

Writing a test that passes even when the feature is broken. If you did not watch it fail, you did not write a test — you wrote a comment that takes 40ms to run.

Also answer: What did reading the test suite tell you about this codebase that reading the source did not?

PR 05A real outside project About two weeks

Fix the bug

Fix the issue you filed at milestone 3, or a good-first-issue that a maintainer assigned to you.

Done when
  • You commented on the issue and got a reply before writing code
  • The fix ships with a test — the skill you built at milestone 4
  • The PR closes the issue with 'Fixes #N'
  • At least one round of review that you responded to

Opening the PR before commenting on the issue. Two people silently fixing the same bug is how contributors burn out and how maintainers stop labelling issues for beginners.

Also answer: What was the actual root cause, and what did you believe it was during the first hour?

PR 06A real outside project Three to five days

Write the documentation you needed

Document the exact thing that confused you at milestone 4 or 5. Now you have earned this PR.

Done when
  • Not a typo fix — a new explanation, a worked example, or a section you rewrote
  • You can name the moment you were confused and link the code that confused you
  • Merged, or carrying maintainer feedback you have responded to

This is the milestone that looks easy and is not. If you cannot point at the hour you were stuck, you have not earned it yet — go back and finish 4.

Also answer: What did the existing docs assume about the reader that turned out to be untrue for you?

PR 07A real outside project Three to four weeks

Ship a feature you negotiated first

A change the maintainers agreed to before you built it. The conversation is the milestone; the code is the receipt.

Done when
  • An issue or discussion where you proposed it and a maintainer said some version of yes
  • The scope you shipped matches the scope that was agreed
  • The PR links that conversation
  • Merged, or open with active maintainer engagement

Building first and asking after. Second trap: the unsolicited refactor. If your PR title starts with 'refactor' and nobody asked for it, expect it closed. Refactor when a reviewer asks, inside the PR they asked in.

Also answer: What did the maintainer change about your proposal before agreeing to it?

PR 08A real outside project About a week

Review someone else's work

Two reviews: one on a club member's PR, one on a stranger's. Sit on the other side of the table.

Done when
  • Each review carries at least one specific, actionable comment — 'LGTM' is not a review
  • You ran or genuinely read the code, and can say which
  • You asked at least one real question about something you did not understand

Rubber-stamping, and its mirror image — nitpicking whitespace and naming that a linter already handles. Both tell the author you did not read it.

Also answer: What did you fail to understand in their code, and did you say so out loud in the review?

PR 09A real outside project However long it takes

Survive a hard review

A PR that took three or more rounds, or one that got closed. This is the only milestone you cannot complete by getting it right first time.

Done when
  • Three or more rounds of review that you worked through — or a closed PR
  • A closed PR completes this milestone in full. That is the point of it
  • You did not argue past the second 'no', and you did not disappear

Arguing, or ghosting. They end the same way, and maintainers remember both.

Also answer: Quote the harshest piece of feedback you received. Was it right? What would you tell yourself the day before you opened that PR?

PR 10A real outside project The rest of the semester

The one you would defend

A contribution the project actually keeps, and that you can talk about for fifteen minutes without notes.

Done when
  • Merged, and shipped in a release or a release branch
  • You can explain the root cause, the approaches you rejected, and what a reviewer caught that you missed
  • You presented it to the club in five minutes and took questions

Choosing the largest diff instead of the one you understand best. Nobody in an interview counts your lines.

Also answer: This is your interview answer. Write it as one, out loud, and time yourself.

The reflection, every time

Five fields, hard caps, filed within 48 hours of the review. The caps are enforced on submit, not suggested — a reflection nobody can read in thirty seconds is one nobody reads at all, including you, three months later, in an interview.

1What I tried100 words

The approach you took — including the one you abandoned before it.

2What broke100 words

The error, the wrong assumption, or the dead end. "Nothing" is not an answer; if nothing broke, the task was too small.

3What the reviewer saidverbatim

Paste the actual comment. Do not paraphrase — paraphrasing sands the lesson off.

4What I would do differently60 words

One concrete change to how you'd approach the next one.

5The numbersone line

Hours spent · rounds of review · status (merged / open / closed).

This is not a course, and finishing it is not a certificate. Nothing here is completed by watching a video.