<?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: Piyush Atghara</title>
    <description>The latest articles on DEV Community by Piyush Atghara (@piyushatghara).</description>
    <link>https://dev.to/piyushatghara</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%2F3416381%2Fa6c13798-1112-42fd-8be5-75468edb561d.png</url>
      <title>DEV Community: Piyush Atghara</title>
      <link>https://dev.to/piyushatghara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/piyushatghara"/>
    <language>en</language>
    <item>
      <title>AI Coding Changed the Bottleneck. It Isn't Writing Code Anymore.</title>
      <dc:creator>Piyush Atghara</dc:creator>
      <pubDate>Fri, 02 Oct 2026 04:56:00 +0000</pubDate>
      <link>https://dev.to/piyushatghara/ai-coding-changed-the-bottleneck-it-isnt-writing-code-anymore-4o</link>
      <guid>https://dev.to/piyushatghara/ai-coding-changed-the-bottleneck-it-isnt-writing-code-anymore-4o</guid>
      <description>&lt;p&gt;A few years ago, when we talked about AI-assisted programming, the workflow was fairly simple.&lt;/p&gt;

&lt;p&gt;Open your editor.&lt;/p&gt;

&lt;p&gt;Write some code.&lt;/p&gt;

&lt;p&gt;Ask the AI to complete it.&lt;/p&gt;

&lt;p&gt;Accept the suggestion.&lt;/p&gt;

&lt;p&gt;Maybe ask it to write a test.&lt;/p&gt;

&lt;p&gt;That model is changing.&lt;/p&gt;

&lt;p&gt;Today's coding agents can inspect a repository, understand relationships between files, run commands, modify multiple files, execute tests, investigate failures, and continue working based on the results.&lt;/p&gt;

&lt;p&gt;The interesting problem is no longer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can AI write this code?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Increasingly, the problem is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Does the AI have enough context to write the &lt;em&gt;right&lt;/em&gt; code?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;And it has led us to think about AI-assisted development less as a prompting problem and more as a &lt;strong&gt;harness engineering problem&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bottleneck moved
&lt;/h2&gt;

&lt;p&gt;Consider a fairly ordinary backend task.&lt;/p&gt;

&lt;p&gt;You receive a Jira ticket:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add support for a new API parameter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A human engineer doesn't immediately start typing.&lt;/p&gt;

&lt;p&gt;They usually do something like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understand the requirement.&lt;/li&gt;
&lt;li&gt;Find the relevant service.&lt;/li&gt;
&lt;li&gt;Understand the architecture.&lt;/li&gt;
&lt;li&gt;Find similar implementations.&lt;/li&gt;
&lt;li&gt;Check API conventions.&lt;/li&gt;
&lt;li&gt;Understand validation rules.&lt;/li&gt;
&lt;li&gt;Look at existing tests.&lt;/li&gt;
&lt;li&gt;Implement the change.&lt;/li&gt;
&lt;li&gt;Run tests.&lt;/li&gt;
&lt;li&gt;Review the resulting diff.&lt;/li&gt;
&lt;li&gt;Fix anything that doesn't fit the existing system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A capable coding agent can perform many of these steps.&lt;/p&gt;

&lt;p&gt;But there is a catch.&lt;/p&gt;

&lt;p&gt;The agent doesn't automatically know all the things that an experienced engineer has accumulated through months of working on the project.&lt;/p&gt;

&lt;p&gt;It may not know that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a particular module should never be modified directly&lt;/li&gt;
&lt;li&gt;a certain abstraction exists for a reason&lt;/li&gt;
&lt;li&gt;the project prefers one library over another&lt;/li&gt;
&lt;li&gt;a particular test pattern is mandatory&lt;/li&gt;
&lt;li&gt;an API must remain backwards compatible&lt;/li&gt;
&lt;li&gt;a seemingly redundant validation step is intentional&lt;/li&gt;
&lt;li&gt;a Jira description doesn't capture an important implementation constraint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;strong&gt;context engineering&lt;/strong&gt; becomes important.&lt;/p&gt;




&lt;h2&gt;
  
  
  From prompts to a coding harness
&lt;/h2&gt;

&lt;p&gt;Instead of giving an AI agent a giant prompt every time we start a task, we can make the repository itself provide much of the context.&lt;/p&gt;

