如果只推荐一本软件工程的书,我会推荐《人月神话》。
这本书出版于1975年,到现在已经快五十年了。五十年在软件行业是一个漫长的时间,技术已经换了好几代,编程语言、开发工具、架构模式都发生了翻天覆地的变化。但《人月神话》里的很多观点,放到今天依然适用,甚至比很多新出的软件工程书籍更有洞察力。
这本书的作者弗雷德里克·布鲁克斯,是IBM 360系统的项目经理,亲身经历了大型软件项目的各种问题。他把自己的经验和思考写成了这本书,语言幽默,案例真实,观点深刻。
这篇文章,我想聊聊《人月神话》这本书,从它的核心观点、经典案例到现实意义,聊聊为什么几十年过去了,它依然是每个程序员和项目经理必读的经典。
什么是人月神话
先说说书名"人月神话"是什么意思。
"人月"是一个工作量单位,一个人工作一个月叫一个人月。很多人在做项目估算的时候,会简单地用人月来计算:如果一个项目需要12个人月,那么3个人做4个月就能完成,或者6个人做2个月就能完成。
布鲁克斯说,这是一个神话。因为人和月是不能简单互换的。对于很多软件任务来说,增加人手并不能线性地缩短时间,甚至可能让项目更慢。
为什么呢?因为新加入的人需要时间来熟悉项目,老员工要花时间来培训他们,这反而会降低老员工的效率。而且,人多了之后,沟通成本会急剧增加。两个人之间只有1条沟通路径,三个人有3条,四个人有6条,十个人有45条。人越多,沟通越复杂,花在协调上的时间就越多。
布鲁克斯有一句名言:"向一个已经延期的项目增加人手,只会让它更加延期。"这句话被无数项目验证过,成为了软件工程的经典论断。
这个观点对我的影响很大。以前我做项目的时候,总觉得人多力量大,进度慢了就加人。但读了这本书之后才明白,加人不是万能的,有时候反而会帮倒忙。项目管理不是简单的算术,而是一门关于人和协作的艺术。
焦油坑
书里有一篇叫《焦油坑》,描述了大型系统开发中遇到的各种困难,非常形象。
布鲁克斯说,大型系统开发就像一个焦油坑,各种恐龙和猛犸象在里面挣扎,越挣扎陷得越深。很多看起来很强大的团队,最后都陷在焦油坑里无法自拔。
焦油坑里有什么呢?有进度延期、有需求变更、有技术债务、有团队冲突、有性能问题、有兼容性问题。这些问题交织在一起,让项目变得越来越复杂,越来越难以控制。
我觉得这个比喻太贴切了。做过大型项目的人,应该都有过这种感觉:项目一开始很清晰,但做着做着就陷入了各种问题中,越想解决问题越多,最后整个项目就像陷在焦油坑里一样,动弹不得。
布鲁克斯认为,焦油坑是大型系统开发的固有属性,无法完全避免。但我们可以通过好的管理和设计,减少陷入焦油坑的概率,或者在陷进去之后能更快地爬出来。
这一章让我对软件开发的复杂性有了更深刻的认识。很多时候,项目出问题不是因为团队不努力,也不是因为技术不够好,而是因为大型系统本身就太复杂了。承认这种复杂性,是做好项目管理的第一步。
概念完整性
布鲁克斯在书里提出了一个很重要的概念:概念完整性。
他认为,一个好的软件系统,应该有统一的设计理念和风格。就像一座好的建筑,虽然有很多部分,但整体风格是一致的。如果每个部分都由不同的人按照自己的想法来设计,最后拼在一起,就会变得混乱难用。
为了保证概念完整性,布鲁克斯建议采用"外科手术团队"的模式。就像外科手术一样,有一个主刀医生(首席架构师)负责整体设计,其他人(程序员、测试、文档等)配合他的工作。主刀医生对整个系统的设计有最终决定权,其他人可以提建议,但不能各自为政。
这个观点在今天依然很有意义。很多软件项目之所以混乱,就是因为没有统一的设计理念,每个人都按照自己的想法来写代码,最后系统变成了一个大杂烩。虽然代码都能跑,但维护起来非常痛苦。
当然,概念完整性不是说一个人说了算,而是说要有一个人对整体设计负责,确保各个部分的设计是一致的。其他人可以参与讨论,可以提出不同意见,但最终要有一个统一的决策。
我在实际工作中也体会到了概念完整性的重要性。一个项目如果有清晰的架构设计和统一的编码规范,开发效率会高很多,代码质量也会好很多。反之,如果每个人都随心所欲,项目很快就会变成技术债务的重灾区。
巴比伦塔为什么失败
书里有一篇叫《巴比伦塔为什么失败》,用圣经里的故事来分析项目管理的问题。
圣经里说,人类想建一座通天的巴比伦塔,上帝让人类说不同的语言,导致他们无法沟通,塔就建不成了。布鲁克斯用这个故事来说明,沟通在项目中的重要性。
他认为,大型项目失败的一个重要原因,就是沟通不畅。团队成员之间、团队和团队之间、开发和产品之间,如果沟通不好,就会出现各种误解和冲突,最后导致项目失败。
布鲁克斯提出了几种促进沟通的方法:一是建立正式的沟通渠道,比如定期的会议、文档、邮件列表;二是鼓励非正式的沟通,比如团队成员之间的日常交流;三是共享工作区,让大家在同一个空间工作,方便随时沟通;四是使用共同的工具和规范,减少理解的偏差。
这一章让我意识到,项目管理很大程度上就是沟通管理。很多技术问题,根源其实是沟通问题。需求理解错了,是沟通问题;接口对不上,是沟通问题;进度不一致,也是沟通问题。把沟通做好了,很多问题就迎刃而解了。
在今天这个远程办公越来越普遍的时代,沟通就更重要了。团队成员不在同一个地方,不能随时面对面交流,就更需要建立好的沟通机制和工具。否则,巴比伦塔的失败就会在你的项目里重演。
没有银弹
书里最有名的一篇,可能就是《没有银弹》了。
布鲁克斯在这篇文章里提出,软件工程没有银弹。所谓银弹,就是能像银子弹杀死狼人一样,一下子解决所有问题的技术或方法。很多人都在寻找这样的银弹,比如新的编程语言、新的开发方法、新的工具,但布鲁克斯说,根本不存在这样的东西。
他把软件的困难分为两类:本质困难和偶然困难。本质困难是软件本身固有的复杂性,比如需求的模糊性、设计的复杂性、一致性的维护、可变性的应对。偶然困难是因为工具和方法不完善造成的困难,比如编程语言的限制、编译速度慢、调试工具不好用。
布鲁克斯认为,过去几十年的技术进步,主要解决的是偶然困难,而本质困难还没有被解决。没有任何技术或方法,能在本质上把软件开发的效率提高一个数量级。
这个观点在当时引起了很大的争议,很多人不同意。但几十年过去了,事实证明布鲁克斯是对的。虽然我们有了高级语言、IDE、敏捷开发、云原生等新技术和新方法,但软件开发依然很困难,项目延期和失败依然很常见。
"没有银弹"这个观点,对今天的我们依然有警示意义。每次有新的技术出现(比如低代码、AI编程),总会有人说这将彻底改变软件开发,让编程变得简单。但实际上,这些技术能解决一些偶然困难,但本质困难依然存在。我们不能指望某一项技术解决所有问题,还是要踏踏实实地做好设计、管理和沟通。
当然,没有银弹不意味着我们无能为力。布鲁克斯说,虽然没有银弹,但我们可以通过一系列的改进,逐步提高软件开发的效率和质量。比如好的设计、好的团队、好的工具、好的管理,这些加起来,就能带来显著的进步。
其他精彩观点
除了上面说的这些,书里还有很多精彩的观点。
比如"第二系统效应"。布鲁克斯说,一个人设计的第一个系统通常比较简洁,因为他知道自己经验不足,会比较谨慎。但第二个系统,他会把第一个系统里没敢加的功能都加上,结果第二个系统往往过度设计,变得臃肿复杂。这个效应在软件行业很常见,很多产品的第二代都会犯这个毛病。
比如"抛掉重做"。布鲁克斯说,不管你怎么做,第一个系统最终都会被扔掉,所以你还不如一开始就做好扔掉的准备,尽快做一个能用的版本,然后在第二个版本里改进。这个观点和今天的"最小可行产品"(MVP)思想很像。
比如"文档的重要性"。布鲁克斯非常强调文档的作用,他认为每个项目都应该有完整的文档,包括需求文档、设计文档、用户手册等。很多程序员不喜欢写文档,但布鲁克斯说,文档不是可有可无的,而是软件产品的一部分。
比如"工具的重要性"。布鲁克斯说,好的工具能极大地提高开发效率,团队应该投入时间和精力来打造自己的工具链。虽然打造工具需要时间,但长期来看是值得的。
这些观点虽然写于几十年前,但今天读来依然很有启发。很多我们以为是"新"的思想,其实布鲁克斯早就说过了。
为什么今天还要读这本书
可能有人会问,这本书写于几十年前,技术都变了,今天还有必要读吗?
我的回答是:非常有必要。因为这本书讲的不是具体的技术,而是软件工程的本质。技术会变,但人的行为、团队的协作、项目的管理,这些本质的东西变化很慢。
今天的我们,用着比布鲁克斯时代先进得多的工具和语言,但我们依然会遇到项目延期、沟通不畅、设计混乱、技术债务等问题。这些问题,布鲁克斯在书里都分析过,而且给出了很有价值的建议。
而且,这本书的写作方式也很值得学习。布鲁克斯不是在讲大道理,而是用自己亲身经历的项目案例来说明问题,语言生动,故事性强,读起来一点都不枯燥。即使你不是做软件的,也能从中学到很多关于项目管理和团队协作的知识。
更重要的是,这本书能让你对软件开发有更深刻的理解。它会告诉你,软件开发不只是写代码,更是关于人、关于协作、关于设计的复杂活动。理解了这一点,你就能从一个更高的层面来看待自己的工作,成为一个更好的程序员或者管理者。
阅读建议
如果你想读这本书,我有几个建议。
第一,不要期望一次就读懂全部。这本书虽然薄,但内容很丰富,有些观点需要反复琢磨。可以先通读一遍,了解大概的内容,然后在工作中遇到相关问题的时候,再翻出来重读对应的章节。
第二,结合自己的项目经验来读。布鲁克斯说的很多问题,你可能在工作中都遇到过。读的时候想想自己的经历,看看布鲁克斯的分析是不是有道理,他的建议能不能用到你的项目中。
第三,不要全盘接受。布鲁克斯的观点很有洞察力,但也不是绝对真理。他的有些观点是基于当时的技术环境的,今天可能需要调整。带着批判性的眼光去读,思考哪些依然适用,哪些已经过时了,这样收获会更大。
第四,可以和同事一起读,一起讨论。软件工程的很多问题是没有标准答案的,和同事讨论能碰撞出更多的想法。可以组织一个读书会,每周读一章,然后一起讨论。
写在最后
《人月神话》是一本经得起时间考验的经典。
五十年过去了,软件行业发生了翻天覆地的变化,但这本书里的智慧依然在发光。它提醒我们,软件开发的核心不是技术,而是人;项目管理的核心不是进度,而是沟通;系统设计的核心不是功能,而是概念完整性。
如果你是一个程序员,这本书能让你对自己的工作有更深刻的理解。如果你是一个项目经理,这本书能让你避开很多项目管理的坑。如果你只是对软件工程感兴趣,这本书也能让你了解这个行业的本质。
最后用布鲁克斯的一句话来结束这篇文章:"软件开发是一门艺术,也是一门科学。它没有银弹,但有规律可循。"
愿每一个软件从业者,都能在焦油坑中找到出路,建造出属于自己的巴比伦塔。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录