3 人 5 个月 100 万行代码零手写!Harness Engineering,重新定义 AI 时代程序员的核心能力

0 阅读17分钟

兄弟们,先问个扎心的问题:你是不是天天打开 GPT,把需求粘进去,它给你吐一堆代码,你改一下午 bug,最后还是自己重写了大半?你是不是觉得 AI 写代码也就那样,吹得凶,实际用起来还没自己手写快?你是不是团队里唯一一个能看懂 AI 写的代码的人,最后兜底的还是你?

别怀疑,不是 AI 不行,是你用 AI 的方式,从根上就错了。

2026 年 2 月,OpenAI 公开了一项炸穿整个开发圈的实验:一个 3 人的工程师团队,用 5 个月时间,从零构建了一个拥有百万行代码、数百名内测用户的生产级产品。最离谱的是 ——整个项目没有一行代码是人类手写的,从应用逻辑、测试用例、CI 配置、文档到监控大盘,全由 Codex 智能体完成,耗时仅为传统人工开发的 1/10。

更扎心的是 Anthropic 的同步实验:哪怕是 Opus 4.5 这种顶级模型,没有配套的工程方法,也无法从零构建一个可用的生产级 Web 应用。

这个让 OpenAI 把开发效率拉满的方法,就是今天的主角 ——Harness Engineering(驾驭工程) 。它不是让 AI 给你当打字员,而是彻底重构了软件开发的逻辑:人类掌舵,智能体执行。人类的核心工作不再是写代码,而是设计环境、明确意图、构建反馈回路,让 AI 智能体可靠地完成所有编码工作。 image.png

这篇文章,我会把 OpenAI 的一手实践拆解成可直接套用的落地方法,帮你从 “AI 的工具人”,变成真正驾驭 AI 的工程师。

一、先搞懂:Harness Engineering 到底颠覆了什么?

1.1 你用 AI 写代码的方式,从根上就错了

现在 99% 的程序员用 AI 写代码,本质都是 “Copilot 模式”:你拆需求,你定方案,AI 帮你补代码,你改 bug,你做 CR,你兜底上线。说白了,AI 就是个帮你省点键盘敲击次数的助理,核心的工作还是你在做,甚至因为要改 AI 的烂代码,工作量反而更大了。

而 Harness Engineering,是完全反过来的 “智能体优先模式”:

  • 人类只做一件事:定义 “做什么” 和 “不能做什么”,也就是业务意图、架构规则、验收标准
  • 剩下的所有事:怎么实现、写代码、写测试、做 CR、修 bug、上线,全由智能体自主完成
  • 人类全程不手写一行代码,只在需要做决策判断的时候介入,其余时间只负责优化系统本身

image.png image.png

OpenAI 的团队给这个模式定了一个铁律:不手动编写代码。哪怕是一行配置、一个工具函数,都必须由 Codex 生成,人类绝对不直接修改代码。正是这个看似极端的规则,倒逼他们找到了让 AI 真正释放生产力的方法。

1.2 重新定义工程师的核心角色

在 Harness Engineering 的模式下,工程师的工作内容发生了本质的变化:

  • 从 “写代码的人”,变成了 “设计系统的人”
  • 从 “执行者”,变成了 “规则制定者和掌舵人”
  • 核心能力从 “编码熟练度”,变成了 “意图定义、架构设计、反馈闭环搭建” 的能力

OpenAI 团队在实验早期踩了最大的坑:一开始进展比预期慢得多,不是 Codex 能力不行,而是环境的规范不够明确。智能体没有对应的工具、抽象层和规则约束,根本不知道该往哪个方向走,自然做不出有用的东西。

所以他们最终明确:Harness 模式下,工程师的核心任务,永远不是自己上手写代码解决问题,而是追问一个问题:究竟还缺什么能力?我该怎么让这个能力对智能体来说,既清晰可读,又可强制执行?

二、Harness Engineering 的 4 大核心落地法则(看完直接套用)

