<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lightman Miao</title>
    <description>The latest articles on DEV Community by Lightman Miao (@lightman_miao_fcd6ce02a1c).</description>
    <link>https://dev.to/lightman_miao_fcd6ce02a1c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4199443%2F4e37d07a-01ed-4a72-a46d-f85bd2b4521b.png</url>
      <title>DEV Community: Lightman Miao</title>
      <link>https://dev.to/lightman_miao_fcd6ce02a1c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lightman_miao_fcd6ce02a1c"/>
    <language>en</language>
    <item>
      <title>Don't Review Agent Code. Interrogate It.</title>
      <dc:creator>Lightman Miao</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:08:11 +0000</pubDate>
      <link>https://dev.to/lightman_miao_fcd6ce02a1c/dont-review-agent-code-interrogate-it-25pd</link>
      <guid>https://dev.to/lightman_miao_fcd6ce02a1c/dont-review-agent-code-interrogate-it-25pd</guid>
      <description>&lt;p&gt;I don't really review agent-generated code anymore, and I doubt most of you do either. We can keep this between us.&lt;/p&gt;

&lt;p&gt;An agent can write 100K lines or open 30 PRs in a day. Nobody has time to read that. The obvious bugs are mostly gone by the time I see the PR anyway, because the agent already checked its own work a few times while building it. It's very proud of that.&lt;/p&gt;

&lt;p&gt;So the usual move is to start a fresh agent, tell it "review this PR", skim what it says, and merge.&lt;/p&gt;

&lt;p&gt;I did that for a while. For one whole feature I even had Claude and Codex cross-review each other's PRs, which felt very responsible at the time. After 30 merged PRs, the agent handed the feature back to me for manual testing, and the whole thing was completely over-engineered. It was full of verification steps and strict validation I never asked for, and every one of those PRs had passed a cross-review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhzgu3hiae5nlit5zn7l.gif" alt="This is fine dog sitting in a burning room" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two agents politely approving each other's work for 30 PRs. I had built a very efficient LGTM machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with a fresh reviewer agent
&lt;/h2&gt;

&lt;p&gt;The reviewer starts with nothing. It doesn't know why the PR exists or what the feature was supposed to cover, so it can't tell when the code wanders past the scope. It has no idea what you're building next month either, so it can't judge whether an abstraction will ever pay off.&lt;/p&gt;

&lt;p&gt;What bugs me most is how it handles over-engineering. Hand it a PR with a generic retry framework or a brand new caching layer and it assumes somebody had a good reason. It might suggest a rename or one more test. It almost never asks whether the thing should exist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1swcsbi1qboppi6khlp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1swcsbi1qboppi6khlp.gif" alt="Jeff Goldblum in Jurassic Park: your scientists were so preoccupied with whether or not they could, they never stopped to think if they should" width="245" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You end up with a review that looks thorough, full of small comments, and the extra code goes through untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do now
&lt;/h2&gt;

&lt;p&gt;I've been doing this for about a year, and it's how I catch most of the over-engineered code now. I still don't read most of the diff. I treat the reviewer like a witness: it reads the code, and I ask the questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ask what the PR does
&lt;/h3&gt;

&lt;p&gt;Fresh agent, and a prompt like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read this PR and give me a report on exactly what it changes. List:

- Database schema changes (new tables, columns, indexes, migrations)
- Scheduled job / cron / background worker changes
- A summary of every feature added or modified
- New external services, APIs, or third-party libraries
- New environment variables or config flags
- New public endpoints or interfaces
- Anything deleted or deprecated

Don't judge the code yet. Just tell me what it does.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line is there on purpose. I want the facts before any opinions. Left alone, it will happily jump straight to "Overall this is a clean, well-structured PR."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Find the vague parts
&lt;/h3&gt;

&lt;p&gt;The report is usually long and looks detailed. Read it slowly and you'll hit sentences like these (made up, but you'll recognize the type):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Adds a &lt;code&gt;sync_state&lt;/code&gt; table to support improved synchronization reliability."&lt;/p&gt;

&lt;p&gt;"Introduces a background job for periodic maintenance."&lt;/p&gt;

&lt;p&gt;"Adds &lt;code&gt;FEATURE_X_MODE&lt;/code&gt; to allow flexible configuration."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the agent can't say plainly why something exists, there's a decent chance nobody asked for it.&lt;/p&gt;

