<?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: John Nickell</title>
    <description>The latest articles on DEV Community by John Nickell (@johnnickell).</description>
    <link>https://dev.to/johnnickell</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%2F3991981%2F4661e06b-0374-4088-b591-c8c85e922d81.jpg</url>
      <title>DEV Community: John Nickell</title>
      <link>https://dev.to/johnnickell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johnnickell"/>
    <language>en</language>
    <item>
      <title>How to Understand a Codebase You Didn't Write</title>
      <dc:creator>John Nickell</dc:creator>
      <pubDate>Tue, 07 Jul 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/johnnickell/how-to-understand-a-codebase-you-didnt-write-aad</link>
      <guid>https://dev.to/johnnickell/how-to-understand-a-codebase-you-didnt-write-aad</guid>
      <description>&lt;p&gt;Think about how you find one word in a dictionary. You don't start at A and read every page. You open to the middle, decide which half your word's in, and throw the other half away. Then again, and again, until you're standing on top of it.&lt;/p&gt;

&lt;p&gt;Now apply that to an unfamiliar codebase. That's the whole idea, and it turns "I have no clue where to start" into about four good questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Advice Everyone Gives, and Why It's Wrong
&lt;/h2&gt;

&lt;p&gt;"Read the whole codebase before you touch anything." I've given that advice and I've taken it, and I think it's wrong.&lt;/p&gt;

&lt;p&gt;The intent behind it is fine. Nobody wants a new hire blundering into a critical path with zero context. But "read everything" isn't a method. It's a gesture. There are codebases I've worked in north of 200,000 lines. If I tried to read them front to back before touching anything, I'd still be reading.&lt;/p&gt;

&lt;p&gt;What the advice produces instead is a specific kind of shallow familiarity. You've seen most of the files. You couldn't explain what any single module does. That's not understanding. That's having scrolled.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dictionary Trick
&lt;/h2&gt;

&lt;p&gt;The method is the same bisection you'd use to find a word: ask what behavior you need to understand, then find where it enters the system. That's your first split. Everything off that path doesn't exist for now, not forever, just for now.&lt;/p&gt;

&lt;p&gt;Most of the time the entry point takes minutes to find. HTTP endpoints have routes. Queue consumers have message types. Scheduled jobs have names. Once you have it, follow the behavior. Stop when you hit something you can't trace. Ask why that thing exists. Stop again. You're narrowing the codebase one bisection at a time until you land on the module that owns the thing you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Seam
&lt;/h2&gt;

&lt;p&gt;What you're narrowing toward is the seam: the boundary where one module's responsibility ends and another's begins. A well-built system has these. You can follow a behavior all the way through one module, come out the other side, and know exactly what that module's job is and where it stops.&lt;/p&gt;

&lt;p&gt;This is not an argument for understanding less. Ignoring the parts of the system outside your seam isn't the same as shipping code you don't understand. It's how you get to the point where you can explain something. You own one thing completely and work outward from there. Every senior developer I've worked with does this instinctively. Nobody reads the whole repo on day one.&lt;/p&gt;

&lt;p&gt;You can hold one thing deeply or ten things shallowly. The ten things feel like coverage. The one thing is what actually makes you useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scar
&lt;/h2&gt;

&lt;p&gt;Here's the specific version, because none of this is theoretical. I got dropped into a project once with no documentation worth reading, and a git history where every commit message was "fix" or "update" or "final," then "final2." Ticket due Friday.&lt;/p&gt;

&lt;p&gt;For the first few hours I did what most people do: opened the file tree, started reading. By hour three I had a dozen tabs open and understood nothing I hadn't understood when I started. I'd seen files. I hadn't learned anything.&lt;/p&gt;

&lt;p&gt;The question that turned it around was almost embarrassingly obvious: what does this ticket actually touch? I found the entry point, an HTTP endpoint, and followed it. I stopped when I hit something I couldn't trace. I asked why it existed. I stopped again. Forty minutes later I had a solid model of one module and one clear flow through it. That was enough to start, and it was enough to finish. The rest of the codebase never revealed itself in those forty minutes. The part I needed did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Questions, Portable
&lt;/h2&gt;

