《人月神话》读书笔记
第一章:焦油坑
编程行业“满足我们内心深处的创造渴望和愉悦所有人的共有情感”,其提供了五种乐趣:
1、创造事物的乐趣;
2、开发对其他人有用的东西的乐趣;
3、将可以活动、相互啮合的零部件组装成类似迷宫的东西,这个过程所体现出令人神魂颠倒的魅力;
4、面对不重复的任务,不断学习的乐趣;
5、工作在如此易于驾驭的介质上的乐趣——纯粹的思维活动——其存在、移动和运转方式完全不同于实际物体。
同样,这个行业具有一些内在固有的苦恼:
1、将做事方式调整到追求完美是学习编程的最困难部分;
2、由其他人来设定目标,并且必须依靠自己无法控制的事物(特别是程序);权威不等同于责任;
3、实际情况看起来要比这点好一些;真正的权威来自于每次任务的完成;
4、任务创造性活动都伴随着枯燥艰苦的劳动,编程也不例外;
5、人们通常期望项目在接近结束时,软件项目能收敛得快一些,然而,情况却是越接近完成,收敛得越慢;
6、产品在完成前总面临着陈旧过时的威胁;只有实际需要时,才会用到最新的设想。
第二章:人月神话
1 | 在众多软件项目中,缺乏合理的进度安排是造成项目滞后的最主要原因,它比其他所有因素加起来的影响还要大。 |
良好的烹饪需要时间,某些任务无法在不损害结果的情况下加快速度。
所有的编程人员都是乐观主义者:“一切都将运作良好”。
由于编程人员通过纯粹的思维活动来开发,我们期待在实现过程中不会碰到困难。
但是,我们的构思本身是有缺陷的,因此总会有bug。
围绕着成本核算的估计技术,混淆了工作量和项目进度。人月是危险和带有欺骗性的神话,因为它暗示人员数量和时间是可以相互替换的。
由于对自己的估算缺乏信心,软件经理通常不会有耐心持续地估算这项工作。作为一门学科,我们缺乏数据估计。
对进度缺少跟踪和监督。
当意识到进度的偏离时,下意识(以及传统)的反应是增加人力。
在早期进度策划时,允许充分的系统测试时间是非常重要的。
非阶段化方法的采用,少的可怜的数据支持,加上完全借助软件经理的直觉,这样的方式很难生产出有力的/看似可靠的和规避风险的估计。
第五章:画蛇添足
在开发第一个项目时,设计师倾向与精炼和简洁,他知道自己对正在进行的任务不够了解,所以会谨慎、仔细地工作。第二个系统是设计师们所设计的最危险的系统,一种普遍的倾向是过分地设计第二个系统。而当他着手第三个或第四个系统时,先前的经验会相互验证,得到对此类系统通用特性的判断,而且系统之间的差异会帮助他识别出经验中不够通用的部分。
一个可以开阔设计师眼界的准则是为每个小功能分配一个值,每次改进,功能x不超过m字节的内存和n微妙。这些值会在一开始作为决策的向导,在实现期间充当指南和对所有人的警示。
第七章:为什么巴比伦塔会失败
项目工作手册:
项目工作手册不是一篇独立的文档,它是对项目必须产出的一系列文档进行组织的一种结构。
项目所有的文档都必须是该结构的一部分,这包括目的、外部规格说明、接口说明、技术标准、内容说明、和管理备忘录。
第十章:提纲挈领
软件项目的文档:
1、内容:目标。定义待完成的目标、迫切需要的资源、约束和优先级。
2、内容:产品技术说明。以建议书开始,以用户手册和内部文档结束。速度和空间说明是关键的部分。
3、时间:进度
4、资金:预算
5、地点:工作空间分配
6、人员:组织图
第11章:未雨绸缪
“开发人员交付的是用户满意程度,而不仅仅是实际的产品”
第14章:祸起萧墙
“项目是怎么被延迟了整整一年时间的……一次一天。”
一天一天的进度落后比起重大灾难更难以识别,更不容易防范和更加难以弥补。
里程碑必须是具体的、特定的和可度量的事件,能进行清晰的定义。
慢性进度偏离是士气杀手。如果你错过了一次最终期限,确保完成下一条最终期限。
第15章:另外一面:
文档能在整个生命周期对克服懒惰和进度的压力起促进和激励作用。
需要什么样的文档:
1、目的主要的功能是什么?开发程序的原因是什么?
2、环境。程序运行在什么样的机器、硬件配置的操作系统上?
3、范围。输入的有效范围是什么?允许显示的合法输入范围是什么?
4、实现功能和使用的算法。精确地阐述它做了什么。
5、“输入-输出”格式。必须是确切和完整的。
6、操作指令。包括控制台及输出内容中正常和异常结束的行为。
7、选项。用户的功能选项有哪些?如何在选项之间进行挑选?
8、运行时间。在指定的配置下,解决特定规模问题所需要的时间?
9、精度和校验。期望结果的精确程度?如何进行精度的检测?
10、验证程序。即测试用例。
第16章:没有银弹
在未来的十年内,无论是在技术还是管理方法上,都看不出有任何突破性的进步,能够保证在十年内大幅度地提高软件的生产率、可靠性和简洁性。
我认为软件开发中困难的部分是规格说明、设计和测试这些概念上的结构,而不是对概念进行表达和对现实逼真程度进行验证。当然,我们还会犯一些语法错误,但是与绝大多数系统中的概念错误相比,它们是微不足道的。
重用:
重用是一件说起来容易,做起来难的事情。它同时需要良好的设计和卓越的文档。即使我们看到了非常罕见的优秀设计,但如果没有好的文档,我们也不会看到能重用的构件。
软件开发是一件棘手的事情,前方并不会有魔术般的解决方案。现在是从业者研究和分析革命性进展的时候,而不是等待或希望它出现。
1 | 只能根据过去判断将来,然而永远无法根据过去规划将来。 |
对于项目的成功而言,项目人员的素质、人员的组织和管理是比使用的工具或采用的技术方法更重要的因素。
按照时刻表完成进度的程序员一定会翻船。(某读者读后感)
做好菜需要一定的时间,如果人家让您多等会儿,那是为了让您最后吃得高兴。