「管理開源專案最難的不是技術而是人。」Homebrew 十年開發故事

曾是 GitHub 上貢獻者最多的專案,Homebrew 如何面對數不盡的鯛民與填不完的錢坑?

Matt Yu
Matt Yu
Dec 17, 2019 · 14 min read
Photo via Unsplash

一般的電腦使用者想到安裝軟體,應該不外乎是直接從網路下載檔案並執行安裝,或者是直接透過作業系統內建的應用程式商城,如 macOS 的 App Store 或者 Microsoft Store 進行安裝吧!像這樣透過 GUI(Graphical User Interface,圖形使用者介面)這種有可視的圖像並以滑鼠作為核心的作業系統,對現代的使用者而言已經是再習慣不過的事情。

但開發者卻經常用另一種方式來安裝他們在開發環境中所需要的軟體與套件。這種「套件管理工具」(Package Manager)只需要使用鍵盤與 CLI(Command Line Interface,命令列介面)終端機就可以直接完成安裝。而 Homebrew,就是 Mac 系統上很知名的開源套件管理工具之一。

Homebrew 在我終端機的運作畫面截圖。在命令列介面中,使用者完全得透過文字與電腦互動。

為什麼開發者會需要像 Homebrew 的套件管理工具?

確實,如果一款軟體能獨立運作的話,其實套件管理工具相對不那麼重要。但對開發者而言,因為程式開發中所使用的各種程式套件(Package),常常得仰賴其他的套件才能正常運作。而套件管理工具就會在下載新套件的同時,一併檢查電腦系統是否已安裝新套件需要仰賴的套件以及其版本新舊,以確保新套件在下載完成之後就能順利運作。開發者可以藉此省去自己檢查並維護套件的時間,專注於程式開發的工作即可。

用真實生活比喻的話,可以把下載套件這件事想像成在網路商店購買裝修家裡的材料與工具,而套件管理工具則像是你的管家。它會在你買新水龍頭的時候,一併檢查家裡是否有相對應規格的螺絲、起子或扳手。若發現有缺少的東西時,就會在購物時幫你一併下單。這樣才不至於等你收到水龍頭的時候,才發現家裡沒有相對應的工具或材料可供裝修,還得花費心思把工具補齊後,才能正式開工。

Homebrew 官網截圖

Homebrew:要讓管理程式套件跟釀酒一樣簡單且自由

而當初原始作者 Max Howell 之所以想開發 Homebrew,是因為他在音樂串流平台 Last.fm 任職並負責跨平台軟體服務開發時,發現到自己時常需要從零開始研究各套件間的依賴性,卻沒有一套好的工具可供跨平台套件的管理,因此決定要開發一套工具來解決這個問題。他主要採用程式語言 Ruby 做開發,並透過 Git 的技術來管理各個套件的改變與相關細節。

雖然在當時的 Mac 平台上,已經有 MacPorts 這款開源的套件管理工具,也有不少開發者參與維護。但 Max Howell 在 2009 年首次推出 Homebrew 的 GitHub 說明文件中有提到²,他認為 MacPorts 有兩個缺點:一個是 MacPorts 為了能獨立運作,會安裝自己的資料庫與 OpenSSL 憑證,Howell 認為這樣的做法一點意義也沒有;而 MacPorts 為了支援舊的作業系統,在效能上也相對沒有效率許多。

Homebrew 名稱的由來,是因為創始人 Max Howell 當時嗜啤酒如命,且他覺得 Homebrew(英文原意為自釀)很符合他希望這個工具能達成的事情:「我希望能提供一個平台給人們可以在上面管理自己的套件,並且照自己的想法客製化這些套件。」³

Howell 進而從這個點開始認真發想,Homebrew 的各個服務要如何對應到啤酒相關的名詞,像是安裝套件的指令與說明的 formula(原意為配方)曾經名為 recipe(原意為酒譜),因為 beer recipe 其實是比較正規的用法。但他後來覺得 formula 一詞比較獨特,所以最終決定還是使用 formula。其他像是 cellar(酒窖)、bottle(酒瓶)、cask&keg(不同大小的酒桶)、tap(出酒閥)等 Homebrew 中使用的專有名詞,全都是來自與酒相關的詞彙。

