你真的會寫代碼嗎 Seriously Good Software: Code That Works, Survives, and Wins

Marco Faella

  • 你真的會寫代碼嗎-preview-1
  • 你真的會寫代碼嗎-preview-2
你真的會寫代碼嗎-preview-1

買這商品的人也買了...

商品描述

《你真的會寫代碼嗎》的核心思想是通過對各方面的代碼質量進行比較,使讀者瞭解經驗豐富的開發者擁有的思維模式。為了展示軟件開發最佳實踐,作者對一個水容器示例進行多次重構,討論了18種實現,分別從7個方面改進代碼質量:時間效率、空間效率、監控與可靠性、測試與可靠性、可讀性、線程安全、可復用性。在此過程中,作者還探討了與電腦科學、Java編程以及軟件工程相關的專業話題,這些知識都有助於讀者寫出更好的代碼。

作者簡介

【作者簡介】
馬爾科.法埃拉(Marco Faella)
意大利那不勒斯費德里克二世大學副教授,面向本科生和研究生講授高級編程、軟件工程、面向對象設計、編譯器與程序分析、遊戲設計等課程,同時為信息技術從業者開發和講授Java編程課。
另外,他也是愛思唯爾、施普林格等旗下期刊的審稿人。

【譯者簡介】
雷威
信公科技架構師,曾在□□□□中間件團隊任職。
沉浸軟件行業十餘年,熱衷於軟件架構、研發效能、分佈式、雲原生等領域,相信技術能改變世界。


李強
信公科技CTO,浙江中金黃金集團前副總裁兼CTO,曾就職於美國道富銀行。
技術涉獵廣泛,在產品設計開發、架構設計、技術團隊管理等方面有豐富經驗。
另譯有《監控的藝術》《擴展jQuery》等。

目錄大綱

第1部分 準備工作
第1章 軟件質量和待解決問題 2
1.1 軟件質量 2
1.1.1 內部質量與外部質量 3
1.1. 2 功能性質量與非功能性質量 3
1. 2 主要的外部軟件質量 4
1. 2. 1 正確性 4
1. 2. 2 穩健性 5
1. 2. 3 易用性 5
1. 2. 4 效率 5
1.3 主要的內部軟件質量 6
1.3.1 可讀性 6
1.3. 2 可複用性 6
1.3.3 可測試性 6
1.3.4 可維護性 7
1.4 軟件質量之間的關係 7
1.5 特殊的質量 9
1.5.1 線程安全 9
1.5. 2 簡潔性 9
1.6 演進示例:水容器系統 9
1.6.1 API 10
1.6. 2 用例 11
1.7 數據的模型和表示 12
1.7.1 存儲水量 13
1.7. 2 存儲連接 13
1.8 你好,容器(Novice) 15
1.8.1 字段和構造函數 15
1.8. 2 getAmount和addWater方法 17
1.8.3 connectTo方法 17
1.9 小結 19
1.10 擴展閱讀 19

第 2 章 Reference 的實現 20
2. 1 代碼(Reference) 21
2. 1.1 內存佈局圖 22
2. 1. 2 方法 25
2. 2 內存需求 26
2. 3 時間複雜度 30
2. 4 學以致用 32
2. 5 小結 33
2. 6 小測驗答案和練習答案 34
2. 7 擴展閱讀 36

第二部分 軟件質量
第3章 速度的要求:時間效率 40
3.1 常數時間內完成加水(Speed1) 41
3. 2 常數時間內添加連接(Speed2) 43
3. 2. 1 用循環鍊錶來表示容器組 43
3. 2. 2 延遲更新 46
3.3 2好的平衡:並查集算法(Speed3) 49
3.3. 2 連接容器樹 52
3.3.3 2壞情況時間複雜度 53
3.3.4 攤銷時間複雜度 55
3.3.5 可調整大小數組的攤銷分析 56
3.4 比較各種實現 59
3.4.1 實驗 59
3.4. 2 理論與實踐 60
3.5 來點兒新鮮的 61
3.5.1 快速插入 62
3.5. 2 快速查詢 62
3.5.3 讓三個方法都變快 63
3.6 真實世界的用例 63
3.7 學以致用 64
3.8 小結 65
3.9 小測驗答案和練習答案 65
3.10 擴展閱讀 68

第4章 寶貴的內存:空間效率 70
4.1 稍微擠一下(Memory1) 70
4. 2 普通數組(Memory2) 75
4.3 棄用對象(Memory3) 78
4.3.1 無對象的API 79
4.3. 2 字段和getAmount 方法 81
4.3.3 用一個工廠方法來創建容器 82
4.3.4 通過ID 連接容器 84
4.3.5 空間複雜度和時間複雜度 87
4.4 黑洞(Memory4) 87
4.5 空間和時間的權衡 90
4.6 來點兒新鮮的 92
4.6.1 重複對象少的情況 92
4.6. 2 重複元素多的情況 93
4.7 真實世界的用例 94
4.8 學以致用 94
4.9 小結 96
4.10 小測驗答案和練習答案 96
4.11 擴展閱讀 100

