软件世界中的一切的故事始于一个机器模型,而这个基本的机器模型并不复杂,可以用3个关键点来概括:指令、数据以及栈。它所能做的事是按照规定的顺序,逐步执行各条指令。但也就是这样一个简单的模型,支撑起了整个软件世界。
这一模型自从诞生伊始,就没发生什么本质上的改变。我们身处的客观世界却与此不同,客观世界有种种概念(以及实例),也有概念(以及实例)间的种种交互。
编程的根本任务就是把客观世界中的概念与逻辑向机器模型进行转换。这一转换过程也正是概念和逻辑逐步澄清的过程。这就是编程所要解决的根本问题,这点并不会因为编程语言乃至所待解决的具体事务的不同发生任何变化。
这一转换的起点是需求,终点是可执行的一组文件。两者一体两面,彼此间形成映射。
从这一背景下,我们可以看出,需求开发的根本目的就是明确客观世界中软件的边界和内容,其关键是提升确定性。一旦不确定性增加,需求变更将增加,作为终点的软件产品必然需要来回调整以适应这种变更,这会导致人力资源的浪费。
显然,如果我们最终需要A,最简单的办法是直接创建A。无论是先创建C,调整成B,再调整回A还是创建成了B,再调整成A都会引起内耗。而明确要的东西是A还是B,其主要手段就是需求开发。
这时不能忽视的是需求的天然的不确定特征。这种不确定性有两种主要来源:
第一种来源是纯粹的、主观的、偶然的。如客户表达能力,客户的偏好等。
第二种来源却是相对客观的、必然的。一方面客户对自己期待的产品也有一个逐步深化理解的过程;另一方面客户所面对的环境也在不停地发生变化,而这种变化自然也就会传导到软件产品中来。
第二种来源对软件需求开发的影响更为深远。
从软件的本质来看,软件可以说是现实世界中各种思维的延伸和固化,而我们所处的这个世界自身则是在以一种令人瞠目结舌的速度变化着的。
斯塔夫里阿诺斯在《全球通史》中说:
地质年代以10亿年为计算单位,人类史前时代以千年记,而自从进入文明社会后,纪年单位开始不断缩小,逐渐变成以百年甚至十年记。时至今日,每天都有许多重大事件无休无止地蜂拥而来,无情地包围着我们。变化之迅速确实已经导致了一个非常实际的问题:人类是否能够迅速适应变化,以避免被淘汰,甚至被灭绝的命运呢?
作为史学家,斯塔夫里阿诺斯认识到世界的变化正在加剧,他甚至担心人类未必能够很好地应对各种变化。而他所担心的这种迅速变化往往会被毫无遗漏地传递到软件中来。这导致软件总是不得不在不确定性下前行。落到具体某个软件下面,则表现为需求的不确定性。这种不确定性是客观的,不以主观意愿而发生变化的。
好的需求开发和坏的需求开发的价值差异,正是在于对这种不确定性的把握程度。而如何与客户保持顺畅的沟通,如何顺应客户的偏好,无疑也是重要的,但这更类似“政治因素”,并不在我们考察的范围之内。
本书后续所有的章节都基于这样的一个前提:客户是积极配合的,他知道的东西并不会有意不告诉你。
RUP中的需求的分类
需求是一个过于含糊的词,但凡可以对软件形成约束的东西似乎都可以称为需求。
RUP把需求大致分成了10类,下面是RUP需求模板的目录,其中3.1~3.10可以认为是需求的10个类别。
1.简介
1.1 目的
1.2 范围
1.3 定义、首字母缩写词和缩略语(www.xing528.com)
1.4 参考资料
1.5 概述
2.整体说明
3.具体需求
3.1 功能
3.2 可用性
3.3 可靠性
3.4 性能
3.5 可支持性
3.6 设计约束
3.7 联机用户文档和帮助系统需求
3.8 购买的构件
3.9 接口
3.9.1用户界面
3.9.2硬件接口
3.9.3软件接口
3.9.4通信接口
3.10 许可需求
3.12 适用的标准
4.支持信息
这个分类非常全面,但可以做一点进一步的概括。事实上,需求可以大致分为两大类:一类描述软件产品“是什么”,而另一类描述“怎么做”上的约束。在本书中论述需求时,并不涉及后者。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。