这把编辑器切换到终端手边,Codex 从仓库里翻出一堆报错日志,自己列了个排查清单,然后问我:“要不要先跑一下这个测试确认问题?”那一刻我就知道,这个工具跟普通的聊天式助手不太一样。它不是等你把代码复制给它,而是自己钻进你的项目里看代码、跑命令、改文件,再拿测试结果回来跟你对答案。用了一段时间之后,我最大的感受是:能不能用顺手上手,七分靠习惯,三分靠工具本身。这篇就把我实际用下来最值的十个小技巧拆开讲,适合正在折腾 Codex CLI、想让它在真实项目里真正替你干活的开发者。
1. 别急着让它动手:先把主场布置清楚
很多人第一次用 Codex 时,上来就甩一句“帮我修一下登录模块”,结果它要么找不到文件,要么改了一堆无关代码。问题不在工具,在于你还没告诉它“战场”在哪。Codex 确实能自己读目录结构,但读取目录和真正理解一个项目的上下文是两码事。
1.1 Codex 默认能感知什么
Codex CLI 在项目目录里启动时,会先扫描文件树,拿到仓库的整体结构,如果你项目里有 README、文档目录、配置文件,它也会一并纳入上下文。这个机制很好用,但也带来一个副作用:项目一大,它会把注意力分散到跟任务无关的模块上。
我实测过一个小项目,仓库大概两万行代码,让 Codex 改其中一个服务接口的鉴权逻辑。没做任何约束时,它先花了大段上下文去分析 Docker 配置和前端页面,虽然最后也改对了,但中间绕了不少路,token 消耗也明显增加。后来我把相关文件路径、模块说明写成一个简短的TASK.md,它直接按图索骥,一次就改到位。
你可以试试这么做:在项目根目录放一个任务说明文件,写清楚“本次要改哪些文件、哪些文件不要动、验收标准是什么”。Codex 天然会优先读这类文档,等于给它的探索圈了个范围。
1.2 喂饱上下文:我的三件套
我在实际项目中逐渐固定了一套“上下文三件套”,每次让 Codex 干稍大一点的活之前都会确认一下:
README.md不能是空壳,至少要写清楚模块划分、启动方式、主要命令。- 涉及特定模块改动的任务,直接在提问里点名文件路径,别让它满仓库猜。
- 涉及业务逻辑的改动,在一句话之外补上背景:“这个函数是给哪个页面用的、上游数据是什么格式、下游期望拿到什么”。
这套做法特别适合那种“项目是我同事写的、我还没完全看懂”的场景。你说不清楚的事,Codex 往往也猜不对,但你把上下文喂得越像一份需求文档,它输出的代码就越像是你亲手写的。
2. 同一个意思,两种问法,结果天差地别
用了一阵之后我发现,Codex 对模糊表述的容忍度其实不低,但它会把模糊理解成一个它最顺手的版本,而不是你心里那个版本。比如“优化一下这段代码”,它会默认朝着“精简函数”方向走,如果真正需求是“降低接口延迟”,它就帮不上忙了。
2.1 “任务 + 约束 + 验收”三段式
我现在跟 Codex 沟通,基本都按“任务 + 约束 + 验收”的结构来。举个例子,我以前会说:
帮我写个批量导入用户的功能。
现在我一般这么下指令:
在
src/scripts/import_users.py里添加一个批量导入用户的功能,输入是 CSV 文件路径;要求:跳过表头、自动过滤重复邮箱、导入完成后输出成功与失败数量;验收:用tests/fixtures/users.csv跑一遍,能正确导入 8 条有效数据并跳过 2 条重复邮箱数据。
结果是,它写出来的代码思路清晰,还会主动帮你把测试 fixture 准备好,省去了来回解释的麻烦。就我个人的体感,这比“多轮对话调教”效率高一倍不止。
2.2 不要只用否定句纠正
很多人在多轮对话里发现 Codex 做错后会说“不对,不是这样”。说实话,这种反馈对模型几乎没有任何增量信息,它只能猜哪里不对。更有效的做法是连上原因和期望:
“这里不要用全局锁,改成数据库行级锁,因为现在这个服务是多实例部署的,全局锁跨实例没用。”
你给的“为什么”越具体,它后续的调整就越少跑偏。这一点在维护老项目时尤其重要,老代码里经常有一堆看着不合理但牵一发动全身的“历史原因”,你提前讲一句,它就不会踩雷。
3. 在线协作式排错:先出方案再动代码
在实际项目里,让 Codex 直接“一步到位”改完一个复杂需求,翻车风险其实不小。更稳的路子是让它先给方案,你确认了再让它动手。
3.1 它真的很适合当“读代码的副驾驶”
排查线上问题的场景,Codex 的价值比“写新功能”还要大。比如前不久我们某个服务的内存占用异常上涨,我先让它把可疑的内存占用点全部找出来,再给出每个点值得怀疑的理由。它网了一堆defer没关连接、全局缓存越积越大、日志切割不及时之类的点,然后我拍板先查连接池的那个——果然方向是对的,最后定位到是一个连接泄漏。
这部分使用体验很像和一个熟悉代码库但不乱动代码的同事聊天。你让它“查”而不是“改”的时候,它的发挥空间更大,也不太会带来副作用。
3.2 “方案确认”这个小步骤真的不能省
有人觉得让 Codex 先出方案再改代码是多一轮往返,浪费时间。我自己的体验是:这个环节省不得。因为它一旦动起手来,改动范围会扩散,而“出方案”本质上是在跟它对齐范围和思路。方案确认的成本远低于改完发现方向不对再回滚的成本。
我也常用一个折中的方式:在同一个交互里,先让它“简要列出修改要点”,然后立刻接一句“按这个方案开始改”。这样既拿到确认,又不用等第二轮。
4. 用好分支与回滚,把翻车成本降下来
前面说的都是怎么让 Codex 干得更顺,但工具用得再熟也有意外。我的保险策略是:给它足够的操作空间,但把这个空间关在“笼子”里。
4.1 直接在临时分支上干活
我踩过一次比较痛的坑:让 Codex 在main分支上改接口,它改到一半又把关联模块的格式顺手“优化”了,结果 diff 里混进来一堆无关变动。从那以后,我养成了习惯:给它开一个新分支,比如feature/codex-import-users,明确告诉它在这个分支里干,改完我看完 diff 再决定要不要合回主分支。
这个习惯的收益是你随时可以git diff看它到底动过哪些文件,逐段检查;不满意就直接把分支删了重来,心理负担小很多。
4.2 让它自己控制 bash 执行权限
Codex CLI 在执行命令时通常会有授权确认机制,有的模式还会限制它只能跑白名单命令。我实际使用时的折中方案是:允许它执行测试、构建、git status 这类命令,但像rm -rf、直接推送远端、改 git 配置这类高危操作,要么拒绝,要么在配置里直接禁掉。你可以在相关配置文件中设置沙箱级别,让它在受控环境里跑。特别是当它说“我想重装一下依赖”的时候,我都会多看一眼命令本身,而不是直接放行。
提示:授权它跑命令前,先确认一下当前所在的仓库是克隆出来的“副本”,不是本地正版数据目录,能省掉不少后悔药。
5. 让测试替你盯着它,而不是肉眼检视每一行
让 Codex 写代码之后,没有人会一行一行核对它的逻辑。最省心的验收方案就是:把测试作为“裁判”,让它自己跑给你看。
5.1 先写测试,再写实现
我现在越来越喜欢“测试先行”的协作方式。先让 Codex 根据需求把测试用例写出来,我看一眼测试覆盖的点对不对,然后让它去实现功能,目标是跑通测试。
这么做的额外好处是,Codex 写实现时会自己对着测试代码调整接口行为,生成的函数签名、异常处理往往比没有测试时靠谱很多。有一回它甚至自己发现一个边界条件在测试里没覆盖到,主动补了一个用例,这是我当时没想到的。
5.2 报错信息是最好的素材
Codex 用的是命令行工具,所以你完全可以把终端里那一坨报错直接丢给它,让它看着报错去反查代码,一通操作下来往往比我人肉百度半天的排查链路还要顺畅。你只需要在贴报错的同时补一句上下文,“这是我们下单模块里跑集成测试的时候出现的”,它就能在仓库里定位到相关代码并开始排查。
这种协作方式相当于请了一个永远不会嫌烦的队友,你只要盯着它的思路,再适当叫停。
6. 十个越用越顺手的实操清单
前面几章聊的是理念与习惯,这里把我觉得最值得直接照抄的十个细节整理成了一张表,方便日常对着用。
| 技巧 | 什么时候用 | 具体操作 | 我踩过的坑 |
|---|---|---|---|
| 任务描述文件 | 多文件改动 | 根目录放TASK.md写清文件与验收 | 不放时它误改无关模块 |
| 三段式提问 | 每次下指令 | 任务 + 约束 + 验收 | 只说“优化一下”时会偏题 |
| 路径点名 | 改动固定模块 | 直接给出文件路径 | 让它猜会绕远路 |
| 先方案后动手 | 复杂需求 | 先让它列修改点,确认后执行 | 直接改完发现方向不对 |
| 临时分支 | 几乎每次 | 单独开功能分支干活 | 在主干上被迫做回滚 |
| 权限白名单 | 使用 bash 时 | 配置里限制高危命令 | 放行后它乱装依赖 |
| 测试当裁判 | 涉及逻辑 | 先补测试再补实现 | 肉眼检视漏边界 |
| 报错直接贴 | 排错场景 | 终端异常直接扔给它 | 复述问题反而误导 |
| 保留同一会话 | 连续改动同一个模块 | 多轮指令不要中途新建会话 | 新会话忘记上下文后改错方向 |
| 及时回退重开 | 输出质量崩坏 | 发现思路不对果断重置 | 硬着头皮兜底更费时 |
这张表的前八条前面都展开了,最后两条我再多说两句。
6.1 关于“保留会话”和“果断重置”
Codex 这类基于对话的工具,多轮上下文就是它的记忆。连续处理同一个模块的改动时,我尽量不新建会话,而是顺着上一轮继续补充需求。但如果对话超过十几轮,或者它开始重复犯同一个错误,这时候硬聊下去只会浪费额度。我的做法是:直接新建一个会话,但把前文的结论和进度在开头概括一遍,让它接过记忆,重新干活。
说实话,这两条技巧看似简单,实际是决定“顺不顺手”的关键:前者让你省去重复解释,后者让你避免在一条歪路上越走越远。
6.2 最后几句体会
把 Codex 当“结对同事”而不是“搜索引擎”,是我用下来最大的转念。不是每次提问都要变成代码改动,很多时候让它讲讲思路、列列检查项,反而能帮你照见自己忽略的盲区。尤其是我在改前人留下的老代码时,最怕那种“这个函数怎么没人敢动”的诡异逻辑,Codex 帮我把它一条条拆出来分析,那种体验确实比自己硬啃要轻松不少。工具在迭代,习惯也得跟着迭代,把这十个小点融进日常流程之后,你会发现它不仅“能用”,而是真的“好用”。