〈Software Engineering Daily〉-EP-Software Verification in the Age of Coding Agents

https://softwareengineeringdaily.com/podcasts/software-verification-in-the-age-of-coding-agents/

Software Engineering Daily 這一集由 Sean Falconer 主持,來賓是 Antithesis 的 Carl Sfera。他在公司的 Red Team,也帶相當一部分 AI 策略。Antithesis 做軟體 verification。做法叫 deterministic simulation testing。平台把客戶的軟體放進完全受控的環境,執行時探索幾千條路徑。路徑事先沒有寫死,團隊預期會走到的情況只是其中一部分。一般 test 確認的是人已經想到的行為,殺傷力大的故障躲在開發時沒人去查的邊角。AI 寫出的程式愈來愈多沒有人仔細看過,這些盲點跟著變大。節目把測試說成做可靠系統少不了的一環,也是最難做好的事之一。

Red Team 向產品負責人回報

Carl 職務上在 Red Team。這支隊伍不是資安紅隊。名字來自一個假設:若請一群一輩子在建分散式系統、也在測分散式系統的人,給他們幾乎沒有上限的 Antithesis 使用權,讓他們先把這套技術用到很熟,再拿這支隊伍去幫客戶把技術用滿,會怎樣。

他給自己的目標是成為 Antithesis 的專家,然後幫客戶找出分散式系統裡很難的 bug。AI 策略那一塊,讓他同時面對客戶跟產品。公司另有完整的 FDE 團隊,每天在客戶那邊,幫他們寫 test harness、把 Antithesis 用起來。Red Team 是內部後援。進到一家客戶的狀況裡,先找出這家要成功還缺的那一步,再交回 FDE,讓 FDE 手上有足夠的資訊跟知識去做判斷。FDE 從這裡學到做法,再套到很多客戶,少數人的經驗就被放大。

Sean 提到這些經驗該流回產品,不能每次遇到都只修那一次。Carl 確認了。Red Team 向上報給產品負責人,不在業務組織裡。放在產品底下,是為了把東西做進產品,每一個客戶都用得到。

角色不好命名。它站在對客戶跟對產品中間,所以需要一個抽象、活動空間大的名字。Sean 在待過的公司看過不同版本,自己在 Google 也待過這類團隊的某些區塊。他說這類功能很有用,只是還沒有大家都同意的主流名稱。位置大概同時踩著產品工程跟 field engineering。

Red Team 裡每個人盯一塊產品。Carl 盯跟 AI 的關係。Antithesis 的 AI skills repos 是他寫的。另外有一支給 Agent 用的 CLI,讓 Agent 跟產品互動。隊友 Lawrence 盯 property-based testing 的函式庫,名字是 Hegel 跟 Bombadil。每人在自己感興趣的那一面,多放一點產品時間。

回歸 test 把已經存在的行為釘死

可靠性工具跟測試長期投資不足。一個壞 bug 對產品體驗的殺傷很大,最好的工程師卻通常不會被放去想測試策略。Sean 說,Antithesis 執行長 Will Wilson 也講過類似的話。測試被當成多數工程師討厭的雜務,肯專心做的人很少。

Carl 用 SingleStore 的十年說明他看到的原因。公司以前叫 MemSQL。他們做資料庫,測試上砸了非常大的工程力氣,文化是很極端的 shift left。寫程式的人同時寫 test,整件事自己負責。

他們發現,測試愈能從一種寫法展開成很多種情況,工程師愈願意用。內部的測試叢集叫 Sidux。Sidux 讓人寫會展開的 test。寫一條,把輸入空間參數化,就變成很多條。測試於是變成一個工程問題。工程師得先想要測什麼、有哪些測法,再寫一條會生出各種攻擊方式的 test,去驗證這一段程式。

工程師不愛 test,他覺得常常是因為 test 多半在做回歸。功能 X 做完,test 把功能 X 釘進可接受的結果裡。為未知的未知寫 test 很難。那也是他覺得比較有趣的 test。組織於是不想把最好的人放上去。寫出來的 test 停在回歸空間,把已經存在的行為編碼進去。未來空間裡那些還沒被想到的情況,很少有人寫。

未知的部分長成一棵樹

那種未來空間難測,先難在狀態。程式大致分成純的,跟有狀態的。純的程式,大家拿 unit test。若干輸入對上若干可接受的輸出,怎麼測很直接。比較有意思的軟體,再往上到高階一點的系統,尤其分散式系統,幾乎整包都高度有狀態。行為取決於到這一刻為止、整套軟體收過的輸入,也取決於以後所有可能的輸入。空間非常大。

要測的行為很多從故障長出來。想問的是 A 發生之後 B 發生,然後 C 發生,而 B 跟 C 是壞事。輸入錯了,或某個地方出錯。人通常寫 integration test,把一條特定的時間線編碼進去。人腦好處理這種東西。強迫軟體依序做 A、做 B、做 C,想得清楚。

要為一個還不知道存不存在的情況寫 integration test,做法就不明顯。勉強說得通的路,是在步驟 A 試所有可能的輸入,再對每一個 A,在步驟 B 試所有可能的輸入,然後繼續往下。長出來的是一棵樹。Sean 直接把它叫組合問題。

狀態機若是純的,沒有非確定的副作用,測起來直觀。現代軟體的情況不一樣。分散式系統的 state space 有一大片是非確定的。那些非確定性沒辦法用確定的方式模擬,問題就變硬。Carl 回憶 SingleStore,也就是進 Antithesis 之前。他們多半停在 integration test,測已知存在的事件序列,那些基本上是回歸。偶爾在路上注入故障,確認某個錯誤有被處理對。另一種是 stress test。不鎖一條時間線,改測極大量的隨機時間線,再看總體有沒有想要的性質。它們都收斂,或都恢復得回來。

未知的未知就是難測得多。多數人寧可守比較簡單的那格,確認最明顯的失敗路徑有被處理。他認為最好的測試,是能碰到未來那片可能性的測試。

壞天氣要連續下,mock 要比正式環境更糟

Netflix 把 chaos engineering 做出名。Carl 認為那就是在處理這種未知。Meta 講過類似的做法,Google 對 Google Cloud 也做不少 chaos engineering。Sean 補了一層。記得住的名字是 Netflix 取的。超大規模的公司大概早有類似功能,名字沒那麼響,後來別人從 Netflix 那邊學。

在 Carl 的描述裡,Netflix 做的是大規模 stress test,而且放在正式環境。系統若不斷處在壞天氣裡,可靠性會被逼著做快,比壞天氣很少出現時快得多。壞天氣指的是故障跟不正常條件一直發生。文化改成這些情況隨時都得應付。測試系統本身也可以變成一場不中斷的壞天氣 stress test,並要求系統在那種天氣裡隨時活得下來。

Sean 有過一個沒有名稱的版本。他第一份工程工作大約在 20 年前,人還在唸大學。開發伺服器又差又慢。東西在那裡能以還可以的速度跑起來,上正式環境就知道沒問題,因為正式環境容量大得多,機器也好得多。那個環境夠快,上線會更快,也扛得住一整排條件。

Antithesis 的客戶到了某個時點要把系統帶進平台,有時得 mock 一個外部服務。依賴 Stripe 是他常舉的例子。Stripe 放不進 Antithesis,得做一個像 Stripe 的東西。常有人問,mock 的擬真若跟 Stripe 不相等,測試算不算無效。他的框法是,mock 要比實際會發生的更糟。只要行為是正式環境的超集,而且多出來的都更糟,就可以拿來驗證軟體。做一個失敗情境更寬、比完美擬真更糟的 mock,有時比做一個完全擬真的 mock 容易。他用這個方式把這筆帳配平。

系統現在還會依賴另一種非確定。業務邏輯在多步流程裡問 LLM 下一步做什麼,再用機率看輸出多常符合預期的形狀。Carl 不覺得這改變了測試的觀念。它把要測的 state space 打開不少。從那一點能走的下一步可能爆開。極端的例子是讓 LLM Agent 在 Linux sandbox 裡跑,機器上它想做什麼就能做什麼。下游所有會對這個新輸入起反應的軟體,都得應付寬很多的輸入。所以更需要 DST 這種、把所有可能的下一步都拿去測的做法。

整套系統只接受平台注入的非確定性

Carl 跟客戶講 DST,先拆成兩樣材料。第一樣是確定性。受測的系統要能重播。做法不止一種。Antithesis 對 Linux 軟體提供自動的做法。軟體照原樣部署上來。可以把它想成一個部署目標,像一台 EC2。整套軟體都跑在同一台裡面,例如拆成幾個 Docker container,整個系統就是確定的。它只會遇到平台注入的非確定性,注入由平台控制。軟體自己仍看得到隨機、時間,以及可能不一樣的事件順序。平台注入的那一份,可以原樣重現。

另一條路是改寫軟體,把所有可能的非確定性都改成從外面注入。環境得被控制。讀時間、讀隨機這類來源時要可控,排程也要可控,事件順序照受控的方式發生。

隨機數不用客戶自己 mock。在 Antithesis 上這件事交給平台,系統的隨機性由他們控制。從系統讀隨機數,例如 Linux 的 /dev/urandom,拿到的都是平台完全控制的值。很多軟體會讀 /dev/random 跟時間,把位元混過,再拿去初始化一顆 PRNG,讓隨機數生得比較快。多數 runtime 都這樣做。跑在 Antithesis 上時,他們建議不要留著這顆 PRNG。軟體若要用隨機,改成每次直接讀系統的隨機來源。

原因是第二樣材料:模擬。他們要在每一個當下控制隨機。一顆已經排好後續數字的 PRNG 做不到這件事。每次做決定都得來問平台。DST 要能把模擬分叉。軟體可以看成一連串輸入造成的狀態改變。起點是根時刻,程式剛起來,狀態完全已知。接著輸入進來,歷史沿一條線往前走。因為確定,可以回到這條線上的任何一點再分出去。在那一刻改掉隨機,從那一刻長出另一條時間線,往後走它自己的歷史。

每次決策都讀平台的系統隨機,分叉就能切得很細。中間若夾一顆 PRNG,時間線就算分叉,新的分支仍會看到同一串隨機數,除非有辦法把 PRNG 重設。確定性指的是軟體每次看到同一串事件,而且可以重播。模擬指的是把那條時間線分成新的時間線,去試不同的事件順序。

他用三個節點的分散式系統舉例。先等到其中一個節點因故崩潰。多數這類系統,例如 Raft,應該承受得住一個節點死掉。崩潰之後分出一大束時間線,試不同的後續。那個節點若在新的領導者選舉走到一半時恢復,會不會出現壞事。能從任一點分叉,用不同順序試不同的事,等於對軟體的 state space 做廣度優先搜尋。

分支爆得快的地方,搜尋就往那裡擠

平台怎麼決定往哪分叉,Carl 說跟檢查上傳程式的位元組很接近。做法接到 fuzzing,也就是隔壁那塊研究。他用 JPEG encoder 說明。要驗證的是,encoder 吃得下任意數量的輸入位元組,隨便什麼雜訊,永遠編成合法的 JPEG,或乾淨地報錯,例如絕不崩潰。裡面一種策略叫 coverage-guided fuzzing。監看受測程式走了哪些分支。libjpeg 內部很多 if,各自走不同分支。記錄哪些分支被觸發。隨機雜訊送進去,慢慢做出對照。這份雜訊觸發這一串分支,換一份雜訊,另一串分支被走到。迴圈轉得很緊、轉很多次,對系統累積出知識。

Sean 把它說成黑箱。輸入進去,同樣的輸入得到同樣的輸出,再改輸入去改輸出。他聯想到去年一集談逆向晶片。Apple 不給晶片藍圖。靠輸入可以模擬硬體會生出什麼,看實際發生什麼,做出一個行為上模仿那顆晶片的模擬器。內部怎麼做不知道,知道的是輸入跟輸出。

Carl 說 DST 用的是同一類策略。軟體在 Antithesis 裡跑,完全確定。coverage 的分支是他們監看的輸入之一。系統上還有別的訊號,用來分辨現在看到的是新行為,還是已經見過的行為。他們會偵測自己是不是在繞圈。若在繞,就分叉,試著跳出那個圈,去找另一塊值得操的程式。

這樣跑會自己冒出一些性質。其中一項是,某種 thread 順序造成的 bug 很好找。thread 怎麼拿 lock、怎麼碰共享記憶體,都在這類裡。那一塊若很快出現不同的分支路徑,平台會派出一批自己跑的搜尋,全部從那段爭用很兇的程式開頭出發。最近對上的例子是 SQLite。

今年稍早,SQLite 有一個被回報、然後被修好的 bug。它在專案裡待了 10 年,大約從最初寫 write-ahead log 的程式就在。Carl 會追 SQLite。他把這個 bug 叫 WAL reset。形態是很難抓的並行問題。一條 thread 從共享記憶體讀出資料,然後睡著。另一條 thread 改了那份資料。第一條醒來,沒有在醒來之後做正確的重新驗證。窗口緊到他相信,大概只有一個 SQLite 大客戶真的撞上過。那個客戶是 Tailscale。釘死這個 bug 花了很長時間。Tailscale 今年稍早做了很多研究,把發現發表出來,bug 接著被修好。

他看到時認為,這個形狀正好是 Antithesis 該能很快找到的。他拿修補前、還帶著 bug 的那一版,放進平台,配一份很簡單的 workload。workload 迴圈做 insert 跟 WAL checkpoint。沒有專門瞄準這個 bug,但有操到相關程式。跑下去,15 分鐘後 fuzzer 找到它,並把範圍縮到必須發生的那一串操作順序。

這份 workload 確實用上了他事先知道 bug 在哪一帶。焦點放在那一塊程式。很快找到之後,他另寫一份通用的。所有 SQLite 操作以均等機率出現。有 select,有 insert。不只走 write-ahead log,也走預設那套以 journal 做交易的系統。等於把整個系統操過。這份仍然在大約 15 分鐘內找到同一個 bug。

平台會自己注意到哪些區域把行為空間炸開。一批新行為出現,fuzzing 的力氣就集中過去,直到新行為出現的速度慢下來,再換一塊。

日誌的順序是真的,時間也可以倒回去

用的人若只拿到「這個輸入產生了不該有的輸出」,還是不知道往哪看。平台給的第一樣是日誌。全部日誌合成一個視圖,而且跟操作順序嚴格對齊。傳統分散式系統裡,兩件事誰先誰後常常得猜。Antithesis 控制所有執行怎麼被排成序列,日誌裡的順序就是模擬裡的順序。解析度因此很高。

第二樣是 properties。系統放進來時,要一併給一大批 property。他測 SQLite 用的那條很簡單。請平台跑 pragma integrity check,也就是 SQLite 內建、用來問資料庫有沒有損壞的檢查。模擬跑起來之後,隨機挑時間點執行。一旦發現損壞,fuzzing 會往那個區域收。這是另一個「這裡有東西」的訊號。沿著發現問題的任何一種順序,都能回看系統,也等於告訴平台,什麼情況算是這套系統可能壞了。

後面兩樣,讓它跟單純的 observability 平台分開。multiverse debugging 允許在模擬的任何時刻 SSH 進系統。假設 integrity check 在大約 30 秒失敗。前 30 秒裡有東西把資料庫弄壞了,但不知道是哪一刻。可以 SSH 進那個叢集,跑 SQLite 的操作,把時間倒回,用二分搜尋找損壞真正發生的點。找到之後可以進 GDB。

causality analysis 把這件事改成平台自動做。找到 bug,想知道它在哪一刻被鎖進模擬,平台自己做二分搜尋。時間倒回,擾動環境,再往前滾,看 bug 在哪裡被定住。

編譯期擋得住的,跟模擬撞出來的,疊在一起

Sean 提到稍早 Joe Hellerstein 從 AWS 來談 Hydro。那個專案想在編譯期用 type system 抓住分散式 bug。某些類別的 bug 寫不出來,compiler 會擋。力氣放在事先證明。Sean 把它想成測試這件事上的 formal methods。Antithesis 則在執行期用模擬把系統撞開。

Carl 對 Hydro 不熟。他在意 proof 是落在實際程式上,還是落在一份形式化的抽象模型上。Sean 依記憶講的是編譯期檢查。人在寫程式,編譯時判斷這段會不會在分散式系統裡壞掉,從一開始就不讓它被寫出來。檢查烤在軟體裡,像型別檢查抓到 int 被塞進 string,或反過來。

Carl 把 Hydro 放在靜態 verification 這一類,而且是很進階的一種。同類的事早就在發生。寫 Rust 的人靠 type system 拿掉一批 bug。寫得很純、也很安全的 Rust,可以拿掉整類記憶體方面的 bug。他認為這件事該做。跟有 bug 的軟體之間,防線愈多愈好。

有些靜態做法會逼人用特定方式寫程式,嵌進 runtime,或嵌進程式怎麼被組織。那種寫法未必直覺,問題不一定表達得了,為了做出 proof,實作也可能得妥協。這類系統有時比較適合 greenfield,也就是從零開始、照那些性質把程式寫成特定形狀。Hydro 算不算這一類,他不懂,不能斷定,也許對方已經做得更好。自己從頭做 DST,他認為很有價值,也值得做,但對開發力氣抽稅很高。他想知道靜態檢查蓋得住哪些類別,哪些仍是未知。就算靜態那層在,上面再加一層像 Antithesis 的東西,他仍覺得這層值得加。

Formal methods 的取捨是另一套。人會為同一套系統做一份抽象模型,再證明它帶有某些正確性 invariant。那是模型上的 proof。Hydro 在 Sean 的描述裡,檢查的是正在寫的那份程式。

整疊測試裡,deterministic simulation testing 的位置比較靠近 integration test 跟 stress test。小塊、彼此獨立的程式仍用 unit test,那是最快的查法。能花得起錢的測試種類,他認為仍該盡量用,整體的程式品質會更好。AI 進來之後,測試愈多愈好。模型被約束得愈緊,交出好品質的機會愈高。

Antithesis 特別好用的地方,是拿去測未知的未知。一條這種 test 寫一次,幾乎可以測到軟體整個 state space。理論上,可能發生的事、壞的事件順序,都碰得到。integration 這一層因此適合它。同時測多個元件,一套分散式系統是例子,一個 CRUD 應用也是。有資料庫,有橫向擴出去的 web server,有 cache,有 client。這樣就夠出現怪情況。client 對一個節點送出寫入,寫入進了 cache,沒有馬上刷進資料庫,再到另一個節點讀,然後失敗。這些失敗的樣子跟事件順序,他覺得很難在 integration test 裡逐條寫完。用模擬去試,對他比較自然。

Sean 說,分散式系統常被講成只有規模很大才會碰到。現在的系統幾乎都是分散的。資料庫、client 跟 server 分開的做法存在很久,早於雲,也早於 Kubernetes。很簡單的三層架構一樣會出這些 bug。

Carl 把範圍再往程式裡面收。單一 process 裡,多條 thread 共享記憶體,或用訊息傳遞,這已經是一套分散式系統。要知道它正確,得把事件可能的順序想清楚。

給 Agent 一條會失敗的 test,它會貼著那一條寫

Carl 最近在教 AI,替任意軟體寫能在 Antithesis 跑的 workload。做這件事時,他也在學怎麼把 Antithesis 交到 AI 手上,讓它能問未來會發生什麼。

test driven development,也就是 TDD,走法是先寫一條 integration test。它會失敗,因為它依賴一個還沒寫的功能或改動。然後讓 AI 迭代,直到這條 test 過關。他覺得這對 AI 可能走錯。AI 會緊盯給它的目標。Sean 說,這就是對那條 test 過擬合。Carl 同意,結果就是擬合得很緊。

同一件事放到 Antithesis 上,他另給一個暫定名字,ADD,Antithesis driven development。這條路上幾乎沒有東西可以過擬合。平台的工作就是找 counterexample。程式改到行為符合測試之後,沒有一條很窄的案例可以死記。要守的是很一般的 property,例如資料庫永遠不損壞。對這種 property 做過擬合難得多。實作會被迫用最通用、也最正確的方式寫出來。

十五分鐘看明顯的回歸,隔夜十二小時模擬三個月

模擬要跑多久,決定它能不能進開發迴圈。unit test 很快。把編譯當成 test 也很快。做 AI coding 時,不能編譯,或沒過 unit test,回饋幾乎是立刻的。

Carl 把成本拆開看。若 workload 已經在,SQLite 那份就是。同一份已經把 state space 跟表面都測過的 workload,可以拿去驗新功能,繼續看 property 是否仍成立,資料庫有沒有損壞。跑愈久,信心愈高。平台是在對 state space 做廣度優先搜尋。15 分鐘有一些 coverage。1 小時更多。再往後大概會進入高原。跑到 12 小時,也許過了某個時數,增值就很少。他說像 8 小時那種。

接進開發流程時,跑的時間接近指數往上拉長。單一 PR 上,也許只跑 15 分鐘。這 15 分鐘的預設平行度是 48。系統裡還有快轉。程式若 sleep,時間會被快轉到那個點,不必用真實時間等待。因此常常看到至少 48 倍的加速。程式形狀不同,倍數可以高很多。workflow engine 或 job system,有可能到大約 1000 倍。15 分鐘裡,模擬時間很容易累積到好幾個小時。對「沒有弄壞明顯的東西」,這已經有相當高的信心。

還沒測過的範圍愈大,跑的時間也拉得愈長。從 PR 傳到主整合分支,他用一道波形容這層信心。PR 上的測試短,回饋快。昨天送出的程式,隔夜會在 12 小時的 stress test 上跑完,在 Antithesis 裡模擬大約 3 個月。到這一步,對沒有某種大的災難性 bug 會很有信心。3 小時前才合進去的 PR,可能只跑過 1 小時,信心少一截。

他們最近開始試另一件還沒做完的事:讓 Agent 對還沒跑完的輪次下指令、提問。Agent 可以在 Antithesis 啟動一輪,立刻訂閱它在意的某一個會失敗的 property。那個 property 若在開始後的前 5 分鐘就失敗,Agent 可以馬上收到通知,接著除錯,不必等整輪結束。

規格要準到能導出 property

Sean 把測試變緊這件事,連到程式生成變多。生成那段程式的人可能只看一點,或根本沒看,跟程式沒有以前那種連結,也未必懂它。他沒有把「AI 寫的每一行都比人差」當成前提。責任落到測試跟 verification。風險是程式大量送出,人沒看,或幾乎沒看。跟幾年前比,時間跟計算要花在哪,這筆帳不一樣了。

Carl 同意。寫程式花的時間下降,省下的力氣應該改配到 verification 跟規格。他看以後的工程工作,是把規格寫到非常準,用比現在更高的精度規定要什麼。Markdown 文件,他認為未必達得到那個精度。verification 要跟規格對得起來。他要的是一張網:所有可能的路徑是否都符合規格。規格導出程式該守的 property 跟 invariant,寫進 Antithesis 的 workload。模擬裡每條路徑都要落到合法的 property 結果,不能出現 counterexample。Agent 就會把力氣放在寫出能安全待在這張網裡的程式。

他最近另外在想影像 diffusion,也就是 AI 一次長出整張圖的那種過程。在某個可能的未來,生成程式的量大到,軟體工程可以離開一輪一輪的迭代:規格一改,整個程式庫重新長一次。它符合規格,也通過那張罩住 state space 的網,就把這份全新的程式庫當成新版本釋出。實務若往這個方向靠近,這個工作會變成什麼樣,他想看。verification 那一側,他認為 Antithesis 是一種解法。

軟體開發就算只看最近 6 個月,變動已經很大。Sean 不覺得現在停在穩態。接下來幾年還會大幅變,也沒有人確定會停在哪裡。過程裡會有高,也會有低。

〈Software Engineering Daily〉-EP-SED News: Jev, Meta’s Muse, and the AI Slowdown Paradox

https://softwareengineeringdaily.com/podcasts/sed-news-jev-metas-muse-and-the-ai-slowdown-paradox/

9 月 15 日左右,TypeSafe AI 把 Jev 放出來。公司 2024 年就成立了,在那之前很少人說得清楚他們在做什麼。Software Engineering Daily 每個月一集 SED News,主持人是 Gregor Vand 跟 Sean Falconer。跟以往一樣,先掃科技標題,中間挖深一題,再繞一圈 Hacker News。

錄完 Gregor 就飛舊金山。星期五是 Superbase 的大會,他在那裡有職位,這週要見的包括 Vercel 跟 OpenAI。週二下午起飛,週二晚上到,路上將近 30 個小時。主講是 Steve Wozniak,他說得捏一下自己才相信。Sean 這陣子沒有出差。再過幾週回加拿大過感恩節、看家人,自己把這趟說成朝聖,地點是他口中的大白北。人埋在 2027 年第四季的規劃裡。11 月還有年度大會,發表跟大消息都堆在那裡。

Gregor 人在新加坡。最近霾害重,林火的煙從印尼過來,賴著不走。他買了一台 Dyson 空氣清淨機。App 看得到室內空氣,人在辦公室,數字一高就打開。太太說,想放哪一間就放哪一間。Sean 在舊金山沒有。北加州野火也會搞壞空氣,他覺得這比較像他太太會買的。家裡有小嬰兒的人,常常先買一台小的放嬰兒房。Gregor 是第一次買。

Jev 交出帶分數的結構化答案

Gregor 轉述他們怎麼賣 Jev。交出來的是對過型別的回答,旁邊一個分數,表示它覺得這份結構化答案有多準。人不會拿它來聊天。它是給機器用的。他們把它放在第一層,自己叫 system one,處理結構化的決定:工具呼叫、路由、分類。科技圈把它講得很大,有人直接問,這是不是 LLM 的下一場革命。創辦團隊裡有做過 ChatGPT 的工程師,另外還有其他人。後面的份量不輕。Gregor 以為開放權重沒有多少可以挖,問 Sean 是不是這樣。

Sean 說最近有了。Hugging Face 上的 OpenJev,完整尺寸、270 億參數,開放權重,表現接近正式版。距離 Jev 發表大約兩週。那是蒸餾出來、用來模仿 Jev 體驗的模型。他不認為這是 Jev 的擁有者或創作者官方出的。

大家拿 LLM 做分類、選工具,常常不是最省的用法。你得逼它先接受結構、再吐出結構,常常不可靠,token 也不划算。Jev 仍用 Transformer,技術是通用的,但專門處理這種要結構的事。LLM 照人說話的方式設計,拿來做機器跟機器的溝通,token 跟推論時間都貴。Jev 專門做這件事,兩邊一起省。Sean 覺得人興奮,是因為中間空了一塊:一邊是早就為分類、路由做的專用模型,一邊是 LLM 的通用。Jev 卡在中間。

Gregor 把它看成一次很大的步伐。前面不知道多少個月,大家談的都是下一款前沿模型、下一款開放權重模型。寬一點講,目標差不多是同一件事。Jev 走了另一條路。

愈省電,燈愈不關

Jev 這個名字來自傑文斯悖論。東西愈有效率,人用得愈多,省下來的那一塊又被吃光。燈泡是他舉的例子。現在的燈泡很省電,結果燈不關,或者以前一盞的地方裝了 10 盞。Sean 接的是手機跟電腦。你上次把手機或電腦關掉,是什麼時候。這些東西基本上一直開著。Gregor 喜歡這個命名。他們希望過幾週能請到創辦人,錄進平常的節目。

反推也有。Sean 說,他們公布的評測到目前都是自己發的。沒有論文,沒有校準,也還沒有獨立研究。東西才剛上市,他覺得這在預期之內。比較有意思的是人已經拿去玩。遊戲裡,角色在任何一刻能做的事是固定的。馬力歐就是這樣。用模型決定下一步:跳、蹲,還是射火球。說穿了是路由。這類問題,系統解了很多年。現在多了一個很能動的系統,不必每次想用,就從頭練一個新模型。

Gregor 看過一個網站,Jev 在即時玩寶可夢。Sean 則找到一個 GitHub 專案,有人拿去做 Doom。他說這很符合那個題材該有的樣子。至少寶可夢看起來不一樣。

