软件工程自学笔记

软件工程自学

emmm我们专业不学习软件工程,自学一点,权当休闲。

1.概述

应对不断变化的需求

软件工程自学笔记_第1张图片

软件工程自学笔记_第2张图片

软件工程自学笔记_第3张图片

开发占比比测试和维护小得多。

软件工程自学笔记_第4张图片

1570957633190

1.2 软件开发的三个阶段

软件工程自学笔记_第5张图片

私人化的软件环境中,软件的水平与个人的关系很大。

软件工程自学笔记_第6张图片

软件工程自学笔记_第7张图片

软件工程自学笔记_第8张图片

专家系统:提供专业知识与服务

网格计算:云计算

软件工程自学笔记_第9张图片

软件开发的初期,一定要先花时间把需求搞清楚

软件工程自学笔记_第10张图片

可读性、可理解性越好,可维护性越好

软件开发追求一致性和标准性

软件工程自学笔记_第11张图片

技术先进,需求不清楚是中国的现状。没有技术解决不了的,但是主要问题是把需求提清楚

好的需求本身就是一种资源

软件工程自学笔记_第12张图片

维护对一个公司的信誉很重要,要考虑到开发公司的流动性

维护费:技术支持(电话、邮件)、上门解决,这是一个长期的盈利(对客户就是花费)

软件工程自学笔记_第13张图片

软件的维护是一件很困难的问题。

软件工程自学笔记_第14张图片

软件!=程序,软件是由一个完整的配置组成的,还包括文档和数据。

在软件开发的不同阶段进行修改,需要付出的代价是很不相同的。

软件工程自学笔记_第15张图片

一旦发生错误应该马上修改

软件工程自学笔记_第16张图片

开发费与维护费是两回事。签合同的时候要说好

软件工程自学笔记_第17张图片

软件工程自学笔记_第18张图片

1.3 软件工程概述

软件工程自学笔记_第19张图片

好的项目管理要尽量准时。

一种策略:快速迭代、抢占市场、尽早上架

软件工程自学笔记_第20张图片

开发目的的折中、最优化

易于维护的软件,可靠性一般也比较高

可靠性和性能是互斥的,一个是求稳,一个是性能导向的

软件工程的原则:

软件工程自学笔记_第21张图片

例如类,就是对一组有共同特性的对象的抽象

软件工程自学笔记_第22张图片

局部化:资源的声明、使用和释放应该放在同一个模块中并且应该尽量靠近

一致性:要培训员工使用公司统一的命名、结构等规范

软件工程自学笔记_第23张图片

要使程序易于测试和检查。例如,内存泄露,memory leak,是一种比较难以测试的bug,可能需要长时间的运行才会出现(例如占用了资源没有释放,每次可能只是几k,但是长时间就会造成大范围的内存占用),并且难以排查究竟是哪一段出了问题、没有释放。

软件工程自学笔记_第24张图片

软件工程主要是用于大型工程的。

一个模块多大才合适?有一个简单的度量方法,就是一个模块大概就是一张A4纸那么大的内容。当分到类似这样大小的话就没必要再细分模块了。

软件工程自学笔记_第25张图片

软件工程自学笔记_第26张图片

这一点很重要!要区分我们获取到的工作流程是“真正”的流程,还是停留在规则上的流程,要获取用户真实的工作流程,而不是这个行业的标准、规范上的的工作流程。

软件的开发至今尚未完全摆脱手工的开发模式

软件工程自学笔记_第27张图片

甚大型的差不多是操作系统规模的

极大型的,例如弹道导弹系统

在公司我们开发的基本都是中型的项目。

1.4 软件需求说明书

软件需求说明书模板:https://wenku.baidu.com/view/622dced0195f312b3169a532.html

编写软件需求说明书,一般要给两种角色的人看,一种是客户,一种是开发人员。
对于客户: 重点在于清楚的表达客户提出的需求,你是如何理解的,让客户看了你的文档后确认你的表达和描叙是符合它的需求的。为了更形象的表达,请做一些界面原型来表达,这样客户才能真正与你形成互动,使针对客户的软件需求说明书有意义(最好是先做系统原型,直接拿原型与客户交流,客户的需求你就能全面把握了)。
对于开发人员: 重点告诉他们系统需要具有哪些功能,有哪些对象,对象有哪些属性,对象之间有哪些关系,最好能采用UML来表达

例如设计一个数据库,也有数据库的设计说明书,比如用ER图来说明结构等等。

1.5 软件工程的基本原理

软件工程自学笔记_第28张图片

“不同层次的管理人员都必须严格按照计划各尽其责地管理软件开发与维护工作,决不能受客户或上级人员的影响而擅自背离预定计划”,很理想化的设定2333

软件开发的步骤:

定义—》可行性分析-》需求分析-》设计-》编程-》测试-》运行-》维护

大多数的错误是在编程之前产生的,设计错误占很大一部分,不要只关注编程错误,例如有的设计根本实现不了。

软件工程自学笔记_第29张图片

系统设计没有对错,只有合理还是不合理

