阅读声明:本文借鉴软件工程书籍以及各大佬的博客,用于考试复习
一些其他概念
1.一些语言类型
(1)XML:一种用于标记电子文件,使其具有结构型的标记语言
(2)Java、C++、Smalltalk:面向对象的程序设计语言
(3)Python:面向对象的解释型程序设计语言
(4)Prolog:以特殊的逻辑推理形式回答用户的查询,经常用于数据库和专家系统
(5)PHP:服务器端脚本语言,制作动态网页
(6)Fortran:用于数值计算的通用编译命令式编程语言
2.项目范围说明书
(1)项目范围定义的输入:
项目章程、项目范围管理计划、组织过程资产、批准的变更申请
3.编写文档
(1)原因:软件开发涉及编程以外的多方面工作;任何事都放在脑子里,记不住、理不清、说不明
(2)目的:阐述清楚、发现问题、开展交流、促进管理
4.GitHub:全球最有影响力的开源软件托管平台
5.结构化程序的3种基本结构:顺序、选择和循环结构。这三种结构的组合可以完成任何复杂的任务
6.GB 国家标准;DB 地方标准;/T 推荐性
7.编译程序的工作过程:词法分析->语法分析->语义分析->中间代码生成->代码优化->代码生成
8.错误类型:
(1)动态错误:也称动态语义错误,指源程序运行中的逻辑错误,如死循环、变量取值为零等
(2)静态错误:分为语法错误和静态语义错误
-语法错误是有关语言结构上的错误,如表达式中缺少操作数、括号不匹配等
-静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是实型变量名,而另一个是数组名等
9.光纤:波分复用WDM
10.软件的复杂性是固有的,这是由于软件的抽象性、不可见性决定的
11.描绘软件结构的图形工具有:层次图、HIPO图、结构图
12.布鲁克斯定律:在许多情况下,向滞后的项目中增加人手反而会使项目进度更加滞后
一 软件工程基本概念
1.软件
(1)定义:程序、数据及相关文档的完整集合
(2)分类(应用领域角度)
-系统软件:与计算机硬件紧密相关的软件
-应用软件:特定领域开发的服务于特定行业的软件,建立在系统软件之上
-支撑软件:辅助软件开发和运维
(3)特点:逻辑性、复杂性、设计开发、易变性、缺陷的隐蔽性
(4)软件≠程序
开发软件≠编写程序
(5)软件的规模和复杂性意味着要采用行之有效的方法---工程方法
(6)闭源软件:软件代码不对用户开放的一类软件,购买软件时只提供可运行软件或服务,没有提供源代码
开源软件:一种源代码可以自由获取和传播的计算机软件,其拥有者通过开源许可证赋予被许可人对软件进行使用、修改和传播
(7)软件质量:正确性(Correctness)、可靠性(Reliability)、健壮性(Robustness)、有效性(Efficiency)、安全性、可维护性(Maintainability)、可移植性(Portability)、可重用性(Reusability)、可理解性(Comprehensibility)、可信性(Dependability)、持续性(Sustainability)、可用性(Usability)、互操作性(Interoperability)
2.软件工程是指导计算机软件开发和维护的一门工程学科,是将系统的、规范的、可量化的方法应用于软件的开发、运行和维护的过程---属于方法论
(1)主要目的:提高软件的可维护性,减少软件维护所需要的工作量,降低软件系统的总成本
(2)产生的基本原因:软件危机
软件危机:进度经常延迟、质量无法保证、成本超出运算、软件维护困难、失败风险很大
(3)提出时间:1968年 地点:德国
(4)软件工程发展的技术特点:
1)软件抽象的层次越来越高
2)软件重用的粒度越来越大
3)软件开发理念的不断变化
-以文档为中心代替了以代码为中心
-从个体、团队到群体的开发组织
-从还原论到演化论
(5)IBM 360 OS:超大型软件项目---支持多道程序
Rational Rose---IBM出产
(6)软件工程知识体系IEEE SWEBOK 3.0
3.软件开发的需要解决的问题
(1)开发过程
(2)开发方法
(3)开发管理
(4)质量保证
4.软件工程方法学的三个要素:方法、工具和过程
(1)分类
1)传统方法学(生命周期方法学/结构化范型/面向过程方法学)---C语言;
-面向数据流进行数据分析的方法,一般将信息流分为变换流和事务流
2)面向对象方法学---Java;
3)基于构件的方法学
(2)方法
1)敏捷开发方法:重视人和交互、重视可运行软件系统、重视客户合作、重视相应用户需求变化
-特点:少些软件文档,以代码为中心,快速响应变化
2)群体化开发方法
3)DevOps 方法
5.软件工程项目质量管理
(1)质量计划:确定合适的质量标准,如何实施其质量方针
(2)质量保证:包括质量管理方法、采用的工程技术、测试技术和复审技术、对文档及其修改的控制、项目的标准及规格等
(3)质量控制:监控项目成果是否符合有关的标准,找出方法来解决质量问题
6.软件生命周期:软件从提出开发到最终灭亡所经历的时期
(1)组成:软件定义、软件开发和运行维护(软件维护)
7.环形复杂度---计算方法
(1)流图中线性无关的区域数等于环形复杂度
(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数
(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点(包含条件的结点)的数目
8.计算机软件辅助工程(CASE):在软件工程活动中,开发人员按照软件工程的方法和原则,借助于计算机及其软件的帮助来开发、维护和管理软件产品的过程
二 软件开发过程管理
1.软件开发的特点
(1)基于智力的协作过程
(2)软件项目内在复杂性
(3)循序渐进的开发过程
2.软件过程模型:定义了软件开发的具体活动以及活动间的逻辑关系
(1)瀑布模型:给出了软件生存周期各阶段的固定顺序,上一阶段完成才能进入下一阶段---应用最广泛
-特点:与软件生命周期相互一致、每个活动结束后需要评审、相邻活动间存在因果关系
-优点:简单,一目了然,易理解、掌握、应用和管理
-缺点:需求确定,过于理想化;缺乏变通,难应对变化
(2)快速原型模型:快速建立起来的可以在计算机上运行的程序,适合原型难导出、不易确定且持续变动的软件
(3)增量模型(渐增/演化模型):在快速开发一个原型的基础上,逐步演化成最终的软件
(4)喷泉模型(迭代模型):主要用来描述面向对象的开发过程,具有迭代和无间隙特征
(5)螺旋模型:集成迭代模型和原型模型,综合了瀑布模型和演化模型的优点,并增加了风险分析
上述均为传统软件过程模型---以文档为中心的重型软件开发方法
3.软件过程:人们用于开发和维护软件及其相关产品的一系列活动,包括软件工程活动和软件管理活动,按性质分为三类:
(1)基本过程类(软件生产直接相关过程)
(2)支持过程类(有关各方按其目标所从事的一系列的支持活动)
(3)组织过程类(指那些与软件生产组织有关的过程)
4.统一过程(UP):
(1)产生和理解
软件过程工程(SEP),又称为软件开发过程,定义了开发软件的who,what,when,how。SEP是一个把用户需求转换成软件的过程。
统一软件开发过程( USDP)是一个源于UML作者的SEP。通常指统一过程(UP)。
(2)三个基本特征:用例和风险驱动、以架构为中心、受控的迭代式的增量开发
(3)四个阶段:起始阶段、精化阶段、构建阶段、移交阶段
三 需求分析(软件定义阶段)-需求工程
1.可行性研究
(1)目的:确定问题是否值得去解决
(2)分类:技术可行性、经济可行性、操作可行性、设备可行性、进度可行性、商业可行性、社会可行性
(3)过程:复查系统规模和目标、研究目前正在使用的系统、导出新系统的高层逻辑模型、进一步定义问题、导出和评价供选择的解法、推荐行动指针、草拟开发计划、书写文档提交审查
(4)系统流程图:描绘物理系统的工具,用图形符号以黑盒子的形式描绘组成系统的各个部件,表达数据在系统各部件之间的流动的情况。
(5)数据流图:系统逻辑功能的图形表示,描绘信息流和数据从输入移动到输出的过程中经受的变换,设计它只需考虑基本逻辑功能,不需考虑如何实现功能。
-顶层数据流图只有一个加工
2.需求分析的任务
(1)确定对系统的综合要求
(2)分析系统的数据要求
(3)导出系统的逻辑模型
(4)修正系统开发计划
3.软件需求的类别
(1)软件功能性需求
(2)软件质量方面的需求
(3)软件开发约束性要求,包括开发进度要求(一般3-6月)、成本要求、技术选型等
4.状态转换图:通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。
5.自然描述语言的不足:不具体、不准确、有二义、不直观
软件原型描述的优点:直观、可展示、可操作;
缺点:无法描述需求的具体细节
四 系统设计
-总体设计(概要设计/初步设计):包含数据设计、体系结构设计、接口设计、过程设计
1.任务:将需求分析转化为软件的系统结构和数据结构,并采用结构图来描述
2.内容:分解独立的软件部件;建立模块之间的层次结构、调用关系、模块间的接口、人机交互界面
3.结构图
(1)基本成分:模块、调用和数据
4.软件设计的基本原理
(1)模块化
(2)抽象
(3)逐步求精
(4)信息隐藏和局部化
(5)模块独立性:每个模块只完成系统要求的独立子功能,在数据和信息交互与其他模块没有或者极少关联
1)模块独立是模块化、抽象、信息隐藏和局部化概念的直接结果;
2)目标:高内聚低耦合
3)内聚:标志一个模块内各个元素彼此结合的紧密程度
-低内聚
偶然内聚(巧合内聚):完成一组没有关系或松散关系的任务
逻辑内聚:在逻辑上属于相同或相似的一类
时间内聚:模块包含的任务必须在同一段时间内执行
-中内聚
过程内聚:模块内的处理元素是相关的,而且必须以特定次序执行
通信内聚:模块内的所有处理元素都在一个数据结构上操作,或模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据
-高内聚
顺序内聚:模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行
功能内聚:模块内所有处理元素属于一个整体,完成一个单一的功能
注:过程内聚与顺序内聚的区别是,顺序内聚中是数据流从一个处理单元流到另一个处理单元,而过程内聚是控制流从一个动作流向另一个动作。
4)耦合:对一个软件结构内不同模块之间互连程度的度量
5.启发规则
-详细设计---设计每个模块的实现细节和局部数据结构,即建立软件模块
基本任务:确定每个模块的算法设计
6.软件设计模式
(1)基本要素:名称、问题、方案、效果
(2)分类
-根据目的划分
1)创建型模式:用于描述“怎样创建对象”
2)结构型模式:用于描述如何将类或对象按某种布局组成更大的结构
3)行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责
-根据作用范围划分
1)类模式:用于处理类与子类之间的关系,通过继承来建立,是静态的
2)对象模式:用于处理对象之间的关系,通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性
-根据功能划分
1)外观(Facade)设计模式:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行交互
2)生成器/建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要创建它们,最后构建成该复杂对象
3)观察者(Observer)模式
4)访问者(Visitor)模式
5)备忘录(Memento)模式
6)策略(Strategy)模式:定义了一系列算法,并将每一个算法封装起来,并且使它们可以相互替换
7)命令(Command)模式
8)状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力,将每一个条件分支放入一个独立的类内
9)装饰器(Decorator)模式:用于动态地给一个对象添加一些额外的职责或行为
10)适配器(Adapter)模式:用于将一个接口转换为用户希望的另一个接口
7.用户界面设计原则:简易性、用户的语言、记忆负担最小化、一致性、利用用户的熟悉程度、从用户的观点考虑、排列分组、安全性、人性化
五 系统开发
1.面向对象的基本概念
(1)对象:对象是类的实例,对象通常可由对象名(标识)、属性和操作(方法)三部分构成
(2)类:对具有相同属性和行为的一个或多个对象的描述,展现了一组对象、接口、协作及其之间的关系,可以分为三种类型
1)实体类:存储和管理系统内部的信息
2)边界类:用于描述外部参与者与系统之间的互动
3)控制类:用于描述一个用例所具有的事件流控制行为
(3)继承:父类和子类之间共享数据和方法的机制
(4)消息
注:如果仅使用对象和消息,则可称之为基于对象的方法,若进一步把所有对象都划分为类,则称之为基于类的方法;
只有同时使用对象、类、继承和消息的方法,才是真正面向对象的方法
2.面向对象的主要特征
(1)继承性
(2)多态性:不同的对象收到同一消息可以进行不同的响应,产生完全不同的结果
1)参数多态:采用参数化模版,通过给出不同的类型参数,使得一个结构有多种类型
2)包含多态:同样的操作可用于一个类型及其子类型
3)过载多态:同一个名字在不同的上下文中所代表的含义
4)强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换
(3)封装性:信息隐蔽
3.面向对象的方法:Booch方法、Coad方法和OMT方法等
4.面向对象编程
(1)静态绑定:在程序编译过程中,把函数(方法或者过程)调用与响应调用所需的代码结合的过程
(2)动态绑定:在执行期间判断所引用对象的实际类型,根据其实际的类型调用相应的方法
5.统一建模语言(UML,Unified Modeling Language),提供了多种类型的模型描述图
-调用消息:用带实心箭头的实线表示
-返回消息:用带箭头的虚线表示
(1)3种基本构造块:事物、关系(依赖、关联、泛化和实现)和图
-UML中有4种事物:结构事物、行为事物、分组事物和注释事物
(2)组合结构图:描述结构化类(例如构件或类)的内部结构
(3)包图:描述由模型本身分解而成的组织单元,以及它们之间的依赖关系,即目录
(4)部署图:描述对运行时的处理节点及在其中生存的构件的配置
(5)构件图:描述一个封装的类和它的接口、端口
(6)用例图:由行为者、用例以及它们之间的关系构成的用于描述系统功能的动态视图
1)系统
2)用例:可以被行为者感受到的、系统的一个完整的功能。用例之间的关系主要有三种
-包含关系:用例可以简单地包含其他用例具有的行为
-扩展关系:在一定条件下,把新的行为加入到已有的用例中,获得的新用例就叫扩展用例,原有的用例叫做基础用例,从扩展用例到基础用例的关系就是扩展
-泛化关系:两个或者多个用例在行为、结构和目的方面存在共性
3)行为者(执行者)
6.对象模型:表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构---最基本、最重要、最核心的
(1)类图:描述类与类之间的静态关系。通常使用UML提供的类图来建立对象模型
(2)活动图:着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程
7.动态模型
8功能模型
9.软件中间件:一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信
作用:为处于自己上层的应用软件提供运行和开发的环境,帮助用户开发和集成应用软件。它不仅仅要实现互连,还要实现应用之间的互操作
10.一些其他概念
(1)重载:一个名称多个含义,即同一个方法名称,带有不同的参数个数和类型
六 软件测试
1.编码:把软件设计结果翻译成用某种程序设计语言书写的程序
2.软件测试基础
(1)规则(目标/定义)
1)测试是为了发现程序中的错误而执行程序的过程
2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
3)成功的测试是发现了至今为止尚未发现的错误的测试
(2)测试方法
1)黑盒测试法(功能测试):只检查程序功能是否能按照规格说明书的规定正常使用
2)白盒测试法(结构测试):按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作
(3)测试步骤
1)模块测试(单元测试):把每个模块作为一个单独的实体来测试,发现的往往是编码和详细设计的错误
2)子系统测试:把经过单元测试的模块放在一起形成一个子系统来测试,着重测试模块的接口
3)系统测试:把经过测试的子系统装配成一个完整的系统来测试,发现的往往是软件设计中的错误,也可能发现需求说明中的错误
子系统测试和系统测试,都兼有检测和组装两种含义,通常称为集成测试
4)验收测试(确认测试):把软件系统作为单一的实体进行测试,在这个测试步骤中发现的往往是系统需求说明书中的错误
5)平行运行:同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果
(4)测试阶段的信息流---输入信息
1)软件配置,包括需求说明书、设计说明书和源程序清单等
2)测试配置,包括测试计划和测试方案
3.单元测试---白盒测试技术
(1)测试重点:模块接口、局部数据结构、重要的执行通路、出错处理通路、边界条件
4.集成测试
(1)自顶向下集成:人们广泛采用的测试和组装软件的途径。从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。再把附属于(及最终附属于)主控制模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先的策略。
(2)自底向上集成:从“原子”模块(即在软件结构最低层的模块)开始组装和测试。因为是从底部向上结合模块,总能得到所需的下层模块处理功能,所以不需要存根程序。
(3)不同集成测试策略的比较
自顶向下集成(优点)不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误。(缺点)但需要存根程序,可能遇到与此相联系的测试困难,低层关键模块中的错误发现较晚,而且用这种方法在早期不能充分展开人力。
注:自底向上与上述相反
(4)回归测试
1)原因:在集成测试过程中每当一个新模块结合进来时,程序就发生了变化,建立了新的数据流路径,可能出现了新的I/O操作,激活了新的控制逻辑。这些变化有可能使原来工作正常的功能出现问题。
2)实现:重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来非预期的副作用
5.确认测试(验收测试)
6.白盒测试技术
(1)白盒测试是一种穷举测试,但是即使对所有路径进行了测试,错误仍然可能出现
原因:不能查出违反设计规范的错误、无法发现遗漏路径出现的错误、不能发现与数据相关的错误
(2)逻辑覆盖法
1)语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次
2)判定覆盖(分支覆盖):不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次
3)条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果
4)判定/条件覆盖:选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能得值,而且每个判定表达式也都取到各种可能的结果
5)条件组合覆盖:每个判定表达式中条件的各种可能组合都至少出现一次
6)点覆盖:如果连通图G的子图是连通的,而且包含G的所有节点,则称
是G的点覆盖
7)边覆盖:如果连通图G的子图是连通的,而且包含G的所有边,则称
是G的边覆盖
8)路径覆盖:选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)
(3)控制结构测试技术
1)基本路径测试
2)条件测试
3)循环测试
7.黑盒测试技术
(1)等价划分:把程序的输入域划分成若干个数据类,据此导出测试用例。一个理想的测试用例能独自发现一类错误
(2)边界值分析
(3)错误推测
(4)因果图
8.软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率
-可靠性的四个子特征:成熟性、容错性、易恢复和兼容性
软件的可用性:程序在给定的时间点,按照规格说明书的规定成功地运行的概率
七 系统维护
1.软件维护的特点
(1)结构化维护与非结构化维护差别巨大
(2)维护的代价高昂
(3)维护的问题很多
2.软件维护的类型
(1)更正性维护
(2)适应性维护
(3)完善性维护
(4)预防性维护
3.软件的可维护性(修改、更新、拓展)
(1)决定软件可维护性的因素
可理解性、可测试性、可修改性、可移植性(在不同系统使用)、可重用性(在不同场合使用)
八 软件项目管理
1.能力成熟度模型(CMM)
(1)初始级:对于软件的管理制度较为缺乏,过程缺乏定义
(2)可重复级:管理制度化,建立了基本的管理制度以及规程来跟踪项目费用、进度和功能特性
(3)已定义级:在开发的过程中,技术工作以及管理工作开始文档化和标准化,所有项目都根据实际情况修改后得到的标准软件过程来开发和维护软件
(4)已管理级:收集对软件过程和产品质量的详细度量,对软件过程和产品都有定量的理解与控制
(5)优化级:持续改进软件的过程
2.软件容错技术
(1)提高软件质量和可靠性的技术大致分为两类,一类是避开错误,即在开发的过程中不让差错潜入软件的技术;另一类是容错技术,即对某些无法避开的错误,使其影响减至最小的技术。
(2)实现容错最主要的手段是冗余。冗余技术又称储备技术/容灾备份技术,它是利用系统的并联模型来提高系统可靠性的手段。
(3)冗余附加件包括:
1)独立设计的相同功能冗余备份程序的存储和及调用
2)实现纠错检测和恢复的技术
3)为实现容错软件所需的固化程序
3.项目时间管理:使项目按时完成所必须的管理过程
(1)内容:活动定义、活动排序、活动的资源估算、活动历时估算、制定进度计划以及进度控制
4.软件成本估算模型
(1)基本模型
(2)中期模型
(3)详细模型