Sean 拿現在那些把好幾塊模型拼在一起的系統來對,比如模型路由。有人把傳統機器學習的分類模型跟一個 LLM 配在一起。也有人拿一個便宜的 LLM,硬把它逼成分類器。他說 Jev 幾乎就是這個問題的解。

Gregor 建議去試。現在有等候名單,不好進。Sean 的同事已經在玩。他看過一些數字,精確的記不得,只記得很短的時間裡,名單上的數萬人被放了進來。他自己也不確定,要脫離名單有多難。Gregor 的同事則不一致。有人還沒進去。拿到早期使用權的那位,只要帳上有信用卡,就可以邀請別人進自己的組織。Gregor 自己還沒有權限。若真的錄到創辦人那一集,他想當面要。

Muse 把餐廳訂完,Claude 常常道歉收場

另一個大產品是 Meta 的 Muse。對象不是開發者,比較像這一陣子常見的個人助理。SED News 談過這塊很多次。Gregor 覺得這次不一樣,Muse 看起來真的把問題解決得又快又好。它是一個 App,Mac 跟其他裝置都能下載。硬體也要出,叫 Muse Charm。鑰匙圈大小,上面一小塊螢幕,他形容像電子雞。你也可以直接跟那個裝置說話。

他懷疑造型在蹭 Labubu。亞洲很流行把這種小掛飾掛在包包上,紅到誇張,兩邊長得很像。Sean 的小孩就有。就算只用 App,也可以幫自己的 muse 取個名字。Gregor 提醒,muse 這個詞本來就是名詞。

他人在新加坡,Muse 還在等候名單上,進不去。他指望 30 個小時後人到美國,想辦法裝到裝置上。自己還沒用到。讀到、聽到的講法有兩種,他沒有收成一句。一種是訂餐廳比 Claude 快 10 倍。一種是 Muse 會把訂位做完,Claude 則常常走到相當後面,然後說抱歉,不知道為什麼,餐廳沒訂成。

Sean 認為 AI 助理這塊市場以後會很大。前面讓人醒過來的是 Open Claude。大家發現,願意讓 AI 代自己動手的程度比原先想的高,這條路也被打開。他理解 Meta 要投,擔心在別處。Meta 跟 Facebook 綁得太緊,拿人的資料做廣告是有歷史的。現在你交一台機器給它,替你打理生活的一部分,個人資訊會不會又接上廣告。據說整套 Muse 跑在安全的虛擬機裡,要在你的 Muse 跟其他系統之間畫一條界線。看 Meta 過去的做法,消費者不信任,他覺得說得通。

資料大概早就在 Meta 手上

Gregor 講到一半,回去看上個月談過的 Instinct。那家公司做的也是個人助理。Muse 已經站上同一個位子。上個月那個網站看起來像 1992 年,用 Times New Roman,故意走回到未來的味道。現在換了。字體改成無襯線,多了一個小人當標誌。頁面底部寫著「text instinct」,用來開始。他沒有去翻 Wayback Machine,不確定這句以前在不在。以前的感覺是,你不夠特別就進不去。他懷疑個人助理這塊突然擠在一起,對方才改的。

這個產品要有價值,你得把檔案交出去,尤其是資料。日曆常常走某個雲端服務。他覺得矛盾在這裡。很多人的資料,Meta 大概早就有了。要嘛整套退出,要嘛索性靠進去。Facebook 待過,Instagram 也有。WhatsApp 能拉出什麼,他說不準,但他猜 WhatsApp 多少接得進這套東西。過去幾個月,他跟 Sean 一直點不出 Meta 到底要往哪裡走。這一手,他覺得聰明。

Sean 覺得這跟 Meta 真正成功過的地方對得上。這是做給一般消費者的 AI。寫程式用的 agent harness,也就是把 agent 套進寫程式流程的那套工具,這次他們沒有押這條。自己去練模型,也沒有。Facebook、Instagram 那些賭注,走的是消費者。個人助理有機會變成 ChatGPT 之後,AI 在消費者端真正打穿的應用。

Gregor 問他會不會用。Sean 說不會。硬體沒興趣,Meta 的眼鏡也一樣。他不想讓人看見自己用一種可能被看成在監控旁人的東西。自己不舒服,也不想讓別人因為他而不舒服。個人助理這個想法很好。他不確定會把信任放在這一個上面,銀行資料也還沒準備交。

訂飯店這類事,Sean 說顯然得有付款的辦法,裡面一定有信用卡交易。Gregor 知道 Stripe 在機器付款上做很久了,現在才開始得到他們想要的注意。Stripe 有一套機器對機器的付款協定,叫 MPP。大家一直用不起來,是因為你得先有一台你信任的機器,願意讓它去付。Muse 也許是人會更常打開的那層介面。他還不知道自己每天會用多少。當新鮮事,他一定想試,比如在舊金山訂一間餐廳。下個月若拿到使用權,再回來講有沒有任何一點真的有用。

第三次的 Nscale:礦工、挖礦、挪威的機房

標題裡還有一則,他們連續第三次談 Nscale。名字叫 Nscale,跟 any scale、跟 Scale AI 都不同。這是一家做推論資料中心的公司。機房所在的地方跟別人不一樣。Gregor 舉挪威一處,看起來很像風景明信片。他們即將上市,S-1 已經送出。創辦人 Josh Payne 是澳洲人,在澳洲礦坑裡下過礦。Sean 記得,公司最早是挖加密貨幣,後來轉去做推論,替大公司跑 LLM。

《金融時報》報過,2025 年的營收有 73% 來自 ByteDance,也就是 TikTok 的持有公司。S-1 裡完全不出現 ByteDance 這個名字。Gregor 覺得這像套利。有些公司進不了放在美國的推論資料中心。眼下有貿易禁令的那些流量,Nscale 就接過來。

Sean 在意的是,營收有相當一部分來自少數客戶。以後交 S-1 的 AI 公司,他猜這種結構會愈來愈常見。你只要接上 OpenAI 或 Anthropic 這種客戶,用量大到會把整家公司的使用跟營收比例扭歪。客戶能活多久,就變成生意上的風險。Nscale 這條路,他倒覺得清楚:礦工,加密貨幣礦工,然後 neocloud。Neocloud 是他們用的詞,指專門跑 AI 推論的那種雲。

Gregor 覺得 Josh Payne 很會做生意。英國想把這家公司認成自己人。它確實是英國公司,創辦人是澳洲人。他們要到美國、到紐約證交所上市。在英國起家的科技公司,後來常常不在英國掛牌,因為流動性跟比較好的估值都在美國。他說這大致是真的,也不知道什麼能打斷這個循環。又多一家,他覺得可惜。若真的在英國上市,這位執行長的薪水幾乎會擠進最高那一檔,差不多跟 AstraZeneca 的執行長一樣。他覺得估值跟薪酬有點失控。整件事像一記很看時機的賭注,把挖加密貨幣的公司轉去追這個。他想看賭注往哪裡走,也想看會不會吸到一種人:喜歡 neocloud 這個詞,就覺得錢該放進去。

Sean 說 neocloud 是過去一年熱起來的詞。Nscale 是他想得起來、第一家把 S-1 交出去的。Gregor 把它說成礦坑裡的金絲雀,先送下去試空氣有沒有毒的那隻。第一家交表,也許就是拿來看這條路。他問,會不會有一波崩盤要來,所以想趁別的問題出現之前,先把這一檔做完。

9 月 12 日說放慢,十天後兩家同一天出模型

中間那題,他們給的副標是 AI 風險、前沿實驗室放慢,以及陰謀論。過去幾個月的事,在一些人腦子裡對不起來。這些實驗室講應該放慢、應該更小心,同一時間又在出新模型,而且把這些模型說成做過最聰明、也最危險的東西。Gregor 問,這算不算一種悖論。

Sean 把線往回拉。Mythos 那陣子他們談過。Anthropic 當時的說法是,這模型強到不能給所有人,所以只給少數人。幾個月前他們就講過,這裡面有行銷。稀缺本身是一門手藝。你把一個東西說得極好,然後說你還不能擁有。等它真的開放,所有人都想要。

再往前是 7 月的 Hugging Face 入侵。大約 700 個 OpenAI 的 agent,在跑某種內部的網路安全評測,駭客那道限制是關掉的,結果打進 Hugging Face 的正式環境。這件事他們談過。7 月也有員工出來吹哨,說這些模型危險,會威脅人的性命。同一個月,前沿實驗室有一批員工催政府,要刻意把自動化 AI 的開發速度放慢。

大的那一下在 9 月 12 日。Anthropic 的執行長、也是創辦人之一的 Dario,發表文章,叫人去放慢前沿的步伐。篇名的意思就是 pace the frontier。Sean 建議大家去讀。同一天,Sam Altman、Elon Musk,還有 Google 的 Demis,都在 X 上公開說同意 Dario,該放慢。陰謀論立刻出現。十天之後,Anthropic 推出 Opus 5.5,OpenAI 推出 GPT-6,基本上同一天。一邊說慢一點,一邊把模型出得非常快。給外面的訊號很怪。

Sean 還是留一句給 Dario。這個人警告 AI 的風險,講了很久。

人懷疑這份誠意,Sean 整理出兩條。若這個領域最前面的幾家一起說該放慢、該加監管,某種程度上是在守住自己的位置。小公司、新進者更難追。他們已經領先,錢很多,也有人懂得怎麼走過監管要模型提供者做的那些事。另一條跟上市和利潤有關。中國出來的開放權重模型,正在壓低大家願意為 token 付的價錢。前沿實驗室看得到牆上的字,公司估值會被往下打。這套說法可以解釋為什麼有些事他們不做,也可以把上市的時點往後挪。以後若有人問,最新、最強的模型為什麼還沒出,答案可以是我們得遵守規定,或者還不確定安不安全。效能這件事怎麼講,就握在自己手上。

另一邊是美國總統川普,還有 Nvidia 的 Jensen Huang。川普說這整件事是一場騙局。Jensen Huang 說不該放慢 AI,那不切實際,這些威脅不是真的。Nvidia 有很強的動機講這些話。AI 走得愈快,要買的 GPU 愈多。那些 GPU 很可能就是向 Nvidia 買。

文章寫 pace,新聞聽成暫停

很多人,包括一些新聞,把它聽成一聲暫停。Gregor 覺得那個詞不在文章裡。文章用的詞是 pace。Pace 是把開發速度講清楚,不是叫大家停產。模型該開發多快,得說明白。大家若完全放開,不知道會發生什麼。暫停是先別再出新模型,直到安全限制收得更緊。他知道這有點在挑字眼。兩個詞差很多。Pace 從生意的角度看,聽起來幾乎像串通。

串通就是卡特爾在做的事。幾家公司在檯面下約好一起放水。放水指的是,你知道自己還能做更多,可以把價格拉高,可以做出更強的東西,集體的利益卻是先不要。大家想把效能、尤其是財務表現,一點一點擠出來。Gregor 把帳想成大概三年。若明天就跳到我們知道最終做得到的那個最好的模型,未來兩年還能拿什麼階梯跟人家收費。有人因此說,這是貼了安全標籤的卡特爾。他說有些時候很難裝作沒看見。

上市都排在眼前。他先說了一句「這些上市」,又自己改口。他講的是 OpenAI 跟 Anthropic,兩家都很可能想上市。他們一直說自己在準備。他猜未來六個月裡,會有一家真的走出去。兩家走在同一條路上,在這件事上有同樣的動機去串通,再把財務表現擠久一點。目前他站在這裡。

3% 到 10%,他母親也問了

Sean 把風險問回來。有人講駭客。實驗室裡或吹哨的人那邊,他聽過另一個數字:到 2030 年,人類滅絕的機率從 3% 到 10%。Gregor 說他母親問了同一個問題。Sean 說他太太也在問。

幾個週末前,Gregor 跟父母說話。他們很少問工作,也很少問 AI。那次問了。他們看到那些末日標題,甚至講出 Anthropic,說是 Anthropic 的某個人。他傾向覺得這件事被放大了,可是說不出為什麼。一個人把這些話講完,然後離開公司,動機在哪。末日情境當然可能。他想看這些說法在哪裡真的碰到地面。Hugging Face 那次入侵讓人睜眼,因為它拖了一段時間。他不明白為什麼不能加限制:模型繼續開發,但不必放它們出去做這種駭客的事。他自己不在前沿實驗室,想這些的時候仍然覺得自己是外行。

Sean 把技術史攤開。技術都有亮的一面跟暗的一面。新東西可以拿來做很大的好事,也會被濫用,有時是意外,有時是故意。1890 年代的電,引起大量火災。政府反應太慢,結果是保險公司自己出錢,做民間的測試。藥做得到很了不起的事,也做得到很糟的事。醫療用藥的設計有制衡,慢是故意的。印刷機把識字帶給很多人,也被拿去大量印宣傳。社群媒體有好東西出來,同時也是一台被人濫用的宣傳機器。

他覺得 AI 像這一串,難處是走得太快。濫用可能先蓋過去,真正會改變事情的用途還沒被認出來。他說的真正改變,是用模型去解人類還沒解掉的疾病,或者打進以前複雜到人處理不了的問題。那大概還有一段距離。危險是趕去那裡的時候先傷了自己。陰謀論跟 Anthropic 及其他人的意圖,真相大概在中間。一邊是他們完全出於善意,只為了所有人好。另一邊是四五家公司湊在一起,要騙過全世界、操縱公開市場。兩邊他都覺得太過。

Gregor 補的是加密。加密曾經被歸成軍火,後來才被看成一股向善的技術。它也能做壞事,比如把本來會讓一個該坐牢的人定罪的資訊藏起來。大家仍傾向認為,把世上大部分敏感資訊加密,整體是好事。破解它幾乎愈來愈容易,量子那頭除外。

他覺得印刷機更靠近眼下,因為玩的是恐懼。當時有人要讓不識字的人繼續待在下面。印刷機會讓更多人碰到紙上的字,學會讀,讀到不想讓他們知道的東西。他站在實驗室外面看。裡面的人也許覺得,外面的普通人碰這東西會很糟。他不同意。這些公司成立並不久,不必然就能決定技術往哪走。能做出模型的,現在有好幾百家。技術已經在外面了。

他們想照 FINRA,自己盯自己

Google、OpenAI、Anthropic 想成立一個東西,名字叫 Standards Authority for Frontier AI,做法明寫著照 FINRA。FINRA 盯的是華爾街的券商,代表產業自己,身分不是政府機關。Gregor 問這算不算走對一步。

Sean 覺得,至少他們想在話的後面放上東西。Dario 的文章把放慢 AI 的做法寫成三條。把某種第三方嵌進前沿實驗室,模型推出之前,由他們評估有多安全。政府層級的監管。還有理想中的全球管控,比照核武的發展怎麼被管。寫下來是一回事。讓它發生、讓所有人配合,非常難。美國總統的反應已經在光譜的另一端。就算美國決定這裡的實驗室要放慢,美國以外的實驗室不一定跟著。那本身可能變成技術跟用法上的威脅。美國人接不接受,也是問題。

他記得去年聽過 Dario 的訪談。Dario 當時說,他們負擔不起放慢,也負擔不起去控速度。對中國和世界其他地方有領先,領先沒有大到那種程度。若真的領先好幾年,也許可以放慢,把事情做得更安全。因為有外部威脅,速度就不能放。現在情況有些變了。也許他們已經拉開足夠的距離,也許威脅變得夠大,也夠真。實驗室自己公布的那些,不管是入侵,還是有人宣布出了問題,到目前都是自己說的。航空業若出事,今天有第三方進去查到底發生了什麼。這類制衡,這裡還沒有。他覺得這至少是個開始,而那件事大概得做。其他產業的做法他不夠熟,不敢說這是不是對的做法。可是幾乎任何公眾安全可能出問題的地方,造車、開飛機、設計藥物,動手之前都有好幾道制衡。他不能自己造一台車就拿去賣,會有人來找他。

Gregor 同意這個對照。很多領域裡,你就是可以寫一套軟體拿去賣。除非明顯跨過法律界線,沒有人問這套軟體若做了某件事會怎樣。就算造成損害,也走民事賠償。加密貨幣起來的時候不一樣。金融監管不得不進來,因為這會從財務上傷害一般人,比如你被誤導,不知道自己在做什麼。現在的問題是,開發一個模型要不要再加監管,因為模型能被用的方式太多。車跟飛機有意思。你可以設計,可以建造,不能賣給任何人。Sean 補了一句,他也不能突然開始賣商業航班。

Gregor 覺得可以停在這裡。過去幾週、幾個月,前沿實驗室把自己放在什麼位置,這些事為什麼會發生,談這些已經夠。

Sean 還是把立場講清楚。他站在盒子已經打開的那邊。他用的是潘朵拉的盒子,意思是放出去的東西收不回來。創新會來,他把它說成一波潮。你可以游回岸上躲開,去找高地,也可以抓一塊衝浪板。他選衝浪板。技術亮的那一面,往上的空間大到不能裝沒看見。同時得找到辦法,不讓暗的那一面把可以期待的那一面蓋過去。

講到往上的那一面,Gregor 把時間交給 Hacker News。這一段通常是他們這集最喜歡的。

海盜片要救回原版,本地還有一台假的 AWS

Sean 先講一篇,標題他很喜歡,叫「Pirating the Pirates」。投稿的人他記得是 Pieter Grabowski,拼法他自己沒有把握。電影保存裡面藏著一個盜版問題。片廠發行一部片,然後又去改它。經典例子是《星際大戰》。George Lucas 不斷重新剪已經存在的畫面,原始畫面很難再找到。另一個是 MGM 把 18 分鐘放回《黃昏三鏢客》,配上重新配的對白,用一個聲音很像的人,換掉已經過世的演員。喜歡原版的人很受不了。

於是有一批小型修復。業餘的人跟有點專業的人混在一起。他們拿 DVD、雷射影碟、VHS,再加上各地的國際版本,試著反向做回一個正確的原版。Sean 說這是愛做的事。文章寫的是某人親身做這件事,在《黃昏三鏢客》上做了好幾年。

Gregor 快速看過。截圖很多。同一部片等於四個版本,依媒介、發行時間、誰在背後發行而不同。顏色完全散掉,四套顏色幾乎各走各的。飛機上時間很多,這篇會在清單上。

他自己挑的比較技術。名字先抓住他:Fake Cloud,網址寫的是 Fake Cloud.dev。投稿的使用者叫 the Anonymous One。後面是誰,相當匿名,所以他用「他們」來稱。Fake Cloud 想做的是一套 AWS 的測試環境。他們說,它給你一個本地的 AWS 環境,行為要像真的基礎設施。測試用的假物件,他們說不算。程式可以用平常的 AWS SDK、命令列,以及拿程式碼描述基礎設施的那些工具。跟現在的 LocalStack 社群版不一樣。你不必有帳號、驗證用的 token,或付費方案,就能把核心的開發流程留在自己機器上。

對著 AWS 開發常常很貴。AWS 基本上沒有免費測試環境這件事。他們以前是直接打對方的 API 來測。留言在意兩件事。背後是誰。以及它看起來就像 vibe coding 生出來的。Gregor 說他滿喜歡這句,但不確定外觀能不能當不信任的理由。現在太多東西都是這樣做出來的。介面也常常不是某些開發者的強項。留言另外推薦 MiniStack.org。他建議兩邊都看。

時間到了。預測留到下次。Gregor 期待這週再跟 Sean 當面見到。大會結束之後,下一集 SED News 會有不少東西要消化。Sean 說這週晚一點見。

〈Software Engineering Daily〉-EP-Steve Jobs in Exile

https://softwareengineeringdaily.com/podcasts/steve-jobs-in-exile/

流行故事把 Steve Jobs 寫成這樣:跟 Steve Wozniak 在車庫創了 Apple,推出 Macintosh,因為太亮眼被趕出去,在荒野晃了十二年,蓋了一家失敗的公司叫 NeXT,再被請回去,把已經四分之三走向破產的 Apple 救起來,後來才有 iPod、iPhone、iPad。Software Engineering Daily 這一集,主持人 Matt Merrill 請來《Steve Jobs in Exile: The Untold Story of Next and the Remaking of an American Visionary》作者 Geoffrey Cain,以及 NeXT 共同創辦人 Dan'l Lewin。Cain 說大家記的順序是反的:NeXT 那些年是轉折點。作業系統 NeXTSTEP 後來變成 Mac OS X 的底,再進 iPhone。Apple 程式碼裡到今天還看得到它的指紋。

Lewin 是早期 Apple 員工,主導 Macintosh 打進高等教育。一九八五年跟 Jobs 一起離開,共同創辦 NeXT,當行銷與業務副總。後來在矽谷待了三十多年,待過 Sony、Microsoft,再當 Computer History Museum 的總裁兼執行長。Merrill 在 LinkedIn 上看 Lewin 的經歷,找不到第二個能誠實寫「離開 Apple,跟 Steve Jobs 創一家開路的新創」的人。Lewin 說當時一起走的還有幾個人。

大家記的,是被流行文化改過的版本

Cain 說,Jobs 跟 Apple 的記憶被電影、流行文化扭過。有人告訴他:Jobs 從第一天就是天才,Apple 容不下他,所以把他趕走。Macintosh 商業上並不成功。公司在流血、庫存堆著。Jobs 在公司裡是分裂性的人物,有人愛、有人恨。他把前 PepsiCo 執行長 John Sculley 請來當 CEO,後來想把人趕下去,兩人一起被提到董事會,Jobs 被送進流亡。那間公司就是 NeXT Computer。

後人常把 NeXT 講成他碰過的東西都沒打進市場。Cain 的判斷相反。NeXT 成功,因為它做出一套以物件導向為核心的作業系統。Apple 後來需要新作業系統,看見 Jobs 在 NeXT 做了大約十年的東西。Cain 說,他在一九八七、八八年做的,有些會在二〇〇八年跟 iPhone 一起出現。Jobs 也是在那段時間學會帶人、學會信任、學會把事交給別人。

大學市場,才是這家公司為什麼存在

Lewin 把時間拉回一九八五、八六年。那兩年對電腦業很猛。Apple 往一年十億美元營收跑。網路在長,Internet Protocol 從大型研究機構連起來。分時系統是 Dartmouth 校園發明的。Stanford 自己寫過一套,叫 LOHTS,Low Overhead Time Sharing System。一九八四年,把 Macintosh 接到區域網路的能力後來分出去,變成 Cisco。一九八六年,Microsoft、Adobe、Oracle、Sun Microsystems 上市,那些公司營收大概幾億、市值也大概幾億。IBM 同年是一家一年四百億美元的公司。

他從 Lisa 專案就在 Apple。沒有 Lisa,就沒有 Macintosh。Lisa 本質上是 Xerox PARC 那批人做出來的:Smalltalk、Bravo 那套所見即所得文書。Tom Malloy、Charles Simonyi 都在 PARC。Charles 去了 Microsoft,Tom 來了 Apple。

Apple 要賣 Fortune 500。Lewin 二十出頭,穿西裝打領帶,把執行長跟高階主管帶進來看。大約八十到九十家公司走過。那些人泡在 IBM 主機裡,研究人員用 Digital Equipment 的迷你電腦,程式用 Pascal,還在推 SQL 資料庫。Oracle 那時還是小新創。Fortune 500 對 Lisa 沒興趣。他去做大學圈的研究,跟直屬執行長辦公室的人說:該賣給發明這些技術的人,不必推銷,他們發明的,他們會買。事業部沒選這條。他才轉去 Jobs 剛接手的 Macintosh 部門。

那組大約十個人。Joanna Hoffman 有大學市場的想法。Lewin 把研究寫完,他們叫他來搞定。他提三個條件:准他拆掉他們正在做、他覺得方向歪掉的事;Jobs 可以幫忙,但只在他開口的時候;做完再付錢,因為他有幼小的家庭,接下來要全國飛。三條裡成了兩條,其餘自己猜。Jobs 出名地小氣,後來真的只在被叫到時才插手。他照自己的方式做。

Macintosh 發表當下,他們組了二十四所學校的大學聯盟,主力計算在 Stanford、MIT、Carnegie Mellon,還有做圖形的 Utah。這件事救了 Apple 一陣子。經銷商每家每個月只賣掉四台,產線卻要拉到每月八萬台、一年一百萬台。供應鏈前置很長,他們有九十天把庫存壓下來。一九八五年八月、九月,大約五萬台進大學。Wheels for the Mind 那張海報,小孩騎單車、滑鼠拖在後面,就是這套計畫。Jobs 講過 bicycle for the mind。

Jobs 被開除的時候,這條線已經在跑。共同創辦人 Rich Page 做設計,Lewin 做市場。他們在畫一台 3M 機器。Lewin 說,這就是公司為什麼存在、他為什麼願意跟、Jobs 為什麼需要他來做這份工作。

一百萬像素,以及拿公司去賭的那幾步

3M 的畫面很具體。Macintosh 只有 128K 記憶體,沒有作業系統,ROM 裡一堆可呼叫的常式。Lewin 跟資工系談用 Mac 教書,對方問作業系統長什麼樣。答案是:從你們的角度看,沒有作業系統,只有一堆解譯的 Pascal 程式。教學機可以。他們真正要的,主要在 Carnegie Mellon 被講清楚:螢幕一百萬像素、每秒一百萬指令、一百萬位元組記憶體,價格大概低於三千美元,然後到處部署。Merrill 說,那是一九八六年,已經很狂。Lewin 說,那就是夢。大學預算就是三千美元那條線。這數字後面會回來咬人。

NeXTSTEP 以 Berkeley 發行版為底,再做一顆能撐平行、可攜、長期長的 kernel。Jobs 請了 Avie Tevanian,因為他在 Carnegie Mellon 做 Mach kernel。Rick Rashid 帶那個專案,Avie 是他的學生;Rashid 後來去創 Microsoft Research。編譯器跟 Richard Stallman、MIT 授權。每台機器捆完整功能的 Sybase SQL、Richard Wolfram 的 Mathematica、莎士比亞。工作站公司像 Sun、Apollo 走迷你電腦那套生意:賣機器,作業系統再收月費。他們走 PC 模式,作業系統跟機器一起走,一兩年再付升級。功能是工作站級,生意模型是 PC。大學在他眼裡是超集:研究、探險,真實世界還沒發生的事,先在校園發生。

Merrill 丟了一個現在還活著的細節。今天在 Xcode 做 iOS、Mac,還有一種檔叫 `.nib`,NeXT Interface Builder。編譯過的介面配置還在。

Interface Builder 的無名英雄,Lewin 把功勞多半給 William Parkhurst。Stanford 加速資工加管理、Macintosh 上做過很多 3D 效果,也是世界級大浪衝浪的人,泡在當時的物件社群裡。一場 Mac 活動上碰到 Jean-Marie Hullot,對方在為 Macintosh 做東西,後來到 NeXT 示範。Hullot 在法國 INRIA 做早期研究,後來過世了。他想的是一套 kit,坐在物件庫上面,讓人把東西組出來。大學教授要做模擬,顧客同時是使用者跟開發者。

另一個關鍵是 Objective-C,以及執行期動態綁定。Parkhurst 跟 Bud Tribble 都在這場選擇裡。別人往 C++ 走。他們押一家康乃狄克小公司 Stepstone,員工就一把。沒有動態綁定,Interface Builder 沒道理存在:你在組介面元件,不想每次走開編譯,要在執行期把能力接進系統或應用層。Smalltalk 讓人看過這畫面,沒人真正用商業機器硬出貨。ParcPlace 把 Smalltalk 商業化,為什麼沒成,爭論很多。NeXT 先走出去,Lewin 說後來有十五年的領先,Apple 買下 NeXT 之後才有那麼長的跑道。這是拿公司去賭。Jobs 用 Interface Builder 現場做一個小資料庫應用,大約三四分鐘。iPhone 出來那一代開發者會問:為什麼要學 Objective-C,為什麼不是 Java。答案在這場賭注裡。Avie 跟著 Apple 到二〇〇六年。

看人,擋回去,以及 Pixar 的星期五

