安排自我課程概念圖

我們生活在一個資訊爆炸的時代。從印刷術的發明到網際網路的普及,取得知識的門檻不斷降低。然而,即便部落格能提供源源不絕的閱讀素材,Jerry Weinberg、Fred Brooks、Steve McConnell、Kent Beck 等資深實踐者在書中累積的智慧,仍然無法被更高頻寬的媒介所取代。

你已經不在學校了,沒有人會幫你安排指定閱讀。找到推薦書目、安排自己的課程,這是你自己的責任。

Reading List – 閱讀清單#

情境#

在 Your First Language 上建立了足夠的能力之後,你開始環顧四周,發現仍需學習的知識量之龐大令人難以置信。

問題#

你需要閱讀的書籍增長速度遠超過你讀書的速度。

解法#

維護一份閱讀清單(Reading List),追蹤你計畫閱讀和已經讀過的書。基於 Share What You Learn 的精神,考慮把清單放在公開的地方,讓其他人也能從中受益。

這個模式不只是管理待讀書目,更是一種反思閱讀習慣的機制:

  • 累積數年的閱讀紀錄後,你能看出自己學習中的模式、趨勢與缺口,幫助你做出更好的下一步選擇
  • 公開清單還能吸引他人貢獻建議,幫你發現隱藏的關聯和冷門的好書
  • 從任何一本書中最有價值的收穫之一,就是它推薦的其他書目。某些書會反覆出現在不同書目的參考文獻中,這些書應該被移到清單頂端

閱讀清單本質上是一個優先佇列(priority queue)。有些書的排名會不斷下降,最終你可能永遠不會讀它們——這完全沒問題。此模式的目的是幫助你篩選與排序潛在知識的洪流。

實施此模式的主要困難在於:你需要對一個主題有深入理解,才能判斷該讀哪些書、以什麼順序讀。解決這個悖論有兩種方式:

  • 先挑選能給你廣泛概覽的書籍,再逐步深入感興趣的面向
  • 依賴你的 Kindred Spirits導師——導師能推薦必讀書目,與同伴的討論能幫你確定閱讀順序

這是你的閱讀清單。受他人建議的影響很好,但只有你真正了解自己當前的情境。在對的時間讀對的書,遠比盲目刷完一堆超出你當前理解深度的書更有力量。太多人太早讀 Design Patterns,其實 Refactoring 會是更溫和的入門。時機對閱讀體驗有巨大的影響。

行動#

建立一個純文字檔案(或許放進版本控制),列出你目前正在讀的所有書籍。這就是你的閱讀清單,也是此模式最簡單的實作。接下來,你只需要持續更新它。

Read Constantly – 持續閱讀#

情境#

你已經 Unleash Your Enthusiasm,打開了許許多多的門。

問題#

儘管你已精通第一語言,仍有源源不絕更深、更基礎的概念正在逃離你的掌握。

解法#

將你對學習的渴望集中在盡可能大量地閱讀文字上。在建構閱讀清單時,書籍優先於部落格

在 The Long Road 上,你應該有(或創造)一些季節,專注於大量閱讀:

  • Dave 在 2002-2003 年間,正值他的第一語言 Perl 進入高原期,每天利用通勤火車上的 90 分鐘閱讀——甚至下車後走路到辦公室的路上仍繼續讀
  • 沉浸在經典與原始文獻中,配合 Finding Mentors 和與 Kindred Spirits 的頻繁交流,能提供無與倫比的教育

不要忽視學術社群的知識寶庫。偶爾閱讀研究論文能拓展思維、讓你接觸電腦科學的前沿,也提供具有挑戰性的新想法。嘗試實作這些想法,能讓你在主流採納前多年就掌握新的演算法、資料結構和設計模式。

行動#

現在就決定你下一本要讀的書是什麼,並立刻買來或借來,這樣讀完手上這本就能無縫接軌。同時,隨身攜帶一本薄書,利用每天零碎的空閒時間(通勤、排隊等待)來學習。

