1 软件工程概述
1.1 软件工程基本概念
软件工程是应用系统化、规范化、可量化的方法开发、运行和维护软件的学科。其目标是提高软件质量、降低开发成本、保证开发进度。
软件危机的表现:
- 项目超出预算
- 项目超过计划完成时间
- 软件质量低下
- 软件通常不满足需求
- 项目无法管理,代码难以维护
1.2 软件生命周期
传统软件生命周期阶段:
- 问题定义与规划
- 需求分析
- 系统设计
- 详细设计
- 编码实现
- 软件测试
- 运行维护
现代软件过程模型:
- 瀑布模型:线性顺序,阶段间有明确界限
- 快速原型模型:快速构建原型,获取用户反馈
- 增量模型:分批次交付产品功能
- 螺旋模型:结合瀑布和原型,强调风险分析
- 敏捷开发:迭代式,强调人员协作和快速响应变化
2 软件开发过程
2.1 需求工程
需求层次:
- 业务需求:组织的高层目标
- 用户需求:用户使用产品要完成的任务
- 功能需求:软件必须实现的功能
- 非功能需求:性能、安全性、可靠性等质量属性
需求获取技术:
- 访谈:结构化、非结构化
- 问卷调查:大范围需求收集
- 观察:现场观察用户工作流程
- 原型法:通过原型引导需求
需求规格说明书(SRS):
- 完整性:包含所有需求
- 一致性:需求间无矛盾
- 可验证性:需求可被测试
- 可修改性:易于维护和更新
2.2 软件设计
设计原则:
- 模块化:将系统分解为高内聚、低耦合的模块
- 抽象化:忽略细节,关注本质特征
- 信息隐藏:隐藏模块实现细节
- 功能独立:模块只完成特定功能
体系结构风格:
- 分层架构:如OSI七层模型
- 客户端-服务器架构:客户端请求,服务器响应
- 管道-过滤器架构:数据流经一系列处理单元
- 面向服务架构(SOA):通过服务契约松散耦合
设计模式(23种经典模式):
- 创建型模式:单例、工厂、建造者
- 结构型模式:适配器、装饰器、代理
- 行为型模式:观察者、策略、模板方法
2.3 软件实现
编程规范:
- 命名规范:变量、函数、类命名规则
- 注释规范:文件头、函数、行注释要求
- 格式规范:缩进、空格、换行规则
代码审查:
- 走查:作者讲解,团队审查
- 轮查:团队成员轮流审查
- inspection:正式的审查会议
2.4 软件测试
测试级别:
- 单元测试:测试单个模块或函数
- 集成测试:测试模块间接口
- 系统测试:测试整个系统功能
- 验收测试:用户验证系统是否满足需求
测试类型:
- 黑盒测试:关注功能,不关注内部实现
- 白盒测试:关注内部逻辑和结构
- 灰盒测试:结合黑盒和白盒特性
测试用例设计:
- 等价类划分:将输入域划分为等价类
- 边界值分析:测试边界附近的取值
- 因果图法:分析输入条件的组合关系
- 正交实验法:用最少的测试用例覆盖最多的组合
3 软件项目管理
3.1 项目估算技术
功能点估算(FP):
- 基于软件功能数量估算
- 计算未调整功能点(UFP)
- 考虑技术复杂度因子(TCF)
- FP = UFP × TCF
COCOMO模型:
- 基本COCOMO:基于代码行数的估算
- 中级COCOMO:考虑成本驱动因子
- 详细COCOMO:考虑各个开发阶段
PERT技术:
- 乐观时间(a)
- 最可能时间(m)
- 悲观时间(b)
- 期望时间 = (a + 4m + b) / 6
3.2 项目进度管理
甘特图:显示任务持续时间和发展关系
网络计划图:
- 前导图法(PDM):节点表示活动
- 箭线图法(ADM):箭头表示活动
关键路径法(CPM):
- 确定项目最长路径
- 计算最早开始时间(ES)、最早结束时间(EF)
- 计算最晚开始时间(LS)、最晚结束时间(LF)
- 计算时差:LS-ES 或 LF-EF
3.3 软件质量保证
质量特性(ISO 9126):
- 功能性:满足明确和隐含要求的功能
- 可靠性:在指定条件下维持特定性能水平的能力
- 易用性:易于理解、学习、使用
- 效率:性能与资源消耗的比率
- 可维护性:可被修改的能力
- 可移植性:从一个环境转移到另一个环境的能力
质量保证活动:
- 技术评审:正式的技术审查
- 软件测试:发现和修复缺陷
- 过程检查:确保遵循开发过程
- 质量审计:独立的质量评估
4 软件配置管理
4.1 配置管理过程
配置项识别:确定需要受控的软件项
版本控制:管理配置项的不同版本
变更控制:控制配置项的变更
配置审计:验证配置项的完整性和一致性
状态报告:记录和报告配置项状态
4.2 版本控制工具
集中式版本控制:SVN、CVS
分布式版本控制:Git、Mercurial
Git基本工作流:
# 克隆仓库
git clone <repository>
# 创建分支
git branch <branch-name>
# 切换分支
git checkout <branch-name>
# 添加文件到暂存区
git add <file>
# 提交更改
git commit -m "message"
# 推送到远程仓库
git push origin <branch-name>
# 合并分支
git merge <branch-name>
5 软件开发方法
5.1 结构化方法
特点:
- 自顶向下逐步求精
- 数据流导向
- 强调文档化
主要工具:
- 数据流图(DFD)
- 数据字典(DD)
- 状态转换图(STD)
- 实体关系图(ERD)
5.2 面向对象方法
基本概念:
- 类与对象
- 封装
- 继承
- 多态
U建模语言:
- 用例图:描述系统功能
- 类图:描述静态结构
- 序列图:描述对象交互时序
- 状态图:描述对象状态转换
- 活动图:描述业务流程
5.3 敏捷开发
敏捷宣言:
- 个体和互动高于流程和工具
- 可工作的软件高于详尽的文档
- 客户合作高于合同谈判
- 响应变化高于遵循计划
Scrum框架:
- 产品待办列表(Product Backlog)
- 冲刺待办列表(Sprint Backlog)
- 每日站会(Daily Scrum)
- 冲刺评审(Sprint Review)
- 冲刺回顾(Sprint Retrospective)
极限编程(XP)实践:
- 测试驱动开发(TDD)
- 持续集成(CI)
- 重构(Refactoring)
- 结对编程(Pair Programming)
6 软件度量与评价
6.1 产品度量
规模度量:
- 代码行数(LOC)
- 功能点(FP)
- 对象点(OP)
复杂度度量:
- 圈复杂度:McCabe复杂度度量
- Halstead度量:基于运算符和操作数数量
缺陷密度:缺陷数 / 规模度量
6.2 过程度量
生产率:规模 / 工作量
质量:缺陷数 / 规模
进度偏差:(实际进度 - 计划进度) / 计划进度
7 真题解析与实战演练
7.1 2022年真题
题目:某项目有6个活动,其前后关系及持续时间如下表,求项目的关键路径和总工期。
| 活动 | 前导活动 | 持续时间(天) |
|---|---|---|
| A | - | 5 |
| B | - | 3 |
| C | A | 4 |
| D | A | 6 |
| E | B,C | 2 |
| F | D | 3 |
解析:
- 绘制网络图,计算各活动的最早开始和最晚开始时间
- 找出所有路径:A-C-E(11天), A-D-F(14天), B-E(5天)
- 关键路径:A-D-F,总工期14天
答案:关键路径A-D-F,总工期14天
7.2 2021年真题
题目:比较白盒测试和黑盒测试的区别,各举两种测试用例设计方法。
解析:
白盒测试:
- 关注内部逻辑结构
- 需要了解代码实现
- 设计方法:语句覆盖、判定覆盖、条件覆盖、路径覆盖
- 适用于单元测试
黑盒测试:
- 关注输入输出功能
- 不需要了解内部实现
- 设计方法:等价类划分、边界值分析、因果图法、正交实验法
- 适用于系统测试和验收测试
答案:白盒测试关注内部结构,使用语句覆盖、路径覆盖等方法;黑盒测试关注外部功能,使用等价类划分、边界值分析等方法。
8 备考策略与技巧
8.1 重点掌握内容
- 软件开发过程:各生命周期阶段的主要活动
- 软件设计原则:高内聚低耦合、信息隐藏等
- 软件测试技术:各级别测试的特点和方法
- 项目管理:估算技术、进度管理、关键路径法
8.2 解题技巧
- 关键路径计算:
- 正推法计算最早时间
- 反推法计算最晚时间
- 时差为0的活动在关键路径上
- 测试用例设计:
- 等价类划分注意有效和无效等价类
- 边界值分析测试边界和边界附近的值
- 软件度量计算:
- 理解各种度量指标的含义
- 掌握基本计算公式
8.3 记忆方法
软件生命周期:规需设编测维(规划、需求、设计、编码、测试、维护)
测试级别:单集系验(单元、集成、系统、验收)
设计原则:模块抽象信息隐藏功能独立
结语
软件工程与项目管理是软件设计师必须掌握的核心知识,不仅关系到软件开发的成功,也直接影响软件质量和项目效益。通过系统学习软件开发全过程和项目管理方法,能够提高软件开发的专业水平和管理能力。
思考题:在敏捷开发越来越流行的今天,传统的软件工程方法是否还有价值?请结合具体项目特点,分析不同开发方法的适用场景。
下一篇我们将探讨面向对象技术,这是现代软件开发的重要基础。
《软件设计师软考备战:第五篇 软件工程与项目管理》 是转载文章,点击查看原文。