什么是软件需求

来 源: Linuxaid 作者:axing

对大多数人来说,若要建一幢数百万元的房子,他一定会与建房者详细讨论各种细节,他们都明白完工以后的修改会造成损失,以及变更细节的危害性。然而,涉及到软件开发,人们却变得“大大咧咧”起来。软件项目中百分之四十至百分之六十的问题都是在需求分析阶段埋下的“祸根”(Leffing well 1997)。 可许多组织仍在那些基本的项目功能上采用一些不合规范的方法,这样导致的后果便是一条鸿沟(期望差异)—开发者开发的与用户所想得到的软件存在着巨大期望差异。
在软件工程中,所有的风险承担者(stakeholder)(这个词很有意思,原义是赌金保管者。我看过很多的翻译,有翻译成涉众的,也有的翻译成参与者的,但是我想他的主要意思就是和这个项目有密切相关利益的人)都感兴趣的就是需求分析阶段。这些风险承担者包括客户、用户、业务或需求分析员(负责收集客户需求并编写文档,以及负责客户与开发机构之间联系沟通的人)、开发人员、测试人员、用户文档编写者、项目管理者和客户管理者。这部分工作若处理好了,能开发出很出色的产品,同时会使客户感到满意,开发者也倍感满足、充实。若处理不好,则会导致误解、挫折、障碍以及潜在质量和业务价值上的威胁。因为需求分析奠定了软件工程和项目管理的基础,所以所有风险承担者最好是采用有效的需求分析过程。

软件需求的定义
IEEE软件工程标准词汇表(1997年)中定义需求为:
(1)用户解决问题或达到目标所需的条件或权能(Capability)。
(2)系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。
(3)一种反映上面(1)或(2)所描述的条件或权能的文档说明。

需求的层次
下面这些定义是需求工程领域中常见术语的定义说明。
软件需求包括三个不同的层次—业务需求、用户需求和功能需求—也包括非功能需求。业务需求( business requirement)反映了组织机构或客户对系统、产品高层次的目标要求,它们在项目视图与范围文档中予以说明。用户需求(user requirement) 文档描述了用户使用产品必须要完成的任务,这在使用实例(use case)文档或方案脚本(scenario)说明中予以说明。功能需求(functional requirement)定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了业务需求。所谓特性(feature)是指逻辑上相关的功能需求的集合,给用户提供处理能力并满足业务需求。软件需求各组成部分之间的关系如图所示。
作为补充,软件需求规格说明还应包括非功能需求,它描述了系统展现给用户的行为和执行的操作等。它包括产品必须遵从的标准、规范和合约;外部界面的具体细节;性能要求;设计或实现的约束条件及质量属性。所谓约束是指对开发人员在软件产品设计和构造上的限制。质量属性是通过多种角度对产品的特点进行描述,从而反映产品功能。多角度描述产品对用户和开发人员都极为重要。
值得注意的一点是,需求并未包括设计细节、实现细节、项目计划信息或测试信息。需求与这些没有关系,它关注的是充分说明你究竟想开发什么。
Frederick Brooks在他1987年的经典的文章“No Silver Bullet:Essence and Accidents ofSoftware Engineering ”中充分说明了需求过程在软件项目中扮演的重要角色:
开发软件系统最为困难的部分就是准确说明开发什么。最为困难的概念性工作便是编写出详细技术需求,这包括所有面向用户、面向机器和其它软件系统的接口。同时这也是一旦做错,将最终会给系统带来极大损害的部分,并且以后再对它进行修改也极为困难。
为什么这么说呢,因为在大多数的软件系统中,最终用户可能都不清楚他的需求是什么,这是千真万确的。如果你的用户告诉你需求就是这些了,不要相信他,继续刨根问底,直到你们都筋疲力尽了。
虽然听上去有些不可思议,但这是教训之谈,在我从事的项目之中,没有一个用户在软件接近完成的时候打电话对我说,我看了你们的软件,我想我必须改动一些地方。在那些日子中,我甚至得了一种电话铃音恐惧症。

