惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
腾讯CDC
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
B
Blog
S
SegmentFault 最新的问题
P
Privacy & Cybersecurity Law Blog
T
Threatpost
博客园 - 聂微东
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
C
Check Point Blog
N
Netflix TechBlog - Medium
D
DataBreaches.Net
爱范儿
爱范儿
IT之家
IT之家
S
Secure Thoughts
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
C
Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
有赞技术团队
有赞技术团队
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
雷峰网
雷峰网
Project Zero
Project Zero
博客园 - Franky
H
Heimdal Security Blog
A
About on SuperTechFans
Security Latest
Security Latest
Webroot Blog
Webroot Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Building Better Software with AI Agents: Why Fundamentals Still Matter
Alex Metelli · 2026-04-28 · via DEV Community

AI coding tools are changing how software gets built, but they do not remove the need for software engineering discipline. In practice, they make fundamentals more important.

This post is a condensed write-up of a workshop by Matt Pocock on building better software with AI agents. The original workshop is available here: https://youtu.be/-QFHIoCo-Ko?si=9qyQKxnid9sE_ehc

The core mistake many developers make is treating AI as a “spec-to-code compiler”: write a vague requirement, hand it to an agent, and expect production-ready software to appear. That works for demos. It breaks down in real codebases.

A better model is this:

Use AI agents to accelerate implementation, but use software engineering fundamentals to control alignment, architecture, feedback loops, and quality.

This post distills a developer workflow from a workshop transcript on AI-assisted coding, agentic planning, PRDs, vertical slicing, TDD, and codebase design.


The Two Constraints of LLM Coding Agents

Before designing an AI-assisted workflow, you need to understand two constraints.

1. Agents have a “smart zone” and a “dumb zone”

An LLM performs best when the context is clean, focused, and not overloaded.

As the conversation grows, the agent has to reason across more tokens, more decisions, more previous mistakes, and more irrelevant detail. Eventually, it starts making worse decisions.

This is why giant context windows are not a free lunch. They are useful for retrieval, but not always for coding. A 1M-token window does not mean the agent stays sharp for 1M tokens.

For coding, the practical strategy is:

  • Keep tasks small.
  • Keep context clean.
  • Avoid long, drifting conversations.
  • Prefer fresh sessions for focused work.
  • Do not let the agent accumulate too much conversational sediment.

2. Agents forget unless you externalize state

LLMs are stateless between sessions unless you give them state explicitly.

That means important decisions should not live only in the chat history. You need artifacts:

  • Product requirements documents.
  • Local issue files.
  • GitHub issues.
  • Architecture notes.
  • Test cases.
  • Commit history.
  • Review summaries.

The trick is not to preserve everything. It is to preserve the useful shape of the work.


Step 1: Start with Alignment, Not Implementation

When a vague feature request arrives, the wrong move is to immediately ask the agent to code.

Example request:

“Retention is bad. Students sign up, do a few lessons, then drop off. Let’s add gamification.”

That sounds simple. It is not.

Before coding, you need to clarify:

  • What actions earn points?
  • Are points retroactive?
  • Do streaks earn points?
  • Where does the UI live?
  • What counts as lesson completion?
  • What is the progression curve?
  • What is out of scope?
  • What data model supports this?
  • How will this be tested?

The useful pattern here is a grilling session.

Instead of saying:

“Create a plan.”

Ask the agent to interrogate the requirement:

“Interview me relentlessly about every aspect of this feature until we reach a shared understanding. Ask one question at a time. For each question, give your recommended answer.”

This changes the interaction.

The goal is not to produce a plan immediately. The goal is to reach a shared design concept between the human and the agent.

That matters because most AI coding failures are not syntax failures. They are alignment failures.


Step 2: Turn the Conversation into a Destination Document

Once the agent and human have converged on the feature, convert the alignment conversation into a PRD.

The PRD should not be a bloated corporate artifact. It should capture the destination.

A useful PRD contains:

# Feature: Gamification System

## Problem

Students start courses but do not consistently return or complete lessons.

## Solution

Add a lightweight gamification system with points, levels, and streaks to increase visible progress and motivation.

## User Stories

- As a student, I can earn points when I complete lessons.
- As a student, I can see my current points on the dashboard.
- As a student, I can see my level progression.
- As an instructor/admin, I can trust that points are derived from real completion events.

## Implementation Decisions

- Points are awarded for lesson completion.
- Video watch events are excluded because they are noisy and gameable.
- Existing completion records may be backfilled.
- Streaks are tracked separately from points.

## Out of Scope

- Leaderboards.
- Social sharing.
- Complex achievements.
- Manual admin point editing.

