軟體設計的哲學,第一版
  • 简体中文
  • English
  • 繁体中文
GitHub
  • 简体中文
  • English
  • 繁体中文
GitHub
  • 簡介
  • 前言
  • 第 1 章 介紹
  • 第 2 章 複雜性的本質
  • 第 3 章 能工作的程式碼是不夠的
  • 第 4 章 模組應該是深的
  • 第 5 章 資訊隱藏和資訊洩露
  • 第 6 章 通用的模組是更深的
  • 第 7 章 不同的層級,不同的抽象
  • 第 8 章 下沉複雜性
  • 第 9 章 在一起更好還是分開更好?
  • 第 10 章 透過定義來規避錯誤
  • 第 11 章 設計兩次
  • 第 12 章 不寫註釋的四個藉口
  • 第 13 章 註釋應該描述程式碼中難以理解的內容
  • 第 14 章 選取名稱
  • 第 15 章 先寫註釋
  • 第 16 章 修改現有的程式碼
  • 第 17 章 一致性
  • 第 18 章 程式碼應該是易理解的
  • 第 19 章 軟體發展趨勢
  • 第 20 章 效能設計
  • 第 21 章 結論
  • 總結

簡介

這是一本關於軟體設計的書(英文原名:A Philosophy of Software Design):如何將複雜的軟體系統分解成模組(比如類和方法),以便這些模組可以相對獨立地實現。本書首先介紹了軟體設計的基本問題,也就是對複雜性的管理,然後討論了一些在完成軟體設計的過程中涉及到的哲學問題,並提出了一系列可以在軟體設計過程中應用的設計原則。本書還介紹了一些可用來識別設計問題的危險訊號。你可以透過應用本書中的想法來減少大型軟體系統的複雜性,以便能更快地編寫軟體。

目錄

  • 前言
  • 第 1 章 介紹
  • 第 2 章 複雜性的本質
  • 第 3 章 能工作的程式碼是不夠的
  • 第 4 章 模組應該是深的
  • 第 5 章 資訊隱藏和資訊洩露
  • 第 6 章 通用的模組是更深的
  • 第 7 章 不同的層級,不同的抽象
  • 第 8 章 下沉複雜性
  • 第 9 章 在一起更好還是分開更好?
  • 第 10 章 透過定義來規避錯誤
  • 第 11 章 設計兩次
  • 第 12 章 不寫註釋的四個藉口
  • 第 13 章 註釋應該描述程式碼中難以理解的內容
  • 第 14 章 選取名稱
  • 第 15 章 先寫註釋
  • 第 16 章 修改現有的程式碼
  • 第 17 章 一致性
  • 第 18 章 程式碼應該是易理解的
  • 第 19 章 軟體發展趨勢
  • 第 20 章 效能設計
  • 第 21 章 結論
  • 總結

翻譯說明

無意中看到這本書的相關介紹,也很快找到了 GitHub 上的民間翻譯版,因為看到一些翻譯不太恰當的地方,所以想著順手提交修正下,然後找到其中 Star 數量比較多的主要是 Cactus-proj 和 Go7hic 的,但兩者的內容幾乎完全一樣,包括一些翻譯不當的地方也是同樣的。從實質內容的提交歷史來看,應該 Cactus-proj 是更早的提交者,這一點從各自的 Fock/Star 數量也能側面印證。

這兩個專案均有收到並處理一些內容修正的 PR,但即使是 Cactus-proj,最新的幾個 PR 也處於較長時間未處理的狀態,推測都已經暫停維護了,然後基於 Cactus-proj,包含內容修復最多的是 luojiego 的 Fork,於是就基於這個建立了自己的 Fork。除了一邊閱讀一邊校對,也摸索著更新了相關的部署指令碼,部署到我自己的 GitHub Pages 上,可直接線上閱讀。

從提交歷史來看,gdut-yy 應該是主要的翻譯貢獻者,liquid207、wanghuanwei、luojiego 和 BlackGlory 也都貢獻了比較多的翻譯修正,inkydragon 則主要負責了 LaTeX 和 PDF 相關的工作以及格式規範、持續整合等方面的工作,不確定歷史是否挖掘充分,所有提到未提到的貢獻者,一併感謝!

出於尊重原作版權的考慮,在完整的校訂工作完成之後,我刪除了與中文並列對照的英文內容,對於純英文內容也刪除了主體部分,只保留了前言以及各個章節的概要和總結。如果你在閱讀過程中,發現有翻譯不當的地方,或者有其他建議,歡迎提交相應的 PR 或 Issue。

另外,同時還基於 opencc 使用 Python 指令碼自動生成了繁體中文的翻譯版本,也一併放在了 GitHub Pages 上,如果發現有處理不當的內容,請針對該指令碼或對應的簡體中文內容提交 PR 或 Issue。

術語翻譯

翻譯是個比較困難的事情,除了譯者水平有限,也有很多見仁見智的地方,所以這裡先列出一些術語的翻譯選擇和背後的考慮因素,以供參考,並至少在本書籍的翻譯過程中保持相對統一,也歡迎提 Issue 探討。

英文中文說明
bug缺陷 / 程式碼缺陷沒有用“錯誤”是希望避免與 error 等術語的翻譯混淆
change變更針對程式碼的時候,更多使用“變更”而不是“改變”,但根據實際的上下文而定
clean整潔的與《程式碼整潔之道》等系列書籍的翻譯保持一致
complexity複雜性沒有用“複雜度”,類似的還有“依賴性(dependency)”和“模糊性(obscurity)”
deep module / class深模組 / 深類沒有用“深層的”是希望避免與 layer 和 level 等術語的翻譯混淆
define error out of existence透過定義來規避錯誤類似的還有“透過設計來規避特殊情況(design special cases out of existence)”
dispatcher分發器沒有用“排程器”是希望避免與 scheduler 等術語的翻譯混淆
information leakage資訊洩露沒有用“洩漏”
obvious易理解的在描述程式碼的特性時一般會譯為“易理解的”(主要是第 13 章和第 18 章),反之就是“難以理解的”,而其他場景下可能仍譯為“明顯的”或“顯而易見的”
pass-through透傳用於“透傳方法”、“透傳變數”、“透傳引數”等場景
public method / variables公有方法 / 公有變數沒有用“公開”是希望避免與 expose 和 exposure 等術語的翻譯混淆
selection區域選擇 / 選擇的區域 / 所選區域影像介面文字編譯器中的示例,直接翻譯成“選擇”會不太清晰
shallow module / class淺模組 / 淺類沒有用“淺層的”,和 deep 的翻譯選擇是同樣的原因
web browser / serverWeb 瀏覽器 / Web 伺服器沒有用“網路”或“網頁”是希望避免與 network 和 web page 等術語的翻譯混淆,就保留英文了
上次更新: 2025/4/8 凌晨3:21
Next
前言