理解軟體工程中的剃羊毛(Yak Shaving)
剃羊毛的定義:不相關任務的鏈條
剃羊毛描述了一系列相互依賴的任務,開發者必須完成一連串先決步驟才能達到最初的目標,最終往往會落在與起點完全無關的任務上。這個詞彙由 MIT AI Lab 的博士生 Carlin Vieri 創造,靈感來自《Ren & Stimpy Show》一集裡剃光羊毛的奇異情節。
兩個常見的例子說明了這種現象:
- 工具鏈:要砍倒一棵樹,需要斧頭;如果斧頭鈍了,則需要磨石;要取得磨石,必須前往特定的村莊;要旅行,需要一頭羊駝;而使用羊駝之前,必須先把它剃毛。
- 家務鏈:要洗車,可能會發現水管壞了,於是得去 Home Depot,這又需要 E‑ZPass 付橋樑通行費,E‑ZPass 又得向鄰居借,借的過程需要歸還先前借來的枕頭,而枕頭上有羊毛,需要先把羊毛剃掉,最終又回到剃羊毛的動作。
工程風險:從頭開始構建
從頭開始構建是專業工程中剃羊毛的主要驅動因素。當開發者或管理者因為認為現成解決方案缺乏客製化、想證明技術能力,或誤以為現有工具無法滿足特定需求而拒絕使用現成方案時,就會出現此情況。
在預算與時程有限的生產環境中,這種做法風險極高。當工程師開始「剃羊毛」——自行打造自訂基礎設施而非使用現有工具時,他們往往會失去對原始目標的視野,甚至導致整個專案無法完成。
創造價值:為何剃羊毛令人滿足
儘管存在生產力風險,剃羊毛對工程師而言常常具有內在的成就感。這種驅動力源自於 Frederick P. Brooks Jr. 在《The Mythical Man‑Month》中指出的程式設計核心樂趣:
- 製作事物的純粹快感。
- 為他人創造有用之物的滿足感。
- 構建複雜、相互嵌合的運動部件的魅力。
- 持續學習的快樂。
- 表達媒介的彈性與自由。
案例研究:Donald Knuth 與 TeX
Donald Knuth 創建 TeX 是極端且成功的剃羊毛案例。1976 年,Knuth 在準備《The Art of Computer Programming》第二版時,發現現有的數位排版方案無法滿足需求。為了解決寫書的問題,他展開了長達十年的從頭構建完整系統的旅程。
為了實現排版一本書的最初目標,Knuth 創造了:
- 一種全新的程式語言(WEB)。
- 一種全新的程式設計範式(可讀性程式設計)。
- 一種全新的換行演算法(Knuth‑Plass 演算法)。
- 一套自訂字型(Computer Modern)與用於定義向量圖形的語言(METAFONT)。
- 一種與裝置無關的輸出格式(DVI)。
雖然書籍的出版延遲了十年,但最終產生的系統成為全球科學與數學排版的事實標準。
剃羊毛的教育益處
對於處於學習階段的人而言,剃羊毛的效果尤為顯著。深入探究從頭構建系統所需的先備知識——例如布林邏輯、邏輯電路、電腦架構與作業系統——往往比完成主要作業本身帶來更大的價值。即使最終專案未能完成,學習系統底層機制的過程也足以讓這段努力變得值得。
摘要: 剃羊毛是為了達成單一目標而執行一連串看似不相關任務的過程,這可能導致專案失敗,也可能產生如 TeX 這樣的深遠技術突破。
標題: 理解軟體工程中的剃羊毛(Yak Shaving)