热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

系统需求分析和软件需求分析,软件需求分析课程设计

需求分析是软件生命周期中相当重要的一个阶段。根据StandishGroup对23000个项目进行的研究结果表明,28%的项目彻底失败,46%的项目超出经费预算或者超出

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

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

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

1 需求分析的任务与过程

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

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

    (2)分析与综合:也就是对问题进行分析,然后在此基础上整合出解决方案。这个步骤经常是反复进行的,常用的方法有面向数据流的结构化分析方法(Structured Analysis, SA),面向数据结构的 懦弱的飞机 方法,面向对象的分析方法(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.主要的设计方法比较

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

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


推荐阅读
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
author-avatar
手机用户2602890793
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有