《人月神话》阅读笔记

发布时间 2023-06-09 22:18:15作者: 那年晚风可期

这学期老师给我们推荐了一本在软件领域拥有深远影响力和畅销不衰的著作——人月神话。布鲁克斯博士为为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。本书内容来自Brooks博士在IBM公司SYSTEM/360家族和OS/360中的项目管理经验,该项目堪称软件工程项目管理的典范。该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄、中、韩等多种文字,全球销售数百万册。确立了其在行业内的经典地位。

其实说实话,现在看人月神话的话对我并没有多大作用(也可能是我觉得没什么作用),因为就自身能力来讲,还没有达到管理这个层次,但是多了解这方面的内容对我是无害的!那么接下来我就讲讲仅仅针对我而言对于这本著作的解读(个人观点)。

所有的编程人员都有乐观主义,总是相信自己的代码是肯定能运行的。所以在安排项目的进度的时候就会是假设在代码能够在正常运行时因该花费的时间。而现实往往不是乐观,在项目的进展过程中会存在各种不可预知的问题。在这个时候项目经理就会为项目增加人员,然而增加人员反而导致项目进度越来越慢。因为新增加的人员还需要培训,需要时间去了解项目的内容和进展情况。在投入了更多的人力的时候,经理发现项目进度反而更慢他就会投入更多的人力,这种恶行循环导致项目的失败。

开发一个项目,我们错误的认为用人月这个工作量单位来估计和进行进度安排。成本的确随开发产品的人数和时间的不同,有着很大的变化,进度却不是如此。因此我认为用人月作为衡量一项工作的规模是一个危险和带有欺骗性的神话。 它暗示着人员数量和时间是可以相互替换的。人数和时间的互换仅仅适用于以下情况:某个任务可以分解给参与人员,并且他们之间不需要相互的交流,而在系统编程中近乎不可能。当任务由于次序上的限制不能分解时,人手的添加对进度没有帮助。调试、测试的次序特性,许多软件都具有这种特征。因为软件开发本质上是一项系统工作——错综复杂关系下的一种实践——沟通、交流的工作量非常大,它很快会消耗任务分解所节省下来的个人时间。从而,添加更多的人手,实际上是延长了,而不是缩短了时间进度。

让我印象最深的是巴比伦塔的管理教训里面的一句总结为什么巴比伦塔为什么是一个失败的工程:那为什么项目还会失败呢?他们还缺乏些什么? 两个方面——交流, 以及交流的结果——组织。 他们无法相互交谈, 从而无法合作。 当合作无法进行时, 工作陷入了停顿。在这次高软的工程实践中我就深刻体会到这句话的重要性。我们组的项目所有代码都是我一个人写的,我的队友负责帮我优化UI。我告诉他我需要哪些东西,但是他完全按照他的理解做了一个完全不是我想要的东西。我以为我和他讲的很清楚,可是还是导致我们的项目在这里浪费了一些时间。最后总结,我和他交流有问题,还有就是他本身对于我们的项目是不理解的,所以导致他按照他的想法去做的时候就会和我的想法产生误差。团队如何进行相互之间的交流沟通呢?通过所有可能的途径: 非正式途径:清晰定义小组内部的相互关系和充分利用电话,能鼓励大量的电话沟通从而达到对所书写文档的共同理解。

会议:常规项目会议。会议中,团队一个接一个地进行简要的技术陈述。这种方式非常有用,能澄清成百上千的细小误解。

工作手册:在项目的开始阶段,应该准备正式的项目工作手册。

其实看完整本书之后,我发现作者一直在强调一个词:文档。他曾经很勤奋的向软件工程师们讲述文档的必要性以及优秀文档所具有的特点方面的讲座。但是效果都非常的的不好,他们知道如何来写出优秀的文档,但是他们缺乏热情。所以作者采用向马车搬收银机的方法向他们展示如何来完成这项工作。结果显示这种方法的效果还是挺好的。那我们在开发的过程中需要什么样的文档呢?

不同用户需要不同级别的文档。 某些用户仅仅偶尔使用程序, 有些用户必须依赖程序,还有一些用户必须根据环境和目的的变动对程序进行修改。使用程序。 每个用户都需要一段对程序进行描述的文字。可是大多数文档只提供了很 少的总结性内容,无法达到用户要求,验证程序。 除了程序的使用方法, 还必须附带一些程序正确运行的证明, 即测试用例。修改程序。 调整程序或者修复程序需要更多的信息。显然,这要求了解全部的细节,并且这些细节已经记录在注释良好的列表中。 和一般用户一样, 修改者迫切需要一份清晰明了的概述。

另外一个让我印象深刻的观点是:要保证一个项目的进度被大幅度推迟,制定进度表很重要。进度表由里程碑和完成时间组成。里程碑必须具体,明确,可界定。某一里程碑要么到达,要么没有到达,不应该是80%到达的。而我的经验是,制定进度表非常重要,而且要求制定者有很强的技术背景,这样才能对碰到的问题和可能花掉的时间做出更准确的估计。

通常,开发一个软件我们还会设立规模目标,控制规模,发明一些减少规模的方法——就如同硬件开发人员为减少元器件所做的一样。规模预算必须与分配的功能相关联; 在指明模块大小的同时,确切定义模块的功能。培养开发人员从系统整体出发、面向用户的态度是软件编程管理人员最重要的职能。

调试,是一种检验程序中的方法。然而调试是系统编程中很慢和较困难的部分,而漫长的调试周转时间是调试的祸根。它可以持续一个很长的时间,从而可能影响项目的交付日期。 为了更好的控制进度,我们需要制定一个严格的进度表来控制项目的进度表,进度表由里程碑和日期组成。里程碑必须是具体的、特定的、可度量的事件,能进行清晰能定义。进度表有时可以根据进展情况进行适度的修改。

产品测试时每个产品在提交给用户的一道程序。而这项工作主要由产品测试机构/小组根据规格说明检查机器和程序,充当麻烦的代言人,查明每一个可能的缺陷和相互矛盾的地方。每个开发机构都需要这样一个独立的技术监督部门,来保证其公正性。产品-测试小组则是顾客的代理人,专门寻找缺陷。不时地,细心的产品测试人员总会发现一些没有贯彻执行、设计决策没有正确理解或准确实现的地方。出于这方面的原因,设立测试小组是使设计决策得以贯彻执行的必要手段,同样也是需要尽早着手,与设计同时实施的重要环节。

昨天我又把书翻了一遍,发现大部分内容都是涉及到团队,人和沟通。对于大型软件工程项目强调人的重要性。在开篇讲开发人员的职业乐趣,后面又通过巴比塔的沟通重要性,在外科手术队伍中的组件和分工。这些都是涉及到团队中人和交互,只有一个有了积极心态和热情的沟通团队,才可能成就一个伟大的团队。从最后的没有银弹,再次肯定开发工作是一种高智力的脑力工作。