本书共五篇:第一篇介绍常用工具VS Code、Git 和正则表达式;第二篇以C 语言代码为例介绍工程化编程的基本方法,涵盖代码的风格和规范、模块化、可复用、可重入函数与线程安全等;第三篇介绍从需求分析到软件设计的基本建模方法——从需求分析开始,以UML 为工具完成用例建模、业务领域建模、对象交互建模,最终形成设计方案;第四篇探讨软件的元素、结构、特性和描述方法,以及高质量软件的内涵等;第五篇回顾软件危机的前因后果,并将之与PSP、TSP、CMM/CMMI、敏捷开发、DevOps 等软件过程和生命周期管理衔接起来。
本书以国家精品在线开放课程——“工程化编程实战”为核心内容,增加了常用工具、需求分析与建模方法、软件结构和软件过程等相关内容,内容全面、新颖,实践性强。本书主要针对在校学生编写,适合开设相关专业的普通高校和高职院校作为主要教材,也可供不同层次的自学者学习参考。
1.以在线开放课程“工程化编程实战”为核心内容,增加了常用工具、需求分析与建模方法、软件架构和软件过程等相关内容。
2.作者系中国科学技术大学软件学院软件工程10年教学改革的实践者,具有近20年代码编程+12年软件工程教学经验,他的慕课荣获“国家精品在线开放课程”。
3.本书反其道而行之,以“实用”为原则构成全书体系,从写代码的工具着手,逐步深入到模块化设计、需求建模、设计模式和软件架构等内容,章末设有练习环节,并提供可下载的配套源代码文件,让读者在做中学,进而从“程序员”修炼成“软件工程师”。
4. 软件工程领域刘强、朱少民、邹欣、陈振宇倾情推荐!
孟宁
中国科学技术大学软件学院专职教师,主讲“高级软件工程”“ Linux操作系统分析”等课程。
他讲授的两门慕课获评国家精品在开放课程和本科课程,入选华为“智能基座”精品慕课,被中国高校计算机教育MOOC联盟评为优秀课程,荣获安徽省教学成果奖二等奖,等等。在线课程视频在读行学、网易云课堂、学堂在线、B站等在线平台的累计学员达20余万人。
他专注于 Linux操作系统、软件工程、人工智能和区块链等技术领域,与华为、OPPO、龙芯中科等多家国内外企业和创业公司有技术合作。
第 一篇 工欲善其事,必先利其器
第 1 章 编程“神器”Visual Studio Code 2
1.1 Visual Studio Code 的安装和基本用法 2
1.1.1 下载和安装Visual Studio Code 2
1.1.2 VS Code 界面概览 2
1.1.3 VS Code 的基本配置 3
1.1.4 VS Code 的基本用法 3
1.2 VS Code 为什么能这么牛 4
1.2.1 简洁而聚焦的产品定位贯穿始终 4
1.2.2 进程隔离的插件模型是“定海神针” 5
1.2.3 代码理解和调试——LSP 和DAP 两大协议“厥功至伟” 6
1.2.4 集大成的VS Code 远程开发环境 8
1.3 基于VS Code 的C/C++开发调试环境配置 9
1.3.1 安装C/C++插件 9
1.3.2 安装C/C++编译器和调试器 10
1.3.3 配置Visual Studio Code 构建任务 11
1.3.4 配置Visual Studio Code 调试环境 12
1.4 VS Code 远程开发环境配置 13
1.4.1 VS Code 远程开发环境概述 13
1.4.2 VS Code 远程开发环境Remote-SSH 配置 15
1.4.3 VS Code 远程开发环境Web Remote-code-server 配置 20
本章练习 21
第 2 章 五大场景玩转Git 22
2.1 Git 分布式版本控制系统 22
2.1.1 版本控制概述 22
2.1.2 Git 的历史 22
2.1.3 Git 的基本操作 23
2.2 场景一:Git 本地版本库的基本用法 25
2.2.1 安装Git 25
2.2.2 初始化一个本地版本库 25
2.2.3 查看当前工作区的状态 26
2.2.4 暂存更改的文件 27
2.2.5 把暂存区里的文件提交到仓库 28
2.2.6 Git 本地版本库的基本用法参考 30
2.3 场景二:Git 远程版本库的基本用法 31
2.3.1 克隆远程版本库 31
2.3.2 远程版本库的基本命令简介 31
2.3.3 Git 远程版本库的基本用法参考 32
2.4 Git 背后的设计理念 34
2.5 场景三:团队项目中的分叉合并 36
2.5.1 团队项目的一个参考工作流程 36
2.5.2 分支的基本用法 36
2.5.3 团队项目工作流程参考 39
2.6 场景四:Git Rebase 整理提交记录 40
2.7 场景五:Fork + Pull request 开发工作流程 43
本章练习 46
第3 章 正则表达式十步通关 48
3.1 为什么使用正则表达式 48
3.2 第 一关:基本的字符串搜索方法 49
3.3 第二关:同时搜索多个字符串的方法 50
3.4 第三关:在匹配字符串时的大小写问题 50
3.5 第四关:通配符的基本用法 51
3.6 第五关:匹配具有多种可能性的字符集 52
3.7 第六关:贪婪匹配和懒惰匹配 53
3.8 第七关:一些特殊位置和特殊字符 53
3.9 第八关:使用捕获组复用模式 54
3.10 第九关:基本的字符串搜索替换方法 54
3.11 第十关:在替换中使用捕获组复用模式 55
本章练习 56
第二篇 工程化编程实战
第4 章 简约而不简单——代码规范和代码风格 58
4.1 实验项目介绍 58
4.2 代码风格的原则:简明、易读、无二义性 61
4.3 编写高质量代码的基本方法 66
4.3.1 通过控制结构简化代码 66
4.3.2 通过数据结构简化代码 67
4.3.3 一定要有错误处理 68
4.3.4 性能优先策略背后隐藏的代价 68
4.3.5 拒绝修修补补,要不断重构代码 69
4.3.6 编码过程中的团队合作 69
本章练习 69
第5 章 模块化软件设计 71
5.1 模块化思想背后的基本原理 71
5.2 模块化代码的基本写法举例 72
5.3 传统单体集中式架构与微服务架构 78
5.4 模块化软件设计中的基本方法 80
5.4.1 KISS 原则 80
5.4.2 使用本地化外部接口来提高代码的适应能力 80
5.4.3 保持设计结构和代码结构的一致性 81
本章练习 81
第6 章 可复用软件设计 83
6.1 消费者复用和生产者复用 83
6.2 接口的基本概念 83
6.2.1 软件模块接口举例 84
6.2.2 微服务接口举例 86
6.2.3 接口与耦合度之间的关系 88
6.2.4 同步接口和异步接口 88
6.3 可复用软件模块的接口设计示例 89
6.3.1 通用LinkTable 模块的接口设计 89
6.3.2 给LinkTable 增加Callback 方式的接口 95
6.3.3 进一步改进LinkTable 的Callback 方式的接口 97
6.4 通用接口定义的基本方法 99
6.4.1 参数化上下文 99
6.4.2 移除前置条件 99
6.4.3 简化后置条件 100
本章练习 100
第7 章 可重入函数与线程安全 103
7.1 线程的基本概念 103
7.2 函数调用堆栈 103
7.3 可重入函数 105
7.4 什么是线程安全 106
7.5 LinkTable 软件模块的线程安全分析 108
本章练习 112
第8 章 子系统的工程化 113
8.1 menu 子系统的可复用接口设计 113
8.2 Makefile 工程文件举例 116
8.3 带参数的复杂命令函数接口的写法 117
8.4 看待软件质量的几个不同角度 118
8.5 编程的基本方法和原则 119
本章练习 120
第三篇 需求分析和软件设计
第9 章 获取需求的主要方法 122
9.1 什么是需求 122
9.2 为什么需求非常重要 122
9.3 有哪些类型的需求 123
9.4 有哪些和需求相关的人员 123
9.5 获取需求的主要方法 124
9.6 高质量的需求是什么样子 124
9.6.1 便于验证的需求是高质量的 124
9.6.2 解决了内在冲突的需求是高质量的 124
9.6.3 高质量需求的典型特征 125
9.7 绘图工具VS Code 和draw.io 125
9.7.1 在线绘图工具draw.io 125
9.7.2 安装draw.io 插件 126
9.7.3 快速入门VS Code+draw.io 画图 127
本章练习 130
第 10 章 对需求进行分析和建模 131
10.1 原型化方法和建模的方法 131
10.2 用例建模 131
10.2.1 什么是用例 131
10.2.2 用例的三个抽象层级 132
10.2.3 用例建模的基本步骤 133
10.2.4 准确提取用例的基本方法 134
10.2.5 用例图的基本画法 135
10.3 业务领域建模 136
10.3.1 面向对象分析涉及的基本概念 136
10.3.2 业务领域建模的基本步骤 137
10.3.3 头脑风暴的具体做法 138
10.3.4 业务领域概念分类的方法 139
10.4 关联类及其关系数据模型 140
10.4.1 关联类的基本概念及其UML 类图 140
10.4.2 关联类的面向对象设计与实现 141
10.4.3 关联类的关系数据模型 142
10.5 关系数据的MongoDB 数据建模 143
10.5.1 基于文档的数据库MongoDB 143
10.5.2 一对多关系建模的三种基础方案 144
10.5.3 几种反范式设计方法 147
10.5.4 MongoDB 数据建模总结 150
10.6 软件业务概念的原型 150
本章练习 151
第 11 章 从需求分析向软件设计的过渡 153
11.1 敏捷统一过程 153
11.1.1 瀑布模型 153
11.1.2 统一过程 153
11.1.3 敏捷统一过程的计划阶段 154
11.1.4 敏捷统一过程的增量阶段 154
11.2 对象交互建模 155
11.2.1 对象交互建模的基本步骤 155
11.2.2 找出关键步骤进行剧情描述 156
11.2.3 将剧情描述转换成剧情描述表 158
11.2.4 将剧情描述表转换成时序图 158
11.2.5 从分析时序图到设计时序图 161
11.2.6 完整的“借书”用例对象交互建模 163
11.3 形成软件设计方案 164
11.3.1 设计类图和分析类图 164
11.3.2 形成设计类图的基本步骤 165
11.3.3 形成软件设计方案的整体思路 169
本章练习 170
第四篇 软件科学基础概论
第 12 章 软件是什么 172
12.1 软件的基本构成元素 172
12.1.1 对象 172
12.1.2 函数和变量/常量 172
12.1.3 指令和操作数 173
12.1.4 0 和1 是什么 174
12.2 软件的基本结构 176
12.2.1 顺序结构 176
12.2.2 分支结构 176
12.2.3 循环结构 178
12.2.4 函数调用框架 179
12.2.5 继承和对象组合 180
12.3 软件中的一些特殊机制 181
12.3.1 回调函数 181
12.3.2 多态 182
12.3.3 闭包 183
12.3.4 异步调用 184
12.3.5 匿名函数 185
12.4 软件的内在特性 186
12.4.1 前所未有的复杂度 186
12.4.2 抽象思维和逻辑思维 186
12.4.3 唯一不变的就是变化本身 187
12.4.4 难以达成的概念完整性和一致性 188
本章练习 188
第 13 章 软件设计模式 190
13.1 什么是设计模式 190
13.1.1 软件设计模式的优点 190
13.1.2 软件设计模式的含义和构成 191
13.2 软件设计模式的分类 191
13.3 常用的软件设计模式 192
13.4 观察者模式举例 196
13.5 软件设计模式背后的设计原则 200
13.5.1 开闭原则 200
13.5.2 丽斯科夫替换原则 200
13.5.3 依赖倒置原则 200
13.5.4 单一职责原则 201
13.5.5 德米特法则 201
13.5.6 合成复用原则 201
13.5.7 反思软件设计模式的根基 202
本章练习 202
第 14 章 软件架构举例 204
14.1 三层架构 204
14.2 MVC 架构 204
14.2.1 什么是MVC 204
14.2.2 MVC 模式 205
14.2.3 MVC 架构 207
14.3 MVVM 架构 208
14.3.1 什么是MVVM 208
14.3.2 Vue.js 的基本用法 209
14.3.3 Vue.js 背后的MVVM 211
本章练习 216
第 15 章 软件架构风格与描述方法 217
15.1 构建软件架构的基本方法 217
15.2 软件架构风格与策略 218
15.2.1 管道-过滤器 218
15.2.2 客户-服务器 219
15.2.3 P2P 219
15.2.4 发布/订阅 219
15.2.5 CRUD 220
15.2.6 层次化 221
15.3 软件架构的描述方法 221
15.3.1 分解视图 221
15.3.2 依赖视图 222
15.3.3 泛化视图 222
15.3.4 执行视图 223
15.3.5 实现视图 223
15.3.6 部署视图 223
15.3.7 工作分配视图 223
本章练习 224
第 16 章 什么是高质量软件 225
16.1 软件质量的3 种视角 225
16.1.1 软件质量的含义 225
16.1.2 产品视角下的软件质量 225
16.1.3 过程视角下的软件质量 228
16.1.4 价值视角下的软件质量 229
16.2 几种重要的软件质量属性 230
16.2.1 易于修改维护 230
16.2.2 良好的性能表现 231
16.2.3 安全性 231
16.2.4 可靠性 231
16.2.5 健壮性 232
16.2.6 易用性 232
16.2.7 商业目标 232
本章练习 234
第五篇 软件危机的前生后世
第 17 章 软件危机概述 236
17.1 软件危机产生的背景 236
17.2 软件危机的主要表现及根源 237
17.3 有关软件危机的争论 238
本章练习 239
第 18 章 软件过程模型 240
18.1 软件的生命周期概述 240
18.2 瀑布模型 241
18.3 原型化的瀑布模型 242
18.4 V 模型 243
18.5 分阶段的增量和迭代开发过程 243
18.6 螺旋模型 244
本章练习 245
第 19 章 PSP 和TSP 246
19.1 个体和团队 246
19.2 个体软件过程 246
19.2.1 PSP 0 247
19.2.2 PSP 0.1 247
19.2.3 PSP 1 247
19.2.4 PSP 1.1 248
19.2.5 PSP 2 248
19.2.6 PSP 2.1 249
19.2.7 PSP 3 250
19.3 团队软件过程 250
19.3.1 团队概述 250
19.3.2 TSP 概述 251
19.3.3 TSP 的基本原理 251
19.3.4 TSP 的基本工作方法 252
本章练习 253
第 20 章 CMM/CMMI 254
20.1 CMM/CMMI 简介 254
20.2 CMM/CMMI 的作用 255
20.3 CMM/CMMI 的主要内容 256
20.4 CMMI 的评估过程 257
本章练习 257
第 21 章 敏捷方法 258
21.1 敏捷方法产生的背景 258
21.2 敏捷软件开发宣言及所遵循的原则 258
21.3 Scrum 敏捷开发方法 259
本章练习 263
第 22 章 DevOps 265
22.1 什么是DevOps . 265
22.2 DevOps 和敏捷方法 266
22.3 DevOps 和精益原则 266
22.4 DevOps 和全栈自动化 267
本章练习 269
测验题 270