人月神话

人月神话读书笔记

人月神话是关于软件工程的一本比较经典的著作,它提出了很多软件工程管理方面的一致性的问题和关于实践的解决方法,它的作者Frederick P.Brooks,曾经是IBM360操作系统的主要负责人,所以又被称为IBM360系统之父,获得过计算机领域具有最高声望的图灵奖,早期,Brooks还曾担任IBM Stretch和Harvest计算机的体系结构师,本书就是他对自己丰富经历的一个总结,这么多年来经久不衰。

第一章从焦油坑困住野兽的例子引入,野兽在焦油坑中越挣扎最后往往陷得越深,无一例外,同样软件产品也是,对于可运行的系统只有极少数符合目标进度和预算的要求,似乎出现的每个问题都能解决,但是当这些问题相互纠缠和逐渐累积在一起的时候,团队的行动效率将会变得很低,久而久之各种各样的团队都淹没在这样的焦油坑中。

我们在编程开发中的苦恼之一就是调试和查错往往是线性收敛的,甚至的是二次方的复杂度,然后测试一拖再拖,最后解决最后一个困难的难度总比第一个复杂的多,除此之外当你终于付出很大劳动的完成了很多工作的时候,却发现这个出现了新的更好的构思的时候就会很无奈。

在各种软件项目之中,项目滞后的最主要原因是进度安排的不合理,怎么样能够更加有效合理的避免这样的问题很关键,书中提到首先要避免过于乐观的假设,去对估算技术做出一定的研究,然后去合理的做出假设,将进度和工作量做出区分,估算应该在工作中持续的进行,对进度过程正确的跟踪和监督也必不可少,最后进度偏移时,不应该一味的去增加人力去尝试解决问题,大多时候只能是火上浇油,正确的做法是重新安排进度或者消减任务。贯穿全书的人月是估计和进度安排中使用的工作量单位,用人月去衡量一项工作的规模是一项危险且有欺骗性的神话,暗示人员数量和时间是具有交换性的,因此它只适合不需要参与人员过多的交流的情况。

书中强调需要协作沟通的人员数量影响着开发成本,成本的主要组成部分是相互的沟通交流以及更正沟通不良所引起的不良结果,暗示项目应该主由高效富有经验的人员组成的开发团队。此外团队的分工必须尽可能明确。

系统设计中概念完整性应该是重要应该考虑到的因素,就是说为了反映一系列的连贯思路,即使存在着很多好的设计也要去省略这些不一致的不规则的特性和改进。简洁和直白来源于概念上的完整性,每个部分必须反映相同的原理需求一致平衡,在语法上每个部分应使用相同的技巧,语义上应该有同样的相似性,所以易用性应该具有设计的一致性和概念上的完整性。概念的完整性要求设计必须由一个人或者非常少数具有默契性的人员实现,不能与系统概念进行整合的良好想法和特色可以先不考虑,出现非常重要而不兼容的构想,就应该抛弃原来的设计,对不同概念进行合并,在合并后的系统上重新开始。这就是所谓的贵族专制统治所汲取来的,同时民主政治也是需要考虑的,纪律、规则对行业是有益的,对于体系结构而言,外部的体系结构规定实际上是增强,而不是限制实现小组的创造性,对于非常大型的项目,将设计方法、体系结构方面的工作与具体实现相分离是获得概念完整性的强有力方法,最后要补充的是体系结构、设计实现、物理实现的许多工作可以并发进行。

尽早交流和持续沟通能使结构师有较好的成本意识,以及使开发人员获得对设计的信心,并且不会混淆各自的责任分工。结构师要谨记的基本原则一个是牢记是开发人员承担创造性的实现责任,并且结构师只能提出建议,另一个是听取开发人员在体系结构上改进的建议。第二个系统是人们所设计的最危险的系统,通常的倾向是过分地进行设计。关于这一点也许是正确的,但是这是一个回避不了的问题,如果没有开发第二个系统经验的人,就不可能有开发第三个系统经验的人了。

出于精确性的考虑,我们需要形式化的设计定义,同样,我们需要记叙性定义来加深理解,及时的做出日志记录和整理发布,独立的产品测试小组对项目组意义非凡以提高产品的质量,巴比伦塔的失败告诫我们团队应该以尽可能多的方式进行相互之间的交流,比如非正式、常规项目会议,会上进行简要的技术陈述、共享的正式项目工作手册。

目标、用户手册、内部文档、进度、预算、组织机构图和工作空间分配,即使是小的软件项目也是不可或缺的要素,一旦认识到试验性的系统必须被构建和丢弃,具有变更思想的重新设计不可避免,从而直面整个变化现象是非常有用的。第一步是接受这样的事实:变化是与生俱来的,不是不合时宜和令人生厌的异常情况。然后为变更计划系统和组织架构,记住在每次修复之后,必须重新运行先前所有的测试用例。

项目经理应该制订一套策略,以及为通用工具的开发分配资源,与此同时,他还必须意识到专业工具的需求。要能够通过一个严格的进度表来控制项目,进度表包括基本的里程碑和日期,同时必须区别行动信息和状态信息,不对项目经理可以解决的问题做出反应,并且决不在检查状态报告的时候做安排,以此控制项目的进度。文档能在整个软件开发的生命周期对程序员克服懒惰和进度的压力起促进激励作用,但向编程人员成功地灌输对待文档的积极态度是一件困难的事情,为了使文档易于维护,将它们合并至源程序是至关重要的,而不是作为独立文档进行保存。

没有任何技术或管理上的进展,能够独立地许诺十年内使生产率、可靠性或简洁性获得数量级上的进步。软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证。而现代软件系统中这些无法规避的内在特性:复杂度、一致性、可变性和不可见性。

对于根本问题的一些方法:需求精炼和快速原型。软件开发人员为客户所承担的最重要的职能是不断重复地抽取和细化产品的需求。计划任何软件活动时,要让客户和设计人员之间进行多次广泛的交流沟通,并将其作为系统定义的一部分。原型的目的是明确实际的概念结构,从而客户可以测试一致性和可用性。增量开发——增长,而非搭建系统。卓越的设计人员。卓越设计来自卓越的设计人员。软件开发是一个创造性的过程。完备的方法学可以培养和释放创造性的思维,但它无法孕育或激发创造性的过程。非常卓越的设计者产生的成果更快、更小、更简单、更优雅,实现的代价更少,所以可以着手的最重要工作是寻求培养卓越设计人员的途径。

你可能感兴趣的:(人月神话)