Brooks 的设计课,为什么在 AI Coding 时代反而更值得重读

Brooks 的设计课,为什么在 AI Coding 时代反而更值得重读

2025 年以来,AI coding 工具的采用曲线陡得让很多人来不及思考。Cursor、Claude Code、Copilot、Windsurf——各家的命题都是「让开发者更快地写代码」,而讨论区里最常见的句式也变成了「以前要三天,现在十分钟」。

但这里有一个讨论错位:「写代码更快」和「系统设计更好」被当成同一件事在聊。 速度是产出维度的指标,设计是判断维度的能力。混淆这两者,不是技术问题,是认知问题。

在展开「AI 时代到底需要什么样的设计能力」之前,值得先回到一个老源头——Frederick Brooks Jr. 的《The Design of Design》。


一、Brooks 到底在说什么

Brooks 是《人月神话》的作者,IBM System/360 的关键人物。他在《The Design of Design》里讨论的不是视觉设计,不是 UI,不是敏捷流程,而是一个更根本的问题:复杂系统到底是怎样被设计出来的?

他关心的命题可以拆成四个维度:

维度Brooks 的判断流行观点的反面
设计是什么反复试探、修正和整合的探索过程按流程填表:需求→规格→分解→分配→集成
好设计从哪来统一的设计思想和强有力的设计主脑委员会民主讨论、投票决策
设计问题本质Wicked Problem——没有清晰边界,没有唯一正确答案可以被形式化方法解决的工程问题
评判标准概念完整性(Conceptual Integrity)功能数量、交付速度、覆盖率

根源在于: 大多数人对「设计」的理解停留在产出层面——画出了什么图、写出了什么文档、交付了多少功能。但 Brooks 反复强调,设计的核心是判断——在约束之间权衡,在冲突中取舍,在模糊中建立清晰的概念模型。


二、一个关键词:概念完整性

如果只从 Brooks 的设计思想里抓一个概念,那就是 Conceptual Integrity

一个有概念完整性的系统,用户会觉得它:思路一致、操作统一、模型清楚、各部分像出自同一个头脑。反过来,缺乏概念完整性的系统:每个模块风格不同、相似功能行为不一致、命名混乱、学会一处不能推理另一处。

这在软件里太常见了。一个产品里,一个页面叫 Project,另一个叫 Workspace;有的按钮是 Save,有的是 Apply,有的是 Done;同样的权限在不同模块表现不同。每一个不一致都不是 Bug,而是设计缺位的症状。

Brooks 的判断很尖锐:很多系统失败,不是因为功能少,而是因为没有统一的设计思想。

讲到这里,多半会有一个疑问:这跟 AI coding 有什么关系?关系比大多数人以为的大。


三、AI Coding 时代的五面墙

把 Brooks 的思想映射到当下的 AI coding 实践里,会撞上五面墙。每一面墙的本质,都是「产出能力」超过了「判断能力」。

墙一:局部正确 ≠ 整体优秀

AI 生成代码的典型模式是根据当前上下文做局部推断。它能把某个函数写得不错、某个页面实现得不错、某个接口封装得不错。但局部质量的叠加不等于系统质量。

AI 生成现象表面看起来深层问题
每个功能都能跑交付很快概念模型不统一
每个模块有自己的命名风格代码似乎清楚全局语言混乱
相似功能用不同实现方式局部合理系统学习成本上升
临时需求被快速完成响应敏捷架构被持续侵蚀

根源在于: AI 优化的是局部上下文的拟合度,不是全局概念的一致性。它会帮你把每一块砖砌得又快又好,但它不会告诉你这面墙该不该存在。

墙二:需求到错误系统的链路变短了

以前一个错误需求从提出到变成代码,中间有评审、讨论、反复,有很多「减速带」。现在 AI 可以根据一句话直接生成实现——「给后台加一个批量导入功能」「给用户加一个推荐模块」「做一个权限管理页面」。

但 Brooks 式的问题会是:为什么需要这个功能?它服务于哪个核心流程?它是临时补丁还是长期能力?它会不会破坏现有模型?用户真正想解决的到底是什么?

