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 记忆方法
软件生命周期:规需设编测维(规划、需求、设计、编码、测试、维护)
测试级别:单集系验(单元、集成、系统、验收)
设计原则:模块抽象信息隐藏功能独立
结语
软件工程与项目管理是软件设计师必须掌握的核心知识,不仅关系到软件开发的成功,也直接影响软件质量和项目效益。通过系统学习软件开发全过程和项目管理方法,能够提高软件开发的专业水平和管理能力。
思考题:在敏捷开发越来越流行的今天,传统的软件工程方法是否还有价值?请结合具体项目特点,分析不同开发方法的适用场景。
下一篇我们将探讨面向对象技术,这是现代软件开发的重要基础。