无主之地2配置高吗|看真人裸体BBBBB|秋草莓丝瓜黄瓜榴莲色多多|真人強奷112分钟|精品一卡2卡3卡四卡新区|日本成人深夜苍井空|八十年代动画片

網易首頁 > 網易號 > 正文 申請入駐

Spring 創始人重回一線做 AI 框架,卻說:這是人類親自選擇的最后一代框架

0
分享至


編譯|宇琪

策劃 | Tina

Rod Johnson 又回到了一線。

他是 Spring 的創造者,曾經幾乎重新定義了企業 Java 應用該怎么寫。二十多年后,他重新創業,做了一個面向企業 AI Agent 的開源框架 Embabel,試圖把 LLM 放進真實的業務系統里,讓它不只是會調用工具,而是能在可控、可解釋、可審計的流程里工作。

有意思的是,這一次他做的仍然是框架,但他對“框架”的未來并不樂觀,至少不再是過去那種樂觀。在他看來,模型還會繼續變強,工具也會越來越多地替開發者做選擇。Embabel 會不會被更強的模型追上?企業還需不需要這樣一層 harness?未來的框架到底是由開發者挑選,還是由 AI 工具自動決定?這些問題,都繞不開他在訪談里說出的那句話:這可能是最后一波由人類親自選擇的框架。

這句話放在別人嘴里,可能只是又一次 AI 時代的夸張判斷。但從 Spring 創始人口中說出來,意味就不一樣了。因為 Rod Johnson 親手參與過框架時代的興起,也見過一個框架如何變成企業軟件開發的基礎設施。現在,他回到戰場,卻認為選擇權正在轉移:開發者未必會消失,但開發者親自挑框架、搭技術棧、決定系統骨架的時代,可能正在進入尾聲。

本文基于該播客視頻整理,經 InfoQ 編輯。

核心觀點如下:

  • 如果我要用 TensorFlow 做模型訓練、微調、某些數據處理和攝入,我當然會用 Python。但 GenAI 應用層賦能這件事,更適合在應用原本的語言里完成,如果應用是用 Java 寫的,那就在 Java 里完成。

  • 一旦你進入復雜的應用程序,如果你不保持那種架構上的監督,你很快就會陷入一團亂麻。你的 Agent 會愉快地添加新功能,但每添加一個新功能,設計就會退化,代碼就會變得非常糟糕。

  • 開發者不應該花大量時間在編寫代碼上,因為你可以通過專注于你獨特增加價值的地方來獲得更大的杠桿。

  • 每個開發者原則上都應該每隔一兩年學一門新語言,因為它真的會改變你的思維方式。

  • 這可能已經是“最后一代由人類主動選擇的框架”了。以后越來越多的技術選型,都會由我們的工具替我們完成。

1 Spring 創始人回歸一線創業

Simon:我翻你的履歷時發現,你在創建 Spring 之前,擁有一個關于 19 世紀巴黎鋼琴音樂的博士學位。

Rod:是的,我的第一個學位是音樂和計算機科學雙專業,當時完全沒辦法決定往哪個方向走。后來我拿到了澳大利亞的研究獎學金去讀音樂博士,還在悉尼音樂學院教過兩年音樂史。然而,寫代碼的沖動一直沒停過。90 年代中期我還寫過共享軟件,真有人寄支票過來。

后來我清醒地認識到,要是繼續待在音樂學術界,我大概一輩子都在悉尼買不起房。于是我做了一個決定:這兩件事里,一個當愛好,一個當職業——而我當時正好搞反了。不過接下來有十年我幾乎沒碰過鋼琴,因為職業生涯實在太忙了。

Simon:所以這并非什么奇怪的彎路或別的什么,只是碰巧你很有創造力,無論是寫代碼還是音樂,你都很享受這兩者。

Rod:從 80 年代中期第一次寫代碼到現在,我差不多從未中斷過編程,因為我就愛這件事。即便現在絕大部分代碼是由 AI Coding Agent 替我寫的,我仍然能獲得一模一樣的興奮感,因為掌控權還在我手里,我還在創造和塑造東西。哪怕不再親手敲出每一行,只要結果是相同的,這對我而言同樣令人滿足。

Simon:在 SpringSource 被收購后,你做了很多年董事會和投資的事情,然后創辦了 Embabel,是什么讓你覺得“就是現在,這個時機到了”?

Rod:我認為是因為行業正處在一個巨大的轉折點上。當 GPT?3 和后來的 ChatGPT 突然變得真正實用、不再重復自己或陷入奇怪的死胡同時,我立刻意識到,怎么把這項技術真正用來解決企業問題,是很難的問題。其實在這之前兩年,出于個人興趣,我已經寫了不少 TensorFlow 代碼,和底層 AI 技術打了很多交道這自然而然地演化成了創建一個框架來幫助解決這些問題的想法。

Simon:說到企業,現在很多團隊被要求拋下 Java,用 Python 重寫一切。你公開講過這是錯誤的,甚至說過“這是 Python 在 AI 領域主導的最后一年”,為什么?

