所谓软件需求,就是用户对软件系统提出的要求。这种要求可能是原始的、笼统的,也可能是抽象的、细节化的。一个软件系统的开发必须以一组需求为出发点,软件需求工作是在软件计划阶段完成后开始的。
需求即对外可见的系统特征。需求管理有三项任务:学习,即需求获取;剪枝,即需求优选;文档化,即撰写需求规格说明书。软件需求的主要目的是:在综合分析用户对系统提出的一组需求(基于功能、性能、数据等方面)的基础上,构造一个从抽象到具体的逻辑模型来表达软件将要实现的需求;以软件需求规格说明书的形式作为本阶段工作的结果,为下一阶段的软件设计提供设计基础。
IEEE对需求的定义是:人们要解决的某个问题或达到某种目的的需要;系统或其组成部分为满足某种书面规定(合同、标准、规范等)所要具备的能力。需求将作为系统开发、测试、验收、提交的正式文档依据,属于合同相关的定义。
需求的另一个经典的定义来自Herbert Simon教授(诺贝尔经济学奖和图灵奖获得者),他认为每一个“人造物”都是一个内部环境与外部环境的“接口”,这里内部环境指人造物本身的设计组成,外部环境指人造物的周遭及其作用环境,对这个接口的描述即是需求。
需求描述的难点和挑战在于它是连接应用领域和机器领域的桥梁,应用领域是外部环境,对应各种复杂的领域性质,而机器领域是内部环境,包括软件程序、计算机硬件等。需要从应用领域的固有性质出发,将用户待解决的需求描述转化为可以用计算机软件实现的系统行为的描述。
需求是系统为满足客户期望的目标而完成的行为,需求要体现出对问题领域的清晰理解,要给出系统的使用场景和上下文。需求的定义涵盖如下内容:为什么要设计该系统,系统由谁使用,系统要做什么,系统涉及哪些信息,对待解决方案有何额外限制,如何使用该系统,质量需达到何种程度。
软件需求的确定包含以下3个里程碑。
●需要确定项目的大背景,包括了解项目的领域、客户对项目的期望值。对于企业项目,在确定项目目标后,还要进一步了解客户的企业框架、当前项目在企业框架中位置、第三方接口定义等。
●核心需求的定义和确定,需要确定项目的核心功能、关键质量和相关约束。其中,软件功能分为关键功能、次要功能等。根据项目的规划,找出当前需要实现的关键功能,并对技术风险大的功能或者关键功能中相互冲突的功能进行前期取舍。确定关键功能是一个不停递归的过程。一般质量分类包含性能、安全性、可靠性、易用性、可扩展、可维护、可移植等方面。在需求分析中,和关键功能一样,要根据项目的愿景进行关键质量的筛选。软件的约束也分为很多角度,比如业务级约束(项目的组织结构和人员信息来源于企业人事系统)、用户级约束(使用客户的一部分是残障人士或者非汉语用户等)、开发级约束(开发人员的技术水平等)。
●项目的详细需求分析,对项目核心功能进行数据流需求调研分析、业务逻辑分析,并在此基础上编写用户用例、数据流转图、业务逻辑图等。
以下为某企业真实需求的示例。
1.静态的、白盒的软件源代码安全扫描与分析工具,扫描结果不但能定位造成漏洞的代码所在行,而且能提供详细的安全漏洞信息、相关的安全知识说明以及修复方案。
2.能支持大部分常见的编程语言,如ASP.NET、C/C++、Java、JSP、XML、VB.NET、ASP、PHP、Python、Flex、ABAP、VB、VBScript等语言。
3.支持Windows、Linux、HP UNIX、Solaris、AIX的操作系统平台和其上面的代码。
4.支持流行的桌面/Web/移动端应用程序开发语言,包括:Java(Java SE、Java EE、JSP);.NET(C#、ASP.NET、VB.NET);网站平台上的JavaScript、Python、Perl、PHP、RUBY on Rails、Cold Fusion;移动平台上的IOS(Objective-C和Swift)、Android(Java)、C/C++(Windows、RedHat Linux)、应用程序(COBOL、VB6)。
5.支持自定义源代码扫描策略。
6.支持OWASP TOP 10漏洞检测。
7.漏报率以及误报率低。
8.能支持快速的DevOps方法,与SDLC无缝集成,支持API接口自动化检测流程。
9.丰富的报表功能,支持自定义报表功能。
10.支持与ITSM、SIEM(ELK)、OCC监控平台集成。
11.可支持加入机器学习功能。
对同一个事物,不同的视角会带来不同的侧重点。例如,软件工程师是做出尽可能简化问题复杂度的假设,解决具体领域的应用问题;计算机科学家要找出不失一般性的解决方法,适合处理编译器、操作系统、数据库等通用软件的设计问题;数学家则追求对问题描述的精确性。
因此,当代需求工程师需要具备分析问题和解决问题的能力、主动参与人际沟通及交流的能力、软件工程知识和技能、应用领域的有关知识、书面语言组织和表达能力等。一个优秀的需求工程师要追求以下目标:识别错误假设,确保一致性,提升标准和规范的依从性,减少彼此误解,提高支持速度和效率,提升客户满意度,撰写优质需求文档。与之相反,需求分析师的七宗罪是:干扰、沉默、过度规约、矛盾、含糊、向前引用、不切实际与一厢情愿。
好的需求是可以度量的,能给出项目成功的必要条件。其中,单个需求项的质量需要准确(Concise)、正确(Correct)、明确(Non-ambiguous)、可行(Feasible)及可证(Verifiable),整个需求集合的质量需要现实(Realistic)、准确(Concise)、全面(Complete)和一致(Consistent)。
需求分类有不同的标准,如果按照产品/过程划分,需求包括产品需求和过程需求;产品需求又包括功能性需求和非功能性需求(包括质量和约束两方面,质量方面有可用性、安全性、高性能等,约束有业务约束和技术约束),注意这两者的划分并不是绝对的,可能存在一定的重叠;按照抽象层次的详细程度来划分,包括业务需求、用户需求、系统需求和软件设计规格说明。
业务需求是指那些可以帮助企业达成组织目标(包括策略目标)的需求项。企业的业务需求是关于企业业务的陈述,与这个需求如何被实现无关,无论其是手动还是通过系统来完成。业务需求也被叫作业务目标,例如携程旅行的业务需求是销售飞机票,公司的目标是成为人们买飞机票的首选公司。
系统需求的满足可使系统实现预期的功能,是从用户的角度描述系统在做什么,与系统是由什么硬件和软件实现无关。企业选择实现系统的首要条件是系统需求满足组织的业务需求。例如,订票系统需要和用户数据库交互,新的软件会使汽车的启动速度加倍,新产品制造的低成本会让公司有更高的市场份额,并满足销售目标。