<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>Chemaclass - software-architecture</title><subtitle>Tech Lead sharing practical insights on software craftsmanship, TDD, leadership, Bitcoin, and AI. Blog posts, book summaries, and conference talks.</subtitle><link rel="self" type="application/atom+xml" href="https://chemaclass.com/tags/software-architecture/atom.xml"/><link rel="alternate" type="text/html" href="https://chemaclass.com"/><generator uri="https://www.getzola.org/">Zola</generator><updated>2026-01-11T00:00:00+00:00</updated><id>https://chemaclass.com/tags/software-architecture/atom.xml</id><entry xml:lang="en"><title>MCP: Giving Your AI Agent the Right Context</title><subtitle>Why context is the real superpower</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software-architecture" scheme="https://chemaclass.com/tags/software-architecture/" label="Software Architecture"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><published>2026-01-11T00:00:00+00:00</published><updated>2026-01-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/"/><id>https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/</id><summary type="html">MCP connects AI agents to your dev tools, databases, and APIs through a standard protocol. Give your agent the context it actually needs.</summary><content type="html">&lt;p>Modern AI coding assistants are remarkably good at understanding context. Models like Claude Opus with large context windows (~200k tokens) can hold substantial portions of your codebase in mind, reason about architecture, and maintain coherence across long conversations. Not the entire project for large codebases, but enough to work effectively.&lt;/p>
&lt;p>But understanding isn’t the same as access.&lt;/p>
&lt;p>The AI can reason about your database schema if you paste it. It can suggest changes to files you share. It knows patterns from code you show it. The limitation isn’t intelligence. It’s reach.&lt;/p>
&lt;p>That’s where MCP comes in.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-mcp-enables">What MCP enables
&lt;a class="heading-anchor" href="#what-mcp-enables" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Modern AI can understand your codebase when you share it. But understanding and acting are different things.&lt;/p>
&lt;p>Many IDE-integrated assistants like VS Code Copilot or Cursor already access your project files through their own indexing. So file access itself isn’t new. What MCP brings is standardization. Instead of each tool building its own integration, MCP provides a common protocol. You configure a server once, and any MCP-compatible client can use it. It’s portable, configurable, and extends beyond just files to databases, APIs, and custom tools.&lt;/p>
&lt;blockquote>
&lt;p>MCP turns AI from a conversation partner into an active participant in your development environment.&lt;/p>
&lt;/blockquote>
&lt;p>With MCP, you give the AI direct access to tools and resources. It can read files, run commands, query databases, fetch documentation. The intelligence was always there. MCP gives it hands.&lt;/p>
&lt;h2 id="what-mcp-actually-is">What MCP actually is
&lt;a class="heading-anchor" href="#what-mcp-actually-is" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>MCP is a protocol, not a product. It’s an open standard that defines how AI agents can connect to external data sources and tools. Think of it as a bridge between the AI model and your development environment.&lt;/p>
&lt;p>The architecture is simple: MCP servers expose capabilities, and AI clients consume them. Claude Desktop and Claude Code officially support MCP, with more tools adopting the protocol as it matures.&lt;/p>
&lt;p>For example, in Claude Code you can add servers to a &lt;code>.mcp.json&lt;/code> file at your project root. Claude Code reads this file when you open the project and starts the configured servers automatically:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">mcpServers&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">filesystem&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-filesystem&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">./&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">github&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-github&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">GITHUB_TOKEN&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">your-token&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">postgres&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-postgres&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">DATABASE_URL&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">postgresql://localhost/mydb&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Each server gives the AI different capabilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>filesystem&lt;/strong>: Read and navigate your project files. The AI can explore your codebase, check existing patterns, and understand your directory structure before suggesting changes.&lt;/li>
&lt;li>&lt;strong>github&lt;/strong>: Access issues, pull requests, and repository metadata. Ask the AI to summarize open issues, check PR comments, or understand what your team is working on.&lt;/li>
&lt;li>&lt;strong>postgres&lt;/strong>: Query your database directly. The AI can inspect your schema, run read queries, and understand your data model without you copying table definitions.&lt;/li>
&lt;/ul>
&lt;p>Different tools, same protocol. You configure once, and any MCP-compatible client can use these servers.&lt;/p>
&lt;h2 id="where-mcp-shines">Where MCP shines
&lt;a class="heading-anchor" href="#where-mcp-shines" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;h3 id="working-with-your-codebase">Working with your codebase
&lt;a class="heading-anchor" href="#working-with-your-codebase" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The most immediate benefit is filesystem access. The AI can navigate your project, read source files, understand your directory structure. When it suggests code, it can check existing patterns first.&lt;/p>
&lt;p>Git integration takes this further. The AI can see your commit history, understand what changed recently, and suggest modifications that align with how your codebase evolves.&lt;/p>
&lt;p>Database schema access means the AI understands your data model. No more explaining table relationships or column types. It sees the structure and generates queries that actually work.&lt;/p>
&lt;h3 id="documentation-and-knowledge">Documentation and knowledge
&lt;a class="heading-anchor" href="#documentation-and-knowledge" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Connect your internal documentation and the AI becomes aware of your team’s decisions. API specifications, architecture documents, coding guidelines. All available as context.&lt;/p>
&lt;p>This is where MCP starts feeling different. The AI isn’t just generating generic code anymore. It’s generating code that fits your project.&lt;/p>
&lt;blockquote>
&lt;p>The best AI assistance comes from understanding not just what you’re building, but how your team builds it.&lt;/p>
&lt;/blockquote>
&lt;h3 id="external-integrations">External integrations
&lt;a class="heading-anchor" href="#external-integrations" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>GitHub integration means the AI can read issues, understand PR discussions, and see the broader context of what your team is working on. Slack or other communication tools can provide even more context about ongoing decisions.&lt;/p>
&lt;p>Custom integrations let you connect internal tools specific to your workflow. The protocol is extensible by design.&lt;/p>
&lt;h2 id="using-mcp-effectively">Using MCP effectively
&lt;a class="heading-anchor" href="#using-mcp-effectively" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>MCP amplifies whatever it connects to. If your documentation is outdated, the AI will use outdated information. If your codebase is messy, the AI will learn messy patterns.&lt;/p>
&lt;p>This is the mirror effect I mentioned in &lt;a href="/blog/ai-gives-you-speed-not-quality">AI gives you speed, not quality&lt;/a>. The AI reflects the context you give it. Good context produces useful output. Bad context produces confident-sounding garbage.&lt;/p>
&lt;blockquote>
&lt;p>Giving AI access to your codebase doesn’t replace your responsibility to maintain it. It makes good hygiene more valuable.&lt;/p>
&lt;/blockquote>
&lt;p>A few practices that help:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Connect only what the AI needs.&lt;/strong> More context isn’t always better. Focused context is better.&lt;/li>
&lt;li>&lt;strong>Keep your documentation current.&lt;/strong> If the AI reads your docs, those docs matter more than before.&lt;/li>
&lt;li>&lt;strong>Review your MCP configuration periodically.&lt;/strong> As your project evolves, so should your context setup.&lt;/li>
&lt;li>&lt;strong>Start small.&lt;/strong> One or two servers. See what works. Expand from there.&lt;/li>
&lt;/ul>
&lt;p>Security matters too. Be intentional about what you expose. MCP servers can access sensitive information. Treat them like any other access control decision.&lt;/p>
&lt;h2 id="what-comes-next">What comes next
&lt;a class="heading-anchor" href="#what-comes-next" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>MCP is the foundation. But the ecosystem is building on top of it.&lt;/p>
&lt;p>&lt;strong>Agentic workflows.&lt;/strong> Tools like Claude Code and Cursor now run in “agent mode” where the AI autonomously plans and executes multi-step tasks. It reads files, makes changes, runs tests, fixes errors. MCP servers are the hands. The agent loop is the brain deciding what to do next.&lt;/p>
&lt;p>&lt;strong>Skills and custom commands.&lt;/strong> Claude Code introduced skills. Custom slash commands that chain MCP tools into reusable workflows. &lt;code>/deploy&lt;/code>, &lt;code>/test&lt;/code>, &lt;code>/review&lt;/code>. You define them once, and they become part of your development toolkit.&lt;/p>
&lt;p>&lt;strong>A2A Protocol.&lt;/strong> Google’s Agent-to-Agent protocol. While MCP connects AI to tools, A2A connects AI agents to each other. Multiple specialized agents collaborating on complex tasks. One agent writes code, another reviews it, a third runs tests.&lt;/p>
&lt;p>The pattern is clear: AI is moving from assistant to collaborator. From answering questions to executing workflows. MCP gave AI access to your environment. What’s next is AI that knows how to use that access autonomously.&lt;/p>
&lt;blockquote>
&lt;p>The question is shifting from “what can AI access?” to “what should AI decide on its own?”&lt;/p>
&lt;/blockquote>
&lt;p>Human judgment doesn’t disappear. It moves upstream. Instead of reviewing every line the AI writes, we design the context and boundaries that shape what it produces.&lt;/p>
&lt;p>That’s still our job. And it’s a job worth doing well.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-01-11/footer.webp" alt="mcp connecting ai to tools" />&lt;/p></content></entry><entry xml:lang="en"><title>AI Gives You Speed, Not Quality</title><subtitle>The human factor in the age of vibe-coding</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software-architecture" scheme="https://chemaclass.com/tags/software-architecture/" label="Software Architecture"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2025-10-10T00:00:00+00:00</published><updated>2025-10-10T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/ai-gives-you-speed-not-quality/"/><id>https://chemaclass.com/blog/ai-gives-you-speed-not-quality/</id><summary type="html">AI accelerates your output but doesn't ensure quality. You're responsible for every line you commit. Speed without direction is chaos.</summary><content type="html">&lt;p>I’ve been using AI coding assistants extensively: ChatGPT, Codex, Claude with Sonnet and Opus. They’re incredibly helpful. They give you speed like nothing else.&lt;/p>
&lt;p>But speed isn’t quality.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-vibe-coding-trap">The vibe-coding trap
&lt;a class="heading-anchor" href="#the-vibe-coding-trap" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>AI models are excellent at imitating their surroundings. Give them context, and they’ll do whatever it takes to complete the task. This has become known as &lt;em>“vibe-coding”&lt;/em>: you describe what you want, and the AI produces something that works. Fast.&lt;/p>
&lt;p>The problem? AI will happily generate messy code if that’s what gets the job done. It doesn’t care about maintainability. It doesn’t think about what happens when requirements change next month. It just produces output.&lt;/p>
&lt;blockquote>
&lt;p>AI is a mirror that reflects the context you give it. If your codebase is messy, it will generate more mess. If your prompts are vague, it will make assumptions.&lt;/p>
&lt;/blockquote>
&lt;p>Without careful guidance, you end up with patches on top of patches. Freshly created legacy code. A codebase where every change feels risky and the team spends more time fighting the code than building features.&lt;/p>
&lt;h2 id="the-art-of-asking">The art of asking
&lt;a class="heading-anchor" href="#the-art-of-asking" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Remember Stack Overflow? Google searches that led you to forum threads from 2011 where someone had the exact same problem?&lt;/p>
&lt;p>Ten years ago, being a developer meant learning how to ask good questions. You’d craft your Stack Overflow post carefully: describe the problem, show what you tried, explain what you expected versus what happened. If your question was vague or lazy, the community would let you know. Sometimes harshly.&lt;/p>
&lt;p>But that friction taught us something valuable: &lt;strong>the quality of your answer depends on the quality of your question&lt;/strong>.&lt;/p>
&lt;p>The same principle applies to AI. A vague prompt gets a vague response. A well-structured prompt with clear context, constraints, and examples gets something useful. The skill of formulating good questions didn’t become obsolete. It became more important.&lt;/p>
&lt;blockquote>
&lt;p>Learning to prompt AI effectively is the modern equivalent of learning to search Google and ask Stack Overflow. The developers who master this will get better results.&lt;/p>
&lt;/blockquote>
&lt;p>Even when AI gives you a fast, impressive-looking answer, &lt;strong>never accept code you don’t fully understand&lt;/strong>. It’s tempting. The response appears in seconds, it looks professional, it might even work. But if you can’t explain what it does and why, you’re planting a time bomb in your codebase. And when it breaks at 2am, you’ll be debugging code you didn’t write with no mental model of why it exists.&lt;/p>
&lt;p>Challenge the output. Ask: &lt;em>“Can you simplify this?”&lt;/em> or &lt;em>“Is there boilerplate here we can remove?”&lt;/em> AI’s default is to add, not to improve. It will generate abstractions, helper functions, and patterns you didn’t ask for. It won’t refactor unless you tell it to. Push back.&lt;/p>
&lt;p>This is especially critical with tests. Ask AI to generate tests and you’ll often get tests that mirror implementation details rather than behavior. They’ll break the moment you refactor, even if the logic stays the same. If you want tests that verify behavior, you need to explicitly say so. AI won’t make that choice for you.&lt;/p>
&lt;blockquote>
&lt;p>Don’t be seduced by speed. Sometimes, a fast answer you don’t understand is worse than a slow answer you do.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-human-factor">The human factor
&lt;a class="heading-anchor" href="#the-human-factor" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>AI can write code fast, but it can’t understand overall architecture. It doesn’t know why certain decisions were made months ago. It can’t see the bigger picture of where the product is heading. It only sees what you show it, making local decisions without understanding global implications. That’s our job.&lt;/p>
&lt;p>As I explored in &lt;a href="/blog/different-beliefs-about-software-quality">different beliefs about software quality&lt;/a>, teams often have varying standards for what &lt;em>“good enough”&lt;/em> means. When you add AI to the mix, maintaining that shared understanding becomes even more critical. The AI doesn’t share your team’s values. It just generates code.&lt;/p>
&lt;blockquote>
&lt;p>The discipline to maintain clean architecture, to say &lt;em>“no”&lt;/em> to quick hacks, to refactor before things get worse. That’s uniquely human.&lt;/p>
&lt;/blockquote>
&lt;p>Books like &lt;a href="/readings/clean-code/">Clean Code&lt;/a> and &lt;a href="/readings/clean-architecture/">Clean Architecture&lt;/a> aren’t less relevant in the AI age. They’re more relevant. They help you spot when AI is heading in the wrong direction.&lt;/p>
&lt;h2 id="collaboration-over-automation">Collaboration over automation
&lt;a class="heading-anchor" href="#collaboration-over-automation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>There’s something else AI can’t replace: the team.&lt;/p>
&lt;p>A conversation with a colleague about &lt;em>“should we extract this into a service?”&lt;/em> often leads to insights that no AI prompt would surface. That back-and-forth, the pushback, the &lt;em>“what if we tried this instead”&lt;/em>. That’s where real understanding happens.&lt;/p>
&lt;p>&lt;a href="/readings/extreme-programming-explained/">Extreme Programming Explained&lt;/a> emphasizes practices like pair programming and collective code ownership for good reason. These aren’t inefficiencies to be automated away. They’re how teams build quality into their process.&lt;/p>
&lt;p>When you skip the human discussion and just let AI generate solutions, you lose the opportunity to learn, to challenge assumptions, and to grow as a team.&lt;/p>
&lt;h2 id="you-own-the-code">You own the code
&lt;a class="heading-anchor" href="#you-own-the-code" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>When AI writes code and you commit it, review it, approve it, merge it, and deploy it, &lt;strong>it’s your code&lt;/strong>. You can’t blame the AI when something breaks in production. You can’t point at Claude or Copilot when the architecture becomes unmaintainable.&lt;/p>
&lt;p>As I wrote about &lt;a href="/blog/the-art-of-testing/">the art of testing&lt;/a>, quality is a choice we make at every step. Every commit is a decision. Every review is an opportunity to catch problems. Every merge is an endorsement of the code’s quality.&lt;/p>
&lt;blockquote>
&lt;p>We are the ultimate responsible party for the code AI writes. The commit, the review, the approval, the merge, the deploy. That’s all us.&lt;/p>
&lt;/blockquote>
&lt;p>Moving fast in the wrong direction just gets you lost faster. Lines of code appearing on screen isn’t progress. The value we bring as developers isn’t typing speed. Our value is in understanding where we’re going, maintaining discipline over chaos, and ensuring that the code we ship today doesn’t become tomorrow’s nightmare.&lt;/p>
&lt;p>Use AI. Embrace the speed. But never forget: &lt;strong>you’re the one steering&lt;/strong>. If you let go of the wheel, you’ll end up in a pile of unmaintainable code faster than you expected.&lt;/p>
&lt;p>And when that happens, there’s no one else to blame.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-10-10/footer.webp" alt="you are the one steering" />&lt;/p></content></entry></feed>