高質效交付:軟件集成、測試與 發布精進之道

董越 等

  • 出版商: 電子工業
  • 出版日期: 2024-10-01
  • 定價: $600
  • 售價: 8.5$510
  • 語言: 簡體中文
  • 頁數: 344
  • ISBN: 7121489198
  • ISBN-13: 9787121489198
  • 下單後立即進貨 (約4週~6週)

相關主題

商品描述

這是一本介紹軟件交付過程的“科普小冊子”。軟件交付過程是指修改了一行源代碼之後的一系列工作,直到包含這個改動的軟件新版本發布上線。這需要多久?可能需要幾秒,也可能需要數個星期甚至更長的時間。本書介紹在保證一定發布質量的前提下,如何加速這個過程,讓它盡量快一點兒,同時讓我們投入的精力盡量少一點兒。也就是說,本書介紹如何讓軟件交付變得更高效。軟件工程、敏捷、精益、持續集成、持續交付、DevOps、雲原生、研發效能、平臺工程等,都對這個話題有所貢獻。本書並不囿於上述某個特定的“門派”,而是介紹它們的關鍵要點,介紹如何綜合運用它們,並且根據實踐有所發展。

目錄大綱

第1部分 推開軟件交付之門
第1章 軟件交付過程的範圍 2
1.1 修改了源代碼之後 2
1.2 直到改動發布上線 3
1.3 在軟件開發全過程中的位置 4
1.4 為什麽要這麽劃分軟件交付過程 5
第2章 軟件交付過程的內容 6
2.1 程序改動的累積和匯聚 6
2.2 程序形態的轉化 8
2.3 程序質量的提升 10
第3章 軟件交付過程的追求目標 13
3.1 整體目標:為了業務的成功 13
3.2 確定需求:有效率地找到有效需求 14
3.3 從確定需求到實現需求:小步快跑 15
3.4 實現需求:效率與質量 16
3.4.1 體現效率:需求吞吐量 16
3.4.2 體現效率:需求響應時長 17
3.4.3 質量不是越高越好 19
3.4.4 體現質量:問題出現量 19
3.4.5 體現質量:問題修復時長 20
3.4.6 要兼顧短期和長期 20
3.4.7 四個象限簡介 21
3.5 軟件交付過程在四個象限的優化 21
3.5.1 提高需求吞吐量 22
3.5.2 縮短需求響應時長 22
3.5.3 減少問題出現量 23
3.5.4 縮短問題修復時長 24
3.6 DORA的DevOps核心指標 25
第2部分 軟件交付總體過程
第4章 持續集成 28
4.1 什麽是持續集成 28
4.1.1 什麽是持續 28
4.1.2 什麽是集成 29
4.2 為什麽要持續集成 30
4.2.1 小批量,減少等待 30
4.2.2 問題早發現、早修復,代價小 31
4.2.3 頻繁同步以減少沖突 31
4.3 流水線 33
4.3.1 流水線的誕生 33
4.3.2 流水線包含哪些活動 33
4.3.3 流水線的功能 35
第5章 逐特性集成 37
5.1 什麽是特性 37
5.2 什麽是逐特性集成 38
5.3 仍符合持續集成的理念 39
5.4 隔離未完成特性的其他方法 40
5.5 何時不必考慮隔離未完成的特性 41
5.6 當特性做不到既小又獨立時 42
第6章 在集成之前 44
6.1 第四階段:特性改動提交 44
6.1.1 合並請求基礎款:代碼評審 44
6.1.2 合並請求增強款:代碼評審+流水線 45
6.1.3 在創建合並請求之前 47
6.2 第三階段:特性改動累積 48
6.3 第二階段:代碼改動提交 49
6.3.1 代碼改動通過關卡才出現在目標分支 49
6.3.2 在提交時本地自動進行質量把關 50
6.3.3 在提交代碼改動之前 51
6.4 第一階段:代碼改動累積 52
6.4.1 隨時進行的質量保證工作 52
6.4.2 實時進行的質量保證工作 53
6.4.3 IDE 54
第7章 持續交付 55
7.1 什麽是持續交付 55
7.1.1 持續交付是持續集成的延伸 56
7.1.2 持續是適度頻繁 56
7.2 為什麽要持續交付 58
7.3 版本晉級機制 59
7.4 部署流水線 61
7.5 邁向持續部署 63
7.5.1 適當的發布頻率 63
7.5.2 如何提高發布頻率 64
7.5.3 持續部署 65
第8章 特性間進一步解耦 67
8.1 混合自測 67
8.2 特性摘除 68
8.3 混合測試 70
8.4 逐特性交付 73
8.5 特性間解耦方法小結 74
第9章 運用精益思想 76
9.1 限制在製品的數量 76
9.2 優化發布審批 78
9.2.1 什麽是發布審批 78
9.2.2 精簡發布審批流程 78
9.2.3 發布審批的工具支持 79
9.3 消除發布時間窗口限制 80
第10章 突破Scrum的若乾約束 82
10.1 發布版本間的交疊 82
10.2 在一次迭代中多次發布 84
10.3 迭代規劃內容不必都做完 85
10.4 特事特辦 86
第11章 多項內容協同交付 87
11.1 本書中的微服務是代稱 87
11.2 提交完整的特性 88
11.3 採用相同的節奏 89
11.4 特性間完全解耦 90
11.5 按特定的順序發布 90
第12章 靜態庫的交付 92
12.1 什麽是靜態庫 92
12.2 作為公共基礎庫 92
12.3 作為整體應用的組成部分 93
12.4 作為服務接口定義 94
第13章 並行的多個版本序列 96
13.1 版本序列之間的交疊 96
13.2 變體 97
第14章 盡快修復問題 99
14.1 盡快修復流水線的問題 99
14.1.1 為什麽要盡快修復 99
14.1.2 自動通知合適的人 100
14.1.3 足夠高的優先級 101
14.1.4 足夠多的相關信息 101
14.2 盡快修復測試發現的缺陷 102
14.3 盡快解決發布帶來的問題 102
14.3.1 系統的可觀測性 103
14.3.2 發布回滾 103
14.3.3 緊急發布 104
14.3.4 當緊急程度更低一些時 105
第3部分 程序改動的累積和匯聚
第15章 版本控制 108
15.1 什麽是版本控制 108
15.2 實現版本控制的方法和工具 108
15.3 版本命名 109
15.3.1 傳統的版本命名方式 110
15.3.2 SaaS軟件的版本命名 110
15.3.3 考慮版本控制工具的能力 111
15.3.4 考慮製品管理的方法 112
15.4 分支 112
15.4.1 “現代派”分支 113
15.4.2 製品的分支 113
第16章 使用版本控制工具 114
16.1 版本控制工具簡介 114
16.2 代碼庫內的層次結構 115
16.3 代碼庫間的層次結構 115
16.4 不應放入代碼庫的內容 116
16.4.1 小心二進制文件 116
16.4.2 代碼庫二進制文件存儲方案 117
16.4.3 不應納入版本控制的內容 117
16.5 代碼改動與工作項間的關聯 118
16.5.1 將代碼改動提交記錄關聯到工作項 118
16.5.2 將特性的代碼改動提交記錄關聯到工作項 119
16.6 版本與工作項間的關聯 120
16.6.1 送測特性列表 120
16.6.2 發布特性列表與發布說明 121
16.7 代碼庫的體積 121
第17章 分支策略 123
17.1 分支的四個層級 123
17.2 生產級分支 124
17.3 集成級分支 125
17.3.1 支持交疊:長集成分支+短發布分支 126
17.3.2 支持交疊:長集成分支+長發布分支 127
17.3.3 支持交疊:短集成發布分支 127
17.3.4 支持混合自測與測試:長環境分支 129
17.3.5 支持混合自測與測試:短環境分支 130
17.3.6 支持特性單獨測試和發布 131
17.4 特性級分支 132
17.4.1 特性分支從哪裡創建、從哪裡同步 132
17.4.2 合入集成級分支時處理沖突的方法 133
17.4.3 在已提交的特性上繼續改動 134
17.4.4 如何摘除特性 135
17.4.5 何時刪除特性分支 136
17.5 版本序列級分支 136
17.5.1 支持多個版本序列間的交疊 137
17.5.2 支持多個變體 138
17.6 典型分支策略分析 139
17.6.1 Git Flow 140
17.6.2 GitHub Flow 141
17.6.3 GitLab Flow 141
17.6.4 Aone Flow 143
第18章 使用製品管理工具 144
18.1 製品、製品庫與製品管理工具 144
18.2 “正式”製品必須來自流水線上的構建 145
18.3 製品庫間的層次結構 145
18.4 製品庫內的層次結構 146
18.5 記錄製品的屬性信息 147
18.6 避免重復存儲 147
18.7 製品的尺寸 148
18.8 加速製品存取的方法 149
18.9 製品清理策略 149
第4部分 程序形態的轉化
第19章 構建 152
19.1 什麽是構建 152
19.2 構建的可重復性 153
19.2.1 構建的原材料不變 153
19.2.2 構建的工具和方法不變 154
19.3 加速構建 154
19.3.1 基本方法 155
19.3.2 探索:從程序形態轉化全過程的視角優化 156
19.3.3 探索:一些高端方法 157
19.4 源代碼、構建、製品之間的關聯關系 158
第20章 構建環境 160
20.1 什麽是構建環境 160
20.2 構建環境標準化 160
20.3 構建環境資源池化 161
20.3.1 構建環境資源池化的價值 161
20.3.2 保障構建所需緩存 162
第21章 部署 164
21.1 自動化部署 164
21.2 部署策略 165
21.2.1 生產環境的部署策略 165
21.2.2 測試環境的部署策略 167
21.2.3 客戶端的部署策略 167
21.3 判斷部署成功完成的方法 168
21.4 發布與部署分離 168
21.5 快速回滾 169
21.6 製品、部署、環境之間的關聯關系 170
第22章 運行環境 171
22.1 什麽是運行環境 171
22.2 運行環境管理的內容 172
22.3 管理本地運行環境 172
22.3.1 聲明式 173
22.3.2 只換不修 173
22.4 讓微服務在整體運行環境中運行 174
22.4.1 資源的申請與實現 174
22.4.2 基礎設施即代碼與GitOps 174
22.4.3 封裝以降低認知負荷 175
22.5 管理整套環境 175
22.5.1 何時需要再搭建一套環境 175
22.5.2 整套環境的自動生成與分配 176
22.5.3 實現在整體系統中自測 177
22.5.4 探索:虛擬獨占方式 178
22.5.5 測試環境和生產環境的一致性 179
22.5.6 數據隔離 180
第23章 SQL變更 181
23.1 什麽是SQL變更 181
23.2 自動執行SQL變更 182
23.3 確保SQL變更質量 182
23.4 程序與數據存儲結構的版本匹配 183
23.5 管理SQL變更的特別之處 183
23.5.1 管理SQL變更的挑戰 184
23.5.2 應對挑戰的常見方法 184
23.5.3 探索:聲明式 185
第24章 應用配置參數 187
24.1 什麽是應用配置參數 187
24.2 應用配置參數的管理 188
24.3 如何設置應用配置參數 188
24.3.1 設置應用配置參數的方式 189
24.3.2 自動執行 189
24.3.3 設置方式的選擇 190
24.3.4 探索:鍵值分離 191
24.3.5 探索:減少人工設置內容 193
24.4 質量和安全 193
24.4.1 確保變更質量 193
24.4.2 程序與應用配置參數的版本匹配 194
24.4.3 敏感信息管理 195
第5部分 程序質量的提升
第25章 靜態測試 198
25.1 代碼掃描 198
25.1.1 什麽情況下要做代碼掃描 198
25.1.2 什麽時候做代碼掃描 199
25.1.3 必要時定製規則 200
25.2 代碼評審 200
25.2.1 什麽情況下要做代碼評審 200
25.2.2 代碼評審的顆粒度 201
25.2.3 事前評審和事後評審 202
25.2.4 代碼評審的形式 203
25.2.5 代碼評審的內容 205
25.2.6 代碼評審的方法:檢查清單 206
25.2.7 探索:代碼評審時更方便地查看相關代碼 206
25.3 軟件成分分析 207
25.3.1 什麽情況下要做軟件成分分析 207
25.3.2 什麽時候做軟件成分分析 208
第26章 動態測試 209
26.1 單元測試 209
26.1.1 什麽情況下要做單元測試 210
26.1.2 什麽時候做單元測試 210
26.2 接口自動化測試 211
26.2.1 接口自動化測試的內容 211
26.2.2 什麽情況下要做接口自動化測試 211
26.2.3 什麽時候做接口自動化測試 212
26.2.4 探索:接口只在一處定義一次 213
26.2.5 流量回放 213
26.3 UI自動化測試 214
26.3.1 什麽情況下要做UI自動化測試 214
26.3.2 什麽時候做UI自動化測試 215
26.3.3 錄制還是編寫 215
26.4 人工功能測試 216
26.4.1 什麽情況下要做人工功能測試 216
26.4.2 什麽時候做人工功能測試 217
26.4.3 探索性測試 217
第27章 重要但容易被忽略的測試 218
27.1 非功能測試 218
27.1.1 測試內容:性能和容量 218
27.1.2 測試內容:安全性 219
27.1.3 測試內容:兼容性 220
27.1.4 測試內容:易用性 220
27.1.5 什麽時候做非功能測試 220
27.1.6 盡可能自動執行 221
27.2 生產環境測試 221
27.2.1 先在小範圍試用 221
27.2.2 發布後的功能測試 223
27.2.3 生產環境中的非功能測試 223
第28章 測試通用要點 225
28.1 程序的輸入:應對無盡的可能性 225
28.1.1 正常、異常和邊界情況 225
28.1.2 使用等價類來應對 226
28.1.3 輸入數據不只是函數的輸入參數 226
28.1.4 組合爆炸 227
28.1.5 測試覆蓋率 227
28.1.6 用好測試覆蓋率 228
28.2 程序的輸出:怎樣寫斷言 229
28.2.1 程序輸出的多種形式 229
28.2.2 對輸出進行適當的校驗 229
28.3 測試數據準備 230
28.4 測試用例間的隔離性 231
28.4.1 防止乾擾 231
28.4.2 管理測試用例間依賴 232
28.5 如何更快地編寫和維護測試腳本與數據 233
28.5.1 測試腳本的分層與復用 233
28.5.2 測試腳本與數據相分離 233
28.5.3 測試數據的分層與復用 234
28.5.4 探索:測試腳本的自動化生成 234
28.6 快速執行測試 235
28.7 探索:測試驅動開發及其變體 236
28.8 從人員和組織管理角度保障測試投入 237
28.9 提升人員的測試能力 237
第29章 測試通用策略 239
29.1 工作量在不同測試中的分配 239
29.2 根據場景選擇合適的測試力度 240
29.3 測試時機和頻率 242
29.4 增量優先 244
29.4.1 優先為增量代碼改動準備測試腳本和用例 244
29.4.2 優先執行增量代碼改動相關測試 244
29.4.3 優先解決增量代碼改動相關問題 245
29.5 技術債:在必要時欠債 246
29.6 質量門禁:有原則有靈活性 248
29.6.1 質量門禁可以適當通融 248
29.6.2 考慮定製質量門禁規則 249
29.6.3 考慮忽略某些代碼 249
29.7 Mock還是不Mock,這是個問題 250
29.7.1 單元測試盡可能使用Mock 250
29.7.2 盡量在完整系統中進行其他測試 251
29.7.3 僅在必要時使用Mock 251
29.8 質量反饋驅動測試改進 252
第30章 缺陷修復 255
30.1 管理缺陷 255
30.1.1 跟蹤缺陷的方法 255
30.1.2 記錄缺陷相關信息 256
30.2 需求、測試、缺陷之間的關聯關系 257
30.2.1 自動化測試時 257
30.2.2 人工測試時 259
30.3 調試工具 259
30.3.1 調試器 260
30.3.2 接口調試工具 260
30.3.3 UI調試工具 260
30.3.4 探索:復現運行上下文 260
30.4 測試環境的環境問題 261
30.4.1 減少測試環境的環境問題 261
30.4.2 探索:失敗原因自動分類 262
第6部分 雜談
第31章 組織結構與人員職責 264
31.1 項目制還是產品制 264
31.2 全功能團隊還是職能團隊 265
31.3 團隊的規模 267
31.4 團隊內部分工:誰做測試 267
31.5 團隊間解耦 269
31.6 按業務功能劃分並考慮軟件復用 270
31.7 組織的層級結構 270
31.8 組織級支持 271
第32章 平臺工程:工具平臺的建設和維護 273
32.1 什麽是平臺工程 273
32.2 使用工具代替專職人員的重復操作 273
32.3 平臺工程的核心是便捷易用 275
32.4 一體化的工具平臺 275
32.5 拿來主義還是自主研製 276
32.6 方案收斂 277
32.7 適當寬松的權限策略 278
32.8 工具可用性 279
第33章 終章:軟件交付10策略 281
33.1 小批量持續流動 281
33.1.1 大批量帶來等待等問題 281
33.1.2 短周期、小顆粒度、減少半成品 282
33.1.3 小批量持續流動的交付過程 283
33.2 運用綜合手段保證質量和安全 283
33.2.1 各種各樣的測試 284
33.2.2 左移+右移 284
33.2.3 開發人員+測試人員 285
33.2.4 自動化測試+人工測試 285
33.2.5 綜合運用 285
33.3 細粒度、低耦合、可復用的架構 286
33.3.1 軟件架構 286
33.3.2 測試腳本和測試數據的架構 287
33.3.3 組織架構 287
33.4 自動化與自助化 289
33.4.1 單項活動的自動化 289
33.4.2 流程的自動化 289
33.4.3 自助化 290
33.4.4 相關支持 290
33.5 加速各項活動 290
33.6 及時修復 292
33.6.1 為什麽要及時修復 292
33.6.2 如何做到及時修復 292
33.7 完備記錄,便捷查閱 293
33.7.1 跟蹤事項,記錄執行 294
33.7.2 版本控制 294
33.7.3 關聯關系 295
33.8 標準化和一致性 296
33.8.1 規範可重復 296
33.8.2 方案收斂 297
33.8.3 環境一致性 297
33.9 協調完成完整功能 298
33.9.1 背景 298
33.9.2 開發全過程的協調 299
33.9.3 軟件交付過程的協調 299
33.10 基於事實和數據的持續改進 300
33.11 總結 301
附錄A 數十年來的探索 302
附錄B 各類內容的版本控制方式 314