## Testing Decisions

- Core point logic is tested in a dedicated gamification service.
- Integration tests cover lesson completion triggering point awards.
- UI smoke tests verify dashboard visibility.

Enter fullscreen mode Exit fullscreen mode

The PRD is not the implementation. It is the destination.

The point is to move from “vague intent” to “clear target.”


Step 3: Do Not Use Linear Phase Plans by Default

A common AI workflow is:

Phase 1: Database schema
Phase 2: Backend services
Phase 3: API routes
Phase 4: Frontend UI
Phase 5: Tests

Enter fullscreen mode Exit fullscreen mode

This looks organized, but it has a major flaw: it is horizontal.

The agent builds layer by layer, but you do not get useful feedback until late in the process. The database may be done, the backend may be done, and the UI may be partially done before you discover that the full flow does not actually work.

That is bad engineering.

A better approach is to break work into vertical slices.


Step 4: Prefer Vertical Slices / Tracer Bullets

A vertical slice crosses the full stack and produces something testable.

Bad first task:

Create the gamification database schema and service.

Enter fullscreen mode Exit fullscreen mode

Better first task:

Award points when a student completes a lesson and show the points on the dashboard.

Enter fullscreen mode Exit fullscreen mode

That first slice may include:

  • A minimal database change.
  • A gamification service.
  • A lesson completion hook.
  • A dashboard display.
  • A test proving points are awarded.

This is more valuable because the system becomes testable immediately.

The agent gets feedback earlier. The human gets something visible earlier. The architecture gets pressure-tested earlier.

This is the same idea as tracer bullets from The Pragmatic Programmer: build a thin, end-to-end path through the system so you can see where you are aiming.


Step 5: Convert the PRD into a Kanban Board, Not a Sequential Script

Instead of one long plan, convert the PRD into independently grabbable issues.

Example:

Issue 1: Award lesson completion points and display them on dashboard
Blocks: none
Type: AFK

Issue 2: Track student streaks
Blocks: Issue 1
Type: AFK

Issue 3: Add level progression based on accumulated points
Blocks: Issue 1
Type: AFK

Issue 4: Backfill points for existing lesson completions
Blocks: Issue 1
Type: AFK

Issue 5: Add dashboard polish and empty states
Blocks: Issues 1, 2, 3
Type: Human review

Enter fullscreen mode Exit fullscreen mode

This gives you a directed acyclic graph of work.

That matters because agents can work in parallel only when dependencies are clear.

A linear plan can usually be executed by one agent. A Kanban-style graph can be executed by multiple agents safely.


Step 6: Separate Human-in-the-Loop Work from AFK Work

Not all tasks should be delegated equally.

Some work needs humans:

  • Product alignment.
  • Domain decisions.
  • Architecture boundaries.
  • UX judgment.
  • QA.
  • Final code review.
  • Tradeoff decisions.

Some work can be AFK:

  • Implementing a well-scoped issue.
  • Adding tests.
  • Running type checks.
  • Fixing straightforward failures.
  • Refactoring within a clear boundary.
  • Generating boilerplate.
  • Applying known patterns.

The practical split is:

Human-in-the-loop:
Idea → Grilling → PRD → Issue breakdown → QA → Review

AFK:
Issue implementation → Tests → Type checks → Automated review → Commit

Enter fullscreen mode Exit fullscreen mode

This is the “day shift / night shift” model.

Humans prepare the backlog and define quality. Agents execute scoped tasks.


Step 7: Use TDD as an Agent Control Mechanism

TDD is not just a human discipline. It is especially useful for AI agents.

The pattern is:

1. Write a failing test.
2. Confirm it fails for the right reason.
3. Implement the smallest change.
4. Run the test.
5. Refactor.
6. Run full feedback loops.

Enter fullscreen mode Exit fullscreen mode

Why this works well with agents:

  • It prevents the agent from coding blind.
  • It gives the agent immediate feedback.
  • It makes cheating harder.
  • It forces the agent to encode expected behavior before implementation.
  • It leaves the codebase better tested after each task.

Without tests, agents tend to hallucinate correctness. With tests, they have a feedback loop.

Bad codebases produce bad agents partly because they lack feedback loops.


Step 8: Improve the Codebase for Agents by Deepening Modules

A codebase made of many tiny, shallow modules is hard for both humans and agents to reason about.

Shallow modules often look like this:

function A depends on helper B
helper B depends on utility C
utility C depends on config D
service E calls A, B, and C directly
tests mock half the graph

Enter fullscreen mode Exit fullscreen mode