Rod:你要解決一個業務問題,就必須考慮這個問題本身的“鄰接性(Adjacency)”。你在和什么打交道?你大概率在和數據庫、企業服務、現有代碼庫打交道。同時,你還要處理一個新東西:LLM。可 LLM 并不在你那個 Python 進程里運行——宇宙毀滅之前,Python 都沒法自己執行推理。LLM 只是一個非常簡單的 HTTP 調用,所以我一直很困惑,為什么人們會認為某門語言在發起一個極其簡單的 HTTP 調用時會有天然優勢。

事實上,大家已經開始逐漸意識到這一點了。OpenClaw 就不是用 Python 寫的,Peter Steinberger 用的是他偏愛的語言。對大量企業應用而言,它們很明顯是用 Java 寫的,關鍵的鄰接性就在于已有業務邏輯、已有企業服務。那正確的做法很顯然,就是從你的 Java 棧里發起一個簡單的 HTTP 調用。

我認為人們產生這種混淆的根本原因,是沒有把“數據科學”和“企業 AI 應用”區分開,它們是兩件完全不同的事。在 Embabel 之前我寫了大量 Python,兩年前我的 Python 甚至比 Java 流利得多。如果我要用 TensorFlow 做模型訓練、微調、某些數據處理和攝入,我當然會用 Python。但 GenAI 應用層賦能這件事,更適合在應用原本的語言里完成,如果應用是用 Java 寫的,那就在 Java 里完成。

Simon:Embable 是用 Kotlin 寫的,對吧?

Rod:Embabel 核心幾乎全部是用 Kotlin 寫的。但我們的大多數示例是 Java。我們投入了大量精力來確保對 Java 用戶來說,它是完全無縫的 —— 正如你預期的那樣,我們絕大多數用戶群都在用 Java。你不會看到 companion object、`.kt` 文件,不會看到任何奇怪的東西。它就像非常優雅、流暢的 Java。所以當我在核心框架上工作時,我用 Kotlin;當我在示例應用上工作時,我用 Java。老實說,Java 風格的 API 非常棒,即使在 Kotlin 里使用這個框架時,它和其他語言的體驗也差不多。

Simon:而且它們之間的集成本來就很無縫,你可以直接從 Kotlin 跳到 Java。

Rod:大概十三年前,我大量使用過 Scala。我很喜歡 Scala 這門語言,但事實是它與 Java 的集成很痛苦。每次你處理一個集合,那都是折磨。而 Kotlin 的創造者在 Java 互操作性方面做得非常出色,他們沒有引入 Scala 曾有的那些問題,破壞性變更、缺乏二進制兼容性等等。所以,是的,我覺得 Kotlin 是一門非常好用的語言。

不過,我也認為指出 Java 已經改進很多這件事很重要,我覺得人們喜歡拿 Java 當稻草人來攻擊很煩人。很多人在假裝 Java 沒有進化,而 Java 實際上已經進化了很多。

2 Coding Agent 正在毀掉你的代碼庫

Simon:你之前談到 AI 基本上是被當作一個斷開的層硬塞進去的,而不是更深入地集成到現有系統中,結果這導致了一些失敗案例。你認為真正的企業 AI 失敗案例是什么樣的?

Rod:我認為最大的問題就出在,當高層下達“AI 一切”的指令,團隊卻在沒有真正業務案例、沒有確認 AI 是否合適的情況下,盲目開展 AI 項目。一個主要的反模式就是“我們必須用更多 AI”這種念頭,卻從來不去問一句:為什么要用?用來干什么?雖然我非常熱愛并且著迷于 AI,但如果能不用 LLM 就完成一件事,那你當然應該不用 LLM,這樣更便宜、更確定、更快。

所以組織首先要做的,是思考“我們怎么從這兒走到那兒去”。舉個例子,我們在澳大利亞的一個客戶,他們一開始識別出一類小問題:網站上有某張特定表單,客戶填寫完后需要人工審核才能繼續。95% 的情況其實非常簡單,雖然用正則表達式處理起來稍微麻煩了點,但本質上很簡單。于是他們把這個摩擦點消除掉了,在 95% 的場景里讓客戶即時推進,不再需要等人工處理。我覺得這是非常棒的起步案例:先在小事上拿到結果,慢慢建立起信任。

另外,對于“異構技術棧(Alien Stack)”問題,它會在兩個方向上造成傷害。第一,技術上讓一切都變難;第二,它往往還會把戰略權交到錯誤的人手里那些根本不懂核心業務、可能從來沒見過任何核心業務應用的人,卻在主導戰略。當你要賦能這些應用的時候,這條路完全走不通。

去年我和一家澳大利亞大公司的首席 AI 架構師聊過,他是一名 Python 開發者。他禮貌地聽完了我的介紹,卻沒什么興趣。通話結束時,他試圖表現得友善一點,說:“我敢肯定我們公司什么地方有 Java,我回去問問看。”我從來沒在那家公司工作過,但作為業內人士我太清楚了,那家公司大約 70% 的代碼是 Java 寫的,剩下的是 .NET,而且他們正逐步淘汰 .NET。這個人入職將近一年了,卻從來沒想過要去問一句:“順便問一下,我們的軟件是用什么語言寫的?”對他來說,這似乎根本不重要。

Simon:現在有一種越來越普遍的現象,我們作為開發者,與實際編寫的代碼實現之間出現了巨大的脫節。因為我們對 AI 過度依賴或授權,讓 AI 做了太多決策,把太多東西都外包出去了。很多知識實際上在 AI 那邊,而我們卻被抽象掉了。你認為這個問題有多嚴重?

