软件工程核心思想

一. 软件工程的本质:不同抽象层次之间的映射与转换

1. 映射与转换

任何软件系统开发的共同本质在于:从现实空间的需求到计算机空间的软件代码之间的映射与转换

image-20211219221556475

2. 单步映射与多步映射

image-20211219221748916

软件工程本质:用严格的规范和管理手段来缩小偏差,通过牺牲“时间”来提高“质量”

3. 软件工程的两个映射

  • 概念映射:问题空间的概念与解空间的模型化概念之间的映射(概念映射,类似于数据结构)
    • e.g. 学生成绩 Struct StudentScore (StudentNo, CourseNo, Score)
  • 业务逻辑映射:问题空间的处理逻辑与解空间处理逻辑之间的映射(处理逻辑映射,类似于算法)
    • e.g. 计算某班学生的平均分数 double calculateAverageScore(Struct [] scores) {检索+平均算法;}

4. 软件工程:不同层次之间的映射过程

image-20211219223706048

需求分析 系统设计 程序设计 部署与维护

4.1 需求分析

现实空间的需求 需求规约

4.2 软件设计

需求规约 设计规约·

定义实现需求规约所需的系统内部结构与行为,包括软件体系结构、数据结构、详细的处理算法、用户界面等,即所谓设计规约(Design Specification),给出实现软件需求的软件解决方案

4.3 实现

设计规约 代码

对设计规约中的每一个软件功能进行编码

4.4 验证/确认

评估性活动,确定一个阶段的产品是否达到前阶段确立的需求,或者确认开发的软件与需求是否一致

二. 软件工程所关注的目标

1 软件工程所关注的对象

软件工程具有“产品与过程二相性”的特点,必须把二者结合起来去考虑,而不能忽略其中任何一方

  • 产品:各个抽象层次的产出物

  • 过程:在各个抽象层次之间进行映射与转换

image-20211220121339295

2 软件工程所关注的目标

  • 功能性需求(Functional Requirements):软件所实现的功能达到它的设计规范和满足用户需求的程度
    • 完备性:支持用户所需的全部功能
    • 正确性:按照正确需求正确执行任务的能力(软件在需求范围之内的行为)
    • 健壮性:容错能力和恢复能力(软件在需求范围之内的行为)
    • 可靠性:正确维持而不发生故障
  • 非功能性需求(Non-Functional Requirements):系统能够完成所期望的工作的性能与质量
    • 效率
    • 可用性:使用和学习的容易程度
    • 可维护性
    • 可移植性:运行于不同软硬件
    • 清晰性:易读、易理解,可以提高团队开发效率,降低维护代价
    • 安全性
    • 兼容性:不同产品相互交换信息的能力
    • 经济性:开发成本、时间和适应市场能力
    • 商业质量
image-20211220124633605

错误检测、错误恢复、错误预防

image-20211220124815285
image-20211220125046062
image-20211220125100115

3. 不同目标之间的关系——折中(tradeoff)

多个目标同时达到最优是不现实的,因为可能存在目标之间的相互冲突

而不同类型的软件对质量目标的要求各有侧重,例如实时系统侧重于可靠性和效率,而生存周期长的软件侧重于可移植性和可维护性。

三. 软件开发中的多角色

在软件开发过程中同样需要多种角色之间紧密协作,才能高质量、高效率的完成任务.

  • 客户单位(Client,甲方):
    • 决策者(CXO)、终端用户(End User)、系统管理员(Administrator)
  • 软件开发公司(Supplier,乙方):
    • 决策者(CXO),软件销售与市场人员,咨询师、需求分析师,软件架构师、软件设计师,开发人员:开发经理/项目经理、程序员,维护人员
image-20211220125921870

四. 软件工程=最佳实践

实践 错误 经验

软件理论无用

五. 软件工程的四个核心理论概念

1. 分而治之(Divide and Conquer)

  • 将复杂问题分解为若干可独立解决的简单子问题,并分别独立求解,以降低复杂性

  • 然后再将各子问题的解综合起来,形成最初复杂问题的解

image-20211220130559818

核心问题:如何的分解策略可以使得软件更容易理解、开发和维护?

2. 复用(Reuse)

新系统,大部分内容成熟 复用框架、架构、同类经验的团队;直接使用已有的软构件;复用已有的功能模块

image-20211220130921602

3. 折中(Trade-off)

不同的需求之间往往存在矛盾与冲突,需要通过折中来作出的合理的取舍,找到使双方均满意的点

  • 例如:算法时间空间折中、低成本和可靠性折中、安全性和速度折中

核心问题:调和矛盾(需求之间、人与人之间、供需双方之间、…)

4. 演化(Evolution)

软件系统在其生命周期中面临各种变化:新需求、故障/错误、性能缺陷

核心问题:在设计软件的初期,就要充分考虑到未来可能的变化,并采用恰当的设计决策,使软件具有适应变化的能力

即:可修改性、可维护性、可扩展性