OpenAI 上周整理了一篇文章,介绍内部是怎么用 Codex 的。使用 Codex 的团队包括安全、产品、前端、API、基础设施和性能工程。
从接手的任务来看,Codex 主要的使用场景为:理解复杂代码库、重构和迁移、性能优化、补测试、交付新功能,以及在紧急情况下排查故障等等。
下面是 7 个 Codex 典型的使用场景:
场景 1:代码理解
Codex 的一个典型用法,就是让工程师快速看懂不熟悉的代码库。
像是新人刚接手项目,或是工程师在调试、排查事故时,一般要先搞清楚:核心逻辑在哪、服务之间的调用关系、数据是怎么流转的。工程师们会先用 Codex 做些背景信息梳理,尤其是在文档不完整、系统关系比较复杂时,Codex 可以帮他们迅速了解上下文。
在事故响应时,Codex 也会用来追踪组件之间的交互,或是分析故障状态是怎么在系统里扩散的。
团队反馈:
一名内部的检索系统性能工程师说,每次修复 bug 时,他都会先用 Codex 的询问(Ask)模式,检查代码库里是否还有同类问题。
如果你要让 Codex 帮忙理解代码,试试这样问:
这个仓库里的登录 / 鉴权逻辑是在哪里实现的?
一个请求从入口进来,到最后返回响应,中间大概经过了哪些流程?
[某个模块名]会和哪些模块打交道?出错的时候一般是怎么处理的?
场景 2:重构与迁移
Codex 也很适合处理那种“改一处不够,得改一片”的任务。
比如更新 API、调整某种代码模式,或是把项目迁移到新的依赖,相关改动通常会分散在多个文件、多个包里。这时,普通的查找替换会不太稳,因为它不一定理解代码结构,也看不懂依赖关系,容易改挂了。
Codex 可以帮工程师先把这类改动统一跑一遍,尽量保证不同地方的写法一致。OpenAI 内部也会用它做一些代码清理工作,比如拆分过大的模块、替换旧写法,或是提前整理代码,方便后面补测试。
团队反馈:
一位 ChatGPT 网页版后端工程师说,Codex 曾把旧版 getUserById() 调用替换为新的服务模式,并创建了 PR。原本需要数小时的工作,只要几分钟就完成了。
如果你要让 Codex 帮忙做重构,试试这样问:
这个文件有点太大了,帮我按不同职责拆成几个模块,并给每个模块补上测试。
把代码里基于 callback 的数据库访问方式,统一改成 async/await。
场景 3:性能优化
在做性能调优,或是处理可靠性问题时,工程师们会让 Codex 先看一遍那些比较慢、比较吃内存的代码路径。常见的情况包括:循环写得不够高效、重复做同一件事,或者数据库查询成本太高。
这时,Codex 会先指出可能的问题点,再给出一些更合适的写法。除此之外,它也会用来检查代码里是否存在一些高风险、过时但还在使用的写法,帮助团队减少后续的维护成本,也降低改代码时引入新问题的概率。
团队反馈:
一位 API 可靠性基础设施工程师说,他会用 Codex 扫描代码中重复的高开销数据库调用。Codex 能识别热点路径,并生成批量查询语句,方便后面继续调优。
如果你要让 Codex 帮忙做性能优化,试试这样问:
这段循环有点吃内存,帮我优化一下,并说明为什么你的写法会更快。
帮我看看这个请求处理逻辑里,有没有重复执行、成本比较高的操作,哪些地方适合加缓存。
这个函数里有多次数据库查询,帮我看看能不能改成更高效的批量查询。
场景 4:测试覆盖率
Codex 也适合用来补测试,尤其是那些测试覆盖不够,甚至还没写测试的地方。
比如在修 bug 或者重构代码时,让 Codex 先想下:这里应该补哪些测试?哪些边界情况容易出问题?哪些失败路径需要覆盖?
如果是新写的代码,Codex 也可以根据函数签名和周围代码,先生成一版单元测试或集成测试。
它比较有用的地方,是能提醒你一些容易漏掉的情况,比如空输入、最大长度,或者一些不常见但合法的状态。上面这些情况,人写第一版测试时容易忘掉。
团队反馈:
一位 ChatGPT 桌面版前端工程师说,他晚上会让 Codex 处理覆盖率偏低的代码模块,第二天醒来就能拿到可直接运行的单元测试 PR。
如果你要让 Codex 帮忙补测试,试试这样问:
帮这个函数写一组单元测试,重点覆盖边界情况和可能失败的路径。
给这个排序工具写一组 property-based test,看看不同输入下排序结果是不是稳定。
帮我扩充这个测试文件,把 null 输入、非法状态这些漏掉的场景补上。
场景 5:提升开发速度
Codex 也会被用在功能开发的前期和收尾阶段。
比如一个新功能刚开始做时,先让 Codex 搭一版基础框架:生成目录、模块、API stub,让代码先跑起来,这样就不用每个基础文件都手动从头写。
到项目快发布的时候,它也可以帮忙处理一些小但必要的工作,比如排查 bug、补齐最后一点实现、生成发布脚本、埋点代码或者配置文件。
此外,还有一种用法,就是直接把用户反馈或者产品需求贴给 Codex,让它先生成初始代码。到后面,工程师再回来 review、修改和完善。
团队反馈:
一位内部工具团队的全栈工程师说,Codex 帮他们完成了 3 到 4 个低优先级修复。它们本来很可能会一直躺在 backlog 里,很久都排不上期,但 Codex 处理得不错,让这些小问题终于被解决掉了。
如果你要让 Codex 帮忙加快功能开发,试试这样问:
帮我搭一个新的
POST /eventsAPI 路由,先加上基础参数校验和日志记录。参考这段埋点代码模板,帮我生成一个新的 telemetry hook,用来记录新用户引导流程的成功和失败状态。
根据这份产品需求 / 用户反馈,先帮我写一版 stub 实现,后面我再来补细节。
场景 6:保持专注高效
Codex 也适用那些容易被打断的工作场景。
比如工程师一天里会议很多,或者正在值班,很难一直专注在同一件事上。这时候可以把没做完的工作、临时记下来的想法,或者一些探索性任务交给 Codex 先“接住”,等有空的时候再继续看、继续改。
团队反馈:
一位负责基础设施可观测性的 API 工程师说,他平时会把 Slack 讨论、Datadog trace、issue 这类信息丢给 Codex,让它先帮忙整理和推进,自己则继续处理优先级更高的事情。
场景 7:探索与创意构思
在一些没那么确定的探索性工作里,Codex 也很好用。
比如你想比较几种实现方案,看看某个设计决策是否合理,或者试试自己不太熟悉的代码模式,都可以让 Codex 先给一版思路。它不一定直接给最终答案,但可以帮工程师把不同方案的取舍、潜在问题和实现方向先列出来。
此外,还有一个很实用的用法:找类似问题。比如已经修了一个 bug,或者发现某个旧方法不该继续用了,就可以让 Codex 顺着这个模式去代码库里找一找,看看其他地方是不是也有类似写法。这样,方便后面的清理和防回归。
团队反馈:
一位检索系统性能工程师说,他每次修完一个 bug 后,都会问 Codex:代码库里还有哪些地方可能藏着类似问题?然后再把这些发现拆成后续任务。
如果你要让 Codex 帮忙做方案探索,试试这样问:
如果这个系统不走 request / response 模式,而是改成事件驱动,大概会怎么设计?
帮我找一下项目里还有哪些模块在手写 SQL 字符串,没有使用统一的 query builder。
帮我把这段代码改成更偏函数式的写法,尽量避免直接修改数据和产生副作用。
最佳实践
OpenAI 也总结了一些内部使用经验。简单来说,就是 Codex 更适合有结构、有上下文、可以反复调整的任务。
1. 大任务先用 Ask Mode
比较大的改动,不要一上来就让 Codex 直接写代码。
可以先让它在 Ask Mode 里给出实现方案,确认要改哪些文件、分几步做、可能有什么风险。方向没问题后,再切到 Code Mode 执行。
2. 把开发环境配好
Codex 的效果和开发环境关系很大。
启动脚本、环境变量、网络权限、测试命令这些信息越清楚,它越不容易卡在依赖、构建或测试错误上。
3. 像写 GitHub Issue 一样写提示词
给 Codex 下任务时,尽量写得像一个 GitHub Issue。
比如要改哪些文件、涉及哪些组件、参考哪个模块、预期行为是什么。信息越具体,结果越稳。
4. 把任务队列当成轻量 backlog
一些临时想到的小修复、探索性任务、没做完的工作,可以先丢进 Codex 的任务队列。
它不一定每次都要直接生成完整 PR,也可以先把事情推进一版,等你有空再回来 review。
5. 用 AGENTS.md 留长期上下文
如果一个仓库会长期用 Codex,可以维护一份 AGENTS.md。
里面可以放命名规范、业务规则、特殊约定、已知问题和依赖关系,减少 Codex 每次重新猜项目背景。
6. 多生成几版再比较
对于不确定怎么做的任务,可以让 Codex 同时生成几版方案。
然后从里面挑一版更合适的,或者把几版里有价值的部分合在一起。
小结
整体来看,OpenAI 内部使用 Codex 的方式并不复杂。一般是用在边界比较清楚、可以验证、可以 review 的工程任务里:读懂代码、做迁移、补测试、查性能问题、生成初始实现,或者处理一些暂时不想打断当前工作的零散任务。
所以 Codex 的重点不只是“写代码”,而是把明确的工程任务先推进到一个可以检查、可以继续修改的状态。