软件工程——理论与实践

软件工程——理论与实践

作 者毛新军 董威
单 位国防科技大学
内容提要
本书是计算机领域本科教育教学改革试点工作(“101计划”)系列教材之一。本书系统介绍软件工程基础理论和技术,包括软件过程、开发方法和支撑工具,涵盖需求、分析、设计、编码、测试、部署、维护、演化和管理等。 全书分为6部分,共16章。第一部分基础篇(第1~3章),介绍软件工程的基本概念和思想、常见的软件过程及主流的软件开发方法。第二部分需求篇(第4~6章),介绍构思、获取、分析、建模和文档化软件需求的过程、策略、方法、语言、工具以及相应的软件制品及其质量保证。第三部分设计篇(第7~10章),介绍软件体系结构设计、用户界面设计和详细设计的过程、策略、方法、语言、工具以及相应的软件制品及其质量保证。第四部分实现篇(第11~13章),介绍程序编码和软件测试的过程、策略、技术、工具以及相应的软件制品及其质量保证。第五部分运维篇(第14~15章),介绍软件部署、运行、维护和演化的策略、方法以及相应的软件制品及其质量保证。第六部分管理篇(第16章),介绍软件项目管理的相关内容。本书引入开源软件实践、群体化开发方法、软件部署和演化等新颖内容,通过丰富和完整的软件开发案例以及强化软件开发综合实践,帮助读者深入理解软件工程基础理论知识,熟练掌握软件开发方法和工具,培养多方面的素质和能力。 本书可作为高校计算机大类专业软件工程课程的教材,也可作为研究生相关课程的教材和软件工程师的参考用书。
前言

在计算技术发展的历史进程中观察软件开发技术的发展,可以看到,软件开发面对的挑战一个接着一个,这些挑战推动了软件开发技术的发展,甚至带来了软件开发理念和方法的深刻变革。我们称其为软件开发范式的变革。

我们将软件开发范式的第一次变革称为“工程范式”的形成和发展,由此带来了软件开发由个体创作到规模化生产的变革。计算机程序乃至软件因20世纪40年代通用数字电子计算机的发明而生。早期软硬件规模较小、功能单一且耦合性强,有经验的程序员必须凭大脑记住数据和程序在几KB内存中的布局情况,并且能够在大脑中“跑”明白程序的每一个步骤和细节。这个时期的软件开发就像民间作坊中手艺人的个人创作行为,软件被视为程序设计天才在其私人作坊中创作的精妙作品。到20世纪60年代,随着第二代晶体管计算机和第三代集成电路计算机的巨大成功,大型计算机系统技术成熟,应用范围迅速从军事计算领域扩展到商业和工控等经济领域,社会对于软件的需求量以及软件自身的复杂程度快速增长。与功能单一的小型程序不同,上规模的软件系统往往需求复杂、代码量大且涉及的利益相关者广泛,其程序代码以及开发过程的复杂性已远超出程序员个体大脑所能直接理解与控制的程度,作坊式的个体创作模式根本无法系统性地保障软件开发效率与质量。处于工业化大生产浪潮中的计算机先驱者向经典的工业生产管理学习,于1968年正式提出了“软件工程”的概念,开启了工程范式的探索,软件开发从个体独立创作走向了大规模有组织的生产时代。工程范式强调把大规模的软件开发者按照标准化的生产流程组织起来,并通过生产工具促使软件开发活动尽可能标准化与自动化,以利于高效生产出满足客户需求的高质量软件产品。工程范式的成功实践推动了软件产业的发展,沉淀形成了软件开发的工程化理念、方法和技术,成为高校软件工程课程的核心内容。

