眨一次眼,大概 100 到 400 毫秒。有個人在 X 上宣布:開機超過 100 毫秒的終端機,對他來說「根本不能用」——換句話說,他對工具的容忍上限,比眨一次眼還快。他試了最近紅到發燙的 Ghostty,結果它花了差不多一秒才開起來,慢了十倍,當場被打入冷宮,還補一句:到底是怎麼用這種東西的?

換作多數作者,這種貼臉嗆聲大概已讀不回。但 Ghostty 的作者 Mitchell Hashimoto 親自跑到那位老兄的串底下回了——沒道歉、沒玻璃心、也沒承諾「下版修快一點」。他做了更狠的事:說那一秒是他故意的,然後用兩段話,把這位老兄連同一票工程師一起釘在同一個錯誤上。

那個錯誤是這樣的:他花力氣去恨的那一秒,剛好就是讓他接下來八小時舒服的那筆錢。

Mogu 插嘴:

這就是整串的鉤子,先貼螢幕邊:你正在拼命優化的那個東西,很可能是一個你一天只按一次的按鈕;而你嫌它慢的那一下,可能正在偷走你真正天天在用的順。Mitchell 厲害的地方不是護航產品,是把「我的終端機開機慢」這種雞毛蒜皮,三兩下升級成一堂「你到底在量什麼」的課。

慢,是因為它先把功課寫完了

Mitchell 的解釋只有一句,但資訊量很大:

Ghostty 是為「長時間、人在用」的場景最佳化的,所以啟動過程包含了一堆預先配置(preallocation)跟註冊(D-Bus)來服務這個目標。

這裡有個反直覺的點,值得停一下:一個開機時做更多事的程式,用起來反而更像不存在。

預先配置,是開機就把之後要用的記憶體、緩衝區一次配滿。代價是啟動慢一拍;回報是之後打字、捲動、貼上一大坨 log 的時候,它不必臨時停下來跟系統討記憶體——延遲是穩的,不會這邊頓一下那邊卡一下。D-Bus 註冊是同個邏輯:在 Linux 桌面跟系統的訊息匯流排登記,一次把通知、單一實體、桌面整合那一整包接好線,登記費在開機那一秒一次收清。

所以那「慢掉的一秒」不是偷懶,是一種刻意的記帳:把成本集中收在一天只痛一次的開機那一刻,去換接下來八小時、幾乎察覺不到它存在的順。那位老兄要的「秒開」,換來的會是另一種終端機——開得飛快,然後在最忙的時候一抽一抽地卡。

Mogu 偷偷說:

天下沒有白吃的午餐,這句話在效能工程裡是物理定律等級的鐵律。你要執行期絲滑,總得有人在某處先買單;差別只在你「看不看得到」那張帳單。Ghostty 把帳開在門口,明碼標價收你一秒;很多「秒開」的工具是把同一筆錢拆成分期,藏進你每一次操作的延遲裡,開得爽、用得鈍。嫌開機慢的人,常常只是沒發現自己在別的地方繳了利息——而且利息比本金貴。

而且,那個開關 Mitchell 早就放好了

這串最諷刺的轉折是:那個讓人崩潰的「一秒」,根本一直有開關。Mitchell 直接給路:

如果你在 Linux 上、就是想要瞬間啟動,去看我們的 systemd 整合說明。那會走同一個行程的單一實體啟動,比幾乎任何東西都快。

機制不難懂:與其每開一個視窗就重啟整個行程、重跑一遍預先配置跟 D-Bus 註冊,不如讓一個行程常駐,之後「開新視窗」只是去戳那個已經跑著的行程、叫它生個視窗出來。第一次照付全額,第二個視窗之後幾乎瞬間。

換句話說,這場「不能用」的控訴,從頭到尾只是把預設值當成了唯一值。Ghostty 把預設押在「對用一整天的人最好」,而不是「對 benchmark 截圖最好」——但它從沒把另一條路鎖死。想要的東西它有,只是得往下讀。

Mogu 真心話:

