軟體工藝精神概念圖

Apprenticeship makes a difference because it instills a lifelong passion to master the craft. – Pete McBreen, Software Craftsmanship

本書寫給軟體學徒——那些已經嘗過開發軟體滋味、想更進一步、卻需要方向指引的人。不論你出身名校資工系或完全自學,你都意識到世上存在真正優秀的開發者,而你渴望達到同等水準。這本書不是寫給你的老闆或教授,而是寫給站在旅程起點的你。

書中深受軟體工藝(Software Craftsmanship) 理念影響。工藝模型源自中世紀行會制度:小型團隊協作,資淺學徒在工匠與大師身邊學習。作者的目標是激勵熱愛創造軟體的人,不要輕易踏上「晉升管理職、幾年後後悔」的老路,而是讓軟體開發成為值得投入一生的職業。

Dave 的故事#

作者 Dave 以自身經歷示範了學徒模式如何串聯運作:

  • 12 歲想學 BASIC、25 歲想學 Java,兩次都以失敗告終
  • 26 歲時在 Edventions 遇見兩位導師(Mentor):創辦人 Irv 給了他 Programming Perl 並描述一個可以動手做的練習玩具(Breakable Toy);CTO Steve 則手把手教他除錯技巧
  • 過程中最難的是向資深工程師暴露自己的無知(Expose Your Ignorance),但放下自尊後,得到的快速指點讓他順利完成專案
  • 兩年後他拓展能力邊界(Expand Your Bandwidth),參加 XP/Agile Universe 研討會,認識了 Martin Fowler、Kent Beck 等人
  • 想讀 Refactoring to Patterns 卻發現自己根本不懂重構與模式,於是退回更基礎的書,把進階書放回閱讀清單(Reading List)
  • 2005 年重拾 Ruby 時,發覺自己用 Perl 思維寫 Ruby,刻意選擇戴上白帶(The White Belt),拋開舊習從頭學起
  • 並透過在網站上記錄學習過程,實踐暴露無知的模式

Dave 的故事貫穿了多個學徒模式:Breakable Toy、Expose Your Ignorance、Expand Your Bandwidth、Reading List、The White Belt 等。這些模式並非孤立使用,而是相互搭配,產生強大的成長動力。

什麼是軟體工藝?#

字典對 craft、craftsman、craftsmanship 的定義往往互相循環引用,無法提供真正有用的指引。Pete McBreen 的 Software Craftsmanship 一書試圖建立替代工程學派的宣言,但也有缺陷——他把軟體工藝定位為軟體工程的對立面,要求讀者二選一。本書作者認為,工藝模型可以用正面方式定義,不必排斥軟體工程的價值

中世紀行會模型#

作者從中世紀歐洲工業革命前的工藝體制汲取靈感:

  • 大師(Master) 擁有工坊,掌握絕對權威
  • 工匠(Journeyman) 是尚未完成「曠世巨作(chef d’oeuvre eleve)」的手藝人,在城市間遊歷,是技術傳播的唯一管道,同時負責督導學徒的日常工作
  • 學徒(Apprentice) 跟隨一位大師數年,直到證明已吸收基本技能與價值觀後,晉升為工匠

這套系統容易被濫用,在現代社會既不實際也不合法。作者並非要複製浪漫化的古老工坊,而是主張建立一個現代工藝工作室——自由地改進過去,而非單純模仿。

軟體工藝的核心價值#

從 Agile 運動學到的教訓是:光告訴別人「該怎麼做」無法產生持久改變,但如果內化了規則背後的價值觀,就能為任何新情境創造新的實踐。軟體工藝是一個由共同價值觀凝聚的實踐社群(Community of Practice),核心價值包括:

  • 成長心態(Growth Mindset):源自 Carol Dweck 的研究——「努力讓你變得聰明或有才華」,失敗只是下次換個方法的動力,而非天賦不足的證明
  • 持續適應與改變:承認自己做得不夠好,並積極尋找解方(Atul Gawande 所言的態度)
  • 務實而非教條:願意犧牲理論的純粹或未來的完美,優先把今天的事做完
  • 分享而非囤積:與其製造稀缺,不如將知識分享出去,這通常與參與自由與開源軟體社群有關
  • 勇於實驗並接受被證明是錯的:嘗試、失敗、從失敗中學習,再進行下一次實驗
  • 內控信念(Internal Locus of Control):掌控並承擔自己的命運,而非等待別人給答案
  • 聚焦個人而非群體:這不是有領袖與追隨者的運動,而是一群想提升技能的人,透過辯論與異議(而非盲從權威)來成長。改變在自己身上,不在世界
  • 包容性:不排斥企業軟體開發、電腦科學或軟體工程,而是從所有領域吸收最好的想法
  • 以技能為中心,而非以流程為中心:高超技能比「正確的」流程更重要。沒有任何流程或工具能讓所有人同等成功
  • 情境學習(Situated Learning):最好的學習方式,是與正在用你想學的技能達成某個目標的人待在同一個空間裡

這套價值體系不是要你全盤接受或全盤否定,而是提供一個思考框架。你可以擁抱、強化、拒絕,或走一條完全不同的路。

學徒的三個階段#

軟體工匠的成長路徑分為三個階段,每個階段保留前一階段的特質,並疊加新的責任。

