软件的本质

软件

软件是能够完成预定功能和性能,并对相应数据进行加工的程序和描述程序及其操作的文档

软件=程序(指令的集合)+数据(数据结构)+文档(软件描述信息)

软件的特点

  • 软件是设计开发的,而不是传统意义上生产制造的
  • 软件不会"磨损",但是可能会"失效"
  • 虽然整个工业向着基于构件的构造模式发展,然而大多数软件是根据实际的顾客需求制定的

下图为软件失效曲线图

1

与之相对应的是硬件失效曲线图,如下所示

2

软件演化和遗留软件(Legacy Software)

软件演化是软件产品不可回避的基本问题

  • 软件需要进行适应性调整,从而可以满足新的计算环境或者技术的需求
  • 软件必须升级以实现新的商业需求
  • 软件必须扩展使之具有与更多新的系统和数据库的互操作能力
  • 软件架构必须进行改建使之能适应不断演化的计算环境

软件应用领域

  • 系统软件
  • 应用软件
  • 工程 / 科学软件
  • 嵌入式软件
  • 产品线软件:一系列软件密集型系统,利用了产品线中所有产品的公共性
  • Web应用软件:应用内容的精美程度仍是决定WebApp质量的重要因素
  • 移动应用软件(app):提供了在平台中的持久存储能力
  • 人工智能软件(包括机器人、人工神经网络和博弈等)
  • 云计算软件:云服务器,云函数等,可提供分布式数据存储和处理功能

3

软件危机

4

表现

软件开发和维护不能满足社会发展的需求,已经成为社会、经济发展的制约因素

软件开发的工作量估计困难,开发进度难以控制,质量难以保证

  • 软件开发效率低
  • 软件质量得不到保证
  • 软件开发成本过高
  • 软件维护困难,用户满意度不高

原因

软件产品本身的需求和特征

  • 软件规模大、复杂性高、性能不断增强
  • 软件是逻辑产品,完全认识其本质和特点极其困难

工程管理技术缺乏

  • 缺乏有效的、系统的开发、维护大型软件项目的技术手段和管理方法

沟通和理解

  • 用户对软件需求的描述和软件开发人员对需求的理解往往存在差异,用户经常要求修改需求,开发人员很难适应

人员和技术

  • 软件开发的技术人员和管理人员缺乏软件工程化的素质和要求,对工程化的开发认识不足

软件工程

工程是科学技术在某领域的应用,通过这一领域应用,使自然界的物质和能源的特性能够通过各种结构、机器、产品、系统和过程,以时间最短的和精而少的人力做出高效、可靠且对人类有用的东西

系统工程(System Engineering)是一个跨多学科领域的工程,通常专注于如何设计和管理复杂的工程专案

系统工程学

  • 通过人和计算机的配合,能充分发挥人的理解、分析、推理、评价、创造等能力的优势,又能利用计算机高速计算和跟踪能力。以此来实验和剖析系统,从而获得丰富的信息,为选择最优的或次优的系统方案提供有力工具
  • 系统工程学模型中能容纳大量的变量;它是一种结构模型,通过它可以充分认识系统结构,并以此来把握系统的行为,而不只是依赖数据来研究系统行为
  • 系统工程学是结构方法、功能方法和历史方法的统一。它有一套独特的解决复杂系统问题的工具和技巧

软件开发需要面对的几个事实

  • 确定软件方案之前,需要共同努力来理解问题
  • 设计已成为关键活动
  • 软件应该具有高质量
  • 软件需具备可维护性

软件工程的目标和原则

目标:在给定成本、进度的前提下,开发出满足用户需求的高质量的软件产品

其中高质量包括:有效性、可靠性、可适应性、可追踪性、移植性、可互操作性、可修改性

原则:在软件开发过程中,为了达到软件开发目标,必须遵循下列原则

抽象、模块化、信息隐藏、局部化、一致性、完全性、可验证性

软件工程的定义

为了经济的获得可靠的,在实际机器上高效运行的软件,而建立和使用的有实用价值的工程原则

将系统的、规范的、可度量的方法应用于软件的开发、运行和维护的过程

软件工程采用层次化(分解)的方法,每个层次都包括过程、方法、工具三要素

