配套视频:https://www.bilibili.com/video/BV1bFvbBUEz1/

引言:AI编码的真实困境

"12位专家称,这可能是AI工程师6月最佳分享之一。"当Dex Horthy在AI工程师大会上分享他的研究时,揭示了一个令人不安的事实:根据对10万名开发者的调研,大多数人在使用AI进行软件开发时,大部分时间都在重复修改代码,且对复杂项目效果不佳

这个现象你一定不陌生:用Cursor或Claude Code构建一个新的Vercel面板?效果很好。但接手一个十年老的代码库?可能就不那么灵了。图表清晰地显示:虽然你发布更多,但大部分只是在重做之前发布的粗糙代码。

Dex坦白说:"第一次用Cloud Code时,我并不满意。"但从那时起,他的团队找到了方法,性能提升了两三倍,吞吐量大增。这迫使他们不得不改变整个软件开发的协作方式。三人团队,耗时八周,过程极其艰难,但现在他们解决了,再也不会回头。

这就是本文要探讨的核心:如何通过上下文工程,让AI在遗留代码库中高效工作,解决复杂问题,彻底杜绝冗余。

一、理解上下文工程的本质

为什么上下文如此重要?

首先要明白一个基本事实:大模型并非纯函数。它们具有非确定性,但无状态。这意味着什么?唯一提升效果的方法就是输入更优的Tokens

更好的输入产生更好的输出——这听起来简单,但影响深远。在编码代理的每个循环步骤中,模型只会选择一个正确的下一步,而错误的选择可能有数百种。唯一影响接下来内容的,是截至目前对话中的信息。

因此,我们需要优化上下文窗口的四个维度:

  1. 准确性(Accuracy):信息必须正确

  2. 完整性(Completeness):不能缺少关键信息

  3. 大小(Size):控制在合理范围内

  4. 轨迹(Trajectory):避免错误的对话历史

关于轨迹,有个有趣的现象:很多人让智能体做件事,它却做错了。你纠正它,冲它吼,然后它又做错了,你再吼它。接着大模型看到了这一切对话:好吧,我错了,人类冲我吼了。于是下一个最可能的反向操作是——我最好别做错事,免得人类再冲我吼。

这就是最糟的结果:信息错误 + 信息缺失 + 过多干扰。

"愚钝区":上下文窗口的临界点

Jeff Huntley对编码智能体做了大量研究,发现了一个关键规律:你用的上下文窗口越长,结果就越差。

这引出了一个非常学术的概念——"愚钝区"(Dumb Zone)。以Claude Code为例,你大约有16.8万个token的上下文窗口,部分预留给输出和压缩。研究发现,在40%左右时开始出现回报递减

想象一下:如果编码代理中MCP过多,你一直在低效区做功,永远得不到好结果。什么占用了你的上下文空间?查找文件、理解代码流程、编辑文件、测试构建输出。如果某个MCP不断输出JSON和一堆UUID塞满上下文窗口,那就天理难容了。

40%是一个不错的参考标准,但具体取决于任务的复杂程度。关键是要意识到这个临界点的存在,并围绕它设计你的工作流。

二、压缩的艺术:巧妙绕过低效区

从最简单的方法说起

最简单的方法是什么?提出需求,让编码代理先做事,再指出错误。不断纠正、追问、追问、再追问,直到你耗尽线索、放弃或崩溃。

稍微聪明一点的做法是:偏离了就开启新对话窗口。走错路了,重新开始,同样的提示和任务,但这次我们走这条路,别去那边。

但你怎么知道何时该重来?当你看到"I apologize for the confusion..."这句话时,可能就是时候重新开始了。这正是你告诉Claude它搞砸了时的典型回应。

有意识的压缩

我们可以更聪明些,采取有意识地压缩:判断你是否在正轨上,利用现有上下文窗口,让代理压缩成一个可审阅、可标记的Markdown文件。之后新代理启动后立即投入工作,无需再经历那些搜索、基于代码的理解及处理过程。

那我们该压缩什么?具体到关键的文件和行号,我们正在解决的问题。这是一次非常有效的压缩,将上下文浓缩为最精华的部分。

