来自专栏的我个人学习笔记,图片来自专栏里面
记笔记的目的不是单纯为了“记”,是为了以后复习时不需要太大的时间成本
参考专栏:软件工程导论专栏
第一章:软件工程概论
三个阶段
程序设计阶段(50-60年代)、程序系统阶段(60-70年代)、软件工程阶段(70年代后)
软件概念
数据(处理信息的数据结构),程序(完成预定功能),文档(反应过程的图文资料)
软件特点
复杂,成本高,维护难,开发方式受限
软件危机
开发成本和进度估算不准,质量保证难,不可维护,没有合适文档资料,成本逐年上升,开发效率低
软件危机产生原因
主观:忽视需求,轻视软件维护,没有认识到程序是软件一部分,对软件开发没有正确认识,越后期有变动代价会很高
客观:本身不好管理和控制,维护难,且复杂
如何解决
正确认识计算机软件,借鉴好的原理、技术和方法,积极开发辅助开发软件,探索创新有效开发、控制和管理手段
软件工程定义
用工程的概念、原理、技术、方法开发与维护
软件工程的本质特征
1.关注大型程序构造(支持小型开发的软件,不能简单用于开发大的)
2.中心课题是控制复杂性(大问题化若干有联系的小问题,复杂性不变,变可管理)
3.软件经常变化(更新换代)
4.开发效率非常重要(好用的开发和维护工具)
5.开发人员和谐合作(按规定纪律办事,保持交流)
6.软件需要有效支持用户(除了产品,还应该有使用说明嘛)
7.软件开发者替代其他领域人员创造产品(开发人员应具备其他领域的知识)
软件工程基本原理
1.按软件生存周期分阶段制定计划并实施
2.坚持进行阶段评审(提前找出错误改正)
3.坚持严格的产品控制(需求改变,为了保持软件各配置成分一致)
4.使用现代程序设计技术(用先进技术)
5.结果能清楚的检查(检查达标否)
6.用人少而精
7.不断改进与实践
软件工程方法学
方法:完成各项任务的技术方法,怎么做
工具:为方法提供开发环境,工具等
过程:软件开发任务框架,何时做
分类:
1.传统方法学:结构化技术,软件生命周期分为若干阶段,各阶段始末有严格标准,各阶段结束有审查
2.面向对象方法学:数据结构,所有对象化为类,组成层次结构系统,各阶段保持交流
如何确定一个软件(软件定义)
确定用户待解决问题,可行性研究,需求分析
软件开发
总体设计(确定最佳方案,设计软件结构,确定程序的模块组成,模块间的关系)
详细设计(针对每个模板、设计详细规格说明,确定算法和数据结构)
编码和单元测试(代码实现,并测试每个模块)
综合测试(集成测试和验收测试)
软件维护
改正性维护,适应性维护,完善性维护,预防性维护
软件过程概念
一系列任务框架构成,通常用软件生命周期模型来描述软件过程
主要软件生命周期模型
瀑布模型:将软件生命周期各项活动按固定顺序连接,最终得到产品
实际的瀑布模型带反馈环
特点:必须按顺序且后一阶段依赖前一阶段,推迟物理实现,质量保证观点
优点:迫使开发人员用规范的方法,各阶段严格规定提交文档,每个阶段质量过审,降低软件预算
缺点:开发初期很难做出正确且全面的需求分析,无法验证正确和完整,难维护
适用范围:需求非常清楚全面且开发过程变数少几乎无,开发人员对软件应用领域很熟,用户使用环境稳定,开发中用户参与要求很低
快速原型模型:快速建立可运行的程序,完成的功能往往是最终产品功能的一个子集
特点:快速原型模型的第一步是快速建立一个能反映用户主要需求的原型系统,让用户通过实践来了解目标系统的概貌
优点:满足需求,线性开发过程
缺点:准确原型设计难,对原型理解可能不同,不利创新
适用范围:对所开发领域熟且有相关工具,模型可作为开发模型,对已有的产品原型优化
增量模型:先完成一个系统子集的开发,再按同样的开发步骤增加功能,如此递增下去直至满足全部系统需求
优点:短时间完成部分功能
缺点:集成难,容易边做边改
螺旋模型:快速原型模型各阶段加入风险分析
优点:质量不错,测试减少,维护与开发一体
缺点:风险评估难
喷泉模型:典型的面向对象软件过程模型。体现了迭代和无缝的特性
第二章:可行性研究
可行性研究目的:用最小的代价在最小的时间内确定问题是否可以被解决
可行性研究本质:大大简化系统分析和设计过程,较高层次上以较抽象的方式进行系统分析和设计过程
可行性研究任务:
根本任务:对以后的行动方针提出建议
具体任务:1.分析理清问题定义
- 导出系统逻辑模型(数据流图+数据字典)
- 根据2的模型探索若干可选择的解法
- 研究每种解法可行性:经济可行性(是否亏本),技术可行性(现有技术能够实现)操作可行性(系统操作是否可行),其他可行性(法律,社会效益)
可行性研究过程(步骤)
1.复查系统规模和目标(检查产品规模,还有最终目标)
2.研究目前正在使用的系统(只知道做什么,不关心怎么实现)
3.导出新系统的高层逻辑模型(现有物理系统->现有逻辑系统->目标逻辑系统->目标物理系统)
4.进一步定义问题(和用户一起复查)
5.对供选择的解法进行评价
6.推荐行动方针
7.草拟开发计划
8.写文档提交检查
数据流图的定义(DFD)
无具体物理部件,就描绘信息流和数据从输入到输出所经变换的
数据流图的特点
无具体物理部件,描绘数据在软件中流动和被处理的逻辑过程,是系统逻辑功能的图形表示,设计时只考虑基本的逻辑功能,具体实现不考虑
数据流图的符号
数据流图的示例
假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下述数据:零件编号,零件名称,订货数量,目前价格,主要供应者,次要供应者。零件入库或出库称为事务,通过放在仓库中的CRT终端把事务报告给订货系统。当某种零件的库存数量少于库存量临界值时就应该再次订货。画出上述订货系统的数据流图
A从题目提取四种成分
- 考虑数据源点(仓库管理员)和终点(采购员)
- 考虑有那些处理(采购部需要报表,仓库中零件数量会改变,对事物加工是另一个处理)
- 考虑数据流(系统会把订货报表发个采购部,事物需要从仓库送到系统中)
- 考虑数据存储(事物发生时就该马上处理,每天只产生一次,产生的表必须放一段时间,有一个数据存储)
B画图
基本系统模型
细化,描绘主要功能
进一步细化主要功能
4.到如何具体实现一个功能就不继续了,检查一下
数据流图的用途
交流信息,分析和设计工具
根据系统的逻辑模型考虑系统的物理实现
数据字典概念(定义,作用,意义)
数据的信息集合,说白了就是一个对图上一些数据的说明书,就个批注一样,只是单独出来的,严格标准构建系统逻辑模型。
内容
数据流,数据元素,数据存储,处理
定义数据的方法
- 组成方式:顺序,选择,重复,可选
- 符号表示:=(等价于),+(和,即连接两个分量),[](或,即从括号内分量选一个),|(隔开供选择的分量),{}(重复),()(可选,即可有可无)
数据字典示例
用途
分析,开发数据库有价值的第一步
第三章:需求分析
需求分析概念
系统做什么(写需求规格书以书面描述软件需求),准则有数据模型(信息域),功能模型(待完成功能),行为模型(软件行为),对以上模型层次化展示细节
需求分析任务
确定对系统的综合要求(功能,性能,可靠性和可用性,出错处理,接口,约束,逆向(不能做),未来规化)
数据要求(信息处理系统,数据流图,实际联系图,状态转换图,数据字典描述建立的逻辑模型)
与用户沟通获取需求方法
这个我觉得就是问把,不算重点
分析建模与规格说明
模型是理解事物而对事物做出一种抽象书面描述
数据模型(实体-联系图):各数据对象之间关系
功能模型(数据流图):数据怎么被处理的
行为模型(状态转换图):系统各行为在不同状态间转换的方式
实体联系图(E-R图)
用来建立数据模型,用了E-R图描绘的数据模型也被称为E-R模型(实体,属性,联系)
符号表示:
优点:用简单的图形符号表示好理解
示例:一个学生可选修多门课,一门课有若干学生选修;一个教师可讲授多门课,一门课只有一个教师讲授;学生选修一门课,产生成绩;学生的属性有学号、姓名等;教师的属性有教师编号,教师姓名等;课程的属性有课程号、课程名等。请画出该系统E-R图
状态转换图
初始状态,中间状态,终态这种(如人的成长:幼-少-老)
一个状态图只有一个初始,终态可有可无,也可以有多个
其他图形工具
层次图:逐步精细,描绘越来越详细
Warnier图:可以表明信息逻辑组织
IPO图:描述输入处理输出的图
验证软件需求
四个方面:一致,完整,现实,有效
方法:用自然语言,形式化语言描述需求,使用软件工具验证一致性,参照开发经验验证现实性,建立软件原型验证完整和有效
工具:PSL/PSA系统
PSL(问题陈述语言):描述系统的形式化语言
PSA(问题陈述分析程序):处理PSL描述的分析程序
第四章:总体设计
总体设计的概念
系统应该如何实现,大概初步设计;主要任务划分系统的组成部分(程序,文件,数据库等),但每个物理元素仍然处于黑盒子级(里面内容以后仔细设计),设计软件结构;步骤:1寻找目标系统不同的方案分析并选择,进行必要的数据库设计,测试计划
设计过程(两个阶段)
1.系统设计阶段
设想供选择的方案(依靠逻辑模型,数据流图等),选出合理方案(流程图,元素清单,经济分析,进度),
推荐最佳方案
2.结构设计阶段
功能分解,设计软件结构(层次图或结构图),设计数据库,制定测试计划,写文档,审查和复查
设计原理
模块化:结构清晰便于理解阅读,易调试,易修改,有助于软件工程管理
抽象:抽出事物的本质特性而暂时不考虑它们细节
逐步求精:和字面意思一样,Mlller法则:注意力集中信息块(5-9个)
信息隐藏和局部化:信息隐藏(主要是模块的实现细节不能访问),局部化(关系密切的软件元素物理地放近,有利于信息因此)
模块独立:具有独立功能和其他模块关系简单,包含两个属性
内聚:模块功能强度,模块内部各元素彼此结合的紧密程度的度量,模块内部各元素之间联系越紧密,内聚越强
耦合:模块之间相对独立,互相连接的紧密程度,模块连接越紧密,联系越多,耦合性越强
软件设计目标:高内聚,低耦合
启发规则
1.改进软件结构提高模块独立性(设计出软件初步结构,审查力求降低耦合提高内聚)
2.模块规模适种(过大的模块分解往往不充分,过小的模块开销大,数目多使得系统接口复杂)
3.深度、宽度、扇入和扇出应适当(树形层次结构图)
深度:软件结构中控制的层数,粗略地标志一个系统大小和复杂程度(系统结构图树形图,深度多深和数据结构中的树的深度概念一样)
宽度:软件结构内同一层次上的模块总数最大值,宽度越大系统越复杂,对它影响最大的是模块扇出
扇出:一个模块控制的模块数目(我的理解就是在树形图上的一个节点的出度(图的出度,这里出度有分解的意思)
扇入:表明多少个上级模块直接调用它,扇入越大共享该模块的上级模块数目越多(图的入度,这里有被上级控制的意思)
4.模块的作用域应该在控制域之内
5.力争降低模块接口的复杂程度
6.设计单入口单出口的模块
7.模块功能应可预测,防局限
描绘软件结构的图形工具
层次图和HIPO图
层次图用于描绘软件的层次结构,其中一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系
层次图很适于在自顶向下设计软件的过程中使用。通常用层次图作为描绘软件结构的文档
HIPO图本质就是层次图加编号
结构图
描述调用关系和传递信息和调用方式
方框代表模块注明名字和功能,箭头或直线表示调用关系,尾部空心圆表示传递数据,实心则传递的是控制信息
第五章:详细设计
过程设计工具
程序流程图
符号:
a.选择;b.注释;c.预定义处理;d.多分支;e.开始或停止;f.准备;g.循环上界限;h.循环下界限;i.虚线;j.省略符;k.并行方式;l.处理;m。输入输出;n.连接;o.换页连接;p.控制流
优点(直观,初学易掌握)缺点(没有逐步求精,没约束,数据结构难表示)
盒图(N-S)
PAD图
- 顺序;b.选择;c.多分支;d.循环;e.循环;f.语句符号;g.定义
优点:结构化程序,清晰,易懂、易记、易读,好转化高级程序语言源程序,好描绘数据结构,自顶向下,逐步求精
判定表
左上部列出所有条件
左下部所有可能做的动作
右上部表示各种条件组合
右下部每种条件组合相对应的动作
判定树:判定表的变种,清晰表示复杂的条件组合和动作之间对应关系
过程设计语言(PDL):伪代码
第六章:实现和测试
第七章:软件维护
软件维护概念和特点
为了改错或满足新的需求,保证软件在一个相当长的时期能够正常运行
可以分为:改正性维护,适应性维护,完善性维护,预防性维护
特点:
1.结构化维护(从文档入手)和非结构化维护(程度代码入手,代价大)差别巨大
2.维护代价高
3.维护存在很多问题
软件可维护性
可维护性是指维护人员理解、改正、改动或改进这个软件的难易程度,提高可维护性是支配软件工程方法学所有步骤的关键目标
决定软件可维护性的因数:
- 可理解性(外来者读取相关软件信息的难易程度,模块化,文档,结构设计,高级程序设计语言)
- 可测试性(诊断和测试取决于软件容易理解的程度,良好的文档,软件结构,调试工具测试过程)
- 可修改性(耦合,内聚,信息隐藏,局部化,控制域与作用域等)
- 可移植性(把软件转移不同的计算机环境上的难易程度,提高方法把与硬件操作系统外部设备有关的程序代码集中放在特顶的程序模块中)
- 可重用性(同一事物不修改,稍微改动就在不同环境中重复使用)
面向对象
第八章:面向对象方法学
第九章:面向对象分析
第十章:面向对象设计
第十一章:面向对象实现
第十二章:软件项目管理
通过计划、组织和控制等一系列活动,合理配置和使用各种资源,达到目标的过程
估计软件规模
代码行技术:估计一个功能所需要源代码行数,代码是项目都有的产品,容易计算代码行数,不同语言代码实现行数不同,衡量整个软件规模不合理
功能点技术:以功能点(FP)为单位度量软件规模
工作量估算
工作量是软件规模的函数,单位是人月(pm)
进度计划
甘特图(Cantt图):工具,形象描述任务分解情况
工程网络
人员组织(软件开发人员组织方式)
民主制程序员组,主程序员组,现代程序员组
质量保证
复查或评审,软件测试
软件配置管理
标识对象,版本控制,变化控制,配置审计,状态报告
能力成熟度模型
评价软件机构的软件过程能力成熟度的模型,五个等级:初始等,可重复级,已定义级,已管理级,优化等级