原则41:立即修复需求规格说明中的错误

在需求分析阶段修复错误。

* 如果错误保持到系统设计阶段,定位和修复要多花5倍的代价;

* 如果保持到编码阶段,要多花10倍的代价;

* 如果保持到单元测试阶段,要多花20倍的代价;

* 如果保持到交付阶段,要多花200倍的代价。

Boehm, B., "Software Engineering" IEEE Transactions on Computers, 25, 12(Dec. 1976), pp. 1226-1241.

原则40:立即确定需求

正确的做法是:立刻不计代价,尽可能多地获取需求信息。

> 需求难以理解,更难以说明。错误的办法是草率地完成需求规则说明,匆忙地进行设计和编码,然后徒劳地希望:

* 任何系统都比没有系统要好;
* 需求迟早会解决;
* 或者,设计师在开发过程中会明确可以开发什么。

> 正确的解决办法:
* 和客户交谈;
* 收集数据,把理解的需求记录下来,并规划构建一个满足这些需求的系统;
* 如果预期需求会发生很大变化,可以用增量的方式开发(原则14);
* 做好需求规格说明。

Boehm, B., "Verifying and Validating Software Requirements and Design Specifications", IEEE Software, 1, 1(Jan. 1984), pp. 75-88.

原则39:先确定问题,再写需求

方案的变化总是比构建系统的成本低。

* 不要匆忙提供解决方案;

* 不同解决方案的成本、风险、时间差别巨大,任何一个方案生效,都取决于特定的场景;

* 针对面临问题的人及问题的本质,要确保深入分析了所以的可能选择;

* 解决问题时,不要被最初方案带来的潜在兴奋所蒙蔽,方案的变化总是比构建系统的成本低。

Gause, D.,and G. Weinberg, Are Your Lights On? New York: Dorset House, 1990.

原则38:低质量的需求分析,导致低质量的成本估算

造成低质量成本估算的前5个原因,都与需求分析流程有关。

1. 频繁的需求变更;

2. 不完整的需求列表;

3. 不充足的用户沟通;

4. 低质量的需求规则说明;

5. 不充分的需求分析

> 为此
* 使用原型,降低需求不准确的风险;
* 使用配置管理,控制需求变更;
* 使用正式的方法,进行需求分析和编写需求规则说明。

lederer, A., and J. Prasad, "Nine Management Guidelines for Better Cost Estimating." Communications of the ACM, 35, 2(February 1992), pp. 51-59.

原则37:要承担责任

用最好的方法也可能产出糟糕的设计,最过时的方法也可能做出精致的设计。

* 不要有任何借口;

* 系统的开发者,要承担把系统做好的责任。

Hoare, C.A.R , "Software Engineering: A keynote Address", IEEE 3rd International Conference on Software Engineering, 1978, pp. 1-4.

原则36:研究再转换,不可行

研究再转化不可行.

> 软件研究所中令人难以置信的技术成就,有大量报道。但他们很少能应用于软件开发实战,原因是:
* 一般来说,软件研究者很少有开发实际系统的经验;

* 软件研究者发现,在解决一些技术问题的时候没有必要花费过多时间去“适配”真实场景,这样可使解决问题变得更快更容易;

* 研究者和实践者在用语上存在巨大的分歧,导致他们很难相互沟通。

> So
* 工业界萌发想法并验证效果,而不是在想法成型后再去做技术转化。

Basili, V. and J. Musa, "The future Engineering of software: A Management Perspective", IEEE Computer,24, 9(Sep. 1991), pp. 90-96.

原则35:对相同的概念用相同的名字

技术文档中,必须使用相同的术语来表示相同的概念。

* 为了不让读者困惑,不至于浪费时间去确认是否有新的技术信息;

* 此原则可以应用于规格说明、用户手册、设计文档、代码中的注释。

Meyer,B. "On Formalism in Specifications" IEEE Software, 2, 1 (January 1985), pp. 6-26

原则33:文档要有术语表

当阅读文档遇到不懂的术语时,我们都会感到沮丧。但当我们在术语表中查到说明时,沮丧的情绪顷刻就烟消云散了。

* 定义中使用的任何单词,都应该尽量避免再去术语表中查找定义;

* 术语说明文字中,要用特殊字体标识
原则32:使用文档标准

如果项目、组织或客户要求遵循一套文档标准,那就要遵循它。

* 遵循标准,理智地之行;

* 无论标准怎么规定,把你知道的应有内容包含进去;

* 如果文档没有被要求遵循某个标准,至少使用检查清单来检查是否有重大遗漏;

* IEEE / W3C发布的文档标准,是我所知道的最广泛的可用软件文档标准之一。

IEEE Computer Society, Software Engineering Standards Collection, Washington D.C.: IEEE Computer Society Press, 1993.