精典书,再次重读
快速阅读时间参考: 20分钟
并非人越多越能干成活
人力一再增加,如果没关注到沟通也是很高的成本,那人投入越多,可能月数不降反增。
雇佣高手程序员
¥2万美元月薪的程序员的生产力可能是¥1万美元月薪程序员的10倍。
概念完整性
在系统设计中,概念完整性应该是最重要考虑因素。也就是说为了反映一系列连贯的设计思路,宁可省略一些不规则的特性和改进,也不提倡独立和无法整合的系统,哪怕它们其实包含着许多很好的设计。
来自编程人员的抱怨
当建议由体系结构的团队来编写计算机和编程系统的所有外部技术说明时,编程人员提出了三个反对意见:
该说明中的功能过于繁多,而对实际情况中的成本考虑比较少
结构师获得了所有创造发明的快乐,剥夺了实现人员的创造力
当体系结构的队伍缓慢工作时,很多实现人员只能空闲地坐着等待
这些问题中的第一个确实是一项危险,在下一章中我们将讨论这个问题,但其他的两个问题都是一些简单而纯粹的误解。正如我们前面所看到的,实现同样是一项高级别的创造性活动。具体实现中创造和发明的机会,并不会因为指定了外部技术说明而大为减少,相反创造性活动会因为规范化而得到增强,整个产品也一样。
最后一个反对意见是时间顺序和阶段性上的问题。问题的简要回答是,在说明完成的时候,才雇用编程实现人员。这也正是在搭建一座建筑时所采用的方法。
项目经理的经验的完整性
项目经理如何避免画蛇添足(second-system effect)?他必须坚持至少拥有两个系统以上开发经验结构师的决定。同时,保持对特殊诱惑的警觉,他可以不断提出正确的问题,确保原则上的概念和目标在详细设计中得到完整的体现。
巴比塔的失败在于没有好的交流和好的组织
据《创世纪》记载,巴比伦塔是人类继诺亚方舟之后的第二大工程壮举,但巴比伦塔同时也是第一个彻底失败的工程。
这个故事在很多方面和不同层次都是非常深刻和富有教育意义的。让我们将它仅仅作为纯粹的工程项目,来看看有什么值得学习的教训。这个项目到底有多好的先决条件?他们是否有:
1. 清晰的目标?是的,尽管幼稚得近乎不可能。而且,项目早在遇到这个基本的限制之前,就已经失败了。
2. 人力?非常充足。
3. 材料?在美索不达米亚有着丰富的泥土和柏油沥青。
4. 足够的时间?没有任何时间限制的迹象。
5.足够的技术?是的,金字塔、锥形的结构本身就是稳定的,可以很好分散压力负载。对砖石建筑技术,人们有过深刻的研究。同样,项目远在达到技术限制之间,就已经失败了。
那么,既然他们具备了所有的这些条件,为什么项目还会失败呢?他们还缺乏些什么?两个方面——交流,以及交流的结果——组织。他们无法相互交谈,从而无法合作。当合作无法进行时,工作陷入了停顿。通过史书的字里行间,我们推测交流的缺乏导致了争辩、沮丧和群体猜忌。很快,部落开始分裂——大家选择了孤立,而不是互相争吵。
概念的完整性的确要求系统只反映唯一的设计理念,用户所见的技术说明来自少数人的思想。实际工作被划分成体系结构、设计实现和物理实现,但这并不意味着该开发模式下的系统需要更长的时间来创建。经验显示恰恰相反,整个系统将会开发得更快,所需要的测试时间将更少。同工作的水平分割相比,垂直划分从根本上大大减少了劳动量,结果是使交流彻底地简化,概念完整性得到大幅提高。
第二个项目要小心
在设计第一个项目时,他会面对不断产生的装饰和润色功能。这些功能都被搁置在一边,作为“下一个”项目的内容。第一个项目迟早会结束,而此时的结构师,对这类系统充满了十足的信心,熟练掌握了相应的知识,并且时刻准备开发第二个系统。
第二个系统是设计师们所设计的最危险的系统。而当他着手第三个或第四个系统时,先前的经验会相互验证,得到此类系统通用特性的判断,而且系统之间的差异会帮助他识别出经验中不够通用的部分。
一种普遍倾向是过分地设计第二个系统,向系统添加很多修饰功能和想法,它们曾在第一个系统中被小心谨慎地推迟了。结果如同Ovid所述,是一个“大馅饼”
里程碑不要模糊,要可度量
里程碑的选择只有一个原则,那就是,里程碑必须是具体的、特定的、可度量的事件,能够进行清晰定义。以下是一些反面的例子,例如编码,在代码编写时间达到一半的时候就
已经“90%完成”了;调试在大多时候都是“99%完成”的;“计划完毕”是任何人只要愿意,就可以声明的事件1。
然而,具体的里程碑是百分之百的事件。“结构师和实现人员签字认可的规格说明”,“100%源代码编制完成,纸带打孔完成并输入到磁盘库”,“测试通过了所有的测试用例”。这些切实的里程碑澄清了那些划分得比较模糊的阶段——计划、编码、调试。
项目管理遇到问题了是自己解决还是汇报老板
当一线经理发现自己的队伍出现了计划偏离时,他肯定不会马上赶到老板那里去汇报这个令人沮丧的消息。团队可以弥补进度偏差,他可以想出应对方法或者重新安排进度以解决问题,为什么要去麻烦老板呢?从这个角度来看,好像还不错。解决这类问题的确是一线经理的职责。老板已经有很多需要处理的真正的烦心事了,他不想被更多的问题打搅。因此,所有的污垢都被隐藏在地毯之下。
但是每个老板都需要两种信息:需要采取行动的计划方面的问题,用来进行分析的状态数据3。出于这个目的,他需要了解所有开发队伍的情况,但得到状态的真相是很困难的。
一线经理的利益和老板的利益是内在冲突的。一线经理担心如果汇报了问题,老板会采取行动,这些行动会取代经理的作用,降低自己的威信,搞乱了其他计划。所以,只要项目经理认为自己可以独立解决问题,他就不会告诉老板。
有两种掀开毯子把污垢展现在老板面前的方法,它们必须都被采用。一种是减少角色冲突和鼓励状态共享,另一种是猛地拉开地毯。
没有银弹
我认为软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证。当然,我们还是会犯一些语法错误,但是和绝大多数系统中的概念错误相比,它们是微不足道的。
如果这是事实,那么软件开发总是非常困难的。天生就没有银弹。
让我们来考虑现代软件系统中这些无法规避的内在特性:复杂度、一致性、可变性和不可见性。
,Cox在两点上误解了《没有银弹》。首先,他断定软件困难来自“编程人员缺乏构建当今软件的技术”。而我认为根本困难是固有的概念复杂性,无论是任何时间,使用任何方法设计和实现软件的功能,它都存在。
关于人工智能的论述
现在有两种差异非常大的AI定义被广泛使用。AI-1:使用计算机来解决以前只能通过人类智慧解决的问题。AI-2:使用启发式和基于规则的特定编程技术。在这种方法中,对人类专家进行研究,判断他们解决方法的启发性思维或者经验法则⋯⋯。程序被设计成以人类解决问题的方式来运作。
关于増量开发,及提高开发士气
现在的软件开发流程基于如下的假设——事先明确地阐述系统,为系统开发竞标,实际进行开发,最后安装。我认为这种假设根本上就是不正确的,很多软件问题就来自这种谬误。因此,如果不进行彻底地调整,就无法消除那些软件问题。其中,一种改进是对产品和原型不断往复地开发和规格化。
增量开发——增长,而非搭建系统。我现在还记得在1958年,当听到一个朋友提及搭建(building),而不是编写(writing)系统时,我所感受到的震动。一瞬间,我的整个软件开发流程的视野开阔了。这种暗喻是非常有力和精确的。现在,我们已经理解软件开发是如何类似于其他的建造过程,并开始随意地使用其他的暗喻,如规格说明、构件装备、脚手架(测试平台)(specifications, assembly of components, and scaffolding)。
从我在软件工程试验班上开始推动这种方法起,其效果不可思议。在过去几十年中,没有任何方法和技术能如此彻底地改变我自己的实践。这种方法迫切地要求自顶向下设计,因为它本身是一种自顶向下增长的软件。增量化开发使逆向跟踪很方便,并非常容易进行原型开发。每一项新增功能,以及针对更加复杂数据或情况的新模块,从已经规划的系统中有机地增长。
这种开发模式对士气的推动是令人震惊的。当一个可运行系统——即使是非常简单的系统出现时,开发人员的热情就迸发了出来。当一个新图形软件系统的第一副图案出现在屏幕上时,即使是一个简单的长方形,工作的动力也会成倍地增长。在开发过程中的每个阶段,总有可运行的系统。我发现开发团队可以在四个月内,培育(grow)出比搭建(building)复杂得多的系统。
关于WIMP 图形画界面,原来在1968年就有理论提出来了
在过去20年内,软件开发领域中,令人印象最深刻的进步是窗口(Windows)、图标(Icons)、菜单(Menus)、指针选取(Pointing)界面的成功——或者简称为WIMP。这些在今天是如此的熟悉,以致于不需要任何解释。这个概念首先在1968年西部联合计算机大会(Western Joint Computer Converence)上,由斯坦福研究机构(Stanford Research Institute)的Doug Englebart公开提出。接着,这种思想被Xerox Palo Alto Research Center所采纳,用在了由Bob Taylor和他的团队所开发的Alto个人工作站中。Steve Jobs
在Apple Lisa型计算机中应用了该理念,不过Apple Lisa运行速度太慢,以致于无法承载这个令人激动的易用性概念。后来在1985年,Jobs在取得商业成功的Apple Macintosh机器上体现了这些想法。接下来,它们被IBM PC及其兼容机的Microsoft Windows所采用。我自己的例子则是Mac版本6。
人月的一种还算好的计算方式
按传统的人月计划基本不可能顺利完成,但是
人力(人)和时间(月)之间的平衡远不是线性关系,使用人月作为生产率的衡量标准实际是一个神话。特别的,他发现:15
第一次发布的成本最优进度时间,T = 2.5(MM)1/3。即,月单位的最优时间是估计工作量(人月)的立方根,估计工作量则由规模估计和模型中的其他因子导出。最优人员配备曲线是由推导得出的。
当计划进度比最优进度长时,成本曲线会缓慢攀升。时间越充裕,花的时间也越长。
当计划进度比最优进度短时,成本曲线急剧升高。
无论安排多少人手,几乎没有任何项目能够在少于3/4的最优时间内获得成功!当高级经理向项目经理要求不可能的进度担保时,这段结论可以充分地作为项目经理的理论依据。