Cain 訪談超過一百一十位前 NeXT 高階跟員工,幾乎一開場就講同一件事:Jobs 最大的本事,是看進你的靈魂,搞清楚你是誰、要什麼、擅長什麼,再把你這輩子最好的工作逼出來。面試愛問:你是這個領域最好的設計師嗎、最好的工程師嗎。猶豫,或說我很好但不是最好,面試直接停,「那我寧願去找那個人」。他要有意志、有個性、能擋他、能護自己想法的人。走廊隨機攔人問你在做什麼,問題很難,要看你會不會在他面前站著。早期有一條 hero/shithead 雲霄飛車:今天把你舉起來,明天罵你做得糟透。NeXT 早期、第一代 Apple,他都以這個出名。他慢慢學會讓團隊長。回到 Apple 之後,Cain 說他有八年高階團隊穩定。二〇二六年還有哪家上市公司能講這句。

Lewin 把招人收成三個 C:Capability、Calling、Character。他走的時候,超過一半的人在他底下。高階主管面試每一個錄取的人。履歷上的能力過得很快。真正少的,是對這份使命有召喚的人。早期不給看模型、不給看軟體。性格這一關,Jobs 很會看,也靠他信任的人一起看。

一九八五年創 NeXT。一九八六年初,Jobs 向 George Lucas 買下 Pixar。Lewin 在場。Pixar 的公司章程跟 NeXT 逐字一樣,只改名字;股權表一樣,創辦人股份一樣,員工那張表一樣,Jobs 先放進去的錢也一樣。後來硬體事業在散,他個人淨值的大部分拿去把 Pixar 撐著。Ed Catmull 是 Pixar 後面那個天才,Cain 請他寫後記,前言是 Lewin 寫的。Jobs 不能在 Pixar 橫衝直撞,只准星期五進去。圖形那些人是巫師,他貢獻不了技術;說故事的方式也不一樣。他在那裡長大。人味有一塊,Lewin 覺得來自 Pixar 把數位做成看起來像類比。他們認得恐怖谷,從來不把人做太真。Toy Story 到今天還站得住。Macintosh 的行銷,他們從 Lucas 那邊整套借來。Pixar 後來給他財務上的成功,也給他另一種信任人的把握。NeXT 走到後面,他也開始信一些早期他不想做的事。

Merrill 提到書裡另一條人的線:Jobs 結婚、有了兒子,走辦公室的方式變了。以前問你在做什麼,人會防衛;後來比較像單純好奇,想聽你在幹嘛。

擋回去,是他要的。Lewin 最清楚的一場,發生在 Macintosh 發表前夕。一百位學者隔天要來做整天工作坊,Jobs 前一晚用他的舉止把場子炸掉,人來了又走。Lewin 把人撈回車上。第二天早上他在辦公室,用 Apple III 寫備忘錄,當時沒有電子郵件,內容大概是你實在太糟。Jobs 走進辦公室。他站起來走過去,說這輩子再也不會為了錯的事去當對的那個人。Jobs 說了聲好,轉身走。他要人站起來。Catmull 後來也講過,Jobs 請一些董事不要再待。他們稱職,只是不挑戰他。

工廠那則更像一場戲。製造換人,新來的做出 Plan 10,000:那座小工廠、一條全灰機器人產線,一個月要做一萬台。手冊還得從日文翻成英文,主機板在灣區設計,工廠在 Fremont,layout 走 T1 送到產線,可以一次做一台。Jobs 把那本厚檔砸在 Lewin 桌上:製造要月產一萬,你怎麼賣。下一次退修,業務、產品行銷、行銷整組做出 POB,Plan One Billion,因為真做出那麼多,營收就是十億美元。Jobs 腦子裡這家公司大約三百人、一萬平方英尺的樓,一樓做製造,角落還要健身房,請來訓練 Christopher Reeve 演超人的教練教舉重。Lewin 還跑去洛杉磯、跑去 Cher 家看二手器材。正式上場,整組一層層講完,東西收進他買的小公事包,當眾打蛋、打散、假裝倒進去做舒芙蕾。大約一百五十人起立鼓掌,包括 Jobs。他看出整份計畫是場鬧劇。那天晚上大家喝酒,九十天後下一場退修。

他辭職時給了兩週預告,沒進辦公室。前一天打電話約午餐。Jobs 說忙。他說不用,我請客,你去。Jobs 大笑,說好。飯桌上問他到底覺得該怎麼做。他說跟你吵一年多了,你得聽身邊的人,我吵不動了,去幹別的,祝你好運。創辦人走到後面,常常是一句夠了。再後來股權變得很值錢,忠誠又回來。

IBM 授權了,那座橋卻斷了

IBM 那筆,不是幾乎授權。Lewin 說他們授權了,從來沒出貨。當時 IBM 推出 PC 的 microchannel,跟 Microsoft 做 OS/2,產業卻聚成 ISA bus 聯盟,Compaq 帶頭,克隆市場起來,IBM 被晾在外面。副董事長、執行長、財務長辦公室很清楚:同一位設計師做出 NeXT 跟 IBM 的聯合銘牌,要做一台電腦全球鋪,每張員工桌面放 NeXT,拿掉主機上的 PROFS 電子郵件。還要跟 Perot Systems、ESL 打政府跟企業,每台 NeXT 上 Sybase,接到 IBM 主機,在專有的 NeXTSTEP 環境做桌面應用。IBM 願意非獨家授權,若再授權給別人,權利金要分。那時市面上是 Windows 2.0。Windows 3.1 才把網路擴充補上,大約一九九二、九三,甚至九四;Windows 95 是九五年。公司還在把 TCP/IP 當獨立產品賣,Lewin 認識的顧問光在防火牆裡做這件事,一年能做四、五百萬美元。

IBM 要的是 NeXTSTEP、AppKit、Interface Builder 跑在他們的 Unix,也就是 AIX 上,好符合政府要的 POSIX。NeXT 當時沒有。人在 Palo Alto 的 Page Mill Road 做。Lewin 找來一個跑過 IBM 聯邦系統事業的人,一九八六、八七年對美國政府的配額是二十二億美元。Apple 當時是十億美元的公司。Perot 光是把六億美元的 PC 送進海軍。Merrill 當場換算,二十二億在一九八七年大約等於今天六十五億,他說自己的 AI 可能算錯,數字還是嚇到他。IBM 的說法是:我們跟 Intel、Microsoft 失衡了,你們是車票。

交易在他走之後散掉。他說,讓 Jobs 做理性決定的那座橋沒了。IBM 打電話來問怎麼辦,要不要他介入。他說你們也知道我不能。Silicon Graphics 早期授權過背板架構,要做卡插進 NeXT 出彩,侏羅紀公園用的 Indy 工作站那條線,後來也炸了。桌上這麼多通路跟全球布局,這是他離開的原因。

Paul Rand 在平面設計圈以外幾乎被忘了。Cain 說他做過 IBM、UPS、ABC、Yale University Press。Jobs 在訪談裡形容他:脾氣壞,心是泰迪熊。Cain 去耶魯大學檔案庫,Rand 一九九四年過世,學生整理他留在餐巾上的草稿。Stanford Court Hotel 的餐巾,四十多年前,十種不一樣的 NeXT logo 塗鴉,還有畫了高領毛衣的 Jobs。成交條件硬:十萬美元,一個 logo,不能改。有人罵太貴。Cain 找到九〇年代 Jobs 的訪談:建立一個普通人記得住的品牌,要十年以上、幾億美元。他要抄近路,十萬美元先換一個,像聖誕禮物上蓋下去就認得的印。那顆 logo 現在是設計學校的經典。鎂合金正方體還在博物館櫥窗裡,倫敦蘇富比也拍過。介紹 Rand 給 Jobs 的是 Susan Kerr,Macintosh 出身,後來約聘幫 Microsoft 做 Windows 95。Cube 對外展示是一九八八年發表會。Cain 寫機子一九八七年十月推出。Merrill 說,放回一九八八年看那顆硬體跟 logo,就是超前。

慢慢破產,然後突然

九〇年代初,Cube 賣不掉。Cain 能查到的總銷量大約五萬台,很多是掛帳給通路,錢其實還沒進來。書面數字一個月大約五十到三百台,撐五、六年。一九九三年的價錢,能真正當機器用的那包,超過一萬美元。光碟是 Jobs 很迷的東西,但不夠獨力跑,硬碟是加購。大學買家是大機構,預算從一開始就講三千美元或以下。消息傳來,他們說買不起。有的買一台、幾台放角落試,能力看了佩服,不會一次買一百、兩百。外面還有 Sun,IBM 也在做工作站。

Jobs 這段時間沒在聽顧客。一家叫 O'Connor 的金融公司在做極速交易的早期實驗,用 NeXTSTEP 寫自訂應用,東西一進市場就下單。他們要的是軟體能搬、能放到別的系統,不要被鎖在昂貴硬體裡。勸了又勸,他繼續抗拒。公司實質上已經破產。

CFO Marcel Gani 是凌晨兩點被打電話找來的。Jobs 有深夜給消息的習慣。他說給你 CFO,但不准先看資產負債表,我們要聘敢冒險的人,相信公司沒問題。證據是後面有 Intel、有 Canon。Gani 進門開帳,發現自己加入的是一家破產公司。一九九三年底,骨牌倒了幾個星期。他們對最大投資人 Canon 做 cram down:週末結束前再投兩千萬美元,星期一要進帳,不然關門。Canon 已經砸了一億美元以上。兩千萬進帳,只是讓公司不要立刻死透。硬體部門關掉。消息早一天漏給媒體。硬體員工開車上班,收音機說:對了,NeXT 整個硬體部門要關了。進禮堂,有人哭,感覺像家人死了。大約三週後,Jobs 的父親 Paul 真的過世。時機殘忍。

他自己的錢砸在還沒成功的 Pixar,NeXT 不是上市公司,硬體關了、人裁了、投資人怒、媒體拆。Fortune 說他是蛇油推銷員,會被寫出歷史。末批 Cube 在消息走漏當天出貨,接著跟客戶收停產硬體的錢。有粉絲從硬體主管 Rich Page 拿到幾台,帶到柏克萊附近的聯邦核子科學實驗室 Lawrence Livermore,請官方煙火技術員架火把,象徵性燒掉。燒不掉。Jobs 把機殼做成燒不掉的東西。人後來講這些會笑,當時是慘。Lewin 跟 Cain 提過海明威《太陽依舊升起》那句:你怎麼破產的。慢慢地,然後突然。

硬體沒了,NeXTSTEP 得搬到別人的機器上。軟體主管 Bud Tribble 從第一天就在。對象包括 Compaq、HP、後來的 Gateway 2000,還有 Sun。OpenStep 是把 NeXTSTEP 那層 API 鋪到 Sun 系統上。做過的人告訴 Cain,這件事當時佔 NeXT 營收大約四成到五成。沒有 OpenStep,NeXT 會死;沒有它,Jobs 回不了 Apple,Apple 大概倒、或被買走。物件導向被他們鋪到 Sun SPARC、Windows 機器上。Windows NT 也需要這種東西。軟體太超前,問題是怎麼掛上別人已經成功的硬體,長到有夠多人用。

Merrill 補了開發者還看得到的痕跡。OpenStep 之後,類別加上 NS 前綴:NSImage、NSBrowser,後來的 NSString、NSArray。有人說 NS 是 NeXTSTEP,有人說是 NeXT Sun。寫過 iPhone 或 Mac 軟體的人天天碰到。這套東西活過公司被賣、三次 CPU 架構更換、一門新語言,Swift 裡還在用。

WebObjects,以及十一年才等到的那場對決

跟 Sun 的夥伴關係,Jobs 對外講成 Sun 把未來押在 NeXTSTEP 上。Sun 主管後來跟 Cain 說,他在編。沒人把 NeXTSTEP 當未來,那是後來才被看清楚的事。九〇年代中是作業系統戰爭,Windows 95 要出來,Copland 是一場災難。Java 是 Sun 在做的網頁語言,瀏覽器當平台;Sun 從桌面工作站轉成賣伺服器。Lewin 補了常被漏掉的背景:Sun 口號是 the network is the computer;CommerceNet 那一波,商業活動終於能上 Internet,大約九〇年代中,XML 跟 Web 標準要到九七年才冒出來;Sun 授權軟體更要的是智財跟專利,那是他們被 Oracle 買走之前活下去的條件,也是後來 Microsoft 反托拉斯案撞上的東西。Jobs 需要把「他們會出貨」講出去。真的在不在意出貨,是另一件事。

Tim Berners-Lee 在一台 NeXT 上做出 World Wide Web,比 WebObjects 早六年。網站當時是靜態的,一頁就是一頁。要賣東西、要更新搜尋、要讓人選車色車型,網頁得自己長、自己改,不能每次派人進 HTML 改碼。Jobs 很早看出 Web 會是互動媒介。Cain 引他一九九六年接受 Wired 的訪談:技術本身不改變世界。成熟之後、家裡有人把他馴一點之後,他開始把 Web 跟技術看成工具。舊的他會把電腦推到你面前,說這是我的宏大願景,不買就是你不夠聰明。新的他說:我做了這個來解你的問題,你給回饋,我再改。WebObjects 就是他拿來對付這題的東西。對象從消費者轉成要動態網站的機構:Dell、Disney、BBC。Michael Dell、Bill Gates、Larry Ellison 來敲門。故事在這裡拐彎。

Merrill 用開發者的眼睛看一九九五年。當時有 CGI、Perl,還有 Microsoft 的 Active Server Pages、Java 的 JSP。WebObjects 把元件模型、伺服器端狀態、物件關聯對應收在一起。他說大概要到二〇〇二年的 ASP.NET 才再看到這套。Lewin 說你的範圍對了。Merrill 這幾年還碰過一個還在跑的 WebObjects 專案,文件難找。iTunes Store 一路用它用到二〇〇〇年代很晚。Apple 買下 NeXT 之後,WebObjects 團隊跟 NeXTSTEP 團隊還吵過,有一段沒事做。iTunes 要出來,它剛好是那件事的軟體,才被贖回。

一九九六年,Apple 在最低點。花四億兩千七百萬美元買 NeXT,把 Jobs 當顧問,連人帶團隊一起買回去。Mac 軟體還停在八〇年代。開機做文書,死亡轉球出現,關機,資料沒了。作業系統沒有記憶體保護。Microsoft Windows 壓過來,不換作業系統就是死。Gil Amelio 是被請來做轉機的 CEO,他寫過上任時大約五百名工程師在做 Copland,各塞各的,時程落後幾年,做不成。他跟從上一間公司帶來的技術長 Ellen Hancock 決定:下一代作業系統要向外買。

選項有 Sun 的 Solaris,還有 Jean-Louis Gassée 的 Be。Gassée 是一九八五年接走 Macintosh 部門的人,Jobs 被開除那次的對手。Jobs 叫過他 a very evil man。NeXTSTEP 一開始不在名單上。Cain 查檔案,最關鍵、Jobs 也承認真正推動事情的,是 NeXT 員工 Garrett Rice 打給 Hancock 的那通;同時還有別人在遊說、有人叫 Apple 去看 NeXTSTEP,別把這講成單一電話神話。Amelio 把這場叫 shootout。Gassée 已經簡報很多次,以為成交了,進去態度傲慢,打發他們:你們需要的都有了,把軟體買下來就好。Jobs 帶 Avie 在 Stanford Court Hotel 做簡報,QuickTime 影片在螢幕上跑。Merrill 後來重讀才消化那句:大約十一部電影同時播。那是一九九六年。Apple 幾乎當場決定買。

從一九八五年到這一天,十一年。接近破產、被媒體跟投資人嘲、幾乎被寫出歷史,靠 Avie 這些工程師才走到光。Cain 寫書時對 NeXT 團隊生出很深的敬意。Merrill 依稀記得後來波士頓 Macworld 把 Jobs 迎回去,一九九六或九七年。

Lewin 那時離開已經五年。看 Apple 掙扎叫人洩氣。一九八二年他把 Mac 帶回家,大兒子十八個月,在 MacPaint 裡推滑鼠、開關 fat bits。沒人知道結局,也不確定 Jobs 或 NeXT 還有沒有機會把公司救回來。後來大家記得 iPod,彩色 Mac 也重新包過。真正把飛輪轉起來要好幾年。MP3 播放器早就有。沒人走進 Sony、走進擁有音樂的公司,說你不把歌切成九十九美分一首賣,我就要讓我的顧客去偷。Billboard 那一頁,工作室後來翻了。Mike Slade 說服 Jobs 做 Windows 上存音樂的應用,人在 PC 上升級,發現在 Mac 上更容易,再買一台 Mac 存歌。Merrill 自己就是這條路:長期只用 Windows,買了 iPod,才對 Mac 打開。Lewin 說那是拆解既有產品跟做法,做出新市場。電話市場後來也被這樣拆,然後 iPad。Jobs 已經是比較成熟的領導人,會用身邊那些人的本事。Lewin 自己在場邊當啦啦隊,後來去 Microsoft,再後來七年在 Computer History Museum,大約一年半前結束。

Jon Rubinstein 多數聽眾認得。他是 Lewin 走之後才進 NeXT 的。Cain 訪談時,Rubinstein 先問:這不是一本講 Steve 的書嗎。Lewin 回:Apple 七年,NeXT 十二年。對方愣了一下。他在 NeXT 末了四、五年,再進 Apple。七年、十二年,再加十年,才把機器重新轉起來。沒人好好寫過那段過渡。書的鉤子是 Jobs 的名字,故事是 NeXT,Jobs 剛好是主角。早期技術決定在 Avie 進門之前就定了,Bud Tribble、William Parkhurst、Jean-Marie Hullot。Parkhurst 敲過門:你們不必付我薪水,給股票就好。還有 Randy Nelson,世界級雜耍,寫信來說想教人寫這台機器;走過白宮跟克里姆林宮,學日文為了寫俳句。大概一九八六年中後期進門,在開發者面前即時雜耍,把物件丟進系統裡教。後來去 Apple,幫過 Apple University。

Jobs 一九九七年初回 Apple,立刻爆發一場內戰。一派要守舊作業系統,叫 blue box;過渡叫 yellow box,也就是把 NeXTSTEP 跟 OpenStep 的 API 鋪上去。原本目標一九九九年完成移植。兩派連該不該有新作業系統都吵不完。Jobs 真正當上 CEO,大約還要八、九個月。Cain 說他並沒有設計一場政變去趕 Amelio,可他確實讓 Amelio 很難看。他把收購拿到的一百五十萬股賣掉,股價跌。Amelio 當面問你為什麼毀掉股價。Jobs 說我很沮喪,不喜歡 Apple 現在的樣子,以顧問身分在場邊看,這家公司目前沒希望。這筆出脫他沒預料到,骨牌卻倒了:董事會開除 Amelio,請他當 iCEO,interim CEO。Cain 說這是 Apple 第一次用那個 i。後來才有 iTunes、iPod、iPhone。Jobs 本人是原來的那個 i。

Lewin 有個極熟的朋友替 Amelio 做事,在場親眼看 Amelio 邀 Jobs 一起去跟 Bill Gates 開會。會後那人問:你剛才做了什麼。Amelio 說我請 Steve 來跟 Gates 的會。對方說你知不知道,你請 Steve 進一場會,那就不是你的會,尤其對象是 Gates。

Apple 那時沒希望,直到 Jobs 跟 NeXT 團隊出現。Avie 管軟體,Rubinstein 管硬體,他自己成為那個 i。Rhapsody 是給 NeXTSTEP 套上 Mac 的皮,再走到 Mac OS X。WebObjects 走進 iTunes。程式碼裡到處冒出來的 NS,就是 NeXTSTEP。Jobs 講過,技術是一層層的,十年、十五年、二十年後,現在蓋的都會變成下面一層。NeXT 本來是一層,被整層倒在 Apple 上面,現在反而是最上面那層之一。Apple 今天的軟體本事,有一塊從這裡來。

Lewin 說旅程就是報酬。他謝謝 Cain 把故事專業地寫出來。自己只是跟一九五四年、五五年那一輩差不多歲數的人:Gates、Ballmer、Bill Joy、Eric Schmidt、Jobs,再算上他。電腦業當時就是那一小群人。矽谷會在,是因為蘇聯火箭比較好,政府為了更輕的酬載去養半導體。他們當年追的龍是做出對的電腦。現在這件事變成計算本身:生物、藥物發現、環境、教育、健康,全球跟微觀同時發生。演算法其實是舊的,現在只是有電腦跑得動。AI 這個詞,一九五〇年代就在 Dartmouth 校園被六、八個人拿出來聊過、命過名。功率現在才有。

Merrill 說這本來就是團隊。Lewin 說大家都欠 Jobs 跟這一行一筆。事情沒照所有人預期走,卻因為他的能量長成現在的樣子。他們騎在那上面。

〈Software Engineering Daily〉-EP-Security in the Age of Instant Exploits

https://softwareengineeringdaily.com/podcasts/security-in-the-age-of-instant-exploits/

MongoDB 那則漏洞報告一公開,丟給 Claude,就能拿回一份完整的 exploit。Alon Schindel 記得另一個速度。他加入 Wiz 之後,最早公開的漏洞裡,有一則 Apache HTTP server 的 critical 漏洞。報告出來,大約還要兩天到三天,才看得到 exploit。

Alon 是 Wiz 的 AI 與威脅研究副總裁。Wiz 做雲端資安平台,2026 年被 Google 買下。公司成立六年,他大約五年半前加入。這一集的主持人是 Gregor van,人在新加坡,自己是 CTO,也是創辦人,做的是溝通、資安和 AI 交界的事。他最近創的公司叫 Wintic AI,在想 AI 時代的 email 可以長成什麼樣子。大約兩年前,Gregor 也請過 Wiz 的 Rami McCarthy 上這個節目。

Alon 做資安超過二十年。三、四年級就在做網站,喜歡把東西做出來,也一直想知道自己的網站會怎麼被打。後來在學校、在工作,只要能選資安,他就往那邊走。帶過他的人裡有業界的前輩。其中一位是兒時朋友,同一間幼稚園,五歲就認識。這位朋友認識 Wiz 的創辦人,是最早進去的工程師之一,差不多第一天就在。公司成立幾個月、想擴大的時候,他傳訊問 Alon 現在在做什麼、有沒有空談一個新機會。Alon 說聽起來有意思。他覺得這種從小開始的關係,值得一直留著。

這六年他覺得什麼都看過。2021 年的 Log4j,是他眼裡最大的漏洞之一。眼下則是供應鏈攻擊,Shai Hulud 這一波,以及其他類似的 GitHub 蠕蟲。可是一扯到 AI 怎麼改資安,他又覺得得重來。挑戰是真的,節奏比以前都快。公司滿六歲,體感卻像去年才開始。

談 AI 跟資安,他要人把兩件事分開。一件是用 AI 做資安。另一件是去保護 AI,以及 AI 一出現,攻擊方多出來的入口。兩邊都得談。他說現在像換了一套物理規則。以前公開、等人寫出 exploit、再被人掃到,這些節奏都在改。

公開到能打,Gregor 看著表一路往下改

Gregor 先轉述 Firefox 團隊的說法。2026 年 4 月,他們修掉的資安 bug,比前一整年還多。原因是 Anthropic 的模型 Mythos。這支模型中間下線過一陣子。以他們錄音時的理解,大約在錄音六天前又回來了。當天談的時候它是開著的。他補了一句,若這集播出時它又下線,先跟聽眾道歉。他還點到 Fable,說是搭配的另一支。

Alon 覺得 Mythos 聲音很大,像把產業叫醒,但不是起點。模型變得擅長找漏洞,他們去年就看到了。去年十二月,Wiz 辦了一場 AI 漏洞競賽,請人來挖軟體、雲端軟體、AI 軟體裡的洞。名次排在前面的隊伍,多數用了 AI。那場競賽比 Mythos 公開早了大約四個月到五個月。他也一直說,Opus 4.6、Gemini,還有 OpenAI 的 GPT-5.5,找漏洞很強,寫軟體一樣強。

Gregor 對照的是 Alon 文章裡提到的 zerodayclock.com。節目開頭先說,漏洞公開到打得動,以前的空檔常常以月計。那張圖則一路往下。2021 年,從發現到被人打進去要一年,當時已經讓人覺得很快。2025 年掉到一個月。錄到 2026 年,Gregor 盯著格子改口。先說一週,又改成這一年也已經到一天。五年裡,從還有一年可以補,變成能有一整天就算幸運。他當時還估,下一格就是一小時,所以也許已經低於二十四小時,大概二十小時。網站自己估,2027 年可能到一小時,甚至一分鐘。

Alon 同意這個壓縮。他負責找洞,也負責洞公開之後怎麼回應。過去這一年幾乎是一則接一則在處理。洞變多,exploit 出現得更快,回應就得更快。

節目後段,Gregor 再看一次那張表。2026 年實際落到兩小時。一小時那格還沒勾,因為還沒到一小時。

一個人在家,就能掃整片網路

Alon 把眼下叫成:找洞變得人人做得起,打網站更容易。他假設自己十歲就有 Opus,還不必是 Mythos,已經夠拿去掃網路上露在外面的資料,或是那些一觸發就把 secret 交出來的 Lambda 函式。門檻一直在降。基本功還在,你得懂自己在講的東西。模型是來幫忙的。

Wiz 比較早拿 AI 做的一件事,是 red agent,自動化的攻擊方。功能做得很快,也很快開給幾千個客戶。他覺得這大概是他們看過採用最快的功能之一,因為有效。掃網頁,掃 HTML,掃 JavaScript,AI 會用駭客的方式讀,把暴露找出來。以前看過很強的駭客,也看過 APT、國家級的隊伍。那些要時間、要功夫、要技術。現在一個人待在家裡,就能跑大規模掃描,把暴露找出來。

換到藍隊,也就是防守這側,他覺得同時出現機會。事情在變,不表示長期一定變得更糟。

防守方看得到家裡什麼重要

他樂觀,是因為 context。五年前他們做產品,已經靠 context 排優先順序。現在模型沒有 context 就做不好。context 愈準,掃出來的結果愈準。

Wiz 的掃法是內外一起。從裡面看環境,知道哪些資源重要、敏感資料在哪、一家組織最不能被帶走的東西在哪。用這些線索把掃描變聰明,依敏感程度、依對系統有多關鍵來排。手上有「這個資源裡大概是什麼」的提示,再從外面像攻擊方一樣掃那個頁面,掃描時帶著提示。他說這樣很有效。他們在外面找到幾千則漏洞和嚴重暴露。若不是他們先找到,就可能是攻擊方。資料本來就露在那裡。

掃的時候讀 HTML、讀 JavaScript,看什麼露在外面。有時是 token,GitHub PAT 或其他 token,不小心嵌在網頁裡。誰都讀得到,拿去登進那家公司的系統,攻擊就從那裡開始。接下來可以把資料帶走。若是 GitHub 的 token,也可以往產品或那家公司做的套件裡加一段惡意 script,感染下游客戶。供應鏈攻擊可以從這裡開始。

攻擊方會怎麼用 AI,防守方就照同一個用法去做。他先把一個假設擺上桌:雙方用得到同一等級的模型。這個假設成不成立,可以再爭。在這個假設下,防守方知道家裡有什麼、什麼重要。攻擊方做得到的是硬試和廣掃。真正進來之前,不知道什麼才重要。他認為優勢在防守方。

Gregor 補的是,AI 出現之前,這些 context 住在寫過程式的人身上。這段怎麼拼起來的,哪一段是趕工推出去、自己也不太有信心的,哪一段資安工程師沒看夠久,哪一段有更多人看過。GitHub 上的歷史也算。某個 pull request 底下有人寫,先上線吧,可是他不太放心。這些都可以放進防守用的 context。

開源維護者一週要看幾十則、上百則

負責任揭露,Alon 說原則是遵守各平台不同的規則。他講的幾千則發現,是 Wiz 產品裡看得到的那些。系統標成非常嚴重、可能真有暴露的,他們會試著用資安信箱,或直接聯絡那家公司,走跟其他報告一樣的路。若是客戶,就直接找資安團隊。

