再读人月神话:AI 时代下的产品化与系统化
再读人月神话:AI 时代下的产品化与系统化
在 AI 时代重读读这本五十年前出版的软件工程领域圣经倒是带来了很多新的感悟,尤其是有了 AI 之后很多论点在我看来已经不完全成立了,此文记录一下自己的思考,权作抛砖引玉
本文对应原文的焦油坑章节
阅读本文不需要读者阅读过原文
传统软件开发中,系统真正的知识载体往往是负责人本身。代码之外的大量设计意图、约束条件和历史背景以隐性知识的形式保存在开发者头脑中,只在必要时通过沟通传递。
AI 开发则不同。由于每次会话都无法继承上一轮实现过程中的思考,这些知识如果没有沉淀为文档、接口约束或测试,就等价于不存在。因此,AI 并没有改变产品化和系统化的目标,而是改变了知识的载体:隐性知识逐渐失去价值,显性知识成为持续开发的前提。
代码的形态
程序是最小可运行单元,通常仅供作者本人使用和理解。编程产品是程序经过产品化后的形态:具备完整文档、测试与统一风格,可被任何人在不接触作者的情况下运行、调试与扩展。编程系统是程序经过系统化后的形态:具备稳定的输入输出接口与清晰边界,可作为组件被其他模块调用组合。编程系统产品同时满足产品化与系统化的要求。
原文中给出的经验数字是产品化带来约 3 倍成本,系统化带来约 3 倍成本,两者叠加约 9 倍。
产品化与系统化
产品化需要提供文档、完整的测试、某种统一的风格,从而使得程序可以被任何一个人(在不和作者沟通的情况下)运行、测试、修复和拓展。系统化需要提供稳定的输入输出格式,以及清晰的边界和详尽的测试,从而使得程序可以被其他模块依赖组合成更复杂的功能。
虽然产品化与系统化解决的问题不同:前者针对谁能使用,后者针对能否被组合。但是两者的成本结构有很大重叠,都是为了让当前理解代码的人之外的人也能驾驭这段代码而支付的一次性投入,包括文档、测试、规范接口。理想状况下我们当然希望二者都做到,但是二者是有成本的,而是否划算可以归纳为一个简单的投资回报率(ROI)公式。
ROI=重新学习的成本×未来的复用次数建设及维护成本\text{ROI} = \frac{\text{重新学习的成本}\times\text{未来的复用次数}}{\text{建设及维护成本}}ROI=建设及维护成本重新学习的成本×未来的复用次数
传统编程
在传统的人类团队里,这个”未来消费次数“由两个变量决定:团队规模、人员流动率。因为人类程序员有长期的记忆,而且对于代码和文档编写这种偏向体力劳动的工作效率较低,如果代码只有作者或者有限的人会碰,无论是产品化还是系统化,投资大概率是亏本的,所以理性的选择是不做(或者只做一部分)。此时代码的可维护性依赖于作者头脑中的隐性共识:作者在场,共识存在;作者离场,共识通过一次性培训转移给新人,此后长期复用,边际成本趋近于零。
隐性共识是指未被写成文档、仅存在于负责人记忆中的对代码结构与设计意图的理解。
vibe coding
vibe coding是指以自然语言指令驱动大语言模型直接生成或修改代码的开发方式。在这种方式下,实际编写代码的“作者”是一次性的 AI 会话:任务完成后会话结束,该会话对代码的全部理解随之清空。不同于人类程序员,在主流 vibe coding 模式下 AI 无法像人一样长期保留隐性知识(即使能自动索引整个项目提取隐性知识,也会带来成本的上升,而且对设计意图的理解也可能存在偏差),但是代码与文档的生成效率较高。
长上下文和持久化记忆一定程度上可以解决 AI 没有长期隐性知识的问题,但是长上下文有注意稀释问题,持久化记忆会有错误累积和上下文压缩可能带来的语义漂变,在笔者看来并不算是最佳实践,vibe coding 模式下 AI 的上下文最好只包含本次任务相关的信息
产品化要解决的问题是不必找作者也能维护。在 vibe coding 中,作者不在场是每次任务结束后必然发生的状态,而非偶发的人员流失。人类负责人始终在场,但并未参与实现细节的构建过程,也未形成隐性共识。也就是产品化需要解决的场景一定会触发,即使不考虑未来维护,仅当前版本的正确性验证也要求测试具有更高的完备性。
系统化要解决的问题是未来的复用是否需要重新理解全部实现。人类新人理解一个系统是一次性投入,此后可无限复用。AI 每次新会话都从零重建理解,这一成本并不随会话次数增加而降低,而且 AI 从零重建的理解还不一定是正确的。
重看 ROI
ROI=重新学习的成本×未来的复用次数建设及维护成本\text{ROI} = \frac{\text{重新学习的成本}\times\text{未来的复用次数}}{\text{建设及维护成本}}ROI=建设及维护成本重新学习的成本×未来的复用次数
不难看出,在 vibe coding 模式下文档、测试等显式产物的生成成本被大幅度降低了。原文中给产品化、系统化各自约 3 倍额外成本,这些额外成本很大一部分是人类写文档、写测试、维持统一风格这类“体力劳动效率低”的部分,但这恰好是 AI 效率最高的环节。与此同时,在多数持续维护的软件项目中,AI 带来的重新理解次数增加有可能远大于单次学习的成本下降。vibe coding 模式下分子变高分母变小,ROI 也随之提高,产品化和系统化的价值相比传统编程要大得多。
结论
《人月神话》认为产品化与系统化是为了提升软件的可复用性,因此是否值得投入取决于未来的人类协作成本。AI 的出现改变了其中两个变量:一方面显著降低了文档、测试等显式工作的生成成本;另一方面,AI 作者无法保留隐性知识,使代码在每次新会话中都面临重新理解的问题。因此,在 AI 驱动开发模式下,产品化与系统化不再只是面向团队协作的工程实践,也逐渐成为维持 AI 持续开发能力的基础设施。
因此,一个 vibe coding 的程序几乎必须要是一个产品,如果它需要后续迭代和组合,那它最好也是一个系统。产物除代码本身外,还应包含代码规范、单元测试与详尽文档,覆盖架构、原始需求及其迭代记录、代码边界、接口文档与测试文档。
不过需要补充的是系统化的投入不只是涉及开发阶段,还涉及到设计阶段,但是本文不做展开
附录
以下摘录与本文主题无关,仅作为分享
编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐?
首先是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到愉快一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特、崭新的树叶和雪花上的喜悦。
其次,快乐来自于开发对其他人有用的东西。内心深处,我们期望其他人使用我们的劳动成果,并能对他们有所帮助。从这个方面,这同小孩用粘土为“爸爸办公室”捏制铅笔盒没有本质的区别。
第三是整个过程体现出魔术般的力量–将相互啮合的零部件组装在一起,看到它们精妙地运行,得到预先所希望的结果。比起弹珠游戏或点唱机所具有的迷人魅力,程序化的计算机毫不逊色。
第四是学习的乐趣,来自于这项工作的非重复特性。人们所面临的问题,在某个或其它方面总有些不同。因而解决问题的人可以从中学习新的事物:有时是实践上的,有时是理论上的,或者兼而有之。
最后,乐趣还来自于工作在如此易于驾驭的介质上。程序员,就像诗人一样,几乎仅仅工作在单纯的思考中。程序员凭空地运用自己的想象,来建造自己的“城堡”。很少有这样的介质–创造的方式如此得灵活,如此得易于精炼和重建,如此得容易实现概念上的设想。(不过我们将会看到,容易驾驭的特性也有它自己的问题)然而程序毕竟同诗歌不同,它是实实在在的东西;可以移动和运行,能独立产生可见的输出;能打印结果,绘制图形,发出声音,移动支架。神话和传说中的魔术在我们的时代已变成了现实。在键盘上键入正确的咒语,屏幕会活动、变幻,显示出前所未有的或是已经存在的事物。编程非常有趣,在于它不仅满足了我们内心深处进行创造的渴望,而且还愉悦了每个人内在的情感。