《人月神话》(The Mythical Man-Month)是软件工程领域的经典著作,由 Fred Brooks 在 1975 年撰写。尽管成书较早,但其核心思想对现代软件开发仍具有深远影响。
人月神话
作者认为将工作量简单等同于“人×月”是一种不切实际的神话故事, 这也是这本书的名字的由来. 一个经典的例子是一个女人需要九个月生一个孩子, 但九个女人无法在一个月内生出一个孩子. 人和月在软件开发过程中是不可替换的. 如果项目已经延期, 通过增加人手来期望减少延期时间只会导致进一步的延期. 软件开发是高度协作和沟通密集型的任务,增加人员会引入额外的沟通成本、培训时间和协调难度,反而可能导致进度进一步延迟。
软件系统的复杂性源于大量相互关联的细节,这种复杂性无法完全消除,只能通过设计进行控制。团队规模扩大时,成员间的沟通路径会指数级增长(公式:n(n-1)/2),导致效率下降。因此,小团队往往更高效。
时间分配的经验法则
作者认为, 对于一个项目的开发, 可以按照如下的比例分配时间
1 | 1/3 计划 + 1/6 编码 + 1/4 构建测试 + 1/4 系统测试 |
本书的背景是复杂系统的开发, 因此需要预留相当大比例的时间用于测试, 否则几乎必定出现在项目临近上线前发现过多问题, 导致项目延期. 甚至由于前期的计划和编码环节可以基本符合预期的执行, 因此直到测试阶段, 整个项目才”突然地”延期.
对于一个称不上复杂的常规需求开发, 时间分配又应该是多少才是合理的? 有多少需求是常规的, 又有多少需求是设计系统的?
概念完整性
一个系统的设计必须由少数人(或一人)主导,保持一致的架构和简洁的逻辑。避免因多人设计导致功能冗余或矛盾,强调“统一愿景”的重要性。
分离架构设计师角色与实现者角色
第一个版本的系统往往存在根本性缺陷,应被视为“可抛弃的原型”。真正的系统应基于原型的经验重新设计。这一思想后来演变为敏捷开发中的迭代开发和持续改进理念。
理想情况本应如此, 但实际过程中, 迭代开发会产生更多时间消耗, 产品与项目经理未必认可这种改造. 在第一版的设计中往往难以预料后续的使用会向那种方向发展.
因此, 一方面需要与产品和项目经理对项目的迭代计划达成一致, 另一方面要克制每次迭代的功能开发量, 分更多批次逐步交付才能保证有足够的调整空间.
开发者在设计第二个系统时,容易过度追求功能完备性,导致系统臃肿复杂。通过架构约束和代码审查,避免过度设计。
没有银弹
不存在某种单一技术或方法(如新编程语言、工具或流程)能“革命性”地大幅提升软件开发效率。软件开发的本质困难(如需求复杂性、沟通问题、测试验证等)属于根本性难题(Essential Complexity),而非可通过技术解决的次要难题(Accidental Complexity)。
在作者写书的年代还没有强大的AI编程能力, 但在现在这个时间点, 似乎可以看到一点AI编程的曙光. 假如未来出现了一种足够强的AI, 可以通过自然语言描述需求后搞定所有编程上问题, 那么描述清楚要做什么事情依然属于根本性难题.
实际上, 现在许多产品也无法描述清楚需求, 一方面是表达能力的限制, 另一方面也是产品本身需要进行探索才能进一步确认使用方式. 即便AI可以搞定剩下的一切问题, 软件开发依然不是一个简单的事情.此外, 相当多的复杂性是只能转移而无法消除的, 训练出强大的AI也需要处理许多复杂性问题, 这是否也会限制了AI的能力呢?
低代码平台是一个伪需求
低代码平台期望通过拖拽的方式, 以几乎不写代码的方式完成开发. 但实际上由于根本性难题无法消除, 当业务逻辑在足够复杂时, 低代码平台就会因为无法支持对应的功能, 不可避免地归回到代码开发的模式.
同样地, 基于拖拽(或者类似的选择节点)的方式构造业务逻辑也并不能降低开发复杂度, 甚至不当的设计导致次要难题更多. 软件开发经过这么多年的发展, IDE能够提供大量有助于降低复杂度的功能, 因此基于代码文本和IDE的开发方式也是当前的最优解.
阅读总结
原本我以为<<人月神话>>是一本非常厚重的涉及许多内容的书. 但实际上, 这本书的内容并不算多, 用不了几个小时就可以把整本书完整的阅读一遍. 而且作为计算机领域的经典书籍, 其中提到的一些容易解决的问题, 在这几十年的发展过程中已经逐步解决(例如与程序结合的文档). 其中谈及的敏捷开发和快速迭代, 项目的结构划分等思想现在也可以算是普遍采用了.
相较于具体的技术细节, 本书也许在提供思考契机方面的价值更大, 也算是印证了”没有银弹”这句宣言吧.
扩展阅读
以下是一些读者针对本书的阅读笔记和个人感受. 目前还没有更资深的程序员/项目经理对此发表自己的观点.
最后更新: 2026年05月08日 21:02
版权声明:本文为原创文章,转载请注明出处