Study the Classics – 研讀經典#

情境#

你是自學出身,或者接受了重視技能訓練勝於理論的實務教育。

問題#

你的資深同事不斷引用像 Brooks’ Law 這樣的概念,那些來自他們假定你(以及任何自重的軟體開發者)都讀過的書。

解法#

Expose Your Ignorance,詢問那個你不知道的概念和它出自的書籍,然後把這本書加入你的閱讀清單。

Joshua Kerievsky 曾問 Jerry Weinberg 如何跟上所有出版的書。Jerry 回答:「很簡單——我只讀偉大的那些。」透過持續閱讀和工作中的反思,你最終也能做到「只讀好書」。

當你拿起一本書,第一個想法是「這本書過時了嗎?」——那你就讀錯類型的書了。成功的學徒傾向於專注在長壽的書(long-lived books),然後透過網路或實驗來了解資訊如何演進。

Dave 仍清楚記得讀到他在這個領域的第一本經典 The Psychology of Computer Programming 時的體驗——儘管書中講的是打孔卡和房間大小的電腦,但其中的智慧仍然令人驚嘆地切題。

過度專注經典的危險是走向極端,放棄了那些能改善日常工匠技藝的務實知識。務必在閱讀清單中交替安排經典與現代實務書籍或文章

行動#

找出你書堆中最古老的那本書,先讀那一本。下次瀏覽另一位開發者的書架時,注意最老的幾本書,問他為什麼還留著它們。

Dig Deeper – 深入挖掘#

情境#

你生活在一個截止日期緊迫、專案複雜的世界中,使用大量工具。你只學了足以完成今天工作的知識,從教學文章中複製範例程式碼,在不理解底層問題的情況下做決策。這讓你能迅速上手任何新技術,但你從未深入學習任何技術的完整面貌

問題#

你發現維護自己寫的程式碼越來越困難,因為那些教學文章省略了複雜議題。你對一千種工具的膚淺知識意味著每當遇到微妙的 bug 或需要深層知識時就會手足無措。更糟的是,由於知識過於膚淺,你甚至不知道自己知道得有多少——直到被考驗的那一刻。

解法#

學習深入挖掘工具、技術和方法。獲取知識的深度到能理解事物為何如此的程度。深度意味著理解導致某個設計的力量(forces),而非僅僅記住設計的細節。

深度知識帶來的好處:

  • 建立信心:深入理解的領域為你提供信心基礎,指引你在新團隊中如何透過 Sweep the Floor 來提早交付價值
  • 心理韌性:「如果我能精通 EJBs,就能搞定 metaclasses」
  • 區別能力:能解釋系統表面之下真正發生了什麼,而非只理解自己負責的一小部分

真正理解工具的人和「碰巧編程」(programming by coincidence)的人之間的差異,在於前者會去做 debugging、decompiling、reverse-engineering,並且會閱讀規格書、RFC 和標準文件。這種視角的轉換意味著願意追蹤問題穿越系統的各個層次。

從一手來源獲取資訊是此模式的關鍵實踐:

  • 當有人談到 REST 時,去讀 Roy Fielding 的博士論文原文
  • 不要依賴「引用了一本書、那本書又轉述了一篇文章、那篇文章又提到了 Wikipedia 頁面、而 Wikipedia 頁面連結到了原始 RFC 文件」的二手傳播鏈
  • 追溯想法的譜系是重要的練習——原始來源往往是比多年來選擇性互相引用的人鏈更好的老師

閱讀教學文章時,不要尋找可複製的程式碼,而是尋找一個心智結構來放置新知識。問自己:這個概念的歷史背景是什麼?它是否是某個更通用概念的特例?實作中做了什麼取捨?

深入知識的實際價值不容小覷。例如:

  • 只有膚淺理解的人在正則表達式出問題時束手無策——不理解 DFANFA 的差異,就無法診斷因遞迴實作導致的回溯效能問題
  • 只知道 List、Set 和 HashMap 的人不會意識到自己需要 Trie 來解決最長前綴匹配問題,只會假設這個問題「不可能解決」
  • 改變演算法或資料結構的選擇,可以把一個跑數月的批次作業變成使用者鬆開滑鼠前就完成的操作

