需求分析是软件生命周期中相当重要的一个阶段。根据 Standish Group 对 23000 个项目进行的研究结果表明,28%的项目彻底失败,46%的项目超出经费预算或者超出工期,只有约 26%的项目获得成功。需求分析工作在整个软件开发生命周期中有着十分重要的意义。而在这些高达 74%的不成功项目中,有约 60%的失败是源于需求问题,也就是差不多有一半的项目都遇到了这个问题,这一可怕的现象引起人们对需求分析的高度重视。需求分析阶段的主要任务是通过开发人员与用户之间的广泛交流,不断澄清一些模糊的概念,最终形成一个完整的、清晰的、一致的需求说明。

而当明确了用户的需求之后,下一步的任务就是对未来的软件系统进行设计,它是确定系统实现的关键工作。需求分析和设计的方法对软件开发过程而言是十分重要的,因此必须扎实地掌握它。

需求分析与软件设计是软件生存期中最重要的两个步骤,需求分析解决的是“做什么” 的问题,系统设计则是解决“怎么做”的问题。

1 需求分析的任务与过程

需求分析所要做的工作是深入描述软件的功能和性能,确定软件设计的限制和软件同其他系统元素的接口细节,定义软件的其他有效性需求,细化软件要处理的数据域。用一句话概括就是:需求分析主要是确定待开发软件的功能、性能、数据、界面等要求。需求分析的实现步骤通常包括:获取当前系统的物理模型,抽象出当前系统的逻辑模型,建立目标系统的逻辑模型三个部分。具体来说,需求分析阶段的工作可以分成 4 个方面:

(1)问题识别:用于发现需求、描述需求,主要包括功能需求、性能需求、环境需求、可靠性需求、安全保密需求、用户界面需求、资源使用需求、软件成本消耗与开发进度需求,以此来预先估计以后系统可能达到的目标。

(2)分析与综合:也就是对问题进行分析,然后在此基础上整合出解决方案。这个步骤经常是反复进行的,常用的方法有面向数据流的结构化分析方法(Structured Analysis, SA),面向数据结构的 Jackson 方法,面向对象的分析方法(Object Oriented Analysis,OOA),以及用于建立动态模型的状态迁移图和 Petri 网。

(3)编制需求分析的文档:也就是对已经确定的需求进行文档化描述,该文档通常称为“需求规格说明书”。

(4)需求分析与评审:它是需求分析工作的最后一步,主要是对功能的正确性、完整性和清晰性,以及其他需求给予评价。

1.需求的分类

什么是软件的需求呢?软件需求就是系统必须完成的事及必须具备的品质。具体来说,软件需求包括功能需求、非功能需求和设计约束三方面内容。各种需求的概念示意图如图 8-4 所示。

  • 功能需求:是指系统必须完成的那些事,即为了向它的用户提供有用的功能,产品必须执行的动作。

  • 非功能需求:是指产品必须具备的属性或品质,如性能、响应时间、可靠性、容错性、扩展性等。

  • 设计约束:也称为限制条件、补充规约,这通常是对解决方案的一些约束说明,例如必须采用国有自主知识版权的数据库系统,必须在 UNIX 操作系统之下运行等。

除了这三种需求之外,还有业务需求、用户需求、系统需求这三个处于不同层面的概念,充分地理解这样的模型才能够更加清晰地理清需求的脉络。

  • 业务需求(Business Requirement):是指反映组织机构或客户对系统、产品高层次的目标要求,通常问题定义本身就是业务需求。

  • 用户需求(User Requirement):是指描述用户使用产品必须要完成什么任务,怎么完成的需求,通常是在问题定义的基础上进行用户访谈、调查,对用户使用的场景进行整理,从而建立从用户角度出发的需求。

  • 系统需求(System Requirement):是从系统的角度来说明软件的需求,它包括用特性说明的功能需求、质量属性、非功能需求及设计约束。

分析师经常围绕着“功能需求”来展开工作,而功能需求大部分都是从“系统需求” 的角度来分析与理解的,也就是用“开发人员”的视角来理解需求。但要想真正地得到完整的需求,仅戴上“开发人员”的眼镜是不够的,还需要“领域专家”的眼镜,要从更高的角度来理解需求,这就是“业务需求”;同时还应该更好地深入用户,了解他们的使用场景,了解他们的想法,这就是“用户需求”。这是一个理解层次的问题,并不仅仅是简单的概念。