软件工程自学笔记_第30张图片

一切有关修改软件的建议,特别是涉及到对基准配置的修改建议,都必须按照严格的规程进行评审,获得批准以后才能实施修改,绝对不能谁想修改软件就修改。可以理解为,基准配置是“红线”

软件工程自学笔记_第31张图片

开发小组的成员最好是小而精

软件工程自学笔记_第32张图片

1.6 软件工程方法

软件工程:技术+管理

软件工程自学笔记_第33张图片

软件工程自学笔记_第34张图片

传统方法学:面向数据流,结构化的,例如数据流图

面向对象方法学

两种程序设计方法

软件工程自学笔记_第35张图片

对象本身就是对数据结构和算法的封装

非结构化程序设计:例如汇编语言中的goto语句,任意跳转,使得程序缺少明确、清晰的结构,没有采用结构化程序设计中常见的分支、循环等逻辑结构,逻辑比较混乱

面向对象程序设计的一个典型例子:神经网络模型的实现?这个当时做的时候比较明显,将节点当成对象确实比结构化的设计更方便理解,出错也少。

软件开发阶段:

软件工程自学笔记_第36张图片

传统软件工程各个部分之间,界限非常清楚,每个部分的任务、成果都很清楚。而面向对象软件工程没有清晰的界限,是一个渐进的、细化的、迭代的过程,得到的成果都基本上是同一类的内容,但是越来越深刻:首先明确哪些是对象(对象抽取),再进行对象详细设计,再对对象进行编程和测试。

1.7 软件生存周期

问题定义—》可行性分析-》需求分析-》设计-》编程-》测试-》运行-》维护

问题定义:

软件工程自学笔记_第37张图片

可行性分析:

行得通不单单是指技术上,也包括经济上、操作上是不是行得通

软件工程自学笔记_第38张图片

开发:需求分析,明确功能,得到性能,最终得到逻辑模型。

数据流程图和数据字典

软件工程自学笔记_第39张图片

DFD:数据流图

SRS:软件需求规格说明书,是需求分析的主要成果

整体设计:

把SRS转换为物理模型

软件工程自学笔记_第40张图片

SC图:系统结构图、系统图,反映系统内有哪些模块以及模块间的调用关系,体现了要开发的体系结构。

软件工程自学笔记_第41张图片

最上面是主控模块,第二层分别是输入处理、数据加工、输出处理模块,第三层是对这些任务的细分。输入模块处理完后给主控模块,然后主控给加工,加工处理完给主控,主控给输出。

详细设计:

详细设计每一个模块,确定模块所需要的算法和数据结构。

软件工程自学笔记_第42张图片

外包就是用详细设计完的说明书进行编程,产出就是编程结果,其实就是一种由自然语言到编程语言的翻译,不能掌握产品全局的设计和概念,技术含量比较低。

编码与单元测试:

软件工程自学笔记_第43张图片

模块级别的测试就叫单元测试。但是程序员的测试和测试员的测试是不一样的,测试员可能只测正常情况、正常输入,而测试员要测量各种情况下模块的响应。

测试要有严格的测试计划,要有测试用例的分析和设计,要有测试结果的报告

单元测试只能保证模块正确

综合测试:

软件工程自学笔记_第44张图片

集成测试就是将模块组装好了之后进行测试

验收测试:正确、没有bug的系统,不代表就是用户想要的系统,和用户约定的功能上也不能有偏差

现场测试:实地运行(强度测试,高并发;恢复测试,意外情况下恢复)

软件工程自学笔记_第45张图片

除了技术,维护对人员的语言能力、产品细节的熟悉程度都有很高的要求

1.8 软件开发模型-瀑布模型

软件开发模型

软件工程自学笔记_第46张图片

软件工程自学笔记_第47张图片

瀑布模型是串行顺序执行的,中间没有回头。是最原始的瀑布模型。

瀑布模型的特点:

软件工程自学笔记_第48张图片

软件工程自学笔记_第49张图片

瀑布模型首次提出了推迟实现的概念,尽可能推迟编程和测试的时间,分析设计之后才能写代码。

软件工程自学笔记_第50张图片

瀑布模型强调质量的保证和文档。每个阶段要处理每个阶段的文档。

瀑布模型是文档驱动的,而螺旋模型是风险驱动的。

1.9 软件开发模型-快速原型模型

软件工程自学笔记_第51张图片

开发原型后进行用户反馈,再根据用户反馈修改需求分析和原型,直到用户满意为止。原型是具有了初步系统框架、系统界面,可以操作、少数功能可以使用的软件。直接先交给用户使用,使用户有直观感受,可以很好地获取用户的反馈。用户反馈后,我们马上修改软件设计说明书。

适合于中小型软件和需求模糊的情况。

原型开发一定要快,不能花太大精力去开发

软件工程自学笔记_第52张图片

用户认可之后,如果原型比较合理,就可以在原型的基础上继续开发;如果原型开发过于仓促、结构不够合理,就可以直接抛弃

1.10-软件开发模型-增量模型

软件工程自学笔记_第53张图片

