【Part 1】Harness Engineering 对程序员来说意味着什么?

22 阅读12分钟

image.png

在 AI 时代,人要学会 思考并执行对的事情,而不是 执着于把事情做对。由于 AI 无比擅长后者,人的价值就会不断趋近于0。传统的“打工思维”在 AI 时代会最快被淘汰

最近几周,在阅读过一系列 Harness Engineering 相关的博客、公众号文章、长视频,并且在日常工作深度使用 AI 辅助编程工具后,我尝试在本文中记录下自己的理解与思考。

什么是 Harness Engineering

Harness 意为马具、轭具,这里将 AI Agent 比喻成擅长奔跑且需要约束的马匹,它固然可以让我们走的更快更远,但只有套上缰绳、嚼头、鞍鞯这些马具,才能正确地奔向目的地。如果不加约束,也许会在错误的方向上越走越远,白白浪费时间、算力。

常见的几种 AI 辅助编程模式

我是2023年开始注册并使用 AI 工具的,当时高频使用的是 ChatGPT 网页端,尽管相比于今天的v5.4,当时模型的能力还略显稚嫩,但它已经能够与人类进行高质量的自然语言对话了。而逐渐习惯 AI 编程,则是最近一年开始的事。既然要探讨 AI 辅助编程,有必要梳理一下常见的模式,如下表。

AI 辅助编程模式举例特点不足
网页问答式ChatGPT,DeepSeek一问一答,消除搜索引擎带来的筛选成本难以维持长期会话,无法理解大型项目
代码补全Copilot,各种IDE插件具备一定的上下文意识,tab编程系统设计能力有限
代理式Codex,Claude Code(早期阶段)自然语言多轮交互,我看AI写代码缺乏长期记忆

【图】

这里列出本人曾经长期使用过的 AI 辅助编程模式,截至目前,使用最多的还是“代理式/Agent”。不过,为了解决缺乏长期记忆、对项目理解有限的问题,已经逐渐开始向 Harness Engineering 转变。

在我看来,AI 之所以在长会话的场景下表现不稳定,是单一的上下文机制导致的必然结果。AI 是一个初始能力很强的人,他可以做任何事情、完成任何任务,这是 AI 的优势,同时也导致了他的缺陷。由于上下文不可控,会出现以下两种问题:

  • 注意力分散:使用者提出新的问题时,AI 的注意力仍然停留在老的问题,导致将老问题带来复杂度引入到新问题的解答过程中。
  • 上下文腐烂:会话过长后,最早的记忆会被压缩/丢弃。

AI 辅助编程的三个阶段

关注点不同 的角度,按照时间顺序,可以将 AI 编程 由浅入深 划分为三个阶段。

注意这只是根据经验进行的划分,实际上并没有官方对此给出明确概念界定。

image.png

阶段一:Prompt 提示词优化阶段

这个阶段关心的,是如何写出 更好的提示词,使 AI 聚焦到某个特定问题上,很多时候需要人为构建好约束条件,防止 AI 没找到重点,导致发散思维天马行空;亦或找错了重点,在细枝末节上不停追问。因此产生了 提示词工程师 这样的岗位/技能。

阶段二:Context 上下文构建阶段

这个阶段开始着眼于维护长期会话的需求,由于大型项目持续迭代的需要,我们希望 AI 能够理解项目全景,并保持长期记忆。从而让 AI 在这样的框架下,完成细化的开发任务。因此促生了上下文管理这一核心讨论问题。这方面比较有代表性的是 “RAG(Retrieval-Augmented Generation,检索增强生成)”。通过向量数据库提供持久化存储,形成知识库。在未来的对话中,LLM 在收到问题后,先在知识库中检索,拼接上下文,然后再给出答案。

image.png

阶段三:Harness 系统工程阶段

Context 技术为 AI 赋予了长期记忆,使 AI 向“拟人化”迈出了重要的一步。初始状态下的 AI 像一本百科全书,可以对任何问题给出答案,但缺乏对项目现状的认知。我们常说,“要爱具体的人,而非抽象的人类”,在拥有长期记忆以后, AI 已经可以很接近具体的人了。而人只有记忆还不够,需要持续迭代、进化、成为特定工程范围内的专家。

我把这一阶段称为“系统工程阶段”,是因为此时关注的是 Agent 作为一个系统,应当具有分辨执行结果对错(评价)、自我进化(迭代)的能力,这也是 系统 有别于 单一功能 的地方。

Harness Engineering 概念的提出与演进

【图,Mitchell】

