标题：需求工程
概念
软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。通过对应问题及其环境的理解与分析，为问题涉及的信息、功能及系统行为建立模型，将用户需求精确化、完全化，最终形成需求规格说明，这一系列的活动即构成软件开发生命周期的需求分析阶段。 　需求分析是介于系统分析和软件设计阶段之间的桥梁。一方面，需求分析以系统规格说明和项目规划作为分析活动的基本出发点，并从软件角度对它们进行检查与调整；另一方面，需求规格说明又是软件设计、实现、测试直至维护的主要基础。良好的分析活动有助于避免或尽早剔除早期错误，从而提高软件生产率，降低开发成本，改进软件质量。
发展
需求工程是随着计算机的发展而发展的，在计算机发展的初期，软件规模不大，软件开发所关注的是代码编写，需求分析很少受到重视。后来软件开发引入了生命周期的概念，需求分析成为其第一阶段。随着软件系统规模的扩大，需求分析与定义在整个软件开发与维护过程中越来越重要，直接关系到软件的成功与否。人们逐渐认识到需求分析活动不再仅限于软件开发的最初阶段，它贯穿于系统开发的整个生命周期。80年代中期，形成了软件工程的子领域——需求工程(requirementengineering,RE)。进入90年代以来，需求工程成为研究的热点之一。从1993年起每两年举办一次需求工程国际研讨会(ISRE)，自1994年起每两年举办一次需求工程国际会议(ICRE)，在1996年Springer-Verlag发行了一新的刊物——《RequirementsEngineering》。一些关于需求工程的工作小组也相继成立，如欧洲的RENOIR(RequirementsEngineeringNetworkofInternationalCooperatingResearchGroups)，并开始开展工作。
定义
需求工程是指应用已证实有效的技术、方法进行需求分析，确定客户需求，帮助分析人员理解问题并定义目标系统的所有外部特征的一门学科。它通过合适的工具和记号系统地描述待开发系统及其行为特征和相关约束，形成需求文档，并对用户不断变化的需求演进给予支持。RE可分为系统需求工程（如果是针对由软硬件共同组成的整个系统）和软件需求工程（如果仅是专门针对纯软件部分）。软件需求工程是一门分析并记录软件需求的学科，它把系统需求分解成一些主要的子系统和任务，把这些子系统或任务分配给软件，并通过一系列重复的分析、设计、比较研究、原型开发过程把这些系统需求转换成软件的需求描述和一些性能参数。
需求工程是一个不断反复的需求定义、文档记录、需求演进的过程，并最终在验证的基础上冻结需求。80年代，HerbKrasner定义了需求工程的五阶段生命周期：需求定义和分析、需求决策、形成需求规格、需求实现与验证、需求演进管理。近来，MatthiasJarke和KlausPohl提出了三阶段周期的说法：获取、表示和验证。
阶段
综合了几种观点，可以把需求工程的活动划分为以下5个独立的阶段：
（1）需求获取：通过与用户的交流，对现有系统的观察及对任务进行分析，从而开发、捕获和修订用户的需求；
（2）需求建模：为最终用户所看到的系统建立一个概念模型，作为对需求的抽象描述，并尽可能多的捕获现实世界的语义；
（3）形成需求规格：生成需求模型构件的精确的形式化的描述，作为用户和开发者之间的一个协约；
（4）需求验证：以需求规格说明为输入，通过符号执行、模拟或快速原型等途径，分析需求规格的正确性和可行性，包含有效性检查，一致性检查，可行性检查和确认可验证性；
（5）需求管理：支持系统的需求演进，如需求变化和可跟踪性问题。
需求工程的基本活动
简介需求工程无疑是当前软件工程中的关键问题，从美国于1995年开始的一项调查结果就足以看出这一点。在这项调查中，他们对全国范围内的8000个软件项目进行跟踪调查，结果表明，有1/3的项目没能完成，而在完成的2/3的项目中，又有1/2的项目没有成功实施。他们仔细分析失败的原因后发现，与需求过程相关的原因占了45%，而其中缺乏最终用户的参与以及不完整的需求又是两大首要原因，各占13%和12%。
需求工程又是软件工程中最复杂的过程之一，其复杂性来自于客观和主观两个方面。从客观意义上说，需求工程面对的问题几乎是没有范围的。由于应用领域的广泛性，它的实施无疑与各个应用行业的特征密切相关。其客观上的难度还体现在非功能性需求及其与功能性需求的错综复杂的联系上，当前对非功能性需求分析建模技术的缺乏大大增加了需求工程的复杂性。从主观意义上说，需求工程需要方方面面人员的参与（如领域专家、领域用户、系统投资人、系统分析员、需求分析员等等），各方面人员有不同的着眼点和不同的知识背景，沟通上的困难给需求工程的实施增加了人为的难度。需求工程涉及所有用于确定用户需求，分析需求以获取额外需求，文档化需求作为支持完成这些流程的和用户需要的活动的一个规范和验证的软件工程生命周期的活动。
最初，需求工程仅仅是软件工程的一个组成部分，是软件生命周期的第一个阶段。虽然大家也都知道需求工程对软件整个生命周期的重要性，但对它的研究远远没有对软件工程的其他部分的研究那么深入。
在传统软件工程生命周期中，涉及需求的阶段称作需求分析。
需求分析的作用●系统工程师说明软件的功能和性能，指明软件和其他系统成分的接口，并定义软件必须满足的约束；
●软件工程师求精软件的配置，建立数据模型、功能模型和行为模型；
●为软件设计者提供可用于转换为数据设计、体系结构设计、界面设计和过程设计的模型；
●提供开发人员和客户需求规格说明，用于作为评估软件质量的依据。
但从当前的研究现状来看，需求工程的内容远不止这些。需求工程是系统工程和软件工程的一个交叉分支，涉及到软件系统的目标、软件系统提供的服务、软件系统的约束和软件系统运行的环境。它还涉及这些因素和系统的精确规格说明以及系统进化之间的关系。它也提供现实需要和软件能力之间的桥梁。
基本活动包括●抽取需求；
●模拟和分析需求；
●传递需求；
●认可需求；
●进化需求。 每个活动都有它基本的动机、任务和结果，也有各自的困难所在。
首先，开始一个项目是因为要对现行系统进行改造。要改造一个系统是因为现行系统存在需要解决的问题。如：现行系统与当前情况不符合、出现新的商机或者可能节省时间、资金和资源等，这就是抽取需求的动机。在这个阶段，需求工程师的任务是认识问题之所在，获取足够多的知识，最后成为问题领域的专家。需求工程师常采用W6H方法去认识问题领域，即6个以W打头的问题，一个以H打头的问题，如表1所示。
困难主要原因●缺乏领域知识，应用领域的问题常常是模糊的、不精确的；
●存在默认的知识，即难以描述的日常知识（常识问题）；
●存在多个知识源，而且多知识源之间可能有冲突；
●面对的客户可能有偏见，如不能提供你需要了解什么或不想告知你需要了解的事情。需求抽取的方法一般有问卷法、面谈法、数据采集法、用况法、情景实例法以及基于目标的方法等，还有知识工程方法，如：场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等。
模拟和分析需求●指导抽取；
●帮助需求工程师了解进展；
●帮助发现问题；
●帮助检查对问题的理解。 需求分析和模拟又包含三个层次的工作。首先是需求建模。需求模型的表现形式有自然语言、半形式化（如图、表、结构化英语等）和形式化表示等三种。自然语言形式具有表达能力强的特点，但它不利于捕获模型的语义，一般只用于需求抽取或标记模型。半形式化表示可以捕获结构和一定的语义，也可以实施一定的推理和一致性检查。形式化表示具有精确的语义和推理能力，但要构造一个完整的形式化模型，需要较长时间和对问题领域的深层次理解。
需求概念模型的要求●实现的独立性:不模拟数据的表示和内部组织等；
●足够抽象：只抽取关于问题的本质方面；
●足够形式化：语法无二义性，并具有丰富的语义；
●可构造性：简单的模型块，能应付不同复杂程度和规模的描述；
●利于分析：能支持二义性、不完整性和不一致性分析；
●可追踪性:支持横向交叉索引并能与设计或实现等建立关联；
●可执行性：可以动态模拟，利于与现实相比较；
●最小性：没有冗余的概念。
需求模拟技术又分为企业模拟、功能需求模拟和非功能需求模拟等。
企业模拟是一种软系统方法，涉及整个组织，从各个不同的视点分析问题，包括目标、组织结构、活动、过程等。有的企业模拟还建立可执行的领域模型。采用企业模拟方法产生的不仅仅是规格说明，还可以得到许多关于企业运作的状况分析。目前代表性的工作包括：信息模拟、组织模拟和目标模拟等。
功能需求模拟从不同视点为模拟软件提供服务，包括结构视点和行为视点等，主要方法有：结构化分析、面向对象分析和形式化方法。结构化分析是一种面向数据的方法，以数据流为中心。其核心概念包括：进程、数据流、数据存储、外部实体、数据组和数据元素。有代表性的模拟工具有：数据流图、数据字典、原始进程规格说明。面向对象分析以对象及其服务作为建模标准，比较自然，对象也具有相对的稳定性。主要模拟的元素有：对象、类、属性、关系、方法、消息传递、UseCases等。其主要原理包括分类继承层次、信息隐藏、汇集关系等。形式化方法从广义上说，是应用离散数学的手段来设计、模拟和分析，得到像数学公式那样精确的表示。从狭义上说，就是使用一种形式语言进行语言公式的形式推理，用于检查语法的良构性并证明某些属性。形式化方法一般用于一致性检查、类型检查、有效性验证、行为预测以及设计求精验证。
引入形式化机制的目的●减少二义性，提高精确性；
●为验证打下基础；
●允许对需求进行推理；
●允许执行需求。 但是人们常常不用形式化手段，因为：
●形式化涉及太多细节，分析的级别较低；
●形式化的核心问题是一致性和完整性，而不是获取需求；
●没有合适的工具；
●要求更多的代价。
传递需求的主要任务是书写软件需求规格说明，其目的是：
●传达对需求的理解；
●作为软件开发项目的一份契约；
●作为评价后续工作的基线；
●作为控制需求进化的基线。
对需求规格说明感兴趣的群体包括：用户、客户；系统分析员、需求分析员；软件开发者、程序员；测试员；项目管理者。
认可需求就是让上述人员对需求规格说明达成一致，其主要任务是冲突求解，包括定义冲突和冲突求解两方面。常用的冲突求解方法有：协商、竞争、仲裁、强制、教育等，其中有些只能用人的因素去控制。
进化需求的必要性是明显的，因为客户的需要总是不断（连续）增长的，但是一般的软件开发又总是落后于客户需求的增长，如何管理需求的进化（变化）就成为软件进化的首要问题。对传统的变化管理过程来说，其基本成分包括软件配置、软件基线和变化审查小组。当前的发展是软件家族法，即产品线方法。多视点方法也是管理需求变化的一种新方法，它可以用于管理不一致性并进行关于变化的推理。
需求工程推荐方法
需求工程包括需求开发和管理，而需求开发又包括这几个过程：需求获取，需求分析，需求规格说明和需求验证。需求获取和分析包括发现，分类和组织需求、需求的优先级排序、协商需求以及形成需求文档。需求验证的方法包括评价需求、原型设计和生成测试用例。在需求开发之前，还需要有一个知识培训的过程，需求工程也是一个项目工程，因此也包括了项目的管理。对于这些过程，有以下方法可以采用。
知识培训需求分析员培训：需求分析员应该具有良好的交流沟通能力，同时理解产品，并掌握了需求工程的技能。
用户培训：用户也应该接受需求工程知识的培训，让他们理解需求的重要性，知道如何准确的描述需求，需求的风险性等。
开发人员培训：开发人员应该对用户的应用领域有一个基础的了解，明白客户的业务活动，术语，产品目标等
需求获取需求包括业务需求，用户需求和功能需求以及非功能需求，在需求开发之前，我们需要先定义好需求开发的过程，形成文档，内容包括：需求开发的步骤，每一个步骤如何实现，如何处理意外情况，如何规划开发资源等
需求获取包括以下方法和技能：
项目范围确定：开需求开发前期，我们应该获取用户的业务需求，定义好项目的范围，使得所有的涉众对项目有一个共同的理解。
用户确定：确定用户群和分类，对用户组进行详细描述，包括使用产品频率，所使用的功能，优先级别，熟练程度等等。对每一个用户组确定用户的代言人。对于大型项目，我们需要先确定中心客户组，中心客户组的需求具有高级别的优先级，需要先实现的核心功能。
用例确定：与用户代表沟通，了解他们需要完成的任务，得到用例模型。同时根据用例导出功能需求。用例描述应该采用标准模板。
系统事件和响应：业务事件可能触发用例，系统事件包括系统内部的事件以及从外部接受到信息，数据等等，或者一个突发的任务。
获取方法：召开需求讨论会议，观察用户的工作过程，采用问答式对话，采用诱发式需求诱导等等。检查完善：问题报告和补充需求建议
需求分析需求分析是对用户的需求获取之后的一个粗加工过程，需要对需求进行推敲和润色以使所有涉众都能准确理解需求。分析过程首先需要对需求进行检查，以保证需求的正确性和完备性，然后将高层需求分解成具体的细节，创建开发原型，完成需求从需求获取人员到开发人员的过渡。
绘制关联图：关联图确定系统和外部的交互。划分了系统的范围和界限，构建了系统对外的接口。
原型开发：对于敏捷方法，推荐完成一个界面的原型，一个初步的系统实现，通过原型，让所有涉众对开发的项目有了一个初步的映像，同时可以提供对需求的检验。
需求优先级别：采用分析的方法确定产品的功能，用例和单项需求的优先级别，以优先级为基础，确定各项功能和需求都包括在哪个版本中，在项目开发过程中，需求的优先级别根据实际情况进行调整。
需求建模：图形分析模型对需求描述更加抽象。主要可以采用UML的建模分析。
数据字典创建：建立系统中所用到的数据项和结构的定义，数据字典可以使参与项目开发的每一个人都使用统一的定义。
子系统：建立系统的结构，同时将需求分配到各个子系统和模块中。
规格说明SRS应该是一个作为涉众对系统的统一理解。
采用SRS模板：定义一种标准模板