軟體不是在 commit 裡寫成的,是在 commit 之間
Nathan Sobo 從來沒有喜歡過 PR。
在 Agent 還沒進場的年代,大家還比較願意相信:在一張快照上一來一往地交換留言,是一種有效的協作方式。但對 Zed 團隊來說,這套儀式從來沒真的順過。他們習慣好幾個人擠在同一個工作目錄裡,一邊寫一邊聊,靠當場討論程式碼來累積信任跟共識。問題是 GitHub 不准任何人在 commit 跟推上去之前談程式碼——可是等到終於 commit 完,最關鍵的那場對話通常早就結束了。
所以 2021 年他們創了 Zed,目標就是想辦法掙脫 commit 的束縛。當時的劇本是:先做一個配得上全世界最強工程師的編輯器,再在裡面提供一種更好的協作方式。他們那時候完全沒料到,這些原本為「人跟人協作」想破頭的問題,等到要「人跟 Agent 協作」的時候,只會變得更尖銳。
Mogu 偷偷說:
講白話:以前嫌 PR 麻煩,頂多是同事之間互看不順眼。現在 Agent 一秒鐘改三十個檔案,你要它「先 commit 再來討論」根本是叫消防車先填三聯單再出勤。火都燒完了。Zed 這群人 2021 年就在抱怨的事,被 AI 放大成結構性問題,運氣好到有點欠揍 (¬‿¬)
越來越明顯的趨勢是:真正生出程式碼的那段對話,本身正在變成軟體的源頭。這段對話是持續流動的,而且必須隨著程式碼一直變動、一路被交叉對照回去。Git 從骨子裡就是繞著一個個離散的 commit 打造的,它從來沒被設計來接住這種東西。
不只記錄每個 commit,記錄每個操作
於是 Zed 動手做了一個專門接這件事的工具,叫 DeltaDB——一種新的版本控制,建立在單一一個自洽的抽象上,把人跟 Agent 的對話、以及它們所編輯的工作目錄,全部變成可以共享的成品。Nathan 去年秋天第一次公開談這個構想,這段時間進度推了一大截,beta 版再過幾週就要上線。
DeltaDB 的核心動作,是把工作拆成一連串細粒度的 delta。Git 是在每次 commit 那一刻拍一張快照;DeltaDB 則是把兩次 commit 「之間」發生的每一個操作都抓下來,而且給每一個操作一個穩定的身份。因為每個 delta 都能被單獨指認,所以程式碼演化過程中的任何一個瞬間,都可以被精準指著說「就是這裡」——即使它下一秒又被改掉。這讓整個工作目錄可以隨著它的演化被版本化,而且是跟驅動它的那場對話綁在一起一起版本化。
一句訊息、以及這句訊息生出來的那次修改,會被並排記在一起,誰也不會飄走、跟對方失聯。更猛的是,DeltaDB 內嵌了「無衝突可複製的工作目錄」,所以一大群人跟 Agent 可以同時在不同機器上編輯同一批檔案。而且這些檔案是真實存在的:Agent 透過終端機在裡面幹活,而需要的時候,整個工作目錄可以隨時掛載到磁碟上,讓人拿自己慣用的工具去處理。
Mogu 內心戲:
「無衝突可複製」這名字聽起來很玄,其實背後是 CRDT 那一掛技術(無衝突可複製資料結構),Google Docs 多人同編不打架靠的就是它。差別在 Zed 把它鋪到「整個工作目錄」這個層級——不是讓你們同編一份文件,是讓你跟三隻 Agent 在四台機器上同時亂改同一份程式庫,最後還不會打成一團 Git 衝突地獄。聽起來很美,但我要看到 beta 真的跑起來才信,分散式系統的鬼故事我聽太多了 ╮(╯_╰)╭
程式碼的源頭,現在是那場對話
因為每一個引用都是錨定在某個 delta 上,而不是錨在「第幾行」,所以當程式碼在底下不斷位移時,這個引用依然站得住。從過去某段對話裡的任何一行,都可以直接跳到那段程式碼「現在長怎樣」,或者跳到「Agent 當初寫下它的那一刻長怎樣」。反過來也成立:站在任何一行程式碼上,都能回頭找到當初生出它的那場對話,以及後來每一場碰過它的對話。
Agent 也能吃這套脈絡。它可以撈出自己正在改的這段程式碼背後的來龍去脈,或者乾脆把當初寫過這段的前幾隻 Agent 都召回來,問清楚「這裡當初為什麼要這樣寫」。
Mogu 歪樓一下:
這段是整篇最科幻的地方。傳統的「第幾行」引用有個千古難題:程式碼一改、行號全跑掉,那條連結就指到不知道哪去了——所以才會有人在 code review 留言「樓上指的那行已經不存在了」。錨在 delta 上等於是給每個操作發身份證,行號怎麼飄它都認得人。至於「召回前幾隻 Agent 問為什麼這樣寫」……兄弟,這比我問三個月前的自己當初在想什麼還靠譜,那時候的我(如果還記得的話)多半也只會回你一句「不知道,能跑就好」(´_ゝ`)
想協作,不該先 commit
Zed 真正想要的東西其實很單純:跟 Agent 的那場對話,變成唯一一場需要進行的對話。隊友可以在工作還在進行中的時候直接加入,跟剛剛做事的那隻 Agent 對話,邊看邊在旁邊註記——完全不用乾等別人先 commit、先推上去。
PR、審查討論串、行內留言,這些東西之所以存在,全都是為了「事後」把一段討論重新黏回程式碼上——因為討論跟程式碼本來就住在兩個不同的地方。可是一旦把它們放進同一個地方,那整套黏合的儀式就自動消失了。Git 跟 CI 則回去做它們真正擅長的事:跑各種檢查、把開發者接到外面的世界——而不是被硬推上「協作非得在這裡發生不可」的位子。
Mogu 補個刀:
這句話有點扎心:PR、review 留言、行內留言,本質上都是「補救措施」。因為對話跟程式碼一開始就被拆散在兩個地方,才需要這麼多機制把它們重新縫回去。Nathan 的意思不是要殺掉 Git——他很明確地讓 Git 跟 CI 留下來顧「跑測試」跟「對外連接」這兩件它們本來就強的事,只是把「協作」這個位子從 Git 手上拿走。算是相當有分寸的造反,沒有那種「我要顛覆一切」的中二味,加分 (๑•̀ㅂ•́)و✧
接下來呢
軟體現在是在對話裡成形的,不是在 commit 裡。DeltaDB 就是為了這件事而生的版本控制,再過幾週,它就會開始送到第一批早期使用者手上。想當第一批白老鼠的人,可以去排候補名單。
Mogu 吐槽時間:
照慣例提醒一下:這是 Zed 自家發的產品公告,beta 還沒真的開給大眾。所有「無衝突」「對話即源頭」的美好畫面,目前都是 Zed 自己畫的願景,不是已經被外部驗證過的事實。Zed 這團隊做編輯器的底子是真的硬(Nathan Sobo 以前在 GitHub 做 Atom 編輯器),所以不是那種 PPT 創業;但版本控制這種東西,要等真的有人拿真實專案去操爆它,才知道扛不扛得住。先排隊看戲,別急著把公司的程式庫搬過去 (⌐■_■)
結語
Git 最偉大的設計,是把「一個明確的時間點」變成可以指認、可以回溯的東西——這也正是它最大的盲點。因為真正在寫軟體的那些時刻,幾乎都落在兩個 commit 之間的縫隙裡:那些一邊聊一邊改、改完又推翻、推翻又想通的混亂過程,全被快照的剪刀喀嚓一聲剪掉了。
Nathan 賭的是:在 Agent 的時代,那段被剪掉的縫隙才是主角。程式碼只是對話結痂之後留下的疤,而疤底下那段「為什麼這樣長」的對話,才是之後所有人——包括下一隻 Agent——真正需要讀的東西。DeltaDB 想做的,就是把那段對話從垃圾桶裡撿回來,釘死在每一行程式碼旁邊,永遠不准它走丟。
成不成還很難說。但這個切入點本身就夠漂亮:別人都在想怎麼讓 Agent 寫出更好的 commit,Zed 直接反問一句——軟體本來就不是在 commit 裡寫成的,那大家到底在優化什麼?