1 人月神话_part1
1 编程的乐趣
- 创造事物的纯粹快乐
- 快乐来自于开发对别人有用的东西
- 学习的乐趣,来自于工作的非重复特性
- 乐趣还来自于工作的介质容易驾驭
2 职业的苦恼
- 必须追求完美:一点点不匹配都能导致魔术失效
- 依赖于其他人设定目标,并依靠自己无法控制的程序
- 调试和查错:伴随创造的往往是枯燥沉闷的时间和劳动
- 软件项目越接近完成,收敛得越慢
- 产品即将完成的时候,又有了新的方案
3 人月神话
英文是The Mythical Man-Month。用人月衡量一项工作的规模,是一个危险和带有欺骗性的神话,因为它暗示人员数量和时间是可以相互替换的。
缺乏合理的时间进度是造成项目滞后的最主要原因,比其他所有因素加起来影响还大。成本的确随开发产品的人数和时间的不同,有很大变化,进度却不是如此。向进度落后的项目中增加人手,只会使进度更加落后:从三个方面增加了项目必要的总体工作量:任务重新分配本身和所造成的工作中断;培训新人员;额外的相互沟通。
人类和时间的互换仅仅适用于以下情况:某个任务可以分解给参与人员;子任务之间不需要相互沟通。调试、测试的次序特性,使得很多任务无法分解。软件开发的实践,很快会消耗任务分解所节省下来的个人时间,并不会缩短时间进度。
4 合理的软件任务安排
- 1/3 计划
- 1/6 编码
- 1/4 构建测试、早起系统测试
- 1/4 系统测试(所有构件已完成)
剔除bug的设计;构建单元调试、系统集成调试。
5 十人编程
同样有两年经验,而且受到同样培训的情况下,优秀程序员的工作效率是较差程序员的十倍。需要协作沟通的人员数量影响着开发成本,因为成本的主要部分是相互的沟通和交流,以及更正沟通不当所引起的不良结果(系统测试)。
- 首席程序员:需要极高的天分,十年的经验,应用数学、业务数据处理,以及其他方面大量的系统和应用知识。
- 副手:需要相对较少的经验,某个功能和接口团队的代表人,但不承担代码部分的具体开发职责。
- 程序职员:负责维护编程产品库中所有团队的技术记录,归档以前和最新的运行情况日志,使用交互式工具来控制产品逐步增长的完整性和有效性。
- 测试人员:负责设计各个功能的系统测试用例,列出测试的步骤,以及为测试搭建测试平台。
6 实现人员的心态
概念完整性是系统设计最重要的考虑因素,功能与理解上的复杂程度之比是系统设计的最终测试标准,必须由一个人或者具有共识的小型团队来完成。实现人员的反对意见:
- 文档中的功能过于繁多,对实际成本考虑的少。
- 结构师获得了创造的快乐,这剥夺了实现人员的创造力。
- 体系结构团队缓慢工作时,实现人员只能空闲地等待。
实现同样是一项高级别的创造性活动;具体实现中创造和发明的机会,并不会因为指定了外部技术说明而减少,反而创造性活动因为规范化会得到增强。应该在文档完成的时候,再雇佣编程实现人员。
体系结构、设计实现、物理实现,许多工作可以同时开始和并发地进行。
7 巴别塔的失败
伊甸园
上帝耶和华用七天时间创造了世间万物,亚当和夏娃赤身躶体地住在伊甸园,所有的动物都要听从亚当的指挥。但上帝警告说智慧树上的果子绝不能碰。在一条蛇(撒旦)的引诱下,两人先后吃了智慧果,被上帝诅咒并赶出了伊甸园,人类于是有了原罪。
诺亚方舟
上帝见到地上充满罪恶,计划用洪水消灭恶人。但他发现有个叫诺亚的好人,便指示诺亚建造一艘方舟,把妻子、儿子儿媳,以及一对对动物带上方舟。洪水过后,上帝在天空制造了彩虹,与人们约定再也不会有大洪水。(“彩虹之约”)
巴别塔
大家商量着建造一座城和一座通天塔,这样即使再有洪水也不用畏惧。“传扬我们的名,免得分散在全地上” vs “赞美耶和华,要传扬他的名”
上帝的回应很绝妙:使人类的语言不通,因为只要大家能有效沟通,就可以成就极大的事情,语言承担的角色相当重要。上帝不用剿灭建筑工人,没有暗杀、监视、离间等,不动用任何武力,只简简单单变乱了口音,便能直击要害。
8 团队的有效沟通
- 非正式途径:鼓励大量的电话沟通,以达成对所书写文档的共同理解。
- 项目会议:团队一个接一个进行技术陈述,能有效澄清细小误解。
- 项目工作手册:在项目开始阶段即准备好正式的项目工作手册。
不是独立的一篇文档,而是对项目一系列产出文档的组织框架。包括目的、外部规格说明、接口说明、技术标准、内部说明和管理备忘录。如果实现制订了良好结构,可以将后来的文字放置在合适的章节中,实时更新是至关重要的。
在基本语句级别,生产率似乎是固定的;使用适当的高级语言(相比汇编语言),生产率可以提高5倍。高级语言不仅提升了生产率,还改进了调试:bug更少,以及更容易寻找。