《人月神话》读书笔记
一、书名和作者
1.书名
The Mythical Man-Month:Essays in Software Engineering(人月神话:软件工程论文)
2.作者
弗雷德里克·布鲁克斯(Frederick Phillips Brooks),1999年图灵奖得主,致力于计算机体系结构、操作系统和软件工程的研究。
二、书籍概览
1.主要论点和结构
全书共19篇随笔,揭示了大型软件项目“复杂度、一致性、可变性、不可见性”四大根本困难,提出“人月不可互换”“概念完整性”“第二系统效应”“没有银弹”等经典论断。
2.目标读者和应用场景
《人月神话》是软件过程领域的“巨作”,几乎所有在这个领域中工作的人都需要读一读这本书:项目经理、产品经理、架构师、编码人员、测试人员、运维等等。还有很重要的一类人:我们这些即将进入软件行业的软件工程相关专业的学生。
对于软件工程的所有过程,《人月神话》中的观点都有可能帮到我们:从立项估算、团队搭建、人员安排,到软件需求、设计、开发、测试、运维等。
三、核心观点与主题总结
《人月神话》的核心观点,从书名即可看出来,即软件工程中“人和月”书写的神话故事,但软件工程中的人和月并不能同等替换,即1人×10月≠10人×1月,这是软件领域的“真理”。这个理论也是当今时代互联网行业996问题的本质原因。
这本书中几乎每一章都有一个核心主题,内部还涵盖若干分论点,下面主要列举我印象较深的几个:
- 焦油坑:大型系统开发犹如一个巨大的焦油坑,很多大型和强壮的动物在其中剧烈挣扎,最终死亡,软件的焦油坑主要指软件开发的复杂性、一致性、可变性和不可见性,最重要的是复杂性。这一章为全书定下基调,即软件之难,不在工具,而在人与复杂性的对抗。其中还有一个观点是我比较认同的:编程是一个许多人痛苦挣扎的焦油坑以及一种乐趣和苦恼共存的创造性活动,我们每个程序员不都是在苦中作乐吗?!
- 人月神话:软件开发的核心活动是思维交互,而非机械劳动;因此“人月”作为衡量单元具有欺骗性。本书的核心论点“布鲁克斯定律”指出向已经落后的软件项目增加人手,只会让它更晚完成,原因在于沟通成本的非线性增长与新成员的培训负担。 布鲁克斯强调,软件开发的效率无法通过“人月”线性叠加来计算,项目管理必须考虑“沟通结构”和“学习曲线”。
- 外科手术团队:这一章提出“外科手术团队模型”:由一位主程序统领小团队,以 6–8 人为上限,主程序员拥有绝对设计权,副手、测试、文书、工具员围绕其提供支持。主程序员负责系统设计与关键代码,其余成员辅助。 这样能保持“概念完整性”,减少协调混乱,是早期“敏捷团队”的雏形。
- 文档即共识:软件工程团队无法靠口头同步,只有记录下来,分歧才会明朗,矛盾才会突出。布鲁克斯认为“设计文档即是思维的延伸”,文档化的过程能暴露逻辑漏洞, 他倡导“文档驱动设计”,这一思想在后来演变为设计规范书与接口契约。
- 没有银弹:布鲁克斯宣称:在未来的十年内,无论在技术还是管理方法上,都看不出有任何突破性的进步,能够保证在十年内大幅地提高软件的生产率、可靠性和简洁性。 原因在于软开工程的本质困难:复杂性、一致性、可变性和不可见性。他将软件活动划分为根本任务(打造构成抽象软件实体的复杂概念结构)和次要任务(使用编程语言实现这些抽象实体)并且占用软件活动大部分工作的是根本任务,而技术上的进步往往提升的是次要任务的效率,对根本任务影响不大,所以除非次要任务占了全部工作的9/10,否则即使把次要任务时间缩减到零也不能带来生产率数量级的提高。
四、批评与局限性
毫无疑问,《人月神话》在软件工程史上是里程碑式的作品,书中的很多观点至今都是这个领域的真理或标杆,但作为一部20世纪70年代的作品,在这个快速发展的互联网世界必然存在一些时代局限性。
首先是管理模式的局限性。布鲁克斯的理论基于20世纪60年代IBM大型机项目的经验,当时软件开发以集中、封闭、层级化为特征。而当代的软件工程已转向敏捷开发、持续集成与开源协作。在这种环境下,“外科手术团队”的单一主导式结构显得过于刚性,难以适应现代分布式开发与团队自治的需求。
还有对“人”的过度简化。“人月”概念把程序员当作可替换的线性资源,忽视个体差异与内在动机。现代研究表明,同等工作量下顶级开发者的生产率可达平庸者的十倍,而布鲁克斯未触及人才识别、激励与创造力培养,导致其模型在知识工作者时代显得机械。
另外,《人月神话》这本书对于社会性、经济性因素的讨论较为薄弱。布鲁克斯更多从技术与组织视角分析失败的原因,而较少触及商业压力、市场竞争、客户需求变化等现实约束。实际项目往往受制于非技术因素,如预算、政策与政治博弈,这些都影响了软件工程的决策逻辑。
五、自己的感悟和思考
读完这本书,对我来说最重要的是再一次提升了我对软件活动的“敬畏”,敬畏是对抗程序员“过分乐观”的良药,时刻提醒自己“代码、软件很可能出错”而非认为“自己的代码永远没问题”。人会松懈,程序员更会如此,尤其当我们尝到一点点甜头的时候(比如一个新的功能自测没问题)。
还有,在书中贵族专制一章中提到的“概念完整性是系统设计中最重要的考虑因素”这一点我在实践中也有所体会。读书这几周我正在参与课题组的一个项目,我负责的一部分功能在实现时遇到的一个问题就是我对部分函数参数和返回值的理解与组内成员不一致,这是因为最初没有实现概念的一致性,就导致了后期编程的效率和质量大打折扣。还有就是对于我们这样一个5人小组,很符合书中提到的“外科手术团队”的结构,有一位主程序员(在我们团队中是组内的以为博士生)统领团队,其余人围绕他为他提供支持。
此外,这本书不是教我们怎么成为一名优秀的coder,而是教我们宏观看待软件开发活动;不是守着自己要实现的代码功能不放,而要从整个项目的大局考虑问题。这也是南大软院一直以来培养学生的理念,同样这也应该成为我们每一位程序员的追求。
六、总结与评价
《人月神话》这本书用最朴实的语言揭示了软件工程的持久困境,即使是几十年前的书,其中很多观点如“人月不可互换”“概念完整性”“没有银弹”依旧振聋发聩。
正如我在上一节中提到的:《人月神话》再一次提升了我对软件活动的“敬畏”。我想每一代程序员都应该以《人月神话》为镜,时刻提醒自己在软件活动中保持理性。
今年是我第一次系统地读《人月神话》这本书,我应该是一知半解的,我想未来几年甚至几十年,我仍会再向《人月神话》求教。
也推荐所有即将进入或已经在这个领域中的朋友们,先读神话,再写代码。