第5章 有自我意識的代碼:通過監控實現可靠性 102
5.1 契約式設計 102
5.1.1 前置條件和後置條件 102
5.1. 2 不變式 104
5.1.3 正確性和穩健性 105
5.1.4 檢查契約 106
5.1.5 更廣泛的情況 108
5. 2 基於契約設計水容器 109
5.3 檢查契約的容器(Contracts) 111
5.3.1 檢查addWater方法的契約 114
5.4 檢查不變式的容器(Invariants) 117
5.4.1 檢查connectTo方法的不變式 118
5.4. 2 檢查addWater方法的不變式 120
5.5 來點兒新鮮的 120
5.5.1 契約 121
5.5. 2 一個基線版本實現 121
5.5.3 檢查契約 122
5.5.4 檢查不變式 123
5.6 真實世界的用例 124
5.7 學以致用 125
5.8 小結 126
5.9 小測驗答案和練習答案 126
5.10 擴展閱讀 131

第6章 別對我撒謊:通過測試保證可靠性 132
6.1 測試的基本概念 132
6.1.1 測試的覆蓋率 133
6.1. 2 測試和契約式設計 133
6.1.3 JUnit 134
6. 2 測試水容器(UnitTests) 136
6. 2. 1 初始化測試 136
6. 2. 2 測試addWater 138
6. 2. 3 測試connectTo方法 143
6. 2. 4 運行測試 144
6. 2. 5 衡量代碼覆蓋率 145
6.3 可測試性(Testable) 146
6.3.1 可控性 146
6.3. 2 可觀察性 147
6.3.3 隔離:切斷依賴關係 148
6.4 來點兒新鮮的 149
6.4.1 提高可測試性 150
6.4. 2 一個測試套件 151
6.5 真實世界的用例 153
6.6 學以致用 154
6.7 小結 155
6.8 小測驗答案和練習答案 155
6.9 擴展閱讀 160

第7章 讓代碼說話:可讀性 161
7.1 關於可讀性的一些觀點 161
7.1.1 企業編碼風格規範 162
7.1. 2 可讀性因素 163
7. 2 結構性的可讀性特徵 164
7. 2. 1 控制流語句 164
7. 2. 2 表達式和局部變量 166
7.3 外部可讀性特徵 167
7.3.1 註釋 167
7.3. 2 命名 168
7.3.3 空白及縮進 169
7.4 可讀的容器(Readable) 169
7.4.1 用Javadoc描述類的頭部 170
7.4. 2 整理connectTo方法 173
7.4.3 整理addWater方法 177
7.5 可讀性的22思考 178
7.6 來點兒新鮮的 179
7.7 真實世界的用例 181
7.8 學以致用 181
7.9 小結 183
7.10 小測驗答案和練習答案 183
7.11 擴展閱讀 186

第8章 多個廚師一鍋飯:線程安全 188
8.1 線程安全面臨的挑戰 188
8.1.1 並發級別 190
8.1. 2 水容器的並發策略 192
8. 2 處理死鎖 193
8. 2. 1 原子的鎖序列 194
8. 2. 2 有序的鎖序列 195
8. 2. 3 一個隱藏的競爭條件 196
8.3 線程安全的水容器(ThreadSafe) 198
8.3.1 同步connectTo方法 198
8.3. 2 同步addWater和getAmount方法 199
8.4 不可變性(Immutable) 201
8.4.1 API 202
8.4. 2 實現 204
8.5 來點兒新鮮的 206
8.6 真實世界的用例 208
8.7 學以致用 209
8.8 小結 210
8.9 小測驗答案和練習答案 211
8.10 擴展閱讀 213

第9章 請重複利用:可複用性 215
9.1 確立邊界 215
9. 2 通用框架 216
9. 2. 1 屬性API 219
9. 2. 2 可變收集器 220
9. 2. 3 將Attribute適配到函數接口 224
9.3 一個通用容器的實現 225
9.4 通用的考慮 227
9.5 復原水容器(Generic) 228
9.5.1 更新用例 228
9.5. 2 設計具體的屬性 228
9.5.3 定義具體的水容器類 230
9.6 社交網絡的帖子 230
9.7 來點兒新鮮的 231
9.7.1 參數函數的接口 233
9.7. 2 一個通信模式 235
9.8 真實世界的用例 237
9.9 學以致用 238
9.10 總結 240
9.11 小測驗答案和練習答案 240
9.12 擴展閱讀 245

附錄A 代碼高爾夫:簡潔性 246
附錄B 22水容器類 249
列表:每一章中主要的類 252