错误需求变成错误系统的速度更快了。 以前好歹还有时间在漫长的编码过程中发现问题,现在连这个缓冲窗口都被压缩了。

墙三:设计责任的真空

当 AI 可以快速写出代码,团队很容易产生一种错觉:「我们产出很快,所以我们的开发流程没问题。」

但 Brooks 的框架会追问:谁在维护概念完整性?谁在判断取舍?谁在审查抽象质量?谁在决定什么不做?

过去这些责任分散在「写代码的过程中」——因为写代码慢,所以人们在写的途中会自然地思考这些问题。现在代码生成速度太快,如果没有人显式地承担设计判断的责任,就会出现设计真空。

原则不变,工程实践变了: 设计判断从「隐式分布在编码过程中」变成了「需要显式独立存在的活动」。

墙四:命名混乱的加速器

Brooks 非常重视命名,因为命名背后是概念。AI coding 中尤其容易出现这种混乱:同一个概念出现多个名字、不同概念被混用同一个名字、数据库字段/API/前端状态/产品文案互相不一致、AI 根据局部文件风格创造了新术语。

系统里同时出现 usermemberaccountprofilecustomer——它们到底是不是同一个东西?如果不是,边界在哪?如果是,为什么有五种叫法?

这种混乱不是小问题。它会逐渐变成沟通成本、Bug 来源和架构负担。而 AI 会加速这个过程,因为每次生成代码时它都会基于局部上下文选择「看起来最自然」的命名,而不是基于全局一致性的命名。

墙五:架构错误的高速放大

以前糟糕设计的代价暴露得慢,因为代码写得也慢。现在不同了:一天可以生成过去一周的代码、一个需求可以快速拆出多个模块、一个原型可以迅速变成「准生产代码」、临时方案很容易被复制扩散。

AI coding 不是降低了架构的重要性,而是让架构从「高级工程实践」变成了「生存技能」。 没有架构判断力的团队,以前是慢慢烂掉,现在是快速烂掉。


四、共识地基

在讨论「怎么办」之前,先拉几条最少争议的共识:

  • AI 显著降低了代码产出的边际成本。 这不是预测,这是已经发生的事实。
  • 代码生成解决的是表达问题,不是设计问题。 表达是把想法变成可运行的代码;设计是决定想法本身应该是什么。
  • 局部质量不等于系统质量。 每个函数都写对了,不等于整个系统设计对了。
  • 概念完整性不会因为工具变强而自动出现。 它需要有人负责、有人判断、有人维护。
  • 开发者的核心竞争力正在转移。 从「亲手实现每一行代码」转向「设计结构、控制质量、审查判断」。

这些共识应该没什么争议。分歧在于:既然这些判断成立,那 AI coding 时代的开发实践应该怎么调整?


五、五条可执行原则

把 Brooks 的思想转化成具体实践,不是照搬四十多年前的结论——工具环境完全不同了——而是把底层原则映射到新的约束条件下。

原则一:先设计概念,再生成代码

不要一上来就让 AI 写实现。更好的顺序是:定义核心对象和关系 → 明确系统边界 → 统一命名语言 → 设计数据流和状态模型 → 讨论异常和边界场景 → 再让 AI 生成代码。

比如不要直接说「帮我写一个订单退款模块」,而是先明确:Refund 和 Cancellation 是不是同一个概念?Refund 是订单状态还是支付状态?部分退款如何表示?退款失败后订单处于什么状态?退款是否影响库存、积分、优惠券?退款流程由谁发起、谁审批、谁执行?

这些问题没想清楚,AI 写得越快,后面越热闹。

原则二:把 AI 当成候选方案生成器,不是架构负责人

AI 很适合给方案,但不应默认采用第一个方案。

任务低质量用法高质量用法
需求实现直接让 AI 写代码先让 AI 提出设计问题
架构设计让 AI 给一个最佳方案让 AI 比较多个方案的取舍
代码审查只检查能否运行检查是否破坏概念完整性
重构让 AI 局部优化让 AI 识别重复概念和边界混乱

