索引 / 001 ZH-TW
The Pragmatic Programmer: Your Journey to Mastery(務實程式設計師:邁向精通之路) cover

電腦科學

電腦科學

The Pragmatic Programmer: Your Journey to Mastery(務實程式設計師:邁向精通之路)

David Thomas; Andrew Hunt

英文原名: The Pragmatic Programmer: Your Journey to Mastery

一本關於高效軟體開發習慣、態度與技巧的實用指南,由一系列簡短且各自獨立的主題組成。內容涵蓋如何寫出有彈性且易於維護的程式碼、因應變化、善用工具、測試與除錯,以及在團隊中為自己的工作負責。

需要的基礎: 具備任一程式語言的開發經驗即可;不需要正式修過軟體工程。

難度等級
入門
學術層次
大學部
software engineeringprofessional practicesoftware designtesting程式設計教科書

01 / 導讀

導讀

引用

Thomas, D., & Hunt, A. (2019). The Pragmatic Programmer: Your Journey to Mastery (20th anniversary ed., 2nd ed.). Addison-Wesley.

章節概要

本書由五十三個簡短、各自獨立的「主題」組成,分為九章,另附後記、參考書目,以及作者提供的習題參考解答。主要建議由編號的「提示」承載,這些提示在正文中以方框標示,並彙整在一張可抽取的卡片上;許多主題以習題(答案相對明確)和開放式的「挑戰」作結,相關主題之間有交互參照。序言說明這些主題可以依任何順序閱讀。據作者說明,本版約三分之一的主題是新寫的,其餘大多也經過改寫;並行處理部分重新編排,資源附錄被刪除,新增內容反映了敏捷實務、函數式程式設計慣用法,以及隱私與安全。程式碼範例使用多種語言,包括Ruby、Python與Java。

第1章:A Pragmatic Philosophy(務實的哲學)

闡述貫穿全書的態度:為自己的職涯與錯誤負責(「The Cat Ate My Source Code」)、對抗軟體熵、促成改變(「Stone Soup and Boiled Frogs」)、判斷軟體何時「夠好」、投資自己的知識組合,以及有效溝通。

第2章:A Pragmatic Approach(務實的方法)

討論一般性的設計原則:好設計的本質、DRY(要避免的不只是程式碼重複,而是知識與意圖的重複,適用於文件、資料與API,也適用於程式)、正交性、可逆性、曳光彈、原型、領域語言與估算。

第3章:The Basic Tools(基本工具)

純文字、命令列shell、熟練使用編輯器、版本控制、除錯、文字處理語言,以及寫工程日誌。

第4章:Pragmatic Paranoia(務實的偏執)

