本書深入介紹了從開發(fā)方法、生產(chǎn)力到面向?qū)ο蟮脑O(shè)計需求和系統(tǒng)文檔的方方面面。通過本書,你將學習到:為什么遵循軟件匠藝模型可以讓你做到最好;如何利用可追溯性來加強文檔的一致性;如何通過用例分析來創(chuàng)建自己的UML需求;如何利用IEEE文檔標準開發(fā)出更好的軟件。通過對高質(zhì)量軟件開發(fā)中技能、態(tài)度和道德方面的深入講解,本書揭示了如何將工程原理應(yīng)用于編程的正確方法。在這個過程中,Hyde不僅會教給你規(guī)則,還會告訴你什么時候該打破規(guī)則。他不僅會啟發(fā)你認識什么是最佳實踐,同時還會讓你發(fā)現(xiàn)適合自己的最佳實踐。本書中包含了大量的資源和示例,它是你編寫代碼的首選指南,將讓你從同行中脫穎而出。
Randall Hyde是The Art of Assembly Language(《匯編語言的編程藝術(shù)》)和Write Great Code(《編程卓越之道》)第1~3卷(均由No Starch Press出版),以及Using 6502 Assembly Language和P-Source(由Datamost出版)的作者。他也是Microsoft Macro Assembler 6.0 Bible(由Waite Group出版)一書的合著者。在過去的40年里,Hyde一直從事嵌入式軟件/硬件工程師的工作,為核反應(yīng)堆、交通控制系統(tǒng)和其他電子設(shè)備開發(fā)相關(guān)指令集。他還在加州理工大學波莫納分校和加州大學河濱分校教授計算機科學課程。
張若飛,曾任多家互聯(lián)網(wǎng)金融公司CTO,在宜人貸、雅虎北研、金山云等知名公司擔任架構(gòu)師。十余年互聯(lián)網(wǎng)研發(fā)及技術(shù)管理經(jīng)驗,對搭建海量數(shù)據(jù)、大型分布式系統(tǒng)有豐富經(jīng)驗。著有十余本技術(shù)譯著,包括《Grails權(quán)威指南》《給大忙人看的JavaSE 8》《代碼不朽:編寫可維護軟件的十大原則》《面向可伸縮架構(gòu)》《云原生Java》等書,總計400余萬字。
第 1 部分 個人軟件工程
1 軟件開發(fā)的比喻 ................................................................................................. 2
1.1 什么是軟件 .......................................................................................................... 2
1.1.1 軟件不是被制造出來的 ........................................................................... 3
1.1.2 軟件不會磨損 ........................................................................................... 3
1.1.3 大多數(shù)軟件都是定制化的 ....................................................................... 3
1.1.4 軟件可以很容易升級 ............................................................................... 4
1.1.5 軟件不是一個獨立的實體 ....................................................................... 4
1.2 與其他領(lǐng)域的相似性 ........................................................................................... 4
1.2.1 程序員像藝術(shù)家一樣 ............................................................................... 4
1.2.2 程序員像建筑師一樣 ............................................................................... 5
1.2.3 程序員像工程師一樣 ............................................................................... 6
1.2.4 程序員像工匠一樣 ................................................................................... 7
1.2.5 究竟是藝術(shù)家、建筑師、工程師還是工匠 ........................................... 7
1.3 軟件工程 .............................................................................................................. 8
1.3.1 一個正式的定義 ....................................................................................... 9
1.3.2 項目規(guī)模 ................................................................................................. 10
1.3.3 軟件工程的問題 ..................................................................................... 12
1.4 軟件匠藝 ............................................................................................................ 13
1.4.1 教育 ......................................................................................................... 13
1.4.2 學徒階段 ................................................................................................. 14
1.4.3 軟件熟練工 ............................................................................................. 15
1.4.4 大師級工匠 ............................................................................................. 15
1.4.5 軟件匠藝的不足 ..................................................................................... 16
目錄 XXI
1.5 通往卓越編程的道路 ......................................................................................... 16
1.6 獲取更多信息 .................................................................................................... 17
2 生產(chǎn)力 ............................................................................................................. 18
2.1 什么是生產(chǎn)力 .................................................................................................... 18
2.2 程序員生產(chǎn)力與團隊生產(chǎn)力的比較 ................................................................. 19
2.3 工時和實際時間 ................................................................................................ 20
2.4 概念復(fù)雜性和范圍復(fù)雜性 ................................................................................. 21
2.5 預(yù)測生產(chǎn)力 ........................................................................................................ 22
2.6 度量指標,以及我們?yōu)槭裁葱枰鼈?............................................................. 23
2.6.1 可執(zhí)行文件大小度量指標 ..................................................................... 24
2.6.2 機器指令度量指標 ................................................................................. 24
2.6.3 代碼行數(shù)度量指標 ................................................................................. 25
2.6.4 語句數(shù)量度量指標 ................................................................................. 25
2.6.5 功能點分析 ............................................................................................. 26
2.6.6 McCabe 圈復(fù)雜度度量指標 ................................................................... 26
2.6.7 其他度量指標 ......................................................................................... 27
2.6.8 度量指標的問題 ..................................................................................... 28
2.7 我們怎樣才能每天寫出 10 行代碼 ................................................................... 29
2.8 估計開發(fā)時間 .................................................................................................... 30
2.8.1 估計小型項目的開發(fā)時間 ..................................................................... 30
2.8.2 估計中型項目和大型項目的開發(fā)時間 ................................................. 31
2.8.3 估計開發(fā)時間的問題 ............................................................................. 32
2.9 危機模式項目管理............................................................................................. 33
2.10 如何提高工作效率 ........................................................................................... 34
2.10.1 合理選擇軟件開發(fā)工具 ....................................................................... 34
2.10.2 管理開銷 ............................................................................................... 36
2.10.3 設(shè)置明確的目標和里程碑 ................................................................... 37
2.10.4 練習自我激勵 ....................................................................................... 37
2.10.5 集中注意力,消除干擾 ....................................................................... 38
2.10.6 如果你覺得無聊,那么就做點別的事情 ........................................... 39
2.10.7 盡可能自立 ........................................................................................... 39
XXII 編程卓越之道(卷 3):軟件工程化
2.10.8 識別何時需要幫助 ............................................................................... 40
2.10.9 克服士氣低落 ....................................................................................... 40
2.11 獲取更多信息 ................................................................................................... 41
3 軟件開發(fā)模型................................................................................................... 42
3.1 軟件開發(fā)生命周期............................................................................................. 42
3.2 軟件開發(fā)模型 .................................................................................................... 45
3.2.1 非正式模型 ............................................................................................. 46
3.2.2 瀑布模型 ................................................................................................. 47
3.2.3 V 模型 ..................................................................................................... 49
3.2.4 迭代模型 ................................................................................................. 50
3.2.5 螺旋模型 ................................................................................................. 52
3.2.6 快速應(yīng)用程序開發(fā)模型 ......................................................................... 54
3.2.7 增量模型 ................................................................................................. 56
3.3 軟件開發(fā)方法論 ................................................................................................ 57
3.3.1 傳統(tǒng)的(預(yù)測型)方法論 ..................................................................... 57
3.3.2 自適應(yīng)型方法論 ..................................................................................... 57
3.3.3 敏捷開發(fā) ................................................................................................. 58
3.3.4 極限編程 ................................................................................................. 60
3.3.5 Scrum ....................................................................................................... 73
3.3.6 功能驅(qū)動開發(fā) ......................................................................................... 74
3.4 卓越程序員的模型和方法論 ............................................................................. 77
3.5 獲取更多信息 .................................................................................................... 77
第 2 部分 UML
4 UML 和用例介紹 .............................................................................................. 80
4.1 UML 標準 ........................................................................................................... 80
4.2 UML 用例模型 ................................................................................................... 81
4.2.1 用例圖的元素 ......................................................................................... 81
4.2.2 用例包 ..................................................................................................... 84
目錄 XXIII
4.2.3 用例包含 ................................................................................................. 84
4.2.4 用例泛化 ................................................................................................. 85
4.2.5 用例擴展 ................................................................................................. 87
4.2.6 用例故事 ................................................................................................. 88
4.2.7 用例場景 ................................................................................................. 95
4.3 UML 系統(tǒng)邊界圖 ............................................................................................... 97
4.4 除用例以外 ........................................................................................................ 97
4.5 獲取更多信息 .................................................................................................... 98
5 UML 活動圖 ..................................................................................................... 99
5.1 UML 活動狀態(tài)符號 ........................................................................................... 99
5.1.1 開始和結(jié)束狀態(tài) ................................................................................... 100
5.1.2 活動 ....................................................................................................... 100
5.1.3 狀態(tài) ....................................................................................................... 101
5.1.4 轉(zhuǎn)移 ....................................................................................................... 101
5.1.5 條件 ....................................................................................................... 102
5.1.6 合并點 ................................................................................................... 104
5.1.7 事件和觸發(fā)器 ....................................................................................... 105
5.1.8 分叉和合并(同步) ........................................................................... 107
5.1.9 調(diào)用符號 ............................................................................................... 108
5.1.10 分區(qū) ..................................................................................................... 108
5.1.11 注釋和注解 ......................................................................................... 110
5.1.12 連接器 ................................................................................................. 110
5.1.13 其他活動圖符號 ................................................................................. 111
5.2 擴展 UML 活動圖 ............................................................................................ 111
5.3 獲取更多信息 .................................................................................................. 113
6 UML 類圖 ...................................................................................................... 114
6.1 UML 中的面向?qū)ο蠓治雠c設(shè)計 ..................................................................... 114
6.2 類圖中的可見性 .............................................................................................. 116
6.2.1 公共的類可見性 ................................................................................... 116
6.2.2 私有的類可見性 ................................................................................... 117
XXIV 編程卓越之道(卷 3):軟件工程化
6.2.3 受保護的類可見性 ............................................................................... 118
6.2.4 包級別的類可見性 ............................................................................... 118
6.2.5 不支持的可見性類型 ........................................................................... 119
6.3 類屬性 .............................................................................................................. 120
6.3.1 屬性可見性 ........................................................................................... 120
6.3.2 屬性派生值 ........................................................................................... 120
6.3.3 屬性名稱 ............................................................................................... 121
6.3.4 屬性數(shù)據(jù)類型 ....................................................................................... 122
6.3.5 操作數(shù)據(jù)類型(返回值) ................................................................... 122
6.3.6 屬性多重性 ........................................................................................... 123
6.3.7 屬性初始值 ........................................................................................... 123
6.3.8 屬性字符串 ........................................................................................... 124
6.3.9 屬性語法 ............................................................................................... 124
6.4 類操作 .............................................................................................................. 125
6.5 UML 的類關(guān)系 ................................................................................................. 126
6.5.1 類的依賴關(guān)系 ....................................................................................... 127
6.5.2 類的關(guān)聯(lián)關(guān)系 ....................................................................................... 127
6.5.3 類的聚合關(guān)系 ....................................................................................... 129
6.5.4 類的組合關(guān)系 ....................................................................................... 130
6.5.5 關(guān)系特性 ............................................................................................... 131
6.5.6 類的繼承關(guān)系 ....................................................................................... 140
6.6 對象 .................................................................................................................. 140
6.7 獲取更多信息 .................................................................................................. 141
7 UML 交互圖 ................................................................................................... 142
7.1 時序圖 .............................................................................................................. 142
7.1.1 生命線 ................................................................................................... 143
7.1.2 消息類型 ............................................................................................... 143
7.1.3 消息標簽 ............................................................................................... 145
7.1.4 消息序號 ............................................................................................... 145
7.1.5 守衛(wèi)條件 ............................................................................................... 146
7.1.6 迭代 ....................................................................................................... 147
目錄 XXV
7.1.7 長延遲和時間約束 ............................................................................... 148
7.1.8 外部對象 ............................................................................................... 149
7.1.9 激活條 ................................................................................................... 150
7.1.10 分支 ..................................................................................................... 150
7.1.11 可選流 ................................................................................................. 152
7.1.12 對象的創(chuàng)建和銷毀 ............................................................................. 153
7.1.13 時序片段 ............................................................................................. 154
7.2 協(xié)作圖 .............................................................................................................. 173
7.3 獲取更多信息 .................................................................................................. 174
8 其他 UML 圖 .................................................................................................. 175
8.1 組件圖 .............................................................................................................. 175
8.2 包圖 .................................................................................................................. 178
8.3 部署圖 .............................................................................................................. 179
8.4 合成結(jié)構(gòu)圖 ...................................................................................................... 181
8.5 狀態(tài)圖 .............................................................................................................. 185
8.6 關(guān)于 UML 的更多信息 .................................................................................... 187
8.7 獲取更多信息 .................................................................................................. 188
第 3 部分 文檔
9 系統(tǒng)文檔 ........................................................................................................ 190
9.1 系統(tǒng)文檔類型 .................................................................................................. 191
9.2 可追溯性 .......................................................................................................... 193
9.2.1 建立文檔可追溯性的方法 ................................................................... 193
9.2.2 標簽格式 ............................................................................................... 194
9.2.3 需求/反向可追溯性矩陣 ...................................................................... 200
9.3 確認、驗證和審查........................................................................................... 204
9.4 通過文檔降低開發(fā)成本 ................................................................................... 205
9.4.1 通過確認降低成本 ............................................................................... 205
9.4.2 通過驗證降低成本 ............................................................................... 206
XXVI 編程卓越之道(卷 3):軟件工程化
9.5 獲取更多信息 .................................................................................................. 207
10 需求文檔 ...................................................................................................... 209
10.1 需求的來源和可追溯性 ................................................................................. 209
10.1.1 建議的需求格式 ................................................................................. 210
10.1.2 好需求的特點 ..................................................................................... 211
10.2 設(shè)計目標 ........................................................................................................ 218
10.3 系統(tǒng)需求規(guī)范文檔 ......................................................................................... 218
10.4 軟件需求規(guī)范文檔 ......................................................................................... 219
10.4.1 介紹 ..................................................................................................... 221
10.4.2 總體描述 ............................................................................................. 222
10.4.3 具體需求 ............................................................................................. 224
10.4.4 支持信息 ............................................................................................. 229
10.4.5 軟件需求規(guī)范示例 ............................................................................. 230
10.5 創(chuàng)建需求 ........................................................................................................ 240
10.6 用例 ................................................................................................................ 242
10.6.1 啟用/禁用調(diào)試模式 ............................................................................ 244
10.6.2 啟用/禁用以太網(wǎng) ................................................................................ 244
10.6.3 啟用/禁用 RS-232 ............................................................................... 246
10.6.4 啟用/禁用測試模式 ............................................................................ 246
10.6.5 啟用/禁用 USB ................................................................................... 246
10.6.6 讀取撥碼開關(guān) ..................................................................................... 247
10.7 根據(jù)用例創(chuàng)建 DAQ 軟件需求 ...................................................................... 247
10.8 (從 SRS 中選擇的)DAQ 軟件需求 .......................................................... 248
10.9 用需求信息更新可追溯性矩陣 ..................................................................... 252
10.9.1 通過審查驗證的需求 ......................................................................... 253
10.9.2 通過測試驗證的需求 ......................................................................... 255
10.10 獲取更多信息 .............................................................................................. 255
11 軟件設(shè)計描述文檔 ........................................................................................ 256
11.1 IEEE Std 1016-1998 和 IEEE Std 1016-2009 ................................................ 257
11.2 IEEE 1016-2009 的概念模型 ......................................................................... 257
目錄 XXVII
11.2.1 設(shè)計關(guān)注點和設(shè)計利益相關(guān)方 ......................................................... 257
11.2.2 設(shè)計觀點和設(shè)計元素 ......................................................................... 258
11.2.3 設(shè)計視圖、設(shè)計覆蓋和設(shè)計原理 ..................................................... 270
11.2.4 IEEE Std 1016-2009 的概念模型 ....................................................... 273
11.3 SDD 所需內(nèi)容 ................................................................................................ 275
11.3.1 SDD 標識 ............................................................................................ 275
11.3.2 設(shè)計利益相關(guān)方和設(shè)計關(guān)注點 ......................................................... 276
11.3.3 設(shè)計視圖、設(shè)計觀點、設(shè)計覆蓋和設(shè)計原理 .................................. 276
11.4 SDD 的可追溯性和標簽 ................................................................................ 276
11.5 建議的 SDD 大綱 ........................................................................................... 277
11.6 SDD 文檔示例 ................................................................................................ 278
11.7 用設(shè)計信息更新可追溯性矩陣 ..................................................................... 293
11.8 創(chuàng)建軟件設(shè)計 ................................................................................................. 293
11.9 獲取更多信息 ................................................................................................... 294
12 軟件測試文檔 ............................................................................................... 295
12.1 Std 829 中的軟件測試文檔 ........................................................................... 295
12.1.1 流程支持 ............................................................................................. 296
12.1.2 完整性級別和風險評估 ..................................................................... 297
12.1.3 軟件開發(fā)測試級別 ............................................................................. 299
12.2 測試計劃 ........................................................................................................ 300
12.2.1 主測試計劃 ......................................................................................... 300
12.2.2 級別測試計劃 ..................................................................................... 302
12.2.3 級別測試設(shè)計文檔 ............................................................................. 304
12.3 軟件審查列表文檔 ......................................................................................... 305
12.3.1 SRL 大綱示例 ..................................................................................... 306
12.3.2 SRL 文檔示例 ..................................................................................... 306
12.3.3 將 SRL 項添加到可追溯性矩陣中 .................................................... 310
12.4 軟件測試用例文檔 ......................................................................................... 310
12.4.1 STC 文檔中的介紹 ............................................................................. 313
12.4.2 詳細說明 ............................................................................................. 314
12.4.3 其他 ..................................................................................................... 317
XXVIII 編程卓越之道(卷 3):軟件工程化
12.4.4 軟件測試用例文檔示例 ..................................................................... 318
12.4.5 用 STC 信息更新 RTM 文檔.............................................................. 327
12.5 軟件測試過程文檔 ......................................................................................... 327
12.5.1 IEEE Std 829-2009 軟件測試過程 ..................................................... 329
12.5.2 軟件測試過程的大綱擴展 ................................................................. 329
12.5.3 STP 文檔中的介紹 ............................................................................. 332
12.5.4 測試過程 ............................................................................................. 334
12.5.5 其他 ..................................................................................................... 337
12.5.6 索引 ..................................................................................................... 337
12.5.7 STP 文檔示例 ..................................................................................... 338
12.5.8 用 STP 信息更新 RTM 文檔 .............................................................. 344
12.6 級別測試日志 ................................................................................................ 345
12.6.1 級別測試日志文檔中的介紹 ............................................................. 346
12.6.2 詳細說明 ............................................................................................. 346
12.6.3 術(shù)語表 ................................................................................................. 347
12.6.4 關(guān)于測試日志的一些注釋 ................................................................. 347
12.7 異常報告 ........................................................................................................ 351
12.7.1 異常報告文檔中的介紹 ..................................................................... 352
12.7.2 詳細說明 ............................................................................................. 353
12.7.3 對異常報告的幾點建議 ..................................................................... 354
12.8 測試報告 ........................................................................................................ 355
12.8.1 主測試報告的簡要介紹 ..................................................................... 356
12.8.2 級別測試報告 ..................................................................................... 357
12.9 你真的需要這些嗎 ......................................................................................... 358
12.10 獲取更多信息 .............................................................................................. 359
后記:如何設(shè)計卓越的代碼................................................................................. 360