5

  • 过程:贯穿软件开发的各个环节
  • 过程和方法:管理者在软件工程过程中通过适当的方法对软件开发的质量、进度、成本进行评估、管理和控制
  • 方法及工具:技术人员采用相应的方法和工具生成软件工程产品(模型、文档、数据、报告、表格等)

Points

  1. 什么是软件?

软件是能够完成预定功能和性能1,并对相应数据进行加工2的程序和描述程序及其操作的文档3

  1. 软件的特点有哪些?
  • 软件是设计开发的,而不是传统意义上生产制造的
  • 软件不会"磨损"
  • 虽然整个工业向着基于构件的构造模式发展,然而大多数软件仍是根据实际的顾客需求制定的

软件需要进行适应性调整、升级、扩展、改建来不断满足技术需求并适应计算环境

  1. 软件的应用领域
  • 系统软件
  • 应用软件
  • 工程 / 科学软件
  • 嵌入式软件
  • 产品线软件
  • Web应用软件
  • 移动应用软件(App)
  • 人工智能软件(包括机器人、人工神经网络和博弈等)
  1. 造成软件危机的原因有哪些?
  • 软件开发的工作量估计困难,开发进度难以控制,质量难以保证
  • 软件开发效率低
  • 软件质量得不到保证
  • 软件开发成本过高
  • 软件维护困难,用户满意度不高

软件开发和维护不能满足社会发展的需求,已经成为社会、经济发展的制约因素

  • 软件产品本身的需求和特征
    • 产品规模大、复杂性高、性能不断增强
    • 软件是逻辑产品,完全认识其本质和特点极其困难
  • 工程管理技术缺乏
    • 缺乏有效的、系统的开发、维护大型软件项目的技术手段和管理方法
  • 沟通和理解
    • 用户对软件需求的描述和软件开发人员对需求的理解往往存在差异,用户经常要求修改需求,开发人员很难适应
  • 人员和技术
    • 软件开发的技术人员和管理人员缺乏软件工程化的素质和要求,对工程化的开发认识不足
  1. 软件工程的目标和原则是什么?

目标:在给定成本、进度的前提下,开发出满足用户需求的高质量(有效性、可靠性、可适应性、可追踪性、移植性、可互操作性、可修改性)的软件产品

原则:抽象、模块化、信息隐藏、局部化、一致性、完全性、可验证性

在软件开发过程中,为了达到软件开发目标,必须遵循以上原则

  1. 软件工程[IEEE93]的定义

系统的、规范的、可度量的方法应用于软件的开发、运行和维护的过程

  1. 软件工程的三要素及其详细解释

软件工程采用层次化(分解)的方法,每个层次都包括过程、方法、工具三要素

  • 过程:贯穿软件开发的各个环节
  • 过程和方法:管理者在软件工程过程中通过适当的方法对软件开发的质量、进度、成本进行评估、管理和控制
  • 方法及工具:技术人员采用相应的方法和工具生成软件工程产品(模型、文档、数据、报告、表格等)
  1. 简述软件工程过程框架
  • 框架活动
    • 沟通、策划、建模(需求分析、设计)、构建(编码、测试)、部署
  • 工作任务 - 工作产品 - 里程碑&可交付成果 - QA检查点
  • 普适性活动
    • 软件项目跟踪和控制
    • 风险管理
    • 软件质量保证
    • 技术评审
    • 测量
    • 软件配置管理
    • 可复用管理
    • 工作产品的准备和生产
  1. 软件工程实践的五个步骤

分析 - 设计 - 编码 - 测试 - 维护

  • 1 需求分析
  • 2 系统设计
  • 3 编码实现
  • 4 软件测试
  • 5 后期维护
  1. 软件工程实践的通用规则——Hooker的概括性原则
  • 1 存在价值
  • 2 KISS (Keep It Simple & Stupid - 保持简洁)
  • 3 保持愿景
  • 4 关注使用者
  • 5 面向未来
  • 6 计划复用
  • 7 认真思考
  1. 通用软件过程模型的层次活动

沟通→策划→建模→构建→部署

  1. CMM的能力成熟度级别及关键过程域

CMM:能力熟练度模型 - Capability Maturity Model

CMM的能力熟练度共分5级,L1初始级,L2可重复级,L3已定义级,L4已管理级,L5优化级