子代理:控制上下文的利器

很多人对子代理有误解。如果你有前端子代理、后端子代理、测试子代理、数据科学家子代理——请停止!

子代理不是用来拟人化角色的,它们用于控制上下文。

正确的使用方式是:在大型代码库中查找某个功能的实现原理时,可以引导编码代理启动一个子代理。子代理会分出一个新的上下文窗口,负责所有读取和搜索工作,查找和阅读整个文件,理解代码库,然后只需向父级返回一条极简短的消息:"文件已找到,父代理可直接读取。"

这样使用起来非常强大。父代理的上下文窗口保持清洁,所有繁重的搜索工作都在子代理的独立上下文中完成。

频繁主动压缩工作流

比子代理更有效的是一种我称之为"频繁主动压缩"的工作流。关键是你要持续保持上下文窗口紧凑

你正在构建整个工作流,围绕上下文管理。这不是一次性的操作,而是贯穿整个开发过程的持续行为。我们的目标是努力保持在高效区,全程如此。

三、研究-规划-实施:三阶段方法论

这套方法分为三个阶段:研究(Research)、规划(Planning)、实施(Implementation)。每个阶段都有明确的目标和输出。

研究阶段:理解系统的真相

还记得电影《记忆碎片》吗?这是关于上下文工程最好的电影。男子醒来,失忆了,他得靠读身上的纹身来回忆,弄清他是谁、在做什么。

若不培训员工,他们就会自行臆测。 这就是为什么研究阶段如此重要。

研究的核心是:

  • 理解系统运作方式

  • 查找正确文件

  • 保持客观

你可以把引导流程放到每个仓库里——一堆上下文,这是仓库,这是运作方式,一种压缩版的代码库智能体预先能看到的所有上下文。

但这会遇到挑战:代码库变大时,这会变得过长。你可以将它逐层分解,每个仓库根目录放个文件,每一层都可以放一个文件,每层都有相应的附加信息。

我们不记录文件本身,因为它们是真实来源。但当你的智能体运行时,你会引入根上下文,然后引入子上下文。智能区仍有充足空间,因为你只获取所需信息。

按需压缩:避免文档过时的陷阱

这里有个关键问题:这些文档会过时。每次发布新功能时,需要缓存并验证,并重建大部分内部文档。

但我想问个问题:在实际代码、函数名、注释和文档之间,有谁想猜猜哪个包含的谎言最多?

答案是:你的代码库任一部分中存在的谎言数量,文档最多。

因此,与其将更新文档作为流程的一部分(你很可能不会坚持),我们更倾向于按需压缩上下文。

若我正在开发与SCM服务商及Jira、Linear相关的功能,我会说:"嘿,我们要在这块代码区域深入研究一下。"斜杠指令或提示可直接调用你的技能,启动多个子代理,对代码库进行垂直切片分析,并生成研究报告。

这只是基于代码本身对真实情况的快照。 我们正在压缩代码中关键部分的真实信息,而不是依赖可能过时的文档。

规划阶段:压缩意图的杠杆

规划是对意图的压缩。 计划则是明确具体步骤。

根据研究、PRD或缺陷报告等材料制定计划,创建计划文件。我们再次压缩,但这次压缩的是你的意图和执行路径。

规划时,你要:

  • 列出具体步骤

  • 包含文件名和代码行片段

  • 表述要清晰明确

  • 说明每次更改后如何测试

这是一个很好的规划提示输出示例:包含实际代码片段,任何人读这个方案都能轻易看出如何执行。最笨的模型也不会搞砸。

可靠性与可读性的平衡

这里有个有趣的权衡:随着计划越来越详细,可靠性越长,但可读性越低。你需要找到适合你的团队和代码库的平衡点。

我们的目标是杠杆。因此要追求高置信度——模型真能做对事。如果我无法读懂这个计划,也不知实际会怎样,那就失去了杠杆效应。

因此,我们逐步迭代优化,我们的计划包含实际代码片段,明确什么将改变。你的目标是杠杆,要压缩意图,并确保执行可靠。

实施阶段:执行的艺术

