【Code Complete 2nd Edition:軟體開發實務指南】怎麼讀這本 1.7 kg 重的經典磚塊書

《Code Complete 2nd Edition》,簡稱 cc2e,是一本很經典,也挺有年紀的書。2004 年就出版,幾乎是每一位頂尖的開發人員都閱讀過很多次的好書。

然而篇幅很長,這就是本軟體開發的四庫全書,是屬於「大全」類型的書。很多人買了之後,就只在案頭上供著,看沒幾個段落就提不起興趣往下看。

本文希望藉由自己的一些經驗,整理幾個閱讀的重點與注意事項,希望能幫助大家更輕鬆、有感、持續地體會這本書能為你帶來的實際價值。

基本資訊

  • 經典作者經典書:2004 年出版,作者為兩屆 Jolt 大獎得主 Steve McConnell

  • 繁體中文書也有兩版,最近這一版為博碩文化的名家名著系列,書籍資訊請參考天瓏網站
  • 超厚實、超大篇幅:主要內容一共有 35 個章節856 頁1.7 kg。如果拿《軟件開發本質論》來跟《cc2e》做比較,就像【蠅量級】 vs 【重量級】的差異。

連想拿來蓋泡麵,都還要擔心泡麵碗撐不住這重量。
  • 軟體開發界的四庫全書,軟體開發實務大全。

 

閱讀注意事項

  • 相當考驗耐心跟讀書技巧
  • 屬於案頭上必須得擺著的經典鉅作,隨著職涯不同階段翻閱,都會領略不同的感受
    • 另一本同等經典的鉅作是《人月神話》,必備、必看、不能只看一次。
  • 畢竟是本老書,所以時代背景不同,用詞也不盡相同,翻譯上有些東西也不是挺好翻,當看到不太直覺的詞彙,可以上網找一下原文,當然,如果你手邊也有原文書可以對照著看,就更好了。
  • 不一定要照著順序讀,大部分篇幅很長的書,讀者都不容易有耐心讀,而且最前面通常都是基底、心法、概念,不好懂或容易無感。
    • 本文後半段會介紹我替各位將各章節簡單的分類,包含如何讀起來會比較有感覺,能比較早應用在實務上。
  • 不要整本書都讀完,才開始去思考、去嘗試、去練習。不太會有讀完的一天的,即使讀完了,你也忘記之前看的內容了。
    • 看完一段,就嘗試在實務上比較、體會、練習、印證看看書裡的內容。這樣才能讓學習的效果提升到極致。
  • 閱讀過程中,思考與了解書裡許多 topic 為何會這樣建議,是最重要的重點。
    • 例如命名風格,在 legacy product 中一致性比正確性重要,不代表你就不需要了解正確性。想了解更多,可參考第 11 章。
  • 想辦法發現自己哪些東西還在殺豬公,人家在 2004 年就上外太空了。
    • 例如 pair programming 在 2000 年 Kent Beck 就已經在極限編程(extreme programming, XP)中提出來了。更多資訊可參考第 21.2 章。
  • 千萬不要錯過了每個章節中的檢核表(checklist),以及每一章最後的要點整理
  • 書裡側邊的 icon 也都是有 highlight 效果,例如:
    • KEY POINT: 代表重點內容
    • CODING HORROR: 代表誤區、anti-pattern
    • HARD DATA: 如果特別需要相關資料數據佐證,這個標記的段落就是引經據典、提供相關數據說明
    • 交叉參考:事實上我自己唸書,看到有興趣的段落有交叉參考,我絕對就是再切到交叉參考的段落,把前後文再看過一輪。這就像是 wiki 的閱讀方式一樣,從這個知識連結到相關知識,這是幫助學習很大的一環。作者跟出版社都幫忙標示了,不懂得應用就太可惜了。
文章中大部份的代碼範例,是用 C++, Java 跟 VB.NET,如果各位碰到了該章節段落內容你感興趣,卻苦於看不懂該程式語言的代碼,建議你可以在社群或 social network 發問,一定會有很多高手願意給你一些意見和建議的。

章節分類剖析

因為這本書內容篇幅實在太長,連章節也高達 35 章,一般人如果照順序念,大概很快就會放棄了。這邊我針對 programmer 這條路線,按照有感、立馬能用的順序分出下面幾個群組。希望能幫助大家更輕鬆、持續保持興趣地讀這本經典書。

開發細節

  • ch10: 變數
  • ch11: 命名
  • ch14: organizing straight-line code
這很難翻譯,但中文的「組織直線碼」實在太難懂了。這一章其實是在講,怎麼排版你的代碼,怎麼避免代碼因為順序而帶著副作用,目的是為了讓閱讀的人理解起來最輕鬆、直覺、無害。
  • ch15: 條件語句
  • ch16: 控制迴圈
  • ch19: 一般控制問題
  • ch12: 基本資料型別
  • ch31: 佈局與風格
  • ch32: 自我文件化程式碼
  • ch30: 程式設計工具