&lt;p&gt;Think of the repository as having a layer specifically designed for AI-assisted development.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repository/
│
├── AGENTS.md
├── CLAUDE.md
├── .github/
│   └── copilot-instructions.md
│
├── specs/
│   ├── JIRA-1234.md
│   ├── JIRA-1278.md
│   └── JIRA-1302.md
│
├── src/
├── tests/
├── scripts/
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact filenames aren't important.&lt;/p&gt;

&lt;p&gt;The important idea is that &lt;strong&gt;the agent has access to the same engineering context that a human engineer would need.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern coding tools increasingly support this pattern. GitHub's current documentation supports repository-wide instructions through &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;, path-specific instructions, and agent instructions such as &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code similarly uses &lt;code&gt;CLAUDE.md&lt;/code&gt; as project-level context that is automatically read when working in the repository.&lt;/p&gt;

&lt;p&gt;So these files aren't just documentation.&lt;/p&gt;

&lt;p&gt;They can become part of the &lt;strong&gt;development interface between the codebase and the coding agent.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. AGENTS.md / CLAUDE.md: teach the agent how the repository works
&lt;/h2&gt;

&lt;p&gt;The first layer is project-level instructions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Instructions&lt;/span&gt;

&lt;span class="gu"&gt;## Architecture&lt;/span&gt;

This repository contains:
&lt;span class="p"&gt;-&lt;/span&gt; API service
&lt;span class="p"&gt;-&lt;/span&gt; Business logic layer
&lt;span class="p"&gt;-&lt;/span&gt; Data access layer
&lt;span class="p"&gt;-&lt;/span&gt; Background workers

Do not put business logic inside API handlers.

&lt;span class="gu"&gt;## Python&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Python 3.12
&lt;span class="p"&gt;-&lt;/span&gt; Use async APIs where the surrounding code is async
&lt;span class="p"&gt;-&lt;/span&gt; Use existing project dependencies before introducing new ones

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Every new behaviour requires tests
&lt;span class="p"&gt;-&lt;/span&gt; Run pytest before considering a task complete
&lt;span class="p"&gt;-&lt;/span&gt; Do not modify existing tests simply to make a new implementation pass

&lt;span class="gu"&gt;## API changes&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Maintain backwards compatibility
&lt;span class="p"&gt;-&lt;/span&gt; Follow existing response and error formats

&lt;span class="gu"&gt;## Before finishing&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Run relevant tests
&lt;span class="p"&gt;-&lt;/span&gt; Review the git diff
&lt;span class="p"&gt;-&lt;/span&gt; Do not modify unrelated files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what isn't particularly useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Write clean code.
Follow best practices.
Use good naming.
Write maintainable software.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An AI agent already knows these phrases.&lt;/p&gt;

&lt;p&gt;The useful information is the stuff it &lt;strong&gt;cannot reliably infer from the code alone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This service uses X for authentication because Y depends on it. Do not replace it with Z."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's valuable.&lt;/p&gt;

&lt;p&gt;VS Code's current guidance makes essentially the same point: project instructions are most useful when they document decisions an agent cannot reliably infer from the codebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Don't turn the instruction file into a novel
&lt;/h2&gt;

&lt;p&gt;There's a temptation to keep adding everything to &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That can become counterproductive.&lt;/p&gt;

&lt;p&gt;A good instruction file should answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What does an engineer need to know before touching this repository?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can we document the entire repository in one Markdown file?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keep stable, high-value information there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;conventions&lt;/li&gt;
&lt;li&gt;commands&lt;/li&gt;
&lt;li&gt;important constraints&lt;/li&gt;
&lt;li&gt;testing requirements&lt;/li&gt;
&lt;li&gt;things that frequently go wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put task-specific information somewhere else.&lt;/p&gt;

&lt;p&gt;That's where &lt;code&gt;specs/&lt;/code&gt; becomes useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Turn Jira tickets into machine-readable context
&lt;/h2&gt;

&lt;p&gt;One of the biggest problems with AI coding is that the prompt often contains too little information.&lt;/p&gt;

&lt;p&gt;A Jira ticket might contain the actual requirement, but the agent doesn't necessarily have convenient access to the entire ticket conversation, linked issues, acceptance criteria, or decisions made during refinement.&lt;/p&gt;

&lt;p&gt;One approach is to maintain a Markdown representation of the relevant specification.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;specs/
├── JIRA-1234.md
├── JIRA-1235.md
└── JIRA-1236.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A specification might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# JIRA-1234&lt;/span&gt;

&lt;span class="gu"&gt;## Summary&lt;/span&gt;

Add support for X to the Voice Gateway.

