vatt'ghern jaskier's ballads

2026.05.24 —— 今日 10 則

TODAY'S THREAD 今天有三條 deep:C# 把 discriminated union 收進型別系統、低延遲 C++ 交易系統把 wire-to-wire 延遲拆到 NIC 與 TSC、以及一篇替 segmented iterator 翻案、用「讓編譯器看見分段結構」換來 5.9× SIMD 加速的 C++ 文章;場邊還有 ClickHouse 開源的 io_uring fiber scheduler Silk、lock-free queue 的工程、arXiv 量化 LLM 生成零依賴 stdlib 的邊界,以及一場關於「LLM 產碼量超過人能 review」該怎麼重設流程的辯論——今天的軸線是「把抽象收回它該在的層級,再把工程判斷量出邊界」。

10 items ai · 3 systems · 4 infra · 2 web · 1
0 / 10 read
#08

當 LLM 產碼量超過人能 review——一篇主張「別假裝照舊」的流程論

一篇被熱議的文章主張:如果團隊已經決定用 LLM 大量產生程式碼,就該承認「人還能逐行 review 機器產出」是個假象,並據此重設開發流程,而不是假裝照舊。作者用 Amdahl 定律與 Thoughtworks 的研究鋪陳,提出把嚴謹度從 code review 移到「規格與測試」——讓標準化的 Markdown 規格成為新的知識單位、用自動化合規檢查取代人工 gate。這不是新機制而是流程主張,但它把「20k 行 AI slop 一天」這種團隊遲早要面對的張力講白了。

read source → ai-codegen

#09

LinkedIn 開 Crosscheck——用真實職場 battle 而不是靜態 benchmark 排 AI 模型

LinkedIn 把模型評比變成群眾外包的「pairwise battle」:專業人士針對自己的工作情境投票哪個模型較好,底層用 Bradley-Terry 排名,再補三件事——時間衰減(今天的 battle 計 1.0、90 天前只計 0.5)、稀疏分群的 regularization(避免「3 戰 3 勝」的假自信)、以及把統計上分不出高下的模型歸到同一 tier 而不硬給名次。active sampling 優先抽不確定的配對,宣稱達到同樣排名精度可少跑 35% 的 battle。對任何要回答「我這個情境到底該選哪個模型」的人,這比一張 leaderboard 誠實。

read source → model-eval

#10

Pinterest 重寫 user-sequence 資料層——「定義一次,跨 runtime 一致」

Pinterest 把支撐 ranking/retrieval/推薦的 user-sequence 特徵資料重做:核心原則是「一個 signal 只定義一次,再一致地實例化到 training、offline、online inference 各 runtime」,用 Python config-as-code 描述序列定義、共享執行引擎搭可插拔 executor、Lambda 架構接串流加批次、欄式時間分區儲存取代過去的單一 enriched-event blob。文章只給了質性結果(基建成本明顯下降、特徵上線時間大幅縮短),沒有列百分比。真正的價值在於消掉 training/serving 定義分裂(split-brain)這個 ML 系統的老問題。

read source → ml-infra

#02

C# 終於有 union types——.NET 11 preview 2 把 discriminated union 收進型別系統

C# 15(隨 .NET 11 preview 2)新增 union 關鍵字:public union SupportedOS(Windows, Linux, MacOS); 一行宣告,配實作 IUnion 的 struct 與 [Union] attribute 驅動的隱式轉型,再用 exhaustive switch 消費——不用 _ => 兜底,少一個 case 編譯器就警告。預設實作會把 value type 裝箱,hot path 可自訂 TryGetValue<T>() 讓編譯器自動避箱。這把過去靠 object 轉型與手寫 tag 硬湊的 Result<T>Option<T> 變成型別系統一等公民。需要 <LangVersion>preview</LangVersion>,可 target 到 net8.0/net48。

read source → deep csharp-unions

#04

快的 lock-free queue——batching、hazard pointer 與 thread-local cache 的組合拳

這篇把 lock-free queue 的工程細節攤開:用 batching 攤掉 per-item 的 CAS 與配置成本、用 hazard pointer 解決「節點什麼時候能安全回收」這個 lock-free 最難的記憶體回收問題、再用 thread-local cache 減少跨核心的 cache line 彈跳。作者報的數字是高競爭情境下比 mutex-based queue 快 6 到 12 倍。對任何在寫 SPSC/MPMC queue、或在 profiler 上看到 queue 變成瓶頸的人,這是一份把「為什麼 lock-free 不只是拿掉鎖」講清楚的實作筆記。

read source → lock-free

#05

Segmented iterators 重訪——讓編譯器看見 deque 的分段結構,把通用演算法的 SIMD 加速找回來

一篇 C++ 文章替 segmented iterator 翻案:deque 這類「分段」容器,標準演算法把它當平坦 range 處理,每次 ++ 都可能跨 block、逼編譯器插入間接判斷而擋掉向量化(Austern 2000 估約掉 20% 吞吐)。作法是把走訪拆成 segment iterator(走外層 block 索引)與 local iterator(走單一連續 block),再把演算法寫成「頭段+中間整段+尾段」的階層形式,讓內層迴圈變成可 auto-vectorize 的緊湊掃描。作者報的數字是 MSVC 2026 在小型別上 geomean 最高 5.9×、fill 的極端情況到 17×,但 Clang/GCC 對 unroll 提示反應相反——抽象不一定是成本,有時是讓編譯器看見結構的機會。