增量构件就是一个小而可用的软件。将模型分解为一个一个增量进行设计、交付给客户。增量之间要考虑如何良好集成。

软件工程自学笔记_第54张图片

每次交付都是一个可用的组件。

增量模型继承是难点:构建化

1.11-软件开发模型-螺旋模型

螺旋模型是风险驱动的,中心思想就是降低风险

软件工程自学笔记_第55张图片

螺旋模型的本质是一种快速原型模型

软件工程自学笔记_第56张图片

沿着线一圈一圈向外走,从内向外,每一个环节都对风险进行预测。

螺旋模型的特殊就是风险分析

软件工程自学笔记_第57张图片

1.12-软件开发模型-构件集成模型

是一种面向对象的模型,软件开发全部构件化,如果构件库有现成构件,就不要再造轮子了,没有的话再编程。实现了软件的高度可重用

软件工程自学笔记_第58张图片

构件应该是经过良好实现了的,具备健壮性且速度快,接口也要良好定义。

软件工程自学笔记_第59张图片

2.可行性研究及初步需求分析

2.1 可行性研究

重点:数据流图和数据字典

数据流图和数据字典就构成了需求分析的主要内容

可行性研究的目的不是解决问题,而是确定问题是否值得被解决

软件工程自学笔记_第60张图片

软件工程自学笔记_第61张图片

软件工程自学笔记_第62张图片

其实技术可行性一般不是问题,主要考虑其他方面

经济可行性:可能提出多套方案,成本不一样,供用户选择,我们当然可能也会推荐一套。分析的是成本,但落脚点是效益(可以适当宣传一下效益2333)

操作可行性:企业现有的硬件条件、网络条件等等能否达到要求

有时候经济效益不明显,但是有社会效益,可能也会做,例如政府部门的开发。

可行性研究的结果:

软件工程自学笔记_第63张图片

可行性研究的过程:

软件工程自学笔记_第64张图片

软件工程自学笔记_第65张图片

研究现有系统,获得文档资料

如果新系统相比正在运行的旧系统不能增加收入或者减少使用费用,那么从经济角度来看新系统就不如旧系统

软件工程自学笔记_第66张图片

软件工程自学笔记_第67张图片

软件工程自学笔记_第68张图片

软件工程自学笔记_第69张图片

软件工程自学笔记_第70张图片

成本/效益分析是重点

软件工程自学笔记_第71张图片

软件工程自学笔记_第72张图片

软件开发可行性研究报告样例:https://blog.csdn.net/yyp0304Devin/article/details/83315652

2.2 系统流程图

软件工程自学笔记_第73张图片

系统流程图不是对数据进行加工处理的控制过程(数据流图),而只是表示数据的流动情况。

软件工程自学笔记_第74张图片

一个例子:

软件工程自学笔记_第75张图片

软件工程自学笔记_第76张图片

软件工程自学笔记_第77张图片

2.3 数据流图(DFD)

软件工程自学笔记_第78张图片

对输入数据的加工、变换

顶级(0级)数据流图:

软件工程自学笔记_第79张图片

描述了目标系统和外部实体之间的数据联系

顶级数据流图将整个系统高度抽象为一个目标系统

数据源/数据终点

箭头:数据流

目标系统:加工、处理、变换

数据流图中的基本符号:

软件工程自学笔记_第80张图片

举例:

软件工程自学笔记_第81张图片

软件工程自学笔记_第82张图片

软件工程自学笔记_第83张图片

先构建顶级数据流图:

软件工程自学笔记_第84张图片

由概况到细致,先画顶级图有利于减小之后的分析难度

事务也是数据之一

软件工程自学笔记_第85张图片

软件工程自学笔记_第86张图片

在顶级图的基础上分解,是一级图

数据储存的D1\D2表示数据名称,同样的,我们对数据的处理也进行了命名

注意P1和D1之间是双向的数据流,P1到D1是修改库存量;D1到P1是查询库存量以便于生成订货信息

P-》D:数据的添加、修改和删除

D->P:数据的查询(D将查询的结果反馈給P)

对于1级DFD,我们还可以再细化:

软件工程自学笔记_第87张图片

二级DFD

软件工程自学笔记_第88张图片

传递的“事务”也可以理解为“指令”的意思

分层数据流图的示意图:

软件工程自学笔记_第89张图片

画数据图的基本步骤:

以输入输出的方式确定0级图

按流程分开各个加工部分,确定1级图

对1级图不断进行细化,确定之后的图

命名:

软件工程自学笔记_第90张图片

一般命名用名词和名词短语

软件工程自学笔记_第91张图片

软件工程自学笔记_第92张图片

对数据原点和终点的命名应该采用用户行业的术语

软件工程自学笔记_第93张图片

DFD+DD构成系统的完整逻辑模型

软件工程自学笔记_第94张图片

软件工程自学笔记_第95张图片

软件工程自学笔记_第96张图片

软件工程自学笔记_第97张图片

软件工程自学笔记_第98张图片

软件工程自学笔记_第99张图片

