本書共五篇:第一篇介紹常用工具VS Code、Git 和正則表達(dá)式;第二篇以C 語言代碼為例介紹工程化編程的基本方法,涵蓋代碼的風(fēng)格和規(guī)范、模塊化、可復(fù)用、可重入函數(shù)與線程安全等;第三篇介紹從需求分析到軟件設(shè)計的基本建模方法——從需求分析開始,以UML 為工具完成用例建模、業(yè)務(wù)領(lǐng)域建模、對象交互建模,最終形成設(shè)計方案;第四篇探討軟件的元素、結(jié)構(gòu)、特性和描述方法,以及高質(zhì)量軟件的內(nèi)涵等;第五篇回顧軟件危機(jī)的前因后果,并將之與PSP、TSP、CMM/CMMI、敏捷開發(fā)、DevOps 等軟件過程和生命周期管理銜接起來。
本書以國家精品在線開放課程——“工程化編程實戰(zhàn)”為核心內(nèi)容,增加了常用工具、需求分析與建模方法、軟件結(jié)構(gòu)和軟件過程等相關(guān)內(nèi)容,內(nèi)容全面、新穎,實踐性強(qiáng)。本書主要針對在校學(xué)生編寫,適合開設(shè)相關(guān)專業(yè)的普通高校和高職院校作為主要教材,也可供不同層次的自學(xué)者學(xué)習(xí)參考。
1.以在線開放課程“工程化編程實戰(zhàn)”為核心內(nèi)容,增加了常用工具、需求分析與建模方法、軟件架構(gòu)和軟件過程等相關(guān)內(nèi)容。
2.作者系中國科學(xué)技術(shù)大學(xué)軟件學(xué)院軟件工程10年教學(xué)改革的實踐者,具有近20年代碼編程+12年軟件工程教學(xué)經(jīng)驗,他的慕課榮獲“國家精品在線開放課程”。
3.本書反其道而行之,以“實用”為原則構(gòu)成全書體系,從寫代碼的工具著手,逐步深入到模塊化設(shè)計、需求建模、設(shè)計模式和軟件架構(gòu)等內(nèi)容,章末設(shè)有練習(xí)環(huán)節(jié),并提供可下載的配套源代碼文件,讓讀者在做中學(xué),進(jìn)而從“程序員”修煉成“軟件工程師”。
4. 軟件工程領(lǐng)域劉強(qiáng)、朱少民、鄒欣、陳振宇傾情推薦!
孟寧
中國科學(xué)技術(shù)大學(xué)軟件學(xué)院專職教師,主講“高級軟件工程”“ Linux操作系統(tǒng)分析”等課程。
他講授的兩門慕課獲評國家精品在開放課程和本科課程,入選華為“智能基座”精品慕課,被中國高校計算機(jī)教育MOOC聯(lián)盟評為優(yōu)秀課程,榮獲安徽省教學(xué)成果獎二等獎,等等。在線課程視頻在讀行學(xué)、網(wǎng)易云課堂、學(xué)堂在線、B站等在線平臺的累計學(xué)員達(dá)20余萬人。
他專注于 Linux操作系統(tǒng)、軟件工程、人工智能和區(qū)塊鏈等技術(shù)領(lǐng)域,與華為、OPPO、龍芯中科等多家國內(nèi)外企業(yè)和創(chuàng)業(yè)公司有技術(shù)合作。
第 一篇 工欲善其事,必先利其器
第 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 進(jìn)程隔離的插件模型是“定海神針” 5
1.2.3 代碼理解和調(diào)試——LSP 和DAP 兩大協(xié)議“厥功至偉” 6
1.2.4 集大成的VS Code 遠(yuǎn)程開發(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 構(gòu)建任務(wù) 11
1.3.4 配置Visual Studio Code 調(diào)試環(huán)境 12
1.4 VS Code 遠(yuǎn)程開發(fā)環(huán)境配置 13
1.4.1 VS Code 遠(yuǎn)程開發(fā)環(huán)境概述 13
1.4.2 VS Code 遠(yuǎn)程開發(fā)環(huán)境Remote-SSH 配置 15
1.4.3 VS Code 遠(yuǎn)程開發(fā)環(huán)境Web Remote-code-server 配置 20
本章練習(xí) 21
第 2 章 五大場景玩轉(zhuǎn)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 查看當(dāng)前工作區(qū)的狀態(tài) 26
2.2.4 暫存更改的文件 27
2.2.5 把暫存區(qū)里的文件提交到倉庫 28
2.2.6 Git 本地版本庫的基本用法參考 30
2.3 場景二:Git 遠(yuǎn)程版本庫的基本用法 31
2.3.1 克隆遠(yuǎn)程版本庫 31
2.3.2 遠(yuǎn)程版本庫的基本命令簡介 31
2.3.3 Git 遠(yuǎn)程版本庫的基本用法參考 32
2.4 Git 背后的設(shè)計理念 34
2.5 場景三:團(tuán)隊項目中的分叉合并 36
2.5.1 團(tuán)隊項目的一個參考工作流程 36
2.5.2 分支的基本用法 36
2.5.3 團(tuán)隊項目工作流程參考 39
2.6 場景四:Git Rebase 整理提交記錄 40
2.7 場景五:Fork + Pull request 開發(fā)工作流程 43
本章練習(xí) 46
第3 章 正則表達(dá)式十步通關(guān) 48
3.1 為什么使用正則表達(dá)式 48
3.2 第 一關(guān):基本的字符串搜索方法 49
3.3 第二關(guān):同時搜索多個字符串的方法 50
3.4 第三關(guān):在匹配字符串時的大小寫問題 50
3.5 第四關(guān):通配符的基本用法 51
3.6 第五關(guān):匹配具有多種可能性的字符集 52
3.7 第六關(guān):貪婪匹配和懶惰匹配 53
3.8 第七關(guān):一些特殊位置和特殊字符 53
3.9 第八關(guān):使用捕獲組復(fù)用模式 54
3.10 第九關(guān):基本的字符串搜索替換方法 54
3.11 第十關(guān):在替換中使用捕獲組復(fù)用模式 55
本章練習(xí) 56
第二篇 工程化編程實戰(zhàn)
第4 章 簡約而不簡單——代碼規(guī)范和代碼風(fēng)格 58
4.1 實驗項目介紹 58
4.2 代碼風(fēng)格的原則:簡明、易讀、無二義性 61
4.3 編寫高質(zhì)量代碼的基本方法 66
4.3.1 通過控制結(jié)構(gòu)簡化代碼 66
4.3.2 通過數(shù)據(jù)結(jié)構(gòu)簡化代碼 67
4.3.3 一定要有錯誤處理 68
4.3.4 性能優(yōu)先策略背后隱藏的代價 68
4.3.5 拒絕修修補補,要不斷重構(gòu)代碼 69
4.3.6 編碼過程中的團(tuán)隊合作 69
本章練習(xí) 69
第5 章 模塊化軟件設(shè)計 71
5.1 模塊化思想背后的基本原理 71
5.2 模塊化代碼的基本寫法舉例 72
5.3 傳統(tǒng)單體集中式架構(gòu)與微服務(wù)架構(gòu) 78
5.4 模塊化軟件設(shè)計中的基本方法 80
5.4.1 KISS 原則 80
5.4.2 使用本地化外部接口來提高代碼的適應(yīng)能力 80
5.4.3 保持設(shè)計結(jié)構(gòu)和代碼結(jié)構(gòu)的一致性 81
本章練習(xí) 81
第6 章 可復(fù)用軟件設(shè)計 83
6.1 消費者復(fù)用和生產(chǎn)者復(fù)用 83
6.2 接口的基本概念 83
6.2.1 軟件模塊接口舉例 84
6.2.2 微服務(wù)接口舉例 86
6.2.3 接口與耦合度之間的關(guān)系 88
6.2.4 同步接口和異步接口 88
6.3 可復(fù)用軟件模塊的接口設(shè)計示例 89
6.3.1 通用LinkTable 模塊的接口設(shè)計 89
6.3.2 給LinkTable 增加Callback 方式的接口 95
6.3.3 進(jìn)一步改進(jìn)LinkTable 的Callback 方式的接口 97
6.4 通用接口定義的基本方法 99
6.4.1 參數(shù)化上下文 99
6.4.2 移除前置條件 99
6.4.3 簡化后置條件 100
本章練習(xí) 100
第7 章 可重入函數(shù)與線程安全 103
7.1 線程的基本概念 103
7.2 函數(shù)調(diào)用堆棧 103
7.3 可重入函數(shù) 105
7.4 什么是線程安全 106
7.5 LinkTable 軟件模塊的線程安全分析 108
本章練習(xí) 112
第8 章 子系統(tǒng)的工程化 113
8.1 menu 子系統(tǒng)的可復(fù)用接口設(shè)計 113
8.2 Makefile 工程文件舉例 116
8.3 帶參數(shù)的復(fù)雜命令函數(shù)接口的寫法 117
8.4 看待軟件質(zhì)量的幾個不同角度 118
8.5 編程的基本方法和原則 119
本章練習(xí) 120
第三篇 需求分析和軟件設(shè)計
第9 章 獲取需求的主要方法 122
9.1 什么是需求 122
9.2 為什么需求非常重要 122
9.3 有哪些類型的需求 123
9.4 有哪些和需求相關(guān)的人員 123
9.5 獲取需求的主要方法 124
9.6 高質(zhì)量的需求是什么樣子 124
9.6.1 便于驗證的需求是高質(zhì)量的 124
9.6.2 解決了內(nèi)在沖突的需求是高質(zhì)量的 124
9.6.3 高質(zhì)量需求的典型特征 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
本章練習(xí) 130
第 10 章 對需求進(jìn)行分析和建模 131
10.1 原型化方法和建模的方法 131
10.2 用例建模 131
10.2.1 什么是用例 131
10.2.2 用例的三個抽象層級 132
10.2.3 用例建模的基本步驟 133
10.2.4 準(zhǔn)確提取用例的基本方法 134
10.2.5 用例圖的基本畫法 135
10.3 業(yè)務(wù)領(lǐng)域建模 136
10.3.1 面向?qū)ο蠓治錾婕暗幕靖拍? 136
10.3.2 業(yè)務(wù)領(lǐng)域建模的基本步驟 137
10.3.3 頭腦風(fēng)暴的具體做法 138
10.3.4 業(yè)務(wù)領(lǐng)域概念分類的方法 139
10.4 關(guān)聯(lián)類及其關(guān)系數(shù)據(jù)模型 140
10.4.1 關(guān)聯(lián)類的基本概念及其UML 類圖 140
10.4.2 關(guān)聯(lián)類的面向?qū)ο笤O(shè)計與實現(xiàn) 141
10.4.3 關(guān)聯(lián)類的關(guān)系數(shù)據(jù)模型 142
10.5 關(guān)系數(shù)據(jù)的MongoDB 數(shù)據(jù)建模 143
10.5.1 基于文檔的數(shù)據(jù)庫MongoDB 143
10.5.2 一對多關(guān)系建模的三種基礎(chǔ)方案 144
10.5.3 幾種反范式設(shè)計方法 147
10.5.4 MongoDB 數(shù)據(jù)建?偨Y(jié) 150
10.6 軟件業(yè)務(wù)概念的原型 150
本章練習(xí) 151
第 11 章 從需求分析向軟件設(shè)計的過渡 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 找出關(guān)鍵步驟進(jìn)行劇情描述 156
11.2.3 將劇情描述轉(zhuǎn)換成劇情描述表 158
11.2.4 將劇情描述表轉(zhuǎn)換成時序圖 158
11.2.5 從分析時序圖到設(shè)計時序圖 161
11.2.6 完整的“借書”用例對象交互建模 163
11.3 形成軟件設(shè)計方案 164
11.3.1 設(shè)計類圖和分析類圖 164
11.3.2 形成設(shè)計類圖的基本步驟 165
11.3.3 形成軟件設(shè)計方案的整體思路 169
本章練習(xí) 170
第四篇 軟件科學(xué)基礎(chǔ)概論
第 12 章 軟件是什么 172
12.1 軟件的基本構(gòu)成元素 172
12.1.1 對象 172
12.1.2 函數(shù)和變量/常量 172
12.1.3 指令和操作數(shù) 173
12.1.4 0 和1 是什么 174
12.2 軟件的基本結(jié)構(gòu) 176
12.2.1 順序結(jié)構(gòu) 176
12.2.2 分支結(jié)構(gòu) 176
12.2.3 循環(huán)結(jié)構(gòu) 178
12.2.4 函數(shù)調(diào)用框架 179
12.2.5 繼承和對象組合 180
12.3 軟件中的一些特殊機(jī)制 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 前所未有的復(fù)雜度 186
12.4.2 抽象思維和邏輯思維 186
12.4.3 唯一不變的就是變化本身 187
12.4.4 難以達(dá)成的概念完整性和一致性 188
本章練習(xí) 188
第 13 章 軟件設(shè)計模式 190
13.1 什么是設(shè)計模式 190
13.1.1 軟件設(shè)計模式的優(yōu)點 190
13.1.2 軟件設(shè)計模式的含義和構(gòu)成 191
13.2 軟件設(shè)計模式的分類 191
13.3 常用的軟件設(shè)計模式 192
13.4 觀察者模式舉例 196
13.5 軟件設(shè)計模式背后的設(shè)計原則 200
13.5.1 開閉原則 200
13.5.2 麗斯科夫替換原則 200
13.5.3 依賴倒置原則 200
13.5.4 單一職責(zé)原則 201
13.5.5 德米特法則 201
13.5.6 合成復(fù)用原則 201
13.5.7 反思軟件設(shè)計模式的根基 202
本章練習(xí) 202
第 14 章 軟件架構(gòu)舉例 204
14.1 三層架構(gòu) 204
14.2 MVC 架構(gòu) 204
14.2.1 什么是MVC 204
14.2.2 MVC 模式 205
14.2.3 MVC 架構(gòu) 207
14.3 MVVM 架構(gòu) 208
14.3.1 什么是MVVM 208
14.3.2 Vue.js 的基本用法 209
14.3.3 Vue.js 背后的MVVM 211
本章練習(xí) 216
第 15 章 軟件架構(gòu)風(fēng)格與描述方法 217
15.1 構(gòu)建軟件架構(gòu)的基本方法 217
15.2 軟件架構(gòu)風(fēng)格與策略 218
15.2.1 管道-過濾器 218
15.2.2 客戶-服務(wù)器 219
15.2.3 P2P 219
15.2.4 發(fā)布/訂閱 219
15.2.5 CRUD 220
15.2.6 層次化 221
15.3 軟件架構(gòu)的描述方法 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
本章練習(xí) 224
第 16 章 什么是高質(zhì)量軟件 225
16.1 軟件質(zhì)量的3 種視角 225
16.1.1 軟件質(zhì)量的含義 225
16.1.2 產(chǎn)品視角下的軟件質(zhì)量 225
16.1.3 過程視角下的軟件質(zhì)量 228
16.1.4 價值視角下的軟件質(zhì)量 229
16.2 幾種重要的軟件質(zhì)量屬性 230
16.2.1 易于修改維護(hù) 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è)目標(biāo) 232
本章練習(xí) 234
第五篇 軟件危機(jī)的前生后世
第 17 章 軟件危機(jī)概述 236
17.1 軟件危機(jī)產(chǎn)生的背景 236
17.2 軟件危機(jī)的主要表現(xiàn)及根源 237
17.3 有關(guān)軟件危機(jī)的爭論 238
本章練習(xí) 239
第 18 章 軟件過程模型 240
18.1 軟件的生命周期概述 240
18.2 瀑布模型 241
18.3 原型化的瀑布模型 242
18.4 V 模型 243
18.5 分階段的增量和迭代開發(fā)過程 243
18.6 螺旋模型 244
本章練習(xí) 245
第 19 章 PSP 和TSP 246
19.1 個體和團(tuán)隊 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 團(tuán)隊軟件過程 250
19.3.1 團(tuán)隊概述 250
19.3.2 TSP 概述 251
19.3.3 TSP 的基本原理 251
19.3.4 TSP 的基本工作方法 252
本章練習(xí) 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
本章練習(xí) 257
第 21 章 敏捷方法 258
21.1 敏捷方法產(chǎn)生的背景 258
21.2 敏捷軟件開發(fā)宣言及所遵循的原則 258
21.3 Scrum 敏捷開發(fā)方法 259
本章練習(xí) 263
第 22 章 DevOps 265
22.1 什么是DevOps . 265
22.2 DevOps 和敏捷方法 266
22.3 DevOps 和精益原則 266
22.4 DevOps 和全棧自動化 267
本章練習(xí) 269
測驗題 270