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