實在太多人對自己吃飯用的開發工具不熟,對工具的生態系不熟,對程式語言的生態系不熟
  • ch23: 除錯
  • ch13: 不常見的資料型別
  • ch17: 不常見的控制結構

 

設計相關

  • ch5: 軟體建構中的設計
  • ch6: 工作類別
  • ch7: 高品質的子程式
  • ch8: 防禦性程式設計
  • ch24: 重構
  • ch9.4: PPP 的替代方案

 

軟體品質與優化

  • ch20: 軟體品質概述
  • ch21: 協同維護
例如 code review 與 pair programming
  • ch22: 開發者測試
  • ch25: code-tuning strategies
  • ch26: code-tuning techniques
  • ch29: 整合

 

建構專案/產品注意事項

  • ch3: 前期的前置作業
  • ch4: 關鍵的「建構」決策
  • ch5: 軟體建構中的設計
  • ch27: 程式規模對建構的影響
  • ch28: 管理建構
  • ch33: 個人性格
  • ch34: 軟體工藝的話題

 

簡單的說,你越資深,角色越偏向 leader 或需要關注全局的人,就越該重視上述後半段的內容。

如果你還是個 junior programmer,那我建議可以照上面的分類順序,先從開發相關的內容看起。就像風清揚一開始教令狐沖獨孤九劍時,是先教「總綱」跟「破刀式」,因為眼前馬上就要用了,學以致用才是真學習,得感興趣,才可能繼續往下閱讀這本書其他內容。

 

91 的其他補充

  • 光只有看書是沒用的,要把對書裡資訊的理解轉化成知識,其關鍵在於跟既有知識體系建立連結,讓知識點不會形成孤島。並且嘗試在實務中實驗、落實,才能印證書裡的道理,才可能從知識內化成技能,才能更深入了解其適用場景與限制。
  • 書裡很多內容看不懂,是正常的。看書是這樣的,很多書的內容你在看的當下沒有感覺,不太懂。然後你在實務上經過血淚、疤痕累積到了知識與技能,覺得很有成就感。當某一天你重看那些書時,發現原來書裡早就寫了這些知識,只是當時的自己不懂罷了。而有趣的是,如果你不曾先經過那段「看不懂」的經歷,實務上要獲得對應的知識與技能,難度就會變得很高。

Steve Jobs 說過一段話,就是這個道理。

you can't connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future.

  • 對我來說,cc2e 是一本絕世武功的目錄,可以幫助讀者透過大全來了解全局的樣貌,但仍須持續針對各個層面深入研究與了解。針對現代軟體開發,用【道法術器】來舉例子的話,大概是這樣。
    • 道:Agile/DevOps/Lean...
    • 法:Scrum/Kanban/引導...
    • 術:Unit Test, Refactoring, ATDD/TDD/BDD, Specification by Examples, User Story Mapping, Impact Mapping, CI/CD, world coffee, lean coffee, retrospective, daily scrum meeting, pair programming, code review, design patterns 等等…
    • 器:實體白板、便利貼、war room、retrospective room、投影機、生產力工具(如 Wox/Alfred/TextExpander)、IDE(如 JetBrains/Visual Studio/VSCode)、各種 plugin(IDE/editor/browser 上的擴充套件)、螢幕、電腦配備、電腦椅、電腦桌等等…
你如果統計過,每個人為了開會或相關活動要花時間 booking 會議室,要從位置上走到會議室,在等待大家都到,花了多少人多少時間,共計是多少成本,你就會覺得,直接把辦公室規劃成一個個會議室,一個團隊就是在一個會議室,是件多划算的事。

要 code review? 要分享碰到的問題或剛找到的解決方案?直接在位置上投影機 chromecast 投出來,這才是效率。

想要作到敏捷宣言第一條,人與溝通互動 重於 流程與工具,首要條件就是拉高溝通頻率,但要能降低單次溝通成本

Raise your bar,很多人寫 code 快不了,是因為不覺得自己慢。很多人很難變強,是因為活在自己的井裡,太少接受外部刺激。

完美是個動詞,追求完美的過程,才是完美的體現。而不放過各個細節,讓自己 work as an artist,享受其中,讓軟體開發的過程像是藝術般的呈現,這個過程會讓你一直變強,因為你不斷在追求各種極限

想成為一個卓越的 Clean Coder 嗎?推薦幾門相關的培訓,其實就是用錢買時間跟經驗,就看你願不願意、值不值得投資自己了。
  1. 2019/5/18(六):【單元測試實戰營】第六梯次(台北)
  2. 2019/5/19(日):【極速開發】第七梯次(台北)
  3. 2019/6/15(六)~2019/6/16(日):工程實踐與流程規範導入實務 201906 第一梯次(台北)
  4. 2019/7/27(六)~2019/7/28(日):演化式設計:測試驅動開發與持續重構 第六梯次(台北)

blog 與課程更新內容,請前往新站位置:http://tdd.best/