实施阶段相对直接:执行计划,保持简洁的规划提示。

这是过程中最不刺激的部分,但必不可少。当你有了清晰的计划,实施就变成了机械化的过程。

四、心智对齐:团队协作的新范式

代码审查已死,方案审查永生

我想暂停一下,谈谈心智对齐(Mental Alignment)。有人知道代码审查的真正目的是什么吗?

心理对齐,就是确保一切协调一致。但最重要的是如何让所有人保持同步——团队同步代码库的变更及其原因。

问题是:我能看懂每周千行Go代码吗?抱歉,我看不过来,太难了。我能做,但我不想。随着团队扩大,所有代码都会被审查,但最终我作为技术负责人,我能读懂方案

我能读懂方案,并保持同步,及时发现问题。我能及早发现一些问题,并持续掌握系统的演变情况。

增强线程:让审阅者看到思考过程

Mitchell发了篇很棒的帖子,关于他如何在提交的请求中放置"增强线程"(Amplifier Threads),方便你查看。不只是在GitHub上看到一大片绿色代码,而是具体步骤和提示:

  • "嘿,我最后运行了构建,通过了"

  • "这是我采取的步骤"

  • "这是我们手动测试的方法"

这能让审阅者逐步理解变更过程,这是GitHub的PR无法做到的。

随着你不断交付更多代码,代码量增加两到三倍,你要想办法让团队保持高效,保持同步。

一行糟糕的计划 = 一百行糟糕的代码

如果你只记住一点,要明白:一行糟糕的代码就是糟糕的代码,计划中的一行也是如此。

计划中的一行可能包含一百行糟糕的代码。一条错误的研究路线,如同对系统运作方式和事物位置的误解,整个系统都会瘫痪。你会让模型跑偏,走向错误的方向。

因此,当我们对内或与用户合作时,我们不断尝试将人力和精力转移到这一流程中最具杠杆效应的环节——研究和规划阶段。

五、实战案例:成功与失败的教训

成功案例一:30万行Rust代码库

Dex和他的播客搭档Vibe(Boundary ML公司的CEO)进行了一次挑战:"我来一次性修复你那30万行Rust代码库的问题。"

整个过程耗时一个半小时。他们做了大量调研,制定了计划,有研究和无研究的情况下都做了规划,并对比了所有结果。

周二早上他们上节目时,CTO已经看到了PR,还挺满意,说:"嗯,这看起来不错,下次发布就解决了。"

确认无误:能在遗留代码中运行,且无冗余。

成功案例二:BAML项目的7小时奇迹

但Dex想试试能否解决更复杂的问题。周六,他们坐下来,一连讨论了七小时。

他们向BAML提交了3.5万行代码,其中一个PR大约一周后被合并。不过,部分代码是生成的——你更新下行为,所有黄金文件都更新了。

Vibe估计这相当于一到两周零七小时的工作量

太棒了,我们能解决复杂问题!

失败案例:Parquet Java的教训

但这有极限。Dex和兄弟Blake坐下来,试图移除Parquet Java中的Hadoop依赖。如果你知道parquet java是什么,对不起,不管你经历了什么让你走到今天这一步。

进展不顺。

他们做了方案,做了研究成果,后来彻底推翻重来。他们重新回到白板前梳理了一遍。学会之后,他们不得不重新回到白板前,发现所有问题后,便回头思考:这究竟该如何整合。

这引出一个有趣的观点:不要外包思考。AI无法替代思考,只能放大你已有的思考或缺乏的思考。

六、规范驱动开发的迷思

人们问Dex,这是由需求驱动的开发吗?

问题在于:"规范驱动开发"(Spec-driven Development)定义不明确。 这是来自ThoughtWorks的概念,但现在已经陷入了语义扩散。

很多人直接说"规格",他们指的是:

  • 更详细的提示

  • 撰写产品需求文档

  • 利用可验证的反馈循环

  • 把代码当作汇编来处理

  • 一堆Markdown文件

Martin Fowler在2006年提到过语义扩散:我们提出了一个定义清晰的好术语,然后大家就兴奋起来,每个人都赋予它一百种含义。对100个不同的人意味着100种不同含义,便失去了意义。

