《人月神话》读书摘录
《人月神话》(The Mythical Man-Month)是计算机科学家弗雷德里克·布鲁克斯(Frederick P. Brooks Jr.)于1975年出版的一本经典著作,主要探讨软件工程和项目管理中的各种问题。书中的内容虽然已有数十年历史,但其中的许多观点和原则依然适用于现代软件开发。以下是对各章节的概况和简介,帮助大家更好地理解这本书的核心思想。
第一章、 焦油坑
概述
在《人月神话》的第一章中,布鲁克斯通过“焦油坑”这一形象的比喻,揭示了软件开发的复杂性和困难。他描述了软件项目犹如一个焦油坑,一旦踏入便难以自拔,令人难以摆脱困境。通过这一比喻,布鲁克斯引出了软件工程领域的许多关键问题和挑战。
焦油坑的定义
焦油坑是指软件开发过程中遇到的种种困难和障碍,这些困难常常超出预期,使项目进度大大延误,成本剧增。布鲁克斯指出,软件开发本质上是一个复杂而难以预测的过程,许多项目管理者和开发者都曾陷入这种困境。
软件开发的复杂性
布鲁克斯将软件开发的复杂性分为两类:
- 本质的复杂性:源于软件问题本身的复杂性和多变性,这是不可避免的。软件系统的设计和实现需要处理大量的细节和交互,这些都增加了项目的复杂性。
- 偶然的复杂性:来自开发工具、语言和方法的不足。这种复杂性是可以通过改进技术和工具来减轻的。布鲁克斯强调,尽管技术在进步,但这些改进并不能完全消除软件开发的困难。
“人月神话”的提出
本章引入了“人月”这一概念,并提出了著名的“布鲁克斯定律”:“向落后的软件项目中增加人手只会使之更晚。”布鲁克斯解释了为何增加人手无法按比例缩短开发时间,反而可能因沟通成本增加和新手培训的需要而导致效率下降。
解决方案的初探
布鲁克斯并没有在本章提供解决所有问题的万能钥匙,而是通过分析问题的根源,引发读者对软件开发过程的深刻思考。他指出,要想克服焦油坑,必须在项目管理、团队组织和开发方法上进行改进。
总结
第一章“焦油坑”通过生动的比喻和深入的分析,揭示了软件开发过程中常见的陷阱和挑战。布鲁克斯通过描述软件开发的复杂性和困难,引出了“人月神话”和“布鲁克斯定律”,为后续章节的讨论奠定了基础。这一章不仅引发了读者对软件开发过程的深刻反思,也为我们提供了重新审视和改进软件开发实践的契机。
通过阅读这一章,读者可以更好地理解软件开发中的复杂性和挑战,从而在实际工作中更加谨慎和务实地应对各种困难和问题。
第二章、 人月神话
本章提出了书名中的核心观点:人月神话,即增加人力并不总是能按比例缩短项目时间。布鲁克斯指出,项目管理中的常见错误是认为更多的人力可以快速弥补进度落后的问题,但实际情况往往相反,增加人力可能导致更多的沟通和协调问题,从而延误项目进度。
乐观主义
- 系统编程的进度安排背后的第一个假设是:一切都将运作良好,每一项任务仅花费它所“应该”花费的时间。
- 我们的构思是有缺陷的,因此总会发现Bug。也就是说,我们的乐观主义并不应该是理所应当的。
- 在单个的任务中,“一切都将运转正常”的假设在进度上具有可实现性。然而大型的编程工作,或多或少都包含了许多任务,某些任务间还具有前后的次序,从而一切正常的概率变得非常小,甚至接近于零。
人月
- 第二个谬误的思考方式是,在估计和进度安排中使用的工作量单位:人月;
- 用人月作为衡量一项工作的规模是一个危险和带有欺骗性的神话。它暗示着人员数量和时间是可以相互替换的。
- 人数和时间可以替换仅适用于:1.任务可分解(没有次序上的限制) 2.参与人员之间不需要相互交流
系统测试
要为系统测试安排足够的时间
空泛的估算
编程人员,同厨师一样,某项任务的计划进度,可能受限于顾客要求的紧迫程度,但紧迫程度无法控制实际的完成情况。就像约好在两分钟内完成一个煎蛋,看上去可能进行得非常好,但当它无法在两分钟内完成时,顾客只能选择等待或者吃生煎蛋。软件顾客的情况类似。
厨师还可以选择把火开大,不过结果常常是无法“挽救”的煎蛋————一面已经焦了,而另一面还是生的。
- 为了满足顾客的期望日期而造成不合理的进度安排,在软件领域中比其他任何工程领域要普遍得多。
- 在基于可靠基础的估算出现之前,项目经理需要挺直腰杆,坚持他们的估计,确信自己的经验和直觉总比期望派生出的结果要强得多。
重复产生的进度灾难
当一个软件项目落后于进度时,通常的做法是加派人手。这可能有所帮助,也可能无法解决问题。
- 重新安排进度。P.Fagg(经验丰富的硬件工程师)的忠告:“避免小的偏差(Take no small slips.)”也就是说,在进度安排中分配充分的时间,以确保工作能仔细、彻底地完成,从而无需重新确定时间进度表。
- 削减任务。当项目延期导致的二次成本非常高时,这常常是唯一可行的方法。
简化的Brooks法则:(冒昧的)向进度落后的项目中增加人手,只会使进度更加落后。(Adding manpower to a late software project makes it later.)
第三章、外科手术队伍
本章提出了一种新的团队组织形式:外科手术队伍。在这种结构中,一个专家程序员(主程序员)负责设计和主要编码工作,而辅助人员则处理各种辅助任务,如文档、测试和工具开发。这种方式旨在减少沟通成本,提高团队效率。
如何在有意义的进度安排内创建大型的系统?
问题
- 优先程序员和较差程序员的生产率超别可能是指数级的(10:1)
- 经验和实际的表现没有相互联系
- 需要协作沟通的人员数量影响着开发成本,系统应该由尽可能少的人员来开发
但对于效率和概念的完整性来说,最好有少数干练的人员来设计和开发。而对于大型系统,则需要大量的人手,以使产品能在时间上满足要求。如何调和这两方面的矛盾呢?
Mills的建议
建议大型项目的每一个部分由一个团队解决,该团队以类似外科手术的方式组件,而并非一拥而上。也就是说,同每个成员截取问题某个部分的做法相反,由一个人来完成问题的分解,其他人给予他所需要的支持,以提高效率和生产力。
如何运作
。。。
第四章:贵族系统和装甲骑士
本章探讨了系统的设计和实现中的人文因素。布鲁克斯通过分析历史上的工程项目,指出团队中不同角色的重要性以及如何通过合理分工和协作提高整体生产力。
第五章:二次系统效应
布鲁克斯描述了二次系统效应,即第二个系统往往比第一个系统更加复杂和庞大,因为设计人员会试图在第二个系统中加入许多在第一个系统中没能实现的功能和特性。这种情况会导致第二个系统变得难以管理和维护。
第六章:因为有你,我的朋友
本章强调了文档的重要性和有效沟通对项目成功的关键作用。布鲁克斯认为,项目的成功不仅依赖于技术能力,更依赖于团队成员之间的顺畅沟通和清晰的文档记录。
第七章:工作分解
布鲁克斯详细讨论了如何将一个大型项目分解为若干可管理的子项目。这种分解可以减少复杂性,明确责任,提高项目的可控性和可管理性。
第八章:估算的乐趣
本章讨论了软件项目的时间和成本估算。布鲁克斯认为,准确的估算需要基于详细的计划和经验数据,并且应该考虑各种不确定因素和潜在的风险。
第九章:弯路
布鲁克斯提出了软件开发中的“弯路”现象,即在开发过程中经常会遇到意想不到的困难和挑战,导致项目偏离原定轨道。他建议通过灵活应变和及时调整来应对这些问题。
第十章:命令和控制
本章探讨了项目管理中的指挥和控制问题。布鲁克斯认为,项目经理应该具备良好的领导能力,能够有效协调团队工作,确保项目按计划进行。
第十一章:决策的封闭
布鲁克斯指出,项目中的许多问题源于决策的延迟和不确定性。他建议,通过明确的决策流程和及时的决策,可以减少项目的风险和不确定性。
第十二章:无纸化办公室
本章讨论了办公自动化和信息技术对项目管理的影响。布鲁克斯认为,尽管无纸化办公在某些方面提高了效率,但在信息交流和决策方面仍然需要人际互动和面对面的沟通。
第十三章:前端
布鲁克斯强调了项目早期规划和设计的重要性。通过详细的需求分析和周密的设计,可以避免后期的修改和返工,提高项目的成功率。
第十四章:草稿和完整性
本章探讨了软件开发中的原型设计和迭代开发方法。布鲁克斯认为,通过快速构建原型并不断改进,可以更好地满足用户需求,提高开发效率。
第十五章:总结和反思
在本章中,布鲁克斯总结了全书的核心观点,并对软件工程的发展进行了反思。他强调了团队合作、有效沟通和持续改进的重要性,呼吁软件工程师们不断学习和适应变化。
结语
《人月神话》尽管出版已久,但其内容依然对现代软件开发有深远的影响。通过对各章节的概况介绍,希望读者能够更好地理解书中的核心思想,并将其应用于实际工作中,提高项目管理和软件开发的效率和质量。