Rod:我認為開發者需要掌握的一項核心技能,就是以這種新方式工作,同時保留那些真正重要的控制權。確實可以用 Vibe Coding 來做一些事情,比如某些類型的 UI 應用,它們本來就是一次性的,Agent 在這方面非常非常擅長。但你無法用 Vibe Coding 來編寫嚴肅的軟件。

我是一個 Coding Agent 的積極用戶,我可能最多只寫 5% 的代碼,也許更少,但我牢牢掌握著控制權。我發現,從設計的角度來看,Agent 出錯的時候比正確的時候多。

我們仍然需要理解架構、清楚正在發生什么、并且不要過于信任。因為一旦你進入復雜的應用程序,如果你不保持那種架構上的監督,你很快就會陷入一團亂麻。你的 Agent 會愉快地添加新功能,但每添加一個新功能,設計就會退化,代碼就會變得非常糟糕。

Simon:你提到你只寫 5% 的代碼,其余是 AI 生成的。你這樣做是有意為之嗎?是因為你不想寫更多,因為你想對寫出來的東西有更多控制權?

Rod:在開源項目里,我手寫的比例更高一些,可能會更保守。但在我們的一些內部應用中,AI 生成的比例接近 95%。要是你讀那些代碼,你會覺得那是我寫的,設計風格非常清晰。我會坐在那里看 diff、看輸出,然后經常停下來糾正它:“不對,你把這個硬編碼了,這里應該是一個策略,提取出來。”

我相信這種模式有可能產生比純手工或者純靠 Coding Agent 更好的結果。我用 Coding Agent 寫代碼的速度比我手動快得多,而且質量也更好。但如果反過來,我把一切完全丟給 Coding Agent,我深信質量會大幅下降,最終連速度也會降下來。

3 Embabel 的核心:來自一個游戲 NPC 規劃算法

Simon:我們來談談 Embabel 里面的核心組件“規劃器(planner)”。這是一個叫 GOAP (Goal-Oriented-Action-plann)的尋)尋路算法,最早是為游戲里的 NPC 設計的吧?關鍵點是,它是確定性的。而其他框架比如 LangChain、Crew.ai,則更多是由 LLM 來決定下一步做什么、怎么規劃。為什么你會從游戲 NPC 領域里挑出這個算法?

Rod:我最開始考慮的確實是最顯而易見的方法——狀態機(state machine)。平心而論,LangGraph 就是確定性的,你提前定義好狀態機。所以我也一度用過那種辦法。不過我們先退一步,談談為什么要做規劃。

當然,你可以直接把一堆工具扔給模型,讓一個 Agent 循環來全權處理一切,在某些場景下這確實合理。但對于自動化業務流程這類需要一致性和可預測性的場合,這遠遠不夠,因為你壓根不知道 LLM 會以什么順序調用你給它的工具,也不知道它會傳什么參數給那些工具。

所以我們的想法是,讓用戶把流程拆成多個步驟。這些步驟可能是調用一個或多個 LLM,也可能是純代碼步驟。在這一層面上,LangGraph、Crew.ai、Microsoft Semantic Kernel 做的都是類似的事——把大問題切分成小步驟。這也意味著,如果你在某一步中使用 LLM,可以為不同需求使用不同模型。比如你可以在自己的防火墻后面使用本地 LLM 來處理那些足夠小、且高度敏感的任務,從而永遠不讓客戶數據流出企業邊界,這里面有大量好處。

但問題回到了:怎么規劃這些步驟,怎么決定執行順序?你可以用狀態機,但我發現,當我在做類似 LangGraph 的東西時,修改狀態機,比如增加更多狀態和轉換,非常麻煩,你必須重新連線來擴展它。其次,狀態轉換和每個動作狀態所需的類型,通常都是正交的,這會在類型系統上制造麻煩。

GOAP 規劃方式有兩個很不一樣的點。第一,它是動態的,規劃發生在運行時。第二,它與類型系統完全集成。我們允許用戶創建自定義條件,但動作的排序通常由 Java 方法的參數類型和返回類型決定,這意味著一個動作永遠不會在缺少所需參數時被調用。

GOAP 本質上是一個 A* 算法。我們識別出目標,然后查看從當前世界狀態出發,哪些步驟可以通向目標。目標有前置條件,世界狀態中必須滿足某些條件。動作也有前置條件和它承諾的后置條件。前置條件是絕對硬性的,除非條件被滿足,否則你不能聲明目標已達成,也不能調用某個動作,而后置條件則是動作承諾會產生的副作用。

規劃器從當前世界狀態出發,找到一條通往目標的路徑。它也可能告訴你“不存在可行動路徑”,這本身就是一個很有價值的信息。然后它執行第一個動作,再重新規劃,在執行每個動作之后,查看世界狀態,重新評估怎么到達目標。大多數情況下,快樂路徑會照常運作,動作承諾的后置條件得到滿足,規劃器確認一下,然后邁進下一步。

Simon:這一切都是自動化的?