This creates problems:

  • The dependency graph is hard to understand.
  • Test boundaries are unclear.
  • Agents modify the wrong layer.
  • Small changes cause unexpected breakage.
  • The agent has to inspect too many files to understand one behavior.

A better structure uses deep modules.

A deep module has:

  • A small public interface.
  • Significant internal functionality.
  • Clear ownership of behavior.
  • A natural test boundary.

Example:

type AwardLessonCompletionPointsInput = {
  userId: string
  lessonId: string
  completedAt: Date
}

type GamificationService = {
  awardLessonCompletionPoints(input: AwardLessonCompletionPointsInput): Promise<void>
  getStudentProgress(userId: string): Promise<StudentGamificationProgress>
}

Enter fullscreen mode Exit fullscreen mode

Internally, the service may do many things:

  • Check whether points were already awarded.
  • Insert a point event.
  • Update streaks.
  • Recalculate level.
  • Return dashboard data.

But callers do not need to know that.

This is good for humans and good for agents.

The human owns the interface. The agent can implement the internals.

That is the right abstraction boundary.


Step 9: Use Push vs Pull Context Deliberately

Do not dump every rule into every prompt.

There are two ways to provide context to an agent.

Push context

You always include it.

Examples:

Follow these coding standards.
Use strict TypeScript.
Do not introduce new dependencies.
Run tests before committing.

Enter fullscreen mode Exit fullscreen mode

Push context is useful for reviewers and critical constraints.

Pull context

You make information available, and the agent retrieves it when needed.

Examples:

/skills/react-patterns.md
/skills/database-migrations.md
/skills/testing-guidelines.md
/architecture/gamification.md

Enter fullscreen mode Exit fullscreen mode

Pull context is useful for implementation guidance that is not always needed.

A good rule:

  • Push constraints to reviewers.
  • Let implementers pull guidance when needed.

The reviewer should be stricter than the implementer.


Step 10: Always Review in a Fresh Context

If the same agent implements and reviews in one long session, the review often happens in the “dumb zone.”

Better:

Session 1:
Implement issue.

Clear context.

Session 2:
Review the diff against the issue, coding standards, and architecture rules.

Enter fullscreen mode Exit fullscreen mode

This keeps the reviewer sharper.

It also reduces self-justification. Agents are less likely to catch their own mistakes when they are still carrying the implementation history.


Step 11: QA Is Where Taste Re-enters the System

Automated tests are necessary, but they are not enough.

Human QA is where you impose taste.

This is especially true for:

  • Frontend behavior.
  • UX quality.
  • Product feel.
  • Naming.
  • Edge cases.
  • “Does this actually solve the problem?”
  • “Would I be happy merging this?”

If you automate everything from idea to QA, you often get software that technically exists but lacks judgment.

That is how teams produce AI slop.

The human role is not disappearing. It is moving upward:

  • Less typing.
  • More shaping.
  • More reviewing.
  • More boundary-setting.
  • More taste enforcement.

A Practical Workflow You Can Steal

Here is the full loop.

1. Start with a vague idea or client brief.

2. Run a grilling session.
   Goal: reach shared understanding.

3. Convert the conversation into a PRD.
   Goal: define the destination.

4. Convert the PRD into vertical-slice issues.
   Goal: create independently grabbable tasks.

5. Mark each issue:
   - Human-in-the-loop
   - AFK
   - Blocked by X
   - Blocks Y

6. Run one agent per available AFK issue.
   Goal: scoped implementation.

7. Require TDD and feedback loops.
   Goal: prevent blind coding.

8. Run automated review in a fresh context.
   Goal: catch obvious problems.

9. Human QA and code review.
   Goal: enforce correctness and taste.

10. Add new issues from QA findings.
    Goal: keep the Kanban board alive.

11. Merge only when the slice is coherent.

Enter fullscreen mode Exit fullscreen mode


The Bigger Lesson

AI coding is not replacing software engineering fundamentals.

It is punishing teams that ignored them.

If your codebase has:

  • Poor tests.
  • Shallow modules.
  • Unclear boundaries.
  • Weak architecture.
  • Vague requirements.
  • No review discipline.
  • No product taste.

Then agents will amplify the mess.

If your codebase has:

  • Clear modules.
  • Strong feedback loops.
  • Small vertical slices.
  • Explicit requirements.
  • Testable behavior.
  • Good review practices.

Then agents can move extremely fast.

The future of software development is not “write specs and ignore code.”

It is closer to this:

Developers design the system, define the boundaries, create the feedback loops, and delegate scoped implementation to agents.

That is a much stronger model than vibe coding.

And it is much closer to real engineering.