需求风险
下面列出了在做需求分析时一些很危险的做法,如果你发现你的一些做法与之相似,那么,给自己一些时间,好好思考一下,这些做法会对你的软件产生致命的影响。
1. 无足够用户参与
客户经常不明白为什么收集需求和确保需求质量需花费那么多功夫,开发人员可能也不重视用户的参与。究其原因:一是因为与用户合作不如编写代码有意思;二是因为开发人员觉得已经明白用户的需求了。在某些情况下,与实际使用产品的用户直接接触很困难,而客户也不太明白自己的真正需求。但还是应让具有代表性的用户在项目早期直接参与到开发队伍中,并一同经历整个开发过程。
最重要的就是用户必须要重视他的软件,必须让他明白:如果失败,他的损失最大(当然你的损失也不小,但这时候你必须让他重视这项工作)。如果用户不够重视,想办法解决,否则你就不用再继续了。
2. 用户需求的不断增加
在开发中若不断地补充需求,项目就越变越庞大以致超过其计划及预算范围。这使得问题更难解决。实际上,问题根源在于用户需求的改变和开发者对新需求所作的修改。要想把需求变更范围控制到最小,必须一开始就对项目视图、范围、目标、约束限制和成功标准给予明确说明,并将此说明作为评价需求变更和新特性的参照框架。说明中包括了对每种变更进行变更影响因素分析的变更控制过程,有助于所有风险承担者明白业务决策的合理性,即为何进行某些变更,相应消耗的时间、资源或特性上的折中。
产品开发中不断延续的变更会使其整体结构日渐紊乱,补丁代码也使得整个程序难以理解和维护。插入补丁代码使模块违背强内聚、松耦合的设计原则,特别是如果项目配置管理工作不完善的话,收回变更和删除特性会带来问题。如果你尽早地区别这些可能带来变更的特性,你就能开发一个更为健壮的结构,并能更好地适应它。这样设计阶段需求变更不会直接导致补丁代码,同时也有利于减少因变更导致质量的下降。
最糟糕的莫过于用户觉得如果不再加点什么功能就对不起自己。我曾经看过一个数据仓库的一期工程,在设计阶段没有很好的定义范围,当我向项目管理者提出这个问题的时候,他认为都已经说好了,合同上也写清楚了,并没有加以重视。可是最后,用户提出的修改意见已经远远超出了范围,项目时间也延长了一倍。整个的项目组成员疲惫不堪,可是却不断的接到用户投诉说项目失败。
3. 模棱两可的需求
模棱两可是需求规格说明中最为可怕的问题(Lawrence 1996)。它的一层含义是指诸多读者对需求说明产生了不同的理解;另一层含义是指单个读者能用不止一个方式来解释某个需求说明。
模棱两可的需求会使不同的风险承担者产生不同的期望,它会使开发人员为错误问题而浪费时间,并且使测试者与开发者所期望的不一致。一位系统测试人员曾告诉我,她所在的测试组经常对需求理解有误,以致不得不重写许多测试用例并重做许多测试。
模棱两可的需求带来不可避免的后果便是返工—重做一些你认为已做好的事情。返工会耗费开发总费用的40%,而70%~85%的重做是由于需求方面的错误所导致的(leffingwell 1997)。想像一下如果你能减少一半的返工会是怎样的情况?你能更快地开发出产品,在同样的时间内开发更多、更好的产品,甚至能偶尔回家休息休息。
处理模棱两可需求的一种方法是组织好负责从不同角度审查需求的队伍。仅仅简单浏览一下需求文档是不能解决模棱两可问题的。如果不同的评审者从不同的角度对需求说明给予解释,但每个评审人员都真正了解需求文档,这样二义性就不会直到项目后期才被发现,那时再发现的话会使得更正代价很大。
4. 不必要的特性
“画蛇添足”是指开发人员力图增加一些“用户欣赏”但需求规格说明中并未涉及的新功能。经常发生的情况是用户并不认为这些功能性很有用,以致在其上耗费的努力“白搭”了。
开发人员应当为客户构思方案并为他们提供一些具有创新意识的思路,具体提供哪些功能要在客户所需与开发人员在允许时限内的技术可行性之间求得平衡,开发人员应努力使功能简单易用,而不要未经客户同意,擅自脱离客户要求,自作主张。
同样,客户有时也可能要求一些看上去很“酷”,但缺乏实用价值的功能,而实现这些功能只能徒耗时间和成本。为了将“画蛇添足”的危害尽量减小,应确信:你明白为什么要包括这些功能,以及这些功能的“来龙去脉”,这样使得需求分析过程始终是注重那些能使用户完成他们业务任务的核心功能。
时刻记住:软件成功的标准是是否解决用户的问题,而不是它有多Cool的功能。
5. 过于精简的规格说明
有时,客户并不明白需求分析有如此重要,于是只作一份简略之至的规格说明,仅涉及了产品概念上的内容,然后让开发人员在项目进展中去完善,结果很可能出现的是开发人员先建立产品的结构之后再完成需求说明。这种方法可能适合于尖端研究性的产品或需求本身就十分灵活的情况(McConnell 1996),不过商业应用大多都不是这种情况。在大多数情况下,这会给开发人员带来挫折(使他们在不正确的假设前提和极其有限的指导下工作),也会给客户带来烦恼(他们无法得到他们所设想的产品)。
6. 忽略了用户分类
大多数产品是由不同的人使用其不同的特性,使用频繁程度也有所差异,使用者受教育程度和经验水平也不尽相同。如果你不能在项目早期就针对所有这些主要用户进行分类的话,必然导致有的用户对产品感到失望。例如,菜单驱动操作对高级用户太低效了,但含义不清的命令和快捷键又会使不熟练的用户感到困难。
7. 不准确的计划
“上述是我对新产品的看法,好,现在你能告诉我你什么时候能完成吗?”许多开发人员都遇到这种难题。对需求分析缺乏理解会导致过分乐观的估计,而当不可避免的超支发生时,会带来颇多麻烦。据报道,导致需求过程中软件成本估计极不准确的原因主要有以下五点:频繁的需求变更、遗漏的需求、与用户交流不够、质量低下的需求规格说明和不完善的需求分析(Davis 1995)。
对不准确的要求所提问题的正确响应是“等我真正明白你的需求时,我就会来告诉你”。基于不充分信息和未经深思的对需求不成熟的估计很容易为一些因素左右。要作出估计时,最好还是给出一个范围(如最好的情况下,很可能的,最坏情况下)或一个可信赖的程度(我有9 0 %的把握,我能在8周内完成)。未经准备的估计通常是作为一种猜测给出的,听者却认为是一种承诺。因此我们要尽力给出可达到的目标并坚持完成它。