雖然要深入,但要注意不要意外變成狹隘的專家。目標是能根據需要獲取足夠的專業知識來解決任何問題,同時不失去對軟體開發不同面向相對重要性的全局觀。此外,不要讓深度知識讓你傲慢——繼續尋找 Be the Worst 的機會,挑戰自己用基礎構建塊組裝有用的工具。

行動#

找到並閱讀描述 HTTP 1.1 的 RFC 2616,以及描述 1976 年遠端程序呼叫技術現狀的 RFC 707。利用你對 HTTP 更深入的理解,嘗試為 RFC 707 實作一個客戶端和伺服器。接著檢視一個現代的開源實作(如 Apache Thrift),從你知情的角度寫一篇關於遠端程序呼叫與分散式系統演進的文章。然後去讀 Steve Vinoski 關於 RPC 的文章——你對自己理解的深度是否產生了新的懷疑?

Familiar Tools – 熟悉的工具#

情境#

每個專案都充滿了新事物要學:新的團隊成員、新的角色、新的業務領域、新的技術和新的方法。

問題#

在這些不斷變動中,總得有些東西保持穩定,否則你等於在做研究。當你告訴客戶某個功能需要多少時間交付時,他們需要對你交付能力的信心有所依據。

解法#

識別並專注於一組熟悉的工具——那些你已經不需要查文件的工具,你瞭若指掌它們的最佳實踐、陷阱和常見問題。藉由這些知識,你可以對工作的某些部分提供可靠的估算,將風險限制在新的和未探索的領域。

這些工具是你從一個專案帶到下一個專案的裝備,是讓你比其他候選人更有生產力的原因:

  • 遇到問題時,你已經知道去哪裡找答案
  • 你知道這些工具能解決什麼問題,也知道它們會造成什麼問題
  • 知道不該在哪裡使用它們,和知道它們最適合在哪裡使用一樣重要

隨著時間推移,舒適感帶來生產力的提升,但也潛藏危險:

  • 你可能開始把熟悉的工具視為「金錘子」(golden hammer),認為它能解決任何問題
  • 你可能成為這些工具的專家,以至於無法放手,甚至無法認知到更好的工具已經出現
  • 你在學徒期使用的工具,到你成為 journeyman 時保證已經過時。最終,你所有最愛的工具都會變成垃圾。

Eric Hoffer 說過:「在劇烈變化的時代,繼承未來的是學習者。已經學成的人往往發現自己裝備好去適應一個已不復存在的世界。」

Ade 曾是 Subversion 的極早期採用者,客戶因為他的專業知識而找上他。儘管如此,Ade 從一開始就在追蹤新一代分散式版本控制系統。當 Subversion 過時時,它在 Ade 工具箱中的位置早已被 Git 或 Mercurial 取代。放下熟悉且有價值的工具是一個痛苦的過程,但這是你必須掌握的技能。

行動#

寫下你的熟悉工具清單。如果不到五項,開始尋找能填補工具箱缺口的工具。如果已有五項,仔細檢視:是否有更好更強大的工具可用?你是否抱著已經過時的工具不放?是否有新興工具正在使你的工具箱面臨淘汰?如果需要安全的實驗場所,利用 Breakable Toys。

Wrapping Up – 本章總結#

在正規教育中,你可能習慣了被動地接受課程安排,不加思索地依序消化內容。現在你需要成為自我持續教育的主動參與者,成長為一個能運用強大工具來組織和收集資訊的開發者。

你可能不知道安排課程所需的全部知識,但你有能力綜合許多人提供的建議。學會享受學習過程本身,將在不斷變化的技術環境中為你提供良好的服務——這個環境讓我們永遠保持警覺。

Construct Your Curriculum 模式關係圖