&lt;p&gt;Write these on an index card:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Name the actual behavior, not the feature name or the ticket title. "A user cancels an order before it ships" is a behavior. "The cancellation flow" is a category.&lt;/li&gt;
&lt;li&gt;Find where it enters the system: a handler, a consumer, a job. Almost always fast.&lt;/li&gt;
&lt;li&gt;Follow what it changes. The state change tells you what the code actually owns.&lt;/li&gt;
&lt;li&gt;Name what it depends on to run, for this behavior specifically. That's your context boundary. Everything outside it is outside for a reason, even if the reason is "not today."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Tool That Shortens the Scar
&lt;/h2&gt;

&lt;p&gt;Remember the forty minutes I spent finding one HTTP endpoint in a codebase whose git history read like a confession? There's a tool that would have cut that closer to five.&lt;/p&gt;

&lt;p&gt;It's a Claude Code skill called Understand Anything. Install it once through the plugin marketplace, then from inside the project run /understand scoped to the folder you care about. Underneath, a multi-agent pipeline splits the work: tree-sitter handles the structural layer, Claude handles the semantic layer, and together they build a knowledge graph of every file, function, class, and dependency in that scope.&lt;/p&gt;

&lt;p&gt;What you get is a dashboard. Click a node, see what it connects to. Read a plain-English summary of what a file is for. Ask a direct question, "what calls into this aggregate?", and it answers from the graph instead of re-reading the source. There's a guided tour too, ordered by dependency, so you learn a module in the order that makes sense instead of whatever order the file tree lists it in.&lt;/p&gt;

&lt;p&gt;The piece I keep coming back to is the diff tool. Before you push, /understand-diff shows you what the graph says your change actually touches. That's a different question than what you think you're touching, and it's the kind of thing worth knowing before the PR goes out, not after.&lt;/p&gt;

&lt;p&gt;It's free and MIT licensed. Find it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Egonex-AI/Understand-Anything" rel="noopener noreferrer"&gt;https://github.com/Egonex-AI/Understand-Anything&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Line to Protect
&lt;/h2&gt;

&lt;p&gt;One thing I don't want to get lost in all of this: finding the right chunk and ignoring the rest is not the same as saying it's fine to ship code you don't understand. It's the opposite. The four questions are how you get to real understanding of one thing instead of a vague impression of everything.&lt;/p&gt;

&lt;p&gt;You don't have to understand everything. You have to understand the right thing, and you have to understand it cold.&lt;/p&gt;

&lt;p&gt;Watch the full episode for the visuals and the full walk-through of the method, plus the question I'm asking in the comments:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/dz4z-6sn6m8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The Thinking Engineer — one channel, one bet: AI can write the code now, but somebody still has to understand it. That somebody is the job that isn't going away.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Won't Make You a Better Developer</title>
      <dc:creator>John Nickell</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:35:00 +0000</pubDate>
      <link>https://dev.to/johnnickell/ai-wont-make-you-a-better-developer-495i</link>
      <guid>https://dev.to/johnnickell/ai-wont-make-you-a-better-developer-495i</guid>
      <description>&lt;p&gt;The AI tool doesn't know what good looks like. It knows what common looks like. If you're thinking clearly about the problem, it'll help you build the right thing fast. If you're not... it'll help you build the wrong thing fast. Same tool. The difference is you.&lt;/p&gt;

&lt;p&gt;That's the uncomfortable version. And it's the whole point of this post.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trap Is Comfortable
&lt;/h2&gt;

&lt;p&gt;You sit down with Claude Code, describe what you want, and twenty minutes later there's a working feature on your screen. It feels incredible. It feels like you just got better at your job.&lt;/p&gt;

&lt;p&gt;That feeling is the trap.&lt;/p&gt;

&lt;p&gt;Something did get better in that moment. It just wasn't you. Your output got better. Your speed went through the roof. But speed is not skill, and output is not understanding. You moved faster across ground you didn't actually learn.&lt;/p&gt;

&lt;p&gt;It's the difference between driving to the top of a mountain and climbing it. You get the same view in the photo. Only one of you can find the way back in the dark.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gap These Tools Hide
&lt;/h2&gt;

&lt;p&gt;There's an idea from Ira Glass — he calls it the gap. When you start out, your taste is good before your skill is. You can tell that your own work isn't as good as the thing you admire, and that gap, that frustration, is what pulls you forward. You close it by doing the work, over and over, badly, until one day it isn't bad anymore.&lt;/p&gt;

&lt;p&gt;Now look at what AI does to that picture. It doesn't close the gap. It hides it. It produces work at a level your taste can recognize as decent — but your hands could never have reached on their own. So the frustration that used to drive you disappears, and the daily reps that used to close the gap... you just stop doing them.&lt;/p&gt;

