软件工程核心思想
一. 软件工程的本质:不同抽象层次之间的映射与转换
1. 映射与转换
任何软件系统开发的共同本质在于:从现实空间的需求到计算机空间的软件代码之间的映射与转换
2. 单步映射与多步映射
软件工程本质:用严格的规范和管理手段来缩小偏差,通过牺牲“时间”来提高“质量”
3. 软件工程的两个映射
- 概念映射:问题空间的概念与解空间的模型化概念之间的映射(概念映射,类似于数据结构)
- e.g. 学生成绩
Struct StudentScore (StudentNo, CourseNo, Score)
- e.g. 学生成绩
- 业务逻辑映射:问题空间的处理逻辑与解空间处理逻辑之间的映射(处理逻辑映射,类似于算法)
- e.g. 计算某班学生的平均分数
double calculateAverageScore(Struct [] scores) {检索+平均算法;}
- e.g. 计算某班学生的平均分数
4. 软件工程:不同层次之间的映射过程
需求分析
4.1 需求分析
现实空间的需求
4.2 软件设计
需求规约
定义实现需求规约所需的系统内部结构与行为,包括软件体系结构、数据结构、详细的处理算法、用户界面等,即所谓设计规约(Design Specification),给出实现软件需求的软件解决方案
4.3 实现
设计规约
对设计规约中的每一个软件功能进行编码
4.4 验证/确认
评估性活动,确定一个阶段的产品是否达到前阶段确立的需求,或者确认开发的软件与需求是否一致
二. 软件工程所关注的目标
1 软件工程所关注的对象
软件工程具有“产品与过程二相性”的特点,必须把二者结合起来去考虑,而不能忽略其中任何一方
产品:各个抽象层次的产出物
过程:在各个抽象层次之间进行映射与转换
2 软件工程所关注的目标
- 功能性需求(Functional Requirements):软件所实现的功能达到它的设计规范和满足用户需求的程度
- 完备性:支持用户所需的全部功能
- 正确性:按照正确需求正确执行任务的能力(软件在需求范围之内的行为)
- 健壮性:容错能力和恢复能力(软件在需求范围之内的行为)
- 可靠性:正确维持而不发生故障
- 非功能性需求(Non-Functional Requirements):系统能够完成所期望的工作的性能与质量
- 效率
- 可用性:使用和学习的容易程度
- 可维护性
- 可移植性:运行于不同软硬件
- 清晰性:易读、易理解,可以提高团队开发效率,降低维护代价
- 安全性
- 兼容性:不同产品相互交换信息的能力
- 经济性:开发成本、时间和适应市场能力
- 商业质量
错误检测、错误恢复、错误预防
3. 不同目标之间的关系——折中(tradeoff)
多个目标同时达到最优是不现实的,因为可能存在目标之间的相互冲突
而不同类型的软件对质量目标的要求各有侧重,例如实时系统侧重于可靠性和效率,而生存周期长的软件侧重于可移植性和可维护性。
三. 软件开发中的多角色
在软件开发过程中同样需要多种角色之间紧密协作,才能高质量、高效率的完成任务.
- 客户单位(Client,甲方):
- 决策者(CXO)、终端用户(End User)、系统管理员(Administrator)
- 软件开发公司(Supplier,乙方):
- 决策者(CXO),软件销售与市场人员,咨询师、需求分析师,软件架构师、软件设计师,开发人员:开发经理/项目经理、程序员,维护人员
四. 软件工程=最佳实践
实践
软件理论无用
五. 软件工程的四个核心理论概念
1. 分而治之(Divide and Conquer)
将复杂问题分解为若干可独立解决的简单子问题,并分别独立求解,以降低复杂性
然后再将各子问题的解综合起来,形成最初复杂问题的解
核心问题:如何的分解策略可以使得软件更容易理解、开发和维护?
2. 复用(Reuse)
新系统,大部分内容成熟
3. 折中(Trade-off)
不同的需求之间往往存在矛盾与冲突,需要通过折中来作出的合理的取舍,找到使双方均满意的点
- 例如:算法时间空间折中、低成本和可靠性折中、安全性和速度折中
核心问题:调和矛盾(需求之间、人与人之间、供需双方之间、…)
4. 演化(Evolution)
软件系统在其生命周期中面临各种变化:新需求、故障/错误、性能缺陷
核心问题:在设计软件的初期,就要充分考虑到未来可能的变化,并采用恰当的设计决策,使软件具有适应变化的能力
即:可修改性、可维护性、可扩展性