&lt;span class="gu"&gt;## Requirements&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Accept X through the websocket API
&lt;span class="p"&gt;-&lt;/span&gt; Preserve existing clients
&lt;span class="p"&gt;-&lt;/span&gt; X must be optional
&lt;span class="p"&gt;-&lt;/span&gt; Default behaviour must remain unchanged

&lt;span class="gu"&gt;## Acceptance Criteria&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Existing requests continue to work
&lt;span class="p"&gt;-&lt;/span&gt; New requests support X
&lt;span class="p"&gt;-&lt;/span&gt; Invalid X values return the existing validation error
&lt;span class="p"&gt;-&lt;/span&gt; Unit tests cover both paths

&lt;span class="gu"&gt;## Technical Notes&lt;/span&gt;

The downstream NLU service already supports X.

Do not modify the NLU integration.

&lt;span class="gu"&gt;## References&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; JIRA: JIRA-1234
&lt;span class="p"&gt;-&lt;/span&gt; Related: JIRA-1189
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the agent isn't starting with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Implement JIRA-1234."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It starts with an actual specification.&lt;/p&gt;

&lt;p&gt;That's a huge difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Context should be layered
&lt;/h2&gt;

&lt;p&gt;One of the mistakes I see with AI-assisted development is treating context as one enormous prompt.&lt;/p&gt;

