学习有点慢慢,15集的视频将近看了十天。不过好在看完了,记录也还能接受。要不,又是做无用功了。好了,废话少说,看我的总结吧。
一般,对于一个新名词,我们都会怎么思考它?大多数人一般都会想它是什么、有什么特点(意义)?我们来了解下神奇的软工世界吧。
软件工程(Software Engineering,简称SE),是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科,就是和软件有关的工程,而软件是什么,软件是系统中与硬件相互依存的另一部分,包括程序、数据、及其相关文档的完整集合。
那么,问题又来了,程序、数据、文档又是啥?
程序:按设计的功能和性能要求的指令序列。数据:正常操作信息的数据结构。文档:程序开发、维护和使用有关的额图文材料
其实软件工程没有具体的定义,不同公司有不同的解释:
Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护程序必需的相关文件资料
IEEE:软件工程师开发、运行、维护和修复软件的系统方法
Fritz Bauer:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法
什么特点?
1. 逻辑实体,非物理实体(抽象性)
2. 生产与硬件不同,开发过程中无明显制造过程
3. 运行和使用期间,没有硬件的机械磨损,老化问题
4. 开发和运行手系统限制,有不同程度的依赖性
5. 至今未完全摆脱手工操作
6. 本身复杂(实际问题,逻辑结构)
7. 成本昂贵
8. 很多设计社会因素(知识产权等)
其他方面了解:
分类情况有很多种。依据功能划分分为系统软件、支撑软件、应用软件;按规模划分,有微型、小型、中型、大型、甚大型、计大型之分;还有按工作方式、服务对象、使用频率、失效影响等区分。
软件工程基本原理:
1.用分阶段的生存周期计划严格管理
2.坚持进行阶段评审
3.实行严格的产品控制
4.采用现代程序设计技术
5.结果应能清楚地审查
6.合理安排软件开发小组的人(少而精)
7.承认不断改进软件工程实践的必要性
软件工程的项目基本目标是:
付出较低的开发成本
达到要求的软件功能
取得较好的软件性能
开发的软件易于移植
需要较低的维护费用
能按时完成开发工作,即时交付使用
软件工程原则:分解性、独立性、一致性、确定性
生存周期(六个阶段):(从开发至被废弃)问题定义、可行性研究、需求分析、设计、编码、测试、运行与维护;三大阶段:软件计划阶段、开发阶段和维护阶段
软件开发模型,例如瀑布模型、B模型、快速原型模型(RapidPrototyping Model)、演化模型、渐增模型、螺旋模型等。
通过上面了解了软件工程,那么我们可能会认为做个软件有啥的,做出来不就行了,那么我们看看具体怎么做吧。
如果直接就开始软件创建,那为啥还要叫软件工程,直接叫编程不就完了。其实软件工程师工程化的,需要考虑方方面面,不仅要创建软件,还要为软件作说明,以及维护,让非专业的人知道怎么使用和维护软件,这才是重点。那么让非专业人士了解,就需要多种文档的建立啦。由于视频我还没有看完,所以只能先介绍我了解的文档了。
文档也就是软件规格说明书,用来规定软件的功能与运行环境,满足规格的条件和完成客户需求。软件规格说明书的特点:易理解性、可见性、可支持性、可接受性、可靠性、健壮性、可维护性、速度。
首先,第二章介绍的是可行性研究报告。
可行性研究步骤:
复查系统规模和目标
研究当前正在使用的系统
到处新系统的高层逻辑模型
向用户推荐建议方法
推荐行动方针,做出关键性的决定
草拟开发计划,写出可行性论证报告
提交上级和专家审查
软件计划内容
软件功能规模,软件能力对硬件的要求,接口界面的性质和复杂性等
环境资源:
人力资源,在不同的阶段对不同的人员的要求
硬件,包括目标机器,及其他机器
软件,包括职支撑软件和使用软件
制定进度表,包括交付日期,如何组织分配力量
软件成本,只要双方都能接受即可(估算)
资源性能描述:要什么样水平的人,什么样的功能性能的硬件和软件
价格评估
影响因素:人口、产品、工程、资源
1.参数化算法
C=f(Vi);C是软件价格,Vi所选取的影响软件价格的独立参数
2.代码行(LOC)价格估算技术
有关参数:源代码行,是软件产品计量单位,不包括注释,作业命令……
劳动量,一个人参加劳动时间的长短
软件生产率,单位劳动时间完成软件的数量
LOC计算方法,对设计的系统进行功能分解,根据历史数据和经验选择每个软件功能块的LOC价格
3.任务分解方法
思想:首先把软件开发工程分解为若干个相对独立的任务,再分别估计每个开发任务的成本,最后累加得出总成本
4.自动估计成本方法
减轻人的劳动但要有大量的经验数据做基础,要有狼嚎数据库系统支持
成本/效益分析
成本估计方法:自顶向下估价、自底向上估价
成本/效益分析法:
运行费:取决与系统的操作费用和维护费用
系统的经济效益:因新系统而增加的收入+新系统节省的运行费;系统经济效益一般在整个生存周期内都存在
项目开发计划
引言:编写目的、项目背景、定义、参考资料
项目描述:工作内容、条件与限制、产品、运行环境、服务、验收标准
实施计划:任务分解、进度、预算、关键问题
人员组织及分工
交付期限
专题计划要点
第三章介绍的是软件需求
任务:深入描述软件的功能和性能
确定软件设计的约束和软甲同其他系统元素的接口细节
定义软件的其他有效性需求(借助于当前系统的逻辑模型到处目标系统的逻辑模型,解决目标系统的“做什么”的问题)
需求包括:功能需求、性能需求、环境需求、可靠性需求、安全保密要求、用户界面需求、资料使用需求、成本消耗需求、开发进度需求、预先估计以后系统可能达到的目标
方法共性:
支持数据域分析的机制
功能表示的方法
接口的定义
问题分解的机制以及对抽象的支持
逻辑视图和物理视图
系统抽象模型
软件需求分析的原则
需要能够表达和理解问题的信息域和功能域
要能以层次化得方式对问题进行分解和不断细化
软件需求规格说明的原则
从现实中分离功能描述要“做什么”而不是“怎么实现”
要求使用面向处理的规格说明语言(或称系统定义语言)
软件需求方法
由对软件问题的信息域和功能域的系统分析过程及其表示方法
大多是由信息驱动(信息流即数据流,不包括控制)
结构化分析方法
面向数据流
使用数据处理类型软件
数据流图(DFD):通过数据流向表达软件需求
数据流图的作用:
1.系统分析员用这种工具可以自顶向下分析系统信息流程
2.可在图上画出需要计算机处理的部分
3.根据数据存贮(zhu),进一步作数据分析,向数据库设计过渡
4.根据数据流向,定出存取方式
5.对应一个处理过程,用相应的语言、判定表等工具表达出处理方法
数据流图的优缺点:
1. 总体概念强,每一层都明确强调“干什么”,“需要什么”,“给什么”
2.可以反映出数据的流向和处理过程
3.由于自顶向下分析,容易及早发现系统各部分的逻辑错误,也容易修正
4.容易与计算机处理相对照
5.不直观,一般都要在作业流程分析的基础上加以概括、抽象、修正来得到
6.如果没有计算机系统帮助的话,人工绘制太麻烦,工作量较大
检查和修改数据流图的原则
1.数据流图上所有图形符号只限于前述四种基本图形元素
2.数据流图的主图必需包括前述四种基本元素,缺一不可
3.每个加工至少有一个输入数据流和一个输出数据流
4.在数据流图中,需按层给加工框编号。编号表明该加工所处层次及上下层的亲子关系
5.规定任何一个数据流子图必需与它上一层的一个加工对应,两者的输入数据流和输出数据流必需一致
6.图上每个元素都必须有名字
7.数据流图中不可夹带控制流
8.初画图时可以忽略琐碎的细节,以集中精力于主要数据流
9.不许有交叉层叠的情况
数据词典
配合数据流图,清楚地表达数据处理的要求
(主)词条描述——对图形元素定义(名字,别名或编号,分类,描述,定义,位置,其它等)
用于写加工逻辑说明的工具:
结构化英语,是一种介于自然语言和形式化语言之间的语言,由英语命令动词,数据词典中定义的名字,有限的自定义词,逻辑关系词IF_THEN_ELSE、CASE_OF、WHILE_DO、REPEAT_UNTIL等组成;语言的正文用基本控制结构进行分割,加工的操作用自然语言短语来表示;其基本控制结构有三种:简单陈述句结构;重复结构;判定结构
判定表(将各种逻辑通过列表的方式列举出来)
先条件后动作最后优化;优化先从动作开始。
描述加工的基本说明,适用多个逻辑的,清晰描述复杂的条件组合与应该做的动作对应关系;但不能表述不确定的加工处理,重复循环的加工处理
判定树(通过树状图表示逻辑组合)
用来表达加工逻辑的一种工具,有时比判定表更直观
优点:形式简单,直观,判定表的数据源数多余两个的时候,判定表写起来别较多,判定树比较形象
不足:简洁度不如判定表,越接近树叶的地方越多
其它还有I/P/O图、层次方框图、PHA图等,不做详细介绍。
工具的选择方式:
1.从机器的可读性来讲:结构化英语、判定表优于判定树
2.从描述的直观性来讲:判定树较好
3.对于逻辑验证和优化能力:判定表较好(所有的可能性都列出来)
原型化方法
开发初期,完整准确的规格说明不易得到,用户往往对系统仅一个模糊想法,难完全准确表达系统全面要求
软件原型的分类:
探索型 |
探索需求分析 |
实验型 |
取得数据 |
进化型(演化型或渐进型) |
以开始的目标系统为核心不断完善 |
最常用的动态分析方法
状态迁移图是描述系统的状态如何相应外部的信号进行推移的一种图形表示,圆圈“○”表示可得到的系统状态,箭头“→”表示从一种状态向另一种状态的迁移,“?”表示转移即系统的事件。优点:单纯性,机械地分析许多情况,易机那里分析工具,如可转换为状态迁移表,处理功能强;状态之间的关系描述直观(不能有交叉不清)
时序图(Sequence Diagram),亦称为序列图或循序图或顺序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,时序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件。
Petri网简称PNG(Petri Net Graph),广泛应用于硬件与软件系统的开发中,适用于描述与分析相互独立、协同操作的处理系统,即并发执行的处理系统;标记,或称令牌(token),是表明系统当前处于什么状态的标志
第四章介绍的是软件概要设计说明书和详细设计说明书
即第四章描述的是软件的设计。
概要设计的过程步骤:
S1:设计系统方案
S2:选取一组合理的方案
S3:推荐最佳实施方案
S4:功能分解
S5: 软件结构设计
S6:数据库设计、文件结构的设计
S7:制定测试计划
S8:编写概要设计文档
S9:审查与复审概要设计文档
软件设计的概念与原则
1. 将软件划分成若干独立成分的依据
2. 怎样表示不同的成分内的功能细节和数据结构
3. 怎样同一衡量软件的技术质量
软件设计的目标和任务
根据用信息域表示的软件需求,以及功能和性能需求,进行
数据设计
系统结构设计
过程设计
注意:一般先概念设计,后详细设计
软件设计的过程:
制定规范
软件系统结构的总体设计
处理方式设计
数据结构设计
可靠性设计(质量设计)
编写概要设计阶段的文档(概要设计说明书和数据库的说明书、完善用户手册)
概要设计评审
软件设计基础:
自顶向下,逐步细化
体系结构自顶向下方式,各个层次过程细节和数据细节逐层细化
软件结构
模块结构和数据的结构
把一个问题分解为多个子问题,然后非别解决子问题(子问题开发工作量之和小于原问题开发工作量【数学问题】)
程序结构,分为两种
树状结构(层次结构):
层次分明,只有一个节点,没有副节点,多个子节点(兄弟之间没有什么联系,只与父节点有关);纵向叫深度,横向叫快读,每个节点输入叫扇入,输出叫扇出
网状结构:
任何两个节点可以建立联系,层次模糊,不易看出根节点
结构图(S/C图)
反映程序中模块之间的层次调用关系和联系
模块化
能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构
1.模块
矩形框表示,模块名,各个模块名不能相同
模块名(以功能、功能缩写、已定义模块、子程序或过程),一般以功能命名,功能非单一以主要功能命名
2.模块的调用关系和接口
3.模块间的信息传递
传入和传出信息必不可少,要表明信息名称和特征
传递信息较多时要描写主要信息
4.表示模块A有条件地调用另一个模块B
菱形框表示,标记点一定要在上一模块,尽量也要写上条件
弧形的表示循环调用,右箭头的表明循环调用的方向(顺序)
程序的系统结构图
小的结构图深度大概5-7层,中型十几层或10层,复杂型几十层,反映问题的复杂性
宽度指任意一层的模块书,宽度越大,复杂度越高
扇出太多表明受其他模块影响较大,扇出不要太多,一般2-5,不要超过9-10,减小扇出,势必要增加深度
扇入表示驱动模块(上一个模块)有多少,扇入一般1-5,要控制数量
一个好的系统结构图应该呈现“瓮”型
抽象化
软件系统进行模块设计时,可有不同的抽象层次,即分解系统;
控制分解速度
过程:分层抽象,逐渐细化;
根据任务需求进一步细化;
程序过程抽象(编程阶段);
数据抽象,在不同层次上描述数据对象的细节,定义与该数据对象相关的操作
信息隐蔽
划分模块的时候(定义层次),模块内的数据发生变化的时候,尽量不要影响其他相关模块或少影响,即不允许其他的模块使用本模块
模块的独立性
模块的基本属性:
功能:描述该模块实现什么功能
逻辑:描述模块内部怎么做
状态:该模块使用时的环境和条件
独立性是指软件系统中每个模块只涉及软件要求的具体的子功能
一般采用两个准则度量模块独立性,即模块间耦合和模块内聚
模块间的耦合
独立性越强,耦合性越低
非直接耦合(Nondirect Coupling)
两模块之间没有直接关系
数据耦合(Data Coupling)
如果一个模块模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量来交换输入、输入信息的)
标记耦合(Stamp Coupling)
如果一组模块通过参数表传递记录信息,就是标记耦合
控制耦合(Control Coupling)(中耦合)
如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能
外部耦合(External Coupling)
一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,较强耦合
公共耦合(Common Coupling)
若一组模块都访问同一个公共数据环境,较强耦合有两种情况:松散公共耦合和紧密公共耦(a)A模块写入的数据(B模块不需要的)可能导入到B模块
(b)两个模块都能修改数据,容易造成混乱,尽量避免
合理使用公用耦合,可减少使用内存量
内容耦合(Content Coupling)
模块内聚
内聚性越高,模块独立性越强。内聚是可以互相转换的。
功能内聚(Functional Cohesion)
一个模块中各个部分都是完成某一具体功能必不可少的组成部分,是不可分割的,最理想的模块内聚
信息内聚(Informational Cohesion)
也称(顺序内聚),模块完成多个功能,各个功能都在统一数据结构上操作,每一项功能有一个唯一的入口点,较强内聚
通信内聚(Communication Cohesion)
如果一个模块内各功能部分都使用了相同的输入数据,或产生相同的输出数据
过程内聚(Procedural Cohesion)
使用流程图做为工具设计程序时,把流程图中的某一部分划出来组成模块
时间内聚(Classical Cohesion)
也叫瞬间内聚
1.各个模块的执行与时间有关
2.通常要求所有功能必须在同一时间段内执行;
3.动作仅执行一次,往往影响其他模块;
4.模块内各部分内聚的时间关系反映了某些实质问题
逻辑内聚(Logical Cohesion)
把集中相关的功能组合在一起
巧合内聚(Coincidental Cohesion)
各部分之间没有联系,或者即使有联系,这种联系也很松散
结构化设计方法
首先研究、分析和审查数据流图;然后根据数据流图决定问题的类型,典型类型:变换型和事务型
系统结构图中的模块
传入模块
输入物理数据流,传出逻辑数据流,左斜
传出模块
传出逻辑输出数据流(一般),右斜
变换模块
从上级模块取得数据,经过变换后在返还上级模块
协调模块
对所有下属模块进行协调与管理
变换型系统结构图(一条线),过程大致分为三步:取得数据,变换数据和给出数据
事务型系统结构图(有分支),接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果
变换分析
方法四步组成:
1.重画数据流图
2.区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分
3.进行一级分解,设计上层模块
4.进行二级分析,设计输入、输出和中心变换部分的中、下层模块
中心交换就是主模块位置
1. 在选择木块设计的次序时,须对一个木块的全部直接下属模块都设计完成
2. 在设计下层模块时,应考虑模块的耦合和内聚问题
3. 使用“黑箱”技术:在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”
4. 在模块划分时,一个模块的直接下属模块一般在5个左右(调用的模块)
5. 如果出现以下情况,就停止模块的功能分解:
6. 当木块不能再细分为明显的子任务时;
7. 的那个分解成用户提供的模块或程序库的子程序时
8. 当模块的界面是输入/输出设备传送的信息时
9. 当模块不宜再分解得过小时
事务分析也是从分析数据流图开始,自顶向下,逐步分解,建立系统到结构图
事务处理过程:
1. 识别事务源
2. 规定适当的事务型结构
3. 识别各种事务和他们定义的操作
4. 注意利用公用模块
5. 对每一事务,或对联系密切的一组事务,建立一个事务处理模块
6. 对事务处理模块规定他们全部的下层操作模块
7. 对操作模块规定他们的全部细节模块
软件模块结构的改进
模块功能的完善化,一个完整的模块应当有一下几部分:
1. 执行规定的功能的部分
2. 出错处理的部分
3. 给它的调用者返回一个结束状态标志
模块的作用范围应在控制范围之内
模块的控制范围包括它本身及其所有的从属模块
模块的作用范围是指模块内一个判定的作用范围,凡是收这个判定影响的所有模块都属于这个判定的作用范围。
当违反了作用域和控制域的关系时,解决方法:判定点的上移(判定模块的功能上移);受控制的模块下移到控制模块
尽可能减少高扇出结构,随着深度增大扇入
扇出一般2-5,不超9;扇入一般3-4
好处:是每个模块内部结构不太复杂
避免或减少使用病态联接,如:
1. 直接病态联接
2. 公共数据域病态联接
3. 通信模块联接
模块的大小要适中
通常规定其语句行数在50~100左右,保持在一页纸之内,最多不超过500行
一般按功能划分,防止模块功能太多,要是修改很麻烦
设计功能可预测的模块,但要避免过分受限制的模块(受约束条件过多)
对非法和合法的输入都应有相应的输出
软件包应满足设计约束和可移植性
设计的后处理
为每一个模块写一份处理说明
为每一个模块提供一份接口说明
确保全局数据结构和局部数据结构
之处所有的设计约束和限制
进行给药设计的评审
数据设计及文件设计
数据设计的原则
(总)在需求分析阶段所确定的数据对象选择逻辑表示,需要对不同的结构进行算法分析,以便选择一个最有效的设计方案;
确定对逻辑数据结构所必需的操作的程序模块,以便限制各个数据决策的影响范围
(分)
1. 用于软件的系统化方法也是用于数据
2. 确定所有的数据结构和在美中数据结构上施加的操作
3. 应当建立一个数据词典并用它来定义数据和软件的设计
4. 底层数据设计的决策应推迟到设计过程的后期进行
5. 数据结构的表示只限于那些必须直接使用该数据结构内数据的模块才能知道
6. 应当建立一个存放有效数据结构及相关操作的库
7. 软件设计和程序设计语言应当支持抽象数据类型的定义和实现
文件设计
文件逻辑设计,在概要设计阶段
1. 整理必须的数据元素
2. 分析数据间的关系
3. 确定文件的逻辑设计
4. 理解文件的特性
5. 确定文件的组织方式
6. 确定文件的存储介质
7. 确定文件的记录格式
8. 估算存取时间和存存储容量
过程设计
对所采用算法的逻辑关系进行分析,设计出全部必要的过程细节,并给予清晰的表达
决定各个模块的实现算法,并精确地表达这些算法,表达过程规格说明的工具叫做详细设计工具:图形工具、表格工具、语言工具
程序流程图
亦程序框图,五种基本控制结构:顺序型、选择型、先判定型循环、后判定型循环、多情况选择型
程序流程图的优点:
(a)采用简单规范的符号,画法简单;
(b)结构清晰,逻辑性强;
(c)便于描述,容易理解。
缺点:诱惑程序员过早的考虑控制流,建议少用
N-S图(盒图)
整个方框,看不到控制流。五种图形构件:、顺序型、选择型、WHILE重复型、UNTIL重复型、多分支选择型(CASE)型
问题分析图(PAD)
二维树形结构数据流来表示控制流,直接得出。其基本控制结构:顺序型、选择型、WHILE重复型、UNTIL重复型和多分支选择型(CASE型)