2.1 法则 1:把代码仓库变成唯一的记录系统,给智能体一张「导航地图」,而不是一本说明书

智能体在大型项目里干活,最大的挑战就是上下文管理。OpenAI 团队最早踩的坑,就是搞了一个超大的AGENTS.md文件,把所有给智能体的指令、规则、规范全写在里面,结果直接翻车了。

他们总结了大而全的指令文件的四大原罪:

  1. 上下文是稀缺资源:大文件会挤掉任务、代码和相关文档的空间,智能体要么错过关键约束,要么对着错误的规则优化
  2. 全是重点等于没有重点:指令太多,智能体只会做本地模式匹配,不会有意识地按规则导航
  3. 内容会快速腐烂:庞杂的手册很快就会变成陈旧规则的坟场,智能体根本分不清哪些规则还有效
  4. 无法验证:单个大文件没法做机械检查,规则和代码的漂移不可避免

最终他们找到的正确解法,是AGENTS.md从百科全书,变成一张导航地图

image.png

核心设计原则只有 3 条:

  1. AGENTS.md只做导航,不写细节:整个文件控制在 100 行以内,只告诉智能体 “你需要的 XX 信息,去 XX 目录的 XX 文件里找”,实现渐进式披露,不会一上来就把智能体淹没在信息里
  2. 所有知识必须结构化、版本化、可验证:架构设计、产品需求、执行计划、技术债务、团队规范,全部分门别类放在docs/目录下,和代码一起版本控制。专职的 Lint 和 CI 任务会自动验证文档的有效性、交叉链接是否正确,还有专门的 “文档园艺智能体”,定期扫描过时的文档,自动发起修复 PR
  3. 智能体看不到的知识,就是不存在的:团队在 Slack 里达成的架构共识、飞书文档里的需求、你脑子里的隐性规则,只要没编码到代码仓库里,对智能体来说就等于不存在。就像晚入职 3 个月的新员工,根本不知道你们私下定的规矩,自然会写出不符合预期的代码。

可直接套用的落地动作:今天就打开你的项目,把给 AI 的指令从大文档里拆出来,建一个结构化的docs/目录,写一个 100 行以内的AGENTS.md导航文件,把所有团队共识都放进仓库里。

2.2 法则 2:优先优化「智能体可读性」,而非人类可读性

在 Harness 模式下,有一个彻底的认知反转:代码的第一读者,不再是你的同事,而是智能体。所有的架构设计、代码规范、依赖选择,都要优先考虑 “智能体能不能看懂、能不能推理、能不能修改”,其次才是人类的阅读习惯。

OpenAI 团队的核心实践,就是把架构约束,从 “写在文档里的规范”,变成 “可强制执行的不变量”。他们给整个应用定了一套严格的分层架构规则,每个业务域都只能按照固定的依赖方向写代码,不允许任何例外。

image.png 架构规则非常明确:

  • 每个业务域内,代码只能 “向前” 依赖:Types → Config → Repo → Service → Runtime → UI,不允许反向依赖
  • 认证、遥测、功能开关等横切关注点,只能通过Providers这一个显式接口进入,不允许散落在业务代码里
  • 所有规则都通过自定义的 Lint 和结构测试机械强制执行,不符合规则的代码根本合不进去

这套架构,在传统开发里,一般是几百人的大团队才会搞的严格规范,但在智能体优先的模式里,这是早期必须做的先决条件 ——只有有了严格的约束,智能体的开发速度才不会下降,架构才不会漂移

在依赖选择上,他们也有一个反常识的原则:宁肯让智能体重写功能子集,也不用黑盒的第三方库。对智能体来说,那些所谓的 “最佳实践” 库,如果内部逻辑不透明、API 不稳定、训练集里的案例少,就是灾难。反而那些看起来 “枯燥” 的技术,因为可组合性强、API 稳定、文档完善,更容易被智能体理解和使用。