永远不会有所谓的"智能体之年",因为语义扩散。

我们曾认为代理是人,智能体是微服务,是聊天机器人,是工作流。回到起点,智能体不过是循环调用工具。

因此,Dex不用"规范驱动开发"这个词。如果真想用个时髦词,可称之为**"驾驭工程"(Steering Engineering)**。这也是情境工程的一部分,是你集成接入点的方式,如何定制你的代码库。

七、四个真正有效的战术步骤

抛开那些过度炒作的概念,让我们谈谈四个当下真正有效的战术性和实践性步骤

1. 做调研,弄清系统运作方式

使用研究提示,生成基于代码本身的真实快照。这些全部开源,你可以自己去下载并试试。

2. 制定计划,压缩意图

根据研究结果制定详细计划,包含文件名、代码片段、具体步骤。找到可靠性与可读性的平衡点。

3. 审查和迭代

回顾研究和计划,若可行,我们就能理清思路并对齐。别外包思考——这并非魔法,没有完美的提示。

我们围绕你——建造者,与代理反复沟通来构建整个流程。边看方案边修改,若需同行评审,可随时转发他人。

4. 执行并保持同步

实施计划,使用增强线程让团队保持同步。展示你采取的步骤,展示你手动测试的方法。

八、如何开始:根据复杂度调整方法

不必每次都执行完整的研究计划,需求有多有少:

  • 简单任务(改按钮颜色)→ 直接告诉代理

  • 小功能(简单计划)→ 无需复杂流程

  • 中等规模(多仓库功能)→ 应先研究再制定计划

  • 复杂问题(多系统交互)→ 需要更多上下文工程压缩

你能解决的问题越难,上限就越高,而你愿意做的上下文工程压缩也应越多。

很多人问:如何知道该用多少上下文设计?答案是:这需要大量练习。

你会反复出错,必须不断试错。有时过大,有时过小,选一个继续练。不要在不同工具间过度追求极致——选一个工具,多练习几次。

九、未来:文化变革的必要性

Dex认为编码代理这类东西实际上会变得普及化,人们会学会并不断提升这方面的能力。

难的是如何调整团队,以及你的开发流程如何适应这个世界——其中99%的代码由AI生成。

若搞不定这点,你就麻烦了。因为正出现一种裂痕:

  • 资深工程师不采用AI:因为它并不能显著提升他们的速度

  • 初级和中级工程师大量使用:因为它弥补了技能差距

  • 结果:制造出不少烂活,高级工程师每周都在收拾Cursor前一周留下的烂摊子

这并非AI之过,这也不是中级工程师的错。因为文化变革确实很难,必须自上而下才能见效。

所以,如果你是公司的技术负责人,选一个工具,多练习几次。率先示范如何正确使用AI编码工具,建立团队的最佳实践。

结论:上下文工程是一门艺术

让我们回到核心:

  1. 上下文工程的本质:不是寻找完美提示,而是建立一套系统化的压缩和管理方法

  2. 三阶段方法:研究-规划-实施,每个阶段都有明确目标

  3. 关键原则:不要外包思考,保持在智能区,持续压缩上下文

  4. 团队协作:从代码审查转向方案审查,保持心智对齐

  5. 文化变革:自上而下推动,适应99%代码由AI生成的未来

没有完美的提示,没有万能解法。 关键在于压缩与上下文设计,保持在智能区域。

这是驾驭工程,是情境工程,是你如何定制代码库、如何与AI协作的艺术。

Dex和他的团队正在打造智能编程助手HumanLayer,助力各种规模团队快速实现99%代码由AI生成的旅程。但无论你使用什么工具,这些原则都适用。

最后的建议:选一个工具,持续练习,不断试错,找到适合你团队的平衡点。记住,AI无法替代思考,只能放大你已有的思考。

上下文工程不是终点,而是一个持续学习和优化的过程。现在就开始吧。


#AI编程 #VibeCoding #上下文工程 #ClaudeCode #独立开发者 #AI创业 #一人公司 #程序员 #软件工程师 #软件工程


Work Less, Earn More, Enjoy Life.