Rod:完全自動化。通常 Java 開發者不需要了解規劃器的內部細節,他們只需要定義“動作方法”來提供輸入,用注解標記 Java 方法,方法的參數和返回類型就給規劃器提供了鏈式調用的信息。在某些情況下,你還可以定義自定義條件來進一步控制工作流。這意味著可能存在多條路徑能到達同一個目標,而規劃器可以選擇成本最低的那條路徑,因為你可以給每個動作分配成本。成本甚至可以是動態的,如果某個動作需要調用一個負載很高的系統,你就可以將其反映為一個動態成本值,這樣一來,規劃器也許就會自動選擇另一條路線。

Simon:基于當前世界狀態在運行時做動態決策,這非常有意思。另一個好處是,因為它是確定性的,當被問到“為什么會做出這個決定”時,你們能提供非確定性規劃器無法給到的診斷信息?

Rod:我們可以完整展示規劃的整個路徑,以及我們觀察到的世界狀態,是如何導致我們制定出那份計劃的。規劃器和整個 Embabel 會發出大量事件,你可以編寫監聽器來持久化這些信息,或者把它們用于審計日志。所以你完全可以解釋它為什么做了某件事,并且確保它每次都做同樣的事。

當然,一旦進入動作步驟內部,如果你調用了 LLM,那部分就不會是完全確定性的,但這也讓你能夠“適度”地調用 LLM。如果你像聊天機器人那樣,用長達三頁紙的提示詞和 30 個工具來工作,你永遠不可能獲得完全的可預測性。而如果你用一段小提示詞加上三個工具去完成一件事,可預測性就會非常高。雖然不可能 100% 確定,但你會發現花在提示工程上的時間會大幅減少。所以整體上,系統會變得可解釋得多,也確定和可預測得多。

4 為什么對 MCP 持懷疑態度

Simon:每個人似乎都把 MCP 當作靈丹妙藥,好像它能解決 Agent 的所有問題。你認為在這個領域,大多數開發者還沒有看到的差距是什么?

Rod:我認為 MCP 在賦能整個生態系統方面發揮了極其重要的作用,它確實是一個催化劑,讓更多的人了解到你可以用工具實現什么。然而,我出于幾個原因對 MCP 持懷疑態度。

首先,如果你在做“用 AI 賦能企業系統”這件事,為什么要通過 MCP 來運行?你可以用 Embabel、Spring AI 或 LangChain4J,任何框架都可以輕松地將一個 Java 方法暴露為工具。所以你必須問一個問題:如果做起來這么容易,為什么還要多此一舉?特別是當你可以在領域對象上暴露工具時,你先通過倉庫調用檢索到了正確的領域對象,然后暴露這個對象上的方法,這是 MCP 不那么容易做到的事。所以,很多時候,你在暴露任何工具時,第一個想法應該是:“我能用我的技術棧直接暴露它。”“我為什么不直接暴露一個 Java 方法或 Python 函數呢?”完全可以做到。

其次,MCP 的賣點是“一個專門為 Agent 設計的 API 規范”。但如果它是 API 規范,我們已經有了 OpenAPI、Swagger、GraphQL,為什么還需要一個新的?MCP 的論點是"因為它是專門為 Agent 設計的"。但我最近開始得出一個結論:對于一個特定 Agent 來說,唯一完美適合的東西,很可能就是這個 Agent 獨有的。比如,你可以有一個 MCP 服務器去暴露服務,但如果已經存在一個 OpenAPI 規范,你也可以連接到那個規范,然后根據你特定 Agent 循環的需求來塑造你自己的工具。

我認為 MCP 對推動行業進步有巨大貢獻,但它不是那種一刀切的解決方案。在很多場景下,直接使用現有的 API 規范更有意義,而永遠放在首位的方案應該是:從你當前的技術棧里直接暴露邏輯。

Simon:我記得 Karpathy 發過一條推文,大意是模型正在跑在基于模型構建出來的產品前面。現在你在 Embabel 構建的是編排層。這是否意味著,你們其實已經落后于模型了?

Rod:這是一個有意思的問題。當然,如果你看我們現在如何構建軟件,coding agent 的規劃能力提升得比我原本預期要明顯得多。大概在去年 11 月底、12 月那段時間,確實出現過一次非常劇烈的躍遷。我認為模型肯定在變得更好,但我也認為,很多根本問題仍然存在。如果你在自動化業務流程,那么把規劃從模型的控制之外移出來,轉而使用某種確定性方法,我認為這仍然有價值。可解釋性依然很重要。所以我確實認為,即使模型繼續進步,模型之上的框架、agent harness、各種框架仍然非常重要。

一個很好的例子是 Claude Code。當然,Sonnet 4.6 比之前的模型強得多。但 Claude Code 本身也強得多。如果你把今天的 Claude Code 和四五個月前的 Claude Code 相比,它的工作方式已經完全不同,而這種不同確實讓它更有效。所以我其實并不認為模型變聰明和 harness 變聰明之間存在沖突。我認為我們需要在兩個地方同時推進。

我認為你確實會看到一些模型“吃掉 harness”的場景,也就是在那些是否確定并不那么重要的地方。你可以直接給模型一堆工具,即使它有點不可預測也沒關系。所以我確實認為,有一塊空間里,模型會需要更少的外圍基礎設施。但我認為,那塊空間與企業應用并沒有特別大的關系。

5 AI 擅長批評,不擅長原創

