作者: tm731531

  • Hacker News 每日精選 – 2026-06-23

    “`html




    科技趨勢週報

    🚀 科技前線:從高效能小模型到資訊真實性的挑戰

    今日趨勢總結: 我們正處於一個「效率革命」的轉折點。AI 技術不再僅僅追求規模(Scale),小參數模型在推理能力的突破,以及像 YOLO26 這樣的視覺模型優化,正讓強大 AI 走向邊緣運算;與此同時,預測市場與 AI 生成內容帶來的資訊誠信問題,也正成為商業與社會的新考驗。

    為什麼你該關注?理解這些技術轉變能幫助你在開發工具選擇與商業決策中,保持先發優勢。


    🤖 AI / 機器學習

    🧠 VibeThinker:以小博大的推理新標竿

    這是一個僅有 3B 參數的驚人模型,卻能在推理任務上挑戰強大的 Opus 4.5。透過創新的 SFT(監督式微調)與 GRPO 技術,研究證明了模型架構與訓練策略可以彌補規模的不足。這對於開發資源受限的嵌入式設備提供了極大的希望。

    🛠️ GLM-5.2:在地化運行的最佳實踐

    Unsloth 提供了關於如何在地化運行 GLM-5.2 模型的詳細指南。這對於注重數據隱私或需要在無網路環境下工作的開發者來說,是不可或缺的技術進步。優化後的運行流程顯著降低了硬體門檻。

    • 核心重點: 本機部署指南、數據隱私優化、低資源消耗。
    • 閱讀技術文件

    👁️ YOLO26:視覺識別的統一革命

    Ultralytics 推出了最新的 YOLO26,這是一個統一的實時端到端視覺模型。它不僅提升了目標檢測的精準度,更在速度與架構設計上進行了全面革新,是物聯網與自動化監控領域的重量級更新。

    • 核心重點: 端到端視覺處理、實時性極佳、統一模型架構。
    • 深入了解 YOLO26

    🛡️ OpenAI DayBreak:專為網路安全而生的 GPT-5.5

    OpenAI 發布了 GPT-5.5-Cyber,展示了 AI 在網路安全領域的深耕。該模型旨在增強對網路威脅的即時檢測與自動化防禦能力,標誌著 AI 從通用助理向專業垂直領域轉型的新里程碑。


    🛠️ 開發工具

    ⚡ 重新發現 Memcached 的價值

    在一片追求複雜架構的浪潮中,這篇文章重新讚頌了 Memcached 的純粹與高效。它提醒開發者,有時候最簡單、最專一的工具,在處理高併發緩存需求時,依然是不可取代的最佳選擇。

    • 核心重點: 系統設計哲學、高效緩存機制、化繁為簡。
    • 閱讀深度評論

    🌐 新一代 HTTP QUERY 方法解析

    這篇文章詳細解釋了最新的 HTTP QUERY 方法。這對於需要設計高品質 API 的後端工程師來說,是掌握未來 Web 通訊協議演進的關鍵知識。

    • 核心重點: 協議更新、API 設計標準、通訊效率提升。
    • 了解協議細節

    💼 創業 / 商業

    ⚠️ Polymarket 的資訊操縱疑雲

    預測市場巨頭 Polymarket 正面臨輿論風暴,被指控利用付費創作者在社群媒體上散布誤導性影片。這引發了關於預測市場是否會被用作操控輿論工具,以及資訊真實性在 AI 時代崩塌的深層討論。

    • 核心重點: 預測市場風險、社群媒體操縱、資訊真實性危機。
    • 查看 WSJ 報導

    🎮 其他

    🕹️ Steam Machine 正式登場

    Steam 機器今日正式發布,這代表 Valve 試圖將 PC 遊戲的強大性能與主機的簡便體驗進行整合。對於硬體玩家來說,這是一個觀察 PC 遊戲生態系統轉型的關鍵產品。

    📜 Will It Mythos?

    一篇關於神話、敘事與現實交織的哲學性探討。雖然與硬體技術無關,但對於理解人類如何構建世界觀與敘事邏輯具有啟發性。

    • 核心重點: 文化探討、敘事哲學。
    • 閱讀原文

    💡 今日觀點與行動建議

    共同主題: 今日的技術動態呈現出兩極化——一極是「極致的效率」(小模型、精簡工具),另一極則是「資訊的混亂」(AI 誤導性內容、預測市場操縱)。

    💡 行動建議:
    1. 技術開發者: 不要再盲目追求參數規模,應開始研究如何利用 VibeThinker 或 YOLO26 這類高效能小模型來優化你的應用成本。
    2. 資訊消費者: 在預測市場與 AI 內容盛行的時代,對於社群媒體上的「預測性內容」務必保持高度批判性,學會驗證來源,而非僅僅依賴趨勢。



    “`

  • Hacker News 每日精選 – 2026-06-21

    🚀 Hacker News 今日科技精選:從 AI 代理的可靠性到底層系統效能優化

    今日科技圈的焦點呈現出明顯的兩極化:一方面是人工智慧(AI)從單純的對話走向複雜的「代理人(Agentic)系統」,這帶來了關於可靠性的深度討論;另一方面,底層開發者正透過 AVX-512 與 io_uring 等技術追求極限效能。理解這些技術底層邏輯,並同時關注技術對人類心理健康的長期影響,是每一位現代技術人的必修課。

    🤖 AI/機器學習

    🛠️ 如何構建可靠的 Agentic AI 系統 (Building reliable agentic AI systems)

    當 AI 不再只是回答問題,而是開始具備執行任務的「代理人」能力時,系統的穩定性成了最大挑戰。本文探討了在構建大規模 Agent 系統時,如何應對 LLM 的不確定性。透過結構化的設計,開發者可以建立更具預測性且強韌的 AI 工作流。這對於想要將 AI 導入生產環境的企業來說至關重要。

    🔗 閱讀原文

    🤔 AI 的十萬個為什麼 (The 100k Whys of AI)

    這是一篇深入探討人工智慧本質的哲學與科學思辨文章。作者試圖拆解 AI 技術背後的深層動機與潛在邏輯。它不僅僅是關於算法,更是關於我們為什麼要追求通用人工智慧(AGI)的根本問題。對於對 AI 未來趨勢感到迷惘的人來說,這提供了很好的思考維度。

    🔗 閱讀原文

    💻 開發工具

    ⚡ 使用 AVX-512 進行 Zigzag 解碼 (Zigzag Decoding with AVX-512)

    對於追求極致效能的底層開發者來說,這是一篇技術乾貨。文章介紹了如何利用 Intel 的 AVX-512 指令集來加速 Zigzag 解碼過程。透過向量化運算,能夠大幅提升數據處理的吞吐量。這是理解現代高性能計算(HPC)優化技巧的絕佳案例。

    🔗 閱讀原文

    🌐 開發者並不真的理解 CORS (Developers don’t understand CORS)

    這是一篇雖然有點「毒舌」但極具價值的文章,重新審視了跨來源資源共享(CORS)的機制。作者指出許多開發者只是在盲目地「修復」錯誤,而非理解其安全背後的邏輯。重新掌握 CORS 的原理,能幫助開發者寫出更安全且符合規範的 Web 應用程式。

    🔗 閱讀原文

    🐧 Linux 中的 Epoll vs. io_uring 之爭 (Epoll vs. io_uring in Linux)

    在高併發的 Linux 系統開發中,I/O 模型選擇至關重要。本文深入比較了傳統的 epoll 與新型的 io_uring 在效能與設計哲學上的差異。理解這兩者的優劣,對於設計高吞吐量的伺服器架構具有決定性的影響。

    🔗 閱讀原文

    🚀 創業/商業

    🏘️ TownSquare:網站的輕量化存在層 (Show HN: TownSquare, a tiny presence layer for websites)

    這是一個有趣的創業專案,旨在為網站提供一個極輕量化的互動層。TownSquare 試圖在不改變現有網站結構的前提下,增加用戶的參與感與「存在感」。對於想要快速提升網站互動性的開發者與創業者來說,這是一個值得關注的新工具。

    🔗 閱讀原文

    🔓 開源專案

    📱 Loupe:揭示 iOS 原生 App 權限範圍的工具 (Loupe – A iOS app that raises awareness about what native apps can see)

    這是一個專注於隱私安全的開源專案。Loupe 這款 App 能幫助使用者直觀地了解,手機上的原生應用程式究竟能存取哪些敏感資訊。在隱私意識抬頭的時代,這類工具對於提升一般大眾的數位安全素養非常有幫助。

    🔗 閱讀原文

    🌿 其他

    🧵 在芬蘭圖書館租借縫紉機 (Renting a sewing machine from the library)

    這篇報導帶領我們看見芬蘭圖書館如何演變成社群共享資源的中心。除了書籍,圖書館甚至提供縫紉機等實體工具供民眾租借。這種「共享經濟」的概念不僅減少了浪費,也強化了社區的連結感。

    🔗 閱讀原文

    🧠 緩慢呼吸能調節大腦功能與風險行為 (Slow breathing modulates brain function and risk behavior)

    這項神經科學研究指出,呼吸模式對人類的決策與風險承擔有顯著影響。透過練習緩慢呼吸,我們可以從生理層面調節大腦,進而改變行為模式。這對於在高壓環境下工作的專業人士來說,是一個非常實用的自我調節建議。

    🔗 閱讀原文

    ⚠️ 你的大腦並非為了處理這麼多壞消息而設計 (Your brain was never designed for this much bad news)

    在資訊爆炸的時代,我們每天都被大量的負面新聞包圍。科學研究顯示,人類大腦的演化機制並無法有效應對這種持續性的資訊過載與負面情緒。理解這一點,能幫助我們更有意識地進行「數位排毒」,守護心理健康。

    🔗 閱讀原文


    💡 今日觀點

    核心趨勢總結: 今日的資訊顯示出技術正朝著「更深層(底層優化)」與「更複雜(AI Agent)」兩個方向急速擴張,但這種擴張同時也對人類的心理韌性與系統穩定性提出了挑戰。

    給讀者的行動建議:

    • 技術深化: 如果你從事後端或系統開發,不要只滿足於「會用」,試著去理解 CORS、epoll 或 SIMD 指令集的底層原理,這將是你邁向資深工程師的關鍵。
    • AI 實踐: 在構建 AI 應用時,請將「可靠性」與「錯誤處理」放在與「模型能力」同等重要的位置。
    • 身心平衡: 面對資訊洪流,請學會像研究報告中建議的那樣,透過呼吸調節與有意識的資訊篩選,保護你的大腦不被負面資訊淹沒。
  • Hacker News 每日精選 – 2026-06-20

    🚀 今日科技趨勢速報:從機器人併購到 AI 教育爭議

    今日的科技圈呈現出極大的跨度:一方面是重大的硬體與機器人商業併購,另一方面則是社會對於 AI 進入教育領域的激烈辯論。同時,底層開發技術與分散式架構的討論也持續升溫,這些趨勢共同揭示了技術如何在商業、安全與社會規範之間尋求平衡。

    🤖 AI / 機器學習與科學

    🇳🇴 挪威擬全面禁止小學使用 AI

    挪威政府正考慮對小學階段使用 AI 技術實施近乎完全的禁令。此舉反映了教育界對於 AI 可能影響兒童認知發展與學習能力的深度擔憂。這項政策動向值得全球教育工作者與技術開發者共同關注,因為它代表了社會對 AI 落地速度的制衡。

    查看原文

    🧠 IBM:改變科學家對記憶理解的發現

    IBM 分享了一項突破性的科學發現,這項研究正在重新定義科學界對於「記憶」概念的看法。這不僅僅是生物學上的進展,更可能對未來人工智慧與神經網路的架構設計產生深遠影響。理解記憶的本質是通往更強大類腦計算的關鍵一步。

    查看原文

    🛠️ 開發工具與系統工程

    🌐 我把整個網站都存進了 Favicon 裡

    這是一個極具創意且帶點「極客精神」的實驗,作者成功地將一個網站的內容壓縮並儲存在 Favicon 圖示中。這項技術挑戰展示了在極端受限的空間內進行數據處理的可能性。雖然這並非實際的生產方案,但它極大地啟發了關於數據極限壓縮的思考。

    查看原文

    📊 資料壓縮原理深度解析 (2012)

    這是一篇經典且深入淺出的資料壓縮教學文章。它解釋了從基礎理論到實際演算法如何減少數據冗餘的過程。對於想要鞏固電腦科學底層知識的開發者來說,這是一份不可多得的學習資源。

    查看原文

    📡 ATProto 架構解析:並不存在所謂的「實例 (Instances)」

    本文深入探討了 ATProto 協議的架構設計邏輯。作者挑戰了傳統去中心化社交網路中對於「實例」的認知,解釋了該協議如何透過不同的設計思維來實現互操作性。理解這點對於建構下一代去中心化網路至關重要。

    查看原文

    ⚖️ 負載平衡系統中令人驚訝的經濟學

    系統設計不只是技術問題,更是一場經濟學的權衡。本文探討了在設計負載平衡系統時,如何平衡資源分配、延遲與營運成本之間的複雜關係。對於需要處理大規模流量的架構師而言,這提供了全新的視角。

    查看原文

    💼 創業與商業

    🤖 현대 (Hyundai) 收購 Boston Dynamics

    現代汽車正式取得 Boston Dynamics 的全面控制權,軟銀則以 3.25 億美元退出。這場併購象徵著汽車製造業正加速轉型為機器人與自動化技術的領導者。隨著移動裝置與機器人技術的融合,我們將看到更多跨領域的創新應用。

    查看原文

    🔍 其他有趣話題

    🛰️ 衛星發現 GPS 信號遭大規模篡改

    最新的衛星觀測數據顯示,GPS 信號遭受篡改的規模遠超乎預期。這對現代依賴精準定位的交通、軍事與通訊系統構成了嚴峻的安全威脅。隨著全球對地理資訊安全性的依賴增加,這項發現引起了高度警覺。

    查看原文

    👁️ 你能看見三棵樹嗎?

    這是一個關於視覺感知與心理學的趣味測試。透過簡單的視覺實驗,幫助讀者理解大腦如何處理與解釋視覺資訊。這類內容非常適合在技術研討的空檔進行腦力激盪。

    查看原文

    🔤 你認識 17 萬個英文單字中的多少個?

    這是一個挑戰英語詞彙量的互動式測試。對於希望提升專業技術閱讀能力的讀者來說,這是一個有趣的自我檢測工具。在科技領域,掌握精確的術語對於理解複雜文獻至關重要。

    查看原文


    💡 今日觀點與行動建議

    觀察今日的熱門話題,可以發現一個核心主題:「複雜度的管理與控制」。無論是挪威政府試圖控制 AI 對教育的衝擊、現代汽車對機器人技術的控制,還是開發者在負載平衡與協議設計中尋求的精準控制,技術的發展始終伴隨著對風險與邊界的探索。

    📢 給讀者的行動建議:

    • 關注法規動向: 如果你從事 AI 開發,請密切觀察各國對於 AI 進入教育與公共領域的限制,這將影響產品的落地策略。
    • 回歸底層知識: 在追求最新框架的同時,不妨花點時間複習資料壓縮或系統架構的經典理論,這能幫助你在設計複雜系統時做出更正確的經濟決策。
    • 提升安全意識: 隨著 GPS 篡改等技術威脅增加,在開發具備定位功能的應用時,務必考慮多重驗證機制。
  • Hacker News 每日精選 – 2026-06-19


    🚀 今日科技趨勢速報: 從底層晶片架構的重新定義,到 AI 生態系中日益嚴峻的安全威脅,今日的技術討論顯示出開發者正從「應用層」回流至「系統底層」。同時,隨著 AI Agent(透過 MCP 協議)的普及,如何在自動化流程中建立安全的認證機制,已成為企業開發者必須面對的新課題。

    AI/機器學習 🤖

    Zen and the Art of Machine Learning Research

    • 探討機器學習研究中「心態」的重要性,而非僅僅是參數的調優。
    • 強調在快速迭代的 AI 領域中,保持耐心與深度思考的價值。
    • 為研究人員提供了一種結合科學嚴謹性與哲學思考的研究方法論。

    閱讀原文 🔗

    Zero-Touch OAuth for MCP (Model Context Protocol)

    • 針對 MCP 協議提出企業級的自動化身分驗證解決方案。
    • 旨在解決 AI Agent 在存取企業資源時,複雜且繁瑣的 OAuth 認證流程。
    • 實現「零接觸」體驗,讓 AI 代理能在安全的前提下更流暢地與工具互動。

    閱讀原文 🔗

    Building a robotics research setup that lives next to my desk

    • 分享如何在家中辦公桌旁搭建一套高效的機器人研究實驗室。
    • 涵蓋了硬體選型、環境佈置與研究工作流的整合。
    • 展示了個人研究者如何透過低成本設備實現高度專業的研究環境。

    閱讀原文 🔗

    開發工具 🛠️

    為了研究晶片運作原理,MIT 研究員打造了專屬作業系統

    • MIT 研究團隊開發了一套全新的作業系統,目的是更深入地理解硬體與軟體的互動。
    • 該系統能有效彌合傳統作業系統與現代晶片架構之間的抽象層差距。
    • 這對於未來開發高效能、針對特定硬體優化的計算架構具有重大意義。

    閱讀原文 🔗

    DuckDB 內部原理:為什麼它這麼快?

    • 深入解析 DuckDB 這款高效能分析型資料庫的核心架構。
    • 探討其向量化執行引擎(Vectorized Execution Engine)如何優化查詢效能。
    • 對於想要理解現代 OLAP 資料庫設計的人來說是必讀的技術解析。

    閱讀原文 🔗

    Gribouille 0.3.0:專為 Typst 設計的圖形語法

    • 介紹 Gribouille,這是一個基於 Grammar of Graphics 理論的圖形套件。
    • 專門為 Typst 排版系統設計,讓使用者能以程式化方式生成精美圖表。
    • 為需要處理大量科學圖表文件的使用者提供了強大的自動化工具。

    閱讀原文 🔗

    Datasette Apps:在資料庫內託管自定義 HTML 應用

    • Simon Willison 展示了如何在 Datasette 環境中直接運行自定義的 HTML 應用程式。
    • 這讓資料探索與數據視覺化可以從單純的查詢,提升到互動式工具的層次。
    • 對於數據工程師來說,這提供了一種極其快速的數據工具開發路徑。

    閱讀原文 🔗

    如何定義一個 Well-Known URI

    • 技術性地討論了在 Web 標準中定義「知名 URI」的最佳實踐。
    • 解釋了為什麼這對建立機器可讀的服務發現機制至關重要。
    • 適合對 Web 架構與網路協議設計感興趣的開發者閱讀。

    閱讀原文 🔗

    開源專案 🔓

    發現 1 萬個分發木馬惡意軟體的 GitHub 儲存庫

    • 一項嚴重的安全研究揭露了 GitHub 上存在大量分發木馬程式的儲存庫。
    • 這提醒了開發者在引用開源專案時,必須進行嚴格的供應鏈安全審核。
    • 強調了自動化掃描與信任評估在現代開發流程中不可或缺的重要性。

    閱讀原文 🔗

    其他 🌐

    2025 年冰水溺水年輕患者的生存案例研究

    • 一篇發表於醫學期刊的案例研究,探討極端溫度環境下的生存機制。
    • 雖然屬於醫學範疇,但其對生理極限的紀錄對科學界具有重要參考價值。
    • 展現了生命在極端環境下的韌性與醫療干預的可能性。

    閱讀原文 🔗


    今日觀點 💡

    觀察今日熱門文章,我們可以發現兩個核心趨勢:

    1. 「垂直整合」的技術回歸: 無論是 MIT 的自製作業系統,還是 DuckDB 對底層引擎的優化,開發者不再滿足於僅僅使用工具,而是開始深入鑽研系統底層,以榨取硬體的極致效能。
    2. 供應鏈安全與 AI 認證的雙重挑戰: GitHub 的木馬事件與 MCP 的認證需求,共同指向了一個事實——隨著開發自動化(AI Agent)與開源依賴度的提升,安全防禦必須從「事後處理」轉向「架構層面的預防」。

    🚀 給讀者的行動建議:
    請務必定期審查您專案中的依賴項(Dependencies),並考慮在您的 AI 自動化工作流中,加入嚴謹的身分驗證與權限控管機制,不要讓便利性成為安全性的破口。


  • Hacker News 每日精選 – 2026-06-18

    “`html




    科技趨勢週報

    🚀 今日科技趨勢速報: AI 正在從「創意生成」向「專業領域(如醫療)」與「多模態視覺」深度演進,同時地緣政治對 AI 產業的影響力正持續擴大。理解這些技術細微的定位差異,將是開發者與投資者在下一個週期保持競爭力的關鍵。

    🤖 AI/機器學習

    Midjourney Medical:進軍醫療專業領域

    Midjourney 正試圖打破「僅限藝術創作」的標籤,開始探索醫療影像與專業應用。這標誌著生成式 AI 正從純粹的娛樂工具,轉向具有高門檻、高價值的工作流中。對於醫療科技開發者來說,這是一個值得觀察的風向球。

    🔗 閱讀原文

    本地端 Qwen 模型並非 Opus 的劣質替代品,而是不同的工具

    這篇文章深入討論了本地端運行的 Qwen 模型與雲端頂尖模型(如 Claude Opus)之間的本質區別。作者強調,我們不應單純以「能力高低」來衡量,而應從隱私、延遲、成本與特定任務的適配度來考量。本地化 AI 的核心價值在於「控制權」而非單純的「智力」。

    🔗 閱讀原文

    DeepSeek 推出視覺功能 (Vision)

    中國 AI 強勢品牌 DeepSeek 正式引入視覺能力,這意味著其模型已邁向多模態領域。這將加劇全球多模態模型的競爭,並為開發者提供更多元化的輸入選項。

    🔗 閱讀原文

    🛠️ 開發工具

    Nim 程式語言 2026 年度會議

    對於 Nim 語言的愛好者來說,這是一個重要的技術交流預告。儘管目前熱度不及 Python 或 Rust,但 Nim 在系統級開發與高效能運算方面的潛力仍值得關注。

    🔗 閱讀原文

    💼 創業/商業

    美國暫緩將 DeepSeek 列入黑名單,但仍有百餘家公司被視為安全風險

    在地緣政治的角力中,美國政府對中國 AI 技術的態度趨於複雜。雖然暫緩了對 DeepSeek 的直接制裁,但對上百家技術公司的安全審查仍在持續。這反映了科技產業在「技術創新」與「國家安全」之間的拉鋸戰。

    🔗 閱讀原文

    Apple 執行長 Tim Cook 警告:記憶體晶片成本上升恐導致產品漲價

    硬體成本的波動直接影響科技巨頭的定價策略。由於記憶體晶片供應鏈的成本壓力,Apple 可能會調整其硬體產品線的售價,這對於消費者的購買決策將產生直接影響。

    🔗 閱讀原文

    📂 開源專案

    Lore:專為擴展性設計的開源版本控制系統

    Lore 是一個全新的開源挑戰,旨在解決大規模開發環境下的版本控制難題。對於需要處理極高併發與海量數據的團隊來說,這種針對「擴展性」優化的系統可能成為未來的核心設施。

    🔗 閱讀原文

    🌐 其他

    澳洲政府將要求註冊 SMS/MMS 發送者 ID

    為了打擊詐騙訊息,澳洲政府加強了通訊規範。這項政策將影響所有在澳洲經營的商業通訊服務商,提升了發送者的身份識別要求。

    🔗 閱讀原文

    在智慧型手機摧毀大腦後,如何重新找回自我

    這是一篇關於數位健康與心理學的深度反思。在注意力經濟的時代,我們如何從過度的數位刺激中恢復,重新掌握生活的主動權,是每個科技使用者都該面對的課題。

    🔗 閱讀原文

    Occlupanida 的分類學研究

    這是一篇非常有趣的冷知識文章,探討了那些存在於麵包袋標籤上的奇特「寄生生物」分類。雖然與硬核科技無關,但展現了知識探索的趣味性。

    🔗 閱讀原文


    💡 今日觀點總結

    今日的趨勢顯示出一個明顯的特徵:「AI 的專業化與地緣政治的交織」。我們看到的不再只是通用聊天機器人的競賽,而是 AI 如何進入醫療、如何處理視覺資訊,以及各國政府如何對這些技術進行管控。

    📢 給讀者的行動建議:
    1. 開發者: 開始關注「本地端 AI」的部署技術,而非僅僅依賴 API,這將是未來的差異化關鍵。
    2. 決策者: 密切觀察供應鏈(如記憶體晶片)與政策(如安全性審查)對技術成本與合規性的影響。



    “`

  • A2A 是什麼:用一個 Python 把資料庫變成 AI 外掛技能

    重點摘要

    • A2A 是什麼:把服務包成「一張 AI 看得懂的名片(Agent Card)+ 一個任務入口(/tasks)」,別的 AI 給它一個網址就能自己使用你。
    • 跟 MCP 的差別:MCP 是把「死工具」掛給一個 AI(像 JDBC 驅動);A2A 是讓兩個「會思考的服務」互相喊話(像微服務互呼)。
    • 怎麼被呼叫:分兩層——LLM 讀名片自己挑 skill 是「自然語言層」;身分憑證走 HTTP header 是「水管層」,兩層不混。
    • 只有一個 DB:本質就是「一個 Flask + 一張名片」,本文附可跑程式碼。
    • 權限怎麼帶:token 不放 skill 參數、放 header;「能看什麼」由 server 從 token 推導,不讓呼叫方自報。認證掛在 Nginx 也能發名片——把發現路徑設成白名單即可。

    這篇從「A2A 是什麼」一路講到「放上 production、要管權限時怎麼設計」。對象是上一個世代的後端 RD——你熟悉 REST、微服務、JDBC、Nginx、服務發現,所以全程用你已經會的概念來對照。最後的程式碼我自己在跑,而且真的被另一台機器的 agent 呼叫成功過。

    一、A2A 是什麼?

    A2A(Agent2Agent)是一個讓「AI agent 之間互相呼叫」的開放協議。它由 Google 提出,現已捐給 Linux Foundation,版本到 v1.0。核心只有兩個東西:

    1. Agent Card(名片):一份放在固定網址的 JSON,描述「我是誰、我會哪些技能(skills)、任務要打哪個網址、要怎麼認證」。別的 agent 靠它「發現」你。
    2. Task 入口:一個收任務的端點(例如 POST /tasks),別人帶著「我要用哪個 skill」打進來,你執行、回 JSON。

    就這樣。一個 A2A agent,對別的 AI 來說,就像一個「外掛技能」:本來不會查你系統的 LLM,你給它一個網址,它讀了名片就「學會」用你了——不需要工程師事先把兩邊接線。

    用生活化比喻:名片 + 通訊錄

    想像你是一間公司的窗口。你印了一張名片,上面寫「我負責:查包裹、開通知單、查住戶數」。任何人拿到這張名片,看一眼就知道能找你做什麼、該打哪支電話。A2A 的 Agent Card 就是這張名片;/tasks 就是那支電話。差別只在於:讀名片、打電話的不是人,是另一個 AI。

    二、上世代 RD 怎麼理解 A2A 與 MCP 的差別?

    這是最多人卡住的地方。用你熟悉的後端概念對照,一秒就懂:

    你熟悉的概念 MCP A2A
    JDBC / ODBC 驅動程式 ✓ 標準介面,把工具(DB/檔案/API)接給「一個」AI 用
    微服務互相呼叫(REST) ✓ 一個服務呼叫「另一個會思考的服務」
    服務發現(Eureka / Consul) ✓ 靠 Agent Card 自我描述被發現
    對方是「活的」還是「死的」 死的:工具被動被呼叫,不會自己判斷 活的:對方是個會用 LLM 自己判斷的 agent

    一句話收斂:MCP 是「AI ↔ 工具」,A2A 是「AI ↔ AI」。MCP 把一隻手伸向工具箱;A2A 是兩個有腦袋的人互相打電話。兩者不衝突,常常一起用——你的 agent 用 MCP 拿工具,同時用 A2A 去問別的 agent。

    三、A2A 怎麼跟 AI Agent 一起運用?(MCP 與 Skill 的分工)

    • MCP:當你的 AI 需要用「工具」——查 DB、讀檔案、呼叫某個 API——就掛一個 MCP server。工具不會思考。
    • A2A:當你的 AI 需要請「另一個 agent」幫忙——對方有自己的 domain 知識、會自己判斷——就用 A2A 呼叫它。
    • Skill:在 A2A 名片裡,一個 agent 把自己會的事拆成一個個「技能(skill)」宣告出來。呼叫方的 LLM 讀這些技能描述,自己挑要用哪一個。

    所以 Skill 是 A2A 名片裡的最小單位。一張名片可以宣告多個 skill,每個 skill 背後接不同的後端——有的查即時 DB、有的走知識圖譜、有的呼叫生成式模型。呼叫方不需要知道背後怎麼接,它只看得到「技能清單」。

    四、怎麼用自然語言「呼叫」一個 A2A agent?

    關鍵觀念:呼叫方不寫死「呼叫 skill X」。它把「名片上的技能清單」加上「使用者講的自然語言」一起交給 LLM,讓 LLM 自己挑出最適合的 skill,再去打 /tasks。流程三步:發現 → 判斷 → 呼叫。這是「判斷」那一步的真實程式碼:

    def llm_pick(user_says, skills):
        menu = "\n".join(f"- {s['id']}: {s['name']} — {s['description']}" for s in skills)
        prompt = (f"使用者說:「{user_says}」\n"
                  f"下面是某個 agent 提供的 skill,挑最適合處理這句話的一個,"
                  f"只回那個 skill 的 id、不要任何解釋:\n{menu}")
        # ...把 prompt 丟給 LLM,回應裡比對出 skill id

    先記住這個分層:自然語言層 vs 水管層(後面講權限會用到)

    一次 A2A 呼叫其實有兩層,先分清楚,等一下講權限才不會打結:

    誰在做 放什麼
    自然語言層 LLM 讀名片、挑 skill 業務參數(query、id)
    水管層(HTTP) client 程式發請求 身分憑證(Authorization header)

    所以「用自然語言達到 A2A」,是把對方的名片餵給你的 LLM、讓它把人話翻成「該呼叫哪個 skill」;而身分憑證從頭到尾不經過 LLM,是底層水管自動帶的。名片寫得好,LLM 就挑得準。

    五、只有一個 DB,怎麼做出一個 A2A agent?

    直接回答最多人的疑問:對,本質就是「一個 Python 寫的 API 口」——只是比普通 REST API 多兩樣:一張名片、用 skill 分路。下面是能跑的最小骨架(Flask),背後接一個資料庫:

    from flask import Flask, request, jsonify
    app = Flask(__name__)
    
    # ① 名片:宣告我會哪些 skill、task 打哪
    CARD = {
      "name": "社區管理大腦",
      "url": "http://localhost:9999",
      "skills": [
        {"id": "parcel_status", "name": "包裹卡單查詢",
         "description": "查 outbound 各狀態的真實件數,即時查 DB"},
      ],
    }
    
    @app.get("/.well-known/agent-card.json")   # 別人靠這個網址發現我
    def card(): return jsonify(CARD)
    
    @app.post("/tasks")                          # 別人帶 skill 打進來
    def tasks():
        skill = request.get_json().get("skill")
        if skill == "parcel_status":
            rows = db_query("SELECT status, COUNT(*) FROM parcels "
                            "WHERE direction='outbound' GROUP BY status")
            return jsonify({"facts": rows})
        return jsonify({"error": "unknown skill"}), 400

    名片 endpoint + task endpoint + 一句 SQL,你的資料庫就成了一個 A2A agent。要加技能,就在 CARD["skills"] 多宣告一筆、在 /tasks 多一條分支。

    把名片從「自我介紹」升級成「可被機器編排的技能契約」

    上面那張名片只夠「人」看懂。要讓另一個 AI 自動挑對 skill、帶對參數,再補三個欄位:parameters(要帶什麼)、returns(會拿到什麼)、whenToUse(什麼情境該挑我)。這等於「透過 API 發布一份技能契約」:

    {
      "name": "Tom 的部落格 Agent",
      "usageHint": "每個 skill 附 parameters/returns/whenToUse,呼叫方 LLM 讀完即可自行編排,無需接線。",
      "skills": [
        {
          "id": "search_posts",
          "name": "用關鍵字搜尋文章",
          "description": "全文搜尋,回最相關的前 5 篇(標題/摘要/連結/id)",
          "parameters": { "query": {"type": "string", "required": true, "desc": "搜尋關鍵字"} },
          "returns":    "hits[]{id,title,link,date,excerpt} + total",
          "whenToUse":  "使用者問題能抽出明確關鍵字、要定位文章時"
        }
      ]
    }

    有了 whenToUse + parameters,呼叫方的 LLM 就能自己編排多步。這就是「用 Data + API 把你的資料融入 AI」的具體長相:資料是真實內容,API 是入口,而這張契約是讓 AI 自己會用的關鍵。

    它真的被呼叫成功了——一段真實的 server log

    把這個 agent 跑起來後,區網另一台機器(192.168.0.51)的一個 agent 來呼叫,log 完整記錄了它「猜協議 → 發現名片 → 從錯誤學會 → 成功」的過程:

    # 它先亂猜各種常見慣例(全 404):
    GET /health ... /v1/chat/completions ... /mcp ... /openapi.json   → 404
    
    # 命中標準路徑:
    GET  /.well-known/agent-card.json   → 200   ← 讀到名片!
    POST /tasks                         → 400   ← 沒給對 skill,被回 available 清單
    POST /tasks                         → 200   ← 從錯誤學到 skill 名,改對了,成功

    注意那個 400 → 200:呼叫方第一次打錯,server 回了「可用技能清單」,它自己讀懂、改對、成功。這就是 A2A 的精神——服務自我描述,呼叫方自己學會用,中間沒有工程師接線。

    六、同一個 /tasks 入口,不同 skill 走不同後端

    對外永遠是同一個 /tasks 入口,進來後依 skill 分流。下面四個 handler 各代表一種典型後端——呼叫生成式 Agentic SDK、走快取、查 DB、純快速計算——呼叫方完全不需要知道背後差異。

    import anyio
    from claude_agent_sdk import query, AssistantMessage, TextBlock
    
    # ① Agentic SDK 後端:呼叫會思考的 agent 生成文字(慢、秒級)
    def route_draft_notice(body):
        prompt = f"用繁體中文寫一段 50 字內催領通知,目前有 {body.get('stuck', 0)} 件待領包裹。"
        async def _ask():
            out = []
            async for msg in query(prompt=prompt):          # Claude Agent SDK 一次性查詢
                if isinstance(msg, AssistantMessage):
                    out += [b.text for b in msg.content if isinstance(b, TextBlock)]
            return "".join(out)
        return {"route": "agentic_sdk", "generated": anyio.run(_ask)}
    
    # ② 快取後端:第一次 miss 才查 DB,之後走記憶體(毫秒)
    def route_community_stats(body):
        hit = cache_get("community_stats")
        if hit is not None:
            return {"route": "cache_hit", "data": hit}
        data = {"households": db_query("SELECT COUNT(*) FROM households")[0][0]}
        cache_set("community_stats", data)
        return {"route": "cache_miss_then_db", "data": data}
    
    # ③ DB 後端:即時查真實事實,完全不靠模型
    def route_parcel_status(body):
        rows = db_query("SELECT status, COUNT(*) FROM parcels "
                        "WHERE direction='outbound' GROUP BY status")
        return {"route": "db_realtime",
                "facts": [{"status": s, "count": c} for s, c in rows]}
    
    # ④ 快速計算後端:純算、無 IO(最快)
    def route_late_fee(body):
        days = int(body.get("overdue_days", 0))
        return {"route": "compute", "overdue_days": days, "late_fee": min(days, 30) * 5}

    /tasks 本身只是一張「skill → handler」對照表,進來分流出去就好。名片對外宣告技能,但背後是 DB、快取、純算還是會思考的 agent,全藏在門面後;加後端只要多一個 handler + 對照表一行。

    七、權限:誰能看什麼資料?(認證 vs 授權)

    真實系統的 DB 一定有「誰能看哪些 row」。新手最常問:這種權限要不要做成 skill 參數、讓使用者連的時候把帳密帶進去?都不要。先把兩件事拆開:

    • 認證(Authentication)= 你是誰 → 驗 token 簽章
    • 授權(Authorization)= 你能看哪些 row → server 從已驗證的身分推導範圍

    核心原則一句話:token 不放 skill 參數、放 HTTP header;「能看什麼」由 server 從 token 推導,不讓呼叫方自報。還記得第四段的兩層嗎——身分屬於「水管層」,不屬於「自然語言層」。A2A 名片用 securitySchemes 宣告認證方式(Bearer JWT / API Key / OpenID Connect),呼叫方把憑證放 Authorization header,而不是塞進 skill 的 parameters

    # 名片宣告認證方式(A2A securitySchemes)
    CARD["securitySchemes"] = {"bearer": {"type": "http", "scheme": "Bearer", "bearerFormat": "JWT"}}
    CARD["security"] = [{"bearer": []}]
    
    @app.post("/tasks")
    def tasks():
        # ① 認證:token 從 HEADER 取(不是 body 參數!),驗簽
        token = request.headers.get("Authorization", "").removeprefix("Bearer ").strip()
        claims = verify_jwt(token)
        if not claims:
            return jsonify({"error": "unauthorized"}), 401
        ctx = {"user_id": claims["sub"], "community_id": claims["community_id"], "role": claims["role"]}
    
        body = request.get_json()
        handler = SKILL_MAP.get(body.get("skill"))
        return jsonify(handler(body, ctx))         # ② 把已驗證身分傳給 handler
    
    # ③ 授權:範圍來自 ctx(token),不是 body —— caller 改不了別人的 community_id
    def route_parcel_status(body, ctx):
        rows = db_query("SELECT status, COUNT(*) FROM parcels "
                        "WHERE community_id = %s GROUP BY status", ctx["community_id"])
        return {"facts": rows}

    更保險的做法是把範圍下推到 DB 層的 RLS(Row-Level Security):handler 只從 ctx 設一次,之後資料庫自己擋,handler 想繞都繞不過。為什麼一定要這樣?因為 caller 帶進來的 body 一律不可信——它可以亂填 community_id=別人的。讓 caller 自己指定範圍,等於誰來問都能撈全部,這就是經典的 confused deputy(被搞混的代理人) 漏洞。

    那個 token 哪來?放哪?(你不用把帳密唸給 AI 聽)

    token 不走自然語言。使用者對登入端登入一次、換到一個短期 JWT,之後由 client 程式自動帶,LLM 碰都碰不到。token 放在一個秘密檔(像 .env,chmod 600),呼叫時讀出來貼 header——不貼進對話、也不做成 skill:

    # token 放秘密檔,呼叫時才讀出來貼 header(整個過程沒人看到 token 的值)
    curl -H "Authorization: Bearer $(cat ~/.config/a2a/token)" \
         -d '{"skill":"parcel_status"}' https://your-agent/tasks
    
    # 帳密要定期刷 token 的話:先拿憑證換動態 token,再打 A2A
    TOKEN=$(curl -s -u "$CLIENT_ID:$CLIENT_SECRET" https://idp/oauth/token | jq -r .access_token)
    curl -H "Authorization: Bearer $TOKEN" -d '{"skill":"parcel_status"}' https://your-agent/tasks

    定期刷的場景就是 OAuth2 的 client-credentials / refresh 流程:你準備好「帳密 + 一個換 token 的小程式」,呼叫方先拿帳密換動態 token,再打 A2A,過期就再換一次。注意:發 token 的(登入端 / IdP)要跟驗 token 的(A2A server)分開,別把登入服務塞進 A2A 本身。

    八、發現 vs 認證:服務全鎖時,名片還怎麼發?

    這裡有個雞生蛋問題:如果服務要認證,那「還沒有帳密的人」怎麼讀得到名片、知道怎麼用?更現實的是——大多數系統的 auth 掛在最前面的 Nginx 層、ingress annotation 或 WAF,請求根本到不了你的 router 就被踢掉,那名片不也一起被擋了?

    解法一:名片分兩層,公開的那層本來就免認證

    名片 路徑 要認證? 內容
    公開名片 /.well-known/agent-card.json ❌ 免 基本技能 + 「我怎麼認證」(securitySchemes)
    進階名片 /extendedAgentCard ✅ 要 驗證後才看得到的完整 / 隱藏技能

    「怎麼用我」這件事本身是公開的:公開名片不需要帳密就讀得到,而且它自己會告訴你「要進來請走這個認證方式」。發現永遠在認證之前。至於最初那組帳密哪來?A2A 協議不發帳密——它是透過 out-of-band(協議之外)拿到的,也就是一個人的決定:管理員幫你開帳號、給你 client_id/secret。協議不會從零變出信任。

    解法二:把發現路徑設成 Nginx 白名單(跟 /login 同一招)

    你早就有一批「必須公開的 bootstrap 路徑」:/healthz(LB 探活)、/.well-known/acme-challenge/*(Let’s Encrypt 續憑證)、/oauth/token(認證端自己不能要認證)。公開 Agent Card 就是再加一條進這個白名單而已:

    # 其他全鎖,只開這一個發現路徑
    location = /.well-known/agent-card.json {
        auth_request off;          # 不套那道 auth
        proxy_pass http://a2a_backend;
    }
    location / {
        auth_request /_auth;       # /tasks、/extendedAgentCard 照常鎖
        proxy_pass http://a2a_backend;
    }

    安全上不虧:A2A spec 明講公開名片不可放機密,它只放「名稱 + 怎麼認證 + 非敏感技能」,敏感技能放進階名片。所以開白名單不洩漏東西,只是貼一張「敲門方式」在門口。

    解法三:全內網死鎖時,名片根本不從這台機器送

    如果你連白名單都不想開(整個服務鎖在防火牆後),那就不要用公開發現,改用 A2A 另外兩種發現方式。關鍵觀念:名片只是一份可攜的 JSON,不一定要從「被保護的那台機器」送出去——發現 ≠ 執行,名片可以跟服務不同台。

    • Direct Configuration:你直接把名片 JSON(或內部 URL)手動給授權的呼叫方。
    • 內部 Registry:名片發布到一個內部 agent 目錄,授權 client 去那查。

    呼叫方本來就得在你的網路邊界內(VPN / 內網)才打得到 /tasks,那它也能從同一個內網管道拿到名片——你不用為了發名片在防火牆上戳洞

    九、實戰會踩的坑

    • a2a-sdk 版本坑:網路範例多半用 A2AStarletteApplication(0.x,pydantic + Starlette);但現在 pip install a2a-sdk 裝到的 1.1.0 是 protobuf / gRPC 生成,API 完全不同,照舊範例會整段跑不起來。協議穩定,SDK 的 API 會變——手刻一個極簡 HTTP server 反而最穩。
    • 把認證塞進 skill 參數:最常見的設計錯。憑證走 header、走 securitySchemes,絕不放進 skill 的 parameters;範圍永遠由 server 從 token 推導。
    • Cloudflare / WAF 擋 UA:agent 去抓套了 Cloudflare 的服務,Python urllib 不帶 User-Agent 會被回 403;帶一個瀏覽器 UA 就 200。

    結論:A2A = API 口 + 一張名片 + 一道標準的認證

    把 A2A 想成「微服務互呼,但對方是會思考的 agent,用一張名片自我介紹、讓呼叫方的 LLM 自己學會用」,核心就抓到了。技術上它可以小到一個 Flask 檔 + 一句 SQL;放上 production 時,認證走標準 header、授權由 server 從身分推導、發現用公開名片或內部 registry——每一塊都對得上你已經會的後端慣例,沒有新魔法。難的從來不是協議,而是:你那張名片上,值得被別的 AI 呼叫的技能,到底是什麼?

  • Hacker News 每日精選 – 2026-06-16

    🚀 Hacker News 每日技術洞察:從 AI 本地化趨勢到低階工程的極致挑戰

    今日科技圈的核心矛盾在於「AI 的雲端便利性」與「開發者對本地端掌控權」之間的拉鋸。同時,從低階模擬器的工程細節到 LinkedIn 的安全漏洞,再次提醒我們無論技術如何演進,底層邏輯與資訊安全始終是支撐數位世界的基石。

    閱讀本文,你將掌握從 AI 模型選擇、網路底層技術到硬體駭客藝術的最新動態,這對於開發者與技術愛好者來說,是保持技術敏感度的絕佳途徑。

    🤖 AI/機器學習

    [討論] 有人在日常開發中,已用本地模型取代 Claude 或 GPT 嗎?

    隨著開源模型性能不斷提升,開發者們開始討論一個核心問題:我們是否能擺脫雲端 API 的依賴?許多人正在嘗試將本地 LLM 整合進開發流程中。這不僅關乎隱私,更關乎對開發環境的完全控制權。目前社群對於本地模型在「推理能力」與「代碼精準度」上的表現仍有激烈辯論。

    👉 查看原文討論

    🛠️ 開發工具

    x86 模擬器團隊遇見了「爛到必須在模擬時直接修掉」的程式碼

    這是一個關於底層工程極致精神的故事。當模擬器團隊在處理 x86 指令集時,發現某些舊代碼的邏輯極其混亂,甚至會導致模擬失敗。最終,他們決定不只是模擬,而是直接在模擬過程中進行「程式碼修復」。這展示了在處理複雜系統時,工程師如何應對歷史遺留問題的決斷力。

    👉 查看原文

    John Carmack 對 Fabrice Bellard 的高度評價

    傳奇遊戲開發者 John Carmack 分享了他對天才工程師 Fabrice Bellard 的看法。Bellard 以其驚人的開發效率與多樣化的技術成就(從模擬器到編譯器)聞名。這篇文章讓讀者重新審視什麼是真正的「技術天賦」,以及如何在極限環境下撰寫高效能代碼。

    👉 查看原文

    Iroh 1.0 正式發佈

    Iroh 是一個專注於下一代網路傳輸協議的新技術。隨著分散式系統與邊緣運算的需求增加,Iroh 提供了更強大的連接與傳輸能力。這次 1.0 版本的發佈標誌著該專案進入了穩定與可擴展的新階段,值得關注其對未來網路架構的影響。

    👉 查看原文

    💼 創業/商業

    LinkedIn 職缺中的後門攻擊陷阱

    這是一則嚴重的安全警示。駭客利用 LinkedIn 上的虛假職缺作為誘餌,將受害者引導至惡意鏈接或檔案,進而植入後門。對於正在尋找機會的技術人員來說,這提醒了我們在數位求職過程中,驗證資訊來源的重要性。網路釣魚的手段正變得越來越專業化與針對性。

    👉 查看原文

    🎨 其他

    我差點能用 Rickroll 惡搞整個 FIFA 世界盃

    這是一位駭客分享的驚險經歷,描述了他如何發現了可能影響世界盃重大活動的安全漏洞。雖然最終只是差一點就能完成這場大規模的惡作劇,但這篇文章深入剖析了大型賽事背後的技術脆弱性。它提醒了我們,在看似堅不可摧的數位基礎設施中,往往存在著意想不到的漏洞。

    👉 查看原文

    藏在 Wi-Fi 智慧燈泡裡的「禁書圖書館」

    這是一個結合了硬體駭客與社會意義的創意專案。開發者將受限或被禁的書籍內容,透過智慧燈泡的 Wi-Fi 訊號進行傳輸與展示。這種利用 IoT 裝置進行隱蔽式資訊傳播的方式,既展現了技術的趣味性,也引發了關於數位隱私與資訊自由的思考。

    👉 查看原文

    Garden of Flowers:ASCII Art 前的圖像文字檔案館

    這是一個充滿懷舊情懷的數位檔案專案。它整理了在 ASCII art 流行之前,人類如何利用早期印刷與字符技術進行視覺表達的紀錄。對於設計師與數位考古學愛好者來說,這是一個探索視覺溝通演進史的珍貴資源。

    👉 查看原文

    TinyWind:具備真實物理風力的像素海盜遊戲

    這款遊戲展示了如何在像素風格的藝術形式中,完美融合複雜的物理模擬。遊戲中的風力物理效果不僅提升了沉浸感,也證明了即使在低解析度的視覺風格下,深度的技術底層模擬依然能帶來極佳的遊戲體驗。

    👉 查看原文

    我駭入了最爛的電動自行車並把它修好了

    透過硬體駭客的視角,作者展示了如何透過拆解與重寫底層控制邏輯,來拯救一台性能低劣的電動自行車。這不僅是一場技術挑戰,更是一次對硬體產品設計缺陷的直接抗議。影片生動地展示了軟體如何賦予劣質硬體第二次生命。

    👉 查看原文

    💡 今日觀點

    今日趨勢總結:
    今日的技術動態顯示出一個明顯的雙向趨勢:一方面是「技術的高度精細化」(如 x86 模擬與物理引擎),另一方面則是「對控制權與安全的重新奪回」(如本地 AI 與硬體駭客)。

    給讀者的行動建議:

    • 🛡️ 安全防範: 在處理 LinkedIn 等社群平台的職缺訊息時,請務必保持高度警覺,不要輕易點擊未經證實的外部連結。
    • 🧠 技能佈局: 關注本地 LLM 的發展,嘗試在本地環境部署模型,這將是未來開發者建立技術護城河的重要能力。
    • 🛠️ 保持好奇: 無論是底層的 C 語言還是高層的 AI,理解「為什麼它能運作」比「如何使用它」更能讓你脫穎而出。
  • 一張圖看懂 AI Agent 系統:Loop、Harness、MCP、A2A 差在哪

    每次跟同事解釋 AI Agent 系統,最常見的反應,是看著 Loop、Harness、MCP、A2A、Dataset 一堆名詞發呆。會迷茫,是因為這些詞常被當成「平行並列」硬背。其實它們分屬三層、各司其職,而且有先後順序。這篇用一張全景圖,加上「員工在公司做事」的比喻,讓完全不懂技術的人也能 30 秒看懂彼此的關係,以及最容易混淆的 MCP 與 A2A 到底差在哪——最後再談一個實際問題:怎麼讓整個團隊在一個平台上共用 agent。

    重點摘要

    • Loop / Harness / Agent / Skill / MCP / API / Dataset / A2A 不是平行概念,是三層:HARNESS(手腳)→ KNOWLEDGE(規矩與記憶)→ LOOP(節奏與目標)。
    • MCP 讓 agent 接「工具與資料」(把對方當死的工具);A2A 讓 agent 接「其他 agent」(把對方當活的同事)。兩者互補,不打架。
    • 要讓整個團隊共用 agent,關鍵不是「又一個聊天框」,而是一個共享的知識中樞,讓全團隊的 agent 站在同一份事實上工作。

    先看這張圖:30 秒看完全部關係

    如果下面的文字看不完,只要記住這張圖就夠了。外層的 LOOP 包著 KNOWLEDGE 和 HARNESS,Agent 用 MCP 接工具、用 A2A 接其他 agent。

    🗺️ 30 秒全景圖(外框就是 LOOP)
    🟢 KNOWLEDGE 規矩 + 記憶(Agent 做事時隨時回來查)
    📋 Skill 正確做法 🩹 Brain 踩過的坑 📒 KM 接真實資料庫的事實
    🔵 HARNESS 環境 + 對外插座
    🧑‍💼 Agent ──MCP──▶ 工具 / API / 資料庫(死的工具) ──A2A──▶ 其他 Agent(活的同事)
    📚 Dataset = 造出模型的底層料(已煮進模型、會記錯,所以才需要上面的 KM 當場查真相)
    一句話:HARNESS 給手腳 → KNOWLEDGE 給規矩記憶 → LOOP 給節奏目標。

    三層,不是一排:正確理解的關鍵

    這些名詞會讓人頭痛,是因為大家把它們當成同一層的東西在背。把「AI 幫你做一件事」拆開,其實由下往上是三層:下層給能力,中層給規矩與記憶,上層給節奏與目標。而且有一條鐵律:一定是 HARNESS → KNOWLEDGE → LOOP。工具沒備好、規則沒寫好,就先讓 agent 自己跑,它會被冒出來的錯誤推著改個沒完,沒有終點。

    用「員工在公司上班」秒懂每個名詞

    把整套 AI 系統想成一位員工在公司做事,每個名詞都對得上一個你熟悉的東西:

    名詞 一句話 員工比喻 屬哪層
    Agent會自己判斷、動手做事的 AI 本體員工本人工具層
    Harness承載 agent 的環境、工具與權限辦公室與設備工具層
    MCP接「工具/資料」的標準插座萬用識別證工具層
    API外部系統對外的窗口部門窗口工具層
    A2A接「另一個 agent」的協定同事間協作工具層
    Dataset造出模型的原始料(會煮進模型、會記錯)讀過的書工具層
    Skill某類任務的正確做法作業 SOP規則層
    Brain 防錯腦踩過的坑(事實,不背叛)血淚筆記規則層
    KM 正道腦接真實資料庫的事實 + 可糾正的判斷公司帳本 + 老師傅規則層
    Loop做到可驗證目標達成才停工作節奏 / KPI流程層

    最容易搞混的:MCP 與 A2A 差在哪?

    一句話分清楚:看你把對方當「死的工具」還是「活的同事」。MCP 是 agent 跟工具、資料的對話;A2A 是 agent 跟另一個 agent 的對話。

      MCP A2A(Agent-to-Agent)
    對象工具 / 資料(死的,聽話)另一個 agent(活的,會自己判斷)
    做什麼幫我查、幫我寫進去交辦多步驟任務、追蹤進度、他做完回報
    員工比喻員工 ↔ 部門窗口員工 ↔ 別的員工

    兩者不打架,是互補的:一個團隊用 A2A 在 agent 之間分工協作,而每一個 agent 內部都用 MCP 去接自己要用的工具。A2A 管「同事之間的對話」,MCP 管「每個人跟工具的對話」。

    A2A 實際怎麼運作:靠一張「名片」

    A2A 的核心是 Agent Card(代理名片)。每個 agent 在一個固定網址掛一張公開的名片,上面寫清楚:我會做什麼、我的服務入口在哪、怎麼跟我認證。別的 agent 不需要知道你內部怎麼運作,只要讀這張名片,就能發現你、把任務交給你、等你做完回報。就像兩家公司合作,看的是對方門口「服務項目 + 聯絡窗口」的牌子,不需要走進對方辦公室看他們怎麼做事。

    這在 2026 已經是業界標準:A2A 由 Google 發起、現在交給 Linux Foundation 治理,有 Python、JavaScript、Java、Go、.NET 五種語言的開發套件,並已內建進 Microsoft Copilot Studio、Azure AI Foundry、Amazon Bedrock 等平台。意思是,不同廠商、不同框架做出來的 agent,現在能用同一套規矩互相對話——這正是「讓大家的 agent 互通」的基礎。

    關鍵:知識層為什麼要接「真實資料」,而不是寫死答案

    AI 會幻覺、會忘記。所以把知識接給 agent 時,真正可靠的不是「標準答案」——答案是判斷,會隨著架構改變而過期。可靠的是兩種事實:一是「過去踩過的坑」(真的發生過,不會變),二是「資料庫此刻的真實數字」(當場查得到)。讓事實去約束 AI 的嘴,而不是讓 AI 的判斷當真理。這就是為什麼進階的知識系統(KM)會直接接上正式資料庫,而不是把答案寫死在文件裡——真相在帳本裡,不在 AI 的記憶裡。

    進階:怎麼讓整個團隊在一個平台上共用 agent?

    現在多數人是「一個人對一個 AI 工具」,各做各的——知識不共享、agent 不互通、同樣的事每個人重做一次。如果要讓整個團隊(包含不會寫程式的同事)在一個平台上共用 agent,要補三個能力,由淺到深:

    1. 共享的知識/工具中樞(最該先做):用一個團隊共用的 MCP 中樞,讓每個人的 agent 都連到同一套知識庫和工具。這樣大家查到的是同一份事實、同一套規矩,不再各憑記憶。這就是平台的心臟。
    2. agent 之間能協作:同一個系統內,可以一個「主管 agent」把任務拆給幾個「工人 agent」;跨不同系統、不同廠商,就用前面講的 A2A,讓各自的 agent 互掛名片、互相委派。
    3. 讓非技術同事也能用:大部分 agent 工具是給工程師的指令列介面,一般同事用不了。要在前面包一層簡單的網頁入口,同事用下拉選單選角色、打字提問就好。

    落地有兩條路。買現成平台(例如 monday.com、Microsoft Copilot Studio)走免寫程式、上手快,適合通用流程;但它通用、不認識你的產業,也接不上你公司的真實資料庫。自己搭(用 agent 開發框架 + 自建的共享 MCP 中樞 + 網頁入口)工要多一些,但能接上你自己的領域知識和真實營運資料——而這正是現成平台給不了的差異。

    一個關鍵判斷:平台的價值不在「又一個聊天框」,而在那個共享的知識中樞——它讓全團隊的 agent 站在同一份事實上工作。先把這個中樞建起來,agent 協作和網頁入口都是接上去的事。

    一句話收尾

    下次再看到這一串名詞,不用硬背。記住三層就好:HARNESS 給手腳、KNOWLEDGE 給規矩與記憶、LOOP 給節奏與目標;而 MCP 接工具、A2A 接同事。要把團隊一起拉上來,先建一個大家共用的知識中樞,剩下的細節,都掛在這個骨架上。

  • Hacker News 每日精選 – 2026-06-15

    🚀 今日科技趨勢精選:從 AI 透明度到經典運算原則的演進

    今日的科技趨勢展現了開發者社群對「工具深度」與「系統透明度」的持續追求。無論是針對 AI 模型真實性的質疑,還是對經典分散式運算謬誤的重新審視,都顯示出技術成熟期對於基礎理論與誠實開發的重視。閱讀今日整理的文章,將幫助你從底層原理到前沿應用,建立更完整的技術視野。

    🤖 AI/機器學習

    🇧🇷 里約熱內盧的「本土」LLM 疑似為現有模型的混合體

    這篇文章探討了巴西里約熱內盧聲稱開發了全新本土大型語言模型(LLM)的爭議。根據社群的研究與回饋,該模型似乎只是將現有的模型進行了合併或微調,而非真正的原創開發。這引發了關於 AI 研發透明度以及「本土化模型」定義的熱烈討論。對於關注區域 AI 技術發展的讀者來說,這是一個關於模型真實性與聲譽的警示案例。

    🔗 原文連結

    🛠️ 開發工具

    ⌨️ Emacs:內建功能愈發豐富的開發利器

    Emacs 一直以其強大的擴充性著稱,但這篇文章探討了它如何持續朝著「內建更多功能(batteries included)」的方向演進。這不僅僅是增加功能,更是在重新定義編輯器的邊界。對於追求極致工作流整合的開發者來說,這篇文章提供了關於軟體設計哲學的深度思考。了解 Emacs 的演進,有助於理解高度客製化工具的未來發展方向。

    🔗 原文連結

    🔒 Curl 將在 2026 年 7 月暫停接收漏洞報告

    知名網路傳輸工具 Curl 宣布,為了讓維護團隊獲得喘息,將在 2026 年 7 月期間暫停接收漏洞報告。這段被稱為「極樂之夏(Summer of Bliss)」的計畫,旨在平衡開源維護者的心理健康與軟體安全性。雖然這是一項特殊的行政安排,但開發者應提前關注其公告,以確保在該期間能有完善的安全應對預案。這也反映了開源維護工作日益沉重的現實。

    🔗 原文連結

    🌐 分散式運算八大謬誤:21 年後的持續觀察

    這是一篇關於電腦科學經典理論的回顧文章,探討了「分散式運算八大謬誤」在 2025 年的現況。即便技術進步神速,許多開發者在設計分散式系統時仍會落入這些經典的陷阱。重新審視這些原則,對於建構穩定、可擴展的現代雲端架構至關重要。這篇文章提醒我們,底層理論的價值在技術變遷中依然不變。

    🔗 原文連結

    👾 Bitsy:極簡主義的遊戲創作工具

    Bitsy 是一款專注於像素藝術風格的小型遊戲引擎,讓開發者能以極低門檻進行創作。它捨棄了複雜的物理引擎,轉而強調敘事與氛圍的營造。對於想要快速實現創意、不被複雜技術堆疊所困擾的開發者來說,這是一個非常迷人的工具。它展示了「簡約設計」如何能激發出無限的遊戲可能性。

    🔗 原文連結

    📦 開源專案

    🌑 Kage:將網站打包成單一二進制檔案的離線工具

    Kage 是一個非常有創意的開源專案,它能將任何網站「陰影化(shadow)」成一個單一的二進制檔案。這使得使用者可以在完全離線的環境下,像閱讀本地檔案一樣瀏覽完整的網頁內容。對於需要進行網頁考古、研究或在無網路環境下工作的專業人士來說,這是一個極其強大的工具。這類型的工具再次證明了將動態網路內容靜態化的技術價值。

    🔗 原文連結

    🌈 其他

    📖 你的 ePub 檔案其實沒問題

    針對電子書閱讀器常出現的相容性問題,作者提出了一個有趣的觀點:問題可能不在於 ePub 格式本身,而在於 Adobe 的標準實作。這篇文章深入探討了數位出版格式與閱讀硬體之間的技術糾葛。理解這些細節,能幫助讀者更理性地看待數位閱讀裝置的限制。這對於數位出版從業者與重度閱讀者來說都有參考價值。

    🔗 原文連結

    🕹️ 透過玩夾娃娃機來證明你是真人

    這是一個極具創意且充滿趣味性的 Captcha 驗證方案。它將原本枯燥乏味的安全檢查,轉化為一個簡單的夾娃娃機小遊戲。這種將安全驗證與使用者體驗(UX)結合的嘗試,展示了如何讓防禦機制變得不再令人生厭。這不僅是技術上的創新,更是對使用者心理學的巧妙應用。

    🔗 原文連結

    🪵 劈柴模擬器:療癒感十足的數位體驗

    這是一個純粹為了放鬆與滿足感而設計的劈柴模擬器。在數位世界中模擬木材裂開的物理效果,提供了一種視覺與心理上的療癒感。雖然它沒有複雜的技術背景,但在壓力巨大的科技圈中,這類「無意義但解壓」的軟體反而能吸引大量關注。這提醒我們,軟體的用途不應僅限於生產力。

    🔗 原文連結

    📄 為什麼紙張這麼好摺?

    這是一篇結合物理學與日常觀察的科普文章,探討了紙張摺疊性能背後的科學原理。透過科學視角來拆解看似平凡的日常現象,不僅增加了知識性,也提供了不同的思考維度。這類文章能幫助讀者在技術開發之餘,保持對物理世界的敏銳觀察力。

    🔗 原文連結


    💡 今日觀點

    趨勢總結: 今日的內容呈現出「技術回歸本質」的特徵。從對 AI 模型真實性的質疑,到重新檢視 21 年前的運算謬誤,開發者社群正從盲目追求新技術,轉向更深層的理論驗證與工具穩定性。同時,軟體開發也開始嘗試將「趣味性」與「人性化」融入工具設計中(如夾娃娃機 Captcha)。

    🚀 給讀者的行動建議:

    • 回歸基礎: 不要只追逐最新的框架,有空時不妨重新讀一遍《分散式運算八大謬誤》,這對設計高可用系統至關重要。
    • 保持批判思考: 面對宣稱具有重大突破的 AI 技術,保持必要的懷疑精神,並學習如何驗證其模型來源。
    • 尋找創意平衡: 在追求生產力工具(如 Emacs)的同時,也別忘了嘗試一些像 Bitsy 或劈柴模擬器這類能激發感官與創造力的工具,讓大腦得到真正的休息。
  • 拔掉 RLS 的兩天:AI 時代規模化 Day One 為何從奢侈變預設

    重點摘要

    • 540 萬包裹壓測,警衛的社區包裹列表要 7330 毫秒。病根是 RLS 兩條 PERMISSIVE policy 用 OR 合併,讓查詢規劃器用不到 community_id 索引。
    • 全面拔除 173 條 policy、85 張表的 RLS,租戶隔離 100% 改由應用層帶 community_id。同一條查詢從 7330ms 降到 1.34ms,約 5500 倍。
    • 但拔掉 RLS 不是終點——第二波跨社區洩漏被「單租戶壓測」蓋住了:對照社區在多數表是 0 筆,洩漏判準(本社區數=全平台數)自動成立。要每張表都灌 ≥2 個社區才測得出;而且漏帶 community_id 不只洩漏,更是少了索引,同一個病根換地方又長。
    • AI 把規模準備的「建造成本」打掉了,但有兩個成本它打不掉:分區帶來的「複雜度稅」(維護照繳),與「取決於規模實測才知道對錯」的經驗決策(RLS 自己就是反例)。
    • 結論:AI 時代「規模化 Day One」從奢侈變預設,但「準備什麼」的判斷力更值錢——有把握的提前上,取決於壓測的,老實留給壓測。

    一個 V2 產品、兩天、一個 AI 協作者,把一套多租戶系統從「靠資料庫兜底」推進到「應用層自己負責」。這篇記錄的不是 commit log,是技術選型的隱性成本,怎麼在特定規模與特定哲學下才現形——以及 AI 怎麼悄悄改寫了「該不該提前準備規模化」這道老題目。

    先講結論:MVP 智慧是成本算出來的啟發法,不是定律

    傳統智慧說:MVP 先做,別過度工程,規模化以後再說。這句話我一直信,直到這兩天我意識到——它是一條成本驅動的啟發法,不是定律

    它成立的前提是「規模準備很貴」。以前要做分區、多租戶隔離、idempotency、離線佇列這整套規模機械,往往要多三到四倍的人力、好幾個月。那個成本,才讓「先別做、等需要再說」變成理性選擇。但兩件事同時改變了這個算式:

    1. AI 把建造成本打掉了。那套規模機械,AI 輔助下生成 + 維護的人力崩塌。
    2. 這是 V2,不是 try。前一版已經證明了領域——住戶、警衛、包裹是真需求,而且會有很多社區。規模不是猜測,是 near-certainty。「You Ain’t Gonna Need It」的前提「你可能不需要」,直接是假的。

    所以對一個 AI 輔助、領域已驗證的 V2,Day One 就準備規模化,比經典 MVP 智慧主張的更該做。但這篇真正有料的地方,是兩個 AI 也打不掉的成本。後面講。

    當初為什麼這樣選技術?

    這套系統的技術選型,是三股力量的合力:領域驅動 + 規模前瞻 + 不重蹈前版覆轍

    • Flutter 單一 codebase:住戶用手機、警衛用平板,功能大半重疊靠角色 gate。兩份原生 = 兩倍維護;一份 + responsive 是省力的對。加上離線優先是硬需求(警衛平板斷網也要能收件、拍照、印通知條)。代價老實說:CanvasKit 的 web 端很痛,e2e 自動化一路在跟它的無障礙語意樹搏鬥。
    • Go + GraphQL(型別契約):Go 單一 binary 好部署、並發強,對著「1000+ RPM / 1000 社區」的目標。GraphQL 用型別嚴謹的契約——這是對前版的反動:舊版用 category/method 字串路由 + PHP 的型別強制轉換怪招,踩過坑。型別世界 = runtime 少驚喜。
    • PostgreSQL + RLS(Row-Level Security):這個最值得講,因為我們親手拆了它

    RLS 的故事:為安全而選,為清亮而拆

    RLS 當初為什麼選?防禦縱深。理由聽起來無懈可擊:「把租戶隔離放在資料庫層,app 出 bug 也繞不過。」每個社區的資料用 policy 鎖死,誰都別想跨社區看到別人的包裹。

    然後規模化壓測來了。我們灌了 540 萬包裹、5.4 萬戶、202 個社區,模擬一個 V2 跑兩三年後的樣子。一量——警衛的社區包裹列表,7330 毫秒。七秒。

    病根不是索引沒建,是 RLS 的兩條 PERMISSIVE policy 用 OR 合併(是系統管理員) OR (社區=X)。community_id 只出現在 OR 的一邊,查詢規劃器就用不到 community_id 索引,只能 Seq Scan 掃完整張表的所有分區。這個病,設計時看不出來,要到 5.4M 才現形

    業主的反應很關鍵。他不要「在 DB 加更多限制」來繞,他要的是更乾淨:「我不要我的資料庫跟我的 AP 有這樣的依賴。本來就該做到零洩漏,怎麼會依賴 RLS?」

    於是我們全面拔除 RLS——173 條 policy、85 張表,全部 DROP。租戶隔離 100% 改由應用層:每一條碰租戶資料的查詢,自己帶上 community_id = current_setting('app.community_id')

    拆的過程,反過來證明「本來就該零洩漏」當時是假的

    審計時我抓到,授權中介層對「同社區範圍」的操作寫死了一行註解:「RLS 負責租戶隔離,這裡不另外檢查。」也就是說,有好幾個改別人資料的後端進入點(停用警衛、在別社區建戶、復活別社區的軟刪戶),它們的隔離正確性,本來就完全押在 RLS 上。RLS 一拔,這些就是跨社區提權漏洞。

    派去掃的 AI 子代理一開始判了 23 個缺口;我逐條人工驗證,收斂到 3 個真缺口——其餘有的早被別的守衛擋著、有的是子代理幻覺出根本不存在的函式。這也是個教訓:AI 的清單要逐條驗,不能盲信。

    拆完,效能呢?同一條查詢,帶上 community_id:

    查詢 RLS 開(OR 合併擋索引) RLS 拔除 + 應用層 community_id
    警衛社區包裹列表(5.4M 列) 7330 ms(Seq Scan 全分區) 1.34 ms(Index Scan)
    包裹改動歷程鑽取 0.2 ms

    從 7330ms 到 1.34ms,約 5500 倍。反諷的地方:當初選 RLS 是「為了安全」。它不但變成效能地雷,還讓 app 層偷懶——「反正 DB 會兜底」,於是 app 層的隔離就不嚴謹了。兜底機制養出了被兜底者的鬆懈。

    拔完 RLS 之後:洩漏沒結束,是換了個地方躲

    拔掉那天修了 3 個提權,我以為收工了。錯。RLS 一拔,等於把「DB 兜底」這層拿掉,所有原本偷懶的查詢全部裸奔——真正的第二波,要再跑一輪壓測才現形。

    一個包裹計數查詢,給某社區警衛回了 280 萬——那是整個平台的數字,不是他那個社區的。病根:這個 count 自己手寫 WHERE,繞過了會自動補 community_id 的中央 helper。同一類的還有一票:社區統計(*Stats)、各種計數(*Count)、住戶/包裹 picker、以及「先 load-by-id 再改」的 mutation——全是各自為政手寫查詢、漏帶租戶欄位的高風險地帶。

    但這篇最該記住的,是為什麼第一次壓測沒抓到。答案很反直覺:單租戶結構上測不出跨租戶洩漏。

    我第一次灌的 540 萬,只灌在 parcelshouseholds 兩張表,其他維度(使用者、訪客、公告、picklist)對照社區根本 0 筆。而洩漏的判準是「本社區查到的數字 == 全平台的數字」——當對照組是 0,這條恆等式自動成立,洩漏被 0 資料蓋得死死的。修法不只是補 WHERE,是補資料形狀:每一張要驗的表,都灌進 ≥2 個社區的資料,動態探針才有對照組去抓「你回給我的,有沒有混進別人的」。

    還有一層,業主一句話點破:漏帶 community_id 不只是洩漏,是效能。「為什麼還有功能沒戴上 ID,這不只會洩漏,重點是效能會變差,沒用到 index。」少了那個欄位,查詢就跟當初 RLS 的 OR 一樣用不到索引、掃全表。防洩漏和上索引,是同一個動作——community_id 既是隔離邊界,也是索引前綴。當初那個「OR 擋索引」的病根,拔了 RLS 之後,在每一條手寫查詢裡換個地方又長了出來。

    規模下另外兩個 Day One 就得拍的板

    同一輪還拍了兩個一旦上線就很難回頭的板,都是「規模 + 時間」逼出來的。

    • 快照 vs 正規化:歷史標籤不准 join。包裹上的物流公司、儲位、包裹類型、收件人姓名,全部存成當下的文字快照,不是外鍵。為什麼不正規化?因為這些是歷史事實。若做成外鍵去 join 現行字典,哪天某家物流公司改名或下架,過去的包裹紀錄會被回頭改寫——未來的公司出現在過去的資料上。原則一句話:身分用外鍵,歷史標籤用快照。這跟「證據鏈不可竄改」是同一個底層要求。
    • 控制面狀態用單例快取,不是每頁查 DB。社區可被系統管理員停用,每個請求都得確認「這社區還活著嗎」。最笨的做法是每頁打一次 DB——那又是另一種 RLS 式的過度防禦。做法是一個程序級單例快取(map + 鎖),10 分鐘 TTL,miss 才查 DB,停用/復活時主動逐出;隔離檢查收斂在一個 chokepoint(進交易時查一次),不撒在每條查詢。順手修了個誠實問題:社區停用後登入原本回「帳密錯誤」會誤導用戶,改成帳密對的人才告知「社區暫停服務中」——既不誤導本人,也不洩漏社區存在給攻擊者。

    兩個 AI 也打不掉的成本

    回到開頭的 thesis。AI 讓規模準備「便宜到值得 Day One 就做」——但有兩個成本它打不掉。

    成本 AI 打掉了什麼 AI 打不掉什麼
    複雜度稅 建造成本(生成分區/隔離/佇列) 維護稅:每次改動/debug 都要付。例:pg_total_relation_size 對分區母表回 0,最大的表都報 0,要展開分區層才量得到
    經驗決策 實作速度 壓測經驗:RLS 的「OR 擋索引」要 5.4M 才看得見,連 AI 都沒辦法 Day One 告訴你對的選擇

    成本一:AI 打掉「建造成本」,沒打掉「複雜度稅」。月分區讓程式更難推理。這兩天我們親自繳了這個稅:監測資料量時,pg_total_relation_size 對分區母表只算母表本身(回 0);還有 FK 要複合鍵、分區不繼承 RLS、清測試資料時被自己剛上的 append-only trigger 擋住……這個複雜度,是每一次未來改動、每一次 debug 都要付的稅,連 AI 也付。「AI 讓規模準備好建」是真的,「規模準備免費」是假的——稅照繳,只是從建造繳給了維護。

    成本二:有些規模決策是「經驗的」,Day One 就是準備不了——RLS 自己就是鐵證。RLS 本來就是 Day One 的規模準備(多租戶隔離),結果它是錯的 Day One 選擇。為什麼當初設計看不出來?因為「OR 擋索引」這個病要 5.4M 壓測才看得見。有些決策,正確答案取決於規模行為,而那行為你預測不了——那是壓出來的,不是設計出來的。而且如前面那一節的教訓:光有規模還不夠,要對的「資料形狀」——對照社區是 0 筆的那次壓測,把第二波洩漏整個蓋住了。經驗決策不只需要壓力,需要對的壓力

    AI 時代,「規模化 Day One」從奢侈變預設。但「準備什麼」的判斷力反而更值錢:有把握的結構提前上(便宜了);取決於規模實測的決策,老實留給壓測。

    有把握的(會有很多社區 → 按社區/時間分區;離線不可妥協 → 佇列),提前做。沒把握的(隔離機制、索引策略),別假裝設計階段就能拍板。這跟我之前寫過的 企業 AI 落地為什麼失敗 是同一個底層觀念:方法論不能照抄,要看你的前提條件還成不成立。

    方法:規格化、決策留證、以及「我自己打臉自己」的報告

    這兩天還做了第二件大事——把包裹做成可被法庭級檢驗的證據鏈。改動寫進不可竄改的 log(鑽一顆包裹的歷程,5.4M 下 0.2 毫秒)、簽名與照片在儲存層鎖死不可刪、系統管理員調查要「破窗」且每次都留審計。但比功能更值得分享的是方法

    • 規格先行。每個設計決定都先寫進規格、辯論清楚、鎖進文件,才動手。對話會被壓縮遺忘,規格不會。
    • 決策留證,不靠主觀評分。業主不信任 AI 加工過的「成本/風險」評分,他要看真實檔案、真實行數、schema 影響。所以需要他拍板的時刻,我生的是事實卡片,不是紅黃綠燈。
    • 三份報告的誠實檢驗。最後他要一份評分報告。但他要的不是一個數字——他要三份做比較:原始版、我「現在的預估」(鎖時間戳,不准事後改)、和「全部做完 + 全面測試後的真實量測」。核心是拿我的主觀預估去對真實量到的,差多少 = 我的評估可信度。

    結果:我預估綜合 7.5,真實約 7.8,誤差約 0.3 分;方向性預測(「dev 環境的測試污染會讓部分整合測試紅、但那不是回歸」「forensic 能力做完會升」「效能會守住」)全中。唯一校準:我對「系統穩定度」過度保守——實際零回歸。這種「逼 AI 先承諾預測、再用真實數據打臉」的設計,把「AI 的話可不可信」變成一個可量測的問題。

    人機協作:最好的部分不是分工,是辯論

    這兩天的分工大概是:業主出領域知識與方向決策,AI 出執行、驗證與反思。但最好的部分不是分工,是辯論。RLS 該不該拆、拆了 sysadmin 怎麼查日誌、照片資料夾要不要鏡射分區、孤兒清理會不會變成刪證據的後門——這些不是「下指令、執行」,是來回推。

    業主用領域常識把我拉回現實(「哪有警衛不分社區的,警衛 A 在四個社區工作就是四個警衛」),我用壓測數據和審計把假設證偽(「你說本來就零洩漏,但我們現有 code 就漏了 3 個」)。AI 不會累、能掃完每個呼叫點、能把 23 個候選逐條驗到剩 3 個真的;但判斷「準備什麼」「什麼時候該停下來問人」,還是要人。

    結語

    如果只能留一句:老的 RD 有老的包袱,所以才有「MVP、先別管規模」的智慧。但那個智慧是成本算出來的。當 AI 把建造成本打掉、當你做的是領域已驗證的 V2——規模化就是 Day One 的事。只是別忘了,AI 打不掉複雜度稅,也替不了你壓測;有把握的提前上,沒把握的,老實壓出來——而且要用對的資料形狀去壓,單租戶測不出跨租戶的洩漏。

    RLS 是我們「Day One 準備了錯的東西、規模化才發現」的活標本。它沒有讓這個決定變壞——它讓這個決定有了教材

    技術細節:Flutter + Go(gqlgen) + PostgreSQL 16;月分區、River 佇列、MinIO。壓測 540 萬包裹 / 202 社區 / RLS-off:熱查詢 1.34ms、改動 log 鑽歷程 0.2ms。