單一實體常駐自己也是一筆取捨,只是 Mitchell 沒在這條推展開(所以這段算我替他補的,不是他原話):所有視窗共用一個行程,省資源、開得快,但炸起來的波及範圍也變大——那個行程一掛,你全部視窗一起陪葬。每個視窗各自獨立行程剛好相反:開得慢、吃得多,但一個崩了不拖死其他人。沒有哪個叫對,看你怕的是慢、還是怕一起死。連「怎麼開個視窗」這種小事底下都壓著取捨——這才是 Mitchell 真正想讓你看見的東西。

「但取捨是存在的」——這句話為什麼狠

如果前面是設計說明,Mitchell 的第二段才是把刀子轉了一圈:

但講清楚:快速的冷啟動時間,從來不是我們願意犧牲其他東西去換的目標。我們沒宣稱它在這塊很快,也從沒把它當成這個專案的目標。當然,如果能在沒有取捨的情況下拿到效能,我照拿不誤。但取捨是存在的。

乍看像在說「做不到快」。其實不是——他要說的是:不想拿別的東西去換這個快。能力問題和取捨問題,是兩件完全不同的事,而那位老兄把前者扣在了一個只是做了後者選擇的人頭上。

再退一步看,那至少代表 Ghostty 在冷啟動這塊輸了吧?也不是——拿一個專案從沒承諾過的指標去打它,本來就是打空氣。Ghostty 沒在賣「冷啟動最快」,控訴它冷啟動慢,等於罵一台貨車不夠像跑車。

那 Mitchell 是不是在反對「快」這件事本身?完全相反——能不付代價拿到效能,他照拿不誤。他真正反對的只有一件事:假裝快可以不用付錢。

而那位老兄真正踩進去的坑,是工程界最常見的一種——拿一個一天只觸發一次的指標,去評斷一個專為「長時間使用」而生的工具。冷啟動時間是超好 benchmark 的對象:數字漂亮、容易測、發推截圖特別爽。問題是它幾乎不代表真正的使用體驗。沒有人每秒重開終端機;常態是早上開一個,用它跑一整天。那一秒攤進八小時,連零頭都排不上。

Mogu 畫重點:

這毛病在 AI 工具圈簡直是國民病,而且病得更重。大家盯著「首 token 多快吐出來」「model 載入幾秒」「agent 冷啟動多久」這些好截圖的數字互相較勁——可你跟一個 agent 協作,是跑一整段任務的。真正決定生死的,是它跑到第 40 步還穩不穩、context 塞滿之後會不會開始胡言亂語、長任務會不會半路斷線。把一個一天按一次的按鈕優化到天荒地老,卻對那個你盯了八小時的東西視而不見,這不叫工程紀律,叫優化錯維度。說穿了就是拿一個你根本不住的門面去比裝潢,卻讓你天天睡的那間房在那邊漏水——benchmark 數字是給別人看的,你那八小時的死活才是你自己要過的。

所以,一天到底按它幾次

回到開頭那個比眨眼還快的容忍上限。

表面上這串在吵終端機開機快慢,骨子裡 Mitchell 問的,是每個做技術的人遲早要面對的一題:手上正在優化的那個指標,是真的重要,還是只是剛好很好量?兩者長得很像,但賭錯邊的代價,是把力氣全砸在一個自己一天只路過一次的地方。

Ghostty 的答案很乾脆——它賭使用者會用它很久,把資源砸在待最久的那段,而不是只路過的那一瞬。要不同意這個押注也行(真要狂開狂關,單一實體常駐的開關就留著),但很難說它「錯」。錯的是拿量冷啟動的尺,去量一個不為冷啟動而生的東西,然後宣布它不及格。

至於那句「但取捨是存在的」之所以該被框起來貼牆上,是因為它拒絕了那個最甜的謊:以為效能可以白拿、以為快可以不犧牲任何東西。成熟的工程從來不是消滅取捨,是清清楚楚知道自己拿什麼換什麼,然後把選擇講出來、敢認帳。

所以下次有人準備為了一個 benchmark 數字崩潰之前,值得先回答 Mitchell 沒明說、但整串都在問的那句——那個天天盯著看的東西,一天到底按它幾次? (⁠。⁠•⁠̀⁠ᴗ⁠-⁠)⁠✧

延伸閱讀