&lt;p&gt;I'd rather think of it as layers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌──────────────────────┐
                 │       Task Spec      │
                 │       specs/*.md     │
                 └──────────┬───────────┘
                            │
                 ┌──────────▼───────────┐
                 │   Project Context    │
                 │ AGENTS.md / CLAUDE.md│
                 └──────────┬───────────┘
                            │
                 ┌──────────▼───────────┐
                 │     Codebase         │
                 │ source + tests       │
                 └──────────┬───────────┘
                            │
                 ┌──────────▼───────────┐
                 │   Agent + Tools      │
                 │ shell / git / tests  │
                 └──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer answers a different question.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project instructions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How should I work?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Specification
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What am I supposed to build?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Codebase
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How does the existing system work?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How can I verify that my changes work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is much closer to how a human engineer actually works.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Give the agent tools, not just text
&lt;/h2&gt;

&lt;p&gt;The next step is important.&lt;/p&gt;

&lt;p&gt;An AI coding agent becomes significantly more useful when it can interact with the development environment.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read files
   ↓
Understand architecture
   ↓
Modify code
   ↓
Run tests
   ↓
Read failures
   ↓
Modify code
   ↓
Run tests again
   ↓
Review diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent isn't simply generating text anymore.&lt;/p&gt;

&lt;p&gt;It's participating in a feedback loop.&lt;/p&gt;

&lt;p&gt;That's why modern coding agents are fundamentally different from autocomplete.&lt;/p&gt;

&lt;p&gt;The agent can execute commands, inspect their output and use that output to determine the next action.&lt;/p&gt;

&lt;p&gt;This also changes how we should evaluate AI-generated code.&lt;/p&gt;

&lt;p&gt;The question shouldn't simply be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Did the model generate good code?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can the system reliably detect when the generated code is wrong?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Verification becomes more important than generation
&lt;/h2&gt;

&lt;p&gt;This is probably the most important change in my own thinking about AI-assisted development.&lt;/p&gt;

&lt;p&gt;If generating code becomes cheap, &lt;strong&gt;verification becomes expensive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Suppose an agent writes 300 lines of code in a few minutes.&lt;/p&gt;

&lt;p&gt;That's great.&lt;/p&gt;

&lt;p&gt;But if reviewing those 300 lines takes an engineer 45 minutes, the bottleneck has moved.&lt;/p&gt;

&lt;p&gt;And if the engineer doesn't have good tests, the problem becomes even worse.&lt;/p&gt;

&lt;p&gt;So the coding harness should provide strong feedback loops.&lt;/p&gt;

&lt;p&gt;At minimum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Implementation
     ↓
Lint
     ↓
Unit tests
     ↓
Integration tests
     ↓
Type checks
     ↓
Build
     ↓
Diff review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent should be able to run these checks itself.&lt;/p&gt;

&lt;p&gt;More importantly, failures should be useful.&lt;/p&gt;

&lt;p&gt;Compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tests failed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test_api_returns_existing_error_format
AssertionError:
Expected HTTP 400
Received HTTP 500

Response:
{"error": "..."}

Expected:
{"code": "INVALID_PARAMETER", ...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second output gives the agent something it can reason about.&lt;/p&gt;

&lt;p&gt;Good engineering infrastructure becomes &lt;strong&gt;feedback infrastructure for the AI agent&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The coding harness should constrain the agent
&lt;/h2&gt;

&lt;p&gt;There's another important idea here.&lt;/p&gt;

&lt;p&gt;We don't actually want an autonomous agent with unlimited freedom.&lt;/p&gt;

&lt;p&gt;We want an agent operating inside a set of boundaries.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌───────────────┐
                    │     Agent     │
                    └───────┬───────┘
                            │
             ┌──────────────┼──────────────┐
             │              │              │
             ▼              ▼              ▼
        Instructions     Tools          Tests
             │              │              │
             └──────────────┼──────────────┘
                            ▼
                       Constraints
                            │
                            ▼
                         Codebase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The harness defines things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what files can be modified&lt;/li&gt;
&lt;li&gt;what commands can be executed&lt;/li&gt;
&lt;li&gt;what tests must pass&lt;/li&gt;
&lt;li&gt;what patterns should be followed&lt;/li&gt;
&lt;li&gt;what changes require human review&lt;/li&gt;
&lt;li&gt;what constitutes completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why I like the term &lt;strong&gt;coding harness&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We're not simply asking an LLM to write software.&lt;/p&gt;

&lt;p&gt;We're designing an environment in which an AI agent can safely perform software engineering work.&lt;/p&gt;

&lt;p&gt;This idea is increasingly being discussed as "harness engineering": designing constraints, feedback loops and quality gates around coding agents rather than focusing solely on the model itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Make corrections compound
&lt;/h2&gt;

&lt;p&gt;Here's another useful pattern.&lt;/p&gt;

&lt;p&gt;Suppose the agent makes a mistake.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't use library X here. This project uses library Y because X doesn't support our async execution model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You could simply correct the agent and continue.&lt;/p&gt;

&lt;p&gt;But that means you'll probably have to make the same correction again.&lt;/p&gt;

&lt;p&gt;Instead, turn the correction into durable project knowledge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Important&lt;/span&gt;

Do not use library X for HTTP requests.

The service uses library Y because the request path is asynchronous.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the next agent session starts with that knowledge.&lt;/p&gt;

&lt;p&gt;Anthropic itself recommends treating &lt;code&gt;CLAUDE.md&lt;/code&gt; as shared project memory and updating it when the agent repeatedly makes a mistake.&lt;/p&gt;

&lt;p&gt;This creates an interesting feedback loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent makes mistake
       ↓
Engineer corrects it
       ↓
Correction becomes project guidance
       ↓
Future agent sessions see it
       ↓
Same mistake becomes less likely
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository gradually becomes better at working with AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. What should the developer actually do?
&lt;/h2&gt;

&lt;p&gt;This doesn't mean developers disappear.&lt;/p&gt;

&lt;p&gt;It changes where their time goes.&lt;/p&gt;

&lt;p&gt;Instead of spending most of the time on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Typing → debugging → typing → debugging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the workflow starts looking more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Understand requirement
        ↓
Define constraints
        ↓
Provide context
        ↓
Delegate implementation
        ↓
Review
        ↓
Run verification
        ↓
Correct
        ↓
Capture important learning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The developer increasingly becomes the person designing and supervising the system.&lt;/p&gt;

&lt;p&gt;That requires stronger engineering fundamentals, not weaker ones.&lt;/p&gt;

&lt;p&gt;You still need to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;li&gt;testing&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;failure modes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In fact, when an AI can produce code very quickly, understanding whether that code belongs in the system becomes more important.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. A practical workflow
&lt;/h2&gt;

&lt;p&gt;Here's a workflow that I think works well for an existing engineering team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Keep project instructions in the repository
&lt;/h3&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLAUDE.md
AGENTS.md
.github/copilot-instructions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't duplicate everything blindly across them. Keep the instructions relevant to the tools your team actually uses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Keep specifications close to the code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;specs/
    JIRA-1234.md
    JIRA-1235.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert important requirements into Markdown that an agent can consume.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Ask the agent to investigate first
&lt;/h3&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Implement JIRA-1234.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read &lt;code&gt;specs/JIRA-1234.md&lt;/code&gt;.&lt;br&gt;
Inspect the relevant parts of the codebase.&lt;br&gt;
Identify the files that would need to change and explain your proposed implementation.&lt;br&gt;
Don't modify anything yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gives you a chance to catch a misunderstanding &lt;strong&gt;before code is generated&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Let the agent implement
&lt;/h3&gt;

&lt;p&gt;Once the approach looks right:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Implement the proposed change. Follow the repository instructions and the specification. Add or update tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 5 — Let the agent verify
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run tests.
Run linting.
Run type checks.
Review the diff.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6 — Human review
&lt;/h3&gt;

&lt;p&gt;The human still owns the final decision.&lt;/p&gt;

&lt;p&gt;The agent can propose.&lt;/p&gt;

&lt;p&gt;The agent can implement.&lt;/p&gt;

&lt;p&gt;The agent can test.&lt;/p&gt;

&lt;p&gt;But the engineer decides whether the change belongs in the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. The real productivity multiplier
&lt;/h2&gt;

&lt;p&gt;I don't think the biggest productivity improvement comes from having a better prompt.&lt;/p&gt;

&lt;p&gt;It comes from reducing the amount of information that has to be supplied manually every time.&lt;/p&gt;

&lt;p&gt;Imagine two developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer A
&lt;/h3&gt;

&lt;p&gt;Every task starts with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's the architecture...&lt;/p&gt;

&lt;p&gt;Here's how our tests work...&lt;/p&gt;

&lt;p&gt;Remember that this module...&lt;/p&gt;

&lt;p&gt;We don't use that library...&lt;/p&gt;

&lt;p&gt;Here's the Jira description...&lt;/p&gt;

&lt;p&gt;Here's the relevant code...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Developer B
&lt;/h3&gt;

&lt;p&gt;Their repository already contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md
CLAUDE.md
.github/copilot-instructions.md
specs/
tests/
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent can discover most of that itself.&lt;/p&gt;

&lt;p&gt;Developer B isn't necessarily using a smarter model.&lt;/p&gt;

&lt;p&gt;They're using a &lt;strong&gt;better environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's the part I find most interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bottleneck isn't code generation
&lt;/h2&gt;

&lt;p&gt;We're entering a phase where generating a reasonable first implementation is becoming increasingly cheap.&lt;/p&gt;

&lt;p&gt;That doesn't mean software engineering is becoming trivial.&lt;/p&gt;

&lt;p&gt;It means the expensive parts are moving.&lt;/p&gt;

&lt;p&gt;From:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writing code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;towards:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding the problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Providing the right context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making architectural decisions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defining constraints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building reliable feedback loops&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reviewing the result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing when the AI is wrong&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And perhaps most importantly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turning every correction into knowledge that the next AI session can use.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's why I think the next generation of developer tooling isn't just going to be about better models.&lt;/p&gt;

&lt;p&gt;It will be about &lt;strong&gt;better coding environments for those models&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The winning setup won't simply be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developer + LLM&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It will be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Developer + Codebase + Context + Tools + Tests + AI agent&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model is only one component.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;harness around it&lt;/strong&gt; is what makes it useful.&lt;/p&gt;

&lt;p&gt;And once writing code stops being the bottleneck, that's where the interesting engineering work begins.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>llm</category>
      <category>coding</category>
    </item>
    <item>
      <title>FastAPI vs aiohttp vs httpx: A Comparative Guide</title>
      <dc:creator>Piyush Atghara</dc:creator>
      <pubDate>Wed, 06 Aug 2025 11:30:53 +0000</pubDate>
      <link>https://dev.to/piyushatghara/fastapi-vs-aiohttp-vs-httpx-a-comparative-guide-3kib</link>
      <guid>https://dev.to/piyushatghara/fastapi-vs-aiohttp-vs-httpx-a-comparative-guide-3kib</guid>
      <description>&lt;p&gt;When building modern Python web applications, selecting the right asynchronous framework or HTTP client can significantly impact your project’s performance, maintainability, and developer experience. In this article, we'll explore and compare &lt;strong&gt;FastAPI&lt;/strong&gt;, &lt;strong&gt;aiohttp&lt;/strong&gt;, and &lt;strong&gt;httpx&lt;/strong&gt;, analyzing their strengths, use cases, and how they fit different needs within the Python ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Are These Tools?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FastAPI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A modern, fast (high-performance), web framework for building APIs with Python 3.7+ based on standard Python type hints. Built atop Starlette and Pydantic, FastAPI aims to help developers quickly build robust APIs with auto-generated docs and validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;aiohttp&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A battle-tested asynchronous HTTP client/server framework. You can use aiohttp to build both web servers and HTTP clients, but it is more low-level compared to FastAPI and doesn’t include many batteries-included features, offering flexibility at the cost of some manual work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;httpx&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A next-generation HTTP client for Python. Built for async and sync support, httpx can be a drop-in replacement for requests, but with async support (via &lt;code&gt;asyncio&lt;/code&gt;). It’s not a web framework, but a library for making HTTP requests, both to your own APIs or others.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Key Feature Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;FastAPI&lt;/th&gt;
&lt;th&gt;aiohttp&lt;/th&gt;
&lt;th&gt;httpx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project Type&lt;/td&gt;
&lt;td&gt;Web API framework&lt;/td&gt;
&lt;td&gt;HTTP Client &amp;amp; Server&lt;/td&gt;
&lt;td&gt;HTTP Client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Async Support&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type Hints&lt;/td&gt;
&lt;td&gt;Full integration&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Validation&lt;/td&gt;
&lt;td&gt;Pydantic-based&lt;/td&gt;
&lt;td&gt;Manual/parsing needed&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Docs&lt;/td&gt;
&lt;td&gt;Automatic (Swagger/OpenAPI)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use Case&lt;/td&gt;
&lt;td&gt;API/services&lt;/td&gt;
&lt;td&gt;Custom web servers/clients&lt;/td&gt;
&lt;td&gt;HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community &amp;amp; Docs&lt;/td&gt;
&lt;td&gt;Mature, growing&lt;/td&gt;
&lt;td&gt;Established&lt;/td&gt;
&lt;td&gt;Rapidly growing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td&gt;Gentle (with hints)&lt;/td&gt;
&lt;td&gt;Moderate/Steep&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  3. When to Use Each
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FastAPI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Building RESTful APIs, microservices, and data-driven backends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why Choose It?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Automatic docs (Swagger/OpenAPI).&lt;/li&gt;
&lt;li&gt;Fantastic type checking and validation.&lt;/li&gt;
&lt;li&gt;Easy async support baked in.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  aiohttp
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Custom, lower-level async servers/clients, websockets, streaming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why Choose It?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Full flexibility for both clients and servers.&lt;/li&gt;
&lt;li&gt;Extensive websocket and streaming support.&lt;/li&gt;
&lt;li&gt;Rich middleware capabilities.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  httpx
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Making HTTP requests from Python (both sync and async).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why Choose It?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Clean, request-like API with async support.&lt;/li&gt;
&lt;li&gt;Easy migration from requests.&lt;/li&gt;
&lt;li&gt;Used alongside web frameworks, not a replacement.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Example Code Snippets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FastAPI Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

@app.get("/hello")
async def hello():
return {"message": "Hello, world!"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  aiohttp Example (Server)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from aiohttp import web

async def hello(request):
return web.json_response({"message": "Hello, world!"})

app = web.Application()
app.router.add_get('/hello', hello)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  httpx Example (Client)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import httpx
import asyncio

async def main():
async with httpx.AsyncClient() as client:
resp = await client.get("https://example.com")
print(resp.json())

asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Performance &amp;amp; Community
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; is recognized for excellent performance, sometimes comparable to Node.js and Go frameworks for API workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aiohttp&lt;/strong&gt; is robust and has powered many high-concurrency servers, but requires more manual wiring for features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;httpx&lt;/strong&gt; is widely adopted among Python developers embracing async HTTP calls, especially for services like FastAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Conclusion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you need &lt;strong&gt;a modern, productive, batteries-included API framework&lt;/strong&gt;: &lt;strong&gt;FastAPI&lt;/strong&gt; is the go-to choice.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;both client and server needs with maximum low-level control&lt;/strong&gt;: &lt;strong&gt;aiohttp&lt;/strong&gt; is great, especially for websockets and streaming.&lt;/li&gt;
&lt;li&gt;When &lt;strong&gt;making HTTP calls asynchronously or synchronously&lt;/strong&gt;: &lt;strong&gt;httpx&lt;/strong&gt; should be your preferred choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decide what "layer" of your stack you’re working on, and pick the tool that fits both your needs and your team’s experience.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feel free to drop your experiences or questions with these frameworks in the comments!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Disclaimer: This is an AI-assisted content!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fke7ybddco3vu4j9b2lyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fke7ybddco3vu4j9b2lyd.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>asynchronous</category>
      <category>programming</category>
      <category>fastapi</category>
    </item>
  </channel>
</rss>
