DOCAI · 课程 · L3 · 21 分钟 · 基础入门
基础代码生成
从一句话需求到可合并的代码:把技术栈、输入输出、出错行为和项目约束写进提示,再用测试与改动范围逐轮收紧。
你将学会
- 能把模糊需求改写成带技术栈与边界条件的提示
- 能在已有项目里生成风格一致的函数与模块
- 能用测试和 diff 判断生成代码是否可用
一句话需求,只能换来通用代码
打开项目目录,叫起 Claude,说一句「写个函数,输入一组单词,去掉重复项后按字母顺序排列」,几秒就有结果。放进练习够用,放进真实仓库往往要重写:命名不合团队习惯、类型缺失、一出错就崩。
问题多半不在模型,而在输入。一句话描述只能换来通用答案。动手前先问自己三件事:这段代码放在哪个文件、被谁调用、用什么标准判断它写完了。三问答不上来,说明需求还没想清楚。想先了解它的定位,看这个命令行工具是什么。
把需求拆成四件事
写提示之前,过一遍这四项:技术栈、输入输出、出错行为、禁区。
| 项目 | 模糊说法 | 可执行说法 |
|---|---|---|
| 技术栈 | 写个发邮件的函数 | 用 Node 的邮件库;TS 项目;主机、端口、账号、密码从环境变量读取 |
| 接口 | 处理一下用户输入 | 传入字符串,返回去掉空白与特殊字符后的安全串 |
| 出错 | 加点错误处理 | 找不到文件就返回空值,不抛异常;解析失败写日志,同样返回空值 |
| 边界 | 别乱用库 | 不新增依赖;不改公开参数;只动这一个文件 |
表格右列多花的三十秒,经常能省掉一轮返工。四项里最容易被忽略的是「出错」:你越早说清失败时返回什么、记录什么,生成结果越接近能上线的状态。把四项写成短句附在需求后面,比长篇背景描述更有用:背景说明它为什么做,约束说明它做到什么程度。
在已有项目里写:先读再写
它读得到仓库里的文件,这一点要用足。别急着下命令,先让它看相邻代码:
读一下 src/lib 下的两个工具文件,留意命名、注释和出错时的写法。 然后新增一个日期格式化函数,放在同目录,导出方式与它们一致。 先别改已有文件。
这一步的价值在于对齐风格。团队约定则提前写进项目根目录的 CLAUDE.md:目录职责、命名规则、哪些操作必须先问你。写一次,之后每次生成都会照着执行,也省得你反复解释。
生成完成后看一眼改动范围。如果它顺手改了你没提的文件,直接要求退回,只保留新增部分。
整块生成:拆成验收点
路由、组件、数据模型这类整块代码,一次生成看着痛快,审起来很痛苦。把验收点列出来,让它逐项交付:
做一个用户信息卡片组件,按顺序完成:
- 列出 props 与类型定义;
- 写出加载中、无数据、出错三种状态;
- 样式只使用项目里现成的类名;
- 每完成一项先停下,等我看过再继续。
行为拿不准时,反过来先要测试。比如密码强度判断,先把分级规则写成输入与期望输出,让它先交测试文件,你确认规则无误,再让它补实现。测试在前,返工在后,顺序不能反。验收点写得越具体,你回看时越省力;写成「做好一点」等于没写。
一个完整例子:从需求到补丁
把前面那四项压进一条提示,效果是这样:
在 src/lib/mailer.ts 新增 sendMail,供现有的通知服务调用。
- TypeScript,用项目已装好的邮件库,不新增依赖
- 连接信息从环境变量 SMTP_HOST、SMTP_PORT、SMTP_USER、SMTP_PASS 读取
- 入参 { to: string; subject: string; text: string },返回 { ok: true } | { ok: false; error: string }
- 连接超时 10 秒,失败重试 1 次;仍失败就写日志并返回 ok: false
- 不抛异常,不改动其他文件
先给类型定义和函数签名,我确认后再写实现和单元测试。
这条提示里每一句都对应一个验收点:技术栈决定写法,环境变量决定配置来源,返回类型决定调用方怎么接,超时和重试决定失败行为,最后一句限制改动范围。少写哪一条,就得在 review 时补哪一条。
写完先跑类型检查和测试,再看 diff。只有这三样都过,才谈得上合并。
先定接口,再填实现
验收点管的是交付顺序,接口管的是依赖顺序。写路由、数据模型这类模块时,先把函数签名和返回类型定下来,再填业务:
- 先让它列接口:有哪些函数、入参出参、会碰哪些表;
- 再写失败分支:参数不合法、找不到记录、权限不足,各自返回什么;
- 然后补正常路径;
- 最后生成测试,覆盖前三步列出的每种情况。
比如新增一个商品接口,提示可以这样写:
参照 src/api/users.ts 的结构,为 products 建路由骨架。 先只列 CRUD 四个处理函数的签名和返回类型,不要写业务逻辑。 错误处理沿用项目现有的中间件,不要自己发明格式。
骨架确认后再逐段填。这样每一步的 diff 都短,出了问题也知道是哪一轮引入的。需求本身还没说清时,先看如何把需求讲清楚,比反复改代码省事。
三种最常见返工
| 现象 | 为什么 | 怎么办 |
|---|---|---|
| 生成结果引入新依赖 | 提示里没说可用范围 | 写死「不新增依赖,只用运行时自带能力」 |
| 错误处理只有一层捕获 | 「健壮一点」不是可执行要求 | 列出参数校验、超时、重试、日志四项,逐项验收 |
| 缩进引号与项目不一致 | 靠形容词描述风格,没给配置 | 让它按仓库里的格式化配置跑一遍,再看 diff |
同一类问题连续出现两次,就把对应的限制补进规范文件,别等第三次再解释一遍。
交付前自己跑一遍测试,或者让它跑完把输出贴出来。它说通过不算数,命令说通过才算。遇到同类任务反复出现的问题,可以考虑固化成可复用的做法,参见提示词模板。
生成只是起点,读得懂才敢合并。下一节从一个陌生文件读起:基础代码理解。
自测
先自己回答,再展开对照;答不上来就回到对应小节。01同样一句需求,为什么在练习里够用,放进项目却要重写?看答案
一句话只描述了功能,没有交代技术栈、命名习惯、出错行为和改动边界。模型只能给通用写法,落到具体仓库自然处处不合。
02生成完代码,除了看它自己的总结,还应该看什么?看答案
看实际改动范围,确认有没有碰任务之外的文件;再跑测试或示例,用命令结果判断,而不是用它的描述判断。