Harness Engineering 这个词,最早出现于2026年2月 Mitchell Hashimoto 的博客《My AI Adoption Journey》,他在文中陈述到,“每当 Agent 犯错,就工程化地补上相应的机制,以使未来不再犯同类的错误”。

虽然 Mitchell 是最早提出这个词的人,但我们应当认识到,这种“从错误中学习、持续迭代”、“构建正反馈回路”,是软件工程中早已有之的概念,只不过不叫 Harness 这个名字。

甚至,当前它的主流含义,早已远远超出最初提出时候的范围。现在业内对此的理解是:不去直接调用模型本身,而是去设计模型外部的一整层运行系统 ,包括工具、权限、执行流程、验证机制、日志、反馈回路、状态管理、安全约束,从而让 Agent 在更加可靠的工程环境里完成任务。

也可以概括为,Harness Engineering 是指围绕 Agent 搭建可控、可验证、可观测的运行外壳的工程思想。


软件开发:总体大于部分之和

与个人主导的小工具开发不同,商业化软件的实现和维护是一项系统工程,它包含 需求评估、策划方案、UI设计、软件设计、代码实现、测试验证、bug修复 等诸多环节,涉及到 产品经理、UI/UI设计师、软件工程师、系统工程师、品质/测试工程师 的角色。商业化软件交付的是一个整体,如果最终版本没有验收合格,那么其中的任何一个过程都是徒劳的。可以认为,各个步骤/环节只有对于最终合格的整体才有意义,因此对于软件开发而言,总体大于部分之和。

系统三构件:要素、连接、功能和目标

在学习 Harness Engineering 过程中,我总是会想起德内拉•梅多斯的《系统之美》,正如书中介绍的:

  • “系统对外具有整体性,对内则由一整套机制来保持其整体性。”
  • “系统并不仅仅是一些事物的简单集合,而是一个由一组互相连接的要素构成的、能够实现某个目标的整体。”
  • “系统中存在两种反馈回路:调节回路和增强回路。前者趋向于某一稳定值,后者则不断放大和增强原有的态势。”

【图-系统之美】

为什么是 Harness Engineering

如前文所讲,商业化项目的软件工程,涉及到众多环节、不同角色,因此它是一个系统性问题。系统性的问题需要系统的解决方案,在我看来,Harness Engineering 符合“系统”特征的原因,主要有两点:

  1. 它对外保持一个整体,对内则由要素、连接、目标三要素有机组成。
  2. 它具备自我学习、迭代的反馈回路。

因此,自2026年年初以来,在编程领域它的讨论热度始终居高不下,也就不难理解了。


如何设计一个 AI 工作流

我们必须承认,对当下的程序员而言,AI 已经成为一门必修课,而非选修课。于外,所有互联网软件公司都在推行 AI,甚至将 AI 代码生成比例、token 使用数量作为绩效考核指标。于内,我们可以将重复繁杂的编码工作交给 AI Agent 完成,解放自己的时间。

学会AI->使用AI完成日常工作->提高任务完成质量和速度->拥有更多个人时间->学习更多AI。这样正向循环的链条就形成了。

flowchart LR
    A[AI能力] -->|+| B[AI使用频率]
    B -->|+| C[任务效率与质量]
    C -->|+| D[可支配时间]
    D -->|+| E[AI学习投入]
    E -->|+| A

    R((R1 正反馈循环))
    R --- A

PDCA 框架——构建正反馈回路

image.png

在系统工程领域,存在一个很经典的工程循环框架——PDCA。

  • Plan(计划):围绕目标制定可行的计划,遵循SMART原则。
  • Do(执行):履行计划的各个步骤。
  • Check(检验):校验执行结果,是否达成目标。如果没达成,差距在哪里,造成差距的原因是什么。
  • Acquire(提升):吸收经验,避免下次犯同类错误。总结经验,降低重复建设成本。

所谓 Harness Engineering,在某种程度上也体现了这种思想,让 AI 在约束范围内起舞,通过自我调节,减少由于系统长期运行而产生的熵增。

根据上述信息,遵循 MVP(Minimum Viable Product最小可行产品)我整理出一版搭建 Harness Engineering 的思路,权当作抛砖引玉。

目录结构化

整体的文件夹结构、目录分层如下所示:

your-project/
├─ AGENTS.md
└─ .ai/
   ├─ subagents/
     ├─ code-analyst.md
     ├─ code-implementer.md
     └─ change-reviewer.md
   ├─ context/
     ├─ project-map.md
     └─ architecture.md
   ├─ tasks/
     └─ tasks.md
   ├─ checks/
     ├─ build.sh
     ├─ build.ps1
     └─ verify_changed_files.sh
   └─ memory/
      └─ known-issues.md
