《人月神话》读书笔记
什么是人月
人月(Man—month),指一个人在一个月能够达到的工作量。在计算机领域,特指一个程序员在一个月内编写有效代码的量。
什么是技术银弹
指由纯银质或镀银的子弹。在欧洲民间传说及19世纪以来哥特小说风潮的影响下,银色子弹往往被描绘成具有驱魔功效的武器,是针对狼人等超自然怪物的特效武器。
在计算机领域,技术银弹指能够使项目开发效率成倍数增长的技术或者解决方案。
没有技术银弹
《人月神话》最鲜明的一个观点就是:软件行业不存在技术银弹。作者大胆预言:在十年之内,没有任何方法能使软件开发效率翻十倍。
作者对于人月神话的否定原因可能是,软件行业的人对于项目过于乐观,他们都是乐观主义者,普遍认为项目一定能够按时完成。然而事实情况是惨烈的。
侯世达定律:做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。
从汇编到高级语言可能是一个技术飞跃,但是基于早些年大量的实验数据表明,这也只能使生产效率翻五倍。
面对对象编程(OO)尽管能够大幅提高代码复用率,但对于前期代码库的构建来说,也需要花费大量的时间。人月神话同样无法实现。
软件行业对于人月神话的追求,就像古代帝王对于不死术以及点石成金的追求,即使被证明是不存在的,那种寻找出路和希望能一劳永逸的愿望,依然十分强烈。
人月神话的白日梦限制了发展,浪费了精力。
bug总是无法避免的
人的思想不可能完美,程序是思想的具体实现,程序不可能没有bug
关于进度安排
项目进度安排:
- 1/3时间策划
- 1/6编码
- 1/2测试
当你错失掉一个进度里程碑后,一定要确保下一个里程碑的准时完成
人月不可加
Brooks法则:向进度落后的项目增加人手,只会使进度更加落后
项目所需要的时间 = 实质编码测试时间 + 人员交流时间
向进度落后的项目增加人手,会大大增加人员交流时间,使得项目所需要的时间更加长。小型、精干的队伍是最好的——思绪尽可能少。
理想的团队应该由两个人组成,这样最方便人员交流。
两个人的团队比一个要更好:代码的review能大大提高代码质量
悖论:巨大的工程是不可能只又几个人构成的,大型项目需要大量的人来实现。
解决方法:组建外科手术式队伍
外科手术式队伍
由首席程序员确定项目的模块划分、任务分工,首程领导一切技术人员。避免交叉领导情况出现。
首席程序员能够保证项目的概念完整性。
概念完整性是系统设计中最为重要的部分。
项目经理不用对项目进行技术指导,他们只需要保证项目成员之间的正常交流。
测试小组并不应该交由项目经理管理,他们实际上不应该属于这个项目,而是成为一个独立的小组,他们的对手是整个项目团队。在测试小组和项目团队的对抗中,项目将达到最大的稳定性。
测试
测试应该设置常规检测、边界检测、错误值检测,以确保代码的可靠性。
第二次开发往往是最失败的
第二次开发:指相同功能的程序从头开发第二次
原因:第二次开发,由于有了第一次开发的经验,会使得项目组成员不断的往里面加入新的功能,也就是说,实现一个功能,会有几种不同的方法,显而易见,这样的代码稳定性将会大大降低。
奥卡姆剃刀:如无必要,勿增实体
代码流程图无用
大量的编码实例告诉我们,流程图所起到的作用微乎其微。甚至流程图这一东西本身就是在代码编写完成后绘制的。他对编程的过程作用并没有想象的那么大。
系统维护
系统维护是一个熵增的过程,会导致系统的不稳定,任何功能的更新都会大概率引入新的bug。
系统就在不断的维护过程中灭亡。
增量开发
首先系统要能够正确的执行,即使未完成有效的功能,也能正确调用一系列伪子系统。接着,系统一点一点被充实,子系统轮流被开发,或是在更低的层次调用程序、模块、梓潼的占位符(伪程序)等。
这种开发模式能够极大的激发士气。当一个可运行的系统被搭建出来是,开发人员的热情就会被激发。