伴随着互联网的普及,工程范式的局限性日益凸显。这既有来自软件自身的内在因素,也有来自软件发展环境的外部因素。从软件自身的特点规律看,工程范式发展遇到两个瓶颈:第一是协同效率瓶颈,即软件开发过程管理难以突破群体协同的“人月神话”;第二是自动化瓶颈,即软件自动化工具无法超越可计算性和计算复杂性的理论极限。从软件发展的外部环境看,工程范式出现两个不适应:第一是软件的生产效率与计算机硬件的发展速度严重不适应,第二是工程范式的经典原则与迅猛到来的网络时代严重不适应。特别是进入(移动)互联网时代,软件的利益相关者从明确的领域相关的需求主导者转变为动态开放的大规模互联网用户群体,导致软件开发活动不再是需求明确的强目标性活动。在工程范式面临巨大挑战之际,开源软件经过20多年的蓬勃发展,取得了惊人的成就。开源软件创作的成功实践,让“开源范式”进入学术界的视野。相对于标准化、强组织的工程范式而言,开源范式更尊重每位开发者的个体创作意愿,通过营造开放性、多元化、自组织的创作环境,充分激发大规模程序员群体的参与热情与创作灵感,通过群体智慧涌现,最终形成高水平的软件。这样的软件开发过程,我们称为“规模化的软件创作活动”,由此产生的软件制品称为“软件作品”。优秀的开源作品通过互联网可以高效聚集数以万计的开发者参与贡献,其规模远远超过任何单一的商业软件公司。我们将开源软件实践遵循的软件开发理念和方法称为“开源范式”。

我认为,开源范式的价值在于揭示大规模软件创作的可行性。开源范式支持在不确定的网络世界,通过众多的开发者带来丰富变化和竞争,自然演化出得到用户欢迎的软件。以Linux演化历程为例,每个Linux内核的自由“下载者”都可能修改内核,从而产生“变异”并“繁殖”出新的Linux版本,这个过程带来的多样性整体上大大提高了Linux种群基因延续的可能性。Linux通过开源范式带来的易变性和多样性,更能应对互联网时代操作系统发展的不确定性。Linux基因被更多的衍生操作系统继承,从而“家族兴旺、儿孙满堂”,当智能手机、云计算、物联网等新的需求涌现时,Linux的后代就具有更大的竞争力。但是,任何一个开源项目是否能够成功完全不可控,开源出来的代码能否得到关注完全未知,甚至任何一个开放的开发任务什么时候能完成以及是否能完成都无法保证。如果将开源范式和工程范式做比较,工程范式是面向确定性场景下的问题开展有组织的群体开发,聚焦软件产品,强调生产控制,几乎放弃了对不确定性问题的关注。而开源范式则面向开放式场景问题,通过自组织的社区群体,鼓励开展基于兴趣驱动的软件作品自由创作,以多样性促进创新涌现。这种对自由创作的极端追求加剧了群体协同过程的不确定性,几乎无法对结果做出可预期性承诺。那么,如何平衡确定性和不确定性之间的矛盾,进而更有效、可预期地组织软件开发群体智力?特别是面对未来人机物三元融合、万物智能互联的新型计算基础设施和新型应用形态,不确定性可能更为显著。我们需要通过“软件定义”获得确定性,至少缓解不确定性。时代呼唤新的软件开发范式。

软件工程教育的目的在于培养学生的软件开发能力。尽管早期的软件工程课程知识体系来自工程范式的最佳实践,但软件工程课程不等于工程范式,软件工程课程的知识体系必然随软件开发技术的发展而发展。2004年,软件工程教育界提出了以SWEBOK为代表的软件工程学科知识体系以及以SEEK为代表的本科教育体系,并且结合软件开发技术发展对软件工程教育知识体系持续进行拓展和优化。国防科技大学计算机学院在长期的软件工程实践和人才培养中开展软件工程课程建设。由毛新军教授编著的这本教材没有局限于经典工程范式形成的软件工程知识体系,而是努力将开源范式的实践融入其中,并建设了配套的开放实践教学资源。我认为这是本教材最突出的特色。当然,开源范式还没有得到很好的概括并在业界达成广泛共识,需要学术界、产业界、教育界对开源范式以及未来新的软件开发范式给予更多关注和研究。

2021年底,教育部启动了计算机领域本科教育教学改革试点工作计划(简称“101计划”)。我希望本教材能够为该计划的实施以及软件工程课程教学改革提供开源共享的范本,更希望新时代我国计算机领域本科教育体系在开放共享的学习生态中发育成长。

目录

第 1 章 从程序到软件

1.1 何为程序

1.2 程序质量

1.3 程序质量保证方法

