文章目录
- 一、软件工程概述
- 1、软件与软件危机
- 2、软件工程
- 二、可行性研究
- 三、需求分析
- 四、概要设计
- 五、详细设计
一、软件工程概述
1、软件与软件危机
软件=程序+数据+文档
1、软件危机的主要表现
- 软件不能满足
用户
需求 - 软件
开发成本
严重超标,开发周期
大大超过规定日期 - 软件
质量
难以保证,可靠性差 - 软件难以
维护
- 软件
开发速度
跟不上计算机发展速度
2、软件危机产生的原因
一方面与软件本身的抽象性和复杂性有关,这是客观原因
另一方面与软件开发和维护过程中使用的技术和方法有关,这是主管原因
根本原因是软件开发过程不成熟,具体表现为:
- 忽视软件开发前期的
调研和需求分析
工作 - 缺乏软件
开发的经验
和有关软件开发数据的积累
,使得开发的计划很难制定 - 开发过程
缺乏统一的
、规范化
的方法论指导 - 忽视与
用户
,开发成员间
的及时有效的沟通 文档资料
不规范或不准确。导致开发者失去工作的基础,管理者失去管理的依据。- 没有完善的
质量保证体系
3、软件危机的解决途径
- 使用好的
软件开发技术
和方法
- 使用好的
软件开发工具
,提高软件生产率
- 有良
好的组织
,严密的管理
,各方面人员相互配合
共同完成任务
2、软件工程
1、软件工程基本原理
- 用分阶段的软件
生存周期
计划进行严格的质量管理
- 坚持进行
阶段评审
- 实行严格的
产品控制
- 采用
现代程序设计技术
- 软件工程
结果
应能清楚的审查
- 开发小组人员应该
少而精
- 承认不断
改进软件工程
实践的必要性
软件工程的三要素是方法、工具和过程
2、软件生命周期
软件产品或软件系统从设计、投入使用到被淘汰的全过程称为软件的生命周期
软件生命周期各阶段
- 问题定义和可行性研究
- 需求分析
- 软件设计
- 编码
- 软件测试
- 运行与维护
3、软件开发模型
1、瀑布模型
犹如瀑布流水,自上而下、逐级下落
特点:
- 阶段间具有
顺序性
和依赖性
。前一段结束后才能开始后一阶段的工作,前一阶段的输入是后一阶段的输入 推迟实现观点
,尽可能推迟程序的物理实现强调质量保证观点
。每个阶段必须完成规定的文档,每个阶段结束前完成文档审查,以便及早改正错误。- 瀑布模型是一种
文档驱动的模型
优点:
- 原理简单,容易掌握
- 各阶段间都有验证和确认环节,以便进行质量管理
- 主要用于支持结构化算法
缺点:
- 缺乏灵活性,不能适应用户需求的变化
- 缺乏演化性,返回上一级的开发需要付出十分昂贵的代价
- 瀑布模型是线性的软件开发模型,回溯性很差。
适用场合
- 适用于软件需求比较明确或很少变化,并且开发人员可以一次性获取全部需求的场合
- 适用于开发技术比较成熟、工程管理比较严格的场合
- 一般用于低风险的项目,适用于开发人员具有丰富经验,对软件应用领域很熟悉的场合
2、快速原型模型
特点:
主要用于挖掘需求,或是进行某种技术或开发方法的可行性研究,是开发人员为了快速而准确获得用户需求而经常采用的方法。
优点:
- 增强了开发者与用户之间的交流,有助于满足用户的真实需求
- 用户可以及早得到有用的产品,及早发现问题,随时纠正错误
- 可减少技术、应用风险,降低开发费用,缩短开发时间
缺点:
- 缺乏丰富而强有力的软件工具和开发环境
- 对设计人员的水平及开发环境要求较高
- 在重复改变原型的过程中,程序员会厌倦
- 难以做到彻底测试,更新文档较困难
适用场合
- 预先不能
确切定义需求
的软件系统,或需求多变的系统
- 开发人员对
设计方案没信心
或对将要采用的技术手段不熟悉或把握不大
- 快速原型模型可作为
单独的过程模型
使用,也常被作为一种方法或实现技术应用于其他的过程模型
3、增量模型
把软件产品作为一系列增量构件来设计、编码、集成和测试,在项目软件开发过程中,以一系列的增量方式来逐步开发系统。
特点:
- 分段的
线性模型
,是一种非整体
的开发模型 增量开发
是按一定的时间间隔开发部分软件增量提交
是先提交部分软件给用户试用,听取用户意见,在提交另一部分软件让用户试用,反复多次,直到全部提交- 增量模型开发方式可以在软件开发
部分阶段采用
,也可以在全部开发阶段
采用
优点:
- 渐增模型是瀑布模型的一个变体,可以看作重复执行的多个瀑布模型,具有瀑布模型的所有优点,此外,还有以下优点:
- 可分批次提交软件产品,方便用户及时了解软件开发进展情况,及早发现问题。
- 以组件为单位进行开发,降低了软件开发风险。
- 开发顺序灵活。优先级最高的服务首先交付。
缺点:
- 由于对整个软件系统的需求没有一个完整的定义,会给总体设计带来麻烦。
- 在把每个新的增量构件集成到现有软件结构中时.必须不破坏原来已开发出的产品。
- 软件的体系结构必须是开放的,即向现有产品中加入新构件的过程必须简单、方便。每次增量开发的产品都应当是可测试的、可扩充的。
适用场合
- 软件产品可以分批次地进行交付。
- 待开发的软件系统能够被模块化。
- 软件开发人员对应用领域不熟悉﹑难以一次性地进行系统开发时。
- 项目管理人员把握全局的水平较高。
- 对软件需求把握不准确、设计方案有一定风险的软件项目。
4、喷泉模型
特点:
- 各阶段相互重叠,反映了软件过程的并行性。
- 以分析为基础,资源消耗呈塔形,在分析阶段消耗资源最多。
- 反映了软件过程迭代的自然特性,从高层返回低层无资源消耗。
- 强调增量开发,依据分析一点、设计一点的原则,不要求一个阶段的彻底完成,整个过程是一个迭代的逐步提炼的过程
- 喷泉模型
是对象驱动过程
,对象是所有活动作用的主体,也是项目管理的基本内容
喷泉模型适用于面向对象的软件开发
二、可行性研究
1、目的:最小的代价、尽可能短的时间、是否有可行解决方案
可行性分析是一个大大简化的系统分析和设计过程。
2、可行性分析的任务
- 技术可行性
- 经济可行性
- 运行可行性
- 法律可行性
3、可行性分析的步骤
- 审核系统的规模和目标
- 分析研究现行系统
- 设计新系统的高级逻辑模型
- 获得比较可行的方案
- 撰写可行性研究报告
4、工具:系统流程图
表述的是什么?描述物理模型
5、项目计划:成本估算的方法有哪些?
- 自顶向下估算法
- 自底向上估算法
- 差别估算法
6、进度安排方法
- 甘特图法
优点:能从时间上整体把握进度,很清晰地表达每一项任务的起始时间与结束时间,且直观简明
,易于绘制
,标名了各任务的计划进度
和当前进度,能动态反映软件开发的进展状况。
缺点:不能显示的描述各任务彼此间的依赖关系
,进度计划中的关键阶段不明确。 - 工程网络图法
优点:采用网络图进行进度控制,能够清晰地展现现在和将来完成的工作内容、各项工作单元间的关系
。并且可以预先确定各任务的时差。了解关键作业或某一项进度的变化对后续工作和总工期的影响度,便于及时地采取措施或对进度计划进行调整。
缺点:不能系统地表达每项的起始时间与结束时间
,不易于对单项任务的过程进行跟踪。
7、成果:可行性分析报告:包含哪些内容?
1 .投资必要性;
2.技术的可行性;
3.财务可行性;
4.组织可行性;
5.经济可行性;
6.社会可行性;
7.风险因素及对策
三、需求分析
1、需求分析的任务:描述软件的功能和性能
,需求不单单是功能需求,还有非功能性需求
2、需求分析的步骤
- 需求获取
- 分析建模
- 需求描述
- 需求验证
(1)需求获取有哪些方法?
- 问卷调查
- 访谈会议
- 市场调查
- 实地操作
- 建立原型
3、结构化分析-建模的方式(重点掌握)
(1)思想:结构化分析与设计是一种面向数据流
的分析方法,自顶向下,逐步求精
(2)工具1:数据流图(DFD)
描绘逻辑模型
,什么是数据流图?
数据流图是用于表示系统逻辑模型的一种工具。从数据传递和加工的角度,以图形的方式描述数据在系统中流动的处理的过程
基本符号
画法(给你需求,让你画数据流图):先找源点、汇点,再找加工(动词),再找数据流(名词)
顶层图、0层图、1层图,父子图之间的平衡必须要注意
(3)工具2:数据字典(DD):4种
数据字典是结构化分析方法中的另一个有力工具,它针对数据流图
出现的所有数据元素
给出逻辑定义
- 数据字典的内容
(1)数据流条目
(2)文件条目
(3)数据项条目
(4)加工条目 - 数据字典中使用的符号
1)=:被定义为。
2)+:与。 例如,X=a+b表示x由a和 b组成。
3)[…│…]:或。例如,X=[a│b]表示x由a或b组成。
4){…}:重复。例如,X={a}表示x由0个或多个a组成。
5)m{…}n或{…}nm:重复。例如:X=2{a}5或X={a}52表示x中最少出现2次a,最多出现5次a。5,2为重复次数的上、下限。
6)(…):可选。例如,x=(a)表示a可在x中出现,也可不出现。
7)“…”:基本数据元素。例如,x=“a”,表示x是取值为字符a的数据元素。
8)“··”:连接符。例如,x=1··9,表示x可取1到9中任意一个值。
符号使用案例:
机票 = 姓名 + 日期 + 航班号 + 始发地 + 目的地 + 费用;
终点 = [上海 | 北京 | 广州];
航班号 = “CZ9938” ·· “CZ9948”;
- 数据字典写实例
- 数据字典的实现
(1)人工方法
:人工方法实现时,每一词典条目(每一个数据定义或每一个加工逻辑说明)写在一张卡片上,由专人管理和维护。为了便于搜索,所有卡片按数据名称排序。人工方法的优点是容易实现。
(2)自动方法
:把词典存在计算机中,用计算机对它搜索和维护。现有多种“词典管理程序”,如 PLS/PSA。用计算机管理词典质量高,搜索、维护方便。
(3)人工和自动混合的方法
:在人工过程中可借助正文编写程序、报告生成程序等工具辅助完成。
不论通过哪种途径实现的数据词典都应尽量做到以下几点:
(1)没有冗余
:主要指数据定义不能重复。在规格说明书的其他组成部分中已出现的信息不能重复。
(2)查阅方便:
通过名称可以方便地查阅数据词典中的每个定义。
(3)定义的书写方法简单、方便、严谨,而且可读性强
。
(4)建议采用卡片形式书写
。
(4)工具3:加工逻辑说明:(类似与描述算法)
- 结构化语言
结构化语言是在自然语言基础上加上一定的限制语句得到的语言,介于自然语言与程序设计语言之间 - 判定表
- 判定树
4、成果:需求规格说明书:包含哪些内容?
-
正文的第一章内容是1.概述,包含
1.1.编写目的
;1.2.术语与定义
;1.3.参考资料
;三个部分 -
第二章要给出该
项目的标准和规范
,在文档的后续内容编写中以及项目开发过程中必须遵照这个标准和规范进行。 -
第三章应该说明该项
目的相关假设
、限制和一些依赖条件
,在后续系统部署的过程中可以有参考意义。 -
第四章“
功能规格
”是重点,重点介绍这个系统的角色,界面设计思路,系统的功能视图和功能点清单,以及系统的需求用例。这个内容必须详细描述,这样才能对后续的开发和测试提供指导意义。 -
第五章“
非功能规格
”要对项目的性能、安全、数据的备份恢复等内容解释解释说明,一个项目除了功能完整之外,还要考虑性能、安全等相应的要求。 -
第六章“
附录
”,是对软件需求规格说明书的一些补充说明文档,其中的“软件需求跟踪矩阵”是重点,这份文档是对后续需求的完善程度进行了严格的控制。
四、概要设计
1、任务:确定系统的总体结构
- 设计软件系统结构
- 数据结构及数据库设计
- 编写概要设计文档
- 评审概要设计文档
2、过程:数据库设计是概要设计中的一个任务、测试计划也是概要设计中的一个任务
- 选定体系结构
- 确定设计方案
- 设计软件结构
- 数据结构及数据库设计
- 制定测试计划
- 编写概要设计文档
- 概要设计文档评审
3、原则:模块独立性的两个标准:耦合和内聚(哪几种,排列顺序)
- 模块化
- 抽象与分解
- 信息隐蔽与局部化
- 模块独立性
- 复用性设计
模块独立性:
1️⃣耦合性
耦合是模块之间相互连接的紧密程序的度量
模块之间的练习越紧密,联系越多,耦合性就越高,而其模块独立性就月弱
- 非直接耦合
耦合度最弱,模块独立性最强 - 数据耦合
调用模块和被调用模块之间只传递简单的数据项参数 - 标记耦合
传递地址 - 控制耦合
模块之间传递的不是数据,而是控制信息如标志、开关量,一个模块控制了另一个模块的功能 - 外部耦合
一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息 - 公共耦合
一组模块都访问同一全局数据结构 - 内容耦合
一个模块直接访问另一个模块的内容
尽量使用数据耦合,少用控制耦合,慎用或有控制地使用公共耦合、并限制公共耦合的范围,坚决避免内容耦合
2️⃣内聚性
- 偶然内聚
一个模块内的各成分无实质性的联系,只是偶然地被凑到一起 - 逻辑内聚
模块内部各组成部分的处理动作在逻辑上相似,但功能却彼此不同或无关 - 时间内聚
将若干个在同一时间段内进行的工作集中在一个模块内,但这些工作彼此无关 - 过程内聚
模块内部包含的各个成分按照某种确定的顺序进行,但所做工作没什么关系 - 通信内聚
模块内所有处理功能都通过公用数据而发生关系。即模块内各个组成部分都适用相同的输入数据或产生相同的输出结果 - 顺序内聚
一个模块中各个组成部分和同一功能密切相关,而且各个组成部分必须顺序执行,通常前一个成分的输出就是后一个成分的输入 - 功能内聚
模块内个各个组成部分全部都为完成同一个功能而存在,共同完成一个单一的功能,并且只能完成一个功能,模块已不可再分
设计的要求:高内聚、低耦合
设计的准则:提高独立性、模块的作用范围和控制范围
- 模块功能的完善化
- 消除重复功能,改善软件结构
- 模块规模应适中
- 模块的深度、宽度、扇出和扇入都应适当
- 模块的作用范围应在控制范围之内
- 力争降低模块接口的复杂程度
- 设计单入口、单出口的模块
- 模块功能应该可以预测
4、工具:系统结构图:通过数据流图导出系统结构图(怎么画的要了解)
数据流图两种:变换型
数据流图、事务型
数据流图,大部分的数据流图都是变换型的,局部有事务型特征
5、成果:概要设计说明书:包含哪些内容?
- 总述:
需求或目标
(讲一下事情的起源)、环境、局限; 总体设计
:从全局的角度说一下
组织结构、功能、处理流程、有哪些模块、模块间的关系,运行环境等。(输出图:系统结构图,系统流程图,数据流程图)外部接口
:总体说明外部用户、软、硬件接口(可用资源);模块设计
:每个模块“做什么”、简要说明“怎么做”(输入、输出、处理逻辑、与其它模块或系统的接口),处在什么逻辑位置、物理位置。
五、详细设计
1、任务:确定每一个模块所使用的算法、块内数据结构和接口细节
- 算法设计
- 数据结构设计
- 确定模块接口细节
- 测试用例设计
- 数据库物理设计
- 数据代码设计
- 其他设计
- 编写详细设计说明书并进行评审
2、工具(较重要):程序流程图、N-S图、PAD图(画法,给你一个算法,你能画图)
每种图有优缺点:程序流程图在描述程序结构、嵌套关系、层次结构上不容易表示,不太支持逐步求精,简单、清晰、直观
图形工具:程序流程图、N-S图、PAD图
表格工具:判定表
语言工具:过程设计语言(PDL)
1️⃣程序流程图
- 处理框也可以表示输入/输出操作
- 在不至于混淆的情况下,从上到下、从左到右的箭头可以省略
- 预定义的处理可定义函数和子程序
- 连接点用于从一张流程图到另一张流程图的转接
顺序结构:
选择结构:
多分支选择结构:
当循环结构
直到循环结构:
优点:直观清晰、易于使用
缺点:①控制流程的流向可以任意画,容易造成非结构化的程序结构
②流程图不能反映逐步求精的过程,往往反映的是最后的结果
③不易表示数据结构
2️⃣N-S图
(1)顺序结构:在方框内从上到下安排任务,任务之间以横线分开,一个任务框内可以是一条语句或多条相关语句
(2)选择结构:
(3)循环结构
N-S图特点
①每一个特定控制结构的作用域都很明确,能够清晰判别
②绘制时需遵守结构化程序设计要求,不能够任意转移控制
③易于确定局部数据和全局数据的作用域
④易于表示嵌套结构的模块化得层次结构
3️⃣PAD图
优点
(1)结构清晰,易读易画
(2)使用PAD图设计出的程序必然是结构化程序
(3)PAD图容易转换成高级语言源程序
(4)支持自顶向下、逐步求精的设计方法
4️⃣PDL图
特点:
(1)关键字具有固定的语法格式,可以提供结构化控制语句、数据和模块说明
(2)处理部分的描述采用自然语言,便于理解
(3)可以说明简单数据结构和复杂数据结构
(4)可以完成模块定义和调用的说明,并能完成各种接口的描述
(5)PDL描述与程序结构相似,容易自动生成程序
(1)数据说明:PDL 程序中指明数据名的类型及作用域.其形式为:
end <子程序名> <PDL 语句指各种 PDL 构造>
(3)分程序结构
begin <分程序名> <PDL 语句>
end <分程序名>
(4)顺序结构
选择型
if <条件> then
<PDL 语句>
else
<PDL 语句>
end if
if <条件> then
<PDL 语句>
else if <条件> then
<PDL 语句>
else
<PDL 语句>
end if
WHILE 循环
loop while <条件>
<PDL 语句>
end loop
UNTIL 型循环
loop until <条件>
<PDL 语句>
end loop
CASE 型
Case <选择句子> of
<标号>{, <标号}: ><PDL 语言>
[default]: [<PDL 语句>]
end case
(5)输入/输出结构 print read display
3、成果:详细设计说明书
- 引言,包含: 编写目的,背景,参考资料,术语定义及说明
- 设计概述,包含:任务和目标,需求概述,运行环境概述, 条件与限制,详细设计方法和工具
- 系统详细需求分析,包含:详细需求分析,详细系统运行环境及限制条件分析接口需求分析
- 总体方案确认,包含: 系统总体结构确认, 系统详细界面划分
- 系统详细设计,包含:
系统结构设计及子系统划分,系统功能模块详细设计(采用HIPO图进行功能分解与模块描述,用IPO或结构图描述各模块的组成结构、算法、模块间的接口关系,以及需求、功能和模块三者之间的交叉参照关系),系统界面详细设计