例如上图,我们可以将更新库存清单这一步也可以变成批处理而不是实时的,对于事务先保存下来,之后批量完成

软件工程自学笔记_第100张图片

当然也可以这么画,就是和之前说的比较接近了

系统的设计没有对错,只有哪个更好

面向数据流的设计:

软件工程自学笔记_第101张图片

DFD例2:

顶级DFD:

软件工程自学笔记_第102张图片

1级DFD:

软件工程自学笔记_第103张图片

例3:

软件工程自学笔记_第104张图片

如何分析并绘制DFD?

软件工程自学笔记_第105张图片

0级DFD:

软件工程自学笔记_第106张图片

1级图:

软件工程自学笔记_第107张图片

注意事项:

软件工程自学笔记_第108张图片

软件工程自学笔记_第109张图片

可以出现不属于上一层数据存储环节子项的新的数据存储环节

数据流必须经过加工

软件工程自学笔记_第110张图片

2.4 数据字典

数据字典的详细介绍:https://blog.csdn.net/u012881904/article/details/51469366

https://img-blog.csdn.net/20160521104950491

软件工程自学笔记_第111张图片

软件工程自学笔记_第112张图片

软件工程自学笔记_第113张图片

软件工程自学笔记_第114张图片

软件工程自学笔记_第115张图片

数据之前有助于消除开发人员和用户之间交流时出现的误解,做到有效交流

数据字典是开发数据库的第一步

软件工程自学笔记_第116张图片

软件工程自学笔记_第117张图片

2.5 成本估计

  1. 代码行估计

软件工程自学笔记_第118张图片

根据公司以往项目结果作为依据估算,公司每天平均产出的代码行是类似的。

  1. 任务分解技术

软件工程自学笔记_第119张图片

小任务的估计较为准确和简单

  1. 自动估计成本技术

软件工程自学笔记_第120张图片

ML可以!

软件工程自学笔记_第121张图片

估算软件生命周期为5年,由此计算效益

由此,我们需要计算未来收入的在现在的收益与成本,这就要考虑货币的时间价值:

软件工程自学笔记_第122张图片

软件工程自学笔记_第123张图片

计算纯收益要将未来的收入折合为现在的值

软件工程自学笔记_第124张图片

与年利率相比,起码要证明我们的工程收益率要高于直接把钱存银行2333

3. 软件需求分析

软件工程自学笔记_第125张图片

软件工程自学笔记_第126张图片

软件需求说明书也是软件方,而不是用户,完成的

软件工程自学笔记_第127张图片

数据模型:ER图,就是数据库的那个

功能模型:数据流图

行为模型:状态转换图,在面向对象部分讲解

软件工程自学笔记_第128张图片

自顶向下,逐层分解

软件工程自学笔记_第129张图片

绘图要用专业的绘图工具

例如在毕业设计中,如果要开发一个系统,就要对系统进行专业的需求分析,所以软件工程还是有意义的呀~

软件工程自学笔记_第130张图片

虚线里面的就是需求分析的内容

软件工程自学笔记_第131张图片

访谈的准备很重要,要尽量先收集掌握客户的业务信息,要提前准备问题,也可以准备调查表来获得用户的反馈和期望

实际观察用户的工作流程

软件工程自学笔记_第132张图片

分析员是用户和开发人员的桥梁

软件计划由用户和分析人员制定

软件需求说明书三方都要参加

原型是分析人员和软件开发小组完成

3.2分析建模

软件工程自学笔记_第133张图片

DFD、DD、PSPEC强调的是系统的功能

CFD、CSPEC、STD强调的是系统的行为

ER图是系统的数据模型

软件工程自学笔记_第134张图片

结构化分析模型的核心是数据字典

面向对象分析模型:

软件工程自学笔记_第135张图片

复习一下ER图吧:

软件工程自学笔记_第136张图片

软件工程自学笔记_第137张图片

软件工程自学笔记_第138张图片

E-R图的数量关系可以用不同的符号表示

软件工程自学笔记_第139张图片

例如:

软件工程自学笔记_第140张图片

  • 数据规范化

软件工程自学笔记_第141张图片

这里就是数据库设计的内容

软件工程自学笔记_第142张图片

范式级别提高导致数据的存储结构和问题域的结构之间不匹配,使得需求变化时,可能会涉及到多张表同时的修改,稳定性下降

加工说明:

软件工程自学笔记_第143张图片

软件工程自学笔记_第144张图片

实例:

软件工程自学笔记_第145张图片

CFD(控制流图):在数据流图的基础上添加了控制流

控制:物品经过、时钟、人工驱动

反馈了数据传输过程中受到控制的情况

软件工程自学笔记_第146张图片

状态转换图:

软件工程自学笔记_第147张图片

软件工程自学笔记_第148张图片

一张图只能有一个初态,终态可以有0到多个

软件工程自学笔记_第149张图片

终态比起始点多个圈

用例图:

软件工程自学笔记_第150张图片

例子:

软件工程自学笔记_第151张图片

角色是和系统进行交互、使用系统功能的人。