比如他们没有用通用的p-limit并发控制包,而是自己实现了一个带并发控制的 map 工具函数,和 OpenTelemetry 链路追踪深度集成,100% 测试覆盖,行为完全符合团队的预期,智能体可以直接看懂、修改和复用。

这里给大家一个 Java 版本的可直接复用的实现,完全符合 Harness Engineering 的设计原则:

/**
 * 智能体友好的并发处理工具类
 * 核心设计原则:
 * 1. 全链路集成OpenTelemetry追踪,可观测性对智能体完全开放
 * 2. 行为明确可预测,无黑盒逻辑,智能体可直接推理修改
 * 3. 100%测试覆盖,边界条件清晰
 * 4. 符合团队架构规范,无外部黑盒依赖
 */
public class ConcurrentMapUtils {

    private static final ExecutorService DEFAULT_EXECUTOR = Executors.newFixedThreadPool(10);
    private final Tracer tracer;

    public ConcurrentMapUtils(Tracer tracer) {
        this.tracer = tracer;
    }

    /**
     * 带并发控制的批量映射处理
     * @param input 输入列表
     * @param mapper 映射函数
     * @param concurrency 并发数
     * @return 处理后的结果列表
     * @param <T> 输入类型
     * @param <R> 输出类型
     */
    public <T, R> List<R> mapWithConcurrency(List<T> input, Function<T, R> mapper, int concurrency) {
        Span span = tracer.spanBuilder("ConcurrentMapUtils.mapWithConcurrency")
                .setAttribute("input.size", input.size())
                .setAttribute("concurrency", concurrency)
                .startSpan();

        try (Scope scope = span.makeCurrent()) {
            ExecutorService executor = Executors.newFixedThreadPool(concurrency);
            List<CompletableFuture<R>> futures = input.stream()
                    .map(item -> CompletableFuture.supplyAsync(() -> {
                        Span itemSpan = tracer.spanBuilder("mapItemProcess")
                                .setAttribute("item.hash", item.hashCode())
                                .startSpan();
                        try (Scope itemScope = itemSpan.makeCurrent()) {
                            return mapper.apply(item);
                        } finally {
                            itemSpan.end();
                        }
                    }, executor))
                    .collect(Collectors.toList());

            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
            executor.shutdown();

            List<R> result = new ArrayList<>();
            for (CompletableFuture<R> future : futures) {
                result.add(future.get());
            }

            span.setAttribute("result.size", result.size());
            return result;
        } catch (Exception e) {
            span.recordException(e);
            throw new RuntimeException("Concurrent map processing failed", e);
        } finally {
            span.end();
        }
    }
}

同时,他们还有一个非常重要的原则:只强制不变量,不微观管理实现。比如他们只要求 “必须在边界处解析数据形状”,但不规定必须用哪个库,智能体喜欢用 Zod 就用 Zod,想用别的也可以。就像管理团队,你只需要定好目标和红线,具体怎么干活,给执行者足够的自主权。

2.3 法则 3:构建全链路「智能体可读的反馈闭环」,让 AI 自己搞定 QA 和 CR

当智能体的代码吞吐量上来之后,最大的瓶颈是什么?OpenAI 团队给出的答案是:人工 QA 和人工 CR 的能力

人类的时间和注意力是固定的,你一天最多能审十几个 PR,测几个功能,但智能体一天能生成几十个 PR,人工根本跟不上。所以 Harness 模式的核心,就是把所有的验证环节,都变成 “智能体可读” 的,让 AI 自己搞定测试、验证、CR、bug 修复的全流程。

他们做了两个核心的改造:

  1. 把应用的可观测性,完全对智能体开放日志、指标、链路追踪,全部通过本地可观测性堆栈展示给 Codex,智能体可以直接用 LogQL 查日志,用 PromQL 查指标,用 TraceQL 查链路。以前需要你登录监控平台查日志定位的问题,现在智能体自己就能搞定。