規模一大,壓力換到開源和小型維護者身上。上週他看到一個例子。一個開源專案揭露了一則漏洞,來報的公司或研究人員,他記得大概十五個。原因是大家都在用 AI 掃這些專案。他說,小型維護者一週可能收到幾十則、上百則,來自不同公司。哪一則先看,變成難事。有些維護者已經講明,AI 生成的報告他們不回。裡面還有 AI slop,也就是垃圾報告。要看的資料變多,是 AI 另外造出來的負擔。

Wiz 自己人夠,報告送得到該去的地方。多數問題在產品裡報給客戶,客戶的資安團隊有流程可以接。開源不是這種條件。有人用業餘時間做了一件對大家都好的事,現在卻因為回得不夠快而被羞辱。他們沒有那些資源。這就是他們的生活。

他因此覺得 Firefox、Mozilla 那個方向重要。眼下該做的,是前沿實驗室跟這些構成網路骨幹的關鍵開源專案一起掃,幫他們在攻擊方之前把洞找出來。他知道 Google、OpenAI、Anthropic 都在這件事上花力氣。他認為得現在做,趁這些能力還沒擴散到攻擊方手上。

沒有人有一套完美的自動修復

時間若只剩一天,甚至更短,Gregor 把修補講成得變成持續、自動、中間沒有人。他說這一直是大家想摸到的那個終點。漏洞一宣布,就有 agent 去處理。Wiz 攻擊那側有 red agent,回應那側有 green agent。

Alon 把全自動想成一圈:找到暴露,分析,再自動修。他直接說,這件事不容易。他不覺得今天有誰握著完美解。聽這集的人,手上很多系統已經放了很多年,裡面有舊程式。他不想讓人以為世上有個完美做法,自己沒採用,就該覺得差勁。

先持續掃。第一層掃得寬、掃得淺,就像 red agent 那樣,一直看自己的攻擊面,弄清楚什麼暴露在外。攻擊面不只有網站。GitHub 專案要掃。最近這波供應鏈攻擊就是從那邊來的。CI/CD 管線要掃。任何可能被打的資源都要掃,用 AI 持續掃,想在攻擊方之前找到。

下一步是看這件事可能有多嚴重。文章裡的 AI threat readiness framework,是要公司、資安團隊和軟體工程團隊重新想怎麼回應漏洞。其中一塊就是把暴露縮小。不該有東西露在外面,這句老話現在變得要緊,因為露在外面的東西,大家找得到,也打得很快。他看到的很多情況,問題不只是漏洞本身,而是那個資源根本不該公開。先把這類收掉。

若一個資源上確實有能被利用的漏洞,可能是設定錯誤,也可能是你自己程式裡的洞,偏 AppSec、應用程式這側,才開始排修復。green agent 從這裡接手。它先追這則問題從哪來,找根因。這一步平常被忽略。外面看到一個暴露,要對回公司裡的負責人,對回那個程式檔,以前非常難,現在仍不容易。AI 若同時看得到暴露的資料和程式庫,就幫得上。他們把這段叫 cloud to code:找出問題的源頭,再排修復步驟。

AI 不只好打,也會寫、會讀軟體。他們在做的 agent,找到問題之後會排出修復做法,有時給出好幾種。還可以加記憶,把指示寫進 agent。你可以要求它一律先修補。也可以要求它優先改 Terraform,把暴露收掉,先動程式以外的東西。

自動修補,產業還在弄懂怎麼做。補完要測。下一階是怎麼自動測新程式,確認這次改動沒有打到系統別的地方。這條自動流程,有些情況跑得起來,剩下的還很多。有時得改架構,才比較容易走完。安全映像檔是其中一條。用比較好的架構,組織可以把從掃到測這整段走得比較快。

Gregor 把安全映像檔說成大家也叫的 hardened image,或 hardened container。他覺得開發者要吞的代價,是工具鏈受限制,或容器得做特別修改。想讓整條供應鏈安全一點,團隊得接受這個交換。

熱門套件若沒人顧,像一顆定時炸彈

外面那些函式庫和套件,風險也在變。有些套件維護得不好。他說他們不去評判維護者,對方的挑戰已經很大。研究裡他們會掃公開的專案、CI/CD、GitHub Actions,並且負責任地跟維護者合作。很多專案有暴露。一個很紅、很多組織在用、又有暴露、安全習慣又不好的套件,他看成定時炸彈。

所以縮小暴露,不只有把公開資源收起來。還有審查你在用的開源程式,從比較安全的 SBOM 開始選。SBOM 是軟體物料清單,也就是這份程式到底裝了哪些套件。他說的把安全往開發更前面挪,還有架構上的改變,不只有安全映像檔。也包括一開始就把這份清單選得安全一點。他不覺得這會容易。軟體開發者大概都不想停用一個熱門函式庫。

不安全的套件用得更多,原因之一也是 AI。用 coding agent 寫程式,很多時候你根本不知道裡面有什麼。相依套件是 agent 加進去的。弄清楚自己程式裡有什麼,把選擇做對,這件事還是重要。他希望 coding agent 以後也會把比較安全的架構、比較安全的 SBOM 排進優先。

靜態分析看圖案,模型開始看懂程式在做什麼

靜態分析在業界叫 SAST。看程式碼,對上已知會出問題的寫法,工具放了很多年。Gregor 理解現在前沿模型找得到的是另一類:複雜的邏輯漏洞、IDOR(insecure direct object reference)、串起來的漏洞,以及整條應用流程寫得不安全。前兩類尤其是以前很難抓的。

Alon 說,看懂程式、看懂這類問題,能力跳了一大步。有些問題,他真的覺得以前沒有任何技術找得到。SAST 這個縮寫不新,產品存在很多年,Wiz 內部也做過一套。目標是在程式裡找洞,偏應用層。大家熟悉的簡單例子是 SQL injection:使用者丟進來的輸入處理得不安全,可能一路變成 SQL injection。

這件事以前是學術上的硬問題:怎麼讓機器看懂語言。領頭的公司多半靠語言處理,試著看懂程式怎麼流,建出一張流程圖,也就是 CFG,弄懂程式的走向。以工程來說,極難。現在的模型、LLM,文字看得懂。程式也是有結構、有規則的文字。他說從十二月起,模型看懂程式的能力跳得很大。寫程式變順,找這類漏洞也變順。

漏洞不是同一種。記憶體漏洞是一類,找的是記憶體洩漏,或能被利用、把程式碼塞進那個 process 的記憶體的問題。應用層是另一類。Wiz 這裡是兩條線。一隊在做很深的漏洞引擎,專看記憶體漏洞。另一個比較像 AI SAST 的 agent,會進產品,找的是程式裡的洞,SQL injection,還有前面講的 IDOR。後者比較像做 code review,只是從資安的角度看:你到底讀不讀得懂這段程式。機會在於,AI 現在真的讀得懂。難還是難。

一家公司常常很多個程式庫,你得把跨庫的參照都找出來。LLM 要的是完整的 context,得看懂整個系統。他們看過有幾百個不同 repo 的組織,專案散在不同環境裡,你得把那條線索接起來。他也提到有些產品非常大,得先把東西寫下來。他們的做法是把不同工作交給不同 agent。比照的是人以前手動找洞的老方法:先找各種線索,再蒐集哪裡引用到這個問題,然後真的試著打,再測、再驗證,甚至再做一次判斷。

有時不同模型一起上。Claude 有 Claude 的長處,Gemini 有 Gemini 的,GPT 又有另一種。一個模型卡住、找不到,就叫另一個來幫。像不同研究員各有擅長。目標是收成一個找得到洞的系統。

還得壓誤報,並且看懂這則問題到底有多嚴重。他看到 LLM 的一個毛病:一找到東西,常常就標成非常嚴重。它說嚴重,不一定嚴重。這跟訓練有關。他們得自己判斷嚴重程度,避免誤報。

還有一件事。不必是 Mythos 或 Fable 那一級。Mythos 很強。以參數數量來說,它是非常大的模型,跟其他模型差了一整個數量級。可是模型外面那層 harness,也就是把多個 agent 分成不同工作、串在同一條找洞流程上的做法,若做得好,結果可以接近在 Mythos 上看到的。找漏洞不能只看模型。今天還不在 Mythos、Fable 那一級的前沿模型,配上好的 harness,一樣做得很好。

同一題跑兩次,答案可以不一樣

Gregor 拿一般的 SaaS 產品對照。那種找到的問題,重現步驟通常寫得很清楚。AI 找到的,往往告訴你找到什麼、影響可能是什麼。要另一個人照著重做,就比較難。

Alon 說,錄音前一通會議剛在談這個。今天要做一個好的 AI 系統,不管哪一種,都得做 eval、評測和 benchmark,弄懂自己哪裡做得好。系統一改,以前看過的過程還重不重現得出來。LLM 有隨機的成分,底子是機率。他們的目標是盡量讓它每次結果一樣。誠實的答案是,還沒到。

harness 要做的,就是在這個機率的底子上,仍讓它能穩定重跑。賣產品的人很難賣一個每次答案不同的東西。他看到的是,大家對這種隨機比以前容忍。四年前,沒有人接受。現在人開始習慣 AI 系統給出不同答案。資安這邊的容忍度比過去高一點。可是資安還是會碰到:不同次執行,結果不同。

他們的引擎會把同一則問題重現很多次。有些漏洞本身也是機率的。記憶體漏洞跑 exploit,平均十次裡大概只有一次成功。兩層都是機率,疊在一起更難跑。前沿實驗室也在花很大力氣,讓模型的結果更穩、更能重複。

Gregor 覺得大家願意忍,是因為換來一批以前完全找不到的東西。要是系統必須每一次都一樣,這些就不會出現。要篩的池子變大。可是裡面有些是嚴重到很離譜的問題,SAST 放了很多年都沒抓到。

多挖出來的洞,多半還打不進去

Gregor 喜歡那篇文章的框架。AI 攻擊方拿得到,防守方也拿得到,而且防守方看起來比較有利。他看利用比例。已公開的 CVE 裡,確認在野外被利用的比例,對上 CVE 的量,其實在掉。2026 年是 0.25%,2021 年是 2.2%。他覺得這跟 Alon 比較樂觀的判斷對得上。AI 人人用得到,情況反而像在變好。

Alon 接的是另一個事實。這集錄完之前,利用時間可能還會再短。可是找到漏洞,不表示就容易利用,也不表示找得到 exploit。他們用 AI 找到的漏洞,多數其實打不進去。模型再好,也許以後打得比較動。找到,不等於攻擊方就能拿它做壞事。

他預期短期內會挖出愈來愈多漏洞,其中多數不能被利用。曲線上某個點,多數開源軟體會被掃過。只要模型這邊沒有再跳一大級,這些問題多數會被修掉。他看明年的資安團隊,會很辛苦地補系統、修漏洞,要補的 CVE 會很多。再往後,公開出來的漏洞數量會開始下降,因為該找到的大多找到了。架構也會改,被利用的機會變低。

這集之後,他們還準備再寫一篇,講用 AI 找漏洞。Alon 帶的團隊平常就被鼓勵把看到的寫出來,文章,或甚至一張圖。他覺得資安有一點不一樣,把看到的分享出去,會影響到別人。他們接觸得到世界各地的資安團隊。

有人把今年叫 vulnerability apocalypse,漏洞末日,也有別的名字。再過一兩年,等這段過去,他覺得可以好過一點。前提是社群現在就一起修,並且比攻擊方先找到。長期可以變成一個更安全的世界,攻擊方很快,防守方更快。

〈Software Engineering Daily〉-EP-The State of Browser Testing

https://softwareengineeringdaily.com/podcasts/the-state-of-browser-testing/

David Burns 在 Software Engineering Daily 講瀏覽器測試。同一套測試要能驅動 Chrome、Firefox、Safari,靠的是開源專案、瀏覽器廠商,還有 W3C 這類標準組織磨了很多年。他是 BrowserStack 的 Developer Advocacy and Open Source 負責人,Selenium 跟 WebDriver 做了很久,Mozilla 待過十年。主持人 Josh Goldberg 在 Sentry 做前端,維護 TypeScript ESLint,一套給 JavaScript 跟 TypeScript 的靜態分析工具。他寫了 O'Reilly 的《Learning TypeScript》,是 Microsoft MVP(Developer Technologies),也是 SquiggleConf 共同創辦人。David 把測試收成一句:一條關鍵路徑,一條紮實的測試。

南安普敦那份第一份 QA

David 在南非長大、讀大學,主修電腦科學跟工業心理學。他自己說,當時拿不定要進科技,還是去當心理師。後來去英國,名義上是去走走。銀行給了他一份流程再造的工作,他在那裡碰到流程自動化,也跟不少做 QA 的人共事。下一站是南海岸 Southampton 的新創,大約 2006,CI 正要起來。公司以前沒有 QA,要人把東西修好,並做自動化。這是他第一份 QA。

那個年代的版本控制,檔案得 checkout 出來,別人就不能同時改同一份。CI 要怎麼跑、東西要怎麼建,都得自己想。公司給的自由很大,說法是我們沒時間搞懂,你去弄。QA 環境裡的 SRE 他得自己當,自動化框架自己搭,再幫別人用起來。Extreme Programming 那時把 TDD 帶了進來。他覺得這主意好:從一開始就想測試,應該多做。公司做的是行銷軟體,他待了大約四年。工程師跟人都很好。為了當一個稱職的 QA、搞懂他們在賣什麼,他也得學會把自己推銷出去。現在若走回去,他大概會把當時的做法全部換掉。那四年對他是很大的學習。

晚上有空檔,是因為太太是音樂人,工作常常不在。他不是會打一整晚遊戲的人,就拿晚上做開源,去幫當時才剛起步的 Selenium。

回到那天,他最先想改的是 DSL。那時 DSL 很流行:拿一個框架,用你選的語言,把 API 包成公司自己的領域語言。他認定 fluent API 漂亮,就做了一套:做這件事,點下去,做那件事,再點下去。進了除錯器,才發現這東西有多糟。每一層都是一個點,要鑽很多層才碰到真正的問題。看起來順,不好共事,別這樣做。Josh 說他還是懷念 jQuery 滿街 fluent、以及 C# 裡的 LINQ,這一點他同意。

三百五十人的 Mozilla

開源的信念從大學就有了。軟體該免費,圍繞它的服務再付費,知識放出去,世界才變好。網路在他看來是最了不起的發明,用來分享、用來學,理想上人人都能用。他也知道資本主義不會照這套走,網路有很糟的部分。Mozilla 把他所信的那一面做出來了。

換工作的原因很生活。他當時開車去 Southampton,單程一小時。太太懷孕。他不想一去一回,把跟家人的時間吃掉。Mozilla 在招人,是他碰巧看到的。進去時大約三百五十人,他覺得很小。碰到的人,他形容是自己遇過最聰明的一批,要解很難的問題、要上規模,還想讓世界好一點,來自世界各地,人也客氣。jQuery 的作者當時也在。他見到 JavaScript 的作者 Brendan Eich。這些人願意把知道的講完,他說每天都在學。

職稱是 QA lead,專案叫 Socorro,一個讓人看 Firefox 為什麼崩潰、堆疊長什麼樣的網站。當時使用者超過五億。就算只有百分之一在崩潰,進來的資料也多到不得了。他在那裡把系統操過一輪,學規模。這段大概四到五個月。

接著調去 Automation and Tools 團隊。Mozilla 用的測試框架,很多是這個團隊做的。買一套現成工具就指望它能用,在那裡行不通,東西得手工打造。團隊也管一部分 CI。大約第三年,他轉成工程經理。他把人看成另一種要解的問題,而且喜歡。他覺得這跟大學那門工業心理學有關。接下來六年,問題從建置、CI,做到 CI 視覺化怎麼擴充,中間仍有時間碰 Selenium。整段在 Mozilla,是十年。

瑞士那場會,Opera 把 Selenium 做進瀏覽器

進 Mozilla 的時候,Selenium 他已經做了大約四年。後來開始談標準,起點是瑞士一場會。聽比較久的人會記得 Google Test Automation Conference,簡稱 GTAC,以前在世界各地辦。有一年 Opera 有人帶著自己做的東西來:他把 Selenium 做進 Opera。在場的人覺得了不起,有瀏覽器的公司都該這樣。對方說,要大家這樣做,出路在標準裡。David 他們當時不知道那是什麼意思。

規格他讀過。新功能常常從規格來,為的是瀏覽器之間能互通,他也幫人圍繞那些功能做測試框架。從來沒有一份規格在講:把一套自動化框架做進瀏覽器。他們開始做。大約十八個月後,一個叫 Andreas Tulfsen 的人加入他的團隊,一起把規格寫出來。WebDriver 的作者 Simon Stewart 當時在 Facebook,兩人合作把標準推動下去。事情動起來之後,他們才看清有多要緊:當時拿標準去測瀏覽器,很多仍是手工,很慢,也很容易錯。有人看兩張圖,差了半個像素,就判定失敗。他記得有個 Internet Explorer 的 QA 在做這種事。某些情況下,對方把完美放在夠好前面,時間花下去,多半是浪費。再給聽比較久的人一個名字:渲染用的 Acid tests。有的瀏覽器做到百分之百,有的做到百分之九十八。他們的判斷是,那就夠了。把一份標準做出來,比你在 W3C 或 WHATWG 網站上讀到的那一頁難得多。

點擊好定,等多久不定

規格有了方向之後,大量工作是在決定什麼能定、什麼不能定。對 Selenium,也可以說對 WebDriver,好定的是這些:我要打字,我要點,我要移動滑鼠,我要拖放。難的是,你怎麼知道一個元素真的在頁面上,以及你該等多久。

要把「有意義的等待」定成標準,又不能去解停機問題。停機問題是 Turing 那個著名的問題,解不了。自動化一碰到「它到底會不會停」,就很難。他們不打算解那一個。

另一個難處是,你想動作的時候,那樣東西看不看得見。WebDriver 一開始,Simon 的要求是:人要點一個東西,它得可見。可見是什麼?不能靠逐像素去對。畫面上會有遮罩。CSS 有 z-index,但那又不完全是一條乾淨的前後座標,DOM 跟 CSS 怎麼排,別的東西照樣可以蓋上來。力氣大多花在這裡。這些是別人自己未必得解的問題,寫進標準就躲不掉。

他們另外留了一條路:別人可以用其他標準、其他規格,把 WebDriver 往外接。做新功能的人就可以說,我們知道怎麼測了。現在很多瀏覽器就是這樣測。他拿權限當例子,因為這集正在錄音。你打開一個網站,它問要不要把攝影機跟麥克風交給它。這種對話框怎麼測,很難。規格裡把 WebDriver 的 API 做出來,就可以延伸、就可以開始測。現在的力氣多半在把這些東西做好。舊的那份他們叫 WebDriver Classic。眼前很多工作在 WebDriver Bidirectional,雙向那一份。

Josh 把定義收成一句:WebDriver 描述你怎麼對瀏覽器送指令、收回覆,像點擊,像問元素看不看得到;上面的工具,例如 Selenium,拿去做自動化或無障礙測試。David 補了名單:Selenium、WebDriverIO、Nightwatch.js,外面還有一大堆。它們做得到,是因為對瀏覽器說話被簡化了,不用各自去想怎麼鑽進去。

以前鑽進 Firefox,靠的是做在 Firefox 裡的擴充功能。WebDriver 要對付 Internet Explorer,得做很多 COM 互操作,一換語言就更痛。從微軟自己的語言進 .NET,這條路很順。Java 進 .NET 就不怎麼樣。Python 跟 Ruby 更差。走到 Node,他的說法是:誰知道。

雲上的 Selenium,專案留在外面

BrowserStack 是 SaaS 測試平台。產品從測試管理工具到圍繞測試的 AI 工具都有。起步是把 Selenium 放上雲。擴充是很多人最頭痛的事,QA 這塊尤其,不是每個人都有那種經驗。不少公司的想法很直接:為什麼再雇一個人,付錢買服務不行嗎?行動裝置也在這條線上。

這是他在 BrowserStack 的第六年左右。進去時做的是 open source program office,其中一件事是回饋那些讓 BrowserStack 得以出現的社群。公司要他做 Selenium 的工作,把關係維持好。他們明確不想把 Selenium 收成自己的,想讓它留在原地。Appium 一樣。他跟 Appium 的人、跟 WebDriverIO 關係都好,標準的工作也還在做。對手會受益。他的講法是水漲,船都浮起來。會上他講他們做出來的東西,也講那些因為對產業重要、就放出來的東西。

Josh 把問題丟給一個想像中的大公司主管。開源是一邊,資本主義的帳在另一邊。為什麼要養一個會讓對手一起受惠的人?David 說,主管腦中全是風險。最大的一條:那個專案上的人如果全部停手,會怎樣。

他看過開源工程師被逼到盡頭,直接翻臉,把整個專案下毒,毒再蔓延出去。他記得有一樁大約在 2020、疫情那段,他以為是 left-pad,一個 Node 套件。那位工程師一直問:我失業了,你們都靠我這個東西,能不能給點錢。沒人給。他就把套件全部下毒,程式碼也刪了。這是他眼中最壞的情況。

他覺得公司該做的理由是企業責任。學校多半教過:讓你賺到錢的東西,包含上游那些供應,你得照顧。到了 AI 這段,他認為供應鏈攻擊會更常見。人在專案裡幫忙把東西顧好,會送出一些成果,生意的風險也被壓低。到不了零,是盡量低。

Josh 補了一層:熟悉規格、也熟悉規格後面那些人,对公司有用,想推一個功能或把某一塊顧好的時候尤其。David 同意。自家網站或產品跟 Google Chrome 出了大問題,他有聯絡人,可以直接找:這個 bug 我們重現了,能不能幫忙排優先。這也是在告訴 Chrome,你們的產品有這個 bug,拿掉吧。他們受益,別人也受益。工程師不想寫一堆 bug。bug 一直在,只是那條路還沒被那樣測過,現在可以去修。

行銷首頁可以不管

換成一家有網站的公司,為什麼要在意 BrowserStack,或這集講的任何一件事。David 先看你在不在意別人真的來用。不在意的話,BrowserStack 對你沒有用。只是一張行銷首頁,誰在乎。若是一家 SaaS,他認為至少每條關鍵路徑要有一條測試。這是他覺得最要緊的做法。

這不表示一定得用 BrowserStack。每條關鍵路徑仍該有那一條。一開始寫,測試會變多,也會變得要緊。旁邊還有法規。大家放在心上很多年的最大一項是無障礙,他認為在 AI 這塊會很大。治理是另一項,很多人得開始在意它跟其他東西怎麼咬在一起。

很多人只看價格,不看拿掉了多少認知負荷。他說,就算自己不是 BrowserStack 的人,也會建議有機會就用一家這類公司。自己雇人維護那套基礎設施,不能只雇一個,得兩個,要有備援,不然 bus factor 很糟,人一不在整條就停。之後是他們得不斷維護多少。這類公司把成本攤開比較容易,重活他們扛。人知道它會動,上面有 SLA,不用自己扛。認知負荷拿掉之後,剩下的是:我要測這個,我要產品品質好。他認為品質好,銷售會跟著來。

怎麼開始,他每次都說:先做一條,再往外長。理想上,一條關鍵路徑只留一條。架構時如果想過,別的保護在其他層:可觀測性、telemetry、中間那些,再加上日誌,事情發生時看得到。那一條是「我登得進去,而且做得出 X」。做完就好,再看哪一層變得更要緊。

下一條仍該是關鍵路徑。十五條大致在做同一件事,就不必再加。一條大約一分鐘,十五條是十五分鐘。你真的要等這十五分鐘嗎?沒有唯一配方。放在一起看的是花多久、有多關鍵、風險多大。套件若要跑二十四小時,能不能拆成一天裡的多段、不同區塊?平行愈多,回來得愈快,也省掉一種負荷:二十四小時前我在做什麼,才撞到這個 bug。他把這三邊叫做速度、正確、風險。

Josh 注意到,這跟很多人講單元測試、整合測試時很像:套件小一點、循環快一點,這裡拿來講端到端的瀏覽器測試。David 說他這行看下來,很多人單元測試堆很多,走測試金字塔:底下小測試,中間中等,上面長測試,從下往上該愈來愈少。元件測試起來之後,尤其 React、Vue,大家問這一個元件怎麼測,金字塔就被做成別的形狀。有人長成聖誕樹。也有人形容成沙漏:中間收一下,很快又往上爆開。兩種他都不要。

所以每條關鍵路徑那一條最重要。做事的一條好測試,無障礙一條,視覺測試一條,其他每樣一條。加起來也許一百條,卻是有瀏覽器時最該留的。瀏覽器啟動很貴,吃運算時間。瀏覽器現在複雜到像作業系統。有 Chrome OS,以前有 Firefox OS。一直重開,等於每次啟動一台電腦,而且是電腦裡的電腦。能往金字塔下面壓就壓。端到端還要不要留,他問了,沒有替聽眾把答案說死。

無障礙先是少碰滑鼠

對有客戶、又跟別的公司或政府有合約的生意,無障礙測試要怎麼講才講得動。他從來源講起:很多人忘了,不少東西一開始是當無障礙工具做出來的。

工程師在 IDE 裡工作。AI 還沒進來之前,一個方向是盡量不碰滑鼠能做多少。那件事做對,就是無障礙測試,因為不是每個人都能用滑鼠。另一個例子:開車時簡訊進來,手機把訊息唸出來,你可以回。那一大塊圍繞無障礙工具做出來,給當時不一定能直接操作手機、但想用講的人。這是生產力,多快能到我要的地方。旅遊網站能不能用 Tab 跳到要填的欄位。搶注意力的環境裡,人沒有多少注意力。把這件事做順,無障礙同時被解掉。

自動化這邊也有人在做螢幕閱讀器。一份正在試著訂出來的規格叫 Accessibility Test Driver,路數像 WebDriver,讓你驅動螢幕閱讀器走完一個網站。他要把焦點放在流程變好。另一種講法是「我為了這條法律花了這麼多錢,感覺沒受益」,他覺得這是反的。

Josh 用胡蘿蔔跟棍子做比喻。有人因為好處才做無障礙,也有訴訟這類棍子把公司推過去。天平有沒有在移?David 的看法是,很多公司永遠只看棍子,這件事你改變不了多少。能把他們拉去看好處,空間就大了。我們加了這個功能,對上對手的好處是這些。話裡不必點出無障礙,工具卻都在。他認為那是很大的贏面。

另一面他不給數字。無障礙人口在不同國家占多少百分比,他說他不知道。網站或 App 做不到,你放不放得下那些人的銷售?他們的錢跟我的錢一樣好。同一套可以拿去講「我們現在只測 Chrome」。Apple 有 Safari,Mozilla 有 Firefox。那一塊會不會有人來買,你在不在意。做這件事是對的,也會加上一堆好用的功能。

Josh 自己常用 Axe Core。David 說,Axe Core 就是一個工具,走過 DOM,指出這裡有哪些無障礙問題。競爭的工具不少。BrowserStack 有一個叫 Specter,做類似的事,做法稍有不同。很多工具是讀 DOM,再去推斷。AT driver,也就是 accessibility test driver,走另一條:驅動螢幕閱讀器,再由閱讀器驅動瀏覽器。你用螢幕閱讀器按 Tab,它會告訴你現在在哪,把那樣東西描述給你。這種描述算不算標準,就是它要碰的問題。

做無障礙的人這裡會挫折:每個作業系統的螢幕閱讀器差很多。Linux、Mac、Windows 不一樣,同一平台上不同公司做的也不一樣。這跟用 Appium 做手機自動化是同一類,其他工具也有。Apple 上的做法跟 Android 差很遠,沒有標準,他們也不想要。他的說法是,近乎獨占時人家會覺得夠好了,那個問題不必管,別的問題會冒出來。無障礙這邊他感覺到的是:把事情做好,才找得出做法,才有標準做法,Chrome、Firefox、Safari 的互通會跟著變好。你在 Linux 上走過一個網站的導覽長這樣,到 Mac 上長那樣,而那該是一個人可能想要、或需要的同一件事。

規格慢,是因為快會把通話打壞