用例之间的关系:

软件工程自学笔记_第152张图片

扩展:在签保险单的用例上拓展一些其他的功能,从而实现其他的用例

使用:纯粹使用另外一个用例的功能

对象关系图:

软件工程自学笔记_第153张图片

对象-行为图

软件工程自学笔记_第154张图片

对象状态转换图描述的是一个对象,而顺序图和合作图描述的是多个对象

软件工程自学笔记_第155张图片

对象状态转换图描述的是一个对象的不同的状态

软件工程自学笔记_第156张图片

顺序图描述多个对象按照一定的时间顺序进行协调工作的关系

软件工程自学笔记_第157张图片

合作图不再按照时间顺序进行画图,而是只表示对象之间的合作关系

3.3 软件需求说明

软件工程自学笔记_第158张图片

样本:https://wenku.baidu.com/view/622dced0195f312b3169a532.html

软件工程自学笔记_第159张图片

需求说明中有版本记录表格

软件工程自学笔记_第160张图片

3.3.1 验证软件需求

软件工程自学笔记_第161张图片

3.4 面向数据流的软件分析与设计

3.4.1 面向数据流的软件分析

软件工程自学笔记_第162张图片

系统分析的目标:

软件工程自学笔记_第163张图片

软件工程自学笔记_第164张图片

这里的分析模型主要就是DFD

软件工程自学笔记_第165张图片

调用软件使用公司的员工在信息的交互上都有哪些联系

工作量会影响到软件的结构和并发性

软件工程自学笔记_第166张图片

软件工程自学笔记_第167张图片

用户参与、先逻辑、自顶向下、标准化

3.4.1.1 结构化问题

确定性很高,条件很充分

半结构化问题:条件不很充分

非结构化问题:条件基本上不具备,解决问题很困难

基本加工:

软件工程自学笔记_第168张图片

只要不进一步细分就是基本加工,不一定是最底一级的。

PSPEC:说明基本加工

软件工程自学笔记_第169张图片

结构化语言:其实就是伪代码

软件工程自学笔记_第170张图片

例如:

软件工程自学笔记_第171张图片

决策树:

软件工程自学笔记_第172张图片

决策表:

软件工程自学笔记_第173张图片

用双线划分了一个田字型结构

软件工程自学笔记_第174张图片

盒图(N-S图):

软件工程自学笔记_第175张图片

盒图可以表示一种嵌套关系。

3.4.2 面向数据流的软件设计

软件工程自学笔记_第176张图片

软件设计的意义:

软件工程自学笔记_第177张图片

从不同的角度看软件设计:

软件工程自学笔记_第178张图片

数据设计主要是数据库的设计,软件工程主要考虑系统结构设计和过程设计

软件设计的任务:

软件工程自学笔记_第179张图片

接口设计可以包括在体系结构设计中

软件工程自学笔记_第180张图片

这四部分和我们的软件工程技术的对应:

软件工程自学笔记_第181张图片

软件设计的基本概念:

软件工程自学笔记_第182张图片

软件工程自学笔记_第183张图片

3.4.3 体系结构设计

软件工程自学笔记_第184张图片

数据流图有两类:变换型和事务型图。

系统结构图

SC图中,永远是上层模块调用下层模块

SC图中的模块调用:

软件工程自学笔记_第185张图片

软件工程自学笔记_第186张图片

数据信息:模块间传递的参数

控制信息:一个模块传递一个可以控制另一个模块流程的信息软件工程自学笔记_第187张图片

传入模块:将信息A由下级传入

传出模块:将上级输出的信息D向下传递

变换模块:将传入的B数据处理为C数据,见下图,也是核心模块

协调模块:主要用来做主控模块,起到一个协调和控制整个程序的作用

软件工程自学笔记_第188张图片

软件工程自学笔记_第189张图片

软件工程自学笔记_第190张图片

软件工程自学笔记_第191张图片

将变换DFD化为SC图

软件工程自学笔记_第192张图片

例如:

  1. 划分DFD

软件工程自学笔记_第193张图片

软件工程自学笔记_第194张图片

注意看上面数据的流动,主控模块,也就是上面我们讲的四种基本模块中的协调模块,本身不处理信息,而只是进行信息的传递,从输入给变换,从变换给输出。

再向下细分:

软件工程自学笔记_第195张图片

注意上面DtoE的输出错了,应该是e

最原始的输入是由readA和readD产生的,他们说输入模块,AtoB这类是处理模块,getB这类的是协调模块。Ma是输入模块

软件工程自学笔记_第196张图片

writeV是输出模块,Me也是输出模块,虽然它并不是像writeV一样直接进行输出的

软件工程自学笔记_第197张图片

最终:

软件工程自学笔记_第198张图片

相比DFD,SC图离编程更近了,用SC图可以直接编程、组装了

事务分析后的SC图:

软件工程自学笔记_第199张图片

类型标志:分析事务类型模块对事务的类型进行分析并用类型标志来描述,事务调度处理模块收到类型标志后选择正确的处理分支

体系结构优化设计的指导规则