关键区别:不要只问 AI 怎么做,要问它为什么这样做、还有哪些做法、代价是什么。

原则三:维护统一语言

建立并维护一份「设计宪法」——不是厚重的文档,而是一组轻量但强制的约定:

  • 核心领域概念如何命名
  • 哪些抽象是系统级概念
  • 哪些模式允许使用,哪些禁止
  • API 的语义规则是什么
  • 错误处理遵循什么模型
  • 数据流是单向还是双向
  • 状态应该放在哪里
  • 哪些能力属于平台层,哪些属于业务层

AI 可以参与执行这些规则,但规则本身需要人类设计者制定

原则四:让 AI 写代码,也让 AI 写设计记录

AI 时代不该减少文档,反而应该让文档更轻量、更即时。尤其建议保留:架构决策记录(ADR)、API 设计说明、核心领域模型说明、状态流转图、重要取舍原因、被拒绝方案及原因。

代码告诉你「系统现在是什么」。设计记录告诉你「系统为什么变成这样」。

原则五:用 AI 做概念完整性审查

AI 不只可以生成代码,也可以反过来检查系统是否一致。例如可以让 AI 审查:是否存在重复领域概念、命名是否统一、API 风格是否一致、模块边界是否清晰、是否存在循环依赖、是否有相似逻辑散落多处、错误处理是否统一、新功能是否违背现有架构原则。

一个实用的 prompt 思路:

请从概念完整性的角度审查这组代码。重点检查命名、抽象边界、状态模型、错误处理、模块职责是否一致。不要先改代码,先列出设计层面的不一致。

这比单纯「帮我写个函数」更有价值。


六、最核心的变化:从打字员到主编

AI coding 时代,开发者的工作形态会发生一个根本性的转变。

以前很多时间花在:写样板代码、查库文档、调整语法、搬运类似实现、重复写 CRUD、手工补测试。未来更多时间应该花在:判断需求是否合理、组织系统概念、选择架构边界、审查 AI 输出、维护设计一致性、重构概念模型、设计演化路径。

这很像从「作者」变成「主编」。主编不一定逐字写每篇稿子,但他决定栏目结构、叙事风格、质量标准、什么能发、什么要删、哪些内容互相冲突、整本杂志有没有统一气质。AI 可以写很多段落,但一本杂志有没有灵魂,还是看主编。

换一个终点:最强的 AI coding 团队,不一定是「最会让 AI 写代码」的团队,而是「最能让 AI 在统一设计思想下工作」的团队。


诚实边界

这篇文章的适用范围需要说清楚:

  • 适用对象: 已经在用 AI coding 工具、并且开始感觉到「产出变快了但系统变乱了」的团队和个人。如果你还在纯手写代码阶段,先解决工具采用的问题。
  • 不适用场景: 小型脚本、一次性原型、个人工具——这些场景下概念完整性的收益不足以覆盖维护设计宪法的成本。
  • Brooks 的局限: 他的经验主要来自大型系统工程(操作系统、数据库、企业软件)。Web 应用、移动端、数据管道的设计约束不完全相同。原则相通不等于可以直接搬。
  • 趋势判断的风险: AI coding 工具还在快速迭代。如果未来 AI 具备跨文件、跨模块的全局理解能力,部分判断(比如命名混乱加速)可能需要修正。但「设计判断不可替代」这个核心论点,短期内不会过期。

参考

  1. Frederick P. Brooks Jr., The Design of Design: Essays from a Computer Scientist, Addison-Wesley, 2010.
  2. Frederick P. Brooks Jr., The Mythical Man-Month, Addison-Wesley, 1975 (20th anniversary edition 1995).
  3. Frederick P. Brooks Jr., “No Silver Bullet: Essence and Accidents of Software Engineering,” IEEE Computer, 1987.
  4. Horst W. J. Rittel & Melvin M. Webber, “Dilemmas in a General Theory of Planning,” Policy Sciences, 1973.(Wicked Problem 概念的原始论文)