什么是优秀的需求
讨论软件需求的文章有很多,对于需求的标准也不尽相同,这里我想用NASA的软件开发过程中的概念,软件需求过程的标准是:清楚(Clear)、完整(Complete)、一致(Consistent)、可测试(Testable),此外还有其他的概念,如可跟踪的、可修改的等等。
清楚:目前大多数的需求分析采用的仍然是自然语言(因为如果采用形式化语言的话,和用户的沟通将成为一个大问题,这意味着客户在开发软件之前必须先进行形式化语言培训,这是不现实的)。自然语言对需求分析最大的弊病就是它的二义性。所以我们不得不对需求分析中采用的语言做某些限制。例如尽量采用主语+动作的简单表达方式。说白了,需求分析中的描述让人看上去像是刚学习写作的小孩子就对了,千万不要采用疑问句、修饰这些华丽的表达方式。
除了语言的二义性之外,主意不要使用行话,就是计算机术语。需求分析最重要的是和用户沟通,可是用户多半不是计算机的专业人士,如果在需求分析中使用了行话,就会造成用户理解上的困难。
打个比方,如果你要做一个银行的信用卡系统,你就可以这样描述软件需求:银行的卡部管理信用卡,每张信用卡只属于一个帐户。信用卡有卡号、余额。一张信用卡有多笔的交易记录。
完整:再也没有什么比软件开发接近完成是发现遗漏了一项需求更糟的事情了。需求的完整性是非常非常重要的,想象一下遗漏需求而不得不返工,这简直就是恶梦。可是令人遗憾的是,需求的遗漏是很经常发生的事情,不仅仅是你的问题,更多的问题发生在用户那里,他们不知道该做些什么。要做到需求的完整性是很艰难的一件事情,它涉及到需求分析过程的各方各面,贯穿了整个过程,从最初的计划制定到最后的需求评审。至于完整性的详细讨论,我们会在下面的章节中讨论,现在你只需要拼命的想象缺乏完整性的坏处,直到你出了一身的冷汗。出了吗?好,那我们继续。
一致:一致性也是一个比较大的概念,很难用几句话讲清楚。还记得我们在开始的时候提到的需求的层次吗?简单的来说,就是用户需求必须和业务需求一致,功能需求必须和用户需求一致。严格的遵守不同层次间的一致性关系,就可以保证最后开发出来的软件系统不会偏离最初的实现目标。在实现过程中,我们还必须把一致性关系细化。比如说用户需求不能超出先前指定的范围。
可测试:大家觉得一个项目的测试从什么时候开始呢?有人说从编码完成后开始。更清楚一点的说是编码的时候同时进行单元测试,编码完成后进行系统测试。这些都没有错。但是实际上测试是从需求分析过程就开始了。需求分析是测试计划的输入和参照。这就要求需求分析是可测试的。什么是可测试呢?“我们要用新的系统完成报表自动化处理”,你觉得这个需求是可测试的吗?当然不是,报表包括哪些?自动化处理的标准是什么?这些在需求中都没有说明。因此这项需求是无法测试的,就是不具有可测试性。说到这里,大家可能就会明白之前的需求的几项标准都是为了保证需求的可测试性的。事实就是这样,只有系统的所有需求是可以被测试的,才能够保证软件始终围绕着用户的需要,保证软件系统是成功的。大家真正在应用一些科学的方法的时候也应该记住,任何的方法都是为了保证软件的成功,不要偏离这个目标,千万不要走火入魔了,呵呵,很容易的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 前言 第一部分 软件需求:是什么和为什么 第1章 基本的软件需求 1 1.1 软件需求的定义 2 1.1.1 一些关于“需求”的解释 2 1.1.2 需求的层次 3 1.2 每个项目都有需求 4 1.3 什么情况将会导致好的群体发生不合格的需求说明 5 1.4 高质量的需求过程带来的好处 7 1.5 优秀需求具有的特性 7 1.5.1 需求说明的特征 7 1.5.2 需求规格说明的特点 8 1.6 需求的开发和管理 9 第2章 客户的需求观 11 2.1 谁是客户 12 2.2 客户与开发人员之间的合作关系 12 2.2.1 软件客户需求权利书 13 2.2.2 软件客户需求义务书 15 2..3 “签约”意味着什么 17 第3章 需求工程的推荐方法 18 3.1 知识技能 19 3.2 需求获取 20 3.3 需求分析 21 3.4 需求规格说明 22 3.5 需求验证 23 3.6 需求管理 23 3.7 项目管理 24 第4章 改进需求过程 26 4.1 需求与其他项目过程的联系 26 4.2 软件需求对其他项目风险承担者的影响 27 4.3 软件过程改进的基础 28 4.4 过程改进周期 29 4.4.1 评估当前采用的方法 29 4.4.2 制定改进活动计划 30 4.4.3 建立、实验和实施新的过程 31 4.4.4 评估结果 32 4.5 需求过程的积累材料 33 4.5.1 需求开发过程的积累材料 34 4.5.2 需求管理过程的积累材料 34 4.6 需求过程改进路标 35 第5章 软件需求与风险管理 37 5.1 软件风险管理基础 38 5.1.1 风险管理的要素 38 5.1.2 编写项目风险文档 39 5.1.3 制定风险管理计划 40 5.2 与需求有关的风险 41 5.2.1 需求获取 41 5.2.2 需求分析 42 5.2.3 需求规格说明 42 5.2.4 需求验证 43 5.2.5 需求管理 43 5.3 风险管理是你的好助手 43 第二部分 软件需求工程 第6章 建立项目视图与范围 45 6.1 通过业务需求确定项目视图 45 6.2 项目视图和范围的文档 46 6.3 关联图 50 6.4 把注意力始终集中在项目的范围上 51 第7章 寻找客户的需求 52 7.1 需求的来源 52 7.2 用户类 53 7.3 寻找用户代表 54 7.4 产品的代表者 55 7.4.1 寻求产品代表者 56 7.4.2 产品代表者的期望 56 7.4.3 多个产品代表者 57 7.5 谁作出决策 58 第8章 聆听客户的需求 60 8.1 需求获取的指导方针 60 8.2 基于使用实例的方法 62 8.2.1 使用实例和用法说明 62 8.2.2 确定使用实例并编写使用实例文档 64 8.2.3 使用实例和功能需求 67 8.2.4 使用实例的益处 67 8.2.5 避免使用实例陷阱 68 8.3 对客户输入进行分类 69 8.4 需求获取中的注意事项 70 8.5 如何知道你何时完成需求的获取 71 第9章 编写需求文档 72 9.1 软件需求规格说明 72 9.1.1 标识需求 73 9.1.2 处理不完整性 74 9.1.3 用户界面和软件需求规格说明 74 9.2 软件需求规格说明模板 75 9.3 编写需求文档的原则 79 9.4 需求示例的改进前后 81 9.5 数据字典 83 第10章 需求的图形化分析 85 10.1 需求建模 85 10.2 从客户需求到分析模型 86 10.3 数据流图 87 10.4 实体联系图 88 10.5 状态转换图 90 10.6 对话图 92 10.7 类图 94 10.8 最后的提醒 96 第11章 软件的质量属性 97 11.1 非功能需求 97 11.2 质量属性 97 11.3 定义质量属性 98 11.3.1 对用户重要的属性 99 11.3.2 对开发者重要的属性 100 11.4 属性的取舍 101 第12章 通过原型法减少项目风险 103 12.1 原型是“什么”和“为什么”要原型 103 12.2 水平和垂直的原型 103 12.3 抛弃型原型或进化型原型 104 12.4 书面原型和电子原型 106 12.5 原型评价 107 12.6 原型法的最大风险 108 12.7 原型法成功的因素 108 第13章 设定需求优先级 110 13.1 为什么要设定需求的优先级 110 13.2 不同角色的人处理优先级 111 13.3 设定优先级的规模 111 13.4 基于价值、费用和风险的优先级设定 112 第14章 需求质量验证 116 14.1 需求评审 117 14.1.1 审查过程 118 14.1.2 需求评审的困难 122 14.2 测试需求 124 第15章 需求开发向设计规划的转化 128 15.1 从需求到项目规划 128 15.1.1 需求和进度安排 128 15.1.2 需求和预估 129 15.2 从需求到设计和编码 130 15.3 从需求测试 131 15.4 从需求到成功 131 第三部分 软件需求管理 第16章 需求管理的原则与实现 133 16.1 需求管理和过程能力成熟度模型 133 16.2 需求管理步骤 135 16.3 需求规格说明的版本控制 135 16.4 需求属性 136 16.5 度量需求管理的效果 138 第17章 管理变更请求 139 17.1 控制项目范围的扩展 139 17.2 变更控制过程 140 17.2.1 变更控制策略 140 17.2.2 变更控制步骤 141 17.2.3 变更控制工具 144 17.3 变更控制委员会 145 17.3.1 变更控制委员会的组成 145 17.3.2 变更控制委员会总则 145 17.4 测量变更活动 146 第18章 需求链中的联系链 149 18.1 需求跟踪 149 18.1.1 需求跟踪动机 151 18.1.2 需求跟踪能力矩阵 151 18.1.3 需求跟踪能力工具 153 18.1.4 需求跟踪能力过程 153 18.1.5 需求跟踪能力可行吗,必要吗? 154 18.2 变更需求代价:影响分析 154 18.2.1 影响分析过程 155 18.2.2 影响分析报告模板 157 第19章 需求管理工具 158 19.1 使用需求管理工具的益处 159 19.2 商业需求管理工具 160 19.3 实现需求管理自动化 161 附录 当前需求实践的自我评估 163
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值