人月神话

《人月神话：软件项目管理之道》（The Mythical Man-Month: Essays on Software Engineering）是由美国软件工程师暨IBM System/360系统之父佛瑞德·布鲁克斯（Fred Brooks）所著文集，全书讲解软件工程、项目管理相关课题，被誉为软件领域的圣经，内容源于作者布鲁克斯在IBM公司System/360家族和OS/360中的专案管理经验。该书于1975年首次发行（ISBN 978-0-201-00650-6），并于1995年重新发行纪念版（ISBN 978-0-201-83595-3），其中新增了对《没有银弹》一文的评论和回应，与4个额外的新章节。

## 内容简介

### 焦油坑

跟只为私人使用而单独写出来的组件程式相比，做出软件系统产品（programming systems product）所要付出的代价将是九倍以上。估计产品化（productizing）的代价是三倍，若要对组件从事设计、整合、测试，进而凝聚成为一个系统，则代价也是三倍，而且这方面的成本计算基本是独立的。

史前时期最骇人的景象，莫过于一群巨兽在焦油坑里做垂死前的挣扎。不妨闭上眼睛想像一下，你看到了一群恐龙、长毛象、剑齿虎正在奋力挣脱焦油的束缚，但越挣扎，焦油就缠得越紧，就算他再强壮、再厉害，最后，都难逃灭顶的命运。过去十年间，大型系统的软件开发工作就像是掉进了焦油坑里……

软件开发的另一个难题，是从单一程式到软件系统过程中，所造成复杂度的快速上升，期间并需要包含不同的活动与技能，使得软件开发必须面对多样性的挑战。布鲁克斯最早认识到设计程式、开发软件的差别，他以程式与系统、产品的差异，解释两者之间的不同，并以3×3的复杂度加以说明。

### 人月神话

人月神话（The mythical man-month）：这部分讲述人力和时间并不呈现线性关系。指出以大量人员和较短的时间，并不能缩短软件的开发进度。一窝蜂的作业方式无助于软件生产，且会制造麻烦，产生出更差的软件。向进度落后的专案追加人力，只会使进度更加落后。因为新进的人员需要时间了解整个专案，而增加额外的沟通消耗。当有N个人必须在这群人之中进行沟通时（无阶级关系），当N增加，其输出M将抵消其效益，甚至倒退（最后几天所完成的进度，远不如刚开始几天所完成的进度。像是发现了许多错误）。

- 团队交流公式：$n(n - 1)/2$
- 范例：50个开发人员，就要$50(50 - 1)/2 = 1225$个沟通管道

用“人月”来衡量工作规模的大小是危险的，也是一个容易遭到误解的迷思，使用人月的前提必须是在人力和工时可以互换的情况之下：当一份工作因具有连续性的限制而不可切分时，就算投入再多的人力，也不会对时程有所影响，生小孩就是需要九个月，你叫多少个妈一起生都一样，软件工程就是像这样的工作，因为它必须除错，而除错本身就具有连续性的本质。

#### 人月

人月（man-month）指的是“一个人要花几个月”才能完成软件开发的单位，通常用来评估一件软件专案的大小。以成本会计（cost accounting）为基础的时程预估技术，使我们误把工作量和专案进度混为一谈，人月是个危险并很容易就遭到误解的迷思（myth），因为它假设人力和工时可以互换。

#### Brooks法则

在一个时程已经落后的软件专案中增加人手，只会让它更加落后。根据Brooks法则，增加人员到一个已经延误的专案里，等于是火上加油。除非你可以把工作区分，让新进人员可在不影响他人工作的状况下有所贡献。

把工作切分给更多人做将造成额外的沟通（communication）代价——训练和相互的交流（intercommunication）。欲增加软件专案的人手，总共必须付出的代价可分为三方面：工作重新切分本身所造成的混乱与额外工作量、新进人员的训练、新增加的相互交流。

### 外科手术团队

在接受相同的训练、同样都是两年资历的情况下，优秀专业程序员的生产力要比差劲的程序员好上十倍。短小精悍团队是最棒的——尽可能用最少的人。两人团队，其中一人当领导者，这通常是最佳的用人方式。以短小精悍团队开发真正大的系统就太慢了。绝大多数大型软件系统的经验显示，使用一堆人蛮干的方式最耗成本、最慢、最没有效率，做出来的系统在概念上也最不完整。