Simon:今年一月,你提到你的 Claude Code 工作流程涉及很多設計對話:和 Claude Code 來回討論、長時間的規劃,然后才開始編碼,結果往往比手寫更好。但 Claude 并不理解某些事情,比如 companion objects。所以當你用 Claude Code 構建 Embabel 而 Claude 不完全理解你架構的某些部分時,那種感覺如何?

Rod:我認為它工作得很好,因為我完全理解架構,并且我經常糾正它。我確實想知道,如果開發者越來越多地選擇“不理解架構”那條簡單的路,會發生什么。我處于一個非常有利的位置,我完全理解代碼庫中的架構,我非常了解 Kotlin 這門語言,我們構建在 Spring 之上,我對 Spring 也很了解。我實際上非常了解技術棧的每一個部分,這使我能夠有效地掌控局面。我個人會非常擔心那些不理解這些的人,保持控制權非常重要。我認為開發者不應該花大量時間在編寫代碼上,因為你可以通過專注于你獨特增加價值的地方來獲得更大的杠桿。

Simon:AI 有沒有讓你感到驚訝的時候,比如給過一個你沒想到的設計或架構建議,讓你轉向了完全不同的方向?

Rod:不經常。然而,有一件事一直很有用,那就是來回的討論。確實有很多次它想到了我沒想到的問題。比如我們在討論一個提議的變更時,它指出了我沒想到的一點。它更擅長批評,而不是提出原創想法。

總的來說,我非常滿意,但有些時候我也會感到沮喪。過去幾天,我試圖為一個內部產品構建一套相當復雜的測試基礎設施,在測試容器里用真實 LLM 進行測試,偽造所有工具等等,而 Claude Code 表現得非常糟糕。我認為原因之一是它以前沒見過這種場景,這可能是一種相當新的測試形式。

要讓你的 Coding Agent 獲得最大的自主性,你需要對測試非常執著。而我這次碰到的,既是它見過的更極端的測試量,而且某些類型的測試可能也是它以前沒見過的。盡管有明確的指示,它似乎還是出奇地掙扎。

Simon:你有沒有嘗試過用技能和上下文來引導它,試圖讓它提供更接近你想要的建議?

Rod:我試過用 Skills 和 Claude.md 來配置 Coding Agent 的行為,但有點不幸的是,當上下文越變越大,Coding Agent 就會開始忘東西。有個特別奇怪的現象:它老是想在代碼體里寫全限定名,可我非常討厭這個,我更喜歡用 import。我已經把這個偏好寫進了 claude.md 配置文件里,但大概有 50% 的時間它還是照忘不誤。

Simon:就算那是 Agent 必須讀取的強制性指令,它也做不到漸進式學習。

Rod:對,注意力就是會衰減。

6 語言之爭

Simon:我記得你曾經說 TypeScript 是當今最重要的語言,因為它能讓一個普通 JavaScript 開發者的水平翻倍。既然你認為 TypeScript 比 Java 更重要,那你怎么同時做到既堅持在 JVM 上構建,又相信 TypeScript 是最重要的語言

Rod:TypeScript 是門非常聰明的語言。有意思的是,你看曾經靜態類型與動態類型語言的那條路線,現在某種程度上正在趨同。現代 Python 大量使用類型提示,Python 的類型系統也相當不錯了;TypeScript 顯然給 JavaScript 加上了一層類型。

TypeScript 是一門優美的語言,它的確非常重要。但我還會不會說它依然是最重要的?這得看應用的類型。如果我從零開始寫很多類型的應用,我很可能會用 TypeScript 去寫服務端和 React。但你去看企業級應用,沒多少是用 Node 寫的,也不應該用 Node 去寫。在 JVM 上,Java、Kotlin 會給你一堆對這個類別的應用極有價值的東西。TypeScript 再漂亮,在這件事上也幫不上什么忙。

所以我認為,第一,現代 Java 肯定比我當初說那些話的時候好得多;第二,Kotlin 是一門值得認真考慮的出色語言。Kotlin 和 TypeScript 大概旗鼓相當,我仍然會想念聯合類型,我可以長篇大論地論證密封層級絕對不如聯合類型好,但 Kotlin 同樣有很多比 TypeScript 強的地方。TypeScript 的另一個問題是,盡管他們做得非常好,底層仍然有一層瘋狂的東西,你偶爾就會撞見,而且沒法掩蓋。而 Kotlin 是一門現代化語言,它建立在更健壯、更可預測的基礎之上。

Simon:你認為 AI 的進步會在五年內改變這些語言格局嗎?有沒有足夠多的變化來顛覆這些既定事實?

Rod:我不知道我的觀點是什么,我可以說服自己語言不重要,也可以說服自己語言很重要。

先說很多人想象的那個圖景,以為訓練語料庫會讓熱門語言擁有天然優勢,然后這種優勢會被固化下來,這絕對不對。我使用 Coding Agent 的三種語言是 Java、Kotlin 和 Python,而毫無懸念,Coding Agent 做得最好的恰恰是 Kotlin,這完全超乎你的預想。

你想,Java 和 Python 都存在了很久,而且最近幾年進化得都很快。你不應該寫出 2019 年的 Java,當然也不應該寫出 2019 年的 Python。訓練數據太多了,你可以說“永遠用值類型”“永遠用增強 switch 語句”“Python 里永遠用類型提示”,但正因為訓練數據體量太大,你實際上是在對抗它。我倒不是說他倆不好,Java 和 Python 仍然非常好。