&lt;p&gt;The output looks like a senior wrote it. You did not become a senior. And the thing that would have made you one is the exact thing you skipped.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Teacher You Fired
&lt;/h2&gt;

&lt;p&gt;Most of my education came from my own mistakes. Fifteen years in, almost everything I actually know, I know because I broke it first. I wrote the slow query that took the site down. I built the abstraction that everyone hated. I shipped the bug, traced it for two days, and finally understood the thing I thought I'd already understood.&lt;/p&gt;

&lt;p&gt;The struggle wasn't in the way of the learning. The struggle &lt;em&gt;was&lt;/em&gt; the learning.&lt;/p&gt;

&lt;p&gt;When the AI removes the friction, it doesn't just save you time. It quietly removes the teacher. The hard part — the part where you sit there confused and have to build the model in your own head before the code will work — that part is doing something to you. Skip it every time, and yeah, you'll ship faster this quarter. But the version of you that could have handled the gnarly problem two years from now never gets built.&lt;/p&gt;

&lt;p&gt;You optimized away your own apprenticeship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Is Not Good
&lt;/h2&gt;

&lt;p&gt;Back to that first line, because it's the load-bearing one.&lt;/p&gt;

&lt;p&gt;The model knows what common looks like. Not what good looks like. Common is genuinely useful — the most common way to do a thing is usually fine, often even right, and getting "fine" in twenty seconds is a real gift. I use it every day.&lt;/p&gt;

&lt;p&gt;But picture what the model actually is. It read a planet's worth of code and learned the average of it. When you ask it for something, it hands you back the middle of the distribution. The median answer.&lt;/p&gt;

&lt;p&gt;Good code — the code you actually admire — almost never lives in the middle. It's a deviation. It's somebody who understood this specific domain well enough to do the uncommon thing on purpose, because the common thing was wrong &lt;em&gt;here&lt;/em&gt;. The model can't make that call. It doesn't know your domain. It's pulling toward the average while the whole point of expertise is knowing exactly when to leave it.&lt;/p&gt;

&lt;p&gt;If you can't tell common from good, you will ship common forever, and you'll think it's good, because it compiles and the tests pass and it looks like everything else you've ever seen.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Are the Variable
&lt;/h2&gt;

&lt;p&gt;So if the tool won't make you better, what will?&lt;/p&gt;

&lt;p&gt;Two things. Same two things the good developers were already doing before any of this showed up.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;understanding over producing.&lt;/strong&gt; Stop measuring yourself by how much you shipped and start measuring yourself by how much of it you could explain, out loud, to a skeptical room. Read the code the AI gives you like you're going to be quizzed on it — because someday you will be, probably at two in the morning. Trace why it made the choices it made. Use the tool to go fast on the things you already understand cold, and force yourself to do the hard part by hand on the things you're still learning. That's not nostalgia. That's just keeping the teacher employed.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;thinking clearly before you open the chat window.&lt;/strong&gt; Domain-Driven Design, Clean Architecture, the SOLID principles — I think of all of it less as a set of rules and more as a way of getting honest about the problem before you let the machine run at it. Because an amplifier makes whatever you feed it louder, and it does not care whether what you fed it was any good. Feed it muddy thinking and you get a beautiful, fast, well-tested mess. Feed it a clean model of the problem, in the language the business actually uses, and the same tool is suddenly building exactly the right thing.&lt;/p&gt;

&lt;p&gt;Same tool. You're the variable. You were always the variable.&lt;/p&gt;




&lt;p&gt;Watch the full episode — visuals, the specific framework I use before starting any AI session, and the question I'm asking in the comments:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/xULheo8ijGM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Thinking Engineer — one channel, one bet: AI can write the code now, but somebody still has to understand it. That somebody is the job that isn't going away.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Nobody Understands Your AI Written Code</title>
      <dc:creator>John Nickell</dc:creator>
      <pubDate>Tue, 23 Jun 2026 13:35:00 +0000</pubDate>
      <link>https://dev.to/johnnickell/nobody-understands-your-ai-written-code-232</link>
      <guid>https://dev.to/johnnickell/nobody-understands-your-ai-written-code-232</guid>
      <description>&lt;p&gt;Picture Dave. Not a bad developer. Six years in, reasonably curious, catches most of the things that matter. Last Tuesday, Dave asked an AI to scaffold a feature. The AI wrote 340 lines in about four minutes. The code passed review. The tests passed. The feature shipped Friday.&lt;/p&gt;