1.4 程序质量分析方法

1.5 编写程序需解决的问题

1.6 何为软件

1.7 开源软件

1.8 软件质量

1.9 软件特征的变化

1.10 软件建设的挑战和使命

1.11 本书软件案例

第 2 章 软件工程概述

2.1 软件工程的产生背景

2.2 软件工程的概念和思想

2.3 计算机辅助软件工程

2.4 软件工程视角下的软件开发

2.5 软件工程的发展

2.6 软件工程教育

第 3 章 软件过程模型和开发方法

3.1 软件过程模型

3.2 敏捷方法

3.3 群体化开发方法

第 4 章 软件需求工程基础

4.1 软件需求

4.2 需求工程

4.3 结构化需求分析方法学

4.4 面向对象的需求分析方法学

4.5 需求工程的 CASE 工具

4.6 需求工程的输出和评审

4.7 软件需求变更管理

第 5 章 获取软件需求

5.1 获取软件需求概述

5.2 获取软件需求的过程

5.3 明确问题和基于软件的解决方案

5.4 导出和构思初步软件需求

5.5 描述初步软件需求

5.6 评审初步软件需求

第 6 章 分析软件需求

6.1 分析软件需求概述

6.2 软件需求模型及 UML 表示方法

6.3 分析软件需求的过程

6.4 分析和确定软件需求优先级

6.5 分析和建立软件需求模型

6.6 文档化软件需求

6.7 确认和验证软件需求

第 7 章 软件设计基础

7.1 软件设计

7.2 软件设计的过程和原则

7.3 结构化软件设计方法学

7.4 面向对象的软件设计方法学

7.5 软件设计的 CASE 工具

7.6 软件设计的输出和评审

7.7 软件设计管理

第 8 章 软件体系结构设计

8.1 软件体系结构设计概述

8.2 软件体系结构模型的表示方法

8.3 软件体系结构设计过程

8.4 设计初步的软件体系结构

8.5 重用可用的已有软件资源

8.6 精化软件体系结构设计

8.7 设计软件部署模型

8.8 文档化软件体系结构设计

8.9 评审软件体系结构设计

第 9 章 用户界面设计

9.1 用户界面设计概述

9.2 用户界面组成及表示方法

9.3 用户界面设计的过程和原则

9.4 用户界面的初步设计

9.5 建立用户界面间的跳转关系

9.6 精化用户界面设计

9.7 用户界面设计的输出

9.8 评审用户界面设计

第 10 章 软件详细设计

10.1 软件详细设计概述

10.2 软件详细设计模型及表示方法

10.3 面向对象的软件设计模式

10.4 用例设计

10.5 类设计

10.6 数据设计

10.7 子系统和构件设计

10.8 文档化和评审软件详细设计

第 11 章 软件实现基础

11.1 软件实现概述

11.2 程序设计语言

11.3 高质量编码

11.4 支持软件实现的 CASE 工具

11.5 软件实现的输出

第 12 章 编写代码

12.1 编写代码的任务

12.2 基于软件设计编写代码

12.3 代码片段重用

12.4 软件缺陷

12.5 程序调试

12.6 基于群智知识解决编程和调试问题

12.7 编写代码的输出

第 13 章 软件测试

13.1 软件测试概述

13.2 软件测试的过程和策略

13.3 软件测试技术

13.4 面向对象的软件测试技术

13.5 软件测试计划的制订与实施

13.6 软件测试的输出

第 14 章 软件部署

14.1 软件及其环境

14.2 软件部署的概念和原则

14.3 软件部署方式

14.4 软件部署方法

14.5 支撑软件部署的 CASE 工具

第 15 章 软件维护和演化

15.1 软件维护

15.2 软件演化

15.3 软件逻辑老化问题

15.4 软件维护技术

15.5 软件维护过程

15.6 软件的可维护性

15.7 软件维护的输出

第 16 章 软件项目管理

16.1 软件项目管理概述

16.2 软件度量、测量和估算

16.3 软件项目计划

16.4 软件项目跟踪

16.5 软件配置管理

16.6 软件风险管理

16.7 软件质量保证

16.8 质量管理和过程能力标准

App 下载
关注我们