Homebrew 的 GitHub 首頁截圖

便利工具的背後,仰賴的仍是工人智慧

然而,往往遇到較大型的版本更新,免不了會有套件版本之間不相容或互有衝突的情況會發生。像是在撰文的當下,Homebrew 上面最熱門的套件之一 Python 雖然早在近兩個月前,就釋出了 Python 3.8.0 的版本,但目前透過 Homebrew 下載的話,仍只能載到 3.7.5 的舊版本。

曾是 GitHub 上貢獻者最多的專案

除了不斷擴充並更新 Homebrew 所支援的套件之外,Homebrew 在這十年間也有不少演進:在跟隨 Max 作業系統的更迭,並持續優化效能之外,比較明顯的改變像是加入對 Mac 應用程式的安裝支援(Homebrew cask),讓那些能安裝在 Mac 應用程式中的軟體也可以透過 Homebrew 進行管理;或是對 Linux 以及 Windows 10 和 Windows Server 2019 原生提供的子系統「 Windows Subsystem for Linux」的支援,讓不同平台的開發者都能享受到 Homebrew 所帶來的便利。

在 Homebrew 的數據頁面上可以看得到,在過去一年間,有 40 種以上的套件透過 Homebrew 下載超過 100 萬次。其中名列前幾名的像是 python、sqlite、openssl、readline,甚至都超過 500 萬次的下載次數。若由頁面上公開的數據回推,過去一年間透過 Homebrew 下載/更新的套件有超過 2.06 億次。可見 Homebrew 在開發者間的火熱程度。

Homebrew 首度在 KickStarter 募資時的主視覺(照片來源:brew test-bot)

非營利的 Homebrew 如何維持經濟自主?

(編按:本文中的開源貢獻者(Contributors),指的是僅提交程式碼與文件修改,仍需要有人批准或給程式碼建議的參與者,可以想像成公司內部的基層員工;而維護者(Maintainers)則負責檢查與核准貢獻者所提交的修改,也是開源專案中最關鍵的人物。)

雖然 Homebrew 並非商業專案,專案的維護者與貢獻者也並不會從維護 Homebrew 中獲得收入。但是像是租用自動化測試的機器或雲端空間、舉辦 Homebrew 開發者的線下聚會等等,仍需要一定的費用。因此 Mike McQuaid 等 Homebrew 的維護者,也曾透過群眾募資專案等方式,讓 Homebrew 能經營下去。

在 2013 年,Homebrew 便首次透過 Kickstarter 進行群眾募資專案「brew test-bot」,旨在募集資金購買機器來自動化測試貢獻者所呈交的 formula 是否能正常運作,進而加快整合 formula 到 Homebrew 中的速度。這項群眾募資最終募得超過 10 倍的資金,也因此能購入更多台的設備進行自動化測試。現在 Homebrew 在 Patreon 上也可以收受群眾的捐款,目前約有 1,000 名的贊助者,每月可獲得 2,500–2,600 美元(約新台幣 76,000–79,000 元)的贊助。在 GitHub 開放 Sponsor 功能之後,Homebrew 也有加入這方式讓群眾贊助。

然而,在逐漸獲得讓 Homebrew 穩定運作的資金同時,還有另一項棘手的事情要處理:雖然 Homebrew 並非營利專案,所有的貢獻者都是不支薪的,但像 Homebrew 這樣大型的自發性組織若要合法地運用募集來的資金,其實也有各種法規需要遵守,而這 對Mike McQuaid 等不熟悉法律的 Homebrew 主要維護者,可說是一大難事。

因此 Homebrew 後來也申請加入軟體自由保存組織(Software Freedom Conservancy)這個非營利組織,並在他們的協助下能無需擁有自己的非營利組織,就合法地透過 Software Freedom Conservancy 獲得支持者的捐款,且在不影響開發工作流程的情況下,接受財務與經營上的審查與協助,維持 Homebrew 的社群運作順暢。

homebrew-core 的 GitHub 頁面截圖。homebrew-core 是用來負責儲存 Homebrew formulae(Homebrew 的指令/說明)。從截圖中可以看到目前已累積將近 8,000名貢獻者,並有超過 16 萬次的 Commit

管理開源專案最辛苦的並非技術,而是處理人的事情

