理解軟體工程中的剃羊毛(Yak Shaving)

剃羊毛的定義:不相關任務的鏈條

剃羊毛描述了一系列相互依賴的任務,開發者必須完成一連串先決步驟才能達到最初的目標,最終往往會落在與起點完全無關的任務上。這個詞彙由 MIT AI Lab 的博士生 Carlin Vieri 創造,靈感來自《Ren & Stimpy Show》一集裡剃光羊毛的奇異情節。

兩個常見的例子說明了這種現象:

  • 工具鏈:要砍倒一棵樹,需要斧頭;如果斧頭鈍了,則需要磨石;要取得磨石,必須前往特定的村莊;要旅行,需要一頭羊駝;而使用羊駝之前,必須先把它剃毛。
  • 家務鏈:要洗車,可能會發現水管壞了,於是得去 Home Depot,這又需要 E‑ZPass 付橋樑通行費,E‑ZPass 又得向鄰居借,借的過程需要歸還先前借來的枕頭,而枕頭上有羊毛,需要先把羊毛剃掉,最終又回到剃羊毛的動作。

工程風險:從頭開始構建

從頭開始構建是專業工程中剃羊毛的主要驅動因素。當開發者或管理者因為認為現成解決方案缺乏客製化、想證明技術能力,或誤以為現有工具無法滿足特定需求而拒絕使用現成方案時,就會出現此情況。

在預算與時程有限的生產環境中,這種做法風險極高。當工程師開始「剃羊毛」——自行打造自訂基礎設施而非使用現有工具時,他們往往會失去對原始目標的視野,甚至導致整個專案無法完成。

創造價值:為何剃羊毛令人滿足

儘管存在生產力風險,剃羊毛對工程師而言常常具有內在的成就感。這種驅動力源自於 Frederick P. Brooks Jr. 在《The Mythical Man‑Month》中指出的程式設計核心樂趣:

  1. 製作事物的純粹快感。
  2. 為他人創造有用之物的滿足感。
  3. 構建複雜、相互嵌合的運動部件的魅力。
  4. 持續學習的快樂。
  5. 表達媒介的彈性與自由。

案例研究:Donald Knuth 與 TeX

Donald Knuth 創建 TeX 是極端且成功的剃羊毛案例。1976 年,Knuth 在準備《The Art of Computer Programming》第二版時,發現現有的數位排版方案無法滿足需求。為了解決寫書的問題,他展開了長達十年的從頭構建完整系統的旅程。

為了實現排版一本書的最初目標,Knuth 創造了:

  • 一種全新的程式語言(WEB)。
  • 一種全新的程式設計範式(可讀性程式設計)。
  • 一種全新的換行演算法(Knuth‑Plass 演算法)。
  • 一套自訂字型(Computer Modern)與用於定義向量圖形的語言(METAFONT)。
  • 一種與裝置無關的輸出格式(DVI)。

雖然書籍的出版延遲了十年,但最終產生的系統成為全球科學與數學排版的事實標準。

剃羊毛的教育益處

對於處於學習階段的人而言,剃羊毛的效果尤為顯著。深入探究從頭構建系統所需的先備知識——例如布林邏輯、邏輯電路、電腦架構與作業系統——往往比完成主要作業本身帶來更大的價值。即使最終專案未能完成,學習系統底層機制的過程也足以讓這段努力變得值得。


摘要: 剃羊毛是為了達成單一目標而執行一連串看似不相關任務的過程,這可能導致專案失敗,也可能產生如 TeX 這樣的深遠技術突破。

標題: 理解軟體工程中的剃羊毛(Yak Shaving)

Sources