2.需求工程

需求工程就是包括创建和维护系统需求文档所必需的一切活动的过程,主要包括需求

开发和需求管理两大工作。

(1)需求开发:包括需求捕获、需求分析、编写规格说明书和需求验证 4 个阶段。在这个阶段需要完成确定产品所期望的用户类型、获取每种用户类型的需求、了解实际用户任务和目标及这些任务所支持的业务需求、分析源于用户的信息、对需求进行优先级分类、将所收集的需求编写成为软件规格说明书和需求分析模型、对需求进行评审等工作。

(2)需求管理:通常包括定义需求基线、处理需求变更、需求跟踪等方面的工作。

这两个方面是相辅相成的,需求开发是主线,是目标;需求管理是支持,是保障。换句话说,需求开发是努力更清晰、更明确地掌握客户对系统的需求;而需求管理则是对需求的变化进行管理的过程。

3.需求分析方法

需求分析的方法可谓种类繁多,不过如果按照分解方式的不同,可以很容易地划分出几种类型。本节先从分析方法发展的历史,对其建立一个概要性的认识,在本章的后面几节中将详细说明最具有代表性的结构化分析与设计、面向对象分析与设计两种方法。

(1)结构化分析方法:最初的分析方法都不成体系,而且通常都只包括一些笼统的告诫,在20 世纪 70 年代分析技术发展的分水岭终于出现了。这时人们开始尝试使用标准化的方法,开发和推出各种名为“结构化分析”的方法论,而 Tom DeMacro 则是这个领域最有代表性和权威性的专家。

(2)软系统方法:这是一个过渡性的方法论,并未真正流行过,它的出现只是证明了结构化分析方法的一些不足。因为结构化分析方法采用的相对形式化的模型不仅与社会观格格不入,而且在解决“不确定性”时显得十分无力。最有代表性的软系统方法是 Checkland 方法。

(3)面向对象分析方法:在 20 世纪 90 年代,结构化方法的不足在面对多变的商业世界时,显得更加苍白无力,这就催使了 OOA 的迅速发展。

(4)面向问题域的分析(Problem Domain Oriented Analysis,PDOA):现在又发现面向对象分析方法也存在着很多的不足,应运而生了一些新的方法论,PDOA 就是其中一种。不过现在还在研究阶段,并未广泛应用。

2 如何进行系统设计

当设计者拿到一个需求,他如何开展系统设计呢?许多想进入系统分析与设计的年轻人以为自己知道了面向对象、统一建模语言、设计模式等新鲜深奥的名词就可以进行设计了,可是掌握工具和技能绝不是成为优秀设计者的充分条件,甚至也不是必要条件。遗憾的是这里没有捷径,只有设计者在实践中不断学习和总结。而在实践中,系统设计与其说是在设计,不如说是在选择和妥协。

妥协,就是在各个系统目标之间找到一个平衡点。系统目标包括但不限制于功能、性能、健壮性、开发周期、交付日期等。不幸的是,这些目标往往是矛盾的,提高软件性能直接意味着开发周期的增加、交付日期的推迟,盲目地增加功能可能导致性能降低,维护成本提高。软件设计者的难题在于在如此众多的目标之间找到这个平衡点,并且明确知道如何设计能实现这个平衡,既可以让投资者觉得在预算之内,又能让用户相对满意。可行性分析阶段应该已经论述了这样一个平衡点,可是如果设计者发现没有这样一个平衡点,如同没有一个设计者能让人骑着自行车到月球上去,那么设计者只能提出放弃某个方面的过度要求,否则系统要遭受必然失败的命运。更多的情况是没有经验的设计者不知道是否存在这些平衡点,更不知道如何利用合理的设计及有效的工具来达到平衡。因此设计者需要了解可以解决问题的各种方案,并清楚知道各个方案的效果、成本、缺点,以及这些方案的区别,并在各种方案中进行选择。而这些,不是一个人能在一两天了解的。