規格一直在長,他覺得興奮。他也知道聽眾多半的挫折:一件事走進規格,真的被訂出來,非常慢。

他開始工作時,JavaScript 在不同瀏覽器上是一團亂。每一邊得各做一套,人就掉進 callback hell。後來 ECMAScript 的標準化進來,他覺得很酷,也開始有可以跑過全部的測試套件。慢,反而讓它變正確。做得快,會製造別的問題。規格這一行他看過。

有一份規格他一時叫不出名字,用來在瀏覽器之間傳訊息。想在瀏覽器裡打電話,走的就是這個。它已經第三代。第三代慢很多,也更正確。前兩代問題很多:Firefox 打給 Firefox、Chrome 打給 Chrome 都不順,Firefox 打到 Chrome 一直做不到。WebDriver 是同一類教訓。外面跟 Selenium 競爭的工具,像 Playwright、Cypress,不曾真的深進規格那一段。他們做的時候想的是,你永遠可以往外延伸:瀏覽器加上這個功能,就有一個 WebDriver 測試,不同瀏覽器給你的東西你知道是什麼。這在手機上更要緊。Android 上的 Chrome、iOS 上的 Safari,彼此怎麼碰上、怎麼把好的結果帶出來,都得想。

一段 prompt,正式環境的資料庫可以沒了

BrowserStack 還在往前,焦點仍是把測試做成平台。他認為這會很要緊,AI 這段測試只會更要緊。今年稍早他有一場演講,講 vibe coding,也講 vibe testing。vibe coding 就是寫一段 prompt,盼望出來是對的,感覺對了就往下走。測試也有人這樣做。

問題是人會用這種方式把正式環境的資料庫搞到報廢,東西直接被丟掉。這類故事很多,而且沒有變好。他說去年有 Replit 那類事情,對方後來加上防護,把東西存下來。然後有人說那不要 Replit 了,直接用 Claude。有人沒給限制,正式環境的資料庫就被刪了。AI 有幫助,仍需要看得懂它生成了什麼的人去設限、去修。你我說話時,活過的經驗會補進句子裡,AI 不一定有這個。它很會做快速原型,也很會做要緊的轉換,例如把資料從一處搬到另一處。他是真的喜歡 AI,也覺得它被太快交到所有人手上。人該有這些工具。跟著冒出來的是安全問題。

主持人給了兩條路:人愈熟,問題會變小;或愈普及,擴散更大。David 選後面那條。愈把它交出去,場面會愈糟。

做瀏覽器時,有一份問題清單被一再灌進腦子裡。很多瀏覽器用 C、C++、Rust 這類原生語言。Rust 這類問題現在沒那麼嚴重。C 跟 C++ 的年代,規則包括:變數已經交給垃圾回收,就不要再去碰。還有,有沒有真的檢查這個人通過驗證,API key 會不會不小心寫進程式、沒有好好混淆。沒有人這樣講,這些就不會進到做法裡。那是做過軟體的人才被敲進去的知識。從來沒做過、一開始也沒人敲的人,他覺得很危險。

他喜歡 AI,同時覺得初階工程師該少用很多,比較像後備:拿來複查,問有沒有想過這個問題、那個問題,好讓知識從一開始被敲進去,然後該做的再去做。原型則是每個人都該有機會。有個想法,做出來,真的很酷。接著要重寫,或至少過一遍安全檢查,確定原型進正式環境是安全的。十到十五年前的原型,問題大概在哪,一開始就有個粗糙的概念,進去之前修得掉。

Josh 拿 Stack Overflow 對照。有經驗的開發者可以上去複製一段答案,而且知道那樣是好的。還不知道實際上在發生什麼就這樣做,等於把學習拿掉。David 同意。他把 AI 比成做過很多 .NET 的人會記得的 ReSharper。他不確定那還是不是一個獨立的工具,還是已經做進 JetBrains 做的每樣東西裡。它很會給好的模板,東西做得很快。他覺得 AI 就在那個位置。它也會給很多資訊。對或不對,仍得用自己的知識判斷。AI 會幻覺,一定會,沒有也許。有意思的是多常發生。回去複查之前,分不出來。

從打開網站那一步就把 trace 接上

近一點的小專案,是讓更多人去看可觀測性。可觀測性讓人在應用裡做出 trace,把一條路徑串過去。OpenTelemetry 這套,大家做了大約八、九年。他不覺得很多人把它放進測試:一條測試從「我打開了網站」走到應用裡面,失敗時知道斷在哪。他覺得這很酷。

另一件他在讀的是 CD events。他說這可以是連續部署的事件,也可以是連續交付的事件。它讓你把事件驅動的東西做進 CI 跟管線,某件事可能在哪裡,一直追得住。這塊有不少好工作,仍算早期。

接到端到端的瀏覽器測試上,失敗會更好除錯。David 說就是這樣。你給一組 trace key,要求它一路帶下去。有些東西會在開發、把東西傳下去的方式裡被撿起來。他說今年底有一連串演講,會把這部分工作拿出來。

很多年人們只是在讀日誌,而且得先知道那條日誌跟什麼接得上。OpenTelemetry 出來之後,你看得到它經過這裡,卻常常不知道怎麼開始的,只看到資料進了系統。加進元件測試、瀏覽器測試或手機測試,一路走完,就不一樣。看到失敗,手上有這份資料,就用它進來的方式重現。同一份資料填進表單,這次卻過了,那也許有人用另一種方式在做,就可以去追。資訊先放進測試,再跟著走,不用先花時間找起點。

改 OpenTelemetry 規格,他覺得不必。東西都在,他也做出能示範的東西。唯一可能要補的,是人怎麼把測試啟動起來,給一個最基本的做法:動一開始進伺服器的網路連線,其實只是加幾個 header,沒有改寫連線再跟著走。規格不用改。只是這件事沒什麼人在講。他跟 Marie Cruz 做過一集 podcast,她在 Grafana。她的反應是但願更多人在做。東西已經在那裡,大家不知道怎麼開始。

赤腳跑過荊棘

收尾前 Josh 要一個跟工作無關的歷史冷知識。David 回到南非。他成長時學的是這個國家怎麼成立,以及英國人在南非的歷史。他一直覺得有意思:很多歷史是多年口耳相傳,之後還得有人回去再核。

Shaka Zulu 是南非很有名的祖魯國王。他訓練士兵在荊棘上跑。他們赤腳跑過非洲鄉間,把腳底練厚。知道自己必須到某個地方時,就不會去想腳上的痛。他覺得有意思的是:重點不是做鞋子,是把這個東西練硬,好讓後面其他部分可以專心。

Josh 要他把這件事比到測試,或正式環境的可觀測性。他接到安全上。先試一件新的,再把它練硬。安全要有這些層,有些靠犯錯換來。犯錯若發生在安全的環境裡,像他訓練戰士那樣,才學得會,才演進,才變好。

想繼續看這些規格,他指了幾個地方。BrowserStack 的 community,路徑裡有 /community,從 Discord 到他自己的 podcast 都在裡面。部落格是 theautomatedtester.co.uk。LinkedIn 上的電子報叫 Automation Isn't Scary,分享他覺得大家該知道的零碎,希望做這行的人不要那麼怕。人在各個 Slack 跟 Discord。公開傳訊,他能幫的地方會盡量幫。

〈Software Engineering Daily〉-EP-Cory Doctorow on AI, Work, and Power

https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/

Cory Doctorow 帶著新書《The Reverse Centaur’s Guide to Life After AI》上 Software Engineering Daily,跟主持人 Josh Goldberg 談同一套 AI 為什麼有人愈用愈起勁、有人覺得自己被榨乾。Doctorow 寫科幻、寫報導,在電子前線基金會 EFF 待了將近二十五年,現在是特別顧問。非虛構《Enshittification》談為什麼一切突然變糟、又能做什麼。新書把職場上的 AI 收成一個老問題:自動化由誰推動,流程由誰做主。

五歲那年,家裡的電腦是硬紙板

1976 年他五歲,父親是電腦科學家。家裡第一台電腦不通電,叫 CARDIAC,貝爾實驗室的硬紙板圖靈完備機器,用來教邏輯閘:寫組合語言,再照查找表把標記挪進暫存器和加法器。1977 年,聲耦合器接上電傳打字終端,連多倫多大學的 VAX。終端沒有螢幕。母親在幼稚園教書,從廁所帶捲筒衛生紙回來當紙,一面約一千英尺,另一面再一千英尺。

1979 年,蘋果把 Apple II Plus 借給安大略省各校電腦科學系主任過暑假。父親在多倫多外圍 Scarborough 一所學校當系主任。1980 年有了數據機,插槽卻只夠插數據機,或插能顯示小寫的 80 欄卡。他說接下來大約四年沒見過小寫,因為自己該待在有數據機的那一側。十七歲賣掉第一篇科幻。四個大學學程都沒讀完,最後離開滑鐵盧,當時做細胞自動機,今天會叫機器學習。接著去紐約 Voyager 寫 CD-ROM。公司垮了,他接 Gopher,把廣告公司的第一張合約改成網站。後來跟合夥人與鄰居在泡沫裡募資,搬到舊金山,進 EFF。

Goldberg 問,從細胞自動機看到現在的 Agent 工作流,是什麼感覺。Doctorow 說這種起落以前就有過。父親在滑鐵盧的應用數學碩士,也就是那所學校還沒把這門叫電腦科學的年代,做的同樣是細胞自動機,載體是打孔卡。AI 過過不只一個冬天。科技業高度金融化,有一種他稱為熱詞合規的習慣:什麼熱,簡報就改叫什麼。Push、metaverse、Web 2.0、Web 3.0 都來過。公司若已經有人在用的產品,常常栓上一個多餘的附加功能,用的人受害,有時公司自己也垮。

他沒有電腦科學學位,但有英國開放大學的榮譽博士。他看這十年,認為機器學習裡有扎實的東西。大約十年前,有人對演算法做一點小改動,以為輸出只會小變,結果進步很大。低垂的果子變成一整座果園,招式重複,輸出非線性上升。金融界的 Stein's law:不能永遠持續的事,終究會停。報酬遞減之後,沒有長出猜字猜成超級智能、再把人變成迴紋針的結局。跟其他突破一樣,做出一些很能看的東西,然後得再想別的。

人在上面叫半人馬,人被用到乾叫反向半人馬

別的,就是這本書。勞工和資本為了自動化吵架,老觀察是:勞工來推,通常是為了把產出做好。網路泡沫時的商業媒體在問,執行長要拿那些在大學用過網路、進公司也想要的年輕人怎麼辦。今天問的是反面:怎麼讓覺得 AI 是狗屁的員工,在工作上使用 AI。

資本推動的自動化,通常是拉高吞吐。品質和工作者的日子常常排在後面。市場若已經卡特爾化或壟斷,做出較差的東西也不掉銷售,這件事就特別划算。這差不多就是 enshittification。競爭被挪開,主管機關被俘獲,勞工被馴服,靠互通進來的新進者又被擴張的智財權弄成違法。公司是鎮上唯一的店,非市場的手段也罰不到它,東西就可以做爛,客人還在。

自動化理論裡的半人馬,是人被機器幫忙。他舉 IDE、拼字檢查,還有騎腳踏車,騎起來也像一隻真的半人馬。人頭、馬的身子:身子又強又快、耐力比你高,沒有辨別、沒有判斷、不決定方向。人在上面,身體聽令。反向半人馬把方向倒過來。機器驅使人,把人徵去當周邊,照機器的速度和耐力把人用到乾。他描述的畫面是,九十九個同事被開除,你得替 AI 批完全部人的作業,出事還算你的。工時長,條件糟,做的是工作裡最爛的那一段,而且幾乎不可能不出錯。大部分是對的,你就看不出錯。真的錯的時候,錯法可以害死人。他稱這個自動化盲。

這個區分拿來解一個說不攏的矛盾,尤其在寫程式的人身上。一邊技術純熟、講自己的經驗也靠得住,說 AI 放進工作之後,產出好到以前不敢想。另一邊同樣熟練,說技術債的規模難以置信。有人在民航業工作,說天空被塞滿解不開的技術債,叫人以後別再搭飛機。Doctorow 不把這當成一邊說謊,也不當成一邊受過訓練、另一邊不會用。一邊是半人馬,自己決定流程裡哪一段該用 AI。另一邊是反向半人馬,在更差的條件下、用更快的速度,交出更差的產出。科幻裡他認為最要緊的那句就落在這裡:要緊的不是裝置做了什麼,是它為誰做、對誰做。

股價要的是成長故事

Goldberg 問,書裡寫到亞馬遜這類公司,為什麼還是把人推進生產垃圾的工廠。Doctorow 說,若你相信客戶接受得了較差的產出,壓低薪資、拉高吞吐,經營者就有順的誘因。AI 泡沫要放回這一串科技泡沫裡看。這些公司成長到跑道用完。Google 搜尋市占約九成,再長不容易。養十億個客戶,Google Classroom 要十五年。故事一種是變成彼此:Google 做 Google Plus 去當 Facebook,Facebook 轉向影片去當 YouTube。另一種是征服還不存在的市場,NFT、區塊鏈、metaverse、Web3。現在輪到 AI 和超級智能。

他自己這種進步派有時會講,無止盡的成長是腫瘤的意識形態。節目裡他把這句放下。要緊的是物質現象。公司在成長,股價就高,因為一股是對未來盈餘的請求權。成長停了,未來盈餘跟今年一樣或更低,股價就偏貴,上市櫃公司會出現恐慌性拋售。要擋住拋售,得靠真的成長。找不到成長,就靠一個成長故事。

主要拿股票計酬的高階主管,公司市值掉五成、七成、八成,淨值就掉同樣的比例。沒有人像 Mark Zuckerberg 那樣曝險在 Meta 的股價上。他不想明天變窮八成。公司本身也一樣。股票有流動性的時候,可以拿去買別的公司,也可以拿去挖人。Meta 宣布 AI 超級智能計畫時,說要付一位程式設計師一億美元。付的是價值一億的股票。一百萬張百元鈔得向客戶、債權人或投資人拿。股票在自己場子裡做,試算表上打幾個零就是一億。自己印百元鈔,會被銬走。成長停住,會開飛機的人抓起降落傘就跳,把公司拉出尾旋的工具也跟著沒了。

AI 是最新的成長故事,而且還告訴別的公司怎麼成長:不必做出更好的產品或流程,把員工開除、換成聊天機器人,省下的薪資跟 Sam Altman 分。成長不必靠多賣幾件,靠每一筆交易多抽出一點,把單位經濟做好看。講故事的人興奮,聽故事的老闆也興奮。

Goldberg 用超市問,勞工怎麼多一點力量。連鎖店拿自助結帳換掉收銀員。若每顆蘋果便宜一分錢,好像就有競爭優勢,大家都得去試被說成更有效率的工具。Doctorow 說明路是工會,帳卻不乾淨。蘋果每顆多賺一分錢,偷竊可能讓每顆多掉三分錢,因為擋小偷的人沒了。店家要公眾出錢請警察,要客人用時間付錢:東西鎖在壓克力後,剩下兩個員工,你等其中一個來開門。管理時尚假設現金會變好,然後對預見得到的偷竊表示驚訝。他說決策者有時像會輸躲貓貓。

你要去那裡,不會從這裡出發

Goldberg 問軟體工程師能做什麼。這行組不出音樂人那種跨產業大工會。主管盯著你用 AI,還用程式行數打考績。Doctorow 先講自己是加拿大人。東部有一句笑話,重點是:你要去那裡,我不會建議從這裡出發。

曾經有過另一個起點。Google 解雇一萬兩千人之前,做過一次股票回購,那筆錢夠付這些人未來二十七年的薪水。矽谷工程師曾稀缺到握有權力。免費的康普茶、按摩,還有外科醫師幫你凍卵,好讓你把生育年齡拿去工作。這些對應的是底線:工程師平均每人為公司加上約一百萬美元,人又不夠。你走出門,一百萬跟著走,門口有十個老闆等著聘你。

現在供給追上需求。公司願意交出較差的產出,忍受更多停機和缺陷,因為他們認為客戶不會那麼在意。這是程式這一層的 enshittification。AWS 和其他理論上大到不能倒、該照公用事業來營運的平台,出現系統性當機,SRE 的承諾卻照新創在跑。這個產業裁了大約五十萬人之後,你一辭職,工廠門口有另外十個人願意接位子。

音樂人組工會,是因為被剝削得很慘,然後打出來。工程師若想知道老闆做得到什麼,去看那些不稀缺的人。亞馬遜倉庫工人的受傷率,是其他倉庫工人的三倍。中國組裝 iPhone 的廠房外圍有防跳網。肯亞做 AI 資料清理的人,因為要標記極端和血腥內容,留下終身的心理創傷。那就是老闆若做得到、會對你做的事。

人還是在這裡。有 Tech Workers Coalition,有 Tech Solidarity。EFF 自己有工會,屬於 Communications Workers of America。有的科技職場在組,有的正在試。議價位置不好。美國想加入工會的勞工,比記憶中任何時候都多。支持鄰居組工會的人,也比好幾代以來都多。工會的現金儲備是勞工運動史上最大的,現在沒花在組織上。他認為該花。已經組好的人,不該把儲備只留給自己,該拿去把還沒組的人加進來。他要人去那兩個組織,弄清楚自己的職場怎麼組,先開始談。

指望不組工會就有更好的職場,像指望一種加密:好人用就有效,壞人拿去藏兒童性虐待影像或恐怖計畫就失效。很想要,不夠。歷史上勞工取得權力,可靠又耐久的機制是團結。

做錯得比做對更不賺錢

Goldberg 接到加密這句。柯林頓政府試過把加密擺成只有好人用得了。Doctorow 說,英國和歐盟眼下也有一大股力量,以國家安全、打兒童性虐待影像為名,逼公司把使用者的通訊解密。打兒童性虐待影像,他認為顯然正當。禁掉還能用的加密,到不了那裡。附帶損害是災難性的。EFF 的講法還是:很想要,不夠。

個人和新創做得到最佳做法。Signal 把資料收到極小,往抗量子加密走,政策鬥爭不妥協,也指出禁止越獄會讓安全變脆弱。蘋果和 Google 若要求後門才上架,多數人就失去可用的加密。隱晦之中沒有安全。Bruce Schneier 的講法是,連自己都想不出怎麼打破的系統,只對比你笨的人有效。這些做法看過很多年。兩家公司若決定誰都不該有端到端加密,就沒有人有。政策環境讓做爛有利可圖。

西方到目前大致還好。在中國,蘋果把 iOS 上還能用的加密工具關掉。平台鎖死,逆向工程違法,使用者拿到的就是這個:雲端儲存有後門,能用的 VPN 不進 App Store,靜態的全碟加密和傳輸中的加密都被故意做壞。一個人可以決定幾十億人有沒有隱私,政府能不能找出異見者、抓走、送進營區。他說美國人現在也得擔心。

主管機關被俘獲、市場壟斷、勞工幾乎沒有議價力量,著作權又禁止逆向工程,你就不能越獄去裝製造商不喜歡的軟體。他描述一個很容易自我說服的場景。一百五十個最好的朋友辭職,拿小孩的大學基金和房貸來冒險,產品讓幾百萬人開心。投資人說,讓百分之五的使用者活在地獄裡,不然案子抽掉。你告訴自己,毀了那百分之五,保住一百五十個人的收入,和百分之九十五的人得到的好處。大家以為你是混蛋,只有你知道自己撲在劍上。進了大公司,只要顯然更賺,道德傷害改變不了決定。

Google 在 2019 到 2020 年就是這樣。材料出在司法部打贏的搜尋反托拉斯案。市占到九成之後,他們把搜尋做差,讓人得多搜一次、多看一次廣告。營收部門說,會更賺,而且沒有別的地方可去。每年付蘋果兩百億美元,換蘋果不進搜尋。每個瀏覽器、每個製造商、每個電信商,接上伺服器的都是 Google 的搜尋框。變差又怎樣,難不成去用 Bing。技術部門有人回:「我缺席母親的喪禮,不是為了把搜尋做爛。」吵架輸的是這個人。

資料保護要做對,知道什麼是對的還不夠。你得活在做錯比做對更不賺錢的環境裡。這個環境可以部分自己搭。他用《奧德賽》的尤利西斯之約:未來的自己會軟弱,現在的自己還強,就把自己綁上桅杆。不可撤銷的開源授權,投資人怎麼施壓,程式也不能收回專有。公司做成 B Corp、S Corp,或工作者合作社。API 讓使用者容易離開。聯邦式平台讓人走到別的站,仍聯絡得上原本的朋友。背叛因此變貴。

Goldberg 說自己喜歡 Atproto、開源和開放 API,問這在資本市場裡是不是劣勢。Doctorow 把劣勢算在同一套政策上。1998 年 Bill Clinton 簽署數位千禧年著作權法的第 1201 條,越獄可罰五十萬美元、坐五年牢。Facebook 對一般大眾開放是 2006 年,用得了它的人當時已經在 MySpace。Facebook 給那些人一隻 bot:你不必先把 MySpace 帳號註銷,把登入憑證交給 bot,它假裝是你,把等著的訊息抓進 Facebook 信箱,你回了再推回去。Jeff Bezos 老講,你的利潤就是我的機會。MySpace 靠廣告和操弄抽出的那一塊,成了 Facebook 的機會。

後來梯子被抽掉。Facebook 用第 1201 條擋住對抗式互通,也就是不經它同意,自己把兩邊接起來。人因為愛朋友多過恨 Mark Zuckerberg 而留下,朋友又因為自己的朋友留下而留下,集體行動把朋友變成人質。把那扇門撬開,他們可以來用你的平台,同時聯絡得上卡在 Facebook 的人。那塊利潤可以再變成後來者的機會。

他說二十五年前這一行令人興奮,是因為公司一大、一腫、一蠢,就有人來拆。現在只被允許拆窮人和弱者的東西。他的說法是 move fast and break kings:該拆的是國王,是科技巨頭。資產負債表上有幾千億的時候,他們會做股票回購,也會做 AI 資料中心,一年花一兆美元,去賺五百億。這些錢該在他們傷害自己和別人之前,被有更好主意的人拿走。

一千個爛補丁裡,只留下那個真的在癢的

Goldberg 做過獨立的開源維護者,被 AI 垃圾洗版推走。書裡也寫到文學雜誌 Clarkesworld 收到多到離譜的垃圾稿。Doctorow 說這是文化問題。拿垃圾去灌 pull request 的人,分不出有用的程式和沒用的程式。自由軟體的倫理變成開源的倫理,又變成履歷名片。有人覺得 GitHub 上對重要專案累積兩萬五千筆貢獻,就能找到好工作,或至少有得吹。他們懂程式怎麼運作,不懂程式怎麼失敗。

他自己大約二十五年沒寫過程式,但是 Ubuntu 的使用者,會從 Quora 複製指令,想改選單就去重編譯,坐在那裡敲 make、make install。模型糊出的補丁若只修好他自己的機器,壞了就下載官方版。若補丁在另外百分之五的人身上壞掉,例如非羅馬字母,或一個他從不用的表情符號,維護者會頭痛,他自己感覺不到。責罵修不了這個。

他在節目裡說這段還沒想完,是邊講邊想。平常一個想法行不通的人送上一個補丁,維護者告訴他為什麼不行,他可能跟著學會。寫好補丁得學,跟寫好錯誤回報一樣。現在的能力是一次做一千個爛補丁。也許刪掉九百九十九個,叫他挑出自己認為重要的那一個:哪裡癢、哪裡壞了、想不想參與這個專案。維護者可以跟他一起改,需要的話連程式助理一起用,待遇比照剛起步的人。對方若只想把一千個補丁貼上履歷,就請他出門。

vibe coding 該待的地方,是一個 HomeKit 小裝置加一塊 Raspberry Pi,兩邊要黏起來。糊一個程式,能用到不能用,再糊一個。像有人寫 Visual Basic 或 HyperCard,解決店裡一個很小的需求,不必雇人、還得把需求講清楚。它失敗得很不優雅,但剛好抓到那個人的癢。大型開源專案很多人依賴,停了會直接找上維護者,不該收這種補丁。

做軟體工程的人知道,工作的大塊是想系統怎麼運作。寫程式是其中一段,而且很好玩。EFF 第一位專職技術專家 Seth Schoen 把當時散布即為重罪的 DeCSS,改寫成圖靈完備的俳句。節目裡他說作者是 Schoen,當事人不承認,因為寫這首詩技術上是重罪,等於把文學定成重罪。《Communications of the ACM》近作在算這個比例,他說寫程式排不到最主要。大型語言模型讓那一段變快,其餘沒有。量一大,除錯、品管、code review 就跟不上。

這又是自動化盲。機器大多時候是對的,你被派去盯極少數出錯的時候,警覺維持不住。美國運輸安全管理局養出很會盯水瓶的人,紅隊把假槍送過 X 光,他們大約百分之九十五的時候還是看不出來。

他拿放射科當兩種安排的對照。一種是醫師看 X 光,AI 不同意時叫他再看一次。人還在做自己的工作,只是準一點,能讓人不要死於癌症。另一種是十分之九的同事被開除,剩下的人要覆核一百倍、而且 AI 已經標成沒有癌症的片子。AI 若有百分之三是錯的,這個人大概會全部漏掉,然後有人死。兩種診間用的可以是同一類機器。差別在社會怎麼安排它。

Goldberg 問模型算不算言論。Doctorow 不願放寬對程式的禁令。DeCSS 俳句按第 1201 條可能仍是重罪。一位他稱為很蠢的法官放過 Sackler 家族,也裁定《2600》不能刊,說那不算文學。John Gilmore 的 Deep Crack 花二十五萬美元、兩個半小時破解 56 位元 DES。Cindy Cohn 在《Privacy’s Defender》寫 Bernstein 案:程式是言論,大約 1993 年起能用的加密合法。Git 伺服器不會一起把模型程式下架。

每多一個使用者,帳上就多一個洞

Goldberg 問他所謂的 dogshit unit economics:多做成一筆、或多拿到一個客戶時,邊際上發生什麼,以及他為什麼覺得這個泡沫撐不住。

早期網路在虧錢,AI 也在虧。有人拿前者證明後者以後會賺。大致上,虧錢預測的是繼續虧。例外裡排第一的是好的單位經濟,那也只提高翻正的機會。網路虧錢那些年,每多一個使用者、每一次造訪、每一代技術,都讓整個產業更有機會賺錢。AI 相反。每多一個使用者,資產負債表就多一個洞。人每回來,赤字再擴大。每一代都更虧。他說這是做過最會虧錢的東西。

標普五百裡七家公司占了百分之三十五,所謂七巨頭。六家在虧幾千億美元。賺錢的是 Nvidia。錢進了 Nvidia,再借回另外六家,好讓他們買更多 Nvidia 的產品。這個產業賺的遠比不上花的,花得更多,盈餘沒有跟上。

Anthropic 曾主張已獲利,前提是不理一般公認會計原則 GAAP。他說這等於宣稱一種普通數學表達不了的獲利,又不肯說是哪一種。另一則宣布一邊說快上市,一邊拿出一種強到不準你看的安全稽核工具。東西可以有用,獲利那句仍可以不真。五萬美元的 token 去做一次兩萬美元的稽核,很能看,也是破產的路。不給看,就無法下判斷。

他們說推論成本在下降,內部數字對不上。鐵路是先砸資本鋪軌、買車廂,之後營運費用低,破產也有人接手硬資產、用長周期攤提。AI 公司對不上這套算法。Ed Zitron 拿到 OpenAI 的財務,推論那一列很低,行銷那一列卻聲稱花得跟可口可樂一樣多。可口可樂有三家幾乎只服務自己的全球廣告公司,看板數得出來。OpenAI 沒有這類證據。他認為 Zitron 說得對:百元鈔被一張賣一美元,便宜的推論記成行銷。

就算照他們的話相信,推論變便宜、模型的資本支出也做完了,轉換成本仍然很低。新的 Claude 明顯比 ChatGPT 好的時候,大量使用者流過去。OpenAI 不能做完一個模型就停。他們做出下一個的那天,Anthropic 也得做出 Claude 的後繼者。他問,一兆美元的支出配上五千萬美元的營收,要怎麼轉成獲利。資產每三到五年就得換。營運費用降不下來。以他們現在的跑法,他看不到這門生意的未來。