學徒期(Apprentice)#

  • 核心焦點:向內看,專注於成長自己的技藝
  • 心態:永遠存在更好、更聰明、更快的做法——學徒制就是不斷演進、尋找更好方式的狀態與過程
  • 關鍵認知:學徒制由你自己掌控,結果也是你的責任。理想情況是在由學徒、工匠、大師組成的小團隊中學習,但即使環境不理想,你仍然可以自己創造學徒經歷
  • 驅動力:內在驅動,不依賴他人賜予解答。如 Dweck 所言,這不是靠容易的成功餵養、也不是靠讚美高智商獲得的東西,而是透過「重視學習勝過看起來聰明、擁抱挑戰、把錯誤當成通往精通的路徑」來自我裝備
  • 過渡:從學徒到工匠的轉變通常是漸進且回顧才看得出的——某天你被告知,你的工作與角色已經是工匠了

工匠期(Journeyman)#

  • 核心焦點:在保持內在學習的同時,將焦點擴展到從業者之間的連結——團隊內外的溝通管道
  • 傳統角色:工匠在大師之間遊歷,將想法散播到不同團隊。現代軟體開發中,你可能長期待在同一個團隊,但仍需專注於改善團隊內的連結,最終承擔起指導周遭人並與整個產業溝通的責任
  • 核心任務:建立不斷擴大的作品集(Portfolio),展現自身工藝的進步;在專案與導師間遊歷,深化與多元化作品集;提升社群中的地位;準備成為大師
  • 責任:比學徒大得多,失敗造成的傷害也更大。某些學徒模式不適用於工匠,正因為他人可能視工匠為導師

大師期(Master)#

  • 核心焦點:在扮演好學徒與工匠角色的基礎上,致力於推動整個產業向前
  • 精通不是終點:「獲取精湛技巧與技術」只是起點。大師要把自己的技能變成一面放大鏡,以數量級的倍率增強他人的能力
  • 表現形式:創造直達軟體開發本質的新工具、培育一代技能等於甚至超越自己的工匠,或是某種我們尚無法想像的貢獻
  • 核心信念:獲取、運用與分享卓越技能,是身為軟體工匠最重要的事

無論處於哪個階段,保持學徒精神都是持續成長的關鍵。即使成為大師,也要記得自己曾是學徒。

什麼是學徒制?#

The fundamental learning situation is one in which a person learns by helping someone who really knows what he is doing. – Christopher Alexander et al., A Pattern Language

學徒制的經典印象是少年在鐵匠鋪裡跟著師傅打鐵,幾年後學成出師。但現代軟體開發中的學徒制,與這種刻板印象幾乎毫無相似之處。

本書不是在描述一套理想的學徒制度。如果讀者是團隊領導或專案經理,提供建構理想學徒制的指南才合理。但這本書是寫給正在壕溝裡奮戰、試圖搞清楚「我該學什麼、怎麼學」的新手。對大多數人來說,現代的學徒制主要是一種心態

  • 你承認自己仍在起點,即使已經寫了好幾年程式
  • 你準備好在現有環境中,主動創造自己的學徒經歷

多數人不會有機會在正式學徒制中受教於軟體工匠。現實是,你必須在不理想的環境中——霸道或無能的主管、失去動力的同事、不可能的截止日期、把新手當工作馬使喚的組織——自己「抓」出學徒經歷。本書的所有經驗教訓,都來自在這類環境中掙扎過來的人。

學徒制是學習如何成為專業軟體開發者的途徑:尋找優秀的老師,抓住與他們並肩工作的機會。它是通往「不只是堪用,而是卓越」的第一步。

什麼是學徒模式?#

學徒模式(Apprenticeship Pattern) 嘗試為採用工藝模型的人提供職涯改善的指引。所有模式都萃取自作者自身與受訪者的經驗。如同任何好的模式集合,它們應該讓你覺得「不新奇」——因為你周遭的人已經在使用了。

這些模式的另一個特質是生成性(Generativity):每次套用都會產生不同的結果。它們不是保證相同輸出的演算法,而是解決一組問題同時創造新問題的工具。訣竅在於用你的判斷力,選擇你偏好面對的問題。

本書以模式語言(Pattern Language) 組織——一組針對特定領域常見問題的相互關聯的解決方案。最早的模式語言由 Christopher Alexander 在 A Pattern Language 中提出。Ward Cunningham 和 Kent Beck 在 1990 年代將模式語言引入軟體產業。但請注意,這本書不是關於軟體設計的書,而是關於設計你的職涯起點,讓你為成為優秀開發者做好準備。

模式從何而來?#

好的軟體框架應該從運作中的系統萃取而來,模式也是如此。本書的模式最初萃取自 Dave 的學徒經歷,再用 Ade 的故事測試與補充,最後對照約 30 位從業者(經驗從數年到數十年不等)的經驗進行驗證。

作者透過訪談確認這些模式確實是常見問題的常見解法,同時挖掘尚未被辨識的新模式。他們也在多個工作坊(PLoP 2005、Agile Atlanta、ThoughtWorks 內部會議)中改善模式的結構與嚴謹度,並將大量素材公開上線以徵求社群回饋。

從這裡開始,往哪裡去?#

當你開始學習這些模式時,請記住:

  • 你有權力選擇、組合、調整這些模式,以無限多種方式適應你的獨特處境
  • 模式是為特定對象、在特定情境下撰寫的。未來某些模式會突然變得切身相關,某些又會突然顯得不適用
  • 學徒期是職涯中的一個季節:在這段時間裡,你的焦點幾乎完全放在自身成長上。這是一段允許你延遲最大化收入、轉而最大化學習機會的時期,也因此容許某種程度的「自私」
  • 當這個季節結束,你的優先序必須調整——你不再是學徒(儘管仍有大量要學的),重心需要轉向客戶、同事與社群

全書模式總覽:Software Craftsmanship 模式關係圖