他認為 Homebrew 的開源社群之所以會如此活絡,是因為 Homebrew 的使用者中有很大部分本身就是開發者,不僅更熟悉開源的概念,也對技術有更深的掌握。所以與 Firefox 這種面向消費者端的開源軟體相比,自然能吸引到更多參與者。據 McQuaid 表示,Homebrew 至今已累積超過 7,000 名的貢獻者,而每月約有數百人活躍於貢獻 Homebrew。

但或許也是因為 Homebrew 在開源圈的高知名度與高使用量,McQuaid 在訪談中提到,他認為擔任 Homebrew 的專案領導人,最累的事情並非技術層面,而是處理人的事情。不僅要對內協調與開導 Homebrew 的貢獻者,對外也要面對 Homebrew 使用者各種無理的需求甚至辱罵,以及各種行政上的事務。也因此,隨著 Homebrew 的演進,他們也制定了相對應的治理條例,以及寫給貢獻者與維護者的相關文件,供需要的時候做參考。

給開源維護者的建議:別把自己累壞了

此外,他也提出一套「開源貢獻者漏斗」(The Open Source Contributor Funnel)理論,以 Homebrew 的成功經驗為基礎,教導其他有志於推廣開源專案的開發者,如何吸引到更多更好的專案貢獻者。⁵

日前(2019 年 11 月),Homebrew 釋出 2.2.0 的新版本,不僅針對新作業系統 Catalina 的更新與效能提升,也進一步加強對 Linux 作業系統的整合度,持續擴展 Homebrew 在開發者中的影響力。

而當談到 Homebrew 未來的開發規畫,McQuaid 提到他希望能為 Homebrew 的使用者分眾,讓少部分的使用者可自行選擇加入 beta 版的測試,藉由這種方式讓比較不穩定但具實驗性的功能,能由更多 Homebrew 的使用者測試並回報問題,而不會只限縮在現有 Homebrew 的維護者與貢獻者。⁶這麼一來,更多的 Homebrew 功能才能更快地被部署在正式版的 Homebrew 當中,幫助更多的開發者/使用者都能持續享受大家透過 Homebrew 所釀造出的迷人開發環境。


參考資料:

  1. “How package management changed everything”
  2. Homebrew 在 GitHub 的首筆紀錄
  3. The Changelog — Episode #232|Homebrew and Swift with Max Howell
  4. “Research Study Interview: The Work of Maintaining Open Source Software”
  5. “The Open Source Contributor Funnel (or: Why People Don’t Contribute To Your Open Source Project)”。「開源貢獻者漏斗」的主要概念是,所有的開源專案維護者都曾經只是專案的貢獻者,而所有的貢獻者,都曾經只是使用者。一如行銷學中的銷售漏斗(Sale Funnel),只要專案能吸引到越多使用者,會轉變為貢獻者與維護者的人也就越多。而開源專案的品質高低以及使用群眾的多寡,就會是影響貢獻者人數的重要因素。文中 McQuaid 也分享幾個吸引優質貢獻者的方法,以及當貢獻者不斷出走時,建議可以檢查的部分。
  6. Homebrew 在 Patreon 的募資頁面
  7. “User and Feature Segmentation in Homebrew”
  8. “Making Homebrew Financially Sustainable”
  9. “Open Source Maintainers Owe You Nothing”
  10. The Changelog — Episode #223|Homebrew and package management with Mike McQuaid

Star Rocket

Star Rocket 三創育成是非營利的創新育成機構, 以「人」為核心,「科技」為養分,致力成為最開放的創新育成空間,透過自辦課程跟活動策展,活絡台灣創新與技術社群,並培育創新創業人才;同時,藉由內容產製跟資料庫的建立,追蹤、記錄創新故事,啟發人們踏入創新航道。

Matt Yu

Written by

Matt Yu

If in Maokong a reader.

Star Rocket

Star Rocket 三創育成是非營利的創新育成機構, 以「人」為核心,「科技」為養分,致力成為最開放的創新育成空間,透過自辦課程跟活動策展,活絡台灣創新與技術社群,並培育創新創業人才;同時,藉由內容產製跟資料庫的建立,追蹤、記錄創新故事,啟發人們踏入創新航道。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade