《人月神话》读书笔记

2020/05/25

“手中有一个锤子,看到什么都是钉子。”

概述

《人月神话》给我的第一印象就是神话小说故事,人类跟月亮女神的爱情故事什么的。后来才知道人月指的是1个人工作1个月的工作量,想起我开发是按人日算工作量的,还有点亲切感。神话就是人人都听过,但是人人都没有见过,就像能按我们制定的工作计划顺利完成项目一样稀奇。不得不佩服这个名字起得真好。

作为一本从40年前流行到今天的软件领域经典书籍,以我的水平是很难看懂的。毕竟40年前的开发环境跟现在完全不一样,作者主要以在IBM开发和管理的System/360和OS/360系统来分享软件项目开发管理和团队管理的经验,都是大型项目,而我只有小项目的开发经验,有很多细节没办法感同身受。不过大师就是大师,不管什么水平的人看了,都是能有所收获的。有很多结论今天依然被证明是正确的,依然值得学习和遵循的。这样看来,40年前就能写出这样的书,真的可以说是神作了。

我把触动特别深的内容记录下来,加上自己的理解(估计只理解了5%),也尝试运用到自己的项目开发当中,共勉。

关于项目

编写程序系统产品的工作量是编写程序的9倍

从能运行的程序到程序产品,需要3倍的时间,从程序产品到程序系统,也需要3倍的时间,要得到真正有用的程序系统产品,需要9倍于编写程序的时间。

所有编程人员都是乐观主义者。

幻觉:一切都将运作良好;这次它肯定会运行;我刚刚找出了最后一个错误。
现实:一个Bug或者一个环境问题,就可能花上一天时间也无法解决。

人月的神话色彩:人员数量和时间是不可互相替换的。

人和月不能换算,换言之,1个人做30天的事情,不等于30个人做1天就能完成。增加人数会带来培训和交流的时间成本增加。

1/3计划、1/6编码、1/4组件测试和早期测试、1/4系统测试。

编码时间只占1/6,测试时间占一半。起码我参与的项目这两个时间是反过来的。当所有竞争对手都许诺只要1/6的时间就能完成项目,我们能坚持那个“1”吗?

在项目后期增加人手,只会使工期进一步推迟。

作者解释这包含了合理的夸张,增加人手不一定会使工期进一步推迟,不过肯定会使工程效率进一步降低,因为增加人手会带来隐性话费(培训、沟通成本),所以,如果要增加人手,越早越好。

信息隐藏,是唯一提高软件设计水平的途径。

代码模块应该采用良好定义的接口来封装,这些模块的内部结构应该是对外部不可见的。这种情况下,编程人员的工作效率最高。

没有银弹

在神话中,银弹是唯一能消灭狼人的武器。这里指没有制服软件项目的法宝。没有任何一种新工具、方法论或管理模式,能将现有的软件开发效率提高一个数量级。

为你的程序提供一份有用的文档。

不同用户需要不同的文档,有的只是偶尔使用程序,有的是需要依赖程序,有的是需要修改程序。 1、目的。主要功能是什么?开发程序的原因是什么?
2、环境。程序运行在怎样的机器、硬件设备的操作系统?
3、范围。输入的有效范围和输出的合理范围是什么?
4、实现功能和使用的算法。精确的阐述它做了什么。
5、“输入-输出”格式。必须是确切和完整的。
6、操作指令。包括控制台和输出内容中正常和异常结束的行为。
7、选项。用户的功能选项有哪些?如何挑选?
8、运行时间。在指定配置下,解决特定规模问题所需的时间?
9、精度和校验。期望结果的精确程度?如何进行精度的检测?

关于团队

真正的权威来自每次任务的完成。

编程人员的个人权威和他所承担的责任是不相配的。实际权威来自于每次任务的完成。

小型、精干的团队是最好的。

小型项目团队组成,像外科手术队伍,只由一个人操刀,其他人支援,辅助,而不是每个人都要拿刀。团队的扩建,也可以采用多个这种小团队的结构,只需要协调每个团队的头。

人就是一切。一个优秀的开发者比一个平庸的开发者效率要高上10倍。

多花点钱请人吧。又想让马跑,又不想马吃草,还想让马感激,是不行的。

概念完整性

宁可少添加一些七七八八的功能,也应该保证整个系统体现的是一套完整的设计理念。避免强调“功能”的丰富,而忽略整个系统的概念完整性;也可能因为一两个附加功能的实现难度导致整个系统开发推迟甚至难产。概念的完整性要求设计必须由一个人(产品结构师)或者非常少的人来实现。

产品结构师和开发人员的交互准则

1、开发人员是最终实现的人,结构师只能建议,而不能支配;
2、时刻准备着建议一种实现方案,同样准备接受任何能达到目标的方法;
3、对上述建议保持低调和不公开;
4、准备放弃所作的改进建议。

避免过分设计第二个版本

设计第一个版本时往往会量力而行,只实现必须的功能,但是设计第二版的时候,会加入过多非必须的功能,导致臃肿而缺乏概念完整性。

技术主管做总指挥,产品负责人充当其左右手,在小型团队比较适合;产品负责人做总指挥,技术主管充当其左右手,在大型团队比较适合。

同时具有管理技能和技术技能的人很难找到。思考者很少,实干家更少,既是思考者又是实干家的太少了。

巧匠因为他的工具而出名。

建议每个团队配备一名工具管理人员。包括硬件,操作系统,编程工具,调试辅助程序,测试用例生成工具,项目管理工具,代码管理工具等。

给进度表制定里程碑和日期。

里程碑必须是具体的、特定的和可度量的事件,能进行清晰的定义,无法自欺欺人,弄虚作假。“如果你错过了一个deadline,确保完成下一条deadline”。

进取是杰出的开发者和团队不可缺少的品德。

“比要求的跑得更快”,“比要求的移动得更加迅速”,“更加努力尝试”。


公众号:JairusTse的日常

(转载本站文章请注明作者和出处 JairusTse的技术博客

Post Directory