(一)软件工程概述
1.计算机软件【分类】(十大类)
系统软件、应用软件(解决特定业务需要的独立应用程序)
工程/科学软件、嵌入式软件(控制面向最终使用者和系统本身的特征和功能)
产品线软件(多个不同用户的使用提供特定的功能)、web应用(计算机网络为中心 )
人工智能软件、开放计算(无线网络)、
网络资源、开源软件(开放系统引用程序的代码)
2.【软件工程基本原理】
(1)用分阶段的生命周期计划严格管理
(2)坚持进行阶段评审
(3)实现严格的产品控制
(4)采用现代程序设计技术
(5)结果能清楚地审查
(6)开发小组的人员应少而精(开发小组人为N时,可能通信通道为N(N-1)/2,人数增大,通信开销增大)
(7)承认不断改进软件工程的必要性
3.【软件的生命周期】
软件生命周期(&主要目标) | 参加人员(&主要文档) |
---|---|
可行性分析与项目开发计划 (软件开发目标及可行性) | 用户、项目负责人、系统分析师(可行性分析报告、项目开发计划) |
需求分析(软件系统的功能、性能、数据和界面要求,逻辑模型) | 用户、项目负责人、系统分析师(软件需求说明书) |
概要设计(各项功能需求转换成需要的体系结构,模块、数据库) | 系统分析师、软件设计师(概要设计说明书) |
详细设计(对每个模块完成的功能进行具体描述) | 软件设计师和程序员(详细设计文档) |
编码 | – |
测试(另一部门的软件设计师或系统分析师 ) | 软件测试计划、测试用例、软件测试报告 |
维护(时间最长) | – |
4.成熟度模型(CMM)
确定当前成熟度并识别对其团建过程执行中的【薄弱】环节,确定对软件质量和过程改进最为【关键】的几个问题,从而形成对其过程的【改进】策略。
【5个级别】
(1)初始级(杂乱无章)
(2)可重复级(建立了基本的项目管理过程和实践来跟【踪项目费用】、进度和功能特性)
(3)已定义级(管理和工程已经【文档化】、标准化,并综合成软件开发组织的标准过程)
(4)已管理级(制定了软件过程和产品质量的【详细度量标准】,产品质量被开发组织的成员所理解和控制 )
(5)优化级(加强了定量分析,通过来自过程质量【反馈】和【新概念】、新技术的反馈过程持续改进)
5.【CMMI】6个过程能力等级
CL0(未完成的) :过程域未执行或未得到CL1中定义的所有目标
CL1(已执行的):将可标识的【输入】工作产品转换成可标识的【输出】工作产品
CL2(已管理的):管理过程的【制度化】,文档、工作计划,监控、控制、评审
CL3(已定义的):已定义过程的制度化,按组织剪裁指南从组织标准中剪裁,收集过程资产过程度量
CL4(定量管理的):可定量管理的制度化,使用测量和质量保证来控制和改进过程域,建立管理准测
CL5(优化的):使用【量化】手段改变和优化过程域,满足客户要求的改变和持续改进的计划
(二)软件过程模型
1.软件过程模型
模型 | 优缺点 |
---|---|
瀑布模型(由前至后、相互衔接的固定次序) | 【优点】:容易理解,管理成本低;强调开发的阶段性早期计划及需求调查和产品测试;【缺点】:客户必须能够完整、正确和清晰表达需求;风险控制能力弱 |
增量模型(融合了瀑布模型的基本成分和原型的迭代特征,将需求分段) | 【优点】:第一个可交付版本所需要的成本和时间少;风险不大;减少用户需要的变更;在项目开始时,可以仅对一个或两个增量投资;【缺点】:不稳定,可能需要重新开发;管理发生的成本、进度和配置复杂性可能超过组织的能力。 |
演化模型 -原型模型(探索型、实验型、演化型) | 【目的】弄清目标的要求,确定所希望的特征,并探讨多种方案的可行性;验证方案的合理性,是大规模开发和实现前,考虑方案是否合适、规格说明是否可靠。 |
演化模型-螺旋模型(瀑布和演化的结合,制定计划、风险分析、实施工程、用户评价) | 【优点】 适用于庞大、复杂具有【高风险】的系统;支持用户【动态】需求变化 ;【缺点】迭代次数增加开发成本,延迟提交时间 |
喷泉模型(迭代性和无间隙性) | 【优点】提高软件项目的开发效率,节省开发时间。【缺点】需要大量开发人员,不利于项目的管理;要求严格管理文档,使【审核的难】度加大 |
2.统一过程模型(UP)
(1)初始阶段:生命周期【目标】
(2)精化阶段:生命周期【构架】
(3)构建阶段:初始运作【功能】
(4)移交阶段:产品【发布】
3.敏捷方法
(1)极限编程(XP)
轻量级(敏捷)、高效、低风险、柔性、可预测的、科学的软件开发方式,由【价值观、原则、实践、行为】组成
【4大价值观】:沟通、简单性、反馈、勇气
【5个原则】:快速反馈、简单性假设、逐步修改、提倡更改和优质工作
【12个最佳实践】:计划游戏、小型发布、隐喻、简单设计、测试先行、重构、结队编程、集体代码所有制、持续集成、每周工作40小时、现场客户、编码标准。
(2)水晶法
每一个不同的项目都需要一套不同的策略、约定和方法论,【人】对软件质量有重要的影响
(3)并列争球法(迭代的方法)
30天为一次的迭代称为“冲刺”,按需求【优先级】来实现产品。多个自组织和自治的小组【并行地】递增产品。
(4)自适应软件开发(ASD)
有一个【使命】作为指导;【特征】被视为客户价值的关键点;过程中【等待】很重要,“重做”和“做”同样关键;【变化】不视为改成,而是被视为软件开发实际情况的【调整】;确定的交付时间迫使开发人员【认真考虑】每一个生产的版本的关键需求;【风险】包含其中。
5.敏捷统一过程(AUP)
大型上连续,小型上迭代。建模-实现-测试-部署-配置及项目管理-环境管理
(三)需求分析
1.【内容】
功能需求(做什么、何时做)、性能需求(技术性指标,执行速度,响应时间)、用户或人的因素、环境需求、界面需求、文档需求、数据需求、资源使用需求、安全保密要求、可靠性要求、软件成本消耗与开发进度需求、其他功能需求
2.【需求的来源】
用户、用户的规约、应用领域的专家、相关的技术标准和法规;
原有的系统、原有系统的用户、新系统的潜在用户、竞争对手的产品
3.【原则】
(1)理解问题【信息域】
(2)【定义】软件将【完成的任务】
(3)表示软件的【行为】
(4)划分描述【数据、功能、行为】的模型,从而可以【分层次】地揭示细节
(5)从【要素】信息移向【细节】信息
4.需求工程【细分】
需求获取、需求分析与协商、系统建模(SA、OOA)、需求规约、需求验证以及需求管理(正向追踪:用户;逆向追踪:检查文档、代码、测试用例等)
(四)系统设计
1.【目的】
为系统制定蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理地使用各种资源,最终勾画出新系统的详细设计方案。
2.【内容】
总体结构设计、代码设计、输出设计、输入设计、处理过程设计、数据存储设计、用户界面设计、安全控制设计。
最常用的有:SD(面向数据流的结构化设计方法)、OOA(面向对象的分析方法)
3.【概要设计】
(1)设计软件系统总体结构:划分【模块】、模块【功能】【调用】【接口】【传递的信息】【质量】
(2)数据结构及数据库设计(概念设计、逻辑设计、物理设计)
(3)编写概要设计文档(概要设计说明书、数据库详细说明书、用户手册、修订测试计划)
(4)评审(内外部接口定义的正确性、有效性、各部分之间的一致性)
4.【详细设计】
(1)对每个模块进行详细算法设计,用图形、表格等
(2)对模块内队数据结构进行设计
(3)对数据库进行物理设计,确定数据库的物理结构
(4)其他设计(代码、输入/输出格式、用户界面)
(5)编写详细设计说明书
(6)评审(算法、数据库的物理结构)
(五)系统测试
1.【软件】测试
单元测试(【特征】模块接口、局部数据结构、重要执行路径、出错处理、边界条件【过程】驱动模块、桩模块)
集成测试(自顶向上、自底向下、回归测试、冒烟测试)、
确认测试(确认测试准则、配置评审、α(开发者的产所测试)β(用户场所测试))
系统测试(恢复测试、安全性测试、压力测试、性能测试、部署测试)
2.测试【面向对象】软件
单元测试(封装的类)、集成测试(基于线程/使用的测试)
3.测试【Web】应用
质量维度(内容、功能、结构、可用性、导航性、性能、兼容性、安全性)
4.测试方法
静态测试(人工检测、计算机辅助静态分析)、动态测试(黑盒、白盒)
(1)【黑盒】测试(功能测试)
完全不考虑软件的【内部结构和特性】,测试外部特征
【分类】:等价类划分、边界值分析、错误推测、因果图
(2)【白盒】测试(结构测试)
根据程序的【内部结构和逻辑】来设计测试用例,对程序的【路径和进程】进行测试,检查是否满足设计的需求。
<1>逻辑覆盖
①【语句】覆盖
选择足够的测试数据,使被测试程序的【每条语句】至少执行一次。
②【判定】覆盖
每个判定表达式至少获得一次【“真值”和“假值”】(每一个“真”分支和“假”分支至少都通过一次)
③【条件】覆盖
每一条【判定语句】中每个逻辑的各种可能值至少满足一次。
④【判定/条件】覆盖
每个条件所有的可能取值(真/假)至少出现一次,每个判定本身的判定结果(真/假)也至少出现一次
⑤【条件组合】覆盖
各种可能值的组合都至少出现一次
⑥【路径】覆盖
覆盖被测试用例所有可能的路径
<2>循环覆盖(循环中的每个条件都得到验证)
<3>基本路径测试(分析环路复杂性,导出基本可执行路径集合)
【白盒测试原则】
模块中的所有【独立路径】至少执行一次。
所有的逻辑判断中,取【“真”和“假”】的两种情况至少都能执行一次。
每个循环都应在【边界条件】和【一般条件】下各执行一次
测试程序内部数据的【有效性】。
5.【调试】的方法
①试探法
(分析错误【症状】,设置输出语句,分析寄存器、存储器的内容等,一步步地【试探和分析】出错误的所在;效率低;适合结构比较简单的程序)
②回溯法
(从发下错误症状开始,沿着程序控制流程【往回】跟踪代码;适合小型程序)
③对分查找法
缩小错误的范围
④归纳法
从测试所暴露的问题出发,收集所有的【正确的和不正确】的数据,分析它们之间的关系,提出错误原因。用【数据来证明或反驳】,查处问题所在
⑤演绎法
根据测试结果,列出可能原因【分析已有数据】,排除不可能的彼此矛盾的原因;假设
(六)运行和维护知识
1、系统【转换】
直接转换、并行转换、分段转换
2.系统【维护】
①硬件
②软件:正确性、适应性、完善性(比重最大)、改正性
③数据维护
3.系统【评价】
【立项】评价(开发前):分析当前开发系统的条件是否具备,包括【技术、经济、管理、开发环境】的可行性等。
【中期】评价(外部原因【市场】;正常情况:系统设计、分析、实施阶段的阶段性成果【里程碑式】评价)
【结项】评价(系统性能、经济效益、管理效果、水平、人员劳动强度减轻等)
4.系统评价【指标】
①信息系统【组成】:人机
②信息系统【评价对象】:不同角色关注点不同
③经济学角度:成本、效益、财务指标
(七)软件项目管理
1.【4P】:人员、产品、过程、项目
2.项目【估算】
①【已完成】的【类似】项目估算
②【分解】技术
③【经验】估算:IBM估算模型、CoCoMo模型、Putnam模型
3.成本估算方法
①自顶向下估算方法
②自底向上估算方法
③差别估算方法
④其他估算方法:【专家】估算法、【类推】估算法、【算式】估算法(用于估算方法的两种类型:理论和经验导出)
4.COCOMO模型
基本(静态【单】变量模型)
中级(静态【多】变量模型)
详细(系统、子系统、模块)
5.COCOMOII模型
①应用组装模型:【对象点】
② 早期设计阶段模型:【功能点】,可以转换成【代码行】
③体系结构阶段模型
模型层次结构中有3种不同的规模估算选择:对象点、功能点、代码行
6.Putnam模型(动态多变模型)
7.采用【图示】方法需要标明的内容
①各个任务的【开始时间】和【结束时间】
②各个任务的【完成标志】
③各个任务与参与工作的【人数】,各个任务与工作量之间的【衔接】情况。
④完成各个任务所需的【物理资源】和【数据资源】
进度安排常用图形描述方法有:甘特图、项目计划评审技术(PERT)
【甘特图】
优点:清晰地描述任务何时开始,何时结束,进展情况,以及各个任务之间的【并行性】
缺点:不能清晰反应各个任务之间的依赖关系,难以确定整个项目的关键所在,也不能反映计划中最有潜力的部分。
【PERT】
优点:不仅给出了每个任务的开始时间、结束时间和完成任务所需的时间,还给出了任务之间的关系,即哪些任务完成后才能开始另外一些任务,以及如期完成整个工程的关键路径。
缺点:不能反映任务之间的【并行】关系。
8.软件项目组织【原则】
尽早落实责任
减少交流接口
责权均衡(软件管理人员承担的责任不应比赋予他的权利还大)
9.软件项目【组织结构模式】
(1)按项目划分(项目组)
(2)按职能划分(专业组)
(3)矩阵模式(二者之间)
10.程序设计小组的组织方式
主程序员制小组(通信主要在【主程序员】与【程序员】)
民主制小组(组内通信路径较多)
层次式小组(二者之间)
软件配置管理(SCM):用于整个软件工程过程。
主要【目标】:标识变更、控制变更、确保变更正确地实现、报告有关变更
11.评估风险影响:风险暴露度:RE=P*C(P是风险发生的概率,C是风险发生时带来的项目成本)
(八)软件质量
1.ISO/IEC 9126软件质量模型【3个层次组成】
质量特性、质量子特性、度量指标
2.各质量特性和质量子特性的含义:
功能性、可靠性、易使用性、效率、可维护性、可移植性
3.【My Call】
运行、修正、转移3个方面确定了11个质量特性
【产品修正】:可维护性、灵活性、可测试性
【产品转移】:可移植性、复用性、互用性
【产品运行】:正确性、可靠性、易使用性、效率、完整性
4.软件容错技术
冗余(实现系统规定功能多余的那部分资源:硬件、软件、信息、时间)技术分为4类:
【结构】冗余:静态冗余、动态冗余、混合冗余
【信息】冗余:检测或纠正信息在运算或传输中的错误需要外加一部分信息(奇偶码、循环码)
【时间】冗余:重复执行指令或程序来消除瞬时错误带来的影响(程序回滚)
【冗余附加】技术:实现上述冗余技术所需的资源和计数,包括程序、指令、数据、存放和调用它们的空间和通道等。
(九)软件质量
1.【分类】
第一种分类:面向【规模】的度量、面向【功能】的度量、面向【人】的度量
第二种分类:【生产效率】度量、【质量】度量、【技术】度量
2.【McCabe】
在一个程序中,程序图的入口点总能到达图中的任何一个结点,因此程序总是联通的,但不是强连通的。为了使程序图成为强连通图,从图的【入口点】到【出口点】加一条用虚线表示的有向边,使图成为强连通图。
环路复杂度:V(G)=m-n+2p(边-点+2)
(十)软件工具与软件开发环境
1.【软件开发工具】
需求分析工具(辅助系统分析人员)
设计工具(辅助设计人员)
编码与排错工具(辅助程序员)
测试工具(静态分析、动态分析)
2.【软件维护工具】
【版本控制】工具:一个软件往往有多个版本控制工具用来存储、更新、恢复和管理一个软件的多个版本。
【文档分析】工具:分析文档,给出软件维护活动所需的维护信息(数据流图)
【开发信息库】工具:维护软件项目的开发信息,包括对象、模块等。
【逆向工程】工具:辅助软件人员将某种形式表示的软件转换成更高抽象形式的表示软件。
【再工程】工具:支持重构一个功能和性能更完善的软件系统(代码、程序结构、数据结构重构)
3.软件管理和软件支持工具
【项目】管理工具、【配置】管理工具、【软件评价】工具
4.软件开发环境特征
环境的服务是集成的:平台、数据、界面、控制、过程集成
环境应支持小组工作方式,并为其提供配置管理
环境的服务可用于各种软件开发活动,包括分析、设计、编程、测试、调试、文档等