没有一个设计者会完全重新开始设计一个系统,他们总参考多个与目标系统相类似的系统,再从中进行甄别、取舍和补充来作为新系统的设计。人们发现一个优秀的设计者似乎能在听完需求后就立即构想出目标系统的框架,这并不是因为他聪明或者比不知所措的设计者新手多一个脑袋,而是因为他在平时已经了解大量的系统,对各种设计的优缺点、局限性也了然于胸,能够把以前的设计根据需要再次使用。所以要成为优秀的设计者,了解、掌握、消化、总结前人和自己以前的设计成果是最好的方法,这似乎也是唯一的方法。

设计者的苦恼有时候和编程人员一样。计算机系统的发展如此迅速,解决方案也越来越多,如同编程语言的发展,同时,随着人类社会的进步,投资者和客户也提出了越来越高的要求,这又需要设计者不断学习、创造新的方案。

但系统设计也并非没有规律可以遵循,如同幸福的家庭都很相似,不幸的家庭各有各的不幸,人们在实践中发现优秀的系统设计一般在以下几个方面都很出色。

(1)组件的独立性。审视自己设计的系统,是否做到了高内聚、低耦合?

(2)例外的识别和处理。谁能保证系统使用者都精确按照使用说明书使用?

(3)防错和容错。当网络中断、数据库崩溃这样的灾难性事件发生时,系统也跟着崩溃吗?

而且,更幸运的是,也有一些技术能够改进系统设计,这些方法包括:降低复杂性、通过合约进行设计、原型化设计、错误树分析等。

3 软件设计的任务与活动

软件设计是一个把软件需求变换成软件表示的过程。最初这种表示只是描绘出软件的总体框架,然后再进一步细化,并在此框架中填入细节。

1.软件设计的两个阶段从工程管理角度,软件设计可以分为两个步骤:

(1)概要设计:也称为高层设计,将软件需求转化为数据结构和软件的系统结构。例如,如果采用结构化设计,则将从宏观的角度将软件划分成各个组成模块,并确定模块的功能及模块之间的调用关系。

(2)详细设计:也称为低层设计,将对结构表示进行细化,得到详细的数据结构与算法。同样的,如果采用结构化设计,则详细设计的任务就是为每个模块进行设计。

2.主要的设计方法比较

在结构化设计风行的时代,主流的设计方法还包括 Jackson 方法和 Parnas 方法。结构化方法侧重于“模块相对独立且功能单一,使模块间联系弱、模块内联系强”;而 Jackson 方法则是从数据结构导出模块结构;Parnas 方法的主要思想则是将可能引起变化的因素隐藏在有关模块内部,使这些因素变化时的影响范围受到限制,它只提供了重要的设计准则,但没有规定出具体的工作步骤。

而近年来,对象技术凭借其对数据的高效封装及良好的消息机制,实现了高内聚、低耦合的系统设计,成了现代软件设计的主流方法学。