以一位首席程序员为主、类似于外科手术团队的组织提供了一个良方，既可因少数人的决策而兼顾到产品的整体性，又可因多数人的合作与大幅沟通减少而得到全部人的生产力。

### 专制、民主与系统设计

- 在系统设计时，保有概念整体性（conceptual integrity）是最重要的原则。
- 功能概念复杂度比（这个比值是为了量测使用便利性，对简单和困难的运用都很有效）才是系统设计的最终测试标准。功能多，不见得是好事。
- 要达成概念整体性，设计必须出自于一个人的想法，或是极少数人的一致决定。
- 对大型软件专案（小专案也一样）来说，将架构设计独立于实作之外是取得概念整体性强而有利的方法。
- 如果系统必须保有概念上的整体性，那么就必须有人来控制这些概念，这就是需要专制的原因，无庸置疑。
- 许多软件架构、实作、实现的工作都是可以同时进行的。（不论硬件或软件设计，都可以同时进行）

### 第二系统效应

第二系统效应（The second-system effect）就一个人所做过的设计而言，第二个系统是最危险的系统，一般来说，都倾向于过度设计。

当他做第三或之后的系统时，之前的经验会互相印证，以确认出这类系统的一般性特色，而系统彼此之间的不同处，也会帮助他辨别出属于特殊和非通用的部分。除了做些功能上的修饰之外，第二系统效应还有另外一项特征，那就是倾向于将之前已熟悉的技术发挥到淋漓尽致，但却没有留意到，这项技术早就跟目前专案的基本系统假设有冲突而不再适用，OS/360有好多这样的例子。（Windows NT则似乎是1990年代的范例）

对大部分OS/360的设计人员来说，它也是个第二系统，设计成员分别来自1410-7010磁盘操作系统、Stretch操作系统、Project Mercury即时系统、给7090用的IBSYS操作系统等等，几乎没有人拥有两个上述系统的发展经验，所以OS/360可称得上是一个最佳的第二系统效应范例。

### 巴别塔为什么失败?

#### 专案工作手册

手册或书面规格是不可或缺的工具，虽然光靠它是不够的。手册载明的是产品的外部（external）规格，用来描述并制定出使用者从外观上将或看到的所有细节，撰写手册便是架构设计师的主要工作。当使用者和实作人员的反应不断地显示出设计上难以使用或实现之处，手册就会堕入重新准备、修改的轮回之中。为了造福实作人员，将修改的程度予以量化（quantize）是很重要的——在时程上应该要有载明日期的版本资讯。

### 软件需求

失败的软件专案经常发生在开发者与用户间对需求认知的误解。开发者抱怨用户说不清楚需求，而用户抱怨开发者误解他们的意思。布鲁克斯认为“软件开发最困难的单一项目，是精确地决定要建造什么。”

## 书目

### 二十周年纪念版

增修内容：

- 将初版中所主张的所有论断整理出一个简洁的摘要，包括了原书的主要理念：就人力配置的比例而言，大型软件专案所面临的是跟小型专案完全不同的管理问题，这引申出产品的概念整体性是其中的关键，而达成概念整体性虽然困难，但却是可能办到的。
- 作者佛瑞德·布鲁克斯对他当初所提出的这些论断，在经过一个世代之后所做的观察。
- 转载布鲁克斯1986年发表于IEEE《Computer》的论文《没有银弹》。
- 布鲁克斯对于他1986年的论断“十年内不会有任何银弹”所做的回应。

## 参见

- 反面模式
- 代码重构
- 《没有银弹》
- Peopleware: Productive Projects and Teams

## 外部链接

- Frederick P. Brooks, Jr.个人主页
- Preface to 20th Anniversary Edition, as found on Safari.Informit.com
- Organization and Team Patterns

## 基本资料

- 原始文本：人月神话：软件专案管理之道
- 作者：佛瑞德·布鲁克斯
- 原名：The Mythical Man-Month: Essays on Software Engineering
- 译者：钱一一
- 语言：繁体中文
- 主题：软件工程、专案管理
- 出版社：经济新潮社
- 出版时间：1975, 1995
- 出版时间：2004年4月4日
- 页数：424页
- ISBN：9867889185
- OCLC 编号：1201368
- 杜威十进分类法：001.6/425
- 国会图书馆分类法：QA76.6 .B75
- 前作：没有银弹