人机协作痛点:从同事交接困境到信息孤岛
以前我们常说“代码要写给人看”,但很多程序员都对这句话嗤之以鼻,直到他们第一次给新同事做入职培训,第一次被迫去回答代码交接时的十万个为什么。小时候,我的领导很喜欢研究这种程序员之间的合作效率问题,简称团队协同(Team Collaboration: 如何让1+1大于2的组织效能机制)。而现在轮到我当领导了,面临的问题却变得更难,直接升华到了“人机合作的效率问题”。
这个问题之所以极其棘手,难就难在 AI 这个新同事太老实巴交了。在具体的协同场景中,你给它看什么,它就信什么;没给它的信息,它就会自己在暗中脑补。它从不会怀疑自己,也从不会主动举手提问十万个为什么。但这也意味着,你往往得一直等到代码审查(Code Review: 由同行检查源代码以发现缺陷并确保质量的过程)的时候,才会突然发现它到底在哪个环节出了差错,哪儿的逻辑不对劲。
那我们究竟要怎么跟这种特殊的“新同事”默契配合?从最初的想法构思一直到最终的产品落地,整条软件开发链路对于我们人类开发者来说,无非就是切换几个开发工具、复制粘贴几下的事儿。但对于 AI 来说,这个链路中的每一步都相当于一个彼此割裂的独立信息孤岛。而这种孤岛效应,恰恰才是最让 AI 难受和容易跑偏的地方。毕竟现在的 AI 早就不怕上下文窗口太长了,它只会嫌你给的背景上下文不够充分,最终导致它在缺乏关键信息的情况下只能半蒙半猜。因此,我们必须帮它填补理解空隙,扎扎实实做好流程上的上下游衔接。以前这些跨阶段的沟通和协调工作基本都是项目经理的职责,但就目前技术演进的大趋势来看,我们程序员其实都已经是半个项目经理了,所以我们自身的思维方式也必须顺应趋势进行深度转变。
知识衰退定律:代码背后的决策断层与认知鸿沟
面对人机协作中频发的差错,有聪明的观众可能就会下意识地说了:“既然遇到那么多问题,无非就是因为你们代码写得太烂,让人或者 AI 看不懂呗!”不可否认的是,市面上有些代码本身的质量确实不行,但很多人容易忽略的一个最根本逻辑是:代码只是最终呈现的东西,它写得再好,也无法告诉你一些东西为何而来(why),以及它是怎么来的(how)。
关于这个软件工程的深层矛盾,我在两年前就曾发布过视频进行深入讨论。当时著名程序员 Atomic Energy 受到我视频的启发,进一步归纳总结出了知识衰退定律(Law of Knowledge Decay: 项目演进中由于人员流动与沟通散落导致的架构背景与决策意图永久性流失规律)。这个定律揭示了软件研发组织内不可逆的两大衰退机制:
- 第一,随着时间推移,项目内部会累积越来越多的复杂业务逻辑,以及隐藏在代码背后的架构决策考量等关键背景知识。然而,这些极其宝贵的上下文通常散布在各种日常会议记录、往来邮件、即时聊天软件、issue 工单和 PR 提交讨论之中,甚至有更多的思考推演过程压根就没有被白纸黑字记录下来。所有这些隐性知识,都必将会随着时间的流逝以及团队人员的自然流动而被彻底遗忘,从而根本无法完整地传承给后来的维护者或接手的 AI。
- 第二,随着软件项目规模越来越庞大,研发团队内部的角色分工界限也会变得越来越清晰与僵化。负责宏观层面的项目经理、产品经理以及架构师等决策角色,往往只管大方向的系统设计决策和具体任务分配;而身处微观层面的开发工程师、测试工程师和运维工程师,通常只负责埋头敲代码做具体的落地实现。这种分工直接导致了宏观知识与微观细节之间开始出现严重的隔阂,最终形成了各管各的、各做各的的割裂局面。
代码伴生知识库:击碎传统文档架构的空间布局
那么,在实际的工程实践中,彻底破解了知识衰退定律的开发流程到底会有怎样惊艳的效果?空话不多说,我们直接进行实战演示。画面上展示的是我们频道的老朋友——一套已经平稳运行了十岁之久的物联网终端系统。在当前的工程重构中,我已经让 AI智能体(AI Agent: 具备自主环境感知、规划推理和工具调用能力的自动化执行程序)给全系统现有的全部 11 个核心系统组件分别生成了配套完备的专属知识库。在设计结构上,每个独立的组件知识库都标准配备了以下五大维度的内容支撑体系:
- 一份详尽的系统运行业务流程图(Flowchart);
- 一份详尽的系统架构与技术选型(Architecture & Tech Stack)对照说明文档;
- 一份根据完整 Git 提交日志严密复现出来的修改历史记录;
- 一份全面涵盖了后续性能优化和潜在缺陷修复的各种待办事项清单(TODOs);
- 以及一份专门面向 AI 解析理解的文字版端到端测试案例库。
此时聪明的观众在查看目录树时肯定会发现:我把这些组件知识库和具体的源代码全部混排存放在一起了,整个项目目录第一眼看起来似乎有些乱糟糟的。我并没有按照传统软件工程的做法,把所有的规范文档和设计说明统统堆放在项目同一个根目录下的 docs 文件夹里。因为传统把文档归置在根目录的做法,其所谓的“可读性”完全是面向人类程序员的浏览习惯来设计的。而当 AI 在接收到指令执行代码任务时,它的检索机制通常是一层一层地自底向上往上逐级去查找资料。在这样的机理下,把配套的知识库直接摆在每一行代码的旁边、与被操作的源码文件同目录贴身存放,自然就成了对 AI 而言最高效、检索路径最短的做法。
这种布局策略在工程实操中带来了巨大的效率红利。比如我现在给 Agent 派发这几个物联网组件的日常开发任务,打开它们的后台思考链(CoT: 思维链推演过程),你就会非常明显地发现:它们都没有像一般盲目摸索的任务那样,一上来就先盲目写个脚本把整个代码仓库(Repository: 包含项目所有代码及历史记录的版本控制仓库)给翻个底朝天,而是会在第一时间一秒定位到所有跟当前目标组件直接绑定的本地配套文档。单单是这种近水楼台式的检索模式,就能在每个任务中为我们省下大量宝贵的上下文 Token 消耗。
历史决策守护:从错误升级防范到架构回溯
当然,为每一次对话省下 Token 仅仅是伴生知识库的附加价值而已,它真正无可替代的杀手锏在于对业务常识和历史约束的守护。就拿本次升级通信组件的具体任务来说:从技术表面上看,我们这个十年前搭建的物联网系统采用的 AMQP协议(Advanced Message Queuing Protocol: 高级消息队列协议)依然是早就被时代淘汰了的旧版 0.9 版本。如果是人类或者没有背景知识的 AI 来看,既然接到了现代化的升级指令,将它顺理成章地升级到全新的 1.0 标准协议简直是理所当然的事情。
但 AI 在被派发任务并就近读取了该组件的架构选型资料之后,立刻敏锐地发现了关键的后端限制:我们系统在云端依赖的正是老牌的 RabbitMQ(RabbitMQ: 一种广泛使用的开源消息代理与队列服务框架)服务,而团队当前部署的云端实例属于一个只兼容 0.9 版本 AMQP 协议的老古董。这就意味着,哪怕新版 1.0 协议在理论上更快、更高、更强,AI 也绝对不会擅自去动手升级它。甚至在测试过程中,就连我亲自在输入框里以管理员身份逼着它强行去改,它也会义正言辞地直接拒绝我的危险指令。这在实际的工程体系中,无异于为系统的稳定性构筑起了一道额外的坚固安全机制。
类似的情况还发生在这个处理缓存组件的崩溃恢复(Crash Recovery: 系统发生非预期崩溃后自动恢复状态与保障数据一致性的机制)任务中。熟悉我们频道的老粉丝在面对高可用容错场景时,第一时间的直觉肯定都是去采用异步架构,毕竟异步机制天生就是用来解耦和对付各类异常情况的最佳武器。在这里,AI 在接到任务刚开始思考的时候其实也是这么设想的。不过当它深入分析了半天之后,却主动选择放弃了看似完美的异步方案。
为什么它会突然改变主意呢?因为 AI 在仔细研读该组件的修改历史文档时,从中翻出了一段尘封的往事:原来早在整整 5 年前,该缓存组件采用的架构其实就是异步架构;但是当时由于业务线为了严格满足物联网设备端对极端最低延迟的苛刻要求,开发团队在权衡之后最终决定牺牲系统的架构灵活性来换取极致的响应速度,特意从原来的异步机制改造成了同步机制。这段曾经由人工做出的架构权衡与历史妥协,其实就连我自己都早就忘得一干二净了。要不是这次由 AI 重新把它从伴生历史里翻找了出来,说不定哪天我们自己在重构时稀里糊涂地又改回了有延迟隐患的异步方案。
结构化赋能与协同习惯重塑:进入人机研发美丽新世界
除了文字形式的历史记录,我认为在所有伴生文档中实战价值最高、收效最立竿见影的,正是这些直接内嵌在 Markdown 文档里的时序流程图。虽然我曾经专门出过一期视频高调宣告送别繁琐沉重的传统 UML(Unified Modeling Language: 统一建模语言),但在当前的 AI 编程时代,这些以 Markdown 纯文本代码格式存在的时序图(Sequence Diagram: 按照时间顺序展示对象交互的图表),对于大语言模型来说确实能做到一图胜千言。
尤其是那些运行内部状态繁多、逻辑极其复杂的程序。比如我这个负责音频解析的播放组件,除了常规的播放、暂停等主流程之外,还密布着各种网络断流、解码故障、缓冲区溢出等极其棘手的特殊分支。在实际的工程代码中,这些主流程和异常分支的代码逻辑往往是高度混杂交织在一起的。以往如果在没有配套图表的情况下让 AI 进行代码修改,AI 在每次开启新对话时,都必须把长达几千行的混杂代码从头到尾重新反复梳理推演一遍,然后才能真正开始动手改动代码。这就相当于让 AI 在自己的神经网络脑海里反复重画流程图;但作为人类工程师,你完全无法保证它每次在脑内画出来的内部逻辑都能分毫不差,这极容易在各种极端的边界细节上出错。而现在有了清晰明确的 Markdown 流程图,AI 只要一读取就能直接参考核心状态机,实现一步到位的精准修改,整体的执行速度和推导准确度都能够获得肉眼可见的大幅提升。
在这里,我还要向大家特别推荐一种面向 AI 的纯文字版端到端测试(End-to-End Testing: 从用户或系统入口到最终数据落地的全流程功能验证)案例库。在以前的开发习惯中,程序员往往偏爱写大量的单元测试(Unit Test: 针对软件最小可测试单元进行的隔离验证),其根本原因在于过去如果完全依赖纯人工代码去构造一个环境完整、数据拟真的端到端全链路测试实在太复杂、太费时费力了。但现在既然是由 AI 来全权负责跑测试和验证,那么每一个集成测试案例在准备阶段其实只需要人类用自然语言写出几句核心行为与预期的描述,剩下的各种 Mock 环境搭建、数据构造与流程断言,完全交给 AI 让它自己去组织和执行就行了。
最后,也是整个团队协同流程中最不可被漏掉的关键细节:当你同时启用多个并发的 AI Agent 对底层多个异构组件跑多项开发任务时,务必要建立校验机制,核实 AI 在修改业务代码的同时,也必须同步更新对应组件目录下的配套知识文档。毕竟每一个新开启的会话窗口,本质上都相当于组织内一次全新的代码交接过程。我们必须确保每个组件旁边的知识库一直都实时维持在最新、最准确的状态。
总的来说,在深度融合了这些伴生知识文档体系之后,不管是 Agent 跑任务的单次运行用时、对话中消耗的 Token 用量,还是后续需要我们人类去手动纠偏的低级代码逻辑错误,通通都有了肉眼可见的显著减少。有一个我以前在跟 AI 结对编程时经常遇到的巨大痛点,估计不少正在使用大模型的观众也深有体会:就是你耐心地等它自己忙活了大半天完成了整个任务,结果点开代码一看才崩溃地发现,它从最一开始的基础假设上就存在严重的理解误差,导致后面的所有推演逻辑和架构设计全部彻底走歪了;吭哧吭哧改了几百上千行代码,结果仔细一审一行都没法用进生产环境,无奈之下只能把代码全部回滚,重新写 Prompt 让它从头再来一遍,而我们自己也被迫陷入继续摸鱼干等大半天的尴尬境地。
好消息是,在给每个模块配备了这套知识库之后,这种从根源上推导走歪的情况我基本上已经没有再遇到过了。至于坏消息是啥,我想大家心里也都懂,那就是人类程序员能找借口摸鱼的时间确实是越来越少了。
其实这件事情说到底,核心就是一个开发习惯与工作思维转变的问题。只是以前我们在面对自动化工具时,更多的下意识思维习惯是:“这些都是我个人原本的工作风格与代码习惯,AI 你既然作为辅助工具进来了,你就要主动配合我、适应我。”而现在身处全新的 Agent 协作时代,我们就需要把思维彻底转变为:“既然 AI 拥有这么一些既定的底层工作风格与认知特点,那么作为系统的掌控者,我要怎么在工程结构上给它创造一个更适应它工作的高效环境。”
包括在视频开场时提到的项目经理角色,一旦你把思维转过来、彻底养成工作习惯之后,你会发现这些协调管理其实也就是顺手为之的小事。比如说在每天工作结束时,为了确认一下今天各个 Agent 的更新是否都已经规范地完成了 Commit 和 Push,我会在本地系统里预先设置一个自动化的定时任务,每天傍晚六点下班前都会让专职的 AI 自动扫描一遍所有的项目代码与伴生文档,彻底避免有任何遗漏。当你发现不仅是你自己的行为习惯,就连底层的思维方式都已经随着工具的革新而开始逐渐发生改变时,你这才算是真正做好了所有的准备,从容步入并适应了与 AI 共同当同事的“美丽新世界”。