软件工程自学笔记_第200张图片

简化接口

高性能要求时的工作

软件工程自学笔记_第201张图片

孤立出需要大量占用CPU的模块

3.5 模块化设计

软件工程自学笔记_第202张图片

所以说分治是有意义的

但是,模块分解的越多,接口越复杂,接口越多

所以,最后是模块成本和接口成本的协调

模块的深度和宽度

软件工程自学笔记_第203张图片

瓮形是最佳的SC结构,上面不断分解,下面实现了软件的重用

软件工程自学笔记_第204张图片

这种煎饼形的结构不可取,顶层的扇出太高,应该深度加大,变成多层的塔型结构

专业名称,模块的扇入和扇出

软件工程自学笔记_第205张图片

模块的作用范围和控制范围:

软件工程自学笔记_第206张图片

作用范围可能比控制范围大:如果修改了全局变量,影响会很广

优化原则:一个模块的作用范围应该在它的控制范围之内。如果有不属于控制范围的模块,就将它划分到这个模块的下属模块中

模块独立性

软件工程自学笔记_第207张图片

3.5.1 内聚

模块内部越紧密越好,功能越单元越好

软件工程自学笔记_第208张图片

  1. 偶然性内聚

软件工程自学笔记_第209张图片

这种模块的独立性和聚合性都最差

  1. 逻辑性内聚

软件工程自学笔记_第210张图片

逻辑上比较像,但是功能上不一致

  1. 时间性内聚

软件工程自学笔记_第211张图片

他们功能不一样,只是时间要求一致

  1. 过程性内聚

软件工程自学笔记_第212张图片

这种就是比较好的内聚了

  1. 通信性内聚

软件工程自学笔记_第213张图片

  1. 顺序性内聚

软件工程自学笔记_第214张图片

这种就是很好的内聚了,相关性非常好,各个处理成分都和同一个功能相关

  1. 功能性内聚

软件工程自学笔记_第215张图片

这种就是我们追求的模块,功能单一

总结一下:

软件工程自学笔记_第216张图片

模块要做到自完备,要在内部进行参数检查,不要依赖上一级去做,这样的模块通用性是不强的

块内聚合形式的判定:

软件工程自学笔记_第217张图片

3.5.2 耦合

软件工程自学笔记_第218张图片

模块间耦合强、关系紧密不是好事,这说明了模块独立性很差,不利于重用

  1. 非直接耦合

软件工程自学笔记_第219张图片

  1. 数据耦合

1571058572308

信息仅限于数据

  1. 特征耦合

软件工程自学笔记_第220张图片

输入的不是简单参数,而是复杂的数据结构。输入的数据结构发生变换,会导致内部逻辑变化。传入的数据结构超过了该模块的需要,这种应该加一层,获取真正需要的数据之后再传入该模块。

  1. 控制耦合

软件工程自学笔记_第221张图片

这种就联系比较紧密了,模块内完成的任务也不单一。

控制耦合从原理上是可以避免的:将模块拆分

  1. 外部耦合

软件工程自学笔记_第222张图片

  1. 公共耦合

软件工程自学笔记_第223张图片

使用全局资源进行相互作用,情况很复杂,耦合较差。所以要尽量少用全局变量,就地声明、就地使用、就地释放。

  1. 内容耦合

软件工程自学笔记_第224张图片

内容耦合从高级计算机语言就已经杜绝了(例如杜绝goto)

基于块间耦合的设计原则:

软件工程自学笔记_第225张图片

3.6 过程设计

软件工程自学笔记_第226张图片

过程设计的原则:

软件工程自学笔记_第227张图片

过程设计的工具

软件工程自学笔记_第228张图片

  1. 程序流程图

软件工程自学笔记_第229张图片

  1. N-S图(盒图)

软件工程自学笔记_第230张图片

局部变量的声明周期可以很清楚的表现出来

盒图举例:

软件工程自学笔记_第231张图片

3.6.2 设计复审

软件工程自学笔记_第232张图片

软件工程自学笔记_第233张图片

3.7 面向对象软件设计

3.7.1 面向对象软件的开发过程

软件工程自学笔记_第234张图片

论域分析:

软件工程自学笔记_第235张图片

从更高的视角看问题,提升软件的重用性和通用性

应用分析:

软件工程自学笔记_第236张图片

三层结构:

界面类、业务类、公用类

在UML中用三个包图实现

软件工程自学笔记_第237张图片

公用类是最底层,它们的通用性比较强

软件工程自学笔记_第238张图片

设计好了后,编程实现,然后进行测试

软件工程自学笔记_第239张图片

尽可能局部化修改,不要对接口等有大的修改。

3.7.2 面向对象分析(OOA)

OOA、OOD、OOP的理解:https://lovojava.github.io/2017/06/19/20170619/

软件工程自学笔记_第240张图片

软件工程自学笔记_第241张图片

OOA的目的是定义所有与待解决问题相关的类,核心工作就是提取出类

经典OOA方法:

软件工程自学笔记_第242张图片

主要学UML

3.7.3 UML