比如你只需要给一句提示:“确保服务启动时间不超过 800ms”,“这四个核心用户流程的耗时不能超过 2 秒”,智能体就能自己去查指标,修改代码,验证效果,完全不用你插手。

  1. 把 UI 交互能力,完全对智能体开放他们把 Chrome DevTools 协议接入了智能体运行时,做了专门处理 DOM 快照、屏幕截图、页面导航的技能。智能体可以自己启动应用实例,复现用户反馈的 UI bug,截图记录,修改代码,重启验证,再截图证明修复效果,整个流程完全自主。

image.png 基于这个闭环,OpenAI 团队实现了真正的端到端自主交付:你只需要给一句提示,智能体就能自己完成从需求验证、代码开发、测试验证、CR、修复、合并上线的全流程,只有在需要做业务判断的时候,才会交给人类处理。

最夸张的是,他们经常看到 Codex 在单个任务上连续工作 6 个小时以上 —— 通常是在人类睡觉的时候。你晚上下班前提一个需求,第二天早上起来,代码已经写好,验证完毕,PR 已经提交,就等你做最终确认了。

这里也给大家一个可直接套用的 Java 示例,展示如何在 API 边界做严格的数据校验,让智能体可以清晰地理解规则,自主完成验证:

package com.harnessengineering.controller;

/**
 * 用户管理控制器
 * 遵循Harness Engineering架构规范:
 * 1. 在边界处严格解析数据形状,所有入参必须经过校验
 * 2. 依赖方向严格遵循:Controller → Service → Repo → Types
 * 3. 横切依赖(认证、日志、追踪)仅通过Providers注入
 */
@RestController
@RequestMapping("/api/v1/users")
public class UserController {

    private final UserService userService;

    // 仅通过构造器注入,符合架构依赖规则
    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 创建用户
     * 核心规则:在API边界完成所有数据校验,不允许非法数据进入内层服务
     * 自定义Lint规则检查点:
     * - 入参必须添加@Valid注解
     * - 入参DTO必须有明确的校验注解
     * - 不允许在Controller层实现业务逻辑
     */
    @PostMapping
    public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateRequest request) {
        // 边界处完成数据解析与校验,内层无需处理非法数据
        User createdUser = userService.createUser(request);
        return ResponseEntity.ok(createdUser);
    }
}

2.4 法则 4:建立自动化「垃圾回收机制」,对抗 AI 代码的熵增

完全自主的智能体开发,也带来了一个新的问题:架构漂移和技术债务的加速累积

Codex 会复现代码仓库里已有的模式,哪怕是不好的、不均衡的模式。比如有一个地方写了不规范的代码,智能体就会照着这个模式写更多不规范的代码,时间一长,整个代码库就会变成 “AI 残渣” 的垃圾堆,架构完全漂移。

OpenAI 团队一开始的解法,是每周五花 20% 的时间,人工清理这些 AI 残渣。但很快就发现,这个方法完全没有可扩展性 —— 代码增长的速度,远远超过了人工清理的速度。

最终他们找到的解法,是把团队的 “黄金原则” 直接编码到代码仓库里,建立循环清理流程,让 AI 自己纠正自己

他们的 “黄金原则” 示例:

  1. 优先使用共享的工具包,不允许在业务代码里手写重复的辅助函数
  2. 不允许 “YOLO 式” 的探测数据,必须在边界处验证数据结构,或者使用类型化的 SDK
  3. 所有业务代码必须遵循分层架构规则,不允许反向依赖
  4. 所有日志必须结构化,符合可观测性规范

基于这些原则,他们会定期运行一组后台 Codex 任务,扫描代码库中的偏差,更新质量评分,发起有针对性的重构 PR。这些 PR 绝大多数都可以在一分钟内完成审查,甚至自动合并。

这个机制,就像 JVM 的垃圾回收一样。技术债务就像高息贷款,小额高频地偿还,永远比让债务累积到爆炸再一次性痛苦解决要好得多。人类的品味和规则,只要被编码到系统里,就会持续应用到每一行新生成的代码上,从根源上遏制架构漂移。

三、普通人从零落地 Harness Engineering 的 3 步起步法