他要人從 eff.org 看起,EFF 靠會員。書由 Macmillan 出版,三十幾本。有聲書 Amazon 不上,因為沒有 DRM,可到 craphound.com/shop。買了就是你的,轉賣、送人、出借都可以,別違反著作權法。Pluralistic 一週四到六篇,做法是 POSSE,先放自己的站再轉出去。他用開放的 Mailman,不做分析,不知道訂閱人數和開信率,網站不追蹤。授權是創用 CC 姓名標示。

〈Software Engineering Daily〉-EP-Chroma and Agentic Retrieval

Source

Context One 是 Chroma 今年稍早推出的 20B 搜尋 sub-agent。CTO Hamad Bashir 上 Software Engineering Daily,跟主持人 Gregor Van 談 agent 已經用機器速度在查、在拆問題。舊的檢索基礎設施跟不上,也貴到划不來。Chroma 在做的,是把對的 context 塞進語言模型的那一層。

Gregor Van 做資安出身,當過資安、網路保險、一般軟體公司的 CTO,人在新加坡。Hamad 過去十年多半在機器學習、電腦視覺跟資料系統。Chroma 最早解的是電腦視覺的主動學習:線上系統每天看到一堆畫面,全標太貴,得挑哪些值得標。那是訓練時的資料挑選。語言模型起來之後,同一套問題搬到推論,變成搜尋:找出最相關的資料,讓下游應用把對的資訊送進模型。

庫、管線,再加上一個會搜的小模型

Chroma 核心要解的,就是讓模型拿到它需要的 context。平台上三塊可以拼在一起。

多數人碰到的是核心資料庫 ChromaDB。Hamad 說它現在是跟語言模型一起用得最廣的資料庫之一。資料灌進去之後,可以用向量搜尋、全文搜尋、metadata 搜尋,把可能相關的東西撈出來。

旁邊一塊叫 Sync,託管的 ETL。開發者多半不想自己做這條管線。資料要進搜尋庫,得清、轉成能向量化的形狀,最好再補 metadata,高吞吐時很煩。Sync 就是做這件事。

今年稍早他們推出 Context One。Hamad 說這多半還是研究,正在往產品化走。它是一個做 agentic search 的模型。常見的 RAG 是搜一次、把結果直接塞進 context window。Agentic search 是把一句高階的英文問題拆成對搜尋系統的低階查詢,讀文件、再發查詢、再讀,直到自己覺得夠了。人查資料也是這樣,不會打一次 Google、看前十個連結就收工。用前沿大模型做這件事很貴。Context One 用強化學習訓練,Hamad 的說法是在這套流程上跟前沿模型一樣好,成本低一個數量級,速度高一個數量級。對照 Opus 4.6,他們跑在大約每秒 400 到 500 token,Opus 大概每秒 40 到 80。品質對得上,答案來得快,也便宜。

AI 工作負載要很多小 index

他們一開始並不想做資料庫。Gregor 說他看這個領域,向量搜尋熱過一陣、冷過一陣,現在又回來;Hamad 當時用的就是市面上現成的向量搜尋。後來發現,那些系統幾乎都是為舊搜尋工作負載設計的:一個非常大的 index,一百萬份文件、十億筆資訊,全塞在一起。再加五十萬筆,就得重切 cluster、加減節點、重新平衡,操作很重。

AI 應用幾乎是反過來。index 切得很碎:每個客戶一個、每個團隊一個、每段聊天紀錄一個、每個 agent 一個。系統得存非常大量彼此獨立的 index,搜尋還得準。全塞進同一個 index,一是得一直把整坨掛在線上,二是向量搜尋擠在一起準度會掉。向量搜尋不擅長靠查詢時過濾來做分區,該在建 index 時就硬切開,邏輯上分開存。資料有這種可分區的結構,就該做很多小 index,品質跟成本的取捨會好很多。ChromaDB 就是因為沒有現成方案把這件事做好,才自己動手。

底下那層是物件儲存。AWS S3、GCP GCS、Azure 都開始支援 conditional write;Hamad 特別講 AWS,這東西 2024 年才出來。有了它,才能在物件儲存上蓋資料庫,經濟帳才撐得住「每個客戶、每個團隊、每個 agent 各有一份 index」。以前用三副本磁碟或 NVMe SSD,有些產品根本做不起來。他們先做給自己用,要在推論時決定塞什麼進語言模型。

Agent 起來之後,讀的壓力更大。Agent 會平行發五條查詢。人覺得快,大概是三十秒一次;agent 樂意每一到兩秒就查,而且每次五條、六條並行。核心架構如果是無狀態、底下是共享儲存,加節點就能消化讀。Hamad 說,當初蓋在物件儲存上,沒預料到這層彈性,事後卻很受用。

Context Rot:窗愈滿,模型愈差

Chroma 去年出過一篇 Context Rot,主持人說大約是 2025 年 6、7 月。Hamad 說,多數人憑感覺就知道 context 一肥,模型會變差;這篇是用實驗把這件事量清楚。做法很窄:反覆塞同一個詞,問模型「stop」出現在哪;或者把大海撈針的題目打亂順序,丟一堆文件進去,看它找不找得到那根針。結果在數萬 token 這個量級出現很陡的掉落,今天的前沿模型也一樣。報告出來之後又過了大約三代、或幾次小改款,掉落還在。

這逼出一件事:context window 裡放什麼,得有紀律。他們接受 context engineering 這個詞,講的就是下一輪、或下面幾輪要成功,該選什麼進去。查什麼、資料怎麼排、怎麼 prompt、模型能碰到哪些資料,都算。就算有一天 context rot 被解掉,無限把 window 拉大,成本也吃不消。這類系統很容易在很短時間把錢燒光。

這套實驗當時測了十八個模型,Anthropic 那些大的、也有很多開權重模型。Hamad 說對。當時開權重跟閉源前沿差很明顯;過去一年開權重追很快。他們內部還會在新模型出來時跑同一套,有些任務上開權重已經能勝過部分閉源。他講得很明白:這是一套很刻意、很窄的實驗,當健身房用。

干擾項一加,模型要忽略「看起來像對、但其實不是」的資訊,能力就往下掉。兩個事實沒有互相打臉、卻在講同一件事的不同面向,模型很不會拆。他舉的例子是問喬治亞的人口,文件裡同時有國家 Georgia 跟美國喬治亞州,題目已經指定要州,模型還是可能混。真實世界更常見:兩個人同名,把其中一人的工作安到另一人頭上,公司裡問錯人;寫程式的 agent 看到兩套認證系統,問的是其中一套,卻鑽進另一套。他們想量的就是:表面像、其實無關的資訊,模型能拆到什麼程度。

大模型派出的搜尋員

Context One 的用法是掛在更大的模型下面當 sub-agent。Codex、Claude Code、Cursor,還有不少開源 harness,已經會派出另一個語言模型去做一件事。這裡那件事是:把執行任務可能需要的資訊找出來,把 context 帶回來。它被設計成通用的搜尋 sub-agent,給任何大型推理模型用。

想法很傳統:把該分開的關心點分開。搜尋這件窄事,小模型就夠。要懂使用者意圖、拆成查詢、判斷文件相不相關、反覆做。多數時候要的是把這些事做很快,智力不必拉到前沿。他們用每秒多少 token 來想這件事。下一代甚至在想怎麼用平行跟分片去應付很大的語料。Sub-agent 在背景把它覺得相關的文件找回來,交給比較大的推理 agent 去做它真正要做的事。

再往前一步,大模型當編排者、規劃者,底下是一群小模型,平行派出。Hamad 說他們很信這套,寫程式的系統已經在這樣跑,他覺得接下來一年幾乎每個 agent 都會走到這條路上。Context One 要卡的就是這個位置。它的工作是搞清楚該找什麼、找到之後交出去。

主持人把工具列成向量加 BM25、hybrid search、regex-grep、讀文件,以及 prune chunks。Hamad 自己收得更短:標準的 agentic search harness 其實只要兩樣,搜,以及把結果取回來,像拿到十條藍連結再點進去。他們多加的,是自己編輯 context,也就是主動管 context。

長 context 現在主流是 compaction:coding agent 把 window 用滿了,就摘要、壓縮。小模型做這件事很容易丟東西,尤其它是被大模型派出去做一件很窄的事。他們改成邊走邊改自己的 context。Agentic search 很吃 token,碰到的文件都會進 window,很快堆出很大的量。Prune chunks 讓模型回頭把自己 context 裡的文件拿掉。這是 KV cache 連貫性跟整體 token 用量的取捨。模型判斷相不相關、把先前的資訊拿掉,這件事它本來就得會,否則搜尋做不成。

難的是:搜尋前期看起來不相干的文件,後面可能突然有用。訓練就得覆蓋夠多種相關程度,把回傳的文件擾動成夠難的例子,讓 prune 的時機準。底模是 GPT-OSS 20B。剛訓練時,prune 大約八成會選對該拿掉的文件,等於這工具對底模根本不能用,直接吃掉兩成準度。訓練完,在各種任務上大約九成五以上;內部最近的 checkpoint 接近九成七、九成八。剩下的錯,多半來自搜尋本身。模型判斷準不準、相不相關,已經相當好。

自己剪 context,整體 token 用量少很多,推論也快,因為 window 隨時壓在大約三萬二千 token。Prefill 跟 decode 都相對快。模型夠小,可以接受因為 prune 而反覆付 prefill。何時剪、剪多少,還有很多細節。他們也開始把延遲當成訓練目標,讓模型在訓練時自己找對速度也划算的 prune 策略。Harness 這邊真正多出來的想法,是模型改自己的 context、改自己的歷史。

節目裡提到,沒多久之前的數字,20B 的 Context One 在他們多數基準上對得上 Opus 4.5、Sonnet 4.5、Gemini 3.1 Pro。Hamad 接著講為什麼特化過的小模型做得到。

搜尋是一串窄任務

他把搜尋拆開之後,覺得行為比推理值錢。搜尋有一套可跟的程序,是很多很窄的子任務串起來:高階問題拆成對搜尋系統的低階查詢計畫;看一頁判相關;看一頁決定下一輪查什麼;對手上這批結果再做一次不一樣的相關判斷。這些可以分開用訓練例子練。

Context One 的課程是分階段的。早期只給一跳、兩跳就能滿足的簡單題,後面再把難度拉開。訓練也不只強化學習。前面還有一輪監督式微調,用合成資料,以及從開權重模型蒸餾出來的行為。光是把那些行為蒸進小模型,表現就會跳一截。先把「這種情況該怎麼做」的先驗塞進去,後面比較好優化。

光是教會它平行呼叫工具,就能少很多輪才找到資訊。GPT-OSS 20B 原生不會平行 tool call。做一點 SFT,從資料裡教會這個行為,強化學習還沒上,它就已經會用、而且用得很好。

這類任務不需要很多推理容量,也不需要很多細微決策。世界知識確實有幫助,對某個主題記得多,查詢會出得比較好,穩態下大模型大概永遠贏小模型。小模型卻便宜到可以用 LoRA 微調。語料夠窄,很快就能針對那份語料個人化。給它一份語料地圖,或教會它那份語料的詞彙,搜尋會準很多。人搜自己的 Google Drive 也是這樣,因為已經知道裡面有什麼。

Apache,本機就能跑

Context One 的權重用 Apache 授權開源。Chroma 是開源公司,核心資料庫也是 Apache 2.0。Hamad 說自己進 Chroma 之前不算開源死忠,這幾年才變成很堅持該開的東西就開。公司裡也有這份信念。

實際理由很直接:開源才有更多人用,才有人告訴他們哪裡好、哪裡爛,才有人把它接到他們自己接不到的地方。模型很小,本機跑得動。Chroma 當初在市場上長起來,靠的就是本機版資料庫。他們喜歡開發者在筆電、在家裡的機器上就能摸到接近前沿的東西,不必先花一大筆錢。之後每一個模型是不是都開源,他不打包票;至少現在,他看不到不繼續開的理由。他們自己訓練 Context One 就用了開權重模型,平常也在用。新聞上好像世界要被 AI 蓋過去了,他覺得還很早,現在不該用零和的方式想這件事。

開發者多半從本機嵌入式資料庫開始:pip install 一個套件,Jupyter 或 TypeScript 裡,機器上就跑起來了。原型做完,有 CLI 可以把資料推上雲。跟傳統關聯式資料庫不太一樣,這類應用常常會先整理一份知識庫或資料集,再從 staging 推到正式環境。

上正式有兩條。一條直接用資料庫,自己控切塊策略、embedding 模型、各種參數。這幾年實務慢慢收斂:稀疏向量配 splayed;dense embedding 要夠好、但不必太大。他說用不到 4096 維,比較小的維度準度差不多,成本低很多。不想自己選,就用 Sync:資料丟進 S3、上傳檔案,或接他們支援的來源,像 GitHub、網站,之後還會再加一堆上游連接器,來源跟 Chroma 會自動對上。

Context One 通常是後面才接。Agentic search 還新,多數人產品做到後期才認真想低延遲、高品質搜尋。放出來之後,有人開始用它當產品起點。一旦假設查詢是 agent 在做,產品會長得不一樣。有人問:那人幹嘛還自己改資料?已經有產品不准使用者直接改,只准透過模型改,因為他們覺得模型比較會在資訊空間裡走對路、改對地方。表單、勾選、拉桿不必樣樣都有,很多事可以直接用自然語言推進 agent。

一萬筆,Postgres 就夠

資料量小,Hamad 說丟進 Postgres 就行。只有一萬筆紀錄,大概不需要水平擴出去的 serverless 搜尋引擎。企業要不要 BYOC,是另一件事。Hamad 說 Databricks 早期做過混合部署,後來被問若重來會改哪兩件事,其中一件就是不做混合、直接走另一條。他也說這可能是事後才講得輕鬆,沒做混合,說不定根本走不到後來。Chroma 的 BYOC 是把程式部署進客戶 VPC,控制面留在自己這邊,拿回觀測資料來操作、更新、擴縮。客戶拿到託管服務的體驗,自己不用跑基礎設施。套 Terraform、跑 Helm chart 就能起來,day two 由他們團隊扛。這件事他們從第一天就打算做;不做進架構裡,後面要補非常難,整套設計都卡在這上面。團隊當初很難被說服,因為這樣蓋很痛、速度很慢,系統邊界也會畫得不自然。

除非這件事對生意成長是核心,否則他不建議做。對他們重要,是因為核心資料庫真正有用的客戶在大規模。他給 YC 那屆創辦人的建議是:做之前先確定這件事能賺很多錢、而且能重複部署,否則是很大的分心。買家這兩年開始會推,因為過得了資安跟合規。BYOC 剛出現時,網路上不少有名的人覺得這是最蠢的部署模型。它比較像組織稅:讓合規、資安睡得著,讓你保有控制感。是不是真的比較安全,還是得自己看裡面。

控制面仍在 Chroma 這邊,有客戶連遙測都不想讓他們碰。產品沒有基本遙測就跑不起來。他們這邊存的是 metadata:系統裡有什麼資料、用量、版本跟 epoch 計數,沒有直接暴露私人資訊。因為開源,控制面程式可以直接丟給客戶看 schema。Slack 上有人問存了什麼,他們把程式貼進去,叫 agent 把相關檔案走一遍,列出清單,答案對得回程式。資料平面預設不開埠,反向隧道,由資料平面向外連,他們不伸手進去。遙測先緩衝再推出去。操作也不是對資料平面發 POST,裡面有個服務在輪詢,把操作拉下來做。這是很怪的做法,零件很多,只為了在叢集裡做一件本來很單純的事。他們蓋在 Kubernetes 上,還能借宣告式的鉤子,仍然比直接發請求重很多。他說如果進公司六個月才有人說要做 BYOC,他會直接回做不到。

語言模型當 CPU,旁邊還需要一塊碟

Postgres 最近又熱,有人說 pgvector 就夠了。Hamad 的判斷是:語言模型永遠需要有人管它此刻該知道什麼。去 ChatGPT 問今天行程,就算接了 MCP,很多時候還是沒叫對工具、沒在對的時間講對的話。把對的資訊送進模型,這件事不會消失。

他拿 CPU 跟檔案系統來比。語言模型是 CPU,旁邊有一塊碟。碟裡面很複雜,介面、控制器、作業系統、韌體都在。Chroma 信的就是那層介面:一邊是用自然語言處理資訊的系統,一邊是決定模型該看到什麼、該存什麼、哪些該更新、該跟既有資訊合併的子系統。今天看起來很像資料庫。那一家做資料庫的公司為什麼自己訓練模型?因為他們覺得很快就不會再把資料庫跟智力拆成兩套,智力會跑在資料庫裡面,資料庫靠有智力的子系統做事。兩件事得一起想,為了效能,也為了懂這塊領域。

把大量資料搬來搬去、轉成各種下游要的表示、做 ETL、重排格式、重建 index、重新解析,都很貴。如果能在一個地方管完,用物件儲存、共享儲存層,把計算搬近資料,就可以在資料上跑非同步的語言模型工作,也可以讓帶查詢 index 的節點跟 GPU 放在一起,GPU 不必打遠端服務,打的是本地模型。他說今年大家當消費者用的模型,很可能跑到每秒一千 token;去年還在每秒一百。再過幾年每秒一萬,他覺得可以想像。今天的搜尋系統假設打一槍網路、等搜尋回來沒關係,因為模型很慢。模型不會一直慢。智力和資料該走低延遲路徑,將來甚至可能繞過 CPU,在 GPU 上直接起一個子 kernel 搜 index,再把資料餵回模型。

長期他們想做的,是一份非結構化資料丟進去,任何查詢都能在出口被滿足。他不覺得那套東西會長得像 Postgres,跟今天也會差很多。先把抽象跟積木放對,也許以後有資格去做那套系統。

開發者要上手,Hamad 說 pip install chromadb,再 chromadb run 就夠。想看更多,去 chroma.com。名字怎麼來的?短、好念、好記,聽起來順。

〈Software Engineering Daily〉-EP-Scaling Time-Series Workloads on Postgres

https://softwareengineeringdaily.com/podcasts/scaling-time-series-workloads-on-postgres/

感測器讀數、金融行情、應用程式遙測,都是一路往下寫、很少回頭改,查的時候又幾乎總是一段時間。TimescaleDB 是 Tiger Data 的開源資料庫,以 PostgreSQL extension 把時序能力加進 Postgres。它是 extension,不是 fork。SQL 還是同一套,交易跟分析可以留在同一個系統,不必把資料拆到兩套工具。

這一集是 Tiger Data 產品管理總監 Brandon Purcell,跟 Kevin Ball 談這件事。Kevin Ball,節目裡也叫 KBall,是 Mento 的工程副總,也單獨帶工程師跟工程主管。他共同創辦過兩家公司、當過 CTO,辦過 San Diego JavaScript Meetup,也在 Latent Space 底下組 AI in Action。Brandon 的 Postgres 資歷快二十年。早年在軍中就寫過程式,接著進 Adobe 做過好幾個角色,後來跟幾個人做出 Spatial Key,一家蓋在 Postgres 上的地理空間分析平台。一開始橫向做很多產業,後來轉進保險,從核保、事件應變到投資組合管理。大約十三年後公司賣掉。他當時是 CTO,休息一段之後想回到技術跟產品。他說自己喜歡 Postgres,也覺得 Tiger Data 把 Postgres 往上推了一階。

寫得多、改得少,一張表會胖到查不動

做網站的人多半從關聯式物件開始,一筆一筆的紀錄。時序是另一種形狀。一台裝置、或一整群裝置,週期性吐讀數。製造、機器人、醫療器材、金融跟加密貨幣交易、智慧建築、工業系統,都有這種流。Brandon 隨口估,大概六成的情況是從關聯式資料庫起手,開發者裡 Postgres 又用得最多。資料一累積,vanilla Postgres 開始卡住:寫入變瓶頸,表一腫讀就變慢,單一表上的索引跟著長大,時間範圍的查詢也吃力。

他講的實體世界還在變多。太陽能這類設備週期性吐讀數,裝置可以到幾十萬、甚至幾百萬台。他們有一個客戶,兩千兩百萬台裝置,每隔幾秒、每一秒、有的甚至不到一秒就吐一筆。寫進來的量,以及隨時間堆高的量,會用關聯式資料庫本來不太碰到的方式去壓系統。

同一套系統卻還是要交易、要關聯。人通常從 Postgres 開始,長到查詢變慢、寫入變慢,面前兩條路。一條把分析拆出去,另外養一套分析庫,交易庫留下。另一條用 TimescaleDB,把兩邊放在同一個系統。拆出去就要管多條資料管線,那些系統的 SQL 多半又跟 Postgres 有一點不一樣,應用程式得改寫一段。留在 extension 裡,他說應用程式可以完全不用改。

Brandon 自己做過很多網站。網站多半是 CRUD,讀寫交錯。有東西持續吐時序,問題就不一樣。人碰到寫入爆、讀變慢,常常拿問題去問 LLM,或自己搜,然後撞上 TimescaleDB。他說進公司之前,根本不知道有這個產品。KBall 則是從做網站的人看過去:實體世界那種測試基礎設施,資料量很不真實。

表的長相不變,底下按時間切塊

開發者看到的模型沒有變。一筆讀數、一個 timestamp、再加上這台裝置帶的屬性,搬進 Timescale 之後欄位還是那些。底下多出來的是 hypertable。大家懂的還是 table。hypertable 做自動分區,依時間把資料切成一塊一塊 chunk,查的時候不必一次把全部讀進來。

從上面看,它仍是一張表。Brandon 說價值常常出現在這種規模:幾十億列再往上堆,時間拉過十年。你若只查比較近的資料,query planner 只會碰到該碰到的 chunk。

chunk 其實就是表,上面再疊一層 Timescale 用來組織它們的 metadata。列存那側的索引也拆到每個 chunk。一張巨大的表最痛的地方之一,是索引肥到每次插入都要更新它。切塊之後,這個成本關在當下那一塊。

預設 chunk 是七天。量很大可以收到一小時。他說從開發者的角度看,出廠設定多半就能開始。分區也不只時間,還有數值分區,以及帶時間成分的 UUID v7。

KBall 十年前碰過這個痛。當時是幾億列,就得規劃分割表,而且分割做在應用層。他以為這套大概就是依日、月、年切時間桶。Brandon 說,Postgres 自帶的其他分區方案可以用,在這個問題域裡他覺得多半不必。人查資料,時間幾乎總是其中一個條件;裝置世界再加裝置或其他欄位。他們內部有個叫 segment by 的做法,決定資料怎麼切進 batch,通常是 device ID、某種 tenant ID 或 user ID。引擎把相近的資料擺在一起,壓縮更緊,查也更快。這就是列存跟欄存混用時,重新分組、做出邏輯 batch 的那一步。

Join 還在資料庫裡。裝置或使用者的 metadata 常常放在沒有按時間切的普通表,可以直接 join。拆成兩套系統,這件事得拉回應用層:各自查完,再在程式裡拼。留在 Postgres,就是寫一條查詢、join、聚合、丟回給使用者。KBall 記得,分割一旦做到應用層,以前在 SQL 裡能做的事突然得搬進程式。

extension 的做法是攔查詢,讓 query planner 去跑,把請求送到對的 chunk。Brandon 用過很多年 PostGIS,對 Postgres 能擴充到什麼程度一直很驚訝。TimescaleDB 走同一條:靠可擴充性去碰 query planner,並且把「少碰 chunk」這條路磨很久。歷史可以很長,查詢只摸需要的那幾塊。

寫入的衰退關在正在寫的那一塊

很多人是寫入先爆,後面談效能卻常在講讀。chunk 改了有沒有用,索引要不要動,vanilla Postgres 裡本來就有寫入重的索引取捨。

Brandon 說那些原則還在,差別主要在 chunk。追加寫入時,要想的是這一塊在轉成欄存、壓下去之前,當列存會有多大。chunk 很多,索引主要只擔心正在寫的那一塊。

一般 Postgres 表寫久了,每秒能吞的列數會線性往下掉。TimescaleDB 若 chunk 切得對,他說這條線不會往下掉。路由也允許把舊的歷史資料回補進舊 chunk。預設先進列存,再依政策轉成欄存。直接寫進欄存也做得到,這塊還在演進。他說在普通硬體上,寫入可以到每秒一百萬列以上。vanilla Postgres 很難做到,資料一大就掉很快。

KBall 追問:vanilla Postgres 的衰退跟著整張表走,TimescaleDB 是不是就跟著 chunk 走?Brandon 說他看到的線差不多是平的。他記得有一份獨立測試,不確定是不是微軟做的。chunk 大小對查詢的影響,大概大於對寫入的影響。除非一塊設成三十天或兩個月、而且資料非常多,單一 chunk 不至於長到幾千萬、幾億列,資料會散開。

hypercore 把舊資料壓進欄存

chunk 裡面還有 hypercore,列存跟欄存混在一起。Postgres 典型是列存,一列一列排。透過政策可以自動搬,開發者也能自己控,資料會再進欄存。搬過去是為了壓縮。

欄存以前很不能改。他們改過之後,裡面的資料現在可以動。空間上,他說使用者那邊常見省下九成,最高看過百分之九十八,常常是因為讀數高度重複。

另一頭是向量化。處理器用 SIMD,一次對欄存跑多個 batch。人會以為壓完查起來更慢。他把壓縮跟向量化放在一起時,看過查詢加速十倍、一百倍、到一千倍。

列存常見的 B-tree 之外,還有 sparse index,像 min max 跟 Bloom filter。查詢可以先讀 batch 或 chunk 上的 metadata,不必下到每一列,也不必先解壓縮。加總、取第一筆、取最後一筆,時序裡很常見,會快很多,因為讀的是 metadata。

遷移很短。幾個指令,把普通表轉成 hypertable,或從零建一張。之後插入或搬資料,系統依 timestamp 放進對的 chunk。

彙總自己更新,離線回補會重算整段

時序另一個日常是彙總:按天、按週,或同一份資料要好幾個粒度。vanilla Postgres 可能用 materialized view、stored procedure,或應用程式自己算完倒進表。

Timescale 往前做了 continuous aggregates。背後仍是 materialized view,會再建一張 hypertable,用 time_bucket 依時間範圍分桶。Brandon 說他總忘了 Postgres 裡對等的函式叫什麼。彙總依你設的政策自己更新:多久一次、往回補多遠。hypertable 有變動,彙總層跟著動。

人還常把它們疊成階層。裝置每一分鐘吐一筆,可以做五分鐘、一小時、一天、一週,四層彼此往上蓋,排程自動跑。他說這樣可以把幾千億列拆進時間桶,查詢落到很低的毫秒。Tiger Cloud 上有客戶,用他認為不算特別的硬體,每秒兩萬到三萬次查詢,一天打到幾十億次。

這裡也是現在還粗的地方。實體世界跟純粹追加寫入不一樣,裝置會離線。他們有一個做船運的客戶,裝置可以離線兩週到一個月,然後一整批資料突然回來,時間往回蓋兩週或一個月。materialized view 得把這麼長的一段全部更新,CPU 跟磁碟 I/O 都很重。refresh 政策要設對。他們打算加 granular refresh:tenant 可以是一台裝置、一個使用者,或你定義的單位。回補時只更新有變的那台,今天的 continuous aggregates 是整段時間一起更新。

改 chunk 大小只影響新的塊。舊的要用函式手動 split、combine。他們正在把這段的鎖定縮小。過程中若同時有 DDL、讀取或其他操作,鎖還是會卡住。開發者呼叫的就是這些函式。

想看底下在做什麼,主控台看得到。節目前半他把託管叫 Tiger Cloud,講產品線時又說 Timescale Cloud。雲上有 exporter 接到 Datadog、Prometheus。路線上,Postgres 既有指標之外,還要細到壓縮政策、continuous aggregate 的 refresh(他口裡的 CAG)背後在做什麼。SQL 沒有另一套。熟悉 Postgres 的人,要額外學的主要是 hypertable 跟 continuous aggregates。API 文件裡有函式可以碰到特定 chunk。產品開源,想看實作可以直接看程式碼。

