读书笔记-《代码大全》第3章 三思而后行:前期准备

2016-07-23  本文已影响0人  MuziLee_

Measure twice, cut once.
谋定而后动。

对于软件构建而言,

意义何在?

就像修建建筑物一样,项目的成败很大程度上在构建活动开始之前就已经注定了。如果地基没打好,或者计划不充分,那么你在构建期间能做得无非是尽量让损害最小罢了。

软件构建活动差不多占整个项目成本的65%。最糟糕的软件项目最终会进行两三次(甚至更多)构建。而良好的前期准备可以很大程度降低这种风险。其实它的中心目标就是降低风险。首先确保你在做正确的事情,后续正确地做事(构建)才有意义和产生正向价值。

诉诸逻辑
从管理角度看,做计划意味着确定项目所需要用的时间,人数以及计算机台数。
从技术角度看,做计划意味着弄清楚你想要建造的是什么,以防止浪费钱去建造错误的东西。
而且,与“先做一个错误的东西出来,然后扔掉并从头来过”的成本相比,花费比理想情况下更多的力气,找出他们真正想要的东西这种方式成本更加低廉,更值得投入。

诉诸类比
以食物链作为类比,如果食物链各层都受到了污染,那么越是食物链顶层的生物,最后被感染的程度就越严重。

诉诸数据
25年的研究数据证明,在一开始就把事情做好是最合算的。

惠普,IBM,休斯飞机公司,TRW以及其他组织的研究人员发现,在建构活动开始之前清除一个错误,那么返工的成本仅仅是在开发过程的最后阶段(在系统测试期间或者发布之后)做同样事情的十分之一但百分之一。

引入缺陷时间与找到缺陷时间,与修复缺陷的费用,之间的关系。(说明前期准备的意义)


对自己负责
只有当你习惯了这样的思维,你才有能力打造高质量的系统,因为未来的软件系统是极其复杂的,没有科学的思维和方法是没有办法在未来软件行业走得更远的。

总而言之
目标其实简单来讲是围绕以下三个子目标开展的:

前期准备的活动有哪些?

都有哪些活动可以保证我们做到降风险,降成本以及提高质量?让我们先来认识下都有哪些活动,然后再分别介绍它们都起到什么样的作用:

辨明软件类型

软件种类
迭代开发法对前期准备的影响

通过两个表对比,我们就可以知道有无进行前期准备的成本大致消耗。


无前期准备-成本花销 有前期准备-成本花销

由两个表的数据(需要合理怀疑数据的准确性)说明,跳过前期准备,使用迭代方法,成本将会在整个项目过程当中分次支付,而不会聚集在末尾一次性支付。整个项目尘埃落定之后,实际的总成本是相似的,但看起来没有那么高,因为开发费用是在整个项目进行过程中分期支付的,而不是项目最后一次性结账,心理作用?
但有合理的前期准备,无论迭代式开发法或序列式开发法,都可以减少成本。(而为什么现在大家都选用迭代式开发法,就是为了可以持续的交付,适应市场竞争。)
一条很有用的经验规则是,对于序列式开发法,计划好预先对大约80%的需求做出详细说明,并给“稍后再进行详细说明的额外需求”分配一定的时间。然后在项目进行过程中,实施系统化的变更控制措施——只接受哪些最有价值的新需求。另一种替代方案(迭代式开发法)是,预先只对最重要的20%的需求做详细说明,并且计划以小幅增量开发软件的剩余部分,随着项目的进行,对额外的需求和设计做出详细说明。如图所示,说明了两种方法活动情况。


不同方法活动阶段对比

定义问题

对系统需要解决的问题作出清楚的陈述。问题定义只涉及问题是什么,而不涉及任何可能的解决方案。
需要使用客户的语言,而且从客户角度来描述问题。因为最好的解决方案未必是一个计算机程序。
没有好的问题定义,你努力解决的可能是一个错误的问题。


正确瞄准问题靶心

定义需求

构建期间处理需求变更

在构建期间遇到需求变更,可以有以下几种方式评估和处理:

定义架构

意义何在?
架构的质量决定了系统的“概念完整性”。一个经过慎重考虑的架构为“从顶层到底层维护系统的概念完整性”提供了必备的结构和体系,它为程序员提供了指引——其细节程度与程序员的技能和手边的工作相配。它将工作分为几个部分,使多个开发者或者多个开发团队可以独立工作。

架构的典型组成部分:

一个好的架构定义应该要关注上述内容,并将上述内容描述清楚,为设计和实现阶段铺好一个框架。还有一个架构核对表,优秀的架构应该关注这些问题。



架构核对表——关注架构质量

前期准备的时间花费应如何安排?

一般而言,花费在问题定义、需求分析、软件架构上的时间,一句项目的需要而变化,一个运作良好的项目会在前期计划方面投入10%20%的工作量和20%30%的时间。这不包含详细设计的时间,因为详细设计是构建活动的一部分。
对于需求不稳定,如果是大型的正式项目,需要与需求分析师合作,解决需求分析的问题,这样你就需要为与需求分析师协商预留一定时间。
如果是小型非正式的项目,那你可能需要自己解决需求分析问题,要预留时间将需求定义足够清晰,将需求的不稳定性对构建活动的负面影响降至最低。
如果软件是你以前没有做过的类型,应当为“在新的领域中做设计”的不确定性预留更多时间。目标是创建良好的架构,所以预估时间后,不要被“为做好其他方面工作所需要的时间”所挤占。
如果有必要,可以把需求和架构工作当做独立的项目来对待。

相关好书推荐

需求类:
软件架构类:
上一篇 下一篇

猜你喜欢

热点阅读