本書共五篇:第一篇介紹常用工具VS Code、Git 和正則表達式;第二篇以C 語言代碼為例介紹工程化編程的基本方法,涵蓋代碼的風格和規(guī)范、模塊化、可復用、可重入函數(shù)與線程安全等;第三篇介紹從需求分析到軟件設計的基本建模方法——從需求分析開始,以UML 為工具完成用例建模、業(yè)務領域建模、對象交互建模,最終形成設計方案;第四篇探討軟件的元素、結構、特性和描述方法,以及高質量軟件的內(nèi)涵等;第五篇回顧軟件危機的前因后果,并將之與PSP、TSP、CMM/CMMI、敏捷開發(fā)、DevOps 等軟件過程和生命周期管理銜接起來。
本書以國家精品在線開放課程——“工程化編程實戰(zhàn)”為核心內(nèi)容,增加了常用工具、需求分析與建模方法、軟件結構和軟件過程等相關內(nèi)容,內(nèi)容全面、新穎,實踐性強。本書主要針對在校學生編寫,適合開設相關專業(yè)的普通高校和高職院校作為主要教材,也可供不同層次的自學者學習參考。
1.以在線開放課程“工程化編程實戰(zhàn)”為核心內(nèi)容,增加了常用工具、需求分析與建模方法、軟件架構和軟件過程等相關內(nèi)容。
2.作者系中國科學技術大學軟件學院軟件工程10年教學改革的實踐者,具有近20年代碼編程+12年軟件工程教學經(jīng)驗,他的慕課榮獲“國家精品在線開放課程”。
3.本書反其道而行之,以“實用”為原則構成全書體系,從寫代碼的工具著手,逐步深入到模塊化設計、需求建模、設計模式和軟件架構等內(nèi)容,章末設有練習環(huán)節(jié),并提供可下載的配套源代碼文件,讓讀者在做中學,進而從“程序員”修煉成“軟件工程師”。
4. 軟件工程領域劉強、朱少民、鄒欣、陳振宇傾情推薦!
孟寧
中國科學技術大學軟件學院專職教師,主講“高級軟件工程”“ Linux操作系統(tǒng)分析”等課程。
他講授的兩門慕課獲評國家精品在開放課程和本科課程,入選華為“智能基座”精品慕課,被中國高校計算機教育MOOC聯(lián)盟評為優(yōu)秀課程,榮獲安徽省教學成果獎二等獎,等等。在線課程視頻在讀行學、網(wǎng)易云課堂、學堂在線、B站等在線平臺的累計學員達20余萬人。
他專注于 Linux操作系統(tǒng)、軟件工程、人工智能和區(qū)塊鏈等技術領域,與華為、OPPO、龍芯中科等多家國內(nèi)外企業(yè)和創(chuàng)業(yè)公司有技術合作。
第 一篇 工欲善其事,必先利其器
第 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 簡潔而聚焦的產(chǎn)品定位貫穿始終 4
1.2.2 進程隔離的插件模型是“定海神針” 5
1.2.3 代碼理解和調(diào)試——LSP 和DAP 兩大協(xié)議“厥功至偉” 6
1.2.4 集大成的VS Code 遠程開發(fā)環(huán)境 8
1.3 基于VS Code 的C/C++開發(fā)調(diào)試環(huán)境配置 9
1.3.1 安裝C/C++插件 9
1.3.2 安裝C/C++編譯器和調(diào)試器 10
1.3.3 配置Visual Studio Code 構建任務 11
1.3.4 配置Visual Studio Code 調(diào)試環(huán)境 12
1.4 VS Code 遠程開發(fā)環(huán)境配置 13
1.4.1 VS Code 遠程開發(fā)環(huán)境概述 13
1.4.2 VS Code 遠程開發(fā)環(huán)境Remote-SSH 配置 15
1.4.3 VS Code 遠程開發(fā)環(huán)境Web Remote-code-server 配置 20
本章練習 21
第 2 章 五大場景玩轉Git 22
2.1 Git 分布式版本控制系統(tǒng) 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 查看當前工作區(qū)的狀態(tài) 26
2.2.4 暫存更改的文件 27
2.2.5 把暫存區(qū)里的文件提交到倉庫 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 開發(fā)工作流程 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
第二篇 工程化編程實戰(zhàn)
第4 章 簡約而不簡單——代碼規(guī)范和代碼風格 58
4.1 實驗項目介紹 58
4.2 代碼風格的原則:簡明、易讀、無二義性 61
4.3 編寫高質量代碼的基本方法 66
4.3.1 通過控制結構簡化代碼 66
4.3.2 通過數(shù)據(jù)結構簡化代碼 67
4.3.3 一定要有錯誤處理 68
4.3.4 性能優(yōu)先策略背后隱藏的代價 68
4.3.5 拒絕修修補補,要不斷重構代碼 69
4.3.6 編碼過程中的團隊合作 69
本章練習 69
第5 章 模塊化軟件設計 71
5.1 模塊化思想背后的基本原理 71
5.2 模塊化代碼的基本寫法舉例 72
5.3 傳統(tǒng)單體集中式架構與微服務架構 78
5.4 模塊化軟件設計中的基本方法 80
5.4.1 KISS 原則 80
5.4.2 使用本地化外部接口來提高代碼的適應能力 80
5.4.3 保持設計結構和代碼結構的一致性 81
本章練習 81
第6 章 可復用軟件設計 83
6.1 消費者復用和生產(chǎn)者復用 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 參數(shù)化上下文 99
6.4.2 移除前置條件 99
6.4.3 簡化后置條件 100
本章練習 100
第7 章 可重入函數(shù)與線程安全 103
7.1 線程的基本概念 103
7.2 函數(shù)調(diào)用堆棧 103
7.3 可重入函數(shù) 105
7.4 什么是線程安全 106
7.5 LinkTable 軟件模塊的線程安全分析 108
本章練習 112
第8 章 子系統(tǒng)的工程化 113
8.1 menu 子系統(tǒng)的可復用接口設計 113
8.2 Makefile 工程文件舉例 116
8.3 帶參數(shù)的復雜命令函數(shù)接口的寫法 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 解決了內(nèi)在沖突的需求是高質量的 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 業(yè)務領域建模 136
10.3.1 面向對象分析涉及的基本概念 136
10.3.2 業(yè)務領域建模的基本步驟 137
10.3.3 頭腦風暴的具體做法 138
10.3.4 業(yè)務領域概念分類的方法 139
10.4 關聯(lián)類及其關系數(shù)據(jù)模型 140
10.4.1 關聯(lián)類的基本概念及其UML 類圖 140
10.4.2 關聯(lián)類的面向對象設計與實現(xiàn) 141
10.4.3 關聯(lián)類的關系數(shù)據(jù)模型 142
10.5 關系數(shù)據(jù)的MongoDB 數(shù)據(jù)建模 143
10.5.1 基于文檔的數(shù)據(jù)庫MongoDB 143
10.5.2 一對多關系建模的三種基礎方案 144
10.5.3 幾種反范式設計方法 147
10.5.4 MongoDB 數(shù)據(jù)建?偨Y 150
10.6 軟件業(yè)務概念的原型 150
本章練習 151
第 11 章 從需求分析向軟件設計的過渡 153
11.1 敏捷統(tǒng)一過程 153
11.1.1 瀑布模型 153
11.1.2 統(tǒng)一過程 153
11.1.3 敏捷統(tǒng)一過程的計劃階段 154
11.1.4 敏捷統(tǒng)一過程的增量階段 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 函數(shù)和變量/常量 172
12.1.3 指令和操作數(shù) 173
12.1.4 0 和1 是什么 174
12.2 軟件的基本結構 176
12.2.1 順序結構 176
12.2.2 分支結構 176
12.2.3 循環(huán)結構 178
12.2.4 函數(shù)調(diào)用框架 179
12.2.5 繼承和對象組合 180
12.3 軟件中的一些特殊機制 181
12.3.1 回調(diào)函數(shù) 181
12.3.2 多態(tài) 182
12.3.3 閉包 183
12.3.4 異步調(diào)用 184
12.3.5 匿名函數(shù) 185
12.4 軟件的內(nèi)在特性 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 軟件設計模式的優(yōu)點 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 發(fā)布/訂閱 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 執(zhí)行視圖 223
15.3.5 實現(xiàn)視圖 223
15.3.6 部署視圖 223
15.3.7 工作分配視圖 223
本章練習 224
第 16 章 什么是高質量軟件 225
16.1 軟件質量的3 種視角 225
16.1.1 軟件質量的含義 225
16.1.2 產(chǎn)品視角下的軟件質量 225
16.1.3 過程視角下的軟件質量 228
16.1.4 價值視角下的軟件質量 229
16.2 幾種重要的軟件質量屬性 230
16.2.1 易于修改維護 230
16.2.2 良好的性能表現(xiàn) 231
16.2.3 安全性 231
16.2.4 可靠性 231
16.2.5 健壯性 232
16.2.6 易用性 232
16.2.7 商業(yè)目標 232
本章練習 234
第五篇 軟件危機的前生后世
第 17 章 軟件危機概述 236
17.1 軟件危機產(chǎn)生的背景 236
17.2 軟件危機的主要表現(xiàn)及根源 237
17.3 有關軟件危機的爭論 238
本章練習 239
第 18 章 軟件過程模型 240
18.1 軟件的生命周期概述 240
18.2 瀑布模型 241
18.3 原型化的瀑布模型 242
18.4 V 模型 243
18.5 分階段的增量和迭代開發(fā)過程 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 的主要內(nèi)容 256
20.4 CMMI 的評估過程 257
本章練習 257
第 21 章 敏捷方法 258
21.1 敏捷方法產(chǎn)生的背景 258
21.2 敏捷軟件開發(fā)宣言及所遵循的原則 258
21.3 Scrum 敏捷開發(fā)方法 259
本章練習 263
第 22 章 DevOps 265
22.1 什么是DevOps . 265
22.2 DevOps 和敏捷方法 266
22.3 DevOps 和精益原則 266
22.4 DevOps 和全棧自動化 267
本章練習 269
測驗題 270