序号AI 面临的核心问题Harness 解决方法对应文件/文件夹
1缺乏持久、稳定、一致的行为规则建立稳定人格AGENTS.md
2执行者评估自身失准拆分子Agent,防止单一Agent既当运动员也当裁判.ai/subagents目录
3总写出正确但难以维护的代码约束设计模式,防止自由发挥.ai/context/architecture.md
4无法把握项目全貌分模块整理设计思路、方案.ai/context/project-map.md
5CLI不好用使用明确的任务说明.ai/tasks/task.md
6扩散式修改建立代码审查者,限制修改文件、函数数量,限制代码变更行数.ai/checks/verify_changed_files.sh
7写出的代码只是看起来对,但无法运行/检验结果建立CI-CD.ai/checks/build.sh(或者是build.ps1)
8缺乏自我进化经验沉淀,严重错误归档.ai/memory/known-issues.md

文件归一化

所有的规则、脚本文件,都应该使用最朴素的 mdshell 格式,有以下4点好处:

  1. Open anywhere。人与AI同时可以阅读和编辑。
  2. 如非必要,勿增实体。遵循单一可信源原则。
  3. 便于使用 git 进行版本维护。
  4. 无痛进行模型和工具的迁移,例如从 Codex 迁移为 Claude Code,不需要更改任何文件夹结构和文件内容。

Agent 设计

subagents/
├─ code-analyst.md ---> 分析计划者
├─ code-implementer.md ---> 执行修改者
└─ change-reviewer.md ---> 结果校验者

这里我按照 最小可用原则 拆分出来3个 subagent,分别承担 分析->实现->审查 的角色。每个 subagent 的 md 文件里只写四部分:

  • 职责
  • 输入
  • 输出
  • 禁止事项

对于每个 subagent 的内容,可以参考下一篇文章《Harness Engineering 的 AGENTS.md,subagents.md 怎么写?》,此处不再赘述。


软件程序员工作方向的转变

其实在最初写作本文时,我在开头有这样一句话:

全文原创手打,无 AI 参与润色。

review 的时候,我仔细想了想,把这句话删掉了。在这个内容爆发的时代,创作来源是谁并不重要,如果一篇技术文章是成体系、有实用价值的,即便它完全由 AI 生成,又有什么关系?AI 背后是人类几千年历史文化科学技术的积累,远远超过仅仅受了几十年教育的普通创作者。

程序员内核的变化——从“编写代码”到“系统设计”

image.png

跟一些同行程序员一样,由于写了十几年代码的关系,古法编程能力 在我心里一直是“优秀程序员”的代名词。但在 AI 时代,这个底层逻辑将很快被改写。程序员千万不要将自己限定在“执行者、码农”的框架内,而是要把自身角色转换为 AI 流程的设计者,从 亲身下地干活 变为 监督 AI 工作

AI 会替代程序员么?——成熟软件行业对“新手”与“有经验者”的需求变化

同样还有一个广泛讨论的问题,AI 会在多大程度上,替代人类程序员?在我看来,未来的 AI 一定会替代我过去所从事的工作。 这里我强调了 过去,是因为我们不应该忽略,AI 在不断迭代的同时,作为人类我们也是可以持续学习和自升级的。汽车的诞生淘汰掉了马车夫和马具店,同时催生了更加庞大的产业链,制造了上下游更多的工作岗位。

AI“泡沫”?既要冷眼旁观,也要躬身入局

最后我还想讲一点,随着 OpenClaw 在普罗大众中破圈传播,关于 AI 的讨论甚嚣尘上,每隔几天就有新的算法、论文、模型、工具问世,各大厂商争先恐后推出新产品,一片蒸蒸日上的景象,每一个产品问世都恨不得向全世界宣告 “AI 彻底变天了”、“一个人抵得上一家公司”、“彻底颠覆XX行业” 。这些宣传是不是泡沫?当下我们无法判断,只有历史才会给出客观的答案。

在这样的嘈杂中,人不应被冲昏头脑,每有一个新工具问世,就投入 大量时间和精力去尝试。在我看来,这是一种 付出极大机会成本的行为

使用 AI 的意义应当大于形式,重要的是它帮助我们解决了什么问题,而不是我用了哪些时下最新的工具。冷眼旁观的同时,一定要选择适合自身情况的 AI 产品,学习理解其思想,并深入使用进去,躬身入局,在干中学