&lt;p&gt;One time I asked the implementer agent to "send a notice to the admin if a third-party service is down and returning error codes." It added two new tables to track Slack notification and email status. I never asked for either. I wanted a message. I got a data model.&lt;/p&gt;

&lt;p&gt;Agents love tables the way some people love storage bins. There is always room for one more.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Interrogate
&lt;/h3&gt;

&lt;p&gt;Now push on anything that doesn't make sense to you. Pull up a chair, point the desk lamp at it, and start asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Talk to me about this new table. Who asked for it? Because it wasn't me. Why can't the existing table handle this?"&lt;/li&gt;
&lt;li&gt;"This cron job. What does it do every night at 2 a.m.? We already have a service doing exactly that. Explain."&lt;/li&gt;
&lt;li&gt;"&lt;code&gt;FEATURE_X_MODE&lt;/code&gt;. Name one person who will ever set it to anything other than the default. I'll wait."&lt;/li&gt;
&lt;li&gt;"This new dependency showed up out of nowhere. What's it doing here? Something we already use can do this job. Convince me otherwise."&lt;/li&gt;
&lt;li&gt;"Walk me through it. An invalid input comes in. Where exactly does it get rejected? Which test proves it? Show me the line."&lt;/li&gt;
&lt;li&gt;"The feature was supposed to do X. That's it. So which parts of this PR were not part of X? Take your time."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be ready for "You're absolutely right!" on the first question. Keep going anyway. Agreeing with you is easy for it. Explaining why the table exists is the part that takes work.&lt;/p&gt;

&lt;p&gt;Then slide the evidence across the table, the stuff it couldn't have known:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We will only ever have one region. So tell me again why we need this abstraction."&lt;/p&gt;

&lt;p&gt;"We're going to plug in more external tools like this in the next phase. Does the current design make that easy?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpdxdf85d7ttkfe2aw4f.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpdxdf85d7ttkfe2aw4f.gif" alt="Jordan Peele in Key &amp;amp; Peele sweating nervously while trying to keep a straight face" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the point where the reviewer starts being useful. Once it knows the scope and the plan, it points at real problems, and the comments about variable names mostly go away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it works
&lt;/h2&gt;

&lt;p&gt;The agent can read 3,000 lines in a few seconds, but it has no idea what's supposed to be there. I can't read 3,000 lines for every PR, but I know what the feature is for and where the product is headed. The questions are where those two meet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuirqt593a2u97qgpxgl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuirqt593a2u97qgpxgl.gif" alt="Charlie from It's Always Sunny in front of the Pepe Silvia conspiracy board" width="480" height="304"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Me, a few questions in, finally understanding why there's a cron job.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By the end I have a pretty clear picture of what's going into the codebase, and I still haven't read most of the diff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short version
&lt;/h2&gt;

&lt;p&gt;Ask the agent what the PR changes, not whether it's good. Look for the vague answers. Push on every table, job, env var, and dependency you can't explain, and tell the agent what it doesn't know. Whatever nobody can justify gets cut. The agent will say you're absolutely right about that too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codereview</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Developers "Before" vs "Today"</title>
      <dc:creator>Lightman Miao</dc:creator>
      <pubDate>Thu, 22 Oct 2026 06:28:42 +0000</pubDate>
      <link>https://dev.to/lightman_miao_fcd6ce02a1c/developers-before-vs-today-303c</link>
      <guid>https://dev.to/lightman_miao_fcd6ce02a1c/developers-before-vs-today-303c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuhi0on9w6bmq9cc0uhy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuhi0on9w6bmq9cc0uhy.gif" alt="Developer " width="599" height="297"&gt;&lt;/a&gt;&lt;br&gt;
Before: one dev, one keyboard, and a hallway error logs full of NullPointerExceptions. You took them down one at a time, and every fix was earned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftjgnsdxxe0tmyb5mjev9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftjgnsdxxe0tmyb5mjev9.gif" alt="Developer " width="560" height="256"&gt;&lt;/a&gt;&lt;br&gt;
Today: we're strapped into a mech with unlimited firepower, and the swarm is still coming: hallucinations, context compaction, and an agent that apologizes and then makes the same mistake again.&lt;/p&gt;

&lt;p&gt;The bugs got smarter and so did the weapons, but we're still fighting.&lt;/p&gt;

&lt;p&gt;What's the enemy you miss least, and which one do you fight most now? 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
      <category>humor</category>
    </item>
  </channel>
</rss>
