編輯推薦
《編程匠藝》中隨處可見與程式語言無關、但是與所有開發人員都相關的建議,其內容遍及編程的各個要素,如代碼風格、變數命名、錯誤處理和安全性等。不僅如此,它還觸及了一些更廣泛的現實世界編程問題,如有效的團隊合作、開發過程和文檔編寫,等等。《CodeCraft編程匠藝--編寫卓越的代碼》各章末尾均有一個問題和答案部分,這些部分回顧了各章中的一些關鍵概念,促使你像專家一樣思考,從而使這《CodeCraft編程匠藝--編寫卓越的代碼》成為那些渴望作為團隊的一分子、專業並高效地編程的新手們的一本絕佳的參考書。《CodeCraft編程匠藝--編寫卓越的代碼》將告訴你如何:
●在現實世界困難重重的情況下編寫出優秀的代碼;
●避免在工作場所出現災難和人心渙散的情況;
●準確地評估你的能力,並找到提高的途徑;
●採取有建設性的態度,並遵從最佳的做法。
第1章善於防守
1.1向優秀的代碼前進4
1.2構想:最壞的選擇4
1.3什麼是防禦性編程6
1.4又大又壞的世界8
1.5防禦性編程技巧8
1.5.1使用好的編碼風格和合理的設計9
1.5.2不要倉促地編寫代碼9
1.5.3不要相信任何人10
1.5.4編碼的目標是清晰,而不是簡潔10
1.5.5不要讓任何人做他們不該做的修補工作11
1.5.6編譯時打開所有警告開關11
1.5.7使用靜態分析工具12
1.5.8使用安全的數據結構12
1.5.9檢查所有的返回值13
1.5.10審慎地處理記憶體(和其他寶貴的資源)13
1.5.11在聲明位置初始化所有變數14
1.5.12儘可能推遲一些聲明變數14
1.5.13使用標準語言工具14
1.5.14使用好的診斷信息日誌工具15
1.5.15審慎地進行強制轉換15
1.5.16細則15
1.6約束16
1.6.1約束的內容17
1.6.2移除約束18
1.7總結20
1.8另請參見20
1.9思考21
1.9.1深入思考21
1.9.2結合自己22
第2章精心布局
2.1什麼是關鍵24
2.2了解你的讀者25
2.3什麼是好的樣式26
2.4使用括弧26
2.4.1K&R括弧風格27
2.4.2懸掛式的括弧風格27
2.4.3縮進的括弧風格29
2.4.4其他的括弧風格29
2.5主宰一切的風格30
2.6內部風格(以及在哪裡使用它們)31
2.7設立標準33
2.8正義的戰爭35
2.9總結35
2.10另請參見37
2.11思考37
2.11.1深入思考37
2.11.2結合自己38
第3章名正言順
3.1為什麼我們應該恰當地命名呢41
3.2我們對什麼進行命名41
3.3名字遊戲42
3.3.1描述性42
3.3.2技術上正確42
3.3.3符合語言習慣43
3.3.4恰當43
3.4具體細節44
3.4.1命名變數44
3.4.2命名函式45
3.4.3命名類型46
3.4.4命名名字空間47
3.4.5命名宏48
3.4.6命名檔案48
3.5玫瑰不叫玫瑰49
3.5.1保持前後一致50
3.5.2利用上下文51
3.5.3使用對你有利的名稱51
3.6總結52
3.7另請參見53
3.8思考53
3.8.1深入思考54
3.8.2結合自己55
第4章不言自明
4.1自文檔化的代碼59
4.2編寫自文檔化代碼的技術61
4.2.1使用好的樣式編寫簡單的代碼61
4.2.2選擇有意義的名稱62
4.2.3分解為原子函式62
4.2.4選擇描述性的類型63
4.2.5命名常量63
4.2.6強調重要的代碼64
4.2.7分組相關信息64
4.2.8提供檔案頭64
4.2.9恰當地處理錯誤65
4.2.10編寫有意義的注釋65
4.3實用的自文檔化方法66
4.3.1文學性編程66
4.3.2文檔化工具67
4.4總結69
4.5另請參見70
4.6思考71
4.6.1深入思考71
4.6.2結合自己72
第5章隨篇注釋
5.1什麼是代碼注釋74
5.2注釋看上去是什麼樣的75
5.3多少注釋是恰當的75
5.4注釋中應該有些什麼76
5.4.1解釋為什麼,而不是怎么樣76
5.4.2不要描述代碼76
5.4.3不要取代代碼76
5.4.4確保注釋有用77
5.4.5避免分心78
5.5實踐79
5.6從審美的角度看注釋80
5.6.1一致性80
5.6.2清晰的塊注釋80
5.6.3縮進的注釋81
5.6.4行章節附注釋81
5.6.5幫助你閱讀代碼81
5.6.6選擇一種維護成本較低的風格82
5.6.7分隔板82
5.6.8標誌83
5.6.9檔案頭注釋83
5.7使用注釋84
5.7.1幫助你編寫例行程式84
5.7.2錯誤修正通告85
5.7.3注釋過時85
5.7.4維護和空洞無物的注釋86
5.8總結86
5.9另請參見87
5.10思考87
5.10.1深入思考88
5.10.2結合自己88
第6章人非聖賢
6.1從何而來90
6.2錯誤報告機制91
6.2.1不報告91
6.2.2返回值92
6.2.3錯誤狀態變數93
6.2.4異常93
6.2.5信號95
6.3檢測錯誤95
6.4處理錯誤96
6.4.1何時處理錯誤97
6.4.2可能的反應98
6.4.3代碼示例100
6.5使地獄浮現104
6.6管理錯誤105
6.7總結106
6.8另請參見107
6.9思考107
6.9.1深入思考107
6.9.2結合自己108
目錄 代碼的神秘生命
第7章欲善其事,先利其器
7.1什麼是軟體工具112
7.2為什麼要在意工具114
7.3使工具發揮作用115
7.3.1了解它能做些什麼115
7.3.2學習如何駕馭它116
7.3.3了解它適合什麼任務116
7.3.4檢查它是否可用116
7.3.5找到了解更多信息的途徑117
7.3.6查明新版本何時出現117
7.4哪個工具117
7.4.1原始碼編輯工具118
7.4.2代碼構建工具120
7.4.3調試和調查工具123
7.4.4語言支持工具124
7.4.5其他工具125
7.5總結126
7.6另請參見127
7.7思考128
7.7.1深入思考128
7.7.2結合自己128
第8章測試時代
8.1反思現實131
8.2誰、是什麼、何時以及為什麼132
8.2.1我們為什麼要測試132
8.2.2誰來進行測試133
8.2.3測試的內容有些什麼133
8.2.4何時進行測試134
8.3測試並不難……135
8.4測試的類型138
8.5選擇單元測試用例142
8.6為測試而設計144
8.7看!不要用手!144
8.8面對故障該怎么辦145
8.9你能管理它嗎146
8.9.1缺陷跟蹤系統147
8.9.2bug審查148
8.10總結149
8.11另請參見150
8.12思考150
8.12.1深入思考150
8.12.2結合自己151
第9章尋找缺陷
9.1生活的真相154
9.2bug的種類155
9.2.1從遠處看155
9.2.2從近處看156
9.2.3從更近處看158
9.3消滅害蟲160
9.3.1地下之路161
9.3.2地上之路161
9.4搜尋bug162
9.4.1編譯時錯誤162
9.4.2運行時錯誤164
9.5如何修正缺陷167
9.6預防169
9.7除蜂劑、驅蟲劑、捕蠅紙169
9.7.1調試器169
9.7.2記憶體訪問校驗器170
9.7.3系統調用跟蹤170
9.7.4核心轉儲170
9.7.5日誌170
9.8總結171
9.9另請參見172
9.10思考173
9.10.1深入思考173
9.10.2結合自己173
第10章代碼構建
10.1語言障礙176
10.1.1解釋型語言177
10.1.2編譯型語言178
10.1.3位元組編譯型語言179
10.2小題大做179
10.3構建軟體版本181
10.4怎樣才算是一個優秀的構建系統184
10.4.1簡潔184
10.4.2一致184
10.4.3可重複和可靠185
10.4.4原子性186
10.4.5能夠應付錯誤187
10.5技術細節187
10.5.1目標的選擇187
10.5.2內務處理189
10.5.3依賴關係189
10.5.4自動構建190
10.5.5構建配置191
10.5.6遞歸地使用make192
10.6請發布我吧192
10.7構建大師是全能的嗎194
10.8總結195
10.9另請參見195
10.10思考196
10.10.1深入思考196
10.10.2結合自己196
第11章追求速度
11.1最佳化是什麼200
11.2是什麼使代碼不盡如人意201
11.3為什麼不進行最佳化呢202
備選方案204
11.4為什麼要進行最佳化205
11.5最佳化的具體細節206
11.5.1證明你需要進行最佳化206
11.5.2找出運行得最慢的代碼207
11.5.3測試代碼208
11.5.4最佳化代碼209
11.5.5最佳化之後209
11.6最佳化的技術210
11.6.1設計更改210
11.6.2代碼更改213
11.7編寫高效的代碼217
11.8總結219
11.9另請參見219
11.10思考220
11.10.1深入思考220
11.10.2結合自己221
第12章不安全感綜合症
12.1危險224
12.2敵人226
12.3藉口,都是藉口228
12.4感到很脆弱229
12.4.1不安全的設計和體系結構229
12.4.2緩衝溢出229
12.4.3嵌入的查詢字元串230
12.4.4競爭狀況231
12.4.5整數溢出231
12.5防範措施232
12.5.1系統安裝技術233
12.5.2軟體設計技術234
12.5.3代碼實現技術235
12.5.4規程技術236
12.6總結236
12.7另請參見237
12.8思考238
12.8.1深入思考238
12.8.2結合自己238
目錄 代碼的形成過程
第13章崇尚設計
13.1邊設計邊編程242
13.2我們要設計什麼243
13.3為什麼這么忙亂244
13.4良好的軟體設計245
13.4.1簡潔246
13.4.2優雅247
13.4.3模組化247
13.4.4良好的接口248
13.4.5可擴展性251
13.4.6避免重複251
13.4.7可移植性252
13.4.8符合語言習慣252
13.4.9良好地文檔化253
13.5如何設計代碼253
13.5.1設計方法和過程254
13.5.2設計工具255
13.6總結257
13.7另請參見258
13.8思考258
13.8.1深入思考258
13.8.2結合自己259
第14章軟體體系結構
14.1什麼是軟體體系結構262
14.1.1軟體藍圖262
14.1.2視圖263
14.1.3在何時和何處進行體系結構設計264
14.1.4用體系結構來做什麼265
14.1.5關於組件和連線266
14.2什麼是良好的體系結構268
14.3體系結構風格269
14.3.1沒有體系結構269
14.3.2分層的體系結構270
14.3.3管道和過濾器體系結構271
14.3.4客戶端/伺服器體系結構271
14.3.5基於組件的體系結構273
14.3.6框架274
14.4總結275
14.5另請參見276
14.6思考276
14.6.1深入思考276
14.6.2結合自己277
第15章改良與革命
15.1軟體腐爛281
15.2警告信號282
15.3代碼是如何成長的284
15.4相信不可能之事286
15.5對此我們可以做些什麼287
15.5.1編寫新代碼287
15.5.2維護現有代碼288
15.6總結290
15.7另請參見290
15.8思考291
15.8.1深入思考292
15.8.2結合自己292
目錄 一群程式設計師
第16章代碼猴子
16.1各種各樣的猴子296
16.1.1賣力工作的程式設計師297
16.1.2代碼猴子298
16.1.3權威299
16.1.4半權威300
16.1.5傲慢的天才300
16.1.6牛仔302
16.1.7規劃者302
16.1.8老前輩303
16.1.9狂熱者304
16.1.10單線條程式設計師305
16.1.11拖沓者306
16.1.12勉強的團隊領導306
16.1.13你307
16.2理想的程式設計師308
16.3那么該怎么辦308
16.4最愚蠢的人309
16.5總結310
16.6另請參見310
16.7行為表格311
16.8思考312
16.8.1深入思考312
16.8.2結合自己312
第17章團結就是力量
17.1我們的團隊——概覽316
17.2團隊組織318
17.2.1管理方法318
17.2.2責任劃分318
17.2.3組織和代碼結構320
17.3團隊合作工具320
17.4團隊疾病322
17.4.1巴別塔322
17.4.2獨裁制324
17.4.3民主制325
17.4.4衛星站327
17.4.5大峽谷329
17.4.6流沙330
17.4.7旅鼠332
17.5良好團隊合作的個人技巧和特點333
17.5.1溝通333
17.5.2謙虛334
17.5.3處理衝突334
17.5.4學習和適應能力335
17.5.5了解你的不足之處336
17.6團隊合作原則336
17.6.1集體代碼所有制336
17.6.2尊重別人的代碼337
17.6.3編碼準則337
17.6.4定義成功337
17.6.5定義責任338
17.6.6避免倦怠338
17.7團隊的生命周期339
17.7.1團隊的創建339
17.7.2團隊的成長341
17.7.3團隊合作342
17.7.4團隊結束343
17.8總結345
17.9另請參見346
17.10行為表格347
17.11思考348
17.11.1深入思考348
17.11.2結合自己348
第18章安全措施
18.1我們的責任350
18.2原始碼控制351
18.2.1修訂控制352
18.2.2訪問控制353
18.2.3處理代碼庫354
18.2.4在代碼樹上創建分支354
18.2.5原始碼控制簡史356
18.3配置管理356
18.4備份358
18.5發布原始碼359
18.6應該將原始碼放在哪裡360
18.7總結361
18.8另請參見362
18.9思考363
18.9.1深入思考363
18.9.2結合自己363
目錄 開發過程的組成部分第一部分
第19章注意細節
19.1規範到底是什麼368
19.2規範的類型369
19.2.1需求規範371
19.2.2功能規範373
19.2.3系統體系結構規範373
19.2.4用戶界面規範374
19.2.5設計規範374
19.2.6測試規範375
19.3規範應當包含哪些內容376
19.4規範編寫過程379
19.5我們為什麼會不編寫規範381
19.6總結383
19.7另請參見383
19.8思考384
19.8.1深入思考384
19.8.2結合自己384
第20章代碼審查
20.1什麼是代碼審查386
20.2何時進行審查387
20.2.1是否要進行審查388
20.2.2審查哪些代碼389
20.3執行代碼審查389
20.3.1代碼審查會議390
20.3.2集成審查392
20.4審查你的態度393
20.4.1作者的態度393
20.4.2審查人員的態度394
20.5完美的代碼395
20.6代碼審查之外396
20.7總結397
20.8另請參見397
20.9清單398
20.10思考399
20.10.1深入思考399
20.10.2結合自己399
第21章時間估計
21.1在黑暗中摸索402
21.2為什麼估計這么困難?403
21.3壓力之下405
21.4實用的估計方法406
21.5計畫遊戲409
21.6堅持!412
21.7總結415
21.8另請參見415
21.9思考416
21.9.1深入思考416
21.9.2結合自己416
目錄 從高處鳥瞰
第22章程式秘方
22.1編程風格420
22.1.1結構化編程421
22.1.2面向對象的程式設計422
22.1.3函式式編程423
22.1.4邏輯編程424
22.2烹飪方法:做什麼與怎樣做424
22.3開發過程425
22.3.1混亂426
22.3.2瀑布模型427
22.2.3SSADM和PRINCE429
22.3.4V模型430
22.3.5原型設計430
22.3.6疊代和增量開發432
22.3.7螺旋模型432
22.3.8敏捷的方法433
22.3.9其他開發過程434
22.4已經夠了!435
22.5選擇一種過程436
22.6總結437
22.7另請參見438
22.8思考438
22.8.1深入思考438
22.8.2結合自己439
第23章編程領域大觀
23.1應用程式編程442
23.1.1塑裝軟體443
23.1.2定製應用程式444
23.2遊戲編程445
23.3系統編程446
23.4嵌入式編程447
23.5分散式編程450
23.6網路應用程式編程451
23.7企業編程453
23.8數字編程454
23.9那又怎樣455
23.10總結456
23.11另請參見456
23.12思考457
23.12.1深入思考457
23.12.2結合自己457
第24章下一步呢
但下一步該做什麼呢?460
答案和討論463
參考書目559
索引564
……