read source → deep cpp-iterators

#07

arXiv:stdlib 還是第三方?量化 LLM 生成零依賴 Python 函式庫的效能與正確性

Peng Ding 與 Rick Stevens 這篇(5/20 上傳)做了一件很實際的事:在嚴格約束下用 LLM 生成「單檔、零外部 import、API 相容」的純 stdlib 實作,橫跨序列化、網路、密碼學、agent protocol、文字處理等 12 類共 40 多個模組,並對照原始第三方庫做強制正確性驗證。結論:多數情況下純 stdlib 的效能落在參考實作 2 倍以內,部分類別甚至快 5 到 115 倍;真正打不過的集中在 C extension 撐起來的運算(影像處理、二進位序列化、低階密碼學)。對糾結「要不要為了少一個依賴而自己重寫」的人,這篇把界線量出來了。

read source → llm-codegen

#01

從 NIC 到 P99——低延遲 C++ 交易系統的全鏈路工程

這篇把 sub-50 微秒 wire-to-wire 延遲拆成五根支柱:DPDK kernel bypass(直接吃 NIC、省掉雙重複製與 syscall,調好約省 20 到 45 微秒)、預配置記憶體池(critical path 上不做 runtime heap 配置)、CPU/NUMA affinity(thread 釘在同一 NUMA node)、用 TSC(Time Stamp Counter)當時間源(不必走 syscall),以及網路調校(polling、加大 RX/TX buffer)。文中一句話點題:「沒有 baseline histogram,上面這些全是隱形的」。相較之下 Java/C# 系統連 p50 500 微秒都吃力。對任何 latency-sensitive 的後端,這是一張從硬體到 p99 的檢查清單。

read source → deep low-latency

#03

ClickHouse 開源 Silk——給高並發 I/O 的 cooperative fiber scheduler

ClickHouse 開源 Silk:一個給 Linux 高並發 I/O 用的 cooperative fiber scheduler,用 stackful coroutine(fiber)在使用者態切換,per-CPU scheduler thread 降低競爭、整合 io_uring 做非同步 I/O、再用 topology-aware work-stealing 照顧 NUMA 局部性,並附 FiberMutex/FiberFutex/FiberEvent 等同步原語。對在寫資料庫、訊息佇列或高並發伺服器、被 thread-per-connection 成本卡住的人,這是一個不必重寫核心邏輯就能把連線數推高一個量級的選項。repo 帶 file/net/http/s3 的 benchmark,對照 fio 與 nginx。

read source → fiber-scheduler

#06

關於 <dl>——被低估的 description list,與「即使支援不完整也該寫語意」這條原則

Ben Myers 替 HTML 的 <dl>(description list)翻案:product detail、聯絡卡、infobox 這類 name–value 配對,用 <dt><dd> 寫出來,screen reader 會報出總共幾組、目前在第幾組、並把整塊當可跳過的區塊——這些不是假設,是多數瀏覽器/螢幕報讀器組合下真實拿得到的好處。他丟出一個判準:「就算電腦只是『理論上』能認出這個 pattern,能帶來什麼好處?」有理論上的提升就該寫語意,不必等支援度補齊。對前端來說,這是一篇把「語意標記不是潔癖、是給輔助科技留的接口」講透的短文。

read source → html-semantics

today's deep reads

低延遲交易系統的五根支柱——從 NIC kernel bypass 到 p99,把 wire-to-wire 拆到微秒級

sub-50 微秒的 wire-to-wire 延遲,到底是被哪幾段吃掉的?DPDK kernel bypass 省下的 20 到 45 微秒從何而來、為什麼 critical path 不能碰 heap?把 thread 釘在 NUMA node、用 TSC 取代 syscall 計時各買到多少?為什麼「沒有 baseline histogram,上面這些優化全是隱形的」?以及為什麼同樣的工作量,Java/C# 連 p50 500 微秒都吃力?

C# 的 union types 是怎麼長出來的——從 object 轉型、IUnion struct,到 exhaustive switch 與避箱

union 關鍵字之前,C# 工程師是用什麼(object 欄位+手寫 tag、繼承階層、OneOf 套件)硬湊 discriminated union,各自的成本是什麼?編譯器把 union SupportedOS(...) 展開成怎樣的 IUnion struct 與隱式轉型?exhaustive switch 的「少一個 case 就警告」是怎麼做到的、跟 Rust 的 match 比少了什麼?預設裝箱為什麼是個 hot-path 問題,TryGetValue<T>() 又是怎麼讓編譯器自動避箱?要不要為了它把 codebase 切到 LangVersion=preview

Segmented iterators 重訪——讓編譯器看見 deque 的分段結構,把通用演算法的 SIMD 加速找回來

為什麼把 deque 當平坦 range 跑 std::fill,編譯器就向量化不了、白白掉 20% 吞吐?segment iterator 與 local iterator 怎麼分工,才能把演算法拆成「頭段+中間整段+尾段」、讓內層迴圈變回緊湊掃描?同一套 trait,為什麼 MSVC 2026 能換到 5.9× 甚至 17×,Clang 卻在 unroll 提示下反而退步?這個抽象什麼時候值得你引入,什麼時候只是複雜度?