参考:
1、 《软件工程导论》张海潘版
2、 软件工程——思维导图
3、 软件工程导论张海潘(第六版)第1-13章总结
4、 软件工程的基本概念
5、 软件工程期末考试重点
6、 软件工程考试重点内容
7、 软件工程期末考试复习题及答案
软件工程
来源见水印。
1 工具
参考博文 《DevOps 与 CI/CD 的概念》。
- 项目管理:
- 任务跟踪:禅道、Trello、Teambition 等。
- 项目计划:禅道、Trello、Teambition 等。
- 团队沟通:Slack、Teambition 等。
- 需求分析:
- 需求跟踪:禅道、Teambition、Trello 等。
- 原型制作:Adobe XD CC、Axure、Sketch 等,参考:16种原型制作工具及使用介绍。
- 设计:
- UML 建模:Violet UM、ProcessOn、StarUML、Visio 等。(类图、对象图;用例图、状态图、活动图、序列图。参考:UML 各种图总结精华、各种图含义作用 )
- 图表制作:Excel、亿图等。
- 开发:
- 源代码管理:GitHub、GitLab、SubVersion 等(Git、SVN)。
- 持续集成:Jenkins、CireleCI、AppCenter、Travis CI、flow.ci 等。
- 测试:
- Bug 跟踪:禅道、Teambition、Trello、The Bug Genie 等。
- 测试管理平台:TestLink、Redmine、禅道、TestCenter 等。
- 自动化测试:常用的:QPT、LR。/ 开源功能自动化测试工具:Watir、Selenium、MaxQ、WebInject。/ 开源性能自动化测试工具:Jmeter、OpenSTA、DBMonster、TPTEST、Web Application Load Simulator。
- 补充,自动化构建和测试: Apache Ant、Maven 、Selenium、PyUnit、QUnit、JMeter、Gradle、PHPUnit。
- 运行维护:
- 自动化部署:Jenkins、ElectricFlow、DeployBot、CireleCI、AppCenter、Travis CI 等。
- 日志分析:Logstash、CollectD、StatsD 等。
- 线上监控:Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana 等。
2 软件工程文档
- 需要文档的几个方面:
- 立项文档
- 需求分析文档
- 概要设计和架构设计
- 详细设计
- 源代码
- 配置文档
- 单元测试文档
- 集成测试文档
- 验收文档
- 维护文档
- 用户操作手册
- 项目管理文档
- 具体文档:
项目管理文档:
《软件项目计划》、《项目进度报告》、《项目开发总结报告》管理控制文档:
《配置文档》、《维护文档》软件开发文档:
《需求规格说明》、《概要设计说明》、《详细设计说明》、《软件源码文档》、《测试计划》、《软件测试分析报告》产品文档:
《用户操作手册》、《演示文件》
一 软件工程学概述
- 软件工程方法学:
- 软件工程包括:技术、管理。
- 软件工程方法学三要素:过程(步骤)、方法(如何做)、工具(支持环境)。
- 传统方法学:强调自顶向下。面向对象方法学:强调主动多次反复迭代。(四个要点:对象、类、继承、消息。)
软件周期(三个时期,八个阶段):
软件过程:
瀑布模型:规范、文档驱动;最终产品可能不是用户真正需求;难以按模型进行,开发过程逆转代价大。
快速原型模型:快速构建可在计算机上运行的原型系统,让用户反馈,开发周期短;客户与开发者对原型的理解不同,准确的设计原型困难。
螺旋模型:可看作增加了风险分析过程的快速原型模型;风险驱动,适用内部大型项目的开发。
增量模型:短期提交可完成部分,逐步增加功能;软件需具备开放性会导致失去整体结构,也可能有无法集成的问题。
喷泉模型:体现了面向对象软件开发过程无缝迭代特性。
补充,敏捷开发:是一套价值观和原则,大项目由各个可独立运行的小项目组成,此期间软件一直处于可使用状态。迭代式开发与增量交付。敏捷开发视频课程,敏捷开发之 Scrum 视频课程。
敏捷开发之 Scrum:计划、构建、测试、回顾。不断重复这四步来做增量式发布,最后形成一个可发布的版本。/ 三个角色:产品经理、Scrum 负责人、Scrum 团队(开发、测试、文案等人员)。/ 产品经理需求、用户视角需求。/ 三个会议:计划会议(产品经理与负责人)、每日例会(团队工作进度)、回顾会议(展示和改进)。
敏捷开发之极限编程:
一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。/
计划在极限编程中被视为临时工件;高质量的代码在极限编程项目中是必不可少的;良好的单元测试和验收测试是极限编程项目的标志。小结:
- 各阶段具体任务:
二 可行性研究
目的:
确定问题是否值得去解决。实质:
在较高层次去用抽象的方法进行系统分析、设计的过程。内容:
进一步分析定义问题,导出逻辑模型,探索若干种可供选择的解决方法。从几个方面研究可行性:
技术、经济、操作可行性、运行可行性、法律等。可行性研究的步骤:
- 具体步骤:
复查系统规模和目标 -> 研究目前正在使用的系统 -> 导出新系统的高层逻辑模型 -> 进一步定义问题 -> 导出和评价供选择的解法 -> 推荐行动方针 -> 草拟开发计划 -> 书写文档提交审查 - 小结:
对问题正确定义的基础上,分析问题,导出试探性的解,(复查修正定义,再次分析问题,改进解)最终提出逻辑模型,根据逻辑模型设想可能的系统模型,并从多角度研究可行性,提交用户客户组织负责人审查批准。
系统流程图(物理):
概括描述物理系统的传统工具。数据流图(逻辑):
只描述数据在软件中流动和被处理的逻辑过程。数据字典(逻辑):
- 概念:关于数据的信息集合(作为分析阶段工具,开发数据库的第一步)。数据字典和数据流图共同构成逻辑模型。
- 数据字典的实现,例:
- 符号:
= 定义为
,+ 连接两个分量
,[ ] 其中有若干个,分量用 | 表示
,{ } 重复,左边写下限,右边写上限
,( ) 可选,其中的分量可有可无
。 - 举例:
标识符 = 字母字符 + 字母数字串
,字母数字串 = 0{字母或数字}7
,字母或数字 = [字母字符 | 数字字符]
。
- 成本效益分析:
- 货币时间价值:P 为现在价值、F 为未来价值、i 为年利率、n 为年数,F=P(1+i)^n,同理 P=F/((1+i)^n)。
- 投资回报率:P 为现在投资额、Fi 为第 i 年底的效益(i=1、2、…)、n 为系统使用寿命、j 为投资回报率。P=Fi/((1+j)^n) ,i 从 1 到 n,累加。
补充
- 项目计划:
它是软件开发工作的第一步。 项目计划的目标是为项目负责人提供一个框架,使之能合理地估算软件项目开发所需的资源 、经费和开发进度,并控制软件项目开发过程按此计划进行。 在做计划时,必须就需要的人力、项目持续时间及成本作出估算。这种估算大多是参考 以前的花费作出的。软件项目计划包括二个任务:研究和估算。即通过研究确定该软件 项目的主要功能、性能和系统界面。
- 范围:项目目标、主要功能、性能限制、系统接口、特殊要求、开发概述。
- 资源:人员资源、硬件资源、软件资源、其他。
- 进度安排:工程网络图、Gantt 图、任务资源表、成本估算、培训计划。
流程规范:
软件工程方法(怎样做)。风险管理:
- 风险识别:头脑风暴法、面谈、Delphi 法、核对表、SWOT 技术。
- 风险量化:风险因子计算、PERT 估计、决策树分析、风险模拟。
- 风险应对计划制定:回避、转移、缓和、接受。
- 风险监控:核对表、定期项目评估、挣值分析。
- 配置管理:
软件配置管理,贯穿于整个软件生命周期,它为软件研发提供了一套管理办法和活动原则。软件配置管理无论是对于软件企业管理人员还是研发人员都有着重要的意义。/ 关键活动包括:配置项、工作空间管理、版本控制、变更控制、状态报告、配置审计等。/ 软件配置管理可以提炼为三个方面的内容:
- VersionControl 版本控制
- ChangeControl 变更控制
- ProcessSupport 过程支持
- 配置管理的目的:
- 配置识别:识别配置、配置项目和基准。
- 配置控管:导入变更控管流程。该流程通常由变更控制委员会来运行,其主要的职责是核准或拒绝有悖任何基准的所有变更请求。
- 配置状态报告:记录和呈报与开发过程状态相关的所有必要信息。
- 配置审核:确保这些配置包含所有预期内容,且备有完整的规定文件(包括要求、结构规范和用户手册)。
- 建构管理:管理用于建构的流程和工具。
- 流程管理:确保遵循企业组织的开发流程。
- 环境管理:管理承载系统的软硬件。
- 团队合作:促进流程中团队彼此间的交互。
- 缺陷追踪:确保可溯及每个缺陷的源头。
三 需求分析
- 概念:
- 定义:确定系统必须完成哪些工作。写出软件需求规格说明书,以书面形式准确描述软件需求。
- 需求内容:功能需求、性能需求、可靠性需求、出错需求、接口需求、逆向需求、将来可能提出的需求。
- 系统分析的数据要求:
- 建立数据模型(E-R 图)
- 描绘数据结构(层次方框图、Warnier 图)
- 数据结构规范化
- 需求分析中的三种模型:
- 数据模型(E-R 图)。
- 功能模型(数据流图)。
- 行为模型(状态转换图)。
- 三种模型对应的三种图:
E-R 图:由数据对象(矩形)、属性(圆角矩形)、关系(菱形)组成。
数据流图:由起点/终点(矩形)、数据处理(标号圆角矩形)、数据存储(标号不封闭矩形)、数据流(箭头)组成。
状态转换图:由状态、事件组成。
- 补充:
结构化分析方法:
传统软件方法学使用结构化分析技术。实质上是一种建模活动,在需求分析阶段通常建立数据模型(E-R 图)、功能模型(数据流图)、行为模型(状态转换图)。书写需求分析文档:
通常从需求的一致性、完整性、现实性、有效性 4 个方面复审软件需求规格说明书。通过严格评审和用户确认后,作为此阶段的最终成果。需求分析与可行性研究间的关系:
软件需求分析就是把软件计划期间建立的软件可行性分析求精和细化,分析各种可能的解法,并且分配给各个软件元素。数据字典的作用:
数据字典描述在数据模型、功能模型、行为模型中出现的数据对象、控制信息的特性,给出它们的准确定义。数据字典成为把 3 种分析模型粘合在一起的 “粘合剂”。
补充
需求分析:
见上。变更管理:
参考:
1、 百度经验:如何理解变更管理
需要确保变更在可控的方式下被记录、评估、授权、确定优先级、计划、测试、实施、备案以及回顾。
四 形式化说明技术(略)
五 总体设计(系统设计)
设计原理:
模块化、模块独立、抽象、逐步求精、信息隐藏、局部化。设计任务与过程:
- 总体设计任务:用抽象概括的方式确定系统如何完成预定的任务,并确定组成系统的每个程序的结构。
- 总体设计过程:系统设计(全局。数据流图触发确定系统的具体实现物理方案);结构设计(局部。确定软件结构。软件由哪些模块组成,及其动态调用过程。/ 功能分解、设计软件结构、设计数据库、制定测试文档)。
- 模块化、模块独立概念:
- 模块化:把程序划分为独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体。
- 模块独立:是抽象、模块化(低耦合)、信息隐藏、局部化(高内聚)概念的直接结果。
- 模块独立程度的定性度量标准(低耦合与高内聚):
- 概念:耦合:模块间互连程度。/ 内聚:一个模块内各个元素彼此结合的紧密程度。
- 六种耦合:无直接耦合、数据耦合、标记耦合、控制耦合、公共环境耦合、内容耦合。
- 六种内聚:功能内聚、顺序内聚,通信内聚、过程内聚,时间内聚、逻辑内聚、偶然内聚。
- 描述软件结构的图形工具:
- 层次方框图:
层次方框图用树形结构的一系列多层次的矩形框描绘数据的层次结构。
a) 层次图、HIPO 图:(层次图无 HIPO 图中的标号)。
b) 结构图:
Warnier 图:
和层次方框图类似,Warnier 图也用树形结构描绘信息,但是这种图形工具比层次方框图提供了更丰富的描绘手段。IPO 图:
IPO 图是输入、处理、输出图的简称,能够方便地描绘输入数据、对数据的处理和输出数据之间的关系。
- 数据字典、数据流图、数据库间的关系:
- 数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。
- 数据字典、数据流图共同构成逻辑模型。
- 从数据字典、数据流图出发,首先得到的是数据库的概念结构。
- 小结:(数据字典 -> 数据流图)可行性研究的逻辑模型 -> 数据库的概念模型
启发式规则:
面向数据流的设计方法(结构化设计方法):
- 概念:把数据流图变成软件结构。
- 方法(变换分析设计):数据流图求精 -> 独立出变化中心 -> 各个控制模块 -> 映射成软件中适当的模块
- 变换流与事物流:
- 数据流图(DFD)一般可分为 “变换流”,“事物流”两种。这是信息流的两种类型。
- “变换流”:由输入、处理、输出三部分组成,是一顺序结构。
- “事物流”:它的某个加工,分离成许多分散的数据流,形成许多加工路径,并且根据输入值选择其中一个路径来执行。
- 从数据流导出软件的层次结构:
- 数据流图反应的是数据的系统逻辑模型,是信息流在系统中的流动反应,结构图是系统的物理模型,他反应的是系统的层次结构和功能关系。
- 在系统设计阶段,可以根据 DFD 图,分别通过变换分析和事务分析方法,先设计结构图的顶端主模块,然后自顶向下逐步细化,从 DFD 图导出满足数据流图要求的、标准形式的系统结构图。
- 总体设计与需求分析间的关系:
总体设计需求分析的结果,需求分析是系统设计的依据。/ 补充:将逻辑模型(分析模型)转换为物理模型(设计模型)。
补充
- 架构设计:
它是一个软件系统从整体到部分的最高层次的划分。/ 一个系统通常是由元件组成的,而这些元件如何形成、相互之间如何发生作用,则是关于这个系统本身结构的重要信息。
架构设计详细地说,就是要包括架构元件(Architecture Component)、联结器(Connector)、任务流(TASk-flow)。所谓架构元素,也就是组成系统的核心”砖瓦”,而联结器则描述这些元件之间通讯的路径、通讯的机制、通讯的预期结果,任务流则描述系统如何使用这些元件和联结器完成某一项需求。
三个方面:
逻辑架构、物理架构、系统架构。
- 技术选型:
- 重构:
概念:
重构(Refactoring)就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。重构的时机:
在添加新功能时进行重构、在修改 bug 时进行重构、在代码复审时进行重构、到了最后的交付期限不进行重构。重构难题:
(a 关系数据库与面向对象编程的问题——在对象模型和数据库模型之间插入一个分隔层,这就可以隔离两个模型各自的变化,升级某一模型时只需同时升级上述的分隔层即可,这样的分隔层会增加系统复杂度,但是能增加灵活度。/ (b
修改接口的问题——修改已发布的接口,因为已发布的接口会供外部人员(其它公司)使用,因此修改接口会导致引用接口的其它程序不修改程序就无法运行。修改接口的最好的办法是增加一个新的接口,让旧接口调用新接口,这样原来的程序就不用修改了。对于接口的另一个建议是尽量不要发布接口。
六 详细设计(模块设计)
- 结构程序设计概念:
是进行以模块功能和处理过程设计为主的详细设计的基本原则。结构化程序设计是过程式程序设计的一个子集,它对写入的程序使用逻辑结构,使得理解和修改更有效更容易。
- 经典的结构程序设计:三种基本控制结构。
- 扩展的结构程序设计:允许使用 do-case、do-until 循环结构。
- 修正的结构程序设计:允许加上 break 结构。
- 过程设计工具:
用图形、表格、语言。
- 程序流程图:不易表示数据结构。
- 盒图(N-S 图):
- PAD 图(问题分析图):
- 判定树。
- 判定表。
- 过程设计语言(PDL 伪码)。
Jackson 程序设计方法:
从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其它方法结合,用于模块的详细设计。Warnier 程序设计方法:
Warnier 提出的软件开发方法与 Jackson 方法类似。差别有三点:一是它们使用的图形工具不同,分别使用 Warnier 图和 Jackson 图;另一个差别是使用的伪码不同;最主要的差别是在构造程序框架时,Warnier 方法仅考虑输入数据结构,而 Jackson 方法不仅考虑输入数据结构,而且还考虑输出数据结构。程序复杂结构的定量度量:
七 实现(编码、单元测试、综合测试)
编码:
选择程序设计语言、编码风格。测试等见最后的总结。
黑盒测试之等价划分方法:
- 有/无效等价类
- 测试用例
黑盒测试之边界值分析方法:
白盒测试之逻辑覆盖:
参考:白盒测试:语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖
八 维护
四项活动:
改正性维护、适应性维护、完善性维护、预防性维护。决定软件可维护性因素:
可理解性、可测试性、可修改性、可靠性、可移植性、可使用性。
九、十 面向对象方法学引论与面向对象分析
- 面向对象开发方法:
概念:
面向对象三大特性:
封装、继承、多态。面向对象建模:
- 定义类:类名、属性、服务。
- 面向对象分析之建模的三个模型:
- 对象模型:静态结构。定义了做事情的实体。
- 功能模型:功能。系统应该做什么。
- 动态模型:交互次序。规定了什么时候做。
面向对象分析之五个层次:
主题层、类与对象、结构层、属性层、服务层。UML:
十一 面向对象设计
- 概念:
模块化、低耦合高内聚、抽象、信息隐藏。
十二(第十二章略)
十三 软件项目管理
十四 总结(知识框架)
仅针对本书。