<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged programmingblogs</title>
<link>https://coderlegion.com/tag/programmingblogs</link>
<description>Powered by Question2Answer</description>
<item>
<title>Open the PR your reviewer has not met yet</title>
<link>https://coderlegion.com/22220/open-the-pr-your-reviewer-has-not-met-yet</link>
<description>&lt;p&gt;I got a PR to review recently. Large diff, AI-assisted, touching a module three other features depended on. The description was one sentence. It named the file, not the reason.&lt;/p&gt;
&lt;p&gt;I spent fifteen minutes just mapping the change before I could start reviewing. What the intent was. Where the risk was. Which files mattered and which were noise.&lt;/p&gt;
&lt;p&gt;Somewhere in the middle of that fifteen minutes, I thought: I have done this to someone else.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-author-forgets-what-the-reviewer-does-not-know&quot;&gt;The author forgets what the reviewer does not know&lt;/h3&gt;
&lt;p&gt;When you write the code, you carry everything.&lt;/p&gt;
&lt;p&gt;You know why the module was split. You know what you tried before landing here. You know which section you shipped with a quiet doubt. You know the edge case that is technically handled but not properly tested.&lt;/p&gt;
&lt;p&gt;Then you open the PR.&lt;/p&gt;
&lt;p&gt;And you write the description from that place. From inside the full context, for the version of you who already knows. Not for the reviewer who is about to walk in without any of it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Refactored service layer.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Updated config handling.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Fixed issue with auth module.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These are descriptions written from memory, not for someone without it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ai-widened-the-gap-before-i-noticed&quot;&gt;AI widened the gap before I noticed&lt;/h3&gt;
&lt;p&gt;There is a specific unease I have felt looking at my own PRs a couple of days after raising them.&lt;/p&gt;
&lt;p&gt;The code is fine. The tests pass. But I cannot reconstruct why I made the choices I made. The work was AI-assisted, the diff was large, and I had moved fast. Moving fast and understanding deeply are not the same thing.&lt;/p&gt;
&lt;p&gt;I opened one of those PRs recently. A refactoring pass. I tried to read it as a reviewer. I had a question I could not answer from the description. The answer existed. It was in my head when I wrote the code. It never made it into the PR.&lt;/p&gt;
&lt;p&gt;That was the moment I realized &lt;em&gt;the description was not a summary.&lt;/em&gt; &lt;strong&gt;&lt;em&gt;It was a test&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;write-it-for-the-version-of-you-who-will-review-this-in-three-days&quot;&gt;Write it for the version of you who will review this in three days&lt;/h3&gt;
&lt;p&gt;That realization changed how I write descriptions.&lt;/p&gt;
&lt;p&gt;Not a template first. A question first: if I came back to this PR in three days knowing nothing, what would I need to read before opening the diff?&lt;/p&gt;
&lt;p&gt;I sat with that question long enough to realize I needed a structure. Not something I could skip when moving fast. A concrete template I would follow before any non-trivial PR opens. I built it, tested it across refactoring passes, AI-assisted features, and larger architectural changes, and refined it until it held.&lt;/p&gt;
&lt;p&gt;It has six parts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intent&lt;/strong&gt; - not what changed, but why this PR exists and what problem it is solving. One paragraph. If you cannot write it clearly, stop. The PR is not ready to open.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Major changes&lt;/strong&gt; - the decisions that touch architecture, existing behavior, or anything a downstream system depends on. This is where the reviewer needs to slow down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minor changes&lt;/strong&gt; - the cleanup, the renames, the noise. Named separately, so they do not sit next to structural changes and get equal weight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt; - what features, modules, or systems this PR touches. The blast radius, stated plainly. Not documentation. A map.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evidence&lt;/strong&gt; - what was run, what was walked through manually, what coverage looked like. Not to satisfy a process. Proof that the author did the work before asking someone else to do it.&lt;/p&gt;
&lt;p&gt;And the one most descriptions never reach: what I was uncertain about.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;naming-uncertainty-is-not-weakness-it-is-direction-&quot;&gt;Naming uncertainty is not weakness. It is direction.&lt;/h3&gt;
&lt;p&gt;When something works but I cannot fully explain why, I say so. Directly, in the description.&lt;/p&gt;
&lt;p&gt;For the reviewer, it is a targeting signal. They know where to read closely and where to move. Without it, they distribute attention evenly across a diff that does not deserve even attention.&lt;/p&gt;
&lt;p&gt;Writing it is a checkpoint. If I cannot name what I am uncertain about, I have not thought carefully enough about my own code. That line has stopped me from opening PRs that were not ready.&lt;/p&gt;
&lt;p&gt;The description is not the last step before review. It is the last step before I know whether the PR should open at all.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-reviewer-who-opens-this-has-not-met-your-code-yet&quot;&gt;The reviewer who opens this has not met your code yet&lt;/h3&gt;
&lt;p&gt;When I compare the PRs I was proud of shipping against the ones that came back with questions, the difference is rarely the code.&lt;/p&gt;
&lt;p&gt;It is the description.&lt;/p&gt;
&lt;p&gt;A reviewer who understands your intent from the first read spends their time on the hard questions. A reviewer who has to reconstruct your intent spends it on the easy ones. Asking what things are instead of whether they are right.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeelvankhede/review-the-code-that-does-not-exist-yet-11f8&quot;&gt;Part 1&lt;/a&gt; of this series argues the reviewer's side of the same problem. If you arrived here first, it is worth the detour. The argument there: reviewers now need to look past surface correctness and find intent. But intent does not appear on its own. Someone has to put it there before the review begins.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Write it for the reviewer who has not met your code yet.&lt;/p&gt;
&lt;p&gt;Write it as if you will not be there to answer questions.&lt;/p&gt;
&lt;p&gt;Write it as if the next person to read it is you, three days from now, with no memory of writing it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If it holds up, the PR is ready.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22220/open-the-pr-your-reviewer-has-not-met-yet</guid>
<pubDate>Fri, 10 Jul 2026 14:02:40 +0000</pubDate>
</item>
<item>
<title>Review the code that does not exist yet</title>
<link>https://coderlegion.com/22219/review-the-code-that-does-not-exist-yet</link>
<description>&lt;p&gt;I have reviewed code for years, and for most of that time the habit was simple. Open the diff. Read every line. Find what is wrong. It worked, and it worked for a boring reason: the diffs were small because writing code by hand is slow.&lt;/p&gt;
&lt;p&gt;The diffs are not small anymore.&lt;/p&gt;
&lt;p&gt;A pull request now arrives with twenty files in it, built in an afternoon, more code than I could have written by hand in a week. The old habit does not fit a change that size. It bends, then it breaks. So I had to ask a question I had spent years quietly avoiding.&lt;/p&gt;
&lt;p&gt;What is a code review actually for?&lt;/p&gt;
&lt;h3 id=&quot;the-first-thing-i-lost-was-the-point&quot;&gt;The first thing I lost was the point&lt;/h3&gt;
&lt;p&gt;Few years ago, I was the senior reviewer on a small team. I took the role seriously. Maybe too seriously.&lt;/p&gt;
&lt;p&gt;I opened each pull request hunting for faults. Indentation. Naming. A function that could be three lines shorter. A pattern we had agreed not to use. I found them. I was good at finding them. It felt like the job. Every comment was proof that I had been paying attention.&lt;/p&gt;
&lt;p&gt;One day I left seventeen comments on a frontend pull request.&lt;/p&gt;
&lt;p&gt;It was a CSS-heavy change, and CSS changes are hard to review on a diff. The developer had not followed the UI design standards we had set as a team. Almost none of them. So I went through it line by line and marked every single thing I could find. I sent it back.&lt;/p&gt;
&lt;p&gt;I felt like a jerk afterward. But I also thought I had done the right thing.&lt;/p&gt;
&lt;p&gt;Then I looked at what I had actually been reviewing.&lt;/p&gt;
&lt;p&gt;I had read every line. I had not read the work.&lt;/p&gt;
&lt;p&gt;The developer had built exactly what was asked. The feature worked. It was a clear, self-contained piece of UI. And I had spent the entire review arguing with the formatting, as if the formatting were the thing we shipped to users.&lt;/p&gt;
&lt;p&gt;That is the day I started reviewing code for a different thing. Not for what it does the moment it lands. For what someone will do to it next.&lt;/p&gt;
&lt;p&gt;This is not an argument for shipping mess. I still send back work that buries its intent under careless code, because code that is hard to understand is hard to change, and hard to change is where the real cost lives. The difference is that I keep room for an exception now. I do not treat every rule as a wall I am paid to defend.&lt;/p&gt;
&lt;p&gt;A rule is a tool for protecting intent. When I started treating the rule as the point, I forgot what it was protecting.&lt;/p&gt;
&lt;p&gt;I had been reviewing the rules. I had stopped reviewing the work.&lt;/p&gt;
&lt;h3 id=&quot;then-the-diffs-got-faster-than-i-could-read&quot;&gt;Then the diffs got faster than I could read&lt;/h3&gt;
&lt;p&gt;For a long time that lesson stayed quiet. Useful, but never urgent.&lt;/p&gt;
&lt;p&gt;Most pull requests were small, because authoring was slow, and a reviewer could keep pace with an author without much strain. One person wrote for a day, another read for an hour, and the arithmetic worked. The whole practice of review was built on that arithmetic.&lt;/p&gt;
&lt;p&gt;Then people started building with AI.&lt;/p&gt;
&lt;p&gt;Now a change lands with twenty files. Different layers, different concerns, all in one push, all produced faster than I have ever produced anything in my life. And my first thought is almost always the same.&lt;/p&gt;
&lt;p&gt;This is over-engineered.&lt;/p&gt;
&lt;p&gt;Sometimes it is. Often it is not. The instinct fires not because I have judged the design, but because the sheer size of the thing is unfamiliar, and unfamiliar reads as wrong. The honest problem is mine. I could never have written that much code in a day. Reviewing it in a day was the part that unsettled me most.&lt;/p&gt;
&lt;p&gt;The bottleneck moved.&lt;/p&gt;
&lt;p&gt;AI made writing code cheap. It did not make reviewing it cheap.&lt;/p&gt;
&lt;p&gt;Authoring used to be the slow and expensive step, and review was the quick sanity check at the end. That order has flipped. The code now arrives at almost no cost. The judgment about whether the code is right costs exactly what it always did, because judgment was never the part AI made faster.&lt;/p&gt;
&lt;p&gt;The bottleneck did not disappear. It moved onto my desk.&lt;/p&gt;
&lt;h3 id=&quot;so-i-changed-what-i-look-for-first&quot;&gt;So I changed what I look for first&lt;/h3&gt;
&lt;p&gt;If I cannot read twenty files the way I read two, then reading every line first is the wrong opening move. It is slow. Worse than slow, it is misaimed. It spends my sharpest attention on the smallest things, early, while the largest things wait, unread.&lt;/p&gt;
&lt;p&gt;So I stopped starting with the code.&lt;/p&gt;
&lt;p&gt;I start with intent. What is this change trying to do, and does the shape of it match that goal? Does the structure tell the same story the description promised? Only after those questions do I care how any individual line is written.&lt;/p&gt;
&lt;p&gt;This is what I mean by reviewing the code that does not exist yet.&lt;/p&gt;
&lt;p&gt;The diff in front of me is temporary. It is the least permanent thing in the whole exchange. Someone will change it in six months. Someone will debug it at two in the morning with half the context I have right now. Someone will push it past the scale the author ever imagined, and watch it fail in a way nobody designed for.&lt;/p&gt;
&lt;p&gt;Those people are who the review is really for. Not the author, who already understands the change. Not me, who will forget it by next week. The stranger who inherits it.&lt;/p&gt;
&lt;p&gt;The diff is what changed. The future is what I am approving.&lt;/p&gt;
&lt;h3 id=&quot;the-order-is-the-method&quot;&gt;The order is the method&lt;/h3&gt;
&lt;p&gt;Over time my questions settled into an order, and the order turned out to be the whole point. It is not a list to tick off until every box is full. It is a path, and most of it happens before I judge a single line.&lt;/p&gt;
&lt;p&gt;It runs like this.&lt;/p&gt;
&lt;p&gt;What is this trying to do? → How did they solve it, and would I have solved it differently? → What trade-offs or unknowns are sitting in plain sight? → Does this actually improve the thing, or is it added weight, a time bomb waiting for the day nobody is watching? → Am I sure?&lt;/p&gt;
&lt;p&gt;Each question guards against a different failure.&lt;/p&gt;
&lt;p&gt;The first keeps me from reviewing a change I do not understand. The second keeps me honest about the difference between a real problem and my personal taste. The third is where most of the danger hides, because the dangerous parts of a change are rarely the loud ones. The fourth is the one that only gets answered in production, usually later than you wanted. And the last question, am I sure, is the one I added for myself, because the worst approvals I have given were the confident ones.&lt;/p&gt;
&lt;p&gt;Only after all of that do I open the files and read them line by line, with no mercy.&lt;/p&gt;
&lt;p&gt;Look at where the strict part lives. At the very end.&lt;/p&gt;
&lt;p&gt;Everything before it is about understanding the work and arguing with my own judgment. The line-level pass is not the review. It is the last step of the review, and it only earns its place once the rest has cleared.&lt;/p&gt;
&lt;p&gt;You earn the right to nitpick. You do not start there.&lt;/p&gt;
&lt;h3 id=&quot;this-is-not-permission-to-ship-slop&quot;&gt;This is not permission to ship slop&lt;/h3&gt;
&lt;p&gt;I can hear the objection, because I would raise it myself. Does intent-first mean a lower bar? Does it mean waving through sloppy code as long as the idea behind it is clear enough?&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;The strict pass still happens. It happens last instead of first, but it happens, and nothing on the list above is a substitute for it. Intent-first is not standards-free. It is the same standards in a better order.&lt;/p&gt;
&lt;p&gt;And there is a newer risk that makes the order matter more, not less.&lt;/p&gt;
&lt;p&gt;Volume hides intent.&lt;/p&gt;
&lt;p&gt;A twenty-file change can be correct in every single file and still be dangerous, because no one person can hold the whole of it in their head at once. The failure is not in any one line. It lives in the space between the files, in an assumption made in one place and quietly broken in another.&lt;/p&gt;
&lt;p&gt;About nine months ago a pull request landed on my desk with forty-five files in it. I was lenient. I skimmed the parts that looked safe, approved what looked obvious, and moved on.&lt;/p&gt;
&lt;p&gt;Six months later the APIs started creating duplicate transactions in production. We could not find the root cause. The file at the center of the problem had grown to over five thousand lines of code, and the issue was buried inside of it.&lt;/p&gt;
&lt;p&gt;It took a long time to dig out. That change had looked fine in every file I checked. I had just never asked whether it was wise.&lt;/p&gt;
&lt;p&gt;Reading for intent is how I catch that before it merges. A checklist cannot — it looks at each file alone.&lt;/p&gt;
&lt;p&gt;A checklist can tell me the code is correct. It cannot tell me the code is wise.&lt;/p&gt;
&lt;p&gt;The fear I started this with never left me. I have just stopped fighting it, and started letting it sharpen the right questions.&lt;/p&gt;
&lt;p&gt;I did not learn to read faster. I learned to read in the right order.&lt;/p&gt;
&lt;h3 id=&quot;what-i-actually-approve&quot;&gt;What I actually approve&lt;/h3&gt;
&lt;p&gt;This is what I think a review is.&lt;/p&gt;
&lt;p&gt;I am not the spell-checker. I am not the gate that catches a missing semicolon or an unused import. I am the person asking what this change will do to whoever inherits it, long after the author and I have both moved on.&lt;/p&gt;
&lt;p&gt;That question works at every level of experience, because it is a question and not a rule. A new engineer can ask it on their very first review. A senior engineer asks it on their thousandth. Nobody is too junior to wonder what happens to this code in a year. Seniority does not exempt you from the question.&lt;/p&gt;
&lt;p&gt;And it has a limit I have started to feel.&lt;/p&gt;
&lt;p&gt;A reviewer can only do so much when the pull request is fighting them. If the intent is buried, if twenty files arrive with no story to tie them together, if the risky change is hidden in the middle of a dozen safe ones, then no amount of patient reading will rescue the review. The reader cannot supply a clarity the author refused to provide.&lt;/p&gt;
&lt;p&gt;Which means half of this problem was never the reviewer's at all. It belongs to the person opening the pull request. That is the other &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeelvankhede/open-the-pr-your-reviewer-has-not-met-yet-4gfe&quot;&gt;half of the story&lt;/a&gt;, and it deserves its own piece.&lt;/p&gt;
&lt;p&gt;Review is not about the code in front of you. It is about the code that comes after.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22219/review-the-code-that-does-not-exist-yet</guid>
<pubDate>Fri, 10 Jul 2026 14:02:11 +0000</pubDate>
</item>
</channel>
</rss>