这节课不比较谁“写代码更强”。你会在一个模拟小项目中,用 Codex 或 Claude Code 完成同一项安全修改:先建立规则、复现错误、写验收用例,再限制修改范围、运行检查、审查差异并整理交付记录。
练习项目:修复文本统计器的空字符串行数
现有函数使用 text.split(/r?n/).length 统计总行数,空字符串会被算成 1 行。目标是让空文本返回 0,同时保持其他三个用例不变。
使用 Codex
可以在终端、IDE 或桌面应用中进入代码工作流。把项目目录、规则、测试命令和完成条件说清楚。
查看 Codex 资料与官方来源使用 Claude Code
可以在支持的终端、IDE、桌面或浏览器入口处理代码库。仍需限定权限、运行测试并人工审查。
查看 Claude Code 资料与官方来源两种工具都不能替代版本控制、测试和人工验收。使用哪个取决于账号可用性、工作入口、项目环境和同一小样的实际结果。
第一步:代理开始前,先让项目说明怎样工作
AGENTS.md项目规则、命令和禁止事项
src/counter.js待修改的统计函数
tests/counter.test.js正常与边界用例
README.md用户口径和运行方法
# 项目规则 ## 目标 维护一个浏览器本地文本统计器。 ## 允许修改 - src/counter.js - 与本次错误直接相关的 tests/counter.test.js - 如果统计口径变化,更新 README.md 对应一句说明 ## 禁止 - 不增加账号、上传、保存历史或新依赖 - 不重构无关函数 - 不修改密钥、环境变量、部署配置 - 不删除用户文件或覆盖原始数据 ## 验证命令 - npm test - npm run lint ## 完成标准 - 空字符串返回 0 行 - 现有正常文本、空白行和 Windows 换行用例继续通过 - 差异中没有无关格式化和临时文件
Codex 官方最佳实践建议把仓库结构、运行方式、构建测试命令、约束和完成标准写入 AGENTS.md。其他工具即使使用不同规则文件,也应保存同样的信息。
第二步:把“修一下”改成可复现任务
错误任务
这个统计器有点问题,帮我修好并顺便优化代码。
没有输入、预期、实际结果和范围。“顺便优化”会扩大差异,增加回归风险。
可执行任务
- 输入:空字符串
"" - 当前:总行数为 1
- 预期:总行数为 0
- 保持:
"annb"仍为 3 行 - 范围:只改统计函数、相关测试和必要说明
目标: 项目目录: 相关文件: 复现步骤: 测试输入: 当前结果: 预期结果: 必须保持的行为: 允许修改的范围: 明确不做: 验证命令: 完成后必须返回: 1. 根因 2. 修改文件 3. 实际测试结果 4. 仍存在的限制 开始前先读取项目规则并复述理解;如果规则和任务冲突,停止并说明。
第三步:先看失败证据,再让代理改代码
基线
先运行全部现有检查,区分原有失败与本次问题。
复现
增加空字符串用例,确认它在旧实现上失败。
最小修复
只处理空字符串分支,不重写整套统计逻辑。
回归
重新运行全部用例、lint 和必要构建。
项目与版本: 基线命令: 基线结果: 复现用例: 输入: 修改前预期: 修改前实际: 失败输出: 修改后命令: 空字符串: 普通文本: 包含空白行: Windows 换行: lint: 构建: 失败项: 是否由本次修改引入: 证据保存位置:
允许的最小思路
function countLines(text) {
return text === "" ? 0 : text.split(/r?n/).length;
}这是课程中的思路示例,不应脱离真实项目直接复制。代理必须先读取现有函数、测试风格和空白字符口径。
第四步:测试通过后,仍要逐行审查差异
| 检查项 | 要问的问题 | 不通过示例 |
|---|---|---|
| 范围 | 每一行是否直接服务本任务? | 同时重命名无关变量 |
| 行为 | 是否只改变约定的边界情况? | 把只含空格文本也改成 0 行 |
| 测试 | 用例是否证明错误而非迎合实现? | 只断言函数没有报错 |
| 安全 | 是否出现密钥、外部发送或扩大权限? | 把本地内容发送到新服务 |
| 产物 | 是否混入缓存、日志、截图和测试输出? | 提交 node_modules 或临时文件 |
任务: 审查范围: 修改文件: □ 每个文件都在允许范围内 □ 每一行修改都能对应任务或测试 □ 没有无关重构、依赖或格式化 □ 没有密钥、个人信息和本地绝对路径 □ 没有新增网络发送、删除或公开发布动作 □ 测试覆盖修改前失败、修改后通过 □ 用户说明与实际行为一致 发现的问题: 要求返工: 返工后复测: 审查人:
最后一步:交付的是证据包,不是“已经修好”
- 保留修改前的失败输出和修改后的通过输出。
- 列出所有修改文件及其必要性。
- 记录实际运行的测试、lint、构建和人工操作。
- 确认差异中没有密钥、无关文件和扩大权限。
- 明确尚未覆盖的平台、输入或环境。
- 只有获得发布权限后才能部署、推送或公开发布。
任务: 使用工具与入口: 项目版本或分支: 修改文件: 根因: 最小修复: 修改前失败证据: 修改后通过证据: 实际运行命令: 人工检查: 差异审查结论: 未覆盖范围: 回滚方式: □ 没有无关修改 □ 没有密钥和临时产物 □ 没有未经授权的推送、部署或发布 □ 用户可以按说明重新运行验证 交付人: 验收人: 日期:
什么时候不应该让编程代理直接修改?
当项目没有备份或版本控制、规则和测试命令未知、任务涉及生产数据库迁移、密钥、付款、删除、公开发布,或你无法审查最终差异时,先停在只读分析和计划阶段,不要扩大写入权限。