UML不仅是面向对象软件开发的标准,也是信息系统分析与设计的标准,

建模是为了捕捉、描述系统的核心

可视化建模就是用标准的图示化方法来进行建模工作

UML的目标:

软件工程自学笔记_第243张图片

软件工程自学笔记_第244张图片

软件工程自学笔记_第245张图片

3.7.3.1 UML开发过程

软件工程自学笔记_第246张图片

3.7.3.2UML基本图示

软件工程自学笔记_第247张图片

3.7.3.3UML的规划分析操作过程

软件工程自学笔记_第248张图片

3.7.3.4类图

软件工程自学笔记_第249张图片

软件工程自学笔记_第250张图片

例如:

软件工程自学笔记_第251张图片

类图的类型

软件工程自学笔记_第252张图片

聚合关系下,整体类不存在,部分类依然存在;但是如果是构成,则部分随着整体一起消失

软件工程自学笔记_第253张图片

3.7.3.5实例图(用例图)

软件工程自学笔记_第254张图片

软件工程自学笔记_第255张图片

软件工程自学笔记_第256张图片

3.7.3.6对象图

软件工程自学笔记_第257张图片

对象图可以是对类图的补充和说明

对象之间的关系:

软件工程自学笔记_第258张图片

UML动态建模

软件工程自学笔记_第259张图片

3.7.3.7顺序图(时序图)

软件工程自学笔记_第260张图片

软件工程自学笔记_第261张图片

顺序图的特殊情况:循环、条件分支、并行、结束

软件工程自学笔记_第262张图片

3.7.3.8协作图

软件工程自学笔记_第263张图片

软件工程自学笔记_第264张图片

协作图最适合体现类之间的关系

顺序图可以自动生成协作图

3.7.3.9状态图

描述系统的动态行为

软件工程自学笔记_第265张图片

3.7.3.10包图

主要体现结构的划分

软件工程自学笔记_第266张图片

3.7.3.11活动图

软件工程自学笔记_第267张图片

软件工程自学笔记_第268张图片

3.7.3.12构件图(部件图)

软件工程自学笔记_第269张图片

3.7.3.13配置图(部署图)

软件工程自学笔记_第270张图片

3.7.4 面向对象设计(OOD)

软件工程自学笔记_第271张图片

OOA和OOD之间没有明显的界限,只是OOA分析的比较粗,OOD分析的比较细

经典的OOD方法

软件工程自学笔记_第272张图片

OOD的工作:

软件工程自学笔记_第273张图片

详细来说:

软件工程自学笔记_第274张图片

面向对象软件开发步骤:按UML标准,用可视化建模工具进行系统分析、设计和迭代开发

3.7.5RUP-UML统一建模过程

软件工程自学笔记_第275张图片

生命周期迭代法的三个重要特征

软件工程自学笔记_第276张图片

迭代可以提振团队的信心

迭代次数的选择

软件工程自学笔记_第277张图片

软件工程自学笔记_第278张图片

第一次迭代一般是最难的,要高度重视,第一次迭代一定要成功

团队在迭代开始前往往对困难预计不足

不要对第一次迭代提出过高的要求

4.软件编程的规范和标准

  1. 编程的质量

软件工程自学笔记_第279张图片

  1. 选择编程语言的标准

软件工程自学笔记_第280张图片

  1. 编程风格

软件工程自学笔记_第281张图片

软件工程自学笔记_第282张图片

在注释段与程序段、以及不同程序段之间插入空行

书写表达式时,适当使用空格或者圆括号等做隔离符号

5.软件测试

5.1 测试的基本概念

软件工程自学笔记_第283张图片

广义上,测试的对象不仅是编程,还有需求分析、设计说明

软件工程自学笔记_第284张图片

测试的特效:

软件工程自学笔记_第285张图片

测试要抱着为了证明程序有错的目的去测试

测试的种类:

软件工程自学笔记_第286张图片

测试文档:

软件工程自学笔记_第287张图片

测试的原则:

软件工程自学笔记_第288张图片

测试要尽早、不断

要避免只有程序员自己检查自己的程序

编写测试用例的时候一定要有不合理的测试

充分注意测试中的错误群集情况:规律上来说,80%的错误集中在20%的代码之中。某一部分代码如果检测出来Bug非常多,那么它的bug依然非常多的可能性是很大的,应该对这部分代码加强测试

软件工程自学笔记_第289张图片

测试信息流:

软件工程自学笔记_第290张图片

要对软件的可靠性进行统计分析

5.2 白盒测试

1571067773081

测试人员知道内部逻辑结构

白盒测试方法:

  1. 逻辑覆盖法

软件工程自学笔记_第291张图片

条件覆盖:一个判断里面可以有多个条件通过逻辑组合,条件覆盖要求对每一个条件都对真、假情况各执行一次。但是在这种情况下,判断整体的结果不一定true和false都取过了,所以这就是判定/条件覆盖所要求的

条件组合覆盖:比判定/条件覆盖要求更高,要求判定中所有的条件可能值的所有可能组合都执行一次

  1. 基本路径法