面對不完美軟體的防禦性做法:契約式設計、讓出錯的程式停下來(「Dead Programs Tell No Lies」)、斷言、資源平衡,以及小步前進而不去預測遙遠的未來(「Don't Outrun Your Headlights」)。

第5章:Bend, or Break(寧彎不折)

讓程式碼保持彈性:解耦、處理真實世界的事件、把程式視為資料的轉換、繼承的代價(「Inheritance Tax」,建議改用介面、委派與混入),以及把設定移出程式碼。

第6章:Concurrency(並行)

本版重寫的一章,涵蓋打破時間耦合、共享狀態的危險(「Shared State Is Incorrect State」)、演員與行程,以及黑板。

第7章:While You Are Coding(寫程式時)

寫程式過程中的習慣:傾聽直覺、避免「靠巧合寫程式」、演算法速度、重構、測試(「Test to Code」)、性質導向測試、安全(「Stay Safe Out There」),以及命名。

第8章:Before the Project(專案開始之前)

需求與專案啟動:挖掘真正的需求、解開看似不可能的難題、協同合作,以及敏捷的本質。

第9章:Pragmatic Projects(務實的專案)

把本書的想法應用到團隊與專案:務實的團隊、「Coconuts Don't Cut It」、務實入門工具組、讓使用者滿意,以及為自己的工作感到自豪(「Pride and Prejudice」)。

核心概念

第1–2章:哲學與方法

  • 軟體熵:軟體隨時間劣化,本書敦促讀者與之對抗。
  • 知識組合:把持續學習當作需要定期管理的投資。
  • DRY:系統中的每一項知識都必須有單一、明確、權威的表示;它適用於文件、資料與API,而不只是程式碼。
  • 正交性與可逆性:讓各元件獨立設計,並讓決策容易撤回。

第3–5章:工具、偏執與彈性

  • 契約式設計與斷言式程式設計:明確說明並檢查程式碼的前提與保證。
  • 小步前進:只踏出看得到結果的步伐,而不是為無法預知的未來做設計。
  • 繼承稅:繼承造成的耦合,以及改用介面、委派與混入的理由。

第6–7章:並行與寫程式

  • 共享狀態就是錯誤狀態:並行存取共享資源需要獨占存取或交易;隨機出現的錯誤常常意味著並行問題。
  • 靠巧合寫程式:依賴碰巧能動的程式碼,本書告誡讀者不要這樣做。
  • 性質導向測試:以自動產生的輸入檢驗程式碼的一般性質。

第8–9章:專案與團隊

  • 需求陷阱:了解使用者真正需要什麼的困難,出版社將其概括為「了解真正的需求」。
  • 務實入門工具組:作者建議每個專案都應建立的基本實務。

評析

優點

  • 簡短、獨立的主題。 每個主題自成一體並有交互參照,因此可以依任何順序閱讀,也可以配合課程專題一個一個指定。
  • 全面更新。 序言表示約三分之一的主題是新的,其餘大多經過改寫;出版社說新增了十節,目錄中也可見性質導向測試、安全、演員模型與工程日誌等當前的主題。
  • 內建練習。 書中有附參考解答的習題與開放式挑戰,作者建議在進階程式設計課程中把挑戰用於小組討論或寫作;出版社也列出了供課堂使用的教師資料與習題集。
  • 不依賴語言的建議與具體程式碼。 原則以一般性的語言陳述,程式碼範例簡短,且使用多種語言。

局限

  • 重廣度而輕深度。 約300頁中有五十三個主題,每個主題只有幾頁;並行、測試、需求與架構都需要在別處得到更完整的說明。
  • 是建議而非方法。 本書提供的是提示與故事,而不是系統化的流程或實證依據;作者自己也請讀者自行判斷某些建議是否有誤。
  • 有些經驗後才最有用。 許多主題假定讀者曾與他人合寫程式、用過版本控制,也碰過重複或不穩定的並行等問題;完全的新手可能會覺得部分建議較為抽象。

在課程中的定位

在軟體工程這門課的書單中,本書是談個別開發者習慣、涵蓋面最廣的一本。它天然的搭檔是 Ousterhout 的 A Philosophy of Software Design:後者深入探討單一問題,也就是透過模組設計來管理複雜度,而 Thomas 與 Hunt 則以短小的篇章綜覽設計、工具、測試、並行與團隊合作。把DRY、正交性與繼承這幾個主題,與 Ousterhout 談深模組和資訊隱藏的章節對照閱讀,可以看出兩者的共識與分歧。

Sommerville 的 Software Engineering 提供本書只略為觸及的系統化生命週期觀點(需求、流程、驗證);Software Engineering at Google 在組織規模上呈現相同的關切;Bass、Clements 與 Kazman 的 Software Architecture in Practice 以及 Jackson 的 Software Abstractions 則在架構與形式化建模上走得更遠。本書最好及早閱讀,在第一個較大的專題期間讀,日後再回頭重讀。

如何使用本書

出版社把本書的讀者設定為新手程式設計師、有經驗的程式設計師,以及負責軟體專案的管理者。只要有任何一種語言的程式設計經驗就足夠,不需要軟體工程背景。

  • 核心: 第1–2章(哲學與方法)與第7章(寫程式時)。
  • 專題進行中: 談工具的第3章與談防禦性程式設計的第4章,接著是介紹務實入門工具組的第9章。
  • 依需要閱讀: 程式碼變得難以修改時讀第5章,碰到並行時讀第6章,有真實使用者的專題開始時讀第8章。

每週讀一兩個主題,並在自己的工作中付諸實行:開始寫工程日誌、把一個建置步驟自動化,或在自己的程式碼中找出一處違反DRY的地方。先做習題再看作者的解答,把挑戰題當作讀書會的討論題目。把提示卡放在手邊,累積一兩年經驗後再回來重讀本書。