&lt;p&gt;The following Monday, the feature had a bug. Dave opened the file and stared at it for eleven minutes before typing a question back into the chat window.&lt;/p&gt;

&lt;p&gt;That's the episode I made. Not about Dave specifically... Dave's a composite. But if you've been on a development team in the last two years, you've met Dave. Maybe you've been Dave.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/DybDfSCbX5I"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Nobody's Tracking
&lt;/h2&gt;

&lt;p&gt;There's a metric your team dashboard probably doesn't have: how long does it take a developer to answer a question about code they shipped?&lt;/p&gt;

&lt;p&gt;Cycle time. PR count. Lines changed. Test coverage. Nobody's logging the eleven minutes. Nobody's logging it when "what does this do?" becomes "I'll ask the AI."&lt;/p&gt;

&lt;p&gt;That's the hidden cost. Not the bugs. The bugs are findable. The cost is that finding them now requires a conversation with a prediction engine instead of a person who actually understands the system.&lt;/p&gt;

&lt;p&gt;That compounds quietly. And then one day a senior developer leaves, and the AI doesn't remember what it meant when it wrote the thing, and neither does anyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Bottleneck Went
&lt;/h2&gt;

&lt;p&gt;For most of software's history, the bottleneck was producing code. Senior developers were expensive, good ones were rare, and getting software out the door was genuinely hard.&lt;/p&gt;

&lt;p&gt;That bottleneck is basically gone.&lt;/p&gt;

&lt;p&gt;Claude Code can build a working feature in the time it takes you to make a pot of coffee. Junior developers can ship code that would have taken a senior developer two days. That's real, and it's not going away.&lt;/p&gt;

&lt;p&gt;The new bottleneck is understanding what was produced. And the irony is that we've mostly just accepted it. The code ships, the feature works, and whether anyone on the team could reconstruct the reasoning behind it is a question we've stopped asking.&lt;/p&gt;

&lt;p&gt;I think that's a problem that compounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why DDD Isn't Overhead Anymore
&lt;/h2&gt;

&lt;p&gt;I've spent years defending Domain-Driven Design against the "it's too much code" argument. That argument made some sense when every line was hand-written. It makes almost no sense now that the cost of writing a clean domain model is largely free.&lt;/p&gt;

&lt;p&gt;DDD, Clean Architecture, Hexagonal Architecture. None of these were invented to make your codebase look impressive. They were invented to make complex systems understandable. To put the language of the business inside the code. To give future developers (and future you) a map.&lt;/p&gt;

&lt;p&gt;When AI is writing the code, that map becomes more important, not less. The AI will write whatever you tell it to write. Give it a clean direction with clearly named concepts that match your domain, and you end up with code a person can actually read. Give it vague instructions inside a vague architecture, and you end up with 340 lines of passing tests that nobody can explain.&lt;/p&gt;

&lt;p&gt;I've seen both outcomes. The difference isn't the AI. The difference is whether the developer understood the domain before writing the prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five-Minute Habit
&lt;/h2&gt;

&lt;p&gt;I cover this in the episode, and I won't give the whole thing away here, but the short version is this: before you prompt, write down what you're building and why. Not a ticket description, not a feature name. The actual intent. What domain concept is this touching? What is the expected behavior in business terms? What would make you confident this is correct?&lt;/p&gt;

&lt;p&gt;Five minutes of that changes the code the AI produces. Significantly.&lt;/p&gt;

&lt;p&gt;It also changes what happens when something breaks. Because the intent is written down, the debugging conversation is between you and the domain... not between you and an AI trying to guess what was meant.&lt;/p&gt;

&lt;p&gt;That's staying in control of what you're building. In a year when the tooling can write faster than most of us can think, that habit is the job.&lt;/p&gt;

&lt;p&gt;There's more in the episode. The hidden cost argument gets a fuller treatment there, and I talk through a specific exercise you can start on Monday morning.&lt;/p&gt;

&lt;p&gt;I read every comment. Drop your war story below: the bug nobody could trace, the service nobody could explain. Those are worth hearing.&lt;/p&gt;

&lt;p&gt;John Nickell — &lt;a href="https://youtube.com/@thethinkingeng" rel="noopener noreferrer"&gt;The Thinking Engineer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ddd</category>
      <category>cleanarchitecture</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