看到这里,你可能会说:OpenAI 有 GPT-5,有 Codex,我们普通团队根本没法比。其实不是,Harness Engineering 的核心是方法,不是模型。哪怕你只用 GPT-4o,也能从这 3 步开始,落地这套方法。

第一步:搭建最小化仓库知识体系,先把规则写进仓库

不用一上来就搞复杂的架构,先做 3 件事:

  1. 把你给 AI 的所有指令、规范、团队共识,从聊天记录、飞书文档里,全部搬到代码仓库的docs/目录下
  2. 写一个 100 行以内的AGENTS.md,只做导航,告诉 AI “什么信息去哪里找”
  3. 定 2-3 条最核心的架构不变量,比如 “Controller 层不能写业务逻辑”、“所有入参必须在边界处校验”,写成最简单的 Lint 规则,强制执行

第二步:构建最小化反馈闭环,让 AI 能自己验证自己的代码

不用一上来就搞全链路可观测性,先做最基础的闭环:

  1. 把单元测试、集成测试的执行权限对 AI 开放,让它写完代码能自己跑测试,验证是否通过
  2. 把 CI/CD 的流程对 AI 开放,让它能自己看到构建失败的日志,自己修复
  3. 定好 CR 的规则,让 AI 先自己做 CR,自己检查代码是否符合规范,再提交给人类

第三步:建立「零手写」纪律,从最小任务开始迭代

给自己定一个铁律:从今天起,不手动修改任何一行代码。哪怕是一行配置,一个 bug 修复,都必须通过提示 AI 来完成。

先从最小的任务开始,比如写一个工具类,改一个简单的 bug,让 AI 完整走完 “需求→代码→测试→CR→修复→合并” 的全流程。每完成一个任务,就复盘一下:AI 哪里没做好?是缺了什么规则?还是缺了什么上下文?然后把这些补充到仓库的知识体系里,不断迭代优化。

慢慢你就会发现,你给的规则越清晰,AI 的表现就越好,你的效率就越高。

四、避坑指南:OpenAI 踩过的 4 个大坑,别再踩了

  1. 别用超大指令文件,上下文是最稀缺的资源永远不要给 AI 一个几百行的大指令文档,它根本记不住。用导航地图的方式,让它按需获取信息,才是正确的做法。
  2. 别微观管理实现,要强制不变量,而非规定细节不要告诉 AI “这个函数要怎么写”,只需要告诉它 “这个函数要实现什么效果,必须遵守什么规则”。管得太细,只会限制 AI 的能力,还会让代码变得更难维护。
  3. 别用人工兜底纠错,要把纠错能力编码进系统不要 AI 写出来的代码有问题,你就自己上手改了。正确的做法是,找到问题的根源:是缺了规则?还是缺了反馈能力?然后把这些补充到系统里,让 AI 下次自己能避免,自己能修复。人工兜底,只会让你永远困在 “改 AI 烂代码” 的循环里。
  4. 别忽视熵增,技术债务要小额高频偿还不要等代码库烂了再重构,要建立定期的 “垃圾回收” 机制,把你的代码规范编码成规则,让 AI 定期扫描、自动重构,把技术债务消灭在萌芽状态。

结尾

最后,我想跟大家说:Harness Engineering,从来不是让程序员失业,而是让程序员真正回归软件工程的本质。

过去几十年,我们被太多重复的编码、改 bug、CR 工作困住了,忘了软件工程的核心,是设计系统、定义规则、解决业务问题。而 Harness Engineering,就是把程序员从重复的体力劳动里解放出来,让我们真正去做那些只有人类能做的、更有价值的事情。

未来的程序员,核心竞争力绝对不是手写代码的速度,而是定义意图、设计系统、驾驭智能体的能力。AI 时代,淘汰你的永远不是 AI,而是不会用 AI 的人。

你有没有用 AI 写代码踩过的坑?或者对 Harness Engineering 有什么想法?评论区聊聊,我会把大家的问题整理成后续的落地实操手册。