可 Kotlin 更好,這讓我非常吃驚,因為 Kotlin 的語料庫并不大。Kotlin 本身也沒怎么進化,因為它從一開始就是一門現代語言。其次,早期用 Kotlin 的大概率是技術非常嫻熟的人,因此沒有那么多糟糕的 Kotlin 代碼,不像 Java 或 Python 那樣。

所以,我不認為熱門語言會因為訓練數據就被固化。LLM 對任何它們見過足夠多的東西都極其擅長,而我們聽說過的所有編程語言,它們都見過很多。但這就引出了另一個問題:既然如此,你干嘛不用完美的語言去寫每一件事?就像我們之前說的,有些東西我絕對不會用 Python 寫,而會用 Java 寫。既然 LLM 在每一門語言里都是大師級別,為什么不挑最理想的語言來寫每一個服務?用 Rust 寫這個服務,用 Go 寫那個。(但我不認為現在還有值得用 Go 寫的東西了。

問題在于,這就像我們曾經看到過的微服務狂熱——還有其他成本。你現在會引入極為龐大的維護成本,除非我們愿意完全信任我們的機器,但我不覺得我們該那樣做,我不認為那是個好主意。

Simon:還有技能問題。光是技術棧的多樣性,以及人們需要維護這些技術棧,就已經足夠頭疼了。還有安全,每引入一門新語言或一個新庫,威脅面就成倍擴大,而且這種風險會跨語言蔓延。

Rod:至少就目前而言,我們選擇語言和技術棧的根本性理由,可能不會改變太多。因為當你把它們投入生產、為它們背書的時候,那些最根本的東西并沒有變。

7 開源生存法則

Simon:你之前提過,開源項目背后的公司需要從第一天起就有商業模式,這對 Embabel 來說是什么樣的?

Rod:最可能的模式是開放核心。我認為開源的純支持模式一直就非常困難,有了 Coding Agent 之后,還會難得多,所以我覺得會存在比框架層面更上一層的產品。我們目前的思路是,把框架作為一種競爭優勢,去構建可能甚至不針對軟件開發者的產品,而是針對更廣泛的知識工作者。框架本身是 Apache 許可證,和 Spring 一樣。我們歡迎社區貢獻,我們有活躍的 Discord、GitHub 和問題跟蹤器,歡迎任何感興趣的人來貢獻和加入社區。

Simon:Spring 前后經歷了 VMware、Pivotal 再到如今 Broadcom 的收購。你覺得是什么讓它挺過了這些收購?很多開源項目在被收購之后就枯萎甚至死亡了。

Rod:我覺得在 2009 年底那筆首次收購發生時,Spring 已經是一個龐然大物了,它已經是事實上的標準。早期的采用率和圍繞它建立的社區,顯然有著巨大的慣性。

但有幫助的一點是,有相當多技術嫻熟的開發者被全職雇來開發 Spring。這意味著那些不那么令人興奮的事情也會有人去修,因為這是某個人工作的一部分,不管他們感不感興趣。我仍然堅信,開源確實能從背后的商業支持中受益。讓 Spring 變得可靠的關鍵,它非常健壯,任何嚴重問題都會迅速被修復,部分正反映了我們不依賴志愿者。社區貢獻當然很棒,但我認為背后的這種專業性至關重要,它給出了那種完整產品式的開發方法。

8 “這是人們選擇的最后一波框架”

Simon:你認為 JVM 最被低估的東西是什么?Python 世界完全不知道自己錯過了什么?

Rod:性能當然是其中一個方面。但更嚴肅的回答是:運行在它上面那些代碼,業務邏輯、領域模型,對于理解關鍵業務,有著難以估量的價值。

Simon:關于 AI Agent,你有什么不受歡迎的觀點嗎?

Rod:我對 MCP 持有一種相對懷疑的態度。倒不是說我覺得 MCP 不好,而是我覺得現在大家已經把 MCP 當成了“萬能錘子”,于是看什么都像釘子。

Simon:如果有 Java 開發者被老板命令“去學 Python,因為 AI 要用 Python”,你會給他什么建議?

Rod:我會讓他去讀讀我的博客。我寫了一系列文章,用完全相同的任務來對比 Python 和 Java 的實現——文件處理、API 調用、數據管道。結果非常清楚:Java 代碼在性能、可讀性和生態成熟度上完全不輸 Python。你可以直接把其中一篇文章甩給你的老板,或者更好一點,自己親手寫一段。很多時候你會發現,Java 的代碼競爭力其實一點不差。

Simon:如果是已經在線上生產環境跑著的項目,你會選 LangGraph 還是 Embabel?

Rod:Java 項目還是 Python 項目?如果是 Java 項目,那我肯定選 Embabel。否則你就是在往系統里硬塞一個 “Alien Stack”。現在 Embabel 已經到 0.3.5 了,離 API 穩定其實非常近。我會很驚訝如果從現在到 1.0 之間還有什么重大 breaking changes,估計再過四到六周就會到 1.0。

所以說實話,我不覺得現在采用 Embabel 是什么高風險的事。反倒是,如果我有一個 Java 項目,卻要引入一整套完全不同的技術棧,再讓它去和現有 Java business logic 對接,我會覺得這風險大得多。等你把這一大堆東西折騰完,Embabel 可能都已經 1.0 了,到時候你只會特別懊惱:“我當初到底為什么要這么搞。”

Simon:今天啟動一個全新的企業項目,用 Kotlin 還是 Java?

Rod:這取決于團隊規模。如果團隊少于 20 人,我會認真考慮 Kotlin。如果團隊更大,而且大家原本也不熟 Kotlin,那我可能還是會繼續用 Java。

Simon:以前 Java 開發者轉 Scala 的學習曲線其實挺陡的,現在 Java 轉 Kotlin 還有那么難嗎?

Rod:老實說,我不太確定。因為我接觸 Kotlin 的時候,其實已經寫了很多別的語言,尤其是 Python。我雖然也寫過幾個月 Java,但后來又回到了 Kotlin。所以我并不是一個“純 Java 背景”轉過去的人。不過我可以明確地說:Kotlin 絕對比 Scala 容易學,Kotlin 本身其實是一門相當容易上手的語言。

而且還有兩點我一直很認同。第一,我覺得每個開發者原則上都應該每隔一兩年學一門新語言,因為它真的會改變你的思維方式。第二,現在學習新語言的門檻已經低到前所未有,LLM 可以極快地幫助你掌握任何語言,所以整體門檻其實已經被大幅降低了,比如我從來沒讀過 Kotlin 的教程書。

Simon:你剛剛提到讓 LLM 去批判代碼,有時候相比讓它“直接生成”,這種方式反而更值。我也覺得,尤其是在學習新語言的時候,讓 LLM 給你解釋“這里為什么這么寫”“背后的機制是什么”,很多時候比直接說“幫我生成一段代碼”更有效。否則你最后只能對著生成結果猜:“它為什么要這么寫?”

Rod:尤其是對于有經驗的開發者來說,更是這樣。我學新語言的時候,經常會問 LLM:“這個語言里有沒有某個特性的等價實現?”比如我會問:Python 里有沒有類似 TypeScript type guard 的東西?如果你本身已經理解這些概念,那 LLM 特別擅長幫你把這些概念映射到另一門語言上。

Simon:你每天都會用、最喜歡的 AI 工具是什么?除了 Claude Code 之外。

Rod:大概率還是 Claude Desktop。主要是它能讓我同時調用一堆工具做 competitive research,我很多事情都會用它來處理。

Simon:關于 Spring,有什么你后來覺得“當初做錯了”的地方?如果重做一次,你會在 Embabel 里換一種方式嗎?

Rod:有個挺小、但我覺得挺有趣的點。當年我一直想給 Spring retrofit 一套“基于事件的 logging 機制”,但那個時候已經太晚了,架構上不好再改。但在 Embabel 里,我們一開始就這么設計了。這樣做的好處是:所有 event 都是完整的。你可以通過 SSH stream 出去,可以監聽,可以訂閱。而且更有意思的是,我們甚至可以修改你的“logging personality”,比如讓你的日志全都用尤達大師的語氣輸出。

某種程度上,Embabel 的整體風格其實是建立在現代 Spring 的經驗之上,只是加了一些在 Kotlin 里更容易實現的東西。比如我們基本不怎么用 builder pattern,因為 Kotlin 可以把這些東西寫得更優雅,哪怕最后還是給 Java 用戶使用也一樣。

Simon:如果 Embabel 五年后不存在了,你覺得是什么殺了它?

Rod:我完全不知道五年后 Embabel 是否還會存在。五年后,人們還會親手寫應用嗎?還是他們違背了我的建議,讓機器完全接管了一切?我甚至會說:這可能已經是“最后一代由人類主動選擇的框架”了。以后越來越多的技術選型,都會由我們的工具替我們完成。但說實話,我們正處在一個幾乎獨一無二的時代。別說五年,一兩年后的預測都可能是錯的。

訪談視頻原鏈接:

https://www.youtube.com/watch?v=UcvxYltiS7E

聲明:本文為 InfoQ 翻譯整理,不代表平臺觀點,未經許可禁止轉載。

會議推薦

企業級 Agent 落地,繞不開 4 個真實的工程問題。如何在 Agent 安全性和可用性之間找到平衡點?Agent 需要什么樣的記憶系統才能真正理解上下文?如何通過算法壓榨實現智力增量與成本控制的極致平衡?多 Agent 協作,如何做到可觀測、可治理、可控制?6 月 26-27 日,AICon 全球人工智能開發與應用大會·上海站國內頭部公司的 Agent 實踐,一次說透。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

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.

相關推薦
熱點推薦
年輕人的性蕭條有多恐怖?我國避孕套市場規模萎縮了25%!

年輕人的性蕭條有多恐怖?我國避孕套市場規模萎縮了25%!

燈錦年
2026-06-10 15:31:11
SpaceX總裁:不會出現大批員工套現離職

SpaceX總裁:不會出現大批員工套現離職

財聯社
2026-06-12 22:42:07
WTT薩格勒布賽:單打8強已出其4!國乒連贏韓日,早田希娜被爆冷

WTT薩格勒布賽:單打8強已出其4!國乒連贏韓日,早田希娜被爆冷

全言作品
2026-06-12 19:19:04
鄭麗文走出機場那刻,怕是這輩子都沒見過這種陣仗。

鄭麗文走出機場那刻,怕是這輩子都沒見過這種陣仗。

果媽聊娛樂
2026-06-07 09:51:32
關曉彤和男演員伸舌吻戲拍完五小時,鹿晗發破碎愛心

關曉彤和男演員伸舌吻戲拍完五小時,鹿晗發破碎愛心

鄉野小珥
2026-06-11 14:06:46
1952年薄一波反映葉帥情況,毛主席:他是有成績的,大家要理解他

1952年薄一波反映葉帥情況,毛主席:他是有成績的,大家要理解他

史之韻
2026-06-13 00:10:13
WTT薩格勒布賽:混雙4強誕生!國乒全軍覆沒,總教練指導無力回天

WTT薩格勒布賽:混雙4強誕生!國乒全軍覆沒,總教練指導無力回天

全言作品
2026-06-12 17:39:46
德布勞內最痛的背叛:女友跟好友庫爾圖瓦睡了,還說一晚勝過三年

德布勞內最痛的背叛:女友跟好友庫爾圖瓦睡了,還說一晚勝過三年

綠茵八卦君
2026-06-13 07:20:03
提前批水太深!軍校警校只是冰山一角,真正好上岸的是這5個方向

提前批水太深!軍校警校只是冰山一角,真正好上岸的是這5個方向

荷蘭豆愛健康
2026-06-09 19:01:42
上海奪冠后大白邊最新動態!已成功簽約下家:盧偉這下真被打臉了

上海奪冠后大白邊最新動態!已成功簽約下家:盧偉這下真被打臉了

籃球快餐車
2026-06-12 15:22:04
日本天皇對高市早苗的不滿,已經到了差點“發飆”的地步了?

日本天皇對高市早苗的不滿,已經到了差點“發飆”的地步了?

影孖看世界
2026-06-12 23:57:37
一場1-1爆冷,讓亞洲冠軍漁翁得利!世界杯出線難度反轉,B組亂了

一場1-1爆冷,讓亞洲冠軍漁翁得利!世界杯出線難度反轉,B組亂了

等等talk
2026-06-13 06:15:05
“薛桂生”才是最大贏家,第一次演戲就出名,還在劇組討到了老婆

“薛桂生”才是最大贏家,第一次演戲就出名,還在劇組討到了老婆

阿纂看事
2026-06-12 11:24:51
姚明為何不生二胎?原因被爆料,葉莉也沒辦法,太可惜且難以接受

姚明為何不生二胎?原因被爆料,葉莉也沒辦法,太可惜且難以接受

三毛看世界
2026-06-11 19:28:54
這次,俞灝明苦苦維持的體面,被王曉晨撕的稀碎,鄭愷早有提醒

這次,俞灝明苦苦維持的體面,被王曉晨撕的稀碎,鄭愷早有提醒

打小我就醜
2026-06-04 12:37:40
三年套現15億,賣掉摩拜單車的創始人胡瑋煒,竟然活成了這樣!

三年套現15億,賣掉摩拜單車的創始人胡瑋煒,竟然活成了這樣!

琴琴有氧運動
2026-06-05 22:12:10
馮小剛電影《抓特務》官宣定檔端午

馮小剛電影《抓特務》官宣定檔端午

東方不敗然多多
2026-06-12 20:30:01
某魚驚現“天價筆”:800元一支的中性筆,藏著多少骯臟暗語?

某魚驚現“天價筆”:800元一支的中性筆,藏著多少骯臟暗語?

番外行
2026-02-26 19:53:05
大反轉!已簽的波音大豆要取消?美再次對華出手,188家中企在列

大反轉!已簽的波音大豆要取消?美再次對華出手,188家中企在列

鍋鍋愛歷史
2026-06-12 14:31:38
99年北京姑娘征婚:會打王者,做飯超好吃

99年北京姑娘征婚:會打王者,做飯超好吃

生活觀察員啊
2026-06-12 01:25:32
2026-06-13 09:31:00
InfoQ incentive-icons
InfoQ
有內容的技術社區媒體
12524文章數 51943關注度
往期回顧 全部

科技要聞

剛剛,人類歷史上首位萬億美元富豪誕生!

頭條要聞

47歲泰國長公主去世 70多歲泰王現繼承危機

頭條要聞

47歲泰國長公主去世 70多歲泰王現繼承危機

體育要聞

歐洲恐韓?肉德維德?

娛樂要聞

一天4個瓜,肖戰熱巴最意外

財經要聞

梁文鋒向左,楊植麟向右

汽車要聞

標配激光雷達/雙動力可選 昊鉑S600限時售17.99萬起

態度原創

時尚
藝術
房產
本地
軍事航空

今日熱點:白鹿起訴蒙淇淇;岳云鵬回應開演唱會質疑……

藝術要聞

砸了640億,再賠160億!沙特“The Line”項目徹底涼了?

房產要聞

海南最賺錢行業曝光!最快4年半,海口全款買三房!

本地新聞

AK劉彰邂逅河北南大港濕地

軍事要聞

伊外長披露伊美諒解備忘錄草案部分內容

無障礙瀏覽 進入關懷版