成熟度等级 关键过程域
L2可重复级 需求管理 软件项目计划
项目跟踪和监督分包合同管理
软件质量保证 软件配置管理
L3已定义级 组织的过程焦点 组织的过程定义
培训大纲 集成化软件管理
软件产品工程 组间协调 同行评审
L4已管理级 定量的过程管理 软件质量管理
L5优化级 缺陷的预防 技术更新管理 过程变更管理

初始级L1处于无序工作状态,无系统的规范,故在表中略去

二级以上包含若干关键过程域

6

关键过程域(Key Process Area):描述软件过程的属性,通过完成一组相互关联的活动,实现一组对建立过程能力至关重要的目标

关键过程域是SEI标识的,帮助确定软件开发组织的软件过程能力,评估软件成熟度的基本单元

关键过程域用具有固定结构和语句的框架表示

关键过程域的目标(goals)是指导和评估组织或组织的项目有效实践关键过程域的指南,是关键过程域应完成的任务和进行关键实践的概括描述

  1. 能力成熟度模型集成CMMI

CMMI:能力成熟度模型集成 - Capability Maturity Model Integration

  1. 阶段式CMMI模型

阶段式模型基本沿袭SW-CMM模型框架,仍保持五个"成熟度等级",但过程域做了一些调整和扩充

7

  1. 连续式CMMI模型

连续式模型将24个过程域按照功能划分为:过程管理、项目管理、工程、支持四个过程组,进行连续评价

8

  1. 软件生存周期(旧:三时期七阶段,新:五时期十七阶段)

传统上分为三个时期、七个阶段

定义→开发→运行

可行性研究→需求分析→概要设计→详细设计→编码→组装和确认测试→维护

9

新软件生存周期

13

  1. 瀑布模型及其优缺点
  • 传统瀑布模型的软件开发过程与生命周期是一致的
  • 相邻两阶段之间存在因果关系
  • 需对阶段性产品进行评审

10

11

瀑布模型是软件工程的基本过程模型,也是最重要的过程模型

  1. V模型及其含义

12

  1. 增量模型

14

  1. 原型模型

15

  1. 螺旋模型

16

17

软件工程项目从螺旋中心开始启动,沿顺时针方向前进

  • 第一圈:产生产品规格说明
  • 第二圈:产生一个用于开发的原型
  • 第三圈:产生软件产品的初始版本
  • 第四圈:产生软件产品比较完善的新版本
  • ​ …

螺旋模型的优点

  • 符合人们认识现实世界和软件开发的客观规律
  • 支持软件整个生命周期
  • 保持瀑布模型的系统性、阶段性
  • 利用原型评估降低开发风险
  • 开发者和用户共同参与软件开发,尽早发现软件中的错误
  • 不断推出和完善软件版本,有助于需求变化,获取用户需求,加强对需求的理解
  1. 统一软件过程模型

一种"用例驱动,以构架为中心的迭代和增量"软件过程和统一建模语言(UML)紧密结合

18

19

  1. 简述软件工程的行为模式

36

RUP软件生命周期:初启阶段→精化阶段→构建阶段→移交阶段(先启→精化→构建→产品化)

3WH(也称2W1H):who - when - what - how

软件过程定义由什么时候什么事情,并且如何去达到一定的目标

软件过程用RUP的四种主要建模元素角色、活动、制品、工作流来表达

角色执行活动并产生制品

  1. 软件工程应该由哪些跨界团队角色?

20

PSP:个人软件过程 - Personal Software Process

策划 - 高层设计 - 高层设计评审 - 开发 - 后验

TSP:团队软件过程 - Team Software Process

  1. 高效团队的特征由哪几点?
  • 目标意识
  • 参与意识
  • 培养信任感
  • 鼓励进步意识
  • 团队技能的多样化

  • 目标清晰
  • 分工明确
  • 目标导向作用明显
  • 高度信任
  • 高效合作互助
  • 高度创造力
  1. “团队毒性”表现在那几个和方面?如何避免“团队毒性”?

21

23

  1. 软件工程团队有哪些组织模式(范型)?

56

22

  1. 什么是敏捷团队?有哪些特点?为什么要建立敏捷团队?

24

  1. 极限编程(XP)团队的价值观。

25

  1. 影响全球化软件开发(GSD)团队的因素有哪些?相互关系是什么?

GSD:Global Software Development

26

  1. 简述工程成本变更倍增原理

  1. 敏捷过程的三个基本假设,要遵守的过程