熱的兩年留在庫裡,八年撕到 S3

開源把 extension 插進正在跑的 Postgres 就有。KBall 問,硬體也不用很華麗,為什麼還上雲。

Brandon 先講託管,把維運從團隊身上拿掉,類似他以前為地理空間產品大量用過的 AWS RDS。上面有 read replica、HA replica,由他們的團隊管;外面坐一層連線用的 load balancer。單一台不夠,可以再加 read replica。

他特別點名 tiered data。想留很長的歷史,又不必全部維持隨時能查的熱資料。舉例:十年裡前兩年放熱的,另外八年分層出去。在 AWS,那八年會撕到 S3,背後以 Iceberg 放著。整段時間對外仍是一張表。查前兩年打熱資料;範圍超出這兩年,系統把結果合起來,十年都能查。自己做的話,得有歸檔方案跟搬資料的管線。這裡是設一條 tiering 政策,依日期自動往外搬。

他們也在往倉儲、分析庫、lakehouse 走。產品叫 Tiger Lake,他說正式版預計在錄這集的當年稍晚推出,當時還在 beta,做雙向連通。別的團隊常把資料放成 Iceberg,再推到 Snowflake、Databricks。雙向包括把資料拉進來,讓 Tiger Data 或 Timescale 變成儀表板用的營運庫,因為那裡要快;資料科學或分析團隊則用 Snowflake、Databricks,或 AWS 上的 Athena 消費同一份。合規也會要多份副本放在多個地方。不必自己建管線,打開功能,依你選的資料,Tiger Lake 自動寫出到 S3。Azure 上有對等做法。

他要的是人少管管線,時間放回業務問題,多個團隊用同一份資料。來源可以直接寫進 Postgres、寫進 Tiger Data,再往下游送;也可以某個團隊先寫進 S3,再拉進來變成能查的營運資料。他補了一句:AI 讓開發變容易,管線若還得自己顧,人就還是在搬資料。

七十 TB 壓到五 TB,才上得了 NVMe

新專案若本來就從 Postgres 開始,關聯式的東西都在。應用裡只要有時序、而且會長大,他認為一開始就用不會走錯。本地五分鐘可以拉起 Docker image,一行 curl 就能裝。時序條數即使不多,也可以先從這裡起。能見度這幾年高了,人比較敢在新系統直接上。

既有系統那一側,通常是量已經很大。查詢或寫入未必已經出事,光是磁碟足跡就痛。他說錄製前幾週跟 CERN 做了一場 webinar。CERN 之前用另一套資料庫,後來遷到 TimescaleDB。他們點出的數字,是強子對撞機跟 CERN 其他裝置的時序大約七十 TB。靠壓縮,足跡從七十 TB 降到五 TB,於是改放到更快的 SSD、NVMe SSD。七十 TB 原先攤在更多磁碟上,現在塞得進更快的碟,效能是預設就上來。壓縮讓人用更普通的硬體,多個使用者同時打的吞吐也好一些;量大的寫入若本來就吃緊,也一起受益。

同一套庫可以不另開向量資料庫。有 PG Vector,也有他們的 extension PG Vector Scale,資料集變大時把規模撐出去。向量嵌入可以跟其他資料、跟 hypertable 裡的時序放在一起。他們還寫了開源的 PG Text Search 做文字搜尋,看過的規模可以跟 Elasticsearch 放在一起比。文字搜尋加向量嵌入,可以做成混合搜尋。遙測裡常見的用法,是先用 metadata 或文字描述搜,再回到底下的讀數。否則可能得拆成向量庫、時序庫、關聯庫,再到應用層 join。放在一處,再加上壓縮,足跡也小。

KBall 說他訪問資料庫公司常問:為什麼是你們,不是 Postgres?Brandon 的答案是乾脆用 Postgres 做。這也是他加入的原因之一。開源,社群裡還有一大堆 extension 可以並排裝。

給 agent 的 fork,現在還得整庫複製

路線上,Tiger Lake 還要繼續做進 Snowflake、Databricks 的連接器。開發體驗要更接近開箱,少做調參,continuous aggregates 要更好設。CLI 跟 MCP 不只負責安裝。開發者常問:我怎麼知道設對了?他們想把解決方案架構團隊帶客戶時累積的判斷,做成能驗證設定的指引。

另一塊是 agent 對著資料庫做事。內部在做儲存引擎的下一步,叫 Fluid Storage。它是零複製的儲存:fork 不必先把底層資料拷一份,之後的變更再以 diff 疊上去。配上 CLI 跟 MCP,在 CI/CD 或 Jenkins 裡可以把正式庫很快 fork 出去。他說正式庫可以在幾秒或幾分鐘內 fork 出來,讓 agent 對著那份資料做事,用完再拆掉。碰的是正式資料,又不會把正式環境的效能拖下去,破壞性操作也不必直接打在正式庫上。

KBall 說他光為了 QA 就想要。應用程式的分支已經好複製,資料一重就痛:得先拷一份正式資料再改,多數環境很花時間。命令列今天已經可以 fork。痛在庫一大就得整份複製。EC2 上若是 EBS 撐著的資料,搬起來要很久。Fluid Storage 要改的就是這段;需要的話也可以用來拉 read replica。尖峰時把多台放在 load balancer 後面,流量過去再縮回來。

讓 coding agent 直接上手,是已經在做的事。學習曲線還在,所以有 CLI、MCP,以及 PGAI guide,用來引導 coding agent 用這些能力。Brandon 自己做過一個 side project,把整間智慧家庭的遙測收進來,用 MQTT 推進去。大半是把想要的東西描述給 coding agent,資料庫那側他甚至沒親手碰。schema、hypertable、continuous aggregate 都長出來,幾個小時就跑起來,再接回 Home Assistant。他覺得懂 Postgres、懂這些概念仍然有用;往下走,力氣會放在做東西。他們把生意放在實體世界,從資料中心到太陽能,裝置數跟吐出來的量都在爆,要留很長的歷史,又留住 Postgres 的開發方式。

現在還會卡的第一件事是 chunk 調對。資料要先進去夠多才調得準。雲端已經有一個引擎會建議怎麼切,他們想把建議搬回 CLI 跟 MCP。continuous aggregates 設對是另一個坎,尤其是離線回補。

地端還有第三條。開源 TimescaleDB、託管 Timescale Cloud 之外,他們在做 TimescaleDB Enterprise,給工業與實體世界的現場,是開源方案的地端版本,有自己的主控台,可以拉起帶 read replica 的 HA、連線 load balancing、備份。這些若自己組,得從開源開始,再疊 etcd、Patroni 和其他東西。Enterprise 想把這包直接給出來。

裡面有 Postgres connector。想試 TimescaleDB 或 Timescale Cloud,可以把 connector 指向自己的庫,即時複製想要的表,把 WAL 重放寫進去,並維持同步。正式庫繼續跑,旁邊平行試,不必先 pg_dump 再 pg_restore。同一條也用在 Enterprise 的分層複製。他舉正在合作的資料中心營運商:一棟建築裡不同的 pod,裡面是一堆 GPU。pod 往上收到建築,再收到企業。connector 可以跨層複製。有人在 pod 上監控,也可能有一組人在看整座運轉或整座資料中心,資料就往上走。

版本上,他們支援過 Postgres 15 到 18。他說錄這集當天,GitHub 上要出來的版本他以為是 2.29,會把 PG 15 標成棄用,留下 16、17、18,19 出來後也會跟上。本地可以到 TimescaleDB 的 GitHub,一行 curl 裝起來;也可以到 timescale.com 申請評估,有三十天免費,還附點數。他建議一開始就用 CLI 跟 MCP,把使用情境寫給 coding agent,工具會依文件裡的做法去建 schema。主控台裡也有精靈。住在命令列的人留在命令列;想少碰指令的,走雲上的主控台。

KBall 把 CLI 跟 MCP 當成第一入口:大家愈來愈用 coding agent 去摸工具,這條路得修好。Brandon 說工具不會停在起手。他們還在做除錯、驗證、把慢查詢指出來。他看到可以做出獨立的 agent,盯著資料庫跟系統,即時給建議。起手之後的監控,背後是同一套工具。

〈Software Engineering Daily〉-EP-Scaling Agent Workloads at Vercel

https://softwareengineeringdaily.com/podcasts/scaling-agent-workloads-at-vercel/

讓一千個人在同一秒對同一個 Agent 送出 prompt,會發生什麼事?這是 Andrew Barba 在節目上拿來切開兩種 Agent 世界的問題。一邊是大家熟悉的樣子:Codex、Claude Code、OpenCode 這類跑在自己電腦上的 Harness,一個人對著一個 Agent 來回。另一邊是 Eve,Vercel 開源、雲端原生的 Agent 框架,同一秒的一千個 prompt 要能水平擴充出去,每個 session 各自隔離、持久、出事可以恢復。Barba 在 Vercel 的頭銜是 member of technical staff,Shah Dara 是 Eve 的產品負責人,兩人在這集跟主持人 Kevin Ball(KBall)把這個框架從頭拆到尾。

Barba 進 Vercel 的路有點繞。他 2020 年還是 Vercel 的客戶,可能是最早的一批企業客戶之一,後來進公司待了三年半。前一年半做 CDN,碰的是分散式系統、邊緣網路、防火牆這類很底層的東西,接著換到另一端做帳務,也在那裡認識 Shah。兩人在 2025 年大半時間一起帶帳務團隊,今年二月有個機會去追一個問題:把 Agent 部署到 Vercel 上,到底需要什麼?Eve 就是那個問題的答案。Shah 在 Vercel 待了一年半,之前做了十年的帳務。

底下那層手工地基

Eve 不是憑空長出來的,它是從 Vercel 內部的資料 Agent「DZero」長出來的。DZero 是 Vercel 第一個全公司都在用的 Agent。把它放上 Vercel 的過程,團隊做了一大堆手工系統,把自家的 serverless functions、sandbox、workflow 一層一層包起來。Barba 說,當時光是讓它正確地跑起來,就吃掉整個團隊大量力氣,還沒開始想 DZero 到底要做什麼。

他們也在 DZero 身上看到另一件事:它是資料 Agent,做的事情基本上是在提供一層語意(semantic layer)。同事問「每月活躍使用者有多少」,這句話裡的詞在 Vercel 是什麼意思,得有人告訴 Agent。公司裡不同的人講同一件事會用不同的縮寫,這一整層就是在教育 Agent。Barba 說,DZero 的功能有九成來自 Markdown、YAML 這類規格檔。

兩件事合起來,決定了 Eve 最早的樣子。第一,部署一個 Agent 要像 DZero 一樣耐久,但簡單得多;第二,很多 Agent 幾乎可以完全用英文寫完。早期版本把話講得很滿:Eve 裡沒有程式碼,全部都是英文 Markdown 檔。這兩個極端,就是 Eve 今天的起點。

一個目錄,加一個 instructions.md

想動手的人拿到的是什麼?Barba 說,就是一個目錄。最簡單的 Eve Agent 可以只有一個 instructions.md,其他什麼都沒有。框架有它自己的 grammar 與 slot,這些會編譯成一份 manifest,而 manifest 就是前面說的 infrastructure as code:你加了 Skill,平台就替你開一個 sandbox;你定義了排程,就長出跑排程用的事件基礎設施。Barba 用「把 ChatGPT 裝進盒子」形容這個預設值。丟一個 instructions.md 進去,你得到一個前沿模型,照它訓練好的樣子,加上一份雲端託管的部署。

Skill 給提示,tool 跑程式,channel 是入口

核心的幾個原語裡,instructions 決定身分,這點大部分人都熟。Skill 是漸進揭露(progressive disclosure):Skill 給的是一個「什麼時候該用我」的提示,模型很擅長判斷自己需要多知道什麼,看到提示就會把額外的 context 拉進來。Barba 說 DZero 大概九成都是 Skill。tool 讓 Agent 跑確定性的程式碼,去 Postgres 或某個外部 API 拉一組確定的資料;connection 是 tool 的特化版,專門處理 MCP 這類東西,Eve 讓你直接把一條 MCP 網址丟進去,工具就自動曝光,不用自己想辦法接。

channel 是入口。預設那條是 HTTP route,終端機介面跟接上 Next.js 的應用走的都是它;比較有意思的是 Slack、Teams、GitHub,Eve 支援這些平台第一方的事件,也替常見用法準備了預設,你當然可以改。subagent 最簡單的理解是 context 管理:有些任務太大,塞進母 Agent 會把 context 撐爆,就交給 subagent 自己去做,做完回報。但 subagent 在 Vercel 內部長出了另一種用途,它變成組織單位:整個團隊認養一個 subagent,DZero 是另一個 Agent 的 subagent,由資料團隊擁有;公司裡還有一個專門懂「怎麼建 Eve」的 help Agent,也是母 Agent 的 subagent。eval 則是 Barba 最有興趣的一級公民。

eval 是拿來管非確定性系統的

在 Eve 裡,eval 有兩種。一種偏確定性:你送出查詢,然後確認某個 tool 被呼叫。這件事不是百分之百確定,模型有可能不叫,但寫起來很直接。Barba 舉例,如果做的是天氣 Agent,使用者問天氣,你會希望 get weather 這個 tool 真的被叫到。另一種是 LLM as judge:讓模型去推理、評分、打分。對 DZero 這種東西來說,這裡才開始有趣,你可以拿它替生成的 SQL 打分,檢查它有沒有查對的表。

一個 eval 在 Eve 裡就是一個定義好的函式,你拿到一個測試函式,裡面等於是你 Agent 的完整介面:可以用 prompt 起一輪對話,可以觸發 human in the loop,Eve 有的功能都能在 eval 裡用程式寫。Barba 說,Eve 自己的測試套件就是一整套 eval,這也是他們一天能發好幾個版本的原因。

KBall 在訪談裡岔到一個他自己很在意的方向:既然 eval 描述的是「應該長成什麼樣子」,能不能把 prompting 本身變成一個最佳化函式,讓另一個模型在迴路裡反覆改 Agent,直到行為對了?Barba 說他沒這樣想過,但如果用 coding agent 去建 Eve Agent,實務上會發生很接近的事:coding agent 迭代時會自己寫 eval、自己跑 eval,一部分原因是 Eve 的套件裡帶著給 LLM 看的文件,也提示了「用 eval 測 Eve」,所以 coding agent 看得懂。Vercel 內部有一批 fixture 形式的範例 App,本地開發時 coding agent 就是拿這些在跑 eval。Barba 說他還沒真的看過「先寫 eval、再寫實作」這種順序,但可能已經很接近。

文件要寫給 coding agent 看

KBall 補了一句,這幾年框架開始把文件當成有兩種讀者在設計,一種是人,一種是 coding agent。Barba 說他們從 Next.js 學到很多:模型的訓練資料裡是舊版的 Next,怎麼讓它學會最新的東西是個真問題,而 Eve 對這些模型來說根本不存在。所以他們花了很多時間確定套件裡要附 LLM 友善的文件,效果很好。

scaffolding 裡有一份給 Agent 看的說明檔指向文件,套件裡也放了 changelog。這件事對 pre-1.0 的框架特別關鍵:Agent 只要看版本差異就知道要改什麼,不用從零摸索;框架每週都在破壞相容性,changelog 是讓使用者願意升級的原因之一。KBall 說他在很多程式碼庫裡看到同一招,只要一個 repo 有不只一個人,changelog 對 Agent 的幫助就很明顯。

誰看得到什麼,在 channel 那層就要解掉

話題換到雲端 Agent 最難的那一塊:誰能看什麼。Barba 說 Eve 從第一天就以企業為目標,知道會是 code-first,也預期公司會用它建自己的 Agent 來跑生意,所以權限很早就烤進去了;最近才回頭補更多個人使用的場景。

身分在 channel 那層就解掉了。以 Slack 為例,「你是誰」等於 workspace ID 加上 Slack user ID。Eve 從一開始就是為多人使用而設計,你在 Eve 裡寫的任何程式碼都會拿到一個 context 物件,裡面有「這一輪的目前使用者是誰」,還有「這一輪是誰開始的」;這兩個人可能不是同一個,因為不同的人可以在不同的時間點接力問下去。傳統 REST API 那種看認證標頭、認證完再決定你能做什麼的權限模型,在 Eve 裡就是靠 channel 層解出的身分來做。

再往下是「Agent 能不能做某個動作」。這裡有 tool approvals,會以 human in the loop 的形式出現,長相完全取決於哪個 channel 叫它:同一條規則可以寫成「這個 tool 永遠要人工批准」,從 Slack 進來就用 Slack 的介面呈現,從 SMS 進來又是另一個樣子。你可以看到是誰問的、是誰按下批准,兩個不一定是同一個人。Barba 說這正是 code-first 框架發亮的地方:這些情境沒辦法預先窮舉,Eve 的態度是你自己寫程式碼決定你要的體驗。

最難的一塊,Barba 自己承認還沒完全解掉,就是「你只能看到你該看的」。DZero 技術上能碰到 Vercel 整個 data lake,Guillermo 問一個問題時看得到的東西,Barba 問同一個問題時未必該看到,兩個人的憑證要怎麼分辨?Eve 的做法是一個叫 Define Dynamic 的 API,讓開發者依照當下的呼叫者決定要曝光哪些 tool、哪些 connection,甚至可以做到「這一輪是我在問,這個 tool 就不要出現」。這是進階用法,但文件寫得夠好,只要你 prompt 得對,coding agent 會自己學會怎麼寫。

內部幾百個 Agent,外面從企業到週末專案

Shah 負責講使用者這一側。Eve 一開始鎖定企業,因為多數需求來自那裡,Vercel 自己也剛好有那套基礎設施,加上他們其實是在抓自己的癢處:Vercel 內部的 Agent 全部跑在 Eve 上,數量已經有幾百個。上線沒多久,他們看到數千名使用者開始採用,而且不全是企業客群,很多是 Hobby 或 Pro 方案的使用者。使用範圍從企業自動化一個業務職能,到有人週末做了一個多人 iMessage Agent。Shah 說他們想全部支援,讓大家把框架往自己的需求延伸。

訪談也問到內部 Agent 的分布,工程占了幾成。Shah 說一開始確實從工程長出來,工程也是最早大量生出這些 Agent 的職能;但採用擴散之後,go-to-market 把手上能搬的東西都搬到 Eve,行銷拿它自動化內容製作與社群,產品團隊把產品文件餵給 Agent 回答問題,對內也用,有時直接在 Slack 上跟客戶分享。他指出目前工程還是最重的一塊,工程師是主要的建造者與使用者,但他預期這個分布會越來越平均,因為生出一個 Agent 越來越容易,接下來還有自我演化。

Shah 歸納出三種常見型態。對話型 Agent 主要透過 Slack 出現,Vercel 是一間重度使用 Slack 的公司,最早的案例都在那裡,DZero 主要就是在 Slack 上工作。背景型 Agent 的工作是跑一份報告,然後把結果丟到 Slack 或寄給內部同事。第三種是應用,go-to-market 團隊是這類的大戶:你還是做了一個 Agent,但使用者看到的是網頁應用,網頁應用背後由 Agent 驅動,另外再給一個跟 Agent 對話的介面。Shah 說目前看到的大致就是這三種。

前端只接一條 durable stream

下一個問題是實際的整合:一個由 Agent 驅動的網頁應用,Eve 的目錄要放在哪裡,是塞進前端專案,還是獨立一個 repo?Barba 說他們對 Next.js 有很明確的立場:Next 有 pages 目錄、後來有 app 目錄,那 agent 目錄也該直接能用,所以第一方支援 Agent 就住在 Next.js 應用旁邊。但不是非得這樣,很多團隊還是前後端分開部署,Eve 完全可以照那樣跑:Agent 自己是一個專案,前端單純透過 HTTP 接上去。

那條 HTTP 就是預設的 Eve channel,也是它的串流協定,有送訊息、取消這些動作,最後回給你一條持久串流(durable stream),你可以拿它去驅動任何你想得到的介面。Barba 說他們內部的講法是:Eve 是後端框架,不是前端框架,它跟你的前端相處的方式,跟你其他後端沒有兩樣。

Shah 補了兩個應用案例。一個是開源 CRM:使用者新增一筆 lead、填上名字與 email,背景 Agent 就去研究這筆 lead,把剩下的資料自己補完。另一個是 AI 音樂工具:使用者設定 tempo,Agent 在網站上跟你一起協作,把曲子完成。這類 Agent 原生的應用,Eve 在後面當大腦。

KBall 覺得這一塊還被低估。現在所謂的生成式介面常常只是把聊天機器人塞進去,或者非同步生一份報告出來;真正還沒被開發的是協作式介面,例如協作文件編輯加上 Agent 會長什麼樣子。現在勉強可以拿 Claude 的 artifacts 做,或在 Google Docs 裡配 Gemini,但後者他不推薦。

Barba 承認那條串流很底層。你拿到的是一段一段 delta 的推理內容,Vercel Labs 在做一些把低階協定轉成介面的嘗試,例如 JSON Render。TypeScript client 讓事情好過一點,有型別化的 phase 與 event 可以迭代。不過他同意這還是相當低階的 API,他很想看到這裡有更多東西做出來。

他也提醒,Eve 不只是聊天。送訊息時可以指定 output schema:如果你的介面需要某種形狀的資料,就讓 Agent 生成那種形狀。實作上,schema 一路傳到 AI SDK 的 tool loop agent,最後生出一個叫 submit_result 的 tool 來驗 schema,而且可以重試。Agent 常常第一次交出來的東西缺了必填欄位,系統就提示它漏了什麼,它再交一次。Barba 說這不能保證一定拿到你要的 schema,但以現在的前沿模型來說,表現相當好。

KBall 追問 tool call 的代價:一旦走到 tool call,串流就變成一個同步的阻塞,介面得準備一個等待的畫面,而不是把結果一片一片流出來。Barba 說不完全是這樣。串流本身還是會把中間所有的推理吐出來,只是最後一步從「給你看一段英文訊息」換成「給你看一個 tool call」,中間你一直看得到東西。用高推理設定的時候,那些中間過程是可以檢查的。

每一步換一個 function

雲端規模一旦成立,耐久性與可恢復性就變成非解不可的問題。Barba 說他們很早就決定把 Eve 蓋在 Vercel 的 Workflow 上,那是他們版本的 Temporal。模型很簡單:一個 Workflow 就是一個 Eve session,今天其實是兩個 Workflow,但可以當成一個來看。切分方式是每個 session 跟其他 session 完全分開,需要共用資料的話,Eve 提供指南教你怎麼接自己的儲存。一千個 session 跟一個 session,使用者不該需要想這件事,雲端該替你做掉。

真正的工程在 serverless。傳統 serverless function 有 15 分鐘的上限,Agent 顯然會跑更久,所以他們做了一件有點聰明的事:每次呼叫 tool 就換到下一個 function,Workflow 在那裡繼續跑,因為換了 function,時間等於重新起算。今天他們的作法是每一步都換一個新 function;未來如果時間額度還很多,可能同一個 function 上跑好幾個 tool call。只要 Workflow 夠快又穩定,使用者不會注意到,Agent 就可以一直跑下去。

Memory 分抽屜,自我演化開 PR 給自己

Barba 說他現在手上最大的一件事就是 Memory,而且全部開在 PR 裡,任何人都可以去看。這件事跟前面說的策略轉向有關:Eve 從企業出發,但記憶這種東西未必是企業場景,反而非常個人。所以他們開始回頭補個人使用的功能,自我演化是其中很重要的一部分。他的想像是:你把一個出廠預設的 Agent 部署起來,它跟你一起工作,然後自己慢慢變好。

自我演化有幾種形式,Eve 走的路跟 Hermes 那類東西不同。Hermes 可以直接改自己的程式碼再重啟;Eve 在 Memory 之外的第二條路是改自己,例如加一條連到某個 MCP server 的 connection、寫新的 tool、生出新的 Skill。Skill 可能更接近記憶,但其他東西就得真的寫程式碼,Eve 目前的重心是 Git:客戶都在用 Git,所以目標是讓 Agent 對自己開 PR。開發者可以定義一個 coding subagent 當作自我演化的執行者,部署時 Eve 會幫你準備好帶程式碼的 sandbox,也把 prompt 準備好,讓它知道什麼時候該去叫 coding agent 改東西。要多少人工監督也由你決定,從全部人工審查到讓它自己合併,都是可以配置的自動化。

Memory 的做法是一個一級目錄,裡面可以定義不同的 memory slot。舉例來說,你可以替某個 Slack channel 設一組 workspace memory,那是所有使用者共用的全域記憶;另外再開一個 slot 只放你自己的記憶。Agent 因此有好幾本帳,依照你定義的 scope 去讀跟寫。Barba 說這像是給個人使用者一個很好上手的 provider,同時保留企業級記憶需要的原語。

KBall 也請 Barba 定義他口裡的 slot。Barba 說他講 slot 通常指框架的頂層目錄,Skill、tool、sandbox、channel 都是。Memory 會是一個 authored slot,也就是頂層目錄,裡面再分抽屜:一個抽屜是全域,一個抽屜綁使用者,一個抽屜綁 channel 加使用者,例如只有某些 Slack channel 裡的記憶。這種切法解決一個經典問題:你幾乎不會想要一個把 user ID 當參數的 tool call,因為你不希望 Agent 去猜使用者的 ID。memory slot 會把工具綁死在對應的抽屜上,Agent 就沒有機會猜錯。權限與這類東西要確定性地待在 Agent 行為的下一層。他們內部來回討論過 Memory 該不該是一級公民,最後是這類問題說服了他們:當你開始擔心 Agent 會抓到別人的記憶,就代表這東西需要框架提供護欄跟好用的 API。

暴露給 Agent 的方式是 provider。provider 可以決定自己要給哪些 tool,Eve 對記憶該有哪些 tool 完全沒有意見;它確定性呼叫三個函式:recall、save,以及一個負責給出工具的函式,剩下交給 provider。框架內建的是 file provider,非常簡單:recall 把整個檔案當 context 回傳;save 沒有實作,直接被忽略;工具只有 add memory 與 forget memory。Agent 加一筆記憶,檔案就重新寫回 blob storage;刪一筆記憶,也是拿掉之後再寫回去。

KBall 確認了一次:所以 recall 是確定性會被呼叫的,回傳的內容從一開始就嵌在 Agent 的 context 裡,再加上那兩個工具。以檔案版來說,檔案的內容會出現在每一輪的 prompt 裡。

同樣的介面可以走得很遠。Barba 提到 Super Memory 這類服務:recall 與儲存全在他們的服務上做,provider 可能一個 tool 都不給,因為他們不想讓模型自己喊 add memory;他們在 save 被呼叫時接下整段訊息歷史,跑自己的流程判斷該記什麼。他們的 recall 也不是回傳一份檔案,而是看著進來的那則訊息,動態決定要撈什麼出來。兩者是完全不同的 recall。

KBall 接著問,recall 是每一輪都叫嗎。Barba 說它會在幾個階段被叫,最主要的是每一輪開始;另一個時機是 context 壓縮(compaction)之後,因為不能保證壓縮過的內容還留著記憶,所以要重叫一次。像 Super Memory 這種 provider 可以看壓縮後的 prompt 自己決定這樣夠了、還是要重新注入。注入方式預設是附加在後面,因為不想打破 prompt cache;記憶用 user 角色送進去。你也可以改成 system 角色,對檔案版來說可能更合理,代價是每次 add 或 forget 都會讓 system prompt 失效。

開源,但外部 PR 沒辦法直接測

KBall 注意到 Eve 開源,問起貢獻模式。Barba 說有一個有點尷尬的問題:Eve 的測試套件會去打模型,也會真的把專案部署到 Vercel,用到一堆 secrets,所以外部貢獻的 PR 沒辦法直接測。流程變成小心地拉進 sandbox、確認不是惡意程式,然後用 Vercel 的帳號以共同作者的身分重新提交,才能跑測試。他說這確實很煩,還在想更好的做法。他們想要外部貢獻,也盡量收;Vercel 內部的 Eve Agent 每天在分析這些 PR,找出值得拉進來的。團隊規模從三月到七月中是兩個人全職,之後又加了四個人,現在工程端大約六個人全職在做。

押模型變聰明,以及開公司就是開 Agent

最後 KBall 請兩人談展望。Barba 說 Eve 很早的一個原則就是押注模型會越來越聰明,整個框架是為了吃到這件事而設計。他們看過很多 AI 框架往垂直方向長,程式碼越堆越多,最後看起來不像 Agent,反而像一堆確定性的 workflow API。Eve 要往水平長:多給模型一些東西,讓它自己做決定。目錄結構也是從這裡來的。他認為模型變聰明的速度短期內不會慢下來,Eve 會繼續往這個方向走。

Shah 的版本更大。他說他們的想法是「開公司就是開 Agent」:Eve 比公司的設立登記還根本,你的 Agent 會比你的網站、你的網域、甚至你的公司登記都早出現。你先有一個 Agent,它替你一點一點長出一座軟體工廠,包含完整的軟體開發生命週期;你的工作是去微調那座工廠。他認為 Eve 有機會變成公司的大腦。

最後一個問題是,如果真的拿這個東西開公司,能不能不放在 Vercel 上。Barba 說這件事對他們很重要,內部已經有客戶把 Eve 跑在自己的 Kubernetes 與自己的硬體上。做法是用 Workflow 裡的 world 抽象:他們的端到端測試就是拿不同的 world 在跑,有 Postgres world、有 local world。只要能替自己的基礎設施定義出一個 world,而外面已經有很多現成的,你就能自己託管 Eve。他說這方面還有很多工作要做。Memory、自我演化這些能力最終都需要 adapter 合約,框架本身不可能什麼都自己做;重點是這些 API 與 adapter 要在設計的早期就想到,而不是等 Vercel 上跑通了才當補丁加上去。

〈Software Engineering Daily〉-EP-Inside Google’s Database Infrastructure for the AI Era

https://softwareengineeringdaily.com/podcasts/inside-googles-database-infrastructure-for-the-ai-era/

Sylas Krishnamurthy 是 Google Cloud 負責資料庫的 VP of Engineering。他在 IBM 寫過 DB2,在 UC Berkeley 拿串流資料庫的博士,把博士題目做成公司賣給 Cisco,接著在 AWS 待了五年、帶過 Aurora MySQL 與其他 MySQL 引擎,2019 年進 Google。他說自己其實有兩份工作,一份是 Google Cloud 的交易型資料庫,另一份是進來之後才知道的:整個 Alphabet 的營運資料庫。Gemini、Gmail、YouTube 都跑在同一套系統上,Spanner 與 Bigtable。

主持人 Matt Merrill 是個資料庫愛好者,這一集聊了七十幾分鐘,從資料庫五十年的老契約,一路聊到 AI 把契約撐開之後,Google 內外各自發生了什麼事。Krishnamurthy 的判斷很一致:資料庫過去承諾的精確結果,正在被相關性取代;而工程師得學會活在一個非確定性的世界裡。

五十年的契約:不要弄丟資料,給出精確答案

他常開玩笑說,資料庫只有一份工作:不要弄丟存進來的資料,然後對查詢給出精確的答案。這兩句話撐了五十年。2024 年他在 Berkeley 演講前去查了 SQL 原始論文發表的日期,發現幾乎就是同一天,1974 年,跟他出生的年份一樣。

中間當然出現過各種嘗試,非關聯式系統、各種新型資料庫,繞來繞去。但有一條沒變,他把它叫 database dogma:使用者宣告自己要什麼,怎麼做到是系統的事。你講你要什麼,系統自己想辦法生出來,順便保證資料不掉。

另一條沒變的是效能、可用性、耐久性之間的連動。他說,長時間的效能事件實際上就是一場可用性事件,因為延遲拉長到某個程度,站點就等於掛了;長時間的可用性事件,實際上就是一場耐久性事件。三件事綁在一起。

變的部分有兩層。一層是過去十年企業 IT 的體質:以前企業 IT 是買套裝軟體、順便裝一套資料庫,現在不是了。開源軟體把最佳實務帶進企業,企業 IT 自己就很會做,也會對資料庫要求更多。市場上也分成兩條路線,演化式的 scale up 系統,跟革命式的 scale out 系統;Bigtable 是二十多年前 Google 自己做出來的,Spanner 是另一個。

另一層是最近三、四年 AI 帶來的。結構化與非結構化資料開始被放在一起問,資料庫的工作就開始像搜尋,用學術的話說是資訊檢索(information retrieval)。精確結果不夠了,你要給的是最好的結果,相關性與排名變成第一等公民。他說,這不只是資料庫的事,當系統開始產出非確定的結果,你設計系統的方法就得整套換掉。

取捨也開始分家。掉幾個 click event 跟掉一筆金融交易,代價完全不同;有些系統可以選擇不同的約束,這本質上是成本、效能、延遲的取捨。資料庫不再有一套打天下的答案。五十年的契約沒有被廢掉,是第二句話正在被改寫。

Spanner:為了讓廣告系統離開分片倉鼠輪

Spanner 的起源是廣告系統。它大到必須分片,跑在分片的 MySQL 上;每年都要花大量時間想系統接下來要怎麼長,然後動手分片。到了 2008、2009 年左右,他們得到一個結論:等他們分完片,世界又變了。這是一個跑不完的倉鼠輪。

廣告是典型的企業應用。表有成千上萬張,而且不只一個應用。相對地,跑在 Spanner 上的一些消費性服務,DDL 打開來看,十五張、二十張表,盯著看還能看懂。

所以他們要的東西是三件一起來:企業應用的功能、Google 等級的規模、還有當時沒人解過的全球部署。強一致性、交易語意、次要索引,這些是關聯式資料庫的開發者視為理所當然的東西;把這些跟 scale out 的世界放在一起,之前沒有人解出來。Spanner 在 2012 年於 Google 內部進入正式生產,服務的就是廣告系統。

那一般開發者什麼時候該用 Spanner?他說得很乾脆:如果單節點就跑得動,Postgres 很好;需要一堆 replica,Postgres 也還撐得住。Spanner 給的是組合。同步的多區域配置、能隨時擴張也能隨時縮減的規模,還有多模:同一套系統裡有圖、有全文搜尋、有向量搜尋。

他也補了一句,Postgres 這幾年的演化裡,圖資料庫、全文搜尋也慢慢長進去了,所以這些能力最後可能大家都會有,Google 只是稍微早了一點。真正獨特的還是規模、跨區域,跟擴縮的容易程度。

Spanner Omni:一支 binary,沒有原子鐘的 TrueTime

Spanner Omni 要解的是「客戶不在 Google 機房裡」這件事。

第一個理由是銀行這類高度監理的客戶。他們要業務持續性,或者監理機關直接要求:萬一要「壓力退出」,你得有能力回到自己的資料中心跑。他轉述一位銀行客戶的抱怨:那位客戶要把系統從兩個半九(2.5 個 9)的可用性搬到四到五個九,不管單區域還是多區域都更好,結果監理機關要他解釋為什麼要搬。Krishnamurthy 說他也理解監理機關的立場,資料在多個地方有連續性確實重要;但這個「沒有選項」的缺口,實實在在擋住了客戶上 Spanner。很多人說我想押這個注,問題是我要怎麼拿到選項。

第二個理由跟 AI 有關:客戶在到處搶容量與基礎設施。雲端已經不是單極世界,有好幾家供應商,生態很熱。他也提到,以前的雲廠商連 hybrid 這個詞都不愛講,你在某些公司甚至不能用這個字;但客戶的現實不是那樣。客戶手上有很多基礎設施,有時是為了選項,有時是因為生意做大了就是靠併購與整合長出來的。錄音前幾週他在一場客戶諮詢論壇上,聽到一位客戶很激動地說,他們的皇冠珠寶會留在自己的資料中心。他認為這就是 2025、2026 年的現實:複雜、混亂,你得回應這個混亂。當然也有一種客戶,就是因為全世界找不到第二個像 Spanner 的東西,非要它不可。

工程上的故事更硬。在雲端,Spanner 是一堆 microservices 有機演化出來的,Google 自己知道怎麼操作。要讓別人自己跑,第一件事是把操作簡化:他們把所有東西收成一支 binary,你可以跑在筆電上、跑在某個部署裡、指定幾個節點就開跑。主要是 C++。他說聽起來很簡單,做起來非常難,整個團隊花了兩年,快得驚人。他開玩笑說,也許哪天 AI 會幫忙把它全部改寫成 Rust。

儲存層也得重新想。在 Google 內部,Spanner 站在 Colossus 上面。那是一個分散式儲存系統,分區(zonal)的服務,全世界沒有第二家有。靠著它,Spanner 要 split 或 merge、要擴出去的時候,只需要複製 metadata,不用搬資料;別人得留著資料的副本,於是在有負載的時候把資料搬來搬去。他把這個叫超級能力,也說這是 Spanner 與 Bigtable 比別人強的原因之一。出了 Google,這層就沒了,所以儲存要重新建模,用上一堆聰明的技巧。

再來是時間。要讓全域複製的系統跑分散式交易,你得對時間有辦法推理。Google 的作法是在資料中心放特製的硬體原子鐘,用來壓低他所說的 epsilon,也就是不同參與者時間之間的差。交易的語意取決於這個差:commit 要等多久、各個參與者的時間概念怎麼對齊。差壓得夠低,Spanner 在 Google 內部就跑得像飛。

那出了 Google 呢?他說外面的時間原語(time primitives)比十五年前好太多了,有一部分還是 Spanner 教會大家的;當然比不上 Google 機房裡的硬體鐘,但大概不會比 Google 自己在 2012 年的水準差到哪裡去,而 Spanner 就是為那個世界設計的。所以他們做了 Software TrueTime,可以跑在其他雲、也可以跑在舊的資料中心。有些面向不會跟在 Google 內部一樣好,但他相信對很多使用情境來說,夠用了。他還提到有客戶問:我們能不能在自己資料中心裝一樣的原子鐘?他的回答是「來談」。他說今天資料中心怎麼蓋,很多是來自 Google 過去二十幾年的功課,這些經驗會流到更大的生態裡;撇開他在 Google 的身分,他覺得這對整個產業是好事。

原生圖:在交易資料庫裡跑 PageRank

Spanner 現在可以讓你把資料直接當圖來用,而且不用搬資料。資料留在關聯式 schema 裡,你在上面疊一層:一行 DDL 建立 property graph,接著就能像查圖一樣查它。也可以選擇純圖的介面。查詢還是宣告式的,這點沒丟:幫我找出距離兩跳、三跳、四跳的所有節點。Database dogma 還在。

適合的場景都是關係很多的地方。基礎設施裡的 port 跟網路交換器、安全領域的使用者與帳號、trust graph、customer 360、詐騙偵測。他說最關鍵的好處是不用跑一條麻煩的 ETL,就能對營運資料問更複雜的問題,在原地問完。資料當然可以搬出去、用 pipeline 在某個地方問,但你想要那樣嗎?

圖演算法是後來的事。Google 在內部為了網頁相關的問題,做這些演算法做了幾十年,後來發現它們可以整批轉到客戶的圖問題上。詐騙就是最典型的一個:洗錢或合成身分詐騙,背後常常是一整片共謀的帳號網路。詐騙集團建出複雜的帳號與交易網路來模糊行蹤,而且一直在動。這是貓抓老鼠的軍備競賽。如果你的做法是把營運系統的資料搬到另一個系統再跑,詐騙集團早就移動完了。一筆一筆看交易,也看不到那個協同的全貌。

Spanner Graph 的作法是把帳號當節點、交易當邊,然後在系統裡直接跑社群偵測的演算法:weakly connected components、modularity clustering,找出彼此相關的帳號叢集。找到可疑叢集之後,要再往裡面找誰是關鍵角色,他直接說,這就長得跟 PageRank 一模一樣,實際上就是跑 PageRank。PageRank 當年是給網頁用的,但它在「找出網路裡最有影響力、最核心的節點」這件事上非常好用。於是你不只找到共謀的那一群人,還能看到其中的關鍵人物。

印尼的數位支付公司 DanaPay 就是用 Spanner Graph 做反洗錢。演算法直接在 Spanner 裡跑,不用等 ETL 週期,可以更快找到可疑網路、指認裡面的關鍵角色,而且能即時標記或阻擋交易,避免財務損失與後續的作業負擔。

他的收斂是這樣:一般交易資料庫不見得需要 PageRank,但你真正需要的,是對「新鮮營運資料裡的關係」有快速、可動作的情報。他也提到 SoundCloud,說他們跑圖演算法跑了幾年,都是批次在跑;很多時候大家以為那是唯一的方法。他還說,每次多給開發者一點東西,他們就會找出你沒預期到的用法。

Schema 之外,agent 要的是脈絡

以前專案裡第一個難題是選哪個資料庫、資料怎麼放。現在 LLM 什麼資料都吞,agent 還會自己寫查詢。所以 schema 設計還重要嗎?他很坦白:我們不知道所有會變的東西,這件事變得太快。但有一件事是確定的,為數龐大的既有應用不會一夜消失,而它們有迫切的需要被 agentic 應用用上。在你煩惱 schema 要不要改之前,更急的是怎麼把這些資料庫「點亮」。

他的講法是 agentic data cloud 有三塊。第一塊是 AI 原生的基礎設施:圖、向量搜尋、全文搜尋,因為結構化與非結構化資料正在合流。第二塊是把摩擦拿掉,讓世界沒有邊界:跨雲的 lakehouse、Spanner Omni、給 Postgres 應用用的 AlloyDB Omni。第三塊是信任,而信任的意思是脈絡:你得知道系統裡到底有什麼。

將近三十年前他在 DB2 團隊時,一直不懂 SQL 標準為什麼要讓你能替一個物件加上一段 comment。當時看起來很理論、很累贅。現在這東西有意思了,因為它可以記錄某個東西的意思;但現實一點講,他覺得不會有人真的靠 comment。你要另外想辦法蒐集 schema 的資訊。

他舉了兩個很小的例子。一張表裡有 billing address 跟 shipping address 兩個欄位,如果其中一個是 null,背後有一個沒有寫在 schema 裡的隱含知識:這兩個其實是同一個。那個知識要被抓出來,那才是關鍵脈絡。又或者有個欄位叫 city,值是小寫嗎?是三個字母的機場代碼嗎?一個要生成 SQL 的 agent,得先知道這件事。所以,schema 重要,但脈絡更重要;只有 schema 並不夠。

AI 會不會設計出不同的 schema?他不覺得。AI 會照人類過去設計的方式設計,因為它就是被那些東西訓練出來的,模型會傾向挑同一種結構。他也不太相信「生成者是 AI 還是人」會讓 schema 設計的通則產生根本變化。有人跟他說,他們現在沒那麼在意程式碼的抽象了,反正叫 AI 複製一份改一改就好;他覺得那條路通往更多混亂。

倒是應用的定義在變。今天一個應用有四面牆,有邊界、有 API 介面。新的世界裡,應用會變成免洗的 workflow,那個「應用資產」本身不存在。早上一個知識工作者進辦公室,手上有系統 A 跟系統 B,想湊出一張合併兩邊資訊的採購單。以前的作法可能是跟大型系統整合商簽約、付一大筆錢,半年後才有結果;現在他直接叫 AI 去做。而這些 agent 互動的軌跡得存在某個地方,這就是新的資料問題。系統也得更有彈性:出國前打電話給銀行設個詐騙警示,卡片才不會被擋;那如果你辭掉工作,決定在東南亞每個國家各待一週、三個月後再回來呢?你可能想要越南一週、寮國一週、柬埔寨一週,設二十個不同的警示。銀行系統大概會噎住,因為當初設計的人沒想過這件事。所以 schema 該不該更往前看、更有彈性?他把這當成一個還開著的問題。

寫入先提案,不要直接改

目前整個業界都很保守:大部分只做讀,因為大家都怕。沒有人想在自己家重演 Bobby Tables 那類事故,一句塞進去的查詢就把資料刪光;恐怖故事已經有了,安全與信任沒想清楚,壞事就會發生。

寫入難在哪?agentic 應用、這些免洗 workflow,要怎麼寫入、怎麼改 schema,他說並不清楚。他的提案是:當你要對資料庫做一個變更或修改時,不要真的做那個變更,而是產生一個「變更提案」(proposed change),它不會當場生效,可能要走過一組步驟。他認為資料被改、schema 被改的整套方式,都還會再修。

既有應用不會一夜消失,商業邏輯住在應用裡,所以還是得把它們接上這個新世界。

主持人在這裡補了自己的立場:他願意讓 agent 寫很多應用程式碼,但他在資料模型這條線畫下去。Agent 可以提案、可以試著做,但他會狠狠審一遍,用自己的經驗、對未來的判斷跟創意去壓力測試。Krishnamurthy 說這跟他的看法一致。資料模型這條線,目前還是留給人守。

PGVector 之後:filtered vector search 才是真問題

每個 AI 新創的技術棧看起來都是 Postgres 加 PGVector。Krishnamurthy 自己是 Postgres 的愛好者,當研究生時就寫過 Postgres 的程式;他說 PGVector 很棒,好用,整個 Postgres 的擴充生態讓實驗可以一直長出來,搭上 HNSW 演算法在很多情境下都很好用。

但 Google 做向量搜尋超過十五年了,YouTube 與搜尋的底層都有它。他們的技術叫 ScANN,樹狀結構的演算法,可以撐到一百億顆向量以上,延遲表現比單純的 HNSW 好得多。他們把 ScANN 放進 AlloyDB,並且讓它用起來像 PGVector;同時也保留原版的 PGVector,應用程式不用改,跑在 PGVector 上的東西也能跑在 ScANN 上。

數字是這樣:在他們的測試裡,向量查詢比標準 Postgres 上的 HNSW 快六倍,記憶體少用四倍。記憶體這件事對資料庫特別實在,省下來的會進到 buffer cache,效能又跟著好。他們也支援分散式索引建立,也支援 HNSW,還把一些 ScANN 的改進搬了過去。至於這些有沒有回饋到上游開源專案,他說他不確定,不想講不準確的話。

他把向量搜尋看成一種「ensemble」問題:有些情境 HNSW 就夠,而且更簡單;但最高階、最大規模的工作負載,真的需要 ScANN 這類東西。兩邊都有價值。

真正麻煩的是 filtered vector search。很少有人問一個純向量搜尋的問題,實務上查詢會帶多個條件:一個語意搜尋的條件打在向量索引上,另一個是一般的關聯式條件,例如目錄裡的價格。於是你得決定先探哪一個索引。先探向量索引(後過濾),可能拿到二十筆,套上價格低於五十塊,一筆都不符合;再要下二十筆,還是不符合,只能一直往下撈。改成先探非向量索引(前過濾),可能一次拿到一百萬筆,而一百萬筆根本跑不動最近鄰搜尋,那正是你當初做向量索引的原因。哪一種策略對,取決於選擇性,而你在事前不知道。

AlloyDB 的解法是把兩個索引放在同一個系統裡,所以它可以同時探兩邊,很快判斷哪個順序對,並且在過程中隨時換策略。主持人問這算不算分而治之,他說不算,這是一種自適應的技巧:先試幾種,再依你當下的實際狀況調整。

他也不建議另外外掛一套純向量的系統。如果只是對一批不太變動的文字語料做純向量搜尋,那或許合理;但只要開發者蓋完這種系統,幾毫秒之後查詢就會變複雜。向量系統一旦分家,你就要在應用層把兩個系統縫起來,而前過濾、後過濾要誰來做?他說純向量系統對這件事沒有好答案;多個索引在同一套系統的控制之下,才做得出這種聰明的東西。他們另外也把高速向量檢索跟營運資料上的全文搜尋合在一起,混合搜尋(hybrid search)就變得有意思了。

MCP Toolbox 與 managed MCP:兩條路

Google 釋出了 MCP Toolbox for Databases,開源,本質上是一台架在資料庫上面的 MCP server,AlloyDB、Cloud SQL、Spanner 都能接,開發者不用自己從頭刻。另外也有 managed MCP 服務,企業等級、有治理機制。

他自己的團隊是在做資料庫跟基礎設施的,不太用 MCP;但有個地方會用,就是使用者介面。Google Cloud 的代管資料庫本身也是一個應用,實例與資料庫的資訊存在內部的 Spanner 裡。以前每次做一個新功能,就得做一大堆複雜的 UI;現在他們改成連上 MCP 服務,依使用者問的問題即時生成介面。他說這不只是省時間,還能生出更貼著使用者需求的體驗。他也補充,這個 Generative UI 沒有正式的對外名字,他不小心用了內部的專案代號;類似作法在資料庫 console 的觀測性功能裡已經有了。

機制是這樣:他們的 UI 基礎設施本來就有一堆 widget,於是一邊把底層系統接上 managed MCP,一邊把這些 UI widget 也包成 MCP 工具,模型就能自己決定要怎麼組合。他說任何客戶都可以做一樣的事。真正麻煩的地方,還是回到那個老問題:什麼是讀、什麼是寫,以及你有多準備好讓 agent 寫進營運資料庫。

兩種開發者走兩條路。走在最前線的開發者會用 MCP Toolbox,因為他們需要自訂的身分驗證機制,可能還跑在自己的機房、根本不在 Google Cloud 上。Toolbox 一開始要解的問題就是:不管你人在哪裡,都讓你更容易接到資料庫;開放性是 agentic data cloud 的一部分。在 Google Cloud 裡,managed MCP 是另一條路:控制平面的操作(agent 去建資料庫、跑應用、部署應用)、還有自訂工具(不是下 execute SQL,而是像「查一個航班」這種工具,背後去跑一句特定的查詢)。他也說,他們在 Toolbox 上學到的東西,只要有價值,就會進到 managed MCP。

讓 LLM 接上正式資料庫:PSV、隔離、觀測

主持人開場就說,一個 LLM 接著你的正式資料庫,這是一個等著發生的恐怖故事。Krishnamurthy 的答案從一個對比開始:分析型系統跟營運型系統是兩個世界。

分析型系統裡,進來的人可能是商業分析師或資料科學家,用自己的憑證連線,存取控制長在系統裡,他們通常能看到比較廣的資料,而且 BI 查詢本來就是聚合查詢。營運資料庫不是這樣。1990 年代初期,主從架構的胖客戶端直接連資料庫,終端使用者的憑證真的在裡面;到了 1990 年代後期,網頁與三層式架構把這件事徹底改掉。今天在營運資料庫的 schema 裡,根本沒有終端使用者這回事。資料庫有使用者、角色、群組、權限,但終端使用者不在裡面。原因之一是人數:有了網頁之後,終端使用者從幾百個變成幾千個、幾百萬個、上億個,你沒辦法那樣管。於是應用程式用一個 service principal 連上資料庫,某個登入使用者能看到什麼,是散在應用程式各處 SQL 的 WHERE 子句決定的。

現在你讓一個 agent 用這個看得到全部資料的 service principal,替任何一個使用者問問題,問題就來了。他舉例,一家租車公司如果有兩千個分店,每個店經理應該只能問自己店裡的車。

解法是 parameterized secure views,PSV,建築在 Postgres 的 secure view 上。Postgres 的 secure view 有一個 security barrier 的特性:沒有它的話,你可以用資訊理論的手法把資料挖出來。作法是寫一個會讓系統爆掉的查詢,例如帶 WHERE 子句的除以零;沒擋住的話,查詢優化器會太聰明,把條件推到表裡面去,於是你得到一個錯誤、或得到一個空結果,而那個錯誤本身就洩漏了資訊。security barrier 確保條件不會被推進表裡。

PSV 再往前一步:加上參數。這個參數基本上就是原本散在應用程式 WHERE 子句裡的那道授權檢查,只是現在你把它定義在 schema 旁邊的 DDL 裡。Agent 用的 service principal 只碰得到 PSV,碰不到底層的表;登入使用者的憑證從一條側通道進來,綁到那個參數上。你可以攻擊 LLM、可以騙它、可以讓它生出任何它想生的查詢;查詢送到的時候,它永遠只會看到那個使用者的憑證允許它看的那些列。他說這是關鍵的基礎設施,沒有它,做不出 agentic 應用需要的那種安全。主持人把它翻成一句話:你不需要把角色塞進資料庫,是把原本寫在應用程式裡的查詢,搬進 DDL。

他還把這件事接回 1975 年的一篇經典論文,end-to-end argument in system design。他在 Berkeley 開始讀博士時讀到,論文的意思是:分散式系統要談加密、談安全,你得在系統的兩端解決,不能在管子裡解決。同樣的道理搬到這裡,安全得坐在資料那一層,因為我們活在一個 agent 什麼都做得出來的非確定性世界。

另一半是隔離。分析查詢打交易資料庫本來就會互相傷害,這也是為什麼大家會把資料卸載出去;Google 花了很多年處理這件事。他轉述一位銀行客戶的反應:我們花了好幾年確保批次掃描不能打在營運資料庫上,現在你要我在上面跑 agent?你瘋了嗎?他說這問題問得對。Agent、甚至一整群 agent 在問問題,同一堂課還是要再上一次:agentic 應用要被隔離。而且可能更麻煩,因為 agent 不好控制,它會跑爛查詢,也會跑惡意查詢。

再來是觀測。他說你需要的觀測性要細到這種程度:你能不能對著你的 Postgres 資料庫問,把 agent 來的查詢跟應用程式來的查詢分開列給我。有了這個,才談得上在周圍架護欄。主持人說這幾乎就是對資料的即時威脅偵測。

誰 commit 誰負責,然後接受混亂

主持人提到他先前的說法:Google 的工程師想用多少 AI 都可以,但程式碼是誰 commit 的,責任就歸誰;節目裡也提到,Google 現在大約有四分之三的新程式碼是 AI 生成的。Krishnamurthy 的反應很老實:三個月後會怎樣,他真的不知道。但他確定一件事,六個月前的先驗假設現在該重新檢查一遍,能做的事情比大家想的多。

不過數字要小心,因為變異非常大,取決於你在講哪一種程式碼。他的直覺是:像 Paxos 這種分散式共識協定,也就是 Spanner 的心臟,大概還是很難讓 AI agent 直接大改,他們也會非常小心。而「AI 生成的程式碼」是一個連續光譜:一端是在 IDE 裡做例行重構;另一端是一整個 pull request、一整塊自成一體的程式碼,而寫的人從頭到尾沒有進過 IDE。

他們在團隊裡的做法是因材施教:針對每一群做同一件事的工程師,建對應的 harness 與技能,然後量測。就像 AI 與 agent 世界裡的每一件事,關鍵是 evals:你需要一個客觀的方法知道它到底有沒有在動。他說這對大部分人應該都適用。

還有一件事他特別強調:留空間給實驗。挑一個專案,專門用來推你在 AI 上能推到多遠。撞到瓶頸的時候,工程師的慣性反應是切回原本的做法,把問題解掉,因為我們被要求的本來就是把事情做完;但他認為也需要有一部分努力是這樣:撞到瓶頸就修瓶頸,不要繞過去,並且接受交付會變慢。

最後他給的那個總結是這樣。他們花了二十五年學怎麼蓋確定性、可規模化的系統,確定、可預測幾乎變成信仰。現在是一個不同的時代,資料是亂的、不再確定。他觀察到很多人像在走悲傷的五階段:一開始都在吵怎麼把 AI 弄成確定性的,他覺得那條路不會成功。兩個世代的軟體工程師都照舊方法訓練出來,產業得接受自己身處混亂,然後與它共處。至於怎麼在混亂裡看懂事情,還是回到他前面講的:用 evals 去看品質與商業結果。因為資料庫真正變掉的那件事是結構化與非結構化資料一起進來,而它要交付的東西,已經從精確結果變成最相關的結果。主持人接話說,已經沒有對或錯的答案,只有一片相關性的光譜。Krishnamurthy 說,對,而我們全都還在那片光譜上的某個位置。