![]()
整理 | 褚杏娟
Clawdbot(現(xiàn)名:Moltbot)火了到國(guó)內(nèi),社交平臺(tái)上到處都是部署教學(xué)、使用教學(xué)和使用展示。國(guó)內(nèi)的騰訊云、阿里云等也相繼宣布上線 Clawdbot 云端極簡(jiǎn)部署及全套云服務(wù),釘釘也在 Github 上開(kāi)源了 Moltbot 接入方式。
項(xiàng)目背后的創(chuàng)始人 Peter Steinberger 也紅極一時(shí),他的構(gòu)建方式成為很多人的學(xué)習(xí)對(duì)象。Peter 之前就是一位非常出色的開(kāi)發(fā)者,打造了一個(gè)被用在超過(guò)十億臺(tái)設(shè)備上的 PDF 框架。后來(lái)他經(jīng)歷了嚴(yán)重的職業(yè)倦怠,賣掉股份,整整三年從科技圈消失。今年,他回來(lái)了,而他現(xiàn)在的構(gòu)建方式、正在做的事情,已經(jīng)和傳統(tǒng)軟件開(kāi)發(fā)完全不同。
Peter 近期在“The Pragmatic Engineer”節(jié)目中,用近兩個(gè)小時(shí)的時(shí)間分享了他的開(kāi)發(fā)經(jīng)歷。他解釋了,為什么他現(xiàn)在發(fā)布的代碼,大部分自己都不再逐行閱讀,而這其實(shí)并沒(méi)什么大不了;他具體是如何打造了 ClawdBot 這個(gè)看起來(lái)就像 Siri 未來(lái)版本的個(gè)人助手的;他如何利用“閉環(huán)原則”,高效進(jìn)行 AI 編程;為什么代碼評(píng)審已經(jīng)過(guò)時(shí),PR 應(yīng)該改名叫 Prompt Request 等,他還分享了很多關(guān)于軟件工程工作流在未來(lái)幾年可能發(fā)生的變化。
Peter 可以稱得上是“AI 重塑開(kāi)發(fā)方式”的最佳實(shí)踐者之一。
我們整理翻譯了這期干貨滿滿的對(duì)話,并在不改變?cè)饣A(chǔ)上進(jìn)行了刪減,以饗讀者。
怎么入行的?
主持人:這次終于線下見(jiàn)到你了,太棒了。
Peter:是啊,差點(diǎn)還搞砸了。
主持人:怎么回事?是忘了時(shí)間嗎?你經(jīng)常這樣嗎?
Peter:其實(shí)不太常見(jiàn)。只是最近這個(gè)時(shí)間點(diǎn)比較特殊,因?yàn)槲易罱捻?xiàng)目 ClawdBot 突然火了。說(shuō)實(shí)話,有點(diǎn)睡不夠了。但這種感覺(jué)也很有意思,我從來(lái)沒(méi)經(jīng)歷過(guò)一個(gè)社區(qū)在這么短時(shí)間內(nèi)爆發(fā)。真的非常好玩。
主持人:在聊 ClawdBot 之前,我們先把時(shí)間拉回去。你做的 PSPDFKit,據(jù)說(shuō)被用在超過(guò)十億臺(tái)設(shè)備上,基本上你看到一個(gè) PDF 被渲染,很可能背后就是它。那在更早之前,你是怎么進(jìn)入技術(shù)行業(yè)的?
Peter:天哪,這得從很早說(shuō)起了。我來(lái)自?shī)W地利一個(gè)小地方,一直比較內(nèi)向,經(jīng)常被欺負(fù)。那時(shí)候,夏天總會(huì)有客人來(lái)家里,其中有個(gè)電腦迷,我迷上了他的機(jī)器,天天盯著這臺(tái)機(jī)器研究,最后求媽媽給我買了一臺(tái)。從那以后,我就徹底陷進(jìn)去了。
主持人:那時(shí)候你還在讀中學(xué)?
Peter:差不多吧,大概十四歲。我最早做的事情之一,是從學(xué)校“順”了一張老 DOS 游戲的軟盤(pán),然后自己寫(xiě)了個(gè)拷貝保護(hù),好拿去賣。加載一次要兩分鐘,但我當(dāng)時(shí)覺(jué)得這事特別酷。當(dāng)然也打了很多游戲,不過(guò)對(duì)我來(lái)說(shuō),做東西本身就像在玩游戲。說(shuō)實(shí)話,現(xiàn)在做事帶來(lái)的成就感,比通關(guān)游戲還爽。
一開(kāi)始我看的是類似 Windows 的 bash 腳本,然后做網(wǎng)站,寫(xiě)一點(diǎn) JavaScript,雖然完全不知道自己在干嘛。真正系統(tǒng)性地學(xué)“怎么構(gòu)建東西”,是上大學(xué)之后。我從沒(méi)見(jiàn)過(guò)我父親,家里也很窮,所以我一直要打工,學(xué)費(fèi)生活費(fèi)都得自己賺。別人放假的時(shí)候,我就在公司全職上班。
我第一份正式工作在維也納,本來(lái)只打算干一個(gè)月,結(jié)果他們留了我六個(gè)月,后來(lái)我在那家公司工作了大概五年。第一天他們給了我一本厚厚的書(shū),上面寫(xiě)著“Microsoft MFC”,到現(xiàn)在我做夢(mèng)還會(huì)被嚇醒。我當(dāng)時(shí)心想,這也太糟了。
后來(lái)我干脆悄悄用 .NET,也沒(méi)跟他們說(shuō)。過(guò)了幾個(gè)月我才攤牌,說(shuō)我順便做了點(diǎn)“技術(shù)棧現(xiàn)代化”。反正木已成舟,他們居然也一直留著我,大概因?yàn)槭虑榇_實(shí)做成了。我實(shí)際上還挺喜歡.NET 2.0 的泛型,不過(guò)應(yīng)用啟動(dòng)慢得要命,第一次跑基本要等很久,老 Windows 用戶應(yīng)該都懂。
主持人:那你后來(lái)是怎么接觸到 iOS,又是怎么想到做 PSPDFKit 的?
Peter:那是后面的事了。上大學(xué)時(shí),有個(gè)朋友給我看了 iPhone。我就摸了一分鐘,立刻決定要弄一臺(tái)。那一刻真的像被雷劈了一樣,完全不一樣,完全是另一個(gè)層級(jí)的體驗(yàn)。但當(dāng)時(shí)我其實(shí)還沒(méi)想過(guò)要給它做應(yīng)用。
主持人:那大概是 2009、2010 年左右?
Peter:差不多。后來(lái)有一次,我在地鐵上用一個(gè)交友網(wǎng)站,用的是 iPhone OS 2。我打了一大段很走心的消息,剛點(diǎn)發(fā)送后車進(jìn)隧道了,JavaScript 禁用了發(fā)送按鈕,然后直接報(bào)錯(cuò)。那時(shí)候沒(méi)有復(fù)制粘貼、沒(méi)有截圖、頁(yè)面還不能滾動(dòng),那段話就這么沒(méi)了。我當(dāng)時(shí)氣炸了,覺(jué)得這簡(jiǎn)直不可接受。回到家我就把那個(gè)網(wǎng)站黑了,用正則去解析 HTML。
現(xiàn)在看當(dāng)然完全不該這么干,后來(lái)我硬做了一個(gè) App。我用的是 iPhone OS 3 的 Beta 版,Core Data 也是 Beta,還用改過(guò)的 GCC,把 blocks 編譯器移植進(jìn)來(lái)。各種 Beta 技術(shù)一鍋燉,我自己其實(shí)也不知道在干嘛,折騰了很久才跑起來(lái)。我給那家公司寫(xiě)信說(shuō)我做了個(gè) App,問(wèn)他們?cè)趺纯矗瑳](méi)人理我,我就直接丟到 App Store 上架了。
主持人:這就是那個(gè)交友 App 的客戶端?
Peter:對(duì),本質(zhì)上就是把 HTML 當(dāng) API 用,純解析頁(yè)面。
主持人:現(xiàn)在看挺野的,但在當(dāng)年確實(shí)沒(méi)人這么干。
Peter:我定價(jià)五美元,第一個(gè)月就賺了一萬(wàn)美元。當(dāng)時(shí)我完全不知道流程有多復(fù)雜,Apple 的系統(tǒng)也很原始。我甚至把收款賬戶填成了我爺爺?shù)摹S幸惶煳覡敔敶螂娫拞?wèn)我,說(shuō)怎么 Apple 給他打了一大筆錢,我跟他說(shuō)“這是我的,你千萬(wàn)別動(dòng)”。
后來(lái)有一次我在夜店里,看到有人在用我的 App,我特別驕傲,差點(diǎn)沖過(guò)去跟他說(shuō)這是我做的,最后還是忍住了。沒(méi)多久,我就跟工作了五年的公司說(shuō),我要全力做這個(gè)項(xiàng)目。老板當(dāng)面嘲笑我,說(shuō)這是個(gè)一時(shí)的風(fēng)口,肯定不長(zhǎng)久。那一刻我心里就憋了一口氣:總有一天,我要做一家比你們值錢的公司。結(jié)果這花了我八年的時(shí)間。
我有點(diǎn)成癮性格,一旦投入就停不下來(lái)。我瘋狂打磨這個(gè) App,高速學(xué)習(xí),也是那段時(shí)間我開(kāi)始用 Twitter,那些對(duì)我職業(yè)發(fā)展影響巨大。
后來(lái)有一天凌晨三點(diǎn),我在派對(duì)上喝得有點(diǎn)多,然后接到了一個(gè)電話,對(duì)方說(shuō)他是 Apple 的 John,說(shuō)我的應(yīng)用有問(wèn)題,有人舉報(bào)不當(dāng)圖片。電話掛了,我的 App 也就此下架。我剛辭了工作,心態(tài)直接炸裂,開(kāi)始接零散的活兒。
在舊金山的一家酒吧里,我被介紹為“奧地利最好的 iOS 開(kāi)發(fā)者之一”。就這樣,我拿到了美國(guó)的工作機(jī)會(huì),搬過(guò)去待了一陣子。后來(lái)去了 Nokia Developer Days,那真是史前時(shí)代了。
在那里,有人找我,說(shuō)他們?cè)跂|歐做了一個(gè)雜志閱讀 App,經(jīng)常崩潰。那會(huì)兒 iPad 剛出來(lái),Steve Jobs 說(shuō)它是出版業(yè)的救世主,大家都在做雜志 App。我一聽(tīng)覺(jué)得這是個(gè)不錯(cuò)的短期項(xiàng)目,就接了。我一打開(kāi)代碼,整個(gè)人都懵了。那是我見(jiàn)過(guò)最糟糕的 iOS 代碼,整個(gè)項(xiàng)目只有一個(gè)文件,幾千行。
主持人:還是 Objective-C?
Peter:對(duì),是 Objective-C,而且他們把 Windows 當(dāng)成 Tab 來(lái)用。我都不知道這能行。我很驚訝這居然能用,但感覺(jué)像個(gè)紙牌屋。我試著“外科手術(shù)式”地修補(bǔ)問(wèn)題,但基本上是動(dòng)一處、壞一片。最后我好不容易把它穩(wěn)住了,就跟他們說(shuō),“這太瘋狂了,我要重寫(xiě)”。
他們?cè)绢A(yù)計(jì)要半年,我說(shuō)我一個(gè)月就能搞定,最后花了兩個(gè)月,也不算差太遠(yuǎn)。接下來(lái)我就一直在解決各種 PDF 相關(guān)的技術(shù)問(wèn)題。這個(gè)領(lǐng)域談不上多性感,但每個(gè)領(lǐng)域里都能找到真正有挑戰(zhàn)的點(diǎn)。比如一個(gè) C 語(yǔ)言調(diào)用渲染 PDF 可能要 30MB,但整個(gè)系統(tǒng)只有 64MB,如果你不夠小心、不夠聰明,系統(tǒng)隨時(shí)就把你干掉。
我那段時(shí)間完全沉迷在“把它做到極致”這件事上,比如屏幕旋轉(zhuǎn)時(shí)頁(yè)面的動(dòng)畫(huà)效果,這種細(xì)節(jié)我會(huì)反復(fù)打磨,花了遠(yuǎn)超合理的時(shí)間。所以原本一個(gè)月的活,最后干了兩個(gè)月,但結(jié)果是好的。之后我又跟他們合作了一段時(shí)間。
后來(lái)有個(gè)朋友給我發(fā)消息,說(shuō)他在做一個(gè)雜志應(yīng)用,PDF 那塊特別難。我跟他說(shuō),我剛好做過(guò),對(duì)方就問(wèn)我能不能把代碼給他,我說(shuō)可以。先把那套雜志 App 里和 PDF 有關(guān)的部分抽出來(lái),確認(rèn)對(duì)方也沒(méi)意見(jiàn)。
然后我突然想到,既然有人需要,為什么不試著賣給更多人?我用一個(gè) WordPress 模板,硬改成能跑在 GitHub Pages 上。然后用 fastlane 流程最后得到一個(gè) Dropbox 鏈接,里面有源代碼。當(dāng)天晚上我就發(fā)了條推文。一周之內(nèi),有三個(gè)人買了,大概兩百美元。
在當(dāng)時(shí)對(duì)我來(lái)說(shuō),這已經(jīng)很不可思議了。不只是有人付錢,還有十封郵件在抱怨,說(shuō)他們也想買,但這個(gè)產(chǎn)品還沒(méi)有他們想要的功能。比如有人問(wèn),為什么不能選中文本?幾個(gè)月后我才真正意識(shí)到,這功能到底有多難。
主持人:PDF 里的文本選擇。
Peter:對(duì),尤其是這個(gè)。你知道那句話嗎:公司是由年輕人建立的,因?yàn)樗麄儾恢烙卸嚯y。我當(dāng)時(shí)完全沒(méi)概念,后來(lái)才發(fā)現(xiàn)這簡(jiǎn)直是瘋了一樣復(fù)雜。
直到現(xiàn)在,前幾周還有人給我寫(xiě)郵件,說(shuō)他們?cè)谧?PDF 相關(guān)的事情,想找我?guī)兔ΑN一径紩?huì)回一句:不好意思,我已經(jīng)把這輩子該懂的 PDF 知識(shí)都學(xué)完了,遠(yuǎn)遠(yuǎn)超過(guò)一個(gè)正常人該承受的量,祝你好運(yùn)。
不過(guò)當(dāng)時(shí),這個(gè)項(xiàng)目真的起飛了。我一邊等簽證,一邊繼續(xù)維護(hù)。買的人越來(lái)越多。那是夏天,我躺在湖邊曬太陽(yáng),郵箱里突然又進(jìn)來(lái)一封郵件,說(shuō)又有人買了,六百美元、八百美元。隨著功能變多,我不斷漲價(jià)。
等我真的去舊金山那家公司上班時(shí),這個(gè)項(xiàng)目賺的錢,已經(jīng)超過(guò)我在那里拿的工資了。但我那時(shí)的想法還是:我得去那家公司看看,于是還是去了。
主持人:也就是說(shuō)你搬到了 San Francisco。
Peter:對(duì),而且很有意思的是,那家公司后來(lái)也讓我用自己的框架幫他們做東西。創(chuàng)業(yè)公司當(dāng)然不可能只干八小時(shí),我的本職工作很忙,個(gè)人項(xiàng)目也一樣,睡的自然越來(lái)越少。
三個(gè)月后,我的經(jīng)理 Sabine 把我叫過(guò)去,問(wèn)我一句話:“Peter,你還好嗎?”公司給了我一個(gè)選擇:要么繼續(xù)在這家公司工作,把個(gè)人項(xiàng)目停掉;要么反過(guò)來(lái)。他給我一周時(shí)間決定,而且因?yàn)楹炞C問(wèn)題,如果不留下,就得離境。這個(gè)決定其實(shí)一點(diǎn)都不難。我很清楚,我想做自己的事情。
主持人:那時(shí)候你已經(jīng)看出來(lái)了,這是一個(gè)真正的生意,至少能給你帶來(lái)和美國(guó)工作差不多的收入。
Peter:我從來(lái)不是被錢驅(qū)動(dòng)的。
主持人:那你真正的驅(qū)動(dòng)力是什么?
Peter:我想做那種讓別人覺(jué)得“太棒了”的東西。我特別迷戀細(xì)節(jié),迷戀那些小小的驚喜感。并不是因?yàn)檫@個(gè)領(lǐng)域沒(méi)有競(jìng)爭(zhēng),相反,競(jìng)爭(zhēng)很多。但我心里一直憋著一股勁:我要做一個(gè)像 Apple 自己會(huì)做出來(lái)的產(chǎn)品,充滿關(guān)懷、打磨、克制,還有那些行業(yè)里很多人已經(jīng)不在乎的細(xì)節(jié)。
所以哪怕有競(jìng)爭(zhēng)對(duì)手功能更多、做得更早,我的產(chǎn)品依然更成功。因?yàn)殚_(kāi)發(fā)者試過(guò)之后,都會(huì)覺(jué)得我的用起來(lái)最好。我一直覺(jué)得,產(chǎn)品的“感覺(jué)”比功能列表重要得多。我們?yōu)槭裁促I Apple?不是因?yàn)樗δ茏疃啵且驗(yàn)樗闷饋?lái)就是更舒服。
從賣組件到創(chuàng)建公司
主持人:那你是怎么從“一個(gè)人在賣 PDF 組件”,走到開(kāi)始招人的?你什么時(shí)候意識(shí)到這件事可以做得更大?
Peter:我回到維也納之后,決定徹底 all in,開(kāi)始和一些自由職業(yè)者合作。說(shuō)實(shí)話,我招人其實(shí)招得太晚了,完全可以更早邁出這一步,但這一步真的很難。
從那時(shí)起,這個(gè)產(chǎn)品開(kāi)始有了自己的生命。我職業(yè)生涯里差不多有 13 年都在打磨這個(gè)名字奇怪的產(chǎn)品。名字我一直沒(méi)改,當(dāng)初想名字只花了幾分鐘,就叫 PSPDFKit。后來(lái)改過(guò)一次,但說(shuō)實(shí)話,要不是不得不改,我可能還是不會(huì)動(dòng)。
主持人:名字確實(shí)有點(diǎn)繞,但非常獨(dú)特。
Peter:如果你寫(xiě) Objective-C,你就會(huì)覺(jué)得這個(gè)名字很合理,因?yàn)樗举|(zhì)上就是個(gè)命名空間。我的營(yíng)銷策略也一直很簡(jiǎn)單:我只關(guān)心開(kāi)發(fā)者。雖然最終拍板的是管理層,但只要我能說(shuō)服公司里的工程師,他們就會(huì)替我去內(nèi)部推廣、游說(shuō)。
我們從來(lái)不做冷郵件,也不搞侵略式銷售。所有客戶都是自然找上門的。我們只做三件事:把產(chǎn)品做好、寫(xiě)真正有價(jià)值的技術(shù)博客,以及參加大量開(kāi)發(fā)者大會(huì)。對(duì)我來(lái)說(shuō),最重要的是讓大家明白,這個(gè)產(chǎn)品背后的人是真的懂技術(shù)、也真的熱愛(ài)這件事。而這一點(diǎn),會(huì)直接體現(xiàn)在產(chǎn)品里。
主持人:PSPDFKit 底層用的是什么技術(shù)?最早是 Objective-C 嗎?后來(lái)轉(zhuǎn)成 Swift?有沒(méi)有用到 C 之類的?
Peter:一開(kāi)始確實(shí)是 Objective-C,后來(lái)逐步覆蓋到所有平臺(tái)。真正一次大的轉(zhuǎn)折,是我們把 Apple 自帶的渲染器換掉了,那個(gè)東西當(dāng)時(shí)問(wèn)題很多,之后改成了一個(gè)大型的 C++ 渲染器,后來(lái)所有平臺(tái)基本都共用這一套核心。
我們?cè)?Web 這塊也做得非常早,是最早一批跑在 WebAssembly 上的 PDF 框架之一。當(dāng)時(shí)我做了一件現(xiàn)在看來(lái)還挺聰明的事:在一切剛開(kāi)始的時(shí)候,我們做了一個(gè)性能基準(zhǔn)測(cè)試。后來(lái)這個(gè) benchmark 被 Google、Microsoft、Apple 等公司拿去用,成了他們內(nèi)部的參考指標(biāo)之一。結(jié)果就是,這些大公司為了跑得比我們快,反過(guò)來(lái)不斷把他們的渲染器優(yōu)化得更快,而測(cè)試用的內(nèi)容,其實(shí)就是我們自己的渲染場(chǎng)景。
創(chuàng)業(yè)后,分享公司的“核心秘密”
主持人:厲害。隨著公司規(guī)模變大,我對(duì) PSPDFKit 的一個(gè)深刻印象是,你們寫(xiě)了大量博客。記得有一篇文章,講的是團(tuán)隊(duì)怎么運(yùn)作:每個(gè)功能都要從 proposal 開(kāi)始,因?yàn)?API 很大、用戶很多,所以你們非常保守;還有類似 Boy Scout Rule 那樣的重構(gòu)原則。團(tuán)隊(duì)從十幾個(gè)人發(fā)展到幾十個(gè)人,這種文化是怎么建立起來(lái)的?
Peter:我賣股份的時(shí)候,公司大概七十人,現(xiàn)在已經(jīng)接近兩百人了。一開(kāi)始我就很清楚,在維也納不可能招到我需要的所有人,所以我們從一開(kāi)始就是 remote first,后來(lái)又變成了一種混合模式,反而更復(fù)雜。
很多東西都是邊走邊學(xué)。我從來(lái)沒(méi)有“我要當(dāng) CEO”的執(zhí)念,我一直在寫(xiě)代碼,我會(huì)找合適的人來(lái)幫我做公司的其他部分。業(yè)務(wù)我能做,也做得還可以,但我真的不喜歡那種企業(yè)銷售電話,你得去琢磨一個(gè)“魔法數(shù)字”,看對(duì)方可能愿意付多少錢。這就是企業(yè)銷售,真的很折磨。但說(shuō)到底,這種模式可能是唯一行得通的。
主持人:你是說(shuō)企業(yè)銷售本身?
Peter:對(duì)。
主持人:很多開(kāi)發(fā)者去廠商官網(wǎng),看不到價(jià)格,只看到“聯(lián)系我們”或者“預(yù)約演示”,都會(huì)很不爽。為什么一定要這樣?
Peter:原因很簡(jiǎn)單,我們會(huì)看你的公司情況,然后大概判斷你能接受的價(jià)格,再定一個(gè)數(shù)。聽(tīng)起來(lái)確實(shí)很糟糕,但當(dāng)你的產(chǎn)品沒(méi)辦法簡(jiǎn)單拆成一個(gè)統(tǒng)一定價(jià)時(shí),這是現(xiàn)實(shí)。
一個(gè)自由職業(yè)者,和一家財(cái)富五百?gòu)?qiáng)公司,用法完全不同,獲得的價(jià)值也完全不同。如果統(tǒng)一收費(fèi),要么把小客戶擋在門外,要么讓大客戶覺(jué)得價(jià)格可疑。價(jià)格定低了,大公司采購(gòu)流程都走不起來(lái);定高了,小團(tuán)隊(duì)直接流失。所以這個(gè)過(guò)程看起來(lái)不公平,但在某些產(chǎn)品上,反而是最公平的方式。
軟件大致可以分成四個(gè)象限:容易或困難,有趣或無(wú)聊。我們處在“又難又無(wú)聊”的那一塊。
如果只構(gòu)建每個(gè)開(kāi)發(fā)者都想構(gòu)建的東西,賣起來(lái)一定很難。賣給開(kāi)發(fā)者本來(lái)就難,如果一個(gè)東西既簡(jiǎn)單又有趣,那基本沒(méi)戲。但如果是那種“我真不想碰,而且還特別難”的,反而是個(gè)好位置。我找到了這樣一個(gè)細(xì)分領(lǐng)域,里面有無(wú)限多復(fù)雜問(wèn)題可以解決。
主持人:那解析 PDF 到底難在哪?有規(guī)范啊,我是工程師,照著規(guī)范做不就行了?
Peter:舉個(gè)最簡(jiǎn)單的例子。PDF 里有鏈接,比如目錄,點(diǎn)一下跳到某一頁(yè)。我一開(kāi)始的假設(shè)是,可能有一兩百個(gè)鏈接。我就按這個(gè)規(guī)模設(shè)計(jì)了整個(gè)數(shù)據(jù)模型。后來(lái)來(lái)了一個(gè)付費(fèi)很高的客戶,說(shuō)他們的 PDF 打開(kāi)要四分鐘,我一看是一份五萬(wàn)頁(yè)的文本圣經(jīng),每一頁(yè)上有上百個(gè)鏈接。
主持人:那就是五十萬(wàn)個(gè)鏈接。
Peter:對(duì),我的模型直接爆炸了。假設(shè)差了三個(gè)數(shù)量級(jí)。但這時(shí)候你已經(jīng)是一個(gè)成熟產(chǎn)品了,還有穩(wěn)定的 API。你要怎么徹底重構(gòu)內(nèi)部,又不破壞所有用戶?所有東西都得改成 lazy loading。以前加載 100 個(gè)對(duì)象沒(méi)問(wèn)題,現(xiàn)在不行了。我花了整整兩個(gè)月重寫(xiě)內(nèi)部結(jié)構(gòu),同時(shí)還要保證對(duì)外 API 看起來(lái)還是“簡(jiǎn)單的”。用戶不需要知道哪些是立即加載的、哪些是延遲加載的,引用關(guān)系也必須保持一致。
主持人:這些引用必須還能連得上。
Peter:對(duì)。我其實(shí)非常喜歡做支持,這也是公司能成功的重要原因之一。如果你提一個(gè)工單,結(jié)果 CEO 直接回你,還幫你解決問(wèn)題,那感覺(jué)是完全不一樣的。
我一直有個(gè)策略:支持一定要快。五分鐘內(nèi)回,和兩天后回,體驗(yàn)差別巨大。這個(gè)問(wèn)題就是其中一個(gè)例子,我花了兩個(gè)月把它徹底解決,最后跑得非常順,那種滿足感真的很強(qiáng)。
主持人:那時(shí)候你自己還寫(xiě)很多代碼,對(duì)吧?雖然團(tuán)隊(duì)已經(jīng)很大了,但你仍然會(huì)深入細(xì)節(jié)。
Peter:當(dāng)然。我有一支非常棒的團(tuán)隊(duì),有些模塊我參與得更多。移動(dòng)端一直是我最上心的部分,但我也會(huì)深度參與技術(shù)、市場(chǎng)和業(yè)務(wù)。業(yè)務(wù)上我有 Jonathan 幫忙,市場(chǎng)和銷售也有很優(yōu)秀的人。其實(shí),持續(xù)寫(xiě)博客、寫(xiě)你是怎么解決這些復(fù)雜問(wèn)題的,會(huì)幫你吸引同樣想解決復(fù)雜問(wèn)題的人。
主持人:這是我對(duì) PSPDFKit 最深的印象之一。你們的博客不只是營(yíng)銷,而是真的好看。說(shuō)實(shí)話,我并不做 PDF,但如果要說(shuō)起 PDF 框架,第一個(gè)想到的就是 PSPDFKit,因?yàn)橹挥心銈儠?huì)寫(xiě)這么有意思的技術(shù)文章。
主持人:你現(xiàn)在回頭看,會(huì)不會(huì)也覺(jué)得奇怪,為什么更多公司不這么做?還是說(shuō),這本來(lái)就需要?jiǎng)?chuàng)始人本身是個(gè)喜歡寫(xiě)、喜歡拆解問(wèn)題的工程師?你當(dāng)時(shí)寫(xiě)這些文章,是出于“這對(duì)公司有用”,還是單純因?yàn)槟阕约合氚呀鉀Q過(guò)的難題記錄下來(lái)?
Peter:我喜歡分享,也喜歡啟發(fā)別人。有時(shí)候團(tuán)隊(duì)內(nèi)部也會(huì)糾結(jié),要不要寫(xiě)這些內(nèi)容,畢竟算是一些“秘密武器”,但我從來(lái)沒(méi)太在意這些聲音。還有一點(diǎn)很重要:寫(xiě)下來(lái)本身,就是加深理解。你覺(jué)得自己懂了,但當(dāng)你要教別人時(shí),才會(huì)發(fā)現(xiàn)自己是否真的懂。所以對(duì)我來(lái)說(shuō),這也是一種復(fù)盤(pán)和保存。我解決了一個(gè)很難的問(wèn)題就想把它留下來(lái),順便幫到別人。
當(dāng)然,我也享受關(guān)注。但更重要的是,有時(shí)候我自己過(guò)一年再回頭看這些文章,會(huì)發(fā)現(xiàn)這就是公司最好的文檔,是我自己的“技術(shù)筆記本”。它在很多方面都很有用。很多大公司流程太重,而且不少開(kāi)發(fā)者本身不喜歡寫(xiě)東西,所以我后來(lái)干脆規(guī)定,每個(gè)月給所有人一整天,只干一件事:寫(xiě)一篇博客。
主持人:那天不用干別的活,只寫(xiě)。
Peter:對(duì),就寫(xiě)。一天的時(shí)間其實(shí)已經(jīng)很多了,現(xiàn)在我寫(xiě)一篇文章也就幾個(gè)小時(shí)。我不想過(guò)多談?wù)摴驹鲩L(zhǎng)階段,但我覺(jué)得公司最有意思的階段,是剛開(kāi)始以及快速成長(zhǎng)的階段。
后來(lái)人多了,流程多了,更像是在“養(yǎng)護(hù)花園”,而不是瘋狂 hack。事情變得更迭代化,也沒(méi)那么刺激了。人一多,內(nèi)部摩擦、情緒問(wèn)題也多,這些我并不享受。那段時(shí)間我真的被燒干了。
“停更”,賦閑
主持人:你覺(jué)得是什么讓你最終人力交瘁的?
Peter:我只是工作太猛了,幾乎每個(gè)周末都在工作,還要處理大量管理事務(wù)。CEO 本質(zhì)上就是“兜底的人”,凡是別人沒(méi)處理好、處理不了、或者搞砸的,最后都得你來(lái)收拾。而且很孤獨(dú),你不能隨便講很多事情。哪怕公司已經(jīng)很開(kāi)放了,你也不能一直表達(dá)負(fù)面情緒,就算真的發(fā)生了很糟糕的事,你也得扛著。
我記得有個(gè)周末,合伙人凌晨給我打電話,說(shuō)一家大型飛機(jī)制造公司,因?yàn)槲覀兊能浖懒耍w機(jī)停飛了。那是個(gè)非常“刺激”的周末,最后我拆了他們的應(yīng)用,證明是他們外包代碼亂改,觸發(fā)了授權(quán)回退邏輯。但那種時(shí)刻,你會(huì)覺(jué)得公司隨時(shí)可能完蛋,而這種壓力只是所有壓力中的一部分。
這些事情你能撐一陣子。但我也相信,burnout 不完全是因?yàn)楣ぷ魈啵且驗(yàn)槟汩_(kāi)始不再真正相信自己在做的事情,或者內(nèi)部沖突太多。我們當(dāng)時(shí)在管理團(tuán)隊(duì)里爭(zhēng)論也很多,我還犯了一個(gè)錯(cuò)誤,以為公司應(yīng)該用一種過(guò)度民主的方式來(lái)管理。這些都消耗了我。但即便如此,我一點(diǎn)都不后悔這段經(jīng)歷。
主持人:從外人的角度看,你賣掉了股份,賺到足夠多的錢,按理說(shuō)已經(jīng)不用再工作了。很多剛起步、或者未來(lái)想創(chuàng)業(yè)的人,都會(huì)覺(jué)得這簡(jiǎn)直是終極夢(mèng)想。既然已經(jīng)“通關(guān)”,是不是就該停下來(lái)、享受生活了?現(xiàn)實(shí)是,大多數(shù)人走不到那一步。但一旦走到了,好像任務(wù)就完成了,就像攀巖爬到頂,敲響鈴鐺,游戲結(jié)束。
主持人:外界看,你博客更新停了好幾年。那段時(shí)間你在做什么?又學(xué)到了什么?也就是在你回歸到現(xiàn)在之前,那幾年到底發(fā)生了什么?
Peter:我真的花了很長(zhǎng)時(shí)間讓自己“降壓”,去填補(bǔ)那些我以為錯(cuò)過(guò)的人生體驗(yàn),花了不少錢。有幾個(gè)月,我甚至連電腦都沒(méi)開(kāi)過(guò)。那段時(shí)間,我完全沒(méi)有“接下來(lái)該干嘛”的感覺(jué)。
說(shuō)實(shí)話,那種狀態(tài)挺違和的,你這么早就“退休”,或者說(shuō)有一個(gè)好到不需要再工作的退出,這件事本身就會(huì)把人搞懵。那幾年對(duì)我來(lái)說(shuō),其實(shí)挺難熬的。
后來(lái)有一天,大概在四月,我突然想起一個(gè)很多年前只是當(dāng)副業(yè)做過(guò)的項(xiàng)目,我心想還是想把它繼續(xù)做完吧。于是,三年多之后,我重新坐回電腦前,開(kāi)始寫(xiě)代碼。那個(gè)項(xiàng)目是個(gè) Twitter 分析工具,用 Swift 和 SwiftUI 寫(xiě)的。其實(shí)當(dāng)年我就知道,這東西如果做成 Web 會(huì)好很多。
主持人:所以這是一個(gè)你一直放在心里的老想法?跟 Twitter 有關(guān)的?
Peter:對(duì),算是分析工具。最開(kāi)始只是我自己想用,因?yàn)槭忻嫔细緵](méi)有。三年后再看,還是沒(méi)有。現(xiàn)在勉強(qiáng)算有點(diǎn)類似的,但我中途也被別的事帶跑了。我當(dāng)時(shí)想用 Web 技術(shù)重寫(xiě),但說(shuō)實(shí)話,在公司里我從來(lái)沒(méi)碰過(guò)那一塊。那一整套技術(shù)棧一直是 Martin 在負(fù)責(zé),他很厲害,所以我完全不用操心。
主持人:所以你其實(shí)一直沒(méi)怎么親手下場(chǎng)?
Peter:對(duì)。等我再回來(lái)自己做的時(shí)候,我才發(fā)現(xiàn),“哇,這一層真的很深”,而且這其實(shí)是個(gè)陷阱:你在某一套技術(shù)上越熟練,跳到另一套時(shí)就越痛苦。不是做不到,是太折磨人了。我在 Apple 那套技術(shù)里,閉著眼都能寫(xiě)代碼;可一換棧,連最基礎(chǔ)的東西都要去 Google,一下子就感覺(jué)自己又成了新手。
主持人:而且經(jīng)驗(yàn)越多,越討厭這種感覺(jué)。效率下降,明明知道自己本可以更快。
Peter:對(duì)。所以我回來(lái)的時(shí)候就在想:那 AI 到底是什么?CI、AI 那些大家都在吐槽的東西,到底值不值得看一眼?老實(shí)說(shuō),我某種程度上反而要感謝那三年幾乎沒(méi)碰電腦的日子,因?yàn)槟銈兡菚r(shí)候已經(jīng)把 AI 看過(guò)一輪了,知道它當(dāng)時(shí)有多爛。
回歸即上手 Claude Code,“上癮了”
主持人:對(duì),你錯(cuò)過(guò)了 GitHub Copilot 的早期測(cè)試版,那種“高級(jí)自動(dòng)補(bǔ)全”的階段。后來(lái)有了 GPT-3.5,再到 GPT-4,才是真正的飛躍。所以你回來(lái)之后,第一個(gè)用的是什么工具?你等于是直接跳過(guò)了兩年開(kāi)發(fā)者一邊用、一邊嫌棄 AI 的階段。
Peter:是 Claude Code。
主持人:你一上來(lái)就用它?
Peter:對(duì)。我記得它剛發(fā)布不久,之前就有 Beta。
主持人:也就是說(shuō),你休息了一段時(shí)間回來(lái),直接打開(kāi) Claude Code,前面的演進(jìn)全都沒(méi)經(jīng)歷。
Peter:沒(méi)錯(cuò)。我記得我拿了一個(gè)以前寫(xiě)得很亂的副項(xiàng)目,又用我自己做的一個(gè)瀏覽器插件,把整個(gè) GitHub 倉(cāng)庫(kù)轉(zhuǎn)成一個(gè) 1.3MB 的 Markdown 文件。我把它丟進(jìn) Google AI Studio,用 Gemini 之類的模型,敲了一句:“給我寫(xiě)一份 spec。”它直接生成了四百多行代碼。
我再把這份 spec 拖回 Claude Code,說(shuō)一句“照這個(gè)做”,然后我去干別的事了。等我回來(lái),它告訴我:“已經(jīng)百分之百可以用于生產(chǎn)環(huán)境了。”我一跑,直接崩了。
后來(lái)我又給它接了 MCP,讓它能用瀏覽器,我記得 MCP 當(dāng)時(shí)已經(jīng)有了。它又跑了幾個(gè)小時(shí),最后居然做出了一個(gè) Twitter 登錄頁(yè),還能跑點(diǎn)流程。說(shuō)實(shí)話,效果不算好,但它真的“做出了點(diǎn)東西”。那一刻對(duì)我來(lái)說(shuō),簡(jiǎn)直是被震住了。
主持人:那是在去年四月、五月左右,對(duì)吧?
Peter:對(duì)。已經(jīng)好到讓我看清方向了。我立刻意識(shí)到:這就是未來(lái)。從那之后,有好幾個(gè)月我都睡不好覺(jué)。
主持人:我記得有一次我凌晨五點(diǎn)在 Twitter 上給你發(fā)私信,你馬上就回了。我還問(wèn)你怎么這么早,你說(shuō)這是常態(tài),你基本都沒(méi)睡。我問(wèn)你在干嘛,你說(shuō)一直在用 Claude,特別上癮。
Peter:真的,就跟賭場(chǎng)一個(gè)道理,它就是我的小老虎機(jī)。你敲下一個(gè) prompt,要么啥也沒(méi)發(fā)生,要么一坨垃圾,要么突然給你個(gè)讓人頭皮發(fā)麻的結(jié)果。
主持人:而且你是一個(gè)經(jīng)驗(yàn)非常豐富的開(kāi)發(fā)者,對(duì)你來(lái)說(shuō),被“震撼”并不容易。你見(jiàn)過(guò)好代碼、爛代碼,心里是有一個(gè)標(biāo)準(zhǔn)的。
Peter:所以才好笑。我以前在公司時(shí),花了大量的時(shí)間在所謂“摳細(xì)節(jié)”上。現(xiàn)在回頭看,我都會(huì)想:我當(dāng)時(shí)在干嘛?客戶根本感知不到這些。當(dāng)然,代碼要可靠、要快、要安全,這些是底線。但我當(dāng)年真的摳太多了。
主持人:但另一方面,你剛才也說(shuō)過(guò),大家之所以喜歡 PSPDFKit,正是因?yàn)樗蚰サ米詈谩⒆罘€(wěn)定。你不覺(jué)得那種“摳細(xì)節(jié)”其實(shí)是在控制技術(shù)債嗎?某種程度上,正是這種偏執(zhí)才讓產(chǎn)品性能和質(zhì)量都站得住。
Peter:是的,這么說(shuō)也沒(méi)錯(cuò)。到現(xiàn)在我也還是這樣。我上一篇博客,其實(shí)就是在“懺悔”,我承認(rèn)我開(kāi)始在主分支上直接提交 AI 寫(xiě)的代碼。
與此同時(shí),我其實(shí)還是花了大量時(shí)間在做結(jié)構(gòu)重構(gòu)。就拿最近來(lái)說(shuō),我特別想把一個(gè) PR 合進(jìn)去,那是一條接近一萬(wàn)五千行的改動(dòng)鏈。
在一個(gè)項(xiàng)目里,我把所有東西都遷移到了插件化架構(gòu),這件事讓我非常興奮。我真的很在意整體結(jié)構(gòu)。但我沒(méi)有把每一行代碼都讀一遍,因?yàn)楹芏啻a說(shuō)白了就是枯燥的“管道工程”。
你看,大多數(shù)應(yīng)用本質(zhì)上都差不多:數(shù)據(jù)從 API 進(jìn)來(lái),是一種形態(tài);你解析、封裝,變成另一種形態(tài);存進(jìn)數(shù)據(jù)庫(kù),又是一種形態(tài);再讀出來(lái),又變一次;最后變成 HTML 或別的形式,你在頁(yè)面里輸入,它又變了。大部分軟件,其實(shí)就是在應(yīng)用里不斷“揉捏”數(shù)據(jù),我們本質(zhì)上就是高級(jí)的數(shù)據(jù)搬運(yùn)工,而真正難的部分,如 Postgres 這種東西三十年前就被一群天才解決了。這就是現(xiàn)實(shí)。
當(dāng)然,總會(huì)有一些有意思的地方,但我真的不需要關(guān)心每個(gè)按鈕怎么對(duì)齊、每個(gè) Tailwind class 怎么寫(xiě)。有些細(xì)節(jié)很無(wú)聊,有些細(xì)節(jié)很有趣,但整體來(lái)說(shuō),更重要的是系統(tǒng)架構(gòu),而不是逐行讀代碼。
日常如何用 AI 編程工具工作?
主持人:那我們跳到現(xiàn)在。你現(xiàn)在用 Claude 相關(guān)工具寫(xiě)代碼時(shí),日常工作流是怎樣的?你用終端嗎?幾個(gè)終端?都用哪些工具?你剛才說(shuō)你不太做逐行代碼審查,但又一直在想做架構(gòu)。如果你要跟一個(gè)即將加入團(tuán)隊(duì)的開(kāi)發(fā)者解釋,你的一天大概是什么樣的,會(huì)怎么說(shuō)?
Peter:這個(gè)過(guò)程挺有意思的。稍微回顧一下,一開(kāi)始是 Claude Code,然后我就徹底上頭了。接著有一段時(shí)間我用 Cursor,又試了 Gemini 2.5,后來(lái)又用了 Opus 4。我還把不少朋友也拉進(jìn)來(lái)了,比如我在越南認(rèn)識(shí)的 Armin 和 Mario,他們都是被我“傳染”的。我當(dāng)時(shí)狀態(tài)真的很上頭,搞得他們也開(kāi)始試,然后大家一起凌晨五點(diǎn)不睡覺(jué)。我把這群人戲稱為“黑眼圈俱樂(lè)部”。這也是為什么我后來(lái)在倫敦搞了一個(gè) meetup,名字就叫Claude Code Anonymous。
真正把我震住的,是一個(gè)認(rèn)知上的變化:我突然意識(shí)到,我現(xiàn)在幾乎什么都能做了。
以前做副業(yè)要慎重挑選,因?yàn)閷?xiě)軟件真的很難。現(xiàn)在也不輕松,但那種“摩擦”感變了。過(guò)去是“我在這個(gè)技術(shù)棧里很強(qiáng),在那個(gè)棧里很菜”,現(xiàn)在我會(huì)想:算了,直接上 Go 吧。我完全不懂 Go,但我有系統(tǒng)層面的理解。一旦你有了這種理解,就會(huì)慢慢形成一種感覺(jué),知道什么是對(duì)的、什么是錯(cuò)的。這本身就是一種技能。
我記得有人發(fā)推說(shuō),寫(xiě)代碼時(shí)你能“感覺(jué)到摩擦”,而正是這種“摩擦”幫你做出好的架構(gòu)。我現(xiàn)在 prompt 的時(shí)候也有同樣的感覺(jué):我能看到代碼刷刷地生成、能感知它花了多久、能感覺(jué)到模型是不是在“頂你”,也能判斷生成的東西是亂的,還是有章法的。
我在發(fā)出 prompt 的那一刻,心里其實(shí)已經(jīng)有個(gè)預(yù)期:這事大概要多久。如果明顯比預(yù)期慢,我立刻就知道有問(wèn)題。
主持人:你等于是在“感覺(jué)”模型的狀態(tài),對(duì)吧?
Peter:對(duì),我覺(jué)得這是一種共生關(guān)系。我在學(xué)著更好地“跟它說(shuō)話”,甚至可以說(shuō)是一種新的、半死不活的語(yǔ)言。同時(shí),我用這些工具的能力在提升,模型本身也在進(jìn)化。
從四月到現(xiàn)在,我覺(jué)得真正的拐點(diǎn)是在夏天:那時(shí)它已經(jīng)強(qiáng)到,你幾乎可以不手寫(xiě)代碼,就把軟件做出來(lái)。但真正讓我徹底服氣的,其實(shí)是 GPT-5.2。我覺(jué)得它被嚴(yán)重低估了。
我其實(shí)不太理解,為什么還有那么多人主要用 Claude Code。當(dāng)然,我能理解那是一種不同的工作方式。但我現(xiàn)在用的這一套強(qiáng)得離譜,幾乎每一個(gè) prompt 都能給我想要的結(jié)果。這在 Claude 上是很難想象的。
我最近的一個(gè)項(xiàng)目常常在 Codex 上同時(shí)跑五到十個(gè) agent。如果你是典型的 Claude Code 用戶,你得忘掉不少“為了哄它出好結(jié)果”的小技巧。
我也見(jiàn)過(guò) Claude Code 團(tuán)隊(duì),他們確實(shí)開(kāi)創(chuàng)了一個(gè)新類別。Claude Code 是一個(gè)定義品類的產(chǎn)品,用來(lái)做通用電腦工作非常棒、用來(lái)寫(xiě)代碼也很好,我現(xiàn)在幾乎每天還在用。但一旦進(jìn)入復(fù)雜應(yīng)用的代碼編寫(xiě),Codex 就強(qiáng)太多了。Claude Code 往往只讀三四個(gè)文件,就自信滿滿開(kāi)始寫(xiě)代碼,你得不斷拉著它,讓它多讀、多看,理解整個(gè)代碼庫(kù),才能把新功能編進(jìn)去。Codex 則會(huì)安靜地讀文件,可能讀十分鐘。如果你只用一個(gè)終端,這體驗(yàn)確實(shí)會(huì)讓人崩潰,我完全理解。
但我更喜歡那種,你不用事無(wú)巨細(xì)地告訴它該怎么做,我和模型更像是在對(duì)話。
我會(huì)說(shuō):“我們一起看看這個(gè)結(jié)構(gòu),有哪些可能性?你有沒(méi)有考慮過(guò)這個(gè)功能?”因?yàn)槊恳淮?session,對(duì)模型來(lái)說(shuō)都是從零開(kāi)始理解你的產(chǎn)品,你有時(shí)候只需要給它一點(diǎn)點(diǎn)提示,讓它往不同的方向探索。我不需要什么 Plan 模式,只是一直聊,直到我說(shuō)“那就這么建吧”,它才會(huì)真的開(kāi)始動(dòng)手。當(dāng)然,它們都挺“容易被觸發(fā)”的,但只要我說(shuō)的是“討論”“給我選項(xiàng)”,它就不會(huì)直接寫(xiě)代碼。
主持人:所以你大量的 prompting,其實(shí)是在和 agent 一起做規(guī)劃?
Peter:對(duì)。比如我會(huì)提醒它“我們需要文檔,那放在哪里合適?”它可能會(huì)建議“這應(yīng)該單獨(dú)成一頁(yè)。”系統(tǒng)設(shè)計(jì)是我在做的,因?yàn)槲覍?duì)產(chǎn)品整體形態(tài)有清晰的理解。我不需要逐行理解代碼,那是 Codex 在做的事,但架構(gòu)師是我。
主持人:這聽(tīng)起來(lái)有點(diǎn)像很久以前的一種模式:有一個(gè)“Architect”,以前也是開(kāi)發(fā)者,但不再親手寫(xiě)代碼,而是負(fù)責(zé)系統(tǒng)藍(lán)圖,下面有一群工程師實(shí)現(xiàn)。這種模式在很多現(xiàn)代公司已經(jīng)不流行了,大家更偏向資深工程師一起協(xié)作。不過(guò)在一些銀行之類的地方,還是能看到這種“大寫(xiě)的 Architect”。問(wèn)題是,這種模式往往很讓人討厭:設(shè)計(jì)的人不用值班,不直接為結(jié)果負(fù)責(zé),最后在現(xiàn)實(shí)里容易失效。
而你現(xiàn)在的狀態(tài),倒像是你是 architect,但手下是一群 agent。區(qū)別在于,你依然是獨(dú)立貢獻(xiàn)者,代碼是你的、責(zé)任也是你的。如果你推了個(gè) bug 把 ClawdBot 搞掛了,就像最近那次,你是要負(fù)責(zé)的。以前在公司里,architect 往往被流程和人層層保護(hù),不太需要直接面對(duì)結(jié)果。
Peter:我其實(shí)不太喜歡“architect”這個(gè)詞,我更愿意叫自己 builder。我發(fā)現(xiàn),能不能把 AI 用好,人群之間差異非常明顯。
像我關(guān)心的是結(jié)果、是產(chǎn)品,我很在意它的感覺(jué)、體驗(yàn)。我關(guān)心結(jié)構(gòu)層面的骨架,但不會(huì)摳那些小細(xì)節(jié)。而另一類人,特別喜歡寫(xiě)硬核代碼、研究算法,他們不太喜歡產(chǎn)品、市場(chǎng)這些東西。他們更享受解決“難問(wèn)題”。而偏偏,這正是 AI 最擅長(zhǎng)的部分,所以這類人往往會(huì)抗拒 AI,或者感到非常失落。
很多時(shí)候,我只是給模型一點(diǎn)提示,但老實(shí)說(shuō),我去年在軟件架構(gòu)和系統(tǒng)設(shè)計(jì)上學(xué)到的東西,比過(guò)去五年加起來(lái)都多。這些模型里裝著海量知識(shí),一切都只差一個(gè)“問(wèn)對(duì)的問(wèn)題”。
像我那個(gè) Twitter 項(xiàng)目到現(xiàn)在還沒(méi)完成,我也很希望能回去繼續(xù)做。所有東西一度都曾跑得很好,但用著用著就開(kāi)始卡、變得奇怪,然后又莫名其妙恢復(fù)。這類問(wèn)題特別難 debug,因?yàn)楹茈y復(fù)現(xiàn)。基本就是:你用得越多,它就越慢。
后來(lái)我發(fā)現(xiàn),是 Postgres 里有一些在特定 insert 時(shí)觸發(fā)的邏輯把數(shù)據(jù)庫(kù)拖得很忙。模型看不到這一層,因?yàn)槌橄筇h(yuǎn)了。問(wèn)題出在一個(gè)文件里的一個(gè)函數(shù),名字也不明顯。我一直沒(méi)問(wèn)對(duì)問(wèn)題,直到我問(wèn)了一句:“這里有沒(méi)有副作用?”才把它挖出來(lái),然后改掉了。所以說(shuō),一切真的都只差在能否問(wèn)一個(gè)對(duì)的問(wèn)題。
主持人:但前提是,你得有足夠的知識(shí)和經(jīng)驗(yàn)。
Peter:對(duì),這正是關(guān)鍵。那些對(duì)內(nèi)部實(shí)現(xiàn)執(zhí)念很深、又不太在乎“能不能先做出來(lái)”的人,往往會(huì)抗拒 AI;而那些更興奮于“把東西做出來(lái)”的人,反而進(jìn)展飛快。
還有一點(diǎn)對(duì)我?guī)椭艽螅阂郧拔议_(kāi)公司帶團(tuán)隊(duì),可以盯著每個(gè)人的代碼,要求他們寫(xiě)成我想要的樣子。但很多沒(méi)管過(guò)人的開(kāi)發(fā)者,沒(méi)有學(xué)會(huì)放手,接受“這段代碼不是我理想中的樣子,但它能讓我更接近目標(biāo)”。不完美的地方,永遠(yuǎn)可以之后再改。
我非常相信“迭代式改進(jìn)”。當(dāng)年在公司里,我就是花了很長(zhǎng)時(shí)間學(xué)會(huì)一點(diǎn)點(diǎn)放手。所以,當(dāng)我開(kāi)始用 Claude Code 的時(shí)候,感覺(jué)就像我手下有了一群工程師:有時(shí)候很不完美,有時(shí)候甚至有點(diǎn)蠢,但偶爾又異常聰明。我需要引導(dǎo)他們,一起朝著一個(gè)目標(biāo)前進(jìn)。某種程度上,這感覺(jué)就像又當(dāng)了一次老板。
高效率的秘訣
主持人:挺有意思的一點(diǎn)是,在之前,你用一種非常傳統(tǒng)的方式做了十幾年的軟件,甚至不止十幾年。你不僅把產(chǎn)品打磨得很扎實(shí),也非常擅長(zhǎng)帶團(tuán)隊(duì)、設(shè)立高標(biāo)準(zhǔn),對(duì)“工程本身”這件事非常在意。而現(xiàn)在,你用 agent、用 AI 寫(xiě)代碼有一年左右的時(shí)間了。對(duì)比這兩種階段,你覺(jué)得真正改變了什么?又有哪些東西,其實(shí)并沒(méi)有變?
Peter:我不太喜歡“vibe coding”這個(gè)說(shuō)法。
主持人:那你更愿意怎么稱呼?
Peter:現(xiàn)在大家基本都這么叫了吧。我自己對(duì)外會(huì)說(shuō),我做的是“Agentic Engineering”。現(xiàn)在我往往是凌晨三點(diǎn)開(kāi)始寫(xiě)代碼。那些枯燥、機(jī)械的編碼工作基本都被自動(dòng)化掉了,我的速度快了很多,但與此同時(shí),我需要思考的事情也多得多。
我依然能進(jìn)入那種心流狀態(tài),感覺(jué)和以前幾乎一樣,但精神消耗其實(shí)更大,因?yàn)槲也皇窃诠芾硪粋€(gè)工程師,而是同時(shí)管五個(gè)、十個(gè) agent。我在不同模塊之間來(lái)回切換:這邊是一個(gè)子系統(tǒng),那邊是一個(gè)功能點(diǎn),我心里大概知道這個(gè)功能交給 Codex 可能要跑四十分鐘到一個(gè)小時(shí),那我就先把方案想清楚再丟給它去做,然后我轉(zhuǎn)頭去做別的事。
這個(gè)在跑、那個(gè)也在跑,我要過(guò)一會(huì)兒回來(lái)看看這個(gè)、再切到另一個(gè),腦子里一直在做上下文切換。我其實(shí)挺不喜歡這種狀態(tài)的,也覺(jué)得這是一個(gè)過(guò)渡期的問(wèn)題。將來(lái)模型和系統(tǒng)更快之后,我可能就不用并行這么多。但為了保持 flow,我現(xiàn)在必須高度并行。
通常會(huì)有一個(gè)主項(xiàng)目占據(jù)我的主要注意力,旁邊還有幾個(gè)“衛(wèi)星項(xiàng)目”,可能我只花五分鐘交代一下、它跑半小時(shí),我回來(lái)看看結(jié)果就行,對(duì)腦力占用不算大。
主持人:聽(tīng)你這么說(shuō),我想到兩種畫(huà)面。一種是那種經(jīng)營(yíng)類游戲,要管廚房里的員工,看著一道道菜出爐,你得不停切換。另一種是看國(guó)際象棋大師同時(shí)下二十盤(pán)棋,他們走到一塊棋盤(pán)前看一眼,立刻做決定。有的棋要想久一點(diǎn),有的掃一眼就走。你就像在不斷擴(kuò)展自己的“并行帶寬”,只要你還能順暢地切換。
Peter:區(qū)別在于,用 Claude Code 的時(shí)候,你確實(shí)得換一種工作方式。它很快,但第一版產(chǎn)出經(jīng)常是跑不通的。比如它寫(xiě)了點(diǎn)東西但你忘了同步改另外三個(gè)地方的話,程序就崩了。真正高效的秘訣在于:你必須把閉環(huán)做完整,讓 agent 能自己 debug、自己測(cè)試。這是最大的秘密,也正是我后來(lái)效率暴漲的原因。
但老實(shí)說(shuō),在 Claude Code 那一套下,很多時(shí)候你還是得回去修修補(bǔ)補(bǔ),迭代次數(shù)也不少,所以總體并不一定快多少,只是更“互動(dòng)”。現(xiàn)在用 Codex,幾乎一次就對(duì)。我的基本策略永遠(yuǎn)是:做一個(gè)功能,一定讓它寫(xiě)測(cè)試,確保能跑起來(lái)。
主持人:至少要能跑。
Peter:對(duì)。哪怕是寫(xiě)一個(gè) Mac 應(yīng)用也是一樣。就像我前兩天在 debug 一個(gè)問(wèn)題:同樣的 TypeScript 代碼,在 CLI 里能找到遠(yuǎn)程網(wǎng)關(guān),但在 Mac app 里不行。Mac app 的 debug 特別煩,你得編譯、啟動(dòng)、點(diǎn)來(lái)點(diǎn)去才知道不對(duì)。
所以我干脆說(shuō):“你給我做一個(gè) CLI 調(diào)試工具,走完全相同的代碼路徑,我可以直接調(diào)用。”然后就讓它自己跑、自己改。它跑了一個(gè)小時(shí),最后告訴我這是一個(gè) race condition 和一個(gè)配置錯(cuò)誤。聽(tīng)起來(lái)也很合理。我不需要親眼看它怎么寫(xiě)代碼,只要閉環(huán)跑通了就行。
主持人:你其實(shí)是因?yàn)榇詈昧蓑?yàn)證閉環(huán),所以你信任它。這和在大公司里做項(xiàng)目有點(diǎn)像,所有測(cè)試都過(guò)了,并不代表百分百?zèng)]問(wèn)題,但已經(jīng)是一個(gè)很強(qiáng)的信號(hào)了,至少有人替你想過(guò)、測(cè)過(guò)。
Peter:即便在我最新的項(xiàng)目里,也照樣會(huì)有 bug。比如 Antigravity 在工具調(diào)用的循環(huán)格式上有些奇怪的行為,你得做過(guò)濾。我一開(kāi)始被折騰了很久,后來(lái)突然意識(shí)到:我為什么不把這事自動(dòng)化?
于是我直接跟 Codex 說(shuō):“設(shè)計(jì)一套 live test,起一個(gè) Docker 容器,把整個(gè)系統(tǒng)裝起來(lái),跑一個(gè)完整 loop,用指定文件里的 API key,然后讓模型讀一張圖片,生成一張新圖片,再反過(guò)來(lái)分析結(jié)果。”
這個(gè)過(guò)程跑得很慢,但它把我所有 API key 都測(cè)了一遍,從 Anthropic 到 OpenAI 再到 GLM,所有細(xì)節(jié)問(wèn)題全修了,因?yàn)殚]環(huán)是完整的。
主持人:你說(shuō)的“閉環(huán)”,本質(zhì)上就是讓 agent 能驗(yàn)證自己的工作。
Peter:沒(méi)錯(cuò)。這也是為什么現(xiàn)在這些模型特別擅長(zhǎng)寫(xiě)代碼,但寫(xiě)創(chuàng)意內(nèi)容反而一般,因?yàn)榇a是可驗(yàn)證的:能編譯、能 lint、能跑、能看輸出,只要你設(shè)計(jì)得好,就能形成一個(gè)完美的反饋回路。我甚至?xí)押诵倪壿嫸荚O(shè)計(jì)成可以用 CLI 跑,因?yàn)闉g覽器那一套循環(huán)太慢了,你要的是快速反饋。
主持人:所以有些東西其實(shí)沒(méi)怎么變:比如后端、業(yè)務(wù)邏輯這種,本來(lái)就更容易驗(yàn)證。
Peter:反而有個(gè)挺反直覺(jué)的點(diǎn):用這種方式寫(xiě)代碼,會(huì)讓你變成一個(gè)更好的工程師。因?yàn)槟惚仨毎鸭軜?gòu)想清楚,才能更容易驗(yàn)證,而驗(yàn)證正是把事情做對(duì)的關(guān)鍵。
主持人:這其實(shí)和 AI 之前是一樣的。做復(fù)雜系統(tǒng)的人,一開(kāi)始就會(huì)想怎么讓它可測(cè)試、接口怎么設(shè)計(jì)、要不要 mock、要不要端到端測(cè)試。這些都是非常困難、而且一旦做了就很難改的決策。
Peter:軟件還是軟件。我現(xiàn)在可以很坦然地說(shuō),我不再親手寫(xiě)代碼了,但我寫(xiě)的代碼質(zhì)量比以前更好。而以前我已經(jīng)寫(xiě)得很好了。在公司那會(huì)兒,測(cè)試常常很痛苦,各種邊界條件、分支爆炸。
主持人:除了像 Anders 這種我非常尊敬堅(jiān)持 test-first 的人,大多數(shù)開(kāi)發(fā)者其實(shí)都不愛(ài)寫(xiě)測(cè)試。我自己也是。測(cè)試和文檔對(duì)我來(lái)說(shuō)從來(lái)不是一種創(chuàng)作。
Peter:現(xiàn)在完全不一樣了。我最近一個(gè)項(xiàng)目的文檔質(zhì)量是我職業(yè)生涯里最好的,但我一行都沒(méi)寫(xiě)。我只是跟模型講清楚設(shè)計(jì)權(quán)衡:為什么這么做,然后讓它寫(xiě)給新手看的部分,再在后面加上更技術(shù)化的細(xì)節(jié),效果好得驚人。測(cè)試也是一樣。每做一個(gè)功能,我就會(huì)自然地問(wèn):這個(gè)怎么測(cè)?如果換一種結(jié)構(gòu),是不是更好測(cè)?因?yàn)槲夷X子里始終只有一件事:怎么把閉環(huán)關(guān)上。模型必須能自己驗(yàn)證結(jié)果,這會(huì)反過(guò)來(lái)逼我做出更好的架構(gòu)。
為什么開(kāi)發(fā)者 AI 編程玩不溜?
主持人:那你覺(jué)得,為什么還有很多經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,對(duì) AI 這套東西依然很抗拒?
Peter:前陣子我看到一篇博文,作者是我非常尊敬的人。他測(cè)試了好幾個(gè)模型,其中甚至包括一些本來(lái)就不適合寫(xiě)代碼的模型。他的做法聽(tīng)起來(lái)像是隨便寫(xiě)個(gè) prompt,在網(wǎng)頁(yè)上點(diǎn)發(fā)送,拿結(jié)果就跑,甚至都不編譯,結(jié)果當(dāng)然很失望。
但問(wèn)題是:你覺(jué)得自己第一次寫(xiě)代碼就能沒(méi) bug 嗎?這些模型,本質(zhì)上是人類知識(shí)的幽靈。它們不可能一次就對(duì),所以你必須有反饋閉環(huán)。你也不能只發(fā)一個(gè) prompt,而是要開(kāi)始一段對(duì)話。
他還抱怨模型用了舊 API。但你沒(méi)告訴它 macOS 版本,它當(dāng)然會(huì)默認(rèn)用老 API。模型訓(xùn)練的數(shù)據(jù)里,舊數(shù)據(jù)本來(lái)就比新數(shù)據(jù)多。你越理解這些“小怪獸”是怎么思考的,你的 prompting 就越好。
但他可能只玩了一天,就下結(jié)論說(shuō)這東西不行。這就好比你會(huì)彈吉他,我把你放到鋼琴前,你隨便敲兩下說(shuō)“這不行,我還是回去彈吉他吧”。這是另一種構(gòu)建方式,另一種思維方式。
你不知道我凌晨三點(diǎn)對(duì)著 Claude Code 吼過(guò)多少次。后來(lái)我慢慢搞明白了:它真的就是嚴(yán)格按我說(shuō)的話在做事。甚至有時(shí)候你可以直接問(wèn)它:你為什么這么理解?
在最近一個(gè)項(xiàng)目里,我感覺(jué)自己更像一個(gè)“人肉合并按鈕”。社區(qū)很活躍,我?guī)缀跻恢痹?review PR。一開(kāi)始它經(jīng)常只 cherry-pick 一部分就關(guān) PR,我被氣得不行。后來(lái)我問(wèn)它為什么,它會(huì)說(shuō):因?yàn)槟阒斑@么說(shuō)過(guò),我就這么理解。
慢慢地,我學(xué)會(huì)了這門“機(jī)器語(yǔ)言”,調(diào)整我的表達(dá),現(xiàn)在它幾乎每次都能給我想要的結(jié)果。這和任何技能一樣,是可以練出來(lái)的。
主持人:這和 Simon Willison 說(shuō)的也很像:用得越久,越能意識(shí)到自己還能做得更好。那我們來(lái)做個(gè)更極端的假設(shè)。你現(xiàn)在做的 ClawdBot 很火、用戶很多,但還不是像 PSPDFKit 那樣直接承載大量收入的業(yè)務(wù)。如果今天 PSPDFKit 從世界上消失了,你要從零重建它,手上有現(xiàn)在這些 agent,你會(huì)怎么做?你會(huì)把什么交給 AI?什么一定要自己把控?團(tuán)隊(duì)結(jié)構(gòu)會(huì)變成什么樣?
Peter:今天的話,我大概用三成的人就能跑起一家公司。但前提是,這些人必須非常資深,既懂系統(tǒng)又敢于放手,知道哪些地方重要,哪些地方可以“vibe”一下。
這一點(diǎn)我在 AI 圈里其實(shí)不太常見(jiàn)。Twitter 上太多聲音很大、但明顯不知道自己在干什么的人,還有很多我覺(jué)得挺荒唐的概念。比如某些用來(lái)繞 Opus 限制的復(fù)雜流程,Codex 根本用不著。
軟件開(kāi)發(fā)很少是那種“列一個(gè)超長(zhǎng)任務(wù)清單,然后全部自動(dòng)執(zhí)行”的問(wèn)題。我看到很多人搭了一整套復(fù)雜的編排系統(tǒng):自動(dòng)建 ticket、agent 處理 tickets、agent 互相發(fā)郵件,最后搞出一團(tuán)復(fù)雜系統(tǒng)。圖什么?這本質(zhì)上就是瀑布模型,我們?cè)缇椭浪缓糜谩?/p>
對(duì)我來(lái)說(shuō),開(kāi)發(fā)必須從一個(gè)模糊的想法開(kāi)始。我甚至?xí)室馍俳o prompt,讓 agent 先做點(diǎn)“不太對(duì)”的東西,因?yàn)榭赡馨顺啥际抢鞘O碌膬沙蓵?huì)給我新的啟發(fā),然后我不斷迭代、塑形。
我得點(diǎn)它、用它、感受它。好軟件需要“品味”,而這是 AI 現(xiàn)在最欠缺的部分。但好處是,現(xiàn)在做一個(gè)功能太容易了,不行就扔掉,或者重新 prompt。我的構(gòu)建方式幾乎總是向前的,很少回滾。就像雕塑一樣:你拿著一塊石頭,一點(diǎn)點(diǎn)敲,慢慢地,形狀就從大理石里浮現(xiàn)出來(lái)了。
主持人:回過(guò)頭看軟件工程的變化,好像有一個(gè)很明顯的轉(zhuǎn)折點(diǎn)。過(guò)去沒(méi)有 AI、沒(méi)有這些 agent 的時(shí)候,前期規(guī)劃非常重要。你覺(jué)得現(xiàn)在這種變化,是因?yàn)閷?xiě)代碼本身的成本大幅下降了嗎?
Peter:我現(xiàn)在還是會(huì)做規(guī)劃,但投入的精力沒(méi)以前那么多了。因?yàn)楝F(xiàn)在試錯(cuò)太便宜了,你可以直接做出來(lái)看看效果,再判斷“這個(gè)形態(tài)行不行”“是不是需要微調(diào)”,甚至“干脆完全換一條路”。相比過(guò)去,這一切的成本低到一個(gè)程度,讓整個(gè)過(guò)程變得更像是在玩。
主持人:對(duì),就像以前哪怕是交給一個(gè)剛畢業(yè)的新人或者實(shí)習(xí)生,一件事也得花一兩天。現(xiàn)在不是一天兩天,而是分鐘級(jí)。就算是比較長(zhǎng)的任務(wù),最多也就是十幾二十分鐘。而且你還不是干等著,一個(gè)任務(wù)在跑,另外幾個(gè)也在并行跑,所以試錯(cuò)本身幾乎不算浪費(fèi)。
Peter:是的。最早我在 Claude 里其實(shí)假設(shè)只有一個(gè) agent,后來(lái)變成多個(gè);一開(kāi)始假設(shè)只有一個(gè) provider,比如 WhatsApp,后來(lái)又變成支持多個(gè)。這種改動(dòng),如果是我自己手寫(xiě)代碼,簡(jiǎn)直是災(zāi)難,要把邏輯貫穿整個(gè)系統(tǒng)重新織(weaving)一遍。但 Codex 花了大概幾個(gè)小時(shí)就搞定了,這要是我自己來(lái)至少得兩周。所以以前那種“前期一定要一次想對(duì)”的心態(tài)是現(xiàn)實(shí)所迫,現(xiàn)在我知道,很多東西是可以改的。
這也讓技術(shù)債的處理變得輕松很多。你可以一邊做,一邊重新理解項(xiàng)目本身,一邊調(diào)整你的思路。所以我其實(shí)不太相信那種“按 spec 寫(xiě)完,機(jī)器跑完就結(jié)束”的模式。你在真正開(kāi)始構(gòu)建之前,根本不可能完全知道自己要做什么。很多關(guān)鍵認(rèn)知,都是在構(gòu)建過(guò)程中才出現(xiàn)的,它們又會(huì)反過(guò)來(lái)影響系統(tǒng)最終的形態(tài)。
對(duì)我來(lái)說(shuō),這更像一個(gè)循環(huán),你不是直線爬山而是繞著走,有時(shí)候還會(huì)偏離一下路徑,但最終還是會(huì)到達(dá)山頂。
ClawdBot 來(lái)了
主持人:我們換個(gè)話題。你已經(jīng)連續(xù)幾個(gè)月幾乎不間斷地在做 ClawdBot。其實(shí)有一個(gè)想法很早就把你拉回來(lái)了,對(duì)吧?你一直想做一個(gè)“超個(gè)人化”的助理。
Peter:對(duì),而且不是那種每天早上給你發(fā)“早安,這是你今天三件待辦事項(xiàng)”的助理。
我想要的是一個(gè)真正理解我的東西,比如我見(jiàn)了一個(gè)朋友回家后它會(huì)問(wèn)我:“剛剛那次見(jiàn)面感覺(jué)怎么樣?”或者有一天提醒我:“你已經(jīng)三周沒(méi)給 Thomas 發(fā)消息了,我注意到他最近在城里,要不要打個(gè)招呼?”又或者它會(huì)發(fā)現(xiàn)某些模式,比如“你每次提到這個(gè)人語(yǔ)氣都會(huì)變,為什么?”
那是一種極度個(gè)人化的東西,幾乎是反 CRM 的存在,有點(diǎn)像電影《Her》,但這確實(shí)是技術(shù)發(fā)展的方向。模型對(duì)文本的理解能力非常強(qiáng),上下文越大它們看到的模式就越多。即便它們本質(zhì)上只是矩陣計(jì)算、沒(méi)有靈魂,但很多時(shí)候給人的感覺(jué)已經(jīng)完全不一樣了。
當(dāng)時(shí)我甚至為這個(gè)想法注冊(cè)了一家公司,叫 Amantus Machina,意思是“有愛(ài)的機(jī)器”。但去年夏天我真正深入做的時(shí)候,發(fā)現(xiàn)模型還差一點(diǎn)。能跑起來(lái)也有一些驚喜,但整體上還站在我需求的邊緣之外。不過(guò)這反而讓我很興奮,因?yàn)?AI 的進(jìn)展太快了,我很清楚這個(gè)想法可以晚點(diǎn)再回來(lái)做。
還有一個(gè)判斷是,我相信所有大型公司都在做個(gè)人助理。未來(lái)每個(gè)人都會(huì)有一個(gè)“最懂你的朋友”,它是臺(tái)機(jī)器,了解你的一切、可以替你做事、能主動(dòng)提醒你。當(dāng)然,這會(huì)非常消耗算力,但凡是負(fù)擔(dān)得起的人,都會(huì)想要一個(gè)。然后隨著系統(tǒng)效率提高、芯片進(jìn)步,這種能力一定會(huì)逐步下沉。這幾乎是確定的趨勢(shì),而且現(xiàn)在已經(jīng)能看到一些雛形了,比如 OpenAI 推出的一些偏生產(chǎn)力的功能。但現(xiàn)在算力還不夠,把這種東西真正作為產(chǎn)品推出來(lái)非常難。
而且還有一個(gè)問(wèn)題是,我其實(shí)更希望它跑在我自己的電腦上,數(shù)據(jù)真正屬于我自己。把郵件、日歷、約會(huì)軟件全部交給 OpenAI 或 Anthropic,說(shuō)實(shí)話,挺嚇人的,很多人已經(jīng)在把這些模型當(dāng)作心理咨詢師用了,而且效果出奇地好。它非常會(huì)傾聽(tīng),能理解你的困擾,只要不是某些明顯差勁的版本,它真的能提出很有洞察力的問(wèn)題,哪怕只是幫你復(fù)述和反思,你都會(huì)感覺(jué)被理解了。
所以我一直有這個(gè)助理的想法,只是當(dāng)時(shí)技術(shù)還沒(méi)到位。與此同時(shí),我也做了很多別的有趣的東西。在職業(yè)里繞一點(diǎn)“vibe 的彎路”,不斷給自己造工具,優(yōu)化自己的工作流,這幾乎是成為一個(gè)真正工程師的必經(jīng)階段。
但“超個(gè)人化 agent”這個(gè)念頭一直沒(méi)消失。最近幾個(gè)月,我終于開(kāi)始認(rèn)真把它做出來(lái)。一開(kāi)始它的規(guī)模其實(shí)很小,我甚至叫它 WhatsApp Relay,本意只是通過(guò) WhatsApp 觸發(fā)我電腦上的一些操作。
后來(lái)我去摩洛哥給朋友過(guò)生日,一整天都在外面,就一直用 WhatsApp 跟這個(gè) agent 聊天。它幫我指路、開(kāi)玩笑,還能用我的身份給其他朋友發(fā)消息。那一刻我真的被震住了。最早的實(shí)現(xiàn)非常粗糙,我甚至沒(méi)用正式的方式傳圖片,只是丟了個(gè)字符串,讓它自己用工具去讀。
有一次我隨手發(fā)了一條語(yǔ)音,其實(shí)我根本沒(méi)實(shí)現(xiàn)語(yǔ)音功能。結(jié)果過(guò)了半分鐘,它居然回了我一條語(yǔ)音。
我問(wèn)它怎么做到的,它說(shuō):你發(fā)了一個(gè)文件,我看了 headers,發(fā)現(xiàn)是 Ogg 格式,就用 ffmpeg 轉(zhuǎn)了一下;然后我找你電腦上的語(yǔ)音識(shí)別工具,沒(méi)裝,但我發(fā)現(xiàn)了一個(gè) OpenAI 的 endpoint,于是用 curl 調(diào)了接口。
那一刻我真的覺(jué)得不可思議。這就是 Opus 的能力,它太“能自己想辦法”了。
我開(kāi)始徹底上癮。我讓它叫我起床,它跑在倫敦的 Mac Studio 上,通過(guò) SSH 連到我在摩洛哥的 MacBook,幫我開(kāi)音樂(lè),因?yàn)槲覜](méi)回應(yīng)就一直把音量調(diào)大。
我還加了一個(gè) heartbeat。這簡(jiǎn)直瘋了,你每隔幾分鐘就給一個(gè)模型發(fā)“想點(diǎn)酷的事情,給我點(diǎn)驚喜”的 prompt,這可能是史上最貴的鬧鐘,但它真的“懂”了。我那段時(shí)間腳受了傷需要很早起床,卻一直沒(méi)回應(yīng),它的推理過(guò)程非常清楚:“Peter 沒(méi)回復(fù),他必須起床,不能再睡了。”我把這個(gè)東西給朋友們看,所有人都被吸引住了,覺(jué)得這太神奇了。我自己也一樣。
后來(lái)我發(fā)到 Twitter 上,反而反響很冷,因?yàn)楹芏嗳送耆床欢@是什么。我感覺(jué),這可能是一種全新的產(chǎn)品類別,大家還沒(méi)有形成認(rèn)知。
主持人:這有點(diǎn)像你當(dāng)年第一次接觸 iPhone 的經(jīng)歷。廣告、電視、各種宣傳你都看過(guò)了,但真正的變化,其實(shí)還是在你親手用上它之后。
Peter:對(duì),必須得用。我真正全力投入也就是最近這幾個(gè)月,一開(kāi)始它還叫 VA Relay,后來(lái)我自己都覺(jué)得這個(gè)名字不對(duì)勁了,因?yàn)楣δ茉缇筒恢惯@些了,已經(jīng)接了 Telegram,還有一堆別的東西,再叫 Relay 完全不貼切。所以我給它改了個(gè)名字,叫 ClawdBot。算是個(gè)內(nèi)部玩笑,我很喜歡《Doctor Who》,而且這個(gè)名字域名更好,也更能解釋這個(gè)產(chǎn)品是什么。
與此同時(shí),我也在悄悄搭建我的“軍隊(duì)”。要讓這套東西真正跑起來(lái),核心原則就是:一切都得是 CLI。所以我寫(xiě)了大量 CLI 控制 Google、床、燈、音樂(lè),所有東西都變成命令行。
為什么是 CLI,不是 MCP
主持人:那為什么是 CLI?為什么不是 MCP?你怎么看 MCP 這套東西?
Peter:說(shuō)實(shí)話,MCP 更像是一根拐杖。它最大的正面價(jià)值是逼著公司去開(kāi)放更多 API。但整個(gè)設(shè)計(jì)思路本身是有問(wèn)題的:你得在會(huì)話一開(kāi)始,就把所有工具、所有函數(shù)、所有說(shuō)明一次性塞進(jìn)上下文,然后模型還得精確地構(gòu)造一大坨調(diào)用參數(shù),再接收一大坨返回。
問(wèn)題是,模型其實(shí)特別擅長(zhǎng)用 bash。舉個(gè)例子,你要一個(gè)天氣服務(wù),模型先問(wèn)“有哪些城市”,接口一次性給你幾百個(gè)城市;模型沒(méi)法過(guò)濾,只能全吃進(jìn)去。然后你再問(wèn)“給我 London 的天氣”,返回溫度、風(fēng)速、降雨、幾十個(gè)你根本不關(guān)心的字段,最后上下文里全是垃圾信息。但如果是 CLI,模型可以直接用 jq,只拿它真正需要的那一小部分。
主持人:聽(tīng)起來(lái)問(wèn)題并不是 MCP 本身,而是所有東西都必須提前塞進(jìn)上下文。如果能按需發(fā)現(xiàn)、按需調(diào)用,理論上是能解決的?
Peter:現(xiàn)在大家確實(shí)在往這個(gè)方向做,但還有一個(gè)根本問(wèn)題:你沒(méi)法“鏈?zhǔn)浇M合”。
我不能寫(xiě)一個(gè)腳本說(shuō):“找出所有溫度超過(guò)二十五度的城市,再過(guò)濾字段,再把結(jié)果打包成一個(gè)命令。”因?yàn)?MCP 本質(zhì)上都是孤立的工具,沒(méi)法腳本化。
主持人:但這聽(tīng)起來(lái)更像是時(shí)間問(wèn)題。就像現(xiàn)在我們做一個(gè)天氣應(yīng)用,本來(lái)就要選 API、比較價(jià)格、覆蓋范圍,然后再把不同 API 的結(jié)果串起來(lái)。這套事情在沒(méi)有 AI 的年代已經(jīng)解決過(guò)了。
Peter:是的,AI 時(shí)代遲早也會(huì)解決。只是形式還沒(méi)定。我自己干脆寫(xiě)了個(gè)小工具,叫 Porter,用 TypeScript,把 MCP 轉(zhuǎn)成 CLI,直接打包用。
主持人:所以你的結(jié)論是至少現(xiàn)在,CLI 的效率更高?
Peter:對(duì)。ClawdBot 里我其實(shí)根本沒(méi)直接支持 MCP,但通過(guò) Porter,幾乎可以用任何 MCP。你甚至可以在手機(jī)上說(shuō):“用 Vercel 的 MCP 做這個(gè)事情。”它會(huì)自己去網(wǎng)站找 MCP、加載、按需使用。而現(xiàn)在很多 MCP 方案,甚至還得重啟 Claude Code,用戶體驗(yàn)非常糟,所以我就一路把自動(dòng)化堆起來(lái),工作量非常大。
Taylor 前幾天還做了個(gè)視頻,說(shuō)“這個(gè)人瘋了”,因?yàn)楝F(xiàn)在支持的東西已經(jīng)多到離譜。但我自己在用 agent 的過(guò)程中只會(huì)不斷冒出一個(gè)念頭:我還想讓它多做一點(diǎn)。
前段時(shí)間我干了一件“非常不理智”的事:我建了一個(gè) Discord,把我的 agent 加了進(jìn)去。有人給項(xiàng)目貢獻(xiàn)了 Discord 支持,我當(dāng)時(shí)其實(shí)很猶豫要不要合并,但最后還是合并了。結(jié)果就是我把一個(gè)擁有我電腦完整讀寫(xiě)權(quán)限的 agent,扔進(jìn)了一個(gè)公開(kāi)的 Discord。
把復(fù)雜度隱藏到讓人覺(jué)得“理所當(dāng)然”
主持人:聽(tīng)起來(lái)完全不像是個(gè)好主意。
Peter:對(duì),簡(jiǎn)直瘋狂。但后來(lái)有人進(jìn)來(lái),看到我用它檢查攝像頭、做家庭自動(dòng)化、幫我放音樂(lè)。我在廚房里,跟它說(shuō)“看我的屏幕”,它就真的看到了。因?yàn)樗型暾麢?quán)限,可以點(diǎn)終端、替我打字、執(zhí)行命令。你甚至可以對(duì)它說(shuō)“做這個(gè)做那個(gè)”,它就照著屏幕操作。
我現(xiàn)在還在優(yōu)化,理想狀態(tài)當(dāng)然是純文本流,但現(xiàn)在這種方式已經(jīng)能跑了,而且是后臺(tái)默默在跑。任何體驗(yàn)過(guò)幾分鐘的人都會(huì)上癮,項(xiàng)目的 star 數(shù)一周內(nèi)從一百漲到三千多,我已經(jīng)合并了 500 多個(gè) PR。所以,我現(xiàn)在感覺(jué)自己就是個(gè)人肉 merge 按鈕,整個(gè)人狀態(tài)都有點(diǎn)散。
但這正是它的美妙之處:技術(shù)本身消失了。你只是拿著手機(jī),像跟一個(gè)朋友聊天。這個(gè)“朋友”無(wú)所不能:能訪問(wèn)你的郵件、日歷、文件,能給你搭網(wǎng)站、能做行政工作、能爬網(wǎng)頁(yè)、能給朋友打電話,甚至能幫你打電話給商家訂位。我正準(zhǔn)備合并通話功能。
你完全不用關(guān)心算力、上下文、子 agent。它們?cè)诤笈_(tái)瘋狂運(yùn)轉(zhuǎn),只為了讓你覺(jué)得“一切都很簡(jiǎn)單”。我還有一套記憶系統(tǒng),當(dāng)然不完美,但已經(jīng)足夠讓人覺(jué)得像是魔法。
現(xiàn)在我走在路上,看到一個(gè)活動(dòng),隨手給 Claude 發(fā)張照片。它不僅能告訴我這個(gè)活動(dòng)的評(píng)價(jià),還會(huì)檢查我日歷有沒(méi)有沖突、朋友有沒(méi)有提過(guò)。因?yàn)樗莆樟舜罅可舷挛模o出的回答,已經(jīng)完全不是那種“各自待在小盒子里的工具”能比的。
主持人:聽(tīng)起來(lái)你已經(jīng)做出了 Apple 想讓 Siri 成為、卻始終沒(méi)做到的東西。
Peter:老實(shí)說(shuō),我可能是 Anthropic 最好的銷售。我都不知道有多少人因?yàn)?ClawdBot 去買了 200 美元的訂閱,有些人甚至多開(kāi)了一個(gè)賬號(hào)。不是因?yàn)槟P汀袄速M(fèi) token”,而是大家太愛(ài)用了,用得太頻繁。而且由于復(fù)雜性被完全隱藏,他們根本感覺(jué)不到后臺(tái)有多少子 agent 在忙。
真正難的地方在工程上:如何把復(fù)雜度隱藏到讓人覺(jué)得“理所當(dāng)然”。這才是魔法的來(lái)源。
主持人:但這也很有意思。你在架構(gòu)上投入了這么多思考。現(xiàn)在這個(gè)項(xiàng)目已經(jīng)跑了幾個(gè)月,也確實(shí)爆了。在你腦子里,你是不是很清楚 ClawdBot 的結(jié)構(gòu)?哪些地方該改、哪些地方要重構(gòu)?你會(huì)不會(huì)開(kāi)始擔(dān)心內(nèi)存、token、效率這些問(wèn)題?
Peter:Token 更多是 prompt 和 memory 結(jié)構(gòu)的問(wèn)題。說(shuō)到底,這就是 TypeScript 在搬 JSON。大模型給我文本,我存盤(pán);我再把文本發(fā)到 WhatsApp、Slack、Discord、Signal、iMessage,還有更多渠道在接入。現(xiàn)在結(jié)構(gòu)確實(shí)有點(diǎn)亂,但本質(zhì)上只是文本在不同形態(tài)間流動(dòng)。有多 provider、多 agent、有 agent loop、有配置、有大量 plumbing,但沒(méi)有哪一塊是真的“難”。
主持人:更多是碎片化的復(fù)雜,對(duì)吧?
Peter:對(duì)。真正的難點(diǎn)是:怎么讓它“看起來(lái)像魔法”。我花了大量時(shí)間在安裝和引導(dǎo)體驗(yàn)上。你只需要敲一行命令,我會(huì)檢查你有沒(méi)有 Homebrew、有沒(méi)有 Node,自動(dòng)安裝依賴,兼容老版本;然后引導(dǎo)你選模型,能自動(dòng)識(shí)別你已經(jīng)裝了什么,基本就是一路按回車。
接著你填個(gè)手機(jī)號(hào),WhatsApp 就能直接用。我會(huì)問(wèn)你要不要“給它起名字”,然后終端里會(huì)彈出一個(gè) TUI,讓你完成這一步。我還加了一個(gè) bootstrap 階段:模型一開(kāi)始不會(huì)假裝自己“有靈魂”,而是通過(guò)一輪對(duì)話慢慢理解你;然后它會(huì)把 bootstrap 文件刪掉,生成 user.md、soul.md、identity 文件,記錄你的偏好、價(jià)值觀、內(nèi)部玩笑。
這些文件不是靜態(tài)的,它們會(huì)隨著你們的互動(dòng)不斷演化。等這一切結(jié)束,你只是用 WhatsApp 跟它聊天,但你已經(jīng)不再覺(jué)得自己是在跟“GPT 某個(gè)版本”說(shuō)話,而是在跟一個(gè)真正的“朋友”交流。配置不需要你手改,因?yàn)?agent 能改自己。你甚至可以對(duì)它說(shuō)“更新一下自己”,它就會(huì)拉最新版本、更新完再回來(lái)告訴你。
這就是我說(shuō)的魔法:當(dāng)復(fù)雜度被隱藏到極致,體驗(yàn)才會(huì)真的發(fā)生變化。
主持人:這聽(tīng)起來(lái)其實(shí)很像你當(dāng)年做 PSPDFKit 的思路,對(duì)吧?你把 PDF 那套復(fù)雜性完全“融”掉了,用戶只需要直接用,旋轉(zhuǎn)、編輯,一切都很自然地發(fā)生。
Peter:對(duì),甚至在當(dāng)年的 API 層面就是這么想的。
你的工作流程,公司能套用嗎
主持人:我們把話題拉回到軟件工程本身。你現(xiàn)在做的已經(jīng)是一個(gè)真實(shí)在跑的產(chǎn)品了,是生產(chǎn)軟件,大家在用,你也在不斷 merge PR。回頭看 PSPDFKit 那樣的公司,幾十人、上百人的團(tuán)隊(duì)在維護(hù)成熟系統(tǒng)。基于你現(xiàn)在構(gòu)建 ClawdBot 的方式、你用的這些工具,你覺(jué)得大型公司的軟件工程方式會(huì)發(fā)生什么變化?
我明顯感受到一個(gè)割裂:像你這樣的個(gè)人,AI 對(duì)生產(chǎn)力的提升是巨大的,你完全掌控;但在團(tuán)隊(duì)或公司層面,尤其是有大量歷史代碼的情況下,一切就慢很多。不是說(shuō)他們不用 AI,而是感覺(jué)兩個(gè)世界之間有一道鴻溝。你當(dāng)過(guò) CEO,你怎么看?這是結(jié)構(gòu)性問(wèn)題,還是只是時(shí)間問(wèn)題,就像每一代新技術(shù),先被一小撮人玩明白?
Peter:我覺(jué)得,大多數(shù)公司要高效采用 AI,會(huì)非常非常難,因?yàn)檫@不僅是工具問(wèn)題,而是要求你重新定義“公司是怎么運(yùn)作的”。
你想想,在 Google 這種地方,你要么是工程師,要么是經(jīng)理;你想順手決定一下 UI 什么樣?對(duì)不起,不行。要么你寫(xiě)代碼,要么你做設(shè)計(jì),角色邊界非常清楚。
但在這個(gè)新世界里,你需要的是有完整產(chǎn)品視角的人,能把事情從頭做到尾。這樣的人數(shù)量會(huì)少得多,但要求極高:高自主性、高能力。極端一點(diǎn)說(shuō),公司規(guī)模可能只需要現(xiàn)在的三成。這聽(tīng)起來(lái)就很嚇人了,經(jīng)濟(jì)上也一定會(huì)帶來(lái)巨大的沖擊,很多人會(huì)發(fā)現(xiàn)自己在這個(gè)新世界里找不到位置。
所以我一點(diǎn)都不意外,現(xiàn)有的大公司用不好 AI。他們當(dāng)然也在用,但只是“用到一點(diǎn)”。要真正發(fā)揮作用,你得先來(lái)一次大重構(gòu),不只是代碼層面的,也是組織層面的。
我現(xiàn)在設(shè)計(jì)代碼庫(kù),已經(jīng)不是為了“對(duì)我來(lái)說(shuō)順不順手”,而是為了“對(duì) agent 來(lái)說(shuō)順不順手”。我優(yōu)化的是模型摩擦最小、跑得最快的路徑,而不一定是我個(gè)人最偏好的寫(xiě)法。因?yàn)樽罱K是它在跟代碼打交道,不是我。我負(fù)責(zé)的是整體結(jié)構(gòu)和架構(gòu),這部分我還是按自己的方式來(lái)。
現(xiàn)在所有東西都要“可被解析”。PR 在我眼里,越來(lái)越像是 Prompt Request。有人提了一個(gè) PR,我很少直接在那個(gè) PR 上改。我會(huì)先說(shuō)聲謝謝,理解這個(gè)功能想干嘛,然后拉著 agent 從這個(gè) PR 出發(fā),把功能按我理解的方式重新設(shè)計(jì)一遍。
代碼可能會(huì)復(fù)用一點(diǎn),但更多是把“目標(biāo)”傳達(dá)清楚。有些 PR 在定位 bug 時(shí)確實(shí)很有幫助,但說(shuō)實(shí)話,現(xiàn)在很多 PR 的整體代碼質(zhì)量在下降,因?yàn)榇蠹以诏偪?Vibe Coding。可真正要把功能做對(duì),還是得對(duì)整體設(shè)計(jì)有深刻理解,否則你連怎么引導(dǎo) agent 都不知道,結(jié)果自然就會(huì)很糟。
主持人:對(duì),沒(méi)有一個(gè)完整的反饋閉環(huán),質(zhì)量肯定會(huì)出問(wèn)題。
Peter:是的,對(duì)我來(lái)說(shuō),這種方式效率極高。我記得在 PSPDFKit 的時(shí)候,一個(gè) PR 可能要做一周,評(píng)論、來(lái)回切換上下文、等 CI 四十分鐘……現(xiàn)在不一樣了。我把代碼丟給模型,它會(huì)主動(dòng)提醒我“這個(gè)地方可能會(huì)影響到別的模塊”。我自己也會(huì)有判斷,然后我們一起把它“重塑”成符合我愿景的形態(tài),再把代碼織進(jìn)去。
說(shuō)實(shí)話,我現(xiàn)在寫(xiě)代碼用的動(dòng)詞都變了,“把代碼織進(jìn)現(xiàn)有結(jié)構(gòu)里”,有時(shí)候甚至要先改結(jié)構(gòu),才能讓它裝得進(jìn)去。
主持人:那如果你現(xiàn)在招一兩個(gè)人,變成一個(gè)小團(tuán)隊(duì),你覺(jué)得代碼評(píng)審、CI、CD 這些東西會(huì)怎么變化?
Peter:我其實(shí)沒(méi)那么在意 CI 了。
主持人:你以前在 PSPDFKit 可是非常在意這些的。
Peter:以前是,現(xiàn)在測(cè)試本身我還是在意的,但我用的是本地 CI。我現(xiàn)在有點(diǎn)“異端”了。
agent 會(huì)跑測(cè)試,我不想每次推個(gè)后端 API,都等十分鐘 CI。
主持人:但你已經(jīng)在 agent 那里等了不少時(shí)間了。
Peter:只要本地測(cè)試過(guò)了,我就 merge。偶爾 main 會(huì)出點(diǎn)小問(wèn)題,但通常很接近正確狀態(tài)。
我現(xiàn)在管完整流程叫 “gate”。full gate 就是 lint、build、全測(cè)試跑一遍。它就像一道門,代碼出去之前必須過(guò)這關(guān)。我甚至開(kāi)始用 agent 的語(yǔ)言了:“提交之前,跑一下 full gate。”
主持人:那如果多一個(gè)人一起做,你可能也不會(huì)做傳統(tǒng)的 code review 了?
Peter:我們不會(huì)討論具體代碼,而是討論架構(gòu)、討論大的決策、討論風(fēng)格。比如最近有個(gè) PR 加了語(yǔ)音通話功能,現(xiàn)在我可以直接對(duì) ClawdBot 說(shuō):“幫我給這家餐廳打電話,訂兩個(gè)位置。”這功能很酷,但它是一個(gè)很大的模塊,影響面很廣。
我當(dāng)時(shí)就有點(diǎn)猶豫:這是不是開(kāi)始變成臃腫軟件了?然后我又回到老套路:把它做成一個(gè) CLI。我之前有個(gè)沒(méi)做完的項(xiàng)目正好相關(guān),于是我打開(kāi) Codex,說(shuō):“你看看這個(gè) PR,再看看那個(gè)項(xiàng)目,能不能把這個(gè)功能織進(jìn)去?”對(duì),我又用了“織”這個(gè)詞。對(duì)我來(lái)說(shuō),這已經(jīng)成了一種工作方式。
主持人:就這么繼續(xù)往前推了。
Peter:對(duì),就這么繼續(xù)。我們能不能把這個(gè)功能織進(jìn) CLI 里?利弊分別是什么?然后他們會(huì)跟我說(shuō)可以這樣做、那樣做,也會(huì)給我很坦誠(chéng)的意見(jiàn)。聽(tīng)下來(lái)我會(huì)覺(jué)得,這個(gè)功能其實(shí)是適合放進(jìn)項(xiàng)目里的,而且確實(shí)能帶來(lái)一些如果做成外置 CLI 就拿不到的好處。但我心里還是會(huì)有警惕:我不喜歡臃腫,這會(huì)不會(huì)開(kāi)始變成 bloatware?那能不能搞一個(gè)插件式架構(gòu)?
還有一個(gè)用 AI 的“隱藏技巧”是:多引用別的產(chǎn)品。我經(jīng)常直接跟 agent 說(shuō),你去看這個(gè)文件夾,我當(dāng)初在那兒已經(jīng)把問(wèn)題解決過(guò)了;或者去看那個(gè)地方,之前的思路都在那里。這樣它就能直接理解我當(dāng)時(shí)是怎么想的,我也不用重新解釋一遍。
因?yàn)槿绻以俳忉屢淮危芸赡芊炊鴷?huì)引入偏差,沒(méi)法完全表達(dá)我腦子里的原始想法。
有個(gè)人叫 Shitty Coding Agent 的項(xiàng)目,名字雖然這么叫,其實(shí)一點(diǎn)也不 shitty。他里面有一套插件架構(gòu),可以通過(guò) Git 加載代碼,而且全是 TypeScript。我就跟 agent 說(shuō),“你去看看這個(gè)文件夾、那個(gè)文件夾。”結(jié)果它受到啟發(fā),直接給我設(shè)計(jì)出了一套非常炸裂的插件架構(gòu)。所以本質(zhì)上還是一種直覺(jué)驅(qū)動(dòng)的過(guò)程。我昨晚基本上就是在干這個(gè)。
主持人:聽(tīng)起來(lái),你的整個(gè)工作流已經(jīng)和傳統(tǒng)方式完全不一樣了。PR 在你這里的角色變了,CI 也不一樣了,測(cè)試還在,但更重要的是反饋回路。你用的是“織代碼”,而不是“寫(xiě)代碼”,討論的是架構(gòu)和品味。這對(duì)我來(lái)說(shuō)是一個(gè)非常大的轉(zhuǎn)變。
那我們假設(shè)接下來(lái)你要招一兩個(gè)、三個(gè)工程師,把這個(gè)項(xiàng)目變成一個(gè)真正的團(tuán)隊(duì),甚至一個(gè)業(yè)務(wù), 你會(huì)看重什么樣的能力?如果現(xiàn)在有一個(gè)資深工程師,你會(huì)被什么樣的品質(zhì)吸引?你會(huì)期待他們做過(guò)什么項(xiàng)目,或者具備什么特質(zhì),才能適應(yīng)、或者快速學(xué)會(huì)這種工作方式?
Peter:我會(huì)找那種活躍在 GitHub 上、做開(kāi)源的人。更重要的是,我要感覺(jué)到他們“愛(ài)玩這個(gè)游戲”。在這個(gè)新世界里,學(xué)習(xí)方式就是不斷嘗試,它真的很像一個(gè)游戲:你越玩越熟練,就像學(xué)樂(lè)器一樣,得一直練。
我現(xiàn)在能做到這么快、這么高效,連我自己都覺(jué)得有點(diǎn)不可思議。前幾天我一天之內(nèi)提交了 600 多個(gè) commits,簡(jiǎn)直瘋狂。但它是能跑的,不是那種“看起來(lái)很糟”的代碼。
主持人:對(duì),這背后是大量的技能積累。
Peter:是的,但真的很累,你必須去玩這些技術(shù)、去學(xué)習(xí)。一開(kāi)始一定會(huì)很挫敗,就像你第一次去健身房又累又痛,但很快你就會(huì)變強(qiáng),你會(huì)感覺(jué)到工作流在加速,能明顯看到進(jìn)步,然后你就慢慢上癮了。所以,一邊玩,一邊拼命干。
主持人:你現(xiàn)在投入的時(shí)間,明顯比以前多了。
Peter:我從來(lái)沒(méi)像現(xiàn)在這么拼過(guò)。就算當(dāng)年我有公司,也沒(méi)這么拼。不是因?yàn)槲冶仨氝@么做,而是因?yàn)檫@件事太上癮、太好玩了。再加上現(xiàn)在正好有勢(shì)能,有一群人在推著我往前走。
年輕人的建議
主持人:是不是也因?yàn)槟闵虡I(yè)嗅覺(jué)很好?你能看出來(lái)什么時(shí)候有機(jī)會(huì)、什么時(shí)候窗口期打開(kāi)了。
你剛才提到,現(xiàn)在“公開(kāi)做事”這件事本身就很新穎。你也說(shuō),就算你現(xiàn)在想招人,其實(shí)也很難,因?yàn)檎嬲_(kāi)、高頻使用這些工具的人并不多。但可能兩三年后,大家都會(huì)這么做,這個(gè)優(yōu)勢(shì)也就沒(méi)了。還有一群人很焦慮的,是應(yīng)屆生、沒(méi)什么經(jīng)驗(yàn)的新人。畢竟你是在成為資深工程師之后,AI 才出現(xiàn)的,你有大量積累可以借力。
如果你把自己放回到那個(gè)階段,基于你現(xiàn)在知道的一切,你會(huì)建議他們?nèi)プ鍪裁矗渴谴蚝密浖こ袒竟Γ€是直接擁抱 agent,還是兩者結(jié)合?
Peter:我會(huì)建議他們保持無(wú)限的好奇心。毫無(wú)疑問(wèn),進(jìn)入這個(gè)市場(chǎng)一定會(huì)更難,你必須通過(guò)不斷做東西來(lái)積累經(jīng)驗(yàn)。我不覺(jué)得一定要寫(xiě)很多代碼,但你得去接觸復(fù)雜的開(kāi)源項(xiàng)目,去讀、去理解。
你現(xiàn)在有一臺(tái)無(wú)限耐心的機(jī)器,可以把任何東西給你講清楚,你可以不停地問(wèn):為什么要這么設(shè)計(jì)?為什么當(dāng)初要這么做?慢慢建立起系統(tǒng)級(jí)理解。但這一切都依賴真實(shí)的好奇心,而我不覺(jué)得現(xiàn)在的大學(xué)真的很擅長(zhǎng)教這個(gè)。通常,這種能力都是在痛苦中學(xué)會(huì)的。
對(duì)新人來(lái)說(shuō)不會(huì)輕松,但他們也有一個(gè)優(yōu)勢(shì):他們沒(méi)有被“舊經(jīng)驗(yàn)”污染。就像小孩子一樣,他們會(huì)用 agent 做出我們根本想不到的事情,因?yàn)樗麄儾恢馈斑@事不該這么做”。而等他們這么做的時(shí)候,往往已經(jīng)能跑通了。
主持人:而且他們身邊的朋友也都在用這些工具。
Peter:對(duì)。前幾天我有個(gè)小的菜單欄應(yīng)用,用來(lái)統(tǒng)計(jì) Cursor、Claude Code 這些成本,跑得有點(diǎn)慢。我本能反應(yīng)是:好,打開(kāi) Instruments,開(kāi)始點(diǎn)。結(jié)果他們直接在終端里把 profiling 全做了,連 Instruments 都不用開(kāi),就直接給我提了優(yōu)化方案,還順帶把性能搞快了。我完全被震住了。
主持人:我覺(jué)得我們可能低估了進(jìn)入這個(gè)行業(yè)的年輕人的能力和資源整合水平。很多偉大的公司創(chuàng)始人都非常年輕,當(dāng)時(shí)經(jīng)驗(yàn)也不多,但熱情極強(qiáng)。對(duì)我來(lái)說(shuō),最沖擊的還是你提到的這些變化:不再依賴 PR,不做傳統(tǒng) code review。這些東西陪伴了你十五年以上,也是 PSPDFKit 成功的重要基石。
Peter:是的,現(xiàn)在需要一整套新東西。哪怕現(xiàn)在有人給我提 PR,我更關(guān)心的其實(shí)是 prompt,而不是代碼。我會(huì)讓大家把 prompt 也一起提交,有些人會(huì)這么做。
我讀 prompt 的時(shí)間,比讀代碼還多。因?yàn)槟鞘歉咝盘?hào)的信息:你是怎么得到這個(gè)結(jié)果的?你問(wèn)了什么問(wèn)題?中間做了多少引導(dǎo)?這比最終代碼本身更能幫我判斷質(zhì)量。
如果有人想要一個(gè)新功能,我甚至直接要一個(gè)“Prompt Request”。你把需求寫(xiě)清楚,我就能把 issue 指給 agent,讓它直接去做。真正的工作,其實(shí)是在想清楚系統(tǒng)應(yīng)該怎么運(yùn)作、細(xì)節(jié)是什么。如果別人已經(jīng)幫我把這些想清楚了,我基本可以直接說(shuō)一句“build”,然后它就能跑。
相反,如果有人只提了一個(gè)很小的修復(fù) PR,我反而會(huì)請(qǐng)他們別這么做,因?yàn)槲一ㄔ?review 上的時(shí)間,可能是我直接在 Codex 里敲一句“fix”再等幾分鐘的十倍。現(xiàn)在我們已經(jīng)可以有一行命令就啟動(dòng)。但在最近兩周項(xiàng)目開(kāi)始真正有熱度之后,我干脆讓大家直接用 agent 指向倉(cāng)庫(kù)來(lái)做配置。所以我們沒(méi)有傳統(tǒng)意義上的 Onboarding,而是 Claude Code 驅(qū)動(dòng)的 Onboarding。
我的 agent 會(huì)自己 clone 倉(cāng)庫(kù)、讀文檔、寫(xiě)配置、幫用戶把環(huán)境全搭好,甚至設(shè)置 Launch Agent,全程不需要人工步驟。這在以前完全不可想象,但現(xiàn)在不是優(yōu)先級(jí)問(wèn)題了,因?yàn)?agent 可以替你做這些事。
而且這個(gè)產(chǎn)品本身就是 agent 構(gòu)建的,所以它的結(jié)構(gòu)、命名方式,完全符合 agent 的“直覺(jué)”。模型權(quán)重里本身就編碼了某些對(duì)命名和結(jié)構(gòu)的偏好,它在這個(gè)項(xiàng)目里導(dǎo)航起來(lái)非常順。所以我沒(méi)有把太多精力放在 Onboarding 上。以后我當(dāng)然也想做成很魔法的體驗(yàn),但當(dāng)下更重要的是信息傳得通、系統(tǒng)別炸。
小彩蛋
主持人:好,那我們用幾個(gè)快問(wèn)快答收尾。第一個(gè):有沒(méi)有一個(gè)你會(huì)推薦的工具?不是 CLI,也不是 IDE,可以是實(shí)體設(shè)備。
Peter:我買過(guò)很多小玩意,大多數(shù)都挺一般。但有一個(gè)不貴、看起來(lái)也挺糙的東西,給了我?guī)缀鯚o(wú)限的快樂(lè)。它是一個(gè)用 Android 跑的電子相框,可以上傳照片。它有一個(gè)郵箱,朋友可以直接給它發(fā)照片,之后就會(huì)自動(dòng)顯示。我家里放了好幾個(gè)。技術(shù)上說(shuō),它很糟糕,動(dòng)畫(huà)也很簡(jiǎn)陋,但它就是不停地給我展示生活中那些快樂(lè)的瞬間。
它大概兩百美元,但說(shuō)實(shí)話它給我的滿足感,比我新買的 iPhone 還大。我買了 iPhone 17,到現(xiàn)在都還沒(méi)拆封,因?yàn)槲乙幌氲揭獡Q卡、遷移數(shù)據(jù)就覺(jué)得太麻煩,完全沒(méi)有“非換不可”的理由。但這個(gè)小相框,真的讓我很開(kāi)心。
主持人:那在科技之外,有什么事情能讓你充電、讓你遠(yuǎn)離屏幕?
Peter:健身房,最好是和教練一起,把手機(jī)鎖在柜子里。那一個(gè)小時(shí)里,我完全活在當(dāng)下,沒(méi)有通知,沒(méi)有沖動(dòng)去摸手機(jī)。有時(shí)候我甚至出門散步,把手機(jī)直接留在家里。一開(kāi)始會(huì)非常恐慌,好像手機(jī)已經(jīng)變成身體的一部分了,但這種感覺(jué)反而讓我覺(jué)得特別爽。
https://www.youtube.com/watch?v=8lF7HmQ_RgY
聲明:本文為 AI 前線整理,不代表平臺(tái)觀點(diǎn),未經(jīng)許可禁止轉(zhuǎn)載。
會(huì)議推薦
InfoQ 2026 全年會(huì)議規(guī)劃已上線!從 AI Infra 到 Agentic AI,從 AI 工程化到產(chǎn)業(yè)落地,從技術(shù)前沿到行業(yè)應(yīng)用,全面覆蓋 AI 與軟件開(kāi)發(fā)核心賽道!集結(jié)全球技術(shù)先鋒,拆解真實(shí)生產(chǎn)案例、深挖技術(shù)與產(chǎn)業(yè)落地痛點(diǎn),探索前沿領(lǐng)域、聚焦產(chǎn)業(yè)賦能,獲取實(shí)戰(zhàn)落地方案與前瞻產(chǎn)業(yè)洞察,高效實(shí)現(xiàn)技術(shù)價(jià)值轉(zhuǎn)化。把握行業(yè)變革關(guān)鍵節(jié)點(diǎn),搶占 2026 智能升級(jí)發(fā)展先機(jī)!
今日薦文
你也「在看」嗎?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.