系统分析与设计方法---需求分析与软件设计相关推荐

  1. 软件工程:结构化软件设计方法 VS 面向对象软件设计方法

    一.基本概念 1.结构化方法 结构化方法是一种传统的软件开发方法,它是由结构化分析.结构化设计和结构化程序设计三部分有机组合而成的. 基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向 ...

  2. 《大话软件工程—需求分析与软件设计》,给出了分析与设计过程中需要的理论、方法、工具和标准

    □ 做好一款软件从哪里开始呢?→ 客户需求的调研: □ 一款软件的价值高低由哪个环节决定呢?→ 软件的分析与设计: □ 软件顺利完成开发靠什么?→ 高效的项目管理: □ 软件开发的主要角色?→ 客户. ...

  3. 【管理】需求分析与软件设计|需求分析报告和需求规格说明书的区别

    目录 需求分析与软件设计 需求分析和需求规格书 需求分析与软件设计 需求分析    面向客户,主要是为客户服务的 软件设计   面向团队,是自己团队设计软件的思路 需求分析  分析需要做什么 软件设计 ...

  4. 界面设计方法 (2) — 4.界面设计的原则与标准

    前面介绍了5种基本的界面形式,如果从构成界面的要素(构件)层面看,实际上所有的界面都是一样的,因为它们都是由同样的控件构成的,只是控件的位置不同而已,因此就有必要对界面的布置进行统一的标准化,建立了界 ...

  5. 【软件设计】5本软件设计书籍的读书笔记

    文章目录 前言 1.<简约之美:软件设计之道> 1.1 软件设计的准则 1.2 小结 2.<软件设计精要与模式> 2.1 软件架构 2.2 软件设计 2.3 软件设计模式 2. ...

  6. SLAM导航机器人零基础实战系列:(四)差分底盘设计——2.stm32主控软件设计

    SLAM导航机器人零基础实战系列:(四)差分底盘设计--2.stm32主控软件设计 摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买 ...

  7. VLSI 半定制设计方法 与 全定制设计方法【VLSI】

    VLSI 半定制设计方法 与 全定制设计方法[VLSI] VLSI 半定制设计方法 1. standard cell 设计方法 Standard Cell library 设计方法与步骤 特点 2. ...

  8. 测试用例设计方法_黑盒测试——测试用例设计方法

    黑盒测试 也称为功能测试或数据驱动测试.通过软件的外部表现来发现其缺陷和错误.在测试时,把被测程序视为一个不能打开的盒子,在完全不考虑程序内部逻辑结构和内部特性的情况下进行.它是在已知产品所应具有的功 ...

  9. python测试用例设计方法_功能测试用例设计方法分享

    本文首发于:行者AI 测试用例可以用来衡量一个项目测试质量,因此在平时的测试流程中,编写测试用例就是测试过程中很重要的一步,每一个测试工程师都需要并且非常熟练的编写测试用例,能在编写测试用例中尽可能的 ...

  10. 计算机助学教学软件cai是,小学语文教学设计 [用教学设计理论指导CAI软件设计]...

    摘要:计算机辅助教学活动的开展关键在于教学软件,教学软件的质量和实用价值直接影响到教学效果.本文在对当前CAI软件中存在的一些问题进行分析的基础上,指出问题的根源在于没有注重前期分析,并从教学设计的前 ...

最新文章

  1. java导入包大全_eclipse快速导入jar包的相关操作步骤
  2. 图像轮廓、凸包、图像的矩、分水岭算法、图像修补
  3. my_free mysql源代码_MySQL源代码管中窥豹(一)_MySQL
  4. python中 __name__及__main()__的妙处02
  5. shell脚本之nginx的安装
  6. 移动数据平台mParticle获1750万美元B轮融资,帮助企业快速获取客户数据
  7. 大厂程序员年薪_程序员羡慕深圳老师的待遇:年薪25万起,请问哪个科技厂可以比...
  8. a challengefor the 2 hour course
  9. 220V双向TVS二极管,如何正确选型?
  10. Feature Engineering 特征工程 2. Categorical Encodings
  11. java制作网站的原理_代码生成器原理
  12. [华为机试练习题]37.合唱队
  13. JavaScript的Function 类型
  14. 顺序栈实现迷宫求解问题v0.1
  15. 编译Caffe错误:libpython3.5m.a(abstract.o): relocation R_X86_64_32S against
  16. 犀牛6.0grasshopper翻译插件_Rhino 6.0犀牛三维建模 软件下载安装包教程(附下载方法)...
  17. 计算机组成原理第三版第四章,计算机组成原理第四章答案
  18. 大数据分析平台建设项目需求报告与技术方案
  19. 绝对值编码器的调整方法有哪些?
  20. ArcFace的原理以及代码的理解

热门文章

  1. 基于STM32移植UCGUI图形界面框架(3.9.0源码版本)
  2. Windows安装Oracle与PlSql教程
  3. ffplay-主要数据结构分析
  4. php文件上传实验总结,php文件上传总结 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. Python基础语法01:缩进规则
  6. 安装惠普打印机驱动HP LaserJet P1108
  7. ireport实现金额小写转大写
  8. shx文件怎么导入cad_「设计师必备技能」打开cad图纸缺少shx字体,图纸乱码怎么办?...
  9. PSPNet——Pyramid Scene Parsing Network
  10. 《css世界》- 详细重点笔记与技巧