程序员注意:AI Agent 编程时代已来,你还在手动写代码?
最近试了几个支持 Agent 模式的编程工具,感觉变化挺大。以前是「你写一行它补一行」,现在是「告诉它你要什么,它自己去干」。
这篇笔记记录了几个实际尝试过的场景,代码都附上了。如果你也在看这个方向,可以少踩几个坑。
什么是 AI Agent 编程?
以前的 AI 编程助手是被动响应式的。你在编辑器里打字,它补全下一行。你不写,它不动。
AI Agent 不一样。你给它一个目标,它会自己拆解任务、规划文件结构、编写代码、运行测试、发现错误、修复再试。中间过程不需要你插手。
比如你说「帮我写一个用户注册接口,包含邮箱验证和密码加密」,它不会等你一行一行写,而是直接生成完整的代码文件。
这不是演示视频里的东西,是已经能用的能力。
我做了什么实验
我试了几个主流工具,它们都支持不同程度的 Agent 模式:
- Claude Code: 终端里给任务,它会自己读代码库、改文件、跑测试
- Cursor 的 Agent 模式: 能跨文件修改,不只是单行补全
- GitHub Copilot Workspace: 从 issue 描述直接生成 PR
具体实验是这样的。我给 Agent 一句话需求:
写一个用户管理 API,支持增删改查,用 Python FastAPI,带 SQLite 数据库。
它自己做了这些事:规划了三个文件的结构,依次编写代码,执行 pip install 装依赖,启动服务后发现端口被占用,自动换了个端口,最后输出了可用的 API 地址。
整个过程我没有写代码。生成的代码质量大概在「MVP 能用」这个级别。
当然不够完美。错误处理比较简单,没有分页和限流。不过这些后续改进也可以接着交给它做。
实战场景一:从零生成项目脚手架
项目搭建框架这类事重复性很高,创建目录、写配置文件、初始化依赖,每次都是类似的套路。
实操:生成一个 Node.js + TypeScript 项目。给 Agent 的指令是:
1 2 3 4 5 创建一个 TypeScript 项目,要求:- 使用 Express 框架- 支持 ESLint + Prettier- 包含单元测试框架 Jest- 有完整的 package.json 脚本
它生成了这些文件:
package.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { "name": "ts-api-starter", "version": "1.0.0", "description": "TypeScript Express API starter", "main": "dist/index.js", "scripts": { "dev": "nodemon src/index.ts", "build": "tsc", "start": "node dist/index.js", "lint": "eslint src --ext .ts", "test": "jest --coverage", "format": "prettier --write 'src/**/*.ts'" }, "dependencies": { "express": "^4.21.0", "cors": "^2.8.5", "dotenv": "^16.4.5" }, "devDependencies": { "@types/express": "^5.0.0", "@types/node": "^22.0.0", "typescript": "^5.6.0", "ts-node": "^10.9.0", "nodemon": "^3.1.0", "eslint": "^9.0.0", "prettier": "^3.3.0", "jest": "^29.7.0", "@types/jest": "^29.5.0", "ts-jest": "^29.2.0" }}
tsconfig.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 { "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict":true, "esModuleInterop":true, "forceConsistentCasingInFileNames":true, "skipLibCheck":true }, "include": ["src/**/*"], "exclude": ["node_modules", "**/*.test.ts"]}
src/index.ts:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import express from 'express';import cors from 'cors';import dotenv from 'dotenv';dotenv.config();const app = express();const PORT = process.env.PORT || 3000;// 中间件app.use(cors());app.use(express.json());// 健康检查app.get('/health', (_req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() });});app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`);});
手动搭这套东西至少 30 分钟,Agent 大概 2 分钟。
实战场景二:自动修复 Bug
传统修 bug 流程:看报错、猜原因、改代码、重新跑、再报错、继续猜。Agent 把这个过程缩短了不少。
实操:修复一个 Python 的数据库连接问题。
假设这段代码运行时报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import sqlite3from flask import Flask, jsonifyapp = Flask(__name__)def get_db(): conn = sqlite3.connect('app.db') return conn@app.route('/users')def get_users(): conn = get_db() cursor = conn.cursor() cursor.execute("SELECT * FROM users") users = cursor.fetchall() return jsonify(users)if __name__ == '__main__': app.run(debug=True)
报错信息:sqlite3.OperationalError: no such table: users
给 Agent 的指令:
1 2 3 4 5 这段代码报错 "no such table: users",请分析原因并修复。要求:1. 添加数据库初始化逻辑2. 确保表不存在时自动创建3. 添加错误处理
Agent 给出的修复方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 import sqlite3from flask import Flask, jsonifyapp = Flask(__name__)DATABASE = 'app.db'def get_db(): conn = sqlite3.connect(DATABASE) conn.row_factory = sqlite3.Row # 让查询结果可以用字段名访问 return conndef init_db(): """初始化数据库,确保表结构存在""" conn = get_db() conn.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close()@app.route('/users')def get_users(): try: conn = get_db() cursor = conn.cursor() cursor.execute("SELECT id, name, email, created_at FROM users") users = [dict(row) for row in cursor.fetchall()] conn.close() return jsonify(users) except sqlite3.Error as e: return jsonify({"error": str(e)}), 500@app.route('/users', methods=['POST'])def create_user(): from flask import request try: data = request.get_json() name = data.get('name') email = data.get('email') if not name or not email: return jsonify({"error": "name and email are required"}), 400 conn = get_db() cursor = conn.cursor() cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", (name, email)) conn.commit() user_id = cursor.lastrowid conn.close() return jsonify({"id": user_id, "name": name, "email": email}), 201 except sqlite3.IntegrityError: return jsonify({"error": "email already exists"}), 409 except sqlite3.Error as e: return jsonify({"error": str(e)}), 500if __name__ == '__main__': init_db() # 启动时初始化数据库 app.run(debug=True)
除了修好原始报错,Agent 还做了额外改进:
加了 row_factory,查询结果能用字段名直接访问多写了一个 POST 接口 错误处理完整了 数据库连接在使用后正确关闭
实战场景三:批量重构代码
Agent 比传统工具强的地方在于能理解上下文,做跨文件的关联修改。
实操:给一个 Python 项目批量添加类型注解。代码能用但没有类型标注,传统做法是一个文件一个文件改。
给 Agent 的指令:
1 2 3 4 5 6 7 8 9 10 11 12 给以下三个文件添加 Python 类型注解:models.py:```pythonclass User:<br> def __init__(self, id, name, email):<br> self.id = id<br> self.name = name<br> self.email = email def to_dict(self):<br> return {"id": self.id, "name": self.name, "email": self.email}
services.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from models import Userclass UserService:<br> def __init__(self):<br> self.users = [] def create(self, name, email):<br> user = User(len(self.users) + 1, name, email)<br> self.users.append(user)<br> return user def get_by_id(self, user_id):<br> for user in self.users:<br> if user.id == user_id:<br> return user<br> return None def get_all(self):<br> return self.users
要求:添加完整的类型注解,包括返回值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 Agent 的输出:```python# models.py - 添加类型注解后from typing import Dict, Optionalfrom dataclasses import dataclass@dataclassclass User: id: int name: str email: str def to_dict(self) -> Dict[str, object]: return {"id": self.id, "name": self.name, "email": self.email}# services.py - 添加类型注解后from typing import List, Optionalfrom models import Userclass UserService: def __init__(self) -> None: self.users: List[User] = [] def create(self, name: str, email: str) -> User: user = User(id=len(self.users) + 1, name=name, email=email) self.users.append(user) return user def get_by_id(self, user_id: int) -> Optional[User]: for user in self.users: if user.id == user_id: return user return None def get_all(self) -> List[User]: return self.users
Agent 不只是加了类型注解,还把 User 类从手动 __init__ 改成了 @dataclass 装饰器。我没明确要求这么做,但它判断这样更简洁。
进阶:让 Agent 形成工作流闭环
单个任务交给 Agent 效果不错,如果能让它持续工作,价值更大。
我初步尝试了一个循环工作流:
1 需求描述 → Agent 生成代码 → 运行测试 → 测试失败则自动修复 → 通过后输出结果
具体做法:
准备单元测试或集成测试脚本 让 Agent 负责「生成 → 测试 → 修复」整个循环 设置最大尝试次数,避免在同一个问题上死循环
示例指令:
1 2 3 4 5 6 7 请完成以下任务:1. 写一个 Python 函数,实现冒泡排序2. 写对应的单元测试,覆盖正常输入、空列表、重复元素等场景3. 运行测试4. 如果测试失败,自行修复并重新运行5. 最多尝试 3 次6. 最终输出通过测试的代码和测试报告
一些实际感受
Agent 写出来的代码大概 70-80% 能直接用,剩下的需要人工判断。你的价值从「写代码」变成「判断代码质量」和「把需求说清楚」。 给 Agent 的指令越具体,效果越好。「写个 API」和「写一个支持分页、排序、过滤的用户列表 API」,输出差距很明显。 脚手架、CRUD 接口、单元测试、代码重构,这些是 Agent 的优势场景。系统架构设计方面它还是辅助角色。 Agent 生成的代码要过一遍再提交。它能写出能跑的代码,但安全和性能相关的细节不一定到位。
总结
Agent 编程已经不是概念演示,而是日常可用的工具。工作方式从「逐行写代码」变成了「描述目标,Agent 执行,人工审核」。
还没试过的话,可以从一个小任务开始,比如让它生成项目脚手架,感受一下效率差距。
来源参考:
2026年AI编程进入Agent时代:开发者转型为“AI编排者” 2026年主流Coding Agent实测 AI Agent 完整工作流全景解析
夜雨聆风