27

  1. 简述极限编程(XP)过程

使用最广泛的敏捷过程,由Kent Beck提出

XP(Extreme Programming)强调把它列出的每个方法和思想做到极限、做到最好;其它所不提倡的,XP则一概忽略(如开发前期的整体设计等)。一个严格实施XP的项目,其开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度

32

  • XP策划

28

  • XP设计

29

  • XP编程

30

  • XP测试

31

IXP(行业极限编程)与原来XP的主要差别在于其管理具有更大的包容性,它扩大了用户角色,升级了技术实践

IXP合并了六个新实践

  • 准备评估
  • 项目社区
  • 项目特许
  • 测试驱动管理
  • 回顾
  • 持续学习
  1. 简述Scrum过程流

由Schwaber and Beedle提出:包括了一系列的实践和预定义角色的过程框架(是一种流程、计划、模式,用于有效率地开发软件)

34

35

  • Scrum基本特征

33

迭代开发 - 增量交付 - 自组织团队 - 高优先级的需求驱动

  1. 敏捷过程工具集有哪些?

37

  1. 指导软件工程过程的8条黄金原则

38

39

  1. 指导软件工程实践的8条黄金原则

40

41

  1. 沟通的10条黄金原则

42

43

  1. 策划的10条黄金原则

44

45

  1. 敏捷建模10条黄金原则

46

47

  1. 需求建模原则

需求模型也称分析模型

48

  1. 设计建模原则

49

50

  1. 生存(Living)建模原则

51

52

  1. 详述软件项目管理的4个任务
  • 人员(People):成功的项目中最重要的因素
  • 产品(Product):要构建的软件
  • 过程(Process):完成一项工作所要做的框架活动和软件工程任务的集合
  • 项目(Project):实现一个产品所需要完成的所有工作

53

  1. 软件开发的利益相关者有哪些?

54

  1. 选择软件项目的团队结构的考虑因素

55

  1. 软件范围考虑因素

57

  • 软件项目范围在管理层和技术层都必须是无歧义的和可理解的
  1. 什么是软件过程度量?目的是什么?

59

58

  1. 过程度量相关要素。

60

过程度量规则

61

  1. 软件过程改进框架。

SPI:软件过程改进 - Software Process Improvement

62

  1. 项目度量及其目的

63

  1. 典型的项目度量

64

  1. 面向规模的度量(会算)

度量准则

65

典型的面向规模的度量

66

典型的面向功能的度量

67

  1. 软件质量度量的三层次度量模型

软件质量要素 - 评价准则 - 度量

68

69

  1. 软件的属性有哪些?

可分为功能属性和质量属性

70

  1. 软件项目估算(会算)

对软件工程工作的资源、成本以及进度进行估算时,需要

71

项目估算

72

估算技术

73

估算的准确性

74

  1. CoCoMo模型

经验估算模型之一:构造性成本模型(Constructive Cost Model)

77

基本CoCoMo模型

78

中间CoCoMo模型

79

CoCoMo模型

80

模型实例

81

76

75

  1. 项目进度安排(会排)

进度安排原则

82

工作量和交付时间

83

工作量分配

84

进度跟踪

85

挣值分析

EVA:挣值分析 - Plan Value Analysis

86

  1. 风险分析(熟悉分析过程,会分析)

被动风险管理 vs 主动风险管理

89

七项原则

88

风险管理范型

90

风险识别

91

评估项目风险

92

  1. 风险因素有哪几类

87

  1. 风险识别考虑那几个方面要素?

风险识别

91

风险预测

93

  1. 维护与再工程(软件重构)

软件维护

94

可维护软件

95

软件可支持性

96

再工程

97

业务过程再工程

98

99

100

  1. 软件过程改进(SPI框架的要素)

SPI:软件过程改进 - Software Process Improvement

SPI框架的要素

101

  1. 软件工程的新技术、新趋势(开放性问题)

新兴技术的趋势周期

103

软趋势

105

开放世界的软件

106

过程趋势

107

  1. 技术变更生命周期曲线

技术演变的生命周期

102

新兴技术的趋势周期

104

  1. 画出测试驱动的开发过程

测试驱动的开发

108

  1. 协同开发的关键成功因素
  • 共享目标
  • 共享文化
  • 共享过程
  • 共享责任

109