A2-2.5.1
软件工程基本概念与生命周期。
软件危机的产生与软件工程定义
必记软件危机(Software Crisis)是指在计算机软件的开发和维护过程中所遇到的一系列严重问题(软件开发成本超支、进度严重滞后、软件质量不可靠、维护困难等)。为了消除软件危机,1968 年在 NATO 会议上正式提出软件工程(Software Engineering)概念:采用工程化的原理、方法和技术来指导和规范软件的开发与维护。
软件工程三要素与经典瀑布生命周期各阶段
必记| 生命周期阶段 | 主要交付成果(文档) | 核心任务 |
|---|---|---|
| 1. 问题定义与可行性研究 | 《可行性研究报告》 | 论证技术可行性、经济可行性和操作可行性,决定是否立项开发 |
| 2. 需求分析 | 《软件需求规格说明书(SRS)》 | 确定系统“做什么”(What to do),建立数据流图(DFD)与数据字典(DD) |
| 3. 总体设计(概要设计) | 《总体设计说明书》 | 确定系统体系架构、划分功能模块、数据库概念结构设计(E-R图) |
| 4. 详细设计 | 《详细设计说明书》 | 设计每个模块内部的具体执行算法和逻辑流程(PAD图、N-S盒图) |
| 5. 编码与单元测试 | 源程序代码 | 选用合适的编程语言将设计逻辑转化为可执行代码 |
| 6. 综合测试 | 《软件测试报告》 | 通过黑盒与白盒测试发现并纠正错误,确认是否满足需求 |
| 7. 运行与维护 | 维护记录 | 软件生命周期中耗时最长、成本开销最大(占 60%~80%)的阶段 |
随堂自测(3 题 · 共 276 道关联题)展开作答
SOA 是一种粗粒度、____耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。
把程序从一种计算环境硬件配置和操作系统转移到另一种计算环境的难易程度叫软件的____。
软件生命周期分为三时期:____、____和维护期。
A2-2.5.2
结构化设计方法,总体设计与详细设计。
模块独立性两大衡量准则:内聚性 vs 耦合性(必须死记硬背)
必记| 衡量准则 | 定义概念与设计目标 | 强弱级别排列(从强到弱 / 从好到差) |
|---|---|---|
| 内聚性(Cohesion) | 衡量一个模块内部各元素之间联系紧密程度的度量,追求“高内聚” | 功能内聚(最高/最好) > 顺序内聚 > 通信内聚 > 过程内聚 > 时间内聚 > 逻辑内聚 > 偶然内聚(最低/最差) |
| 耦合性(Coupling) | 衡量不同模块之间相互依赖和相互调用程度的度量,追求“低耦合” | 无直接耦合(最好) < 数据耦合(较好) < 标记耦合 < 控制耦合 < 公共耦合 < 内容耦合(最高/最差) |
模块化设计的黄金法则
必记易错陷阱
专转本必考口诀:“高内聚,低耦合”!优秀的软件架构必须尽量做到模块内部功能高度专一单一(高内聚),而模块与模块之间的接口参数传递尽量简单松散(低耦合),严禁出现内容耦合!
随堂自测(3 题 · 共 131 道关联题)展开作答
在软件结构的设计中,各个模块之间要力求降低耦合性,提高____。
结构化设计是以需求分析阶段产生的DFD图为基础,并且按一定的步骤映射成软件结构。
软件的模块化设计应坚持“高内聚、____耦合”的原则。
A2-2.5.3
面向对象分析与设计:OOD,UML 图。
面向对象三大基本特征与核心概念
必记| 面向对象特征 | 核心内涵解释 | 软件工程带来的价值 |
|---|---|---|
| 对象(Object) | 现实世界实体的软件映射,由属性(数据)和方法(操作行为)封装而成 | 系统的基本运行实体 |
| 类(Class) | 对一组具有相同属性和相同行为的对象的抽象模板 | 对象是类的实例化具体表现 |
| 封装(Encapsulation) | 隐藏对象的内部实现细节,仅对外暴露有限公共接口 | 提高安全性和易用性 |
| 继承(Inheritance) | 子类自动拥有父类的全部属性和方法,并可扩充重载新特性 | 实现代码的高度复用与层次化抽象 |
| 多态(Polymorphism) | 同一消息发给不同类的对象可以产生完全不同的执行行为 | 提高软件的灵活性与可扩展性 |
UML 统一建模语言常用图分类全览
必记| UML 图分类 | 具体图名称 | 主要展示视角与功能 |
|---|---|---|
| 需求分析视角 | 用例图(Use Case Diagram) | 展现外部参与者(Actor)与系统用例之间的关系,界定系统功能边界 |
| 静态结构视角 | 类图(Class Diagram) | 展现类之间的继承泛化、实现、关联、聚合、组合与依赖关系 |
| 动态行为视角 | 顺序图 / 时序图(Sequence Diagram) | 按时间顺序展现对象之间发送消息与交互的生命线流程 |
| 动态行为视角 | 状态图(Statechart Diagram) | 展现一个对象由于外部事件触发而在各种生命周期状态间的转移 |
| 动态行为视角 | 活动图(Activity Diagram) | 展现业务流程中的工作流动作、并行分支与合并 |
| 物理架构视角 | 组件图与部署图(Deployment Diagram) | 展现软件组件打包及在物理硬件服务器节点上的分布拓扑 |
随堂自测(3 题 · 共 74 道关联题)展开作答
____主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型.
计算机(Computer) 由中央处理器、内存、软盘、硬盘、显示器、键盘、鼠标等组成。那么 Computer 类和其他类(CPU、RAM、FloppyDrive、HardDisk、Monitor、Keyboard、Mouse) 之间的关系是()
面向对象分析要建立三个模型,分别是对象模型、动态模型和功能模型,其中 ____ 模型是三个模型的核心,也是其他两个模型的框架。
A2-2.5.4
软件测试的方法,白盒测试与黑盒测试。
黑盒测试 vs 白盒测试核心对比(专转本每考必出大题)
必记| 对比项 | 黑盒测试(功能测试) | 白盒测试(结构测试 / 逻辑驱动) |
|---|---|---|
| 测试视角 | 把程序看作一个看不见内部结构的黑盒子,完全不考虑程序内部逻辑结构 | 清晰看清程序内部代码逻辑、执行路径和分支条件 |
| 测试依据 | 依据《软件需求规格说明书》,检查输入与输出是否符合预期功能 | 依据程序内部算法源代码结构设计测试用例 |
| 常用测试方法与用例设计技术 | 等价类划分法(有效/无效等价类)、边界值分析法(最容易暴露错误)、错误推测法、因果图法 | 逻辑覆盖测试(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖) |
| 测试执行阶段 | 主要用于集成测试、系统测试与验收测试 | 主要用于单元测试(Unit Test) |
白盒测试逻辑覆盖强度层级(从弱到强排列)
必记| 逻辑覆盖标准 | 测试用例必须达到的覆盖要求 | 覆盖强度评价 |
|---|---|---|
| 1. 语句覆盖 | 程序中每一条可执行语句至少被执行一次 | 覆盖能力最弱,无法发现分支判断逻辑错误 |
| 2. 判定覆盖(分支覆盖) | 每个判断语句的真(True)分支和假(False)分支至少各走一次 | 弱于条件覆盖 |
| 3. 条件覆盖 | 每个判断语句中每个逻辑条件的各种可能取值(真/假)至少满足一次 | 不能保证所有判定分支都被覆盖 |
| 4. 判定/条件覆盖 | 同时满足判定覆盖和条件覆盖 | 综合二者 |
| 5. 条件组合覆盖 | 每个判断语句中所有条件的各种可能取值的组合至少出现一次 | 强逻辑覆盖 |
| 6. 路径覆盖 | 覆盖程序控制流图中所有可能的从入口到出口的执行路径 | 覆盖能力最强,但当程序有循环时可能产生路径爆炸 |
随堂自测(3 题 · 共 123 道关联题)展开作答
由于软件错误的复杂性,在软件工程测试中,应综合运用测试技术,并且应实施合理的测试序列:单元测试、集成测试、____和验收(用户)测试。
白盒测试和____是软件测试的两类基本方法,这两类方法各有所长,相互补充。
大型软件测试包括单元测试、____、确认测试和系统测试。
A2-2.5.5
程序的调试,静态调试与动态调试。
软件测试(Testing) vs 软件调试(Debugging)本质区别(必考概念题)
必记| 对比项 | 软件测试(Testing) | 软件调试(Debugging) |
|---|---|---|
| 核心目的 | 发现程序中存在的潜在错误和缺陷 | 定位错误发生的根本根源并纠正排除错误(Bug) |
| 工作执行人 | 主要由独立的专业软件测试工程师执行 | 主要由负责编写该代码的原程序员执行 |
| 结果与状态 | 测试从已知条件开始,展示错误症状 | 调试从未知原因开始,推断、假设并修改代码修复故障 |
| 阶段时序关系 | 测试先于调试进行 | 测试发现了错误之后,才启动调试排错 |
静态调试 vs 动态调试方法对比
必记| 调试方法类别 | 执行机制与方式 | 常用手段与工具 |
|---|---|---|
| 静态调试 | 不实际在计算机上运行程序代码,依靠人工目视或静态代码扫描工具审查代码 | 代码走查(Walkthrough)、同行评审、静态规则扫描(SonarQube、Linter) |
| 动态调试 | 在计算机上实际加载并运行程序,通过动态监控程序运行时状态排查错误 | 设置断点(Breakpoint)、单步跟踪(Step Over/Into)、内存变量监视、打印调试日志(Log) |
随堂自测(3 题 · 共 18 道关联题)展开作答
软件调试的目的是( )
程序调试指的是____,其重要任务为____,____。
软件测试是尽可能发现软件中的错误,而程序调试先要发现软件的错误,然后借助于一定的调试工具去执行找出软件错误的具体位置。