软件工程自学笔记_第292张图片

环路复杂性就是基本路径的条数

有多少条基本路径就要做多少个测试用例

计算环路复杂性:

软件工程自学笔记_第293张图片

举例:

软件工程自学笔记_第294张图片

流图的基本符号:

软件工程自学笔记_第295张图片

注意:

2,3可以合并,不影响环路复杂度的计算

特别注意,像9、10、11这种点,在程序流程图中都不画的,但是流图中必须作为节点处理

再举例:

软件工程自学笔记_第296张图片

5.3 黑盒测试

软件工程自学笔记_第297张图片

只根据需求的文字说明设计测试用例

  1. 等价分类法

软件工程自学笔记_第298张图片

合法取值叫有效等价类,非法取值叫无法等价类

例如:

软件工程自学笔记_第299张图片

软件工程自学笔记_第300张图片

  1. 边界值分析法

1571069013824

它是等价分类法的有效补充

强迫程序在边界值及其附近运行

5.4 多模块程序的测试策略

上面都只是针对一个模块进行的测试,对于多模块

多模块测试的四个阶段:

软件工程自学笔记_第301张图片

软件测试流程

软件工程自学笔记_第302张图片

确认测试:与需求进行对比,看看功能是否齐全

测试与开发的关系:

软件工程自学笔记_第303张图片

单元测试发现的问题主要来源于编程和详细设计阶段

集成测试主要发现详细设计和概要设计的错误

5.4.1 单元测试

软件工程自学笔记_第304张图片

单元测试的实施

软件工程自学笔记_第305张图片

软件工程自学笔记_第306张图片

编写驱动模块来取代结构中待测试模块的上层模块来测试待测试模块,其工作就是传递待测试模块需要的参数以及接收待测试模块返回的参数,驱动模块越精简越好

桩模块:

和驱动模块类似,但是是待测试模块的下层模块

软件工程自学笔记_第307张图片

一般地,模块的测试可能既需要桩模块,也需要驱动模块

软件工程自学笔记_第308张图片

被测试模块的输出结果和驱动模块的预期结果比较,就得到了测试结果

5.4.2 综合测试(集成测试)

软件工程自学笔记_第309张图片

综合测试策略:

渐增式和非渐增式:将模块一个一个加进来,每加进来一次就测试一次,是渐增式;都加进来一起测试是非渐增式。渐增式比非渐增式要好

软件工程自学笔记_第310张图片

自顶向下可以较早发现软件高层体系结构的错误,而自底向上可以使得底层模块的测试非常充分。所以,往往采用混合的方式进行测试,在中间会合。

宽度优先和深度优先:

宽度优先先测试同一层的模块,深度优先先测试一支

软件工程自学笔记_第311张图片

宽度优先

软件工程自学笔记_第312张图片

深度优先

5.4.3 确认测试

软件工程自学笔记_第313张图片

beta测试:对用户分布的测试版本

alpha测试:软件工程内部的测试

确认测试的步骤:

软件工程自学笔记_第314张图片

5.4.4 系统测试

软件工程自学笔记_第315张图片

它包括:

软件工程自学笔记_第316张图片

恢复测试:系统宕机之后多长时间可以恢复

5.4.5 终止测试的标准

软件工程自学笔记_第317张图片

第二种硬性要求错误数量的方式对团队的水平和软件的规模要比较熟悉,这样才能比较准确的估计

第三种方法是比较科学的

软件工程自学笔记_第318张图片

5.4.6 调试

软件工程自学笔记_第319张图片

测试是发现错误,调试是定位和纠正错误

调试是程序员的工作

5.4.7 面向对象测试

软件工程自学笔记_第320张图片

类本身就是一个大模块,以类为单位进行测试

6.软件开发过程和项目管理

软件工程自学笔记_第321张图片

Murphy定律

软件工程自学笔记_第322张图片

从一开始就要对软件开发的复杂性要有清楚的认识

软件计划:

软件工程自学笔记_第323张图片

这些从软件开发的一开始就要开始指定了,例如软件测试计划基本上要在需求分析的时候就开始

软件项目度量:

软件工程自学笔记_第324张图片

面向功能的度量:

软件工程自学笔记_第325张图片

软件项目估算:

软件工程自学笔记_第326张图片

软件工程自学笔记_第327张图片

尽量拖后估算23333

人工预期:

软件工程自学笔记_第328张图片

不同层次员工参与情况:

软件工程自学笔记_第329张图片

人员越多越好吗?

软件工程自学笔记_第330张图片

不宜人数过多:

软件工程自学笔记_第331张图片

人员的几种结构:

软件工程自学笔记_第332张图片

软件工程自学笔记_第333张图片

项目延迟的原因:

软件工程自学笔记_第334张图片

软件工程自学笔记_第335张图片

软件可靠性:

软件工程自学笔记_第336张图片

软件工程自学笔记_第337张图片

CMM认证:

软件工程自学笔记_第338张图片

软件工程自学笔记_第339张图片

你可能感兴趣的:(软件工程自学笔记)