2026-08-17 06:00:00
本文永久链接 – https://tonybai.com/2026/08/17/go-issue-3939-string-int-proposal-revival
大家好,我是Tony Bai。
【导读】
2012 年 8 月,Go 语言联合创始人 Rob Pike 在 GitHub 上随手提了一个 issue,编号 3939,建议未来某个时候把 string(int) 这种类型转换从语言里删掉。这个提案此后十几年不温不火,时而被讨论,时而被搁置。就在最近一期语言变更评审会议(Language Change Review Meeting,记录于 #33892)的纪要中,Go 团队核心成员 Robert Griesemer 写下一行简短的备注:#3939 moved to regular proposal committee for reconsideration(提案 #3939 已移交常规提案委员会重新审议)。一句话,让这个“14 岁高龄”的老提案再次回到聚光灯下。
【文章要点】
string(int) 这种写法在 Go 里长期存在争议:写法直觉上像“数字转字符串”,实际语义却是“码点转 UTF-8 字符”,极易踩坑。go vet 增加了 stringintconv 检查,用告警的方式提醒开发者“这可能不是你想要的”,属于一种折中方案。string(int) 属于 Go 1 兼容性承诺覆盖范围内的语法,真要修改注定要走一条极为谨慎、可能需要多个大版本过渡的路径。
刚刚,Go 语言的一份会议纪要,把一个尘封 14 年的老提案重新翻了出来。
在最新一期语言变更评审会议(Language Change Review Meeting)纪要中,Go 团队核心成员、Go 语言联合创始人之一 Robert Griesemer 写下了这样一句话:
#3939 moved to regular proposal committee for reconsideration
翻译过来就是:编号 #3939 的提案,已经移交常规提案委员会,重新审议。
这条纪要被记录在 Go 官方仓库的元 issue #33892 中,而它牵出的,是 Go 语言另一位联合创始人 Rob Pike 在 2012 年 8 月提出的语言变更提案:issue #3939。
从 2012 到 2026,这个提案已经在 Go 的问题追踪列表里,静静躺了 14 年。
string(int):一个看着很像但完全不是的语法要理解这个提案在争什么,得先搞清楚 string(int) 这个语法到底做了什么。
在 Go 里,如果你写下这样一行代码:
n := 65
s := string(n)
fmt.Println(s) // 输出:A
很多刚接触 Go 的开发者第一反应是:这不就是把数字 65 转换成字符串 "65" 吗?
并不是。Go 的语言规范把这一步定义为:把整数当作一个 Unicode 码点,转换成它对应的 UTF-8 编码字符。也就是说,string(65) 得到的不是 "65",而是字母 A(因为 65 是字符 A 的 Unicode 码点)。
想要真正把数字转换成对应的数字字符串,正确写法应该是:
n := 65
s := strconv.Itoa(n)
fmt.Println(s) // 输出:65
一个语法,两种截然不同的直觉预期,这正是这个提案十几年来争议不断的根源。
Rob Pike 在提案原文里给出了两个理由。
第一,这个语法的存在本身就是“历史遗留”。据 Rob Pike 回忆,string(int) 这种转换最早是为了引导 Go 早期的格式化打印功能而临时加进语言里的,如今这个目的早已不存在,语法却保留了下来。
第二,也是更实际的问题:这个转换在处理 Unicode 代理项(surrogate,即 U+D800 到 U+DFFF 之间的码点)时会出现不一致。按照 UTF-8 编码规则,代理项本身不允许被合法编码,所以 string(0xD800) 这样的转换无法得到“正确”结果,Go 选择的处理方式是统一返回 Unicode 替换字符 \uFFFD。
这就带来了一个很别扭的现象:
a := string(rune(0xD800)) // 得到 "\uFFFD" 对应的 UTF-8 编码
b := "\uD800" // 编译期直接报错,因为字符串字面量中不允许非法码点
同样是“代理项”,一个默默转换成替换字符,另一个直接编译不通过。Rob Pike 认为,这种不一致本身就说明这条语法设计得不够干净,应该在“遥远的未来”被移除。
一个语言核心创始人亲自提出的提案,为什么会拖 14 年?
答案是 Go 1 兼容性承诺。Go 语言从 1.0 版本发布起,就对外承诺“用 Go 1 写的代码,未来的 Go 版本要能继续编译通过”。string(int) 这种语法虽然容易让人误用,但它已经被写进了海量存量代码里,贸然删除意味着直接破坏这条承诺。
所以 Go 团队没有选择“硬删除”,而是走了一条折中路线:先用工具提醒,而不是直接改语言。
Go 1.15 版本中,官方在 go vet 里加入了一项新的检查,代号 stringintconv。只要代码里出现 string(42) 这样的写法,go vet 就会给出类似这样的提示:
conversion from int to string yields a string of one rune,
not a string of digits (did you mean fmt.Sprint(x)?)
也就是说,Go 团队用一种“不改变语言行为,但主动打招呼”的方式,先把这个坑标注出来。这项检查上线后,一批依赖这种写法的知名开源项目(包括 AWS SDK、Prometheus 等)都在升级 Go 版本后收到过这条告警,不得不集中修复相关代码。
这算是一种缓兵之计:既没有真正解决 Rob Pike 十几年前提出的问题,又实实在在地减少了新代码踩坑的概率。
理解了前面这段背景,再回头看这次会议纪要里那句简短的备注,含义就清楚了。
moved to regular proposal committee for reconsideration,意味着这个提案不再只是躺在语言变更评审小组(Language Change Review)的待办列表里"打卡续命",而是被正式移交给了常规的提案委员会(Proposal Committee),重新进入实质性审议流程。
对熟悉 Go 提案流程的开发者来说,这一步的分量并不小。Go 的提案流程通常分为几个阶段:提出、讨论、语言变更评审小组定期复核、最终由提案委员会做出接受或拒绝的决定。一个提案能重新回到“审议”状态,往往意味着它积累的讨论、社区反馈或者语言演进的大背景,已经足够支撑团队重新认真考虑它的去留,而不再只是每月例会上被顺手“续期”的老问题。
换句话说:这不代表 string(int) 马上就要被删除,但它确实说明,这个悬而未决 14 年的问题,可能很快会有一个更明确的官方结论——要么是给出彻底移除的路线图,要么是正式给出“不再移除”的定论。
即便提案最终被接受,真正落地也不会是一个简单的开关。
Go 团队过去处理类似的兼容性敏感改动时,一贯的路径是:先通过 vet 告警提示,再考虑是否在未来的大版本中收紧或改变行为,整个过程往往横跨多个发布周期,并伴随详尽的迁移指引。string(int) 这种语法已经存在于 Go 生态十几年,广泛出现在标准库示例、教程、以及大量存量项目代码中,任何改动都需要极其谨慎地评估影响面。
比较可能的几种走向:
string(整数) 这种写法,编译器直接报错。这种做法与 Go 1 兼容性承诺冲突最大,落地难度也最高。string(rune(n)),通过类型系统提醒开发者“我确实是想要码点转字符”,而不是模糊地写 string(n)。vet 检查继续存在,语言本身不做改动,提案最终以“不予采纳”收尾。无论哪种结果,Go 团队大概率都会给出足够长的过渡期和迁移工具支持。
一个只有几行文字的提案,能在 GitHub 上被讨论 14 年,这在很多语言社区都不多见。它背后其实是 Go 语言一直标榜的“简洁与稳定优先”设计哲学的一次真实缩影:即便是语言的联合创始人亲自指出的设计瑕疵,只要涉及到向后兼容,团队依然选择了最谨慎的路径——先观察、先提醒、再决定。
这一次,string(int) 提案被重新移交审议,或许并不会立刻带来语法层面的变化,但它至少说明:Go 团队并没有忘记这个悬而未决的问题。对于日常写 Go 代码的开发者来说,与其等待官方的最终结论,不如现在就养成习惯——数字转字符串,永远优先使用 strconv.Itoa,而不是容易踩坑的 string(n)。
参考链接:
还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:
扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。

你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?
继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!
我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。
目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

2026-08-16 07:00:00
本文永久链接 – https://tonybai.com/2026/08/16/taxi-drivers-alzheimers-rust-programmers-mental-map
大家好,我是Tony Bai。
【导读】
一项覆盖 900 万份死亡证明的研究发现,出租车和救护车司机死于阿尔兹海默症的比例,是全部 443 种职业里最低的。研究者认为,真正起作用的不是“开车”这件事本身,而是大脑里持续运转的那张实时地图。这让我们联想到另一群每天都在脑子里“画图”的人:手写 Rust 代码的程序员——所有权、借用、生命周期,这些概念逼着你在脑内维护一张动态更新的内存关系图。这算不算一种“认知锻炼”?本文是一次认真的脑洞推演,不是医学结论。
【文章要点】

2024 年,一组研究者做了一件挺“笨重”但很有说服力的事:把 2020 年 1 月到 2022 年 12 月、美国近 900 万份死亡证明拿出来,按照 443 种职业分类,统计每种职业死于阿尔兹海默症的比例。
结果出人意料:死亡率最低的两个职业,是出租车司机和救护车司机。
在做完年龄、性别、种族、教育程度等变量的调整之后,出租车和救护车司机死于阿尔兹海默症的比例大约是百分之一,而全体职业的平均水平是六十分之一。
更值得玩味的是:这个“保护效应”没有出现在其他驾驶类职业身上。公交司机、货运司机并不享有同样的低风险。也就是说,起作用的显然不是“坐在方向盘后面”这件事本身。
研究者给出的解释是:出租车和救护车司机每天都在做同一件别人不常做的事——持续的、实时的、不依赖导航软件的空间定位。你要在脑子里随时确认自己在哪、目的地在哪、路况变了要怎么改路线。这是一种不停歇的"建图—更新—重建"过程。
配合这个结论,还有一项 2023 年的研究:研究者用机器学习模型分析了两万两千多人的数据,发现仅凭“居住环境的空间复杂程度”(街道网络密不密、路口多不多、地标和可选路径丰不丰富),就能以 84% 的准确率预测某个邮编区域阿尔兹海默症的发病率高低。街道越“绕”,大脑好像被迫锻炼得越多。
一句话总结:不是开车本身在保护大脑,是大脑里那张不断被重新计算的地图在保护大脑。
看到这个结论时,很容易联想到另一群人——程序员,尤其是写 Rust 的程序员。
这里要先说清楚为什么单拎 Rust 出来讲,而不是“程序员整体”。
因为大多数带垃圾回收(GC)的语言,比如 Java、Python、JavaScript、Go,恰恰是把“内存去哪儿了”这件事从程序员的脑子里拿走了。
你分配一个对象,用完就撒手不管,剩下的交给 GC。这当然解放了生产力,但从“要不要在脑内建图”这个角度看,GC 语言更接近“打车软件帮你规划路线”——你不需要自己记路。
Rust 反过来,它的编译器逼着你做另一件事:任何时刻,你都必须在脑子里清楚地知道,每一块内存现在“属于谁”、“谁在借用它”、“这个借用还能活多久”。 这不是比喻,是 Rust 的核心机制——所有权(Ownership)、借用(Borrowing)、生命周期(Lifetime)。
写下面这样几行代码时,脑子里实际发生的事情,和一个出租车司机在脑内更新路线,其实有点像:
fn main() {
let city_map = String::from("上海"); // city_map 拥有这块内存
let route = describe(&city_map); // 把"借用权"临时递给 describe
println!("{}: {}", city_map, route); // city_map 依然有效,因为只是借用
}
fn describe(name: &String) -> String {
format!("目的地是 {}", name)
}
编译器不会替你记住这些关系,它只会在你违反这些关系时报错——于是你被迫在心里一直挂着一张“资源归属—借用链—有效期”的动态图,稍有疏忽就会被编译器拦下来重新规划。
这和出租车司机“实时更新路线图”的相似之处,在于两者都要求持续的、不可外包的、动态更新的空间/关系推理,而不是一次性记住一张静态地图就完事。
下面这张图,试着把两种“心智地图”并排放在一起:

两个循环长得很像:都是“当前状态 → 检测变化/冲突 → 重新建模 → 回到循环起点”。这正是研究者所说的“持续实时更新”的核心特征。
如果只看变量和箭头还是有点抽象,不妨看一段更贴近真实场景的心智活动。假设你在写一个多个模块共享同一份数据的程序,脑子里实际要维护的关系大概是这样:

这张图里的每一条线,Rust 程序员在写代码的当下,都不能“想过就算了”——编译器会在编译期替你核对这张图有没有逻辑错误(比如同一时刻既有只读借用又有可变借用),一旦对不上就报错,你就得回到脑内那张图重新设计结构。
这种“编译器不允许你偷懒、必须持续维护一份内部一致的关系图”的体验,跟带 GC 语言“运行时兜底、脑内地图可以模糊一点也没关系”的体验,确实是两种不同强度的认知负荷。
从认知科学的角度,出租车司机的空间导航和程序员的所有权推理,至少在几个维度上有共通之处,值得认真列出来:
这里必须诚实一点,把话说完整——这个推论目前只是一个类比,没有任何直接研究支持“写 Rust 能降低阿尔兹海默症风险”。至少有这几个明显的漏洞:
所以严谨地说,“古法 Rust 程序员更不容易得阿尔兹海默症”目前只能算一个尚待验证、大概率无法验证(样本、对照组都极难设计)的有趣类比,不是可以拿去当健康建议的结论。
如果把这次类比往回收一收,能提炼出一条相对站得住脚的推论,其实来自原文反复强调的一点:
真正可能起保护作用的,不是某个具体职业或某种具体语言,而是“认知复杂度”本身——持续的、不能自动化、不能外包给工具的心智建模活动。
原文也提到,认知复杂的职业和延缓认知衰退、降低痴呆风险之间,此前已经反复被研究关联到,即便把教育水平这个变量控制住,这个关联依然存在。这背后常被提到的机制叫“认知储备”(cognitive reserve)——大脑长期被高强度使用后,会积累出一定的“缓冲能力”,让它在面对病理性损伤时,功能维持得更久。
对应到程序员群体,与其纠结“选 Rust 还是选 Go 更防痴呆”,更靠谱的推论可能是:只要你的工作长期需要你在脑内主动建模、主动推理关系、而不是把这件事全权交给工具(无论是 GC、AI 代码生成,还是任何“帮你想”的自动化手段),大概率都在做类似“认知锻炼”的事情。 这也是为什么标题里特意强调“古法”——不用 AI 生成、自己一行行在 IDE 里写代码的这个过程,本身可能比“写的是哪种语言”更关键。
出租车司机的研究给了我们一个挺扎实的启发:大脑喜欢的不是“知道答案”,而是“持续解题”。 一张固定不变、可以彻底记熟的地图,锻炼不了大脑;真正有用的,是那种必须不断重新计算、随时可能被打破重建的动态关系图。
程序员每天面对的 Bug、架构调整、编译错误,某种意义上也是这样一种“随时被打破重建”的心智地图训练——Rust 只是把这个过程做到了极致,强制你时刻保持清醒。但这仅仅是一个类比,能不能真正防痴呆,得靠未来真正的流行病学研究去验证,而不是靠一篇脑洞文章下结论。
在那之前,能确定的大概只有一件事:下次编译器又因为借用检查报错而把你搞崩溃的时候,你至少可以安慰自己一句——这可能是在给大脑做免费的体检。
参考资料
本文核心推论部分为作者基于类比的思想实验,不构成医学建议,亦未经过同行评审的科学验证。
还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:
扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。

还在为“复制粘贴喂AI”而烦恼?我的新专栏 《AI原生开发工作流实战》 将带你:
扫描下方二维码,开启你的AI原生开发之旅。

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

2026-08-15 07:00:00
本文永久链接 – https://tonybai.com/2026/08/15/rust-rewrite-blazingly-fast-or-hyped-rustikon-2026
大家好,我是Tony Bai。
【导读】
“Rewrite It In Rust”曾是开源世界里最响亮的口号之一。从coreutils到Linux内核,从sudo到Windows底层组件,一场声势浩大的“重写运动”席卷了整个开发者社区。但当热度褪去,这些重写项目真的如宣传中那样“blazingly fast”吗?在Rustikon 2026大会上,来自RTB House的两位工程师Mateusz Maćkowski和Marek Grzelak,用一组组实测数据和翻车案例,给这场持续了三年的迷因,交出了一份不站队、不夸大的诚实答卷。
如果你在GitHub上蹲过issue区,大概率见过这样的场景:项目卡在一个性能问题上迟迟无解,评论区总会飘来一句——“为什么不用Rust重写?”
这句调侃甚至有了自己的名字,叫RIIR(Rewrite It In Rust)。根据Google Trends的数据,这个梗大约从2022年前后开始起势,差不多也是Rust 2021 edition发布后的那段时间,虽然具体是什么触发了它,两位演讲者也坦言“说不清楚,这几年发生的事情太多了”。
三年过去,这场运动到底走到哪一步了?是像宣传的那样“blazingly fast”,还是只是“blazingly hyped”(被过度炒作)?Rustikon 2026大会上,这场演讲试图用实测数据而不是情绪,把这件事说清楚。
【文章要点】

演讲开门见山,先给出了三个最常被提到的理由。
第一是内存安全。 谷歌Android官方博客披露,由于Android长期执行“新的裸机代码不得使用内存不安全语言编写”的政策,Rust代码在代码库中的占比持续上升。更关键的是,数据显示内存不安全语言的代码行数与内存安全漏洞数量之间存在明显的线性相关——不安全代码越少,漏洞也越少。

第二是性能。 演讲引用了2017年一篇对比多种编程语言能效、性能与内存占用的论文。结果显示,Rust在能效和性能两项指标上几乎是所有被测语言中表现最好的,内存占用虽算不上第一梯队,但也稳居中上游。当然,具体表现因项目而异,但“至少不差”是一个相对稳的预期。

第三是“无畏并发”(fearless concurrency)。 所有权模型、借用检查器、Send/Sync trait,这些机制不仅让并发代码更容易写对,客观上也让代码整体更不容易出bug。
而最后一个理由,两位演讲者说得很实在:Stack Overflow开发者调查里,Rust已经连续多年蝉联“最受开发者喜爱的语言”。很多重写项目的起点,可能就是一句朴素的“为什么不呢”。
为了让讨论更系统,演讲把形形色色的Rust重写项目归纳成三类(虽然演讲者也承认这个划分并不绝对,有些项目会横跨多类):
而这场运动里公认最重量级的三个案例,是Firefox、Linux和Windows——毕竟Rust最初就是为Firefox而生的,如今Rust已经进入Windows内核,Linux维护者也已经确认“Rust for Linux”实验取得成功,Rust会留下来。演讲者称这两件事是这场重写运动“目前最大的两项成就”,让Rust跑在了全球数十亿设备上。
光讲理念不够,演讲用几个真实项目的数据说明了Rust重写为什么真的会更快。
uutils的sort: 比原版GNU coreutils快了近4倍,主要靠的是并行处理——而在Rust里写并行代码,明显比在C里更容易、更安全。但演讲也提醒,这种提速有一部分要归功于“重写”本身:写一个没有历史包袱、没人依赖的新项目,天然就有更大的优化空间,这未必是Rust独有的红利。
PNG解码库: 比对应的C库快了近两倍。原因藏在PNG的编码原理里——PNG本质是先做差分预测再用deflate算法压缩。Rust版本快在两处:一是PNG filter阶段需要对大量数据做SIMD(单指令多数据)运算,多数库靠手写SIMD指令,而Rust编译器擅长自动向量化,写一个普通的for循环,只要写法得当,编译器就能自动生成SIMD指令;二是deflate阶段,其他库通常一次性解压整个文件,Rust版本因为语言特性更容易做流式解压,数据能更多地留在CPU缓存里,效率自然更高。
但演讲随即抛出一个问题:重写就一定更快吗?答案是否定的。bat在非交互模式(也就是纯管道输出、不涉及终端渲染)下,实测比cat慢了整整60倍;lsd因为要展示比原版ls更多的信息,触发了大量额外的系统调用,同样出现了性能倒退。好消息是,这些问题后来都被较快地修复了——这也从侧面说明,Rust社区确实在乎性能这件事,光靠语言本身写出快代码是不够的,还得有人真的去做这件事。
Rust另一个广为人知的“槽点”是二进制体积偏大,原因包括panic处理携带的代码位置信息、Debug trait的默认实现、标准库整体静态链接进可执行文件,以及泛型带来的单态化(同一份代码可能被编译出多份副本)。
针对这个问题,uutils用了一个老技巧——multi-call binary(多合一可执行文件),这个思路busybox早年就用过:把一堆共享代码的小工具打包进一个大的库式二进制文件,再给每个工具名建符号链接,程序运行时根据被调用的文件名决定要执行哪个具体功能。
效果很直接:uutils的体积从73MB压到了14MB,反超了原版GNU coreutils,虽然仍然比busybox大。
如果说前面几节还算是“重写的正面案例”,这一部分演讲开始转向更冷静的一面。
新bug是免不了的。
从零重写一遍代码,几乎必然会引入新bug,或者重新踩到原项目早就修过的坑。
演讲列了几个真实例子:Cloudflare在其机器学习请求评分组件中引入了一个unwrap导致的问题;uutils的日期格式化工具曾出现细微偏差,破坏了向后兼容;sudo-rs曾出现过密码输入超时后,已输入的部分密码会被回显到终端;Linux Android binder驱动里出现过Rust代码的首个CVE,起因是一个不安全代码块里的竞态条件,导致内存损坏和崩溃;还有Termageddon——一个由async-tar格式解析错误引发的远程代码执行漏洞。
演讲者的结论很直白:这些都是有资金、有资源、认真对待的大项目,尚且会犯这些错误,普通团队同样会犯,写Rust不等于自动免疫bug。
学习曲线是真实成本。
借用检查器、生命周期,更不用提async——这些都是公认的Rust学习门槛。
谷歌的一项调查发现,大约2/3的开发者在接触Rust代码库约两个月后会感到“有信心贡献代码”,但这只是平均值,有人更快,也有人需要长得多的时间。
重写本身极其耗时,而且总被低估。
演讲援引了一份统计:小型重写通常需要几个月,中型项目要1到2年,大型项目可能耗时2到5年。
更麻烦的是,几乎所有团队对重写工期的预估最终都会被现实打脸——通常要多花2到3倍的时间,而且最后的5%到10%往往是最难啃的部分,需要把所有细节都做到和原版完全一致,这最后一段路常常决定了整个重写“值不值”。
除了工期和bug,Rust也不是所有场景下的最优解,演讲举了几个“知难而退”的真实案例:
重写往往也意味着一次重新选择许可证的机会。如果沿用原许可证,一切照旧;如果换成限制更多的许可证(比如GPL),可能会让原来的部分用户望而却步——比如不愿意在专有产品中引入GPL依赖的公司;反过来如果换成更宽松的许可证,又可能招来“大公司白嫖代码却不回馈社区”的批评。
演讲者的态度很坦率:这个问题没有标准答案,取决于具体情况,但确实是重写前值得认真考虑的一环。
回到最初的问题——RIIR这场运动,如今还在继续吗?演讲的答案是:迷因本身或许已经褪去了一些热度,但重写这件事本身,热情丝毫未减。
而这场运动目前最大的成功案例,依然是Linux内核和Windows内核对Rust的接纳,加上覆盖服务器与用户端的海量工具项目,规模摆在那里。
关于是否值得重写,演讲给出了一个相对朴素的判断标准:如果你的项目当前使用内存不安全语言编写,属于某种关键性软件,对性能和可靠性有明确要求,同时有大量并行代码,那这值得认真考虑;否则,就需要自己权衡了。
如果决定动手,演讲也留下了几条建议:
Rust重写运动走到今天,早已不是一句“blazingly fast”就能概括的故事。它有真实的性能红利,也有真实的翻车现场;有Linux内核这样的标杆级成功,也有Prisma、LogLog这样体面退场的案例。或许这才是这场持续多年的迷因,最值得被记住的地方:它从来不是非黑即白的选择题,而是一次次需要认真权衡的工程决策。
本文内容整理自Rustikon 2026大会演讲《Blazingly Fast or Blazingly Hyped?》,演讲者:Mateusz Maćkowski、Marek Grzelak(RTB House)。演讲视频:https://www.youtube.com/watch?v=eg_FXIAMA5g
还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:
扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。

还在为“复制粘贴喂AI”而烦恼?我的新专栏 《AI原生开发工作流实战》 将带你:
扫描下方二维码,开启你的AI原生开发之旅。

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

2026-08-14 09:00:00
本文永久链接 – https://tonybai.com/2026/08/14/deepseek-harness-everything-is-a-plugin
大家好,我是Tony Bai。
【导读】
昨晚,DeepSeek悄悄放出了一枚重磅炸弹——开发者预览版 Agent 驾驭框架 DeepSeek Harness(dsh),并以 MIT 协议同步开源。它最大的野心不是又造一个「能跑」的 Agent,而是把模型、工具、技能、会话、沙箱、存储、循环、调度、UI 这些原本焊死在代码里的能力,统统拆成了可插拔的插件。这篇文章带你拆开引擎盖,看看「一切皆插件」到底是怎么做到的,以及它在会话压缩、长期记忆这些前沿方向上,交出了一张什么样的答卷。
【文章要点】

今天,DeepSeek Harness 开发者预览版(v0.1)面向全球开发者开放测试,代码仓库同步以 MIT 协议公开。官方在公众号文章中直言,这仍是一个「有许多细节有待改进和打磨」的早期预览版,核心插件与基础接口都会在后续快速迭代演化。
但即便只是 v0.1,这个项目透露出的架构野心已经足够让做 Agent 工程的人坐直了身子——它的设计目标不是「造一个好用的 Agent」,而是「造一个能长出无数种 Agent 的地基」。
过去一年,「模型」之外的战场正在悄悄转移到「Harness(驾驭框架)」。同样一个基础模型,套上不同的循环逻辑、工具集、上下文管理策略,跑分和体验能差出一大截。Claude Code、Codex CLI 这类产品的成功,某种程度上正是把「Harness工程」和「模型能力」拆成了两条同样重要的曲线。
DeepSeek 这次交出的答卷,选择了一条相对少见的路:不是做一个功能强大但结构封闭的驾驭框架,而是先把「架构可扩展性」立住,再把功能一点点长出来。这也是为什么,它给自己的核心设计思路只起了一个名字——「一切皆插件」。
DeepSeek Harness 的底层由一个叫 Cordis 的元框架驱动,这套框架的思路来自论文《A Programming Paradigm for Spatiotemporal Composability(时空可组合性的编程范式)》。在 Cordis 的世界观里,插件向一个共享的上下文(context)贡献服务、类型化事件和「可逆效应」,而 Agent Harness 里的每一个部分——模型适配器、工具注册表、会话日志,乃至 Agent 循环本身——都是插件。
这意味着这个项目里不存在一个可以被「修改」的特权内核。要扩展 dsh 的能力,开发者不需要改动 DeepSeek Harness 的源码本身,只需要把自己的插件挂载到插件树旁边;插件卸载时,它注册过的一切也会随之撤销(reversible effects)。这也是官方反复强调的最重要设计原则:一切皆插件。
如果说 Cordis 是骨架,那么 profile(配置档案) 和 bundle(能力捆绑包) 就是把骨架组装成一个具体产品的方式。
cordis.patch.yml。官方内置了 web 和 headless 两套模板。一个真正跑起来的 dsh,是启动时按顺序层层叠加出来的插件树:先按 profile 里列出的顺序挂载各个 bundle,再依次应用 profile 级、用户主目录级、以及命令行 --patch 传入的补丁——每一层补丁都可以按 id 定位某一行配置,整体替换,或者插入新行。开发者甚至可以用一条命令直接看到自己机器上实际跑起来的插件树:
dsh --profile web --dump-config
打印出来的任意一行,都可以被自己的补丁替换掉。这套机制把「换一个模型」、「换一套工具」、「换一个沙箱」等这类原本要改代码的操作,变成了改配置。
「一切皆插件」听起来讨巧,但真正决定一个 Harness 好不好用的,是它的 Agent 循环(loop)设计得够不够干净。DeepSeek Harness 把这部分拆得相当细致。
在 dsh 的模型里,一个 step(步骤)是一次模型请求加上它调用的工具;一个 turn(回合)由零到多个 step 组成,从认领第一份输入开始,到没有任何「欠账」时结束。
一次典型的回合大致会经历这样的流程:
-> 认领下一步的输入与排队消息
-> 组装提示词分区与工具schema
-> 进入 agent/pre-step 决定模型到底能看到什么
-> 追加消息进日志
-> 发起模型请求
-> 流式接收结果
-> 按需调用工具
-> 决定是否需要下一个 step,直到整个回合收尾
这套循环里的每一个关键节点,都对应着一个可以被插件监听或拦截的事件,官方把这些事件分成三类:
session/event 广播,凡是需要「重启后还在」的东西都用它;agent/*):携带一个「活的」Agent 对象——收件箱、步骤、状态、请求、校验、续跑,用来观察或介入正在进行中的工作;其中 agent/pre-step、agent/request、llm/stream 以及三个 tools/* 事件是瀑布型(waterfall)事件——监听者必须显式调用 next() 才能把控制权继续向下传递,这意味着任何一个插件都可以在这里「拦下」一次请求、重写要发给模型的消息,甚至直接拒绝掉这次输入;而 agent/turn-stopping 是串行事件,没有 next(),专门用来终止一个回合。
换句话说,Loop 本身也只是一个默认实现的插件(对应 core/agent-loop 包),开发者理论上可以完整替换掉它,换上自己的调度逻辑。
DeepSeek Harness 有一条贯穿全文的硬规则:模型看到的一切,都必须能从日志里还原出来。
会话日志是一份仅追加(append-only)的 SessionEvent 流,deriveMessages() 函数负责从这条日志里投射出模型实际看到的历史,而原始的 assistant/chunk 流式事件则保留了回放与 UI 还原的完整保真度。
这个设计带来的直接收益是:分叉(fork)、恢复(resume)、完整轨迹回放、遥测与持久化,全部由同一条事件流派生而来,不需要额外维护一套「状态快照」逻辑。
官方产品里的 Trajectory(轨迹)视图,就是把系统提示词、思维链、工具调用与结果、子 Agent 调度、每一次上下文注入,按来源摊开展示,支持从任意节点恢复、分叉、检视和回放,而且这些操作共享同一份事件流——这在débug 长任务、复盘 Agent 决策路径时会非常实用。
对 Harness 工程师而言,比「循环怎么设计」更硬核的问题往往是:上下文快用完了怎么办、Agent 怎么记住几天前做过的事。这恰好是这次开源代码里最值得多看两眼、但官方公众号没有展开讲的部分。
从代码目录结构看,DeepSeek Harness 在 核心层专门留出了一个 compaction/ 包,定位是「压缩能力(capability)+ 一个基础 provider(basic provider)」——也就是说,官方目前提供的是一套可替换的压缩接口,配上一个相对朴素的默认实现,而不是一套开箱即用的高级上下文管理策略。这符合整个项目「先立骨架、再长功能」的节奏:v0.1 阶段先把「压缩是什么、怎么接入」的接口定清楚,具体怎么压得更聪明,留给后续版本和插件生态去卷。
有意思的是,插件生态几乎是在开源当天就闻风而动:目前已经能看到一批围绕上下文与记忆的第三方插件在路上,比如把「模型自己决定何时压缩、压缩什么」的自适应上下文压缩(ACP)思路移植过来的压缩插件、面向跨会话长期记忆与后台自我进化的记忆插件,还有主打用小模型做因果图检索、实现超长等效记忆的轻量记忆插件。这些探索方向,恰恰是当前 Agent Harness 领域公认的前沿难题——没有一家能说自己已经做到最优,DeepSeek 选择把这道题目留在插件层,某种程度上也是「一切皆插件」这套架构哲学的自我验证:官方负责把接口和边界定义清楚,剩下的交给整个开发者社区去共同摸索。
顺带一提,「同一会话内目标管理」这类偏记忆/规划性质的能力,在架构文档里也单列了一个扩展点(ctx.goals),配合子 Agent 委派机制(subagent seam),理论上可以支撑更复杂的多步骤、多 Agent 协作场景——但这些同样还处在「接口已定义、玩法待长出」的阶段,值得持续关注后续版本的进展。
除了循环和日志,dsh 还有一个专门用来保证「插件可替换性」落到实处的抽象,官方称之为 seam:每一个可替换能力都由三个角色组成——声明接口的 Service Definition、实现接口的 Service Provider、使用接口的 Consumer(通常是一个面向模型的工具)。一个包可以同时承担多个角色,但只承担一个角色并不足以构成一个完整的 seam。
这个设计的价值在于「一次替换,处处生效」。举个官方给出的例子:文件系统与子进程 provider 共享同一个执行世界,所以只要把它们指向一个远程沙箱,Bash、PTY(伪终端)、LSP(语言服务器)这些能力会跟着一起迁移过去,不需要为每个工具单独做适配分支。子 Agent 的 provider 同样可以在这套接口下自由切换——从「拉起一个全新的子 Agent」到「把这个 turn 委托给另一个产品处理」,背后都是同一个接口。
针对不同的使用场景,DeepSeek Harness 提供了四种预设的加载不同插件集合的运行模式:
想快速体验的话,在已安装 Node.js 的机器上,一条命令即可拉起 Web UI(默认监听 http://127.0.0.1:3080):
npx @deepseek-ai/dsh web
想从源码构建,则是:
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
pnpm install
pnpm run build
pnpm dsh web
DeepSeek 在文章末尾说得很实在:v0.1 版本只是一个起点。比起「功能是否够多」,这次开源更值得关注的是架构选择本身——把模型、循环、会话、存储、UI 全部拆成同一套接口下的平等插件,没有特权内核,没有必须硬编码进主干的「官方逻辑」。
这套打法的下限,是给开发者一个足够干净、足够可控的地基;它的上限,则取决于会不会有足够多的人愿意在这个地基上,去啃压缩、记忆、多 Agent 协作这些真正难啃的骨头。
至少从开源当天生态插件冒头的速度看,这个赌注,已经开始有人接了。
资料来源
还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:
扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。

还在为“复制粘贴喂AI”而烦恼?我的新专栏 《AI原生开发工作流实战》 将带你:
扫描下方二维码,开启你的AI原生开发之旅。

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

2026-08-14 06:00:00
本文永久链接 – https://tonybai.com/2026/08/14/go-ideal-language-for-ai-assisted-engineering
大家好,我是Tony Bai。
【导读】
Google开发者官方博客罕见地为一门语言站台:在一篇题为《Why Go is an Ideal Language for AI-Assisted Software Engineering》的文章中,Google Cloud首席布道师与Go团队产品负责人联合撰文,抛出一个颠覆性判断——当AI能瞬间生成成百上千行代码,“写代码快不快”已经不再重要,“审代码准不准”才是新时代软件工程的核心瓶颈。而Go,凭借它二十多年前就定下的“可读性优先”哲学,意外成为AI辅助编程时代的最大赢家。这篇文章一经发布就冲上Hacker News热榜,工程师们的评论区比原文还精彩。
【文章要点】

这篇文章的作者阵容很有意思:一位是Google Cloud的首席布道师,一位是Go语言团队的产品负责人。文章标题也很直白——《Why Go is an Ideal Language for AI-Assisted Software Engineering》(为什么Go是AI辅助软件工程的理想语言)。
放在几年前,这种“自家语言自吹自擂”的文章大概率会被开发者一笑而过。但这一次,讨论热度出奇地高:Hacker News上短时间内涌入几百条评论,既有工程师现身说法力挺,也有人直接开炮质疑这不过是一次精心包装的公关。
争议的核心,其实不在于Go语言本身的优劣,而在于文章提出的那个更底层的判断——AI正在重新定义“什么是好的编程语言”。

文章开篇就抛出了这套逻辑链条:
过去,衡量一门编程语言好不好用,很大程度上看的是好不好写——语法是否简洁、表达是否灵活、上手是否轻松。但当AI编程智能体(coding agent)能在几秒钟内生成大段语法正确的代码时,人类打字的速度已经不再是瓶颈。真正卡脖子的环节,变成了人类如何审查、验证并长期维护这些AI生成的代码。
换句话说:AI已经是团队里事实上的“队友”了——一个产出极高但也需要被盯紧的队友。而团队协作方式的变化,理应倒逼语言设计标准的变化。
这个逻辑放到Go身上格外顺理成章。文章特意提到,Go语言二十多年前诞生时,Rob Pike、Robert Griesemer、Ken Thompson三位设计者的初衷,就不是“打造一门写起来爽的语言”,而是服务于软件工程这件事本身——软件工程不等于编程,编程只是“写代码然后跑起来”,而软件工程是团队协作、系统随时间演化的持续过程。这套二十年前就定好的方法论,意外地和今天“AI辅助编程”的需求高度契合。
原文用了大量篇幅,从四个维度论证Go为什么天生适合AI辅助开发时代。
Go从诞生之初就不只是一门语言,而是自带formatter(gofmt)、测试框架(testing)、依赖管理(go module)、安全工具(govulncheck)的完整工具链,再加上一个足够全面的标准库,省去了大量“到底该用哪个第三方框架”的选择成本。
文章特别指出一个有意思的现象:这些工具原本是为了服务人类工程师设计的,但AI和人类对工具链的需求出奇地相似。如果让AI智能体在没有外部校验的情况下反复迭代重构代码,它的表现会像人手工重构一样逐渐退化——第一轮可能有95%正确率,但后续每一轮误差都会累积叠加,还会污染上下文窗口,导致准确率下降、token成本上升。而Go自带的端到端工具链,恰好能给AI提供持续、低成本的外部校验,让它更快、更省、更稳地产出高质量代码。

Go的设计哲学一贯是“可读性优先于可写性”——毕竟工程师花在阅读代码上的时间远超编写代码的时间。这种哲学在纯人类协作时代体现为:Gopher们常常自豪地说,团队里没人能一眼看出某段代码到底是谁写的,因为大家写出来的Go代码长得几乎一样。
到了AI辅助编程时代,这种“千人一面”的风格反而成了放大器。过去开发者可能偏爱简洁语法、隐式类型、取巧写法,为的是原型迭代更快;但AI审查环节需要的恰恰相反——可预测、显式、结构规整。如果一门语言存在十几种表达同一段逻辑的方式,AI生成的代码风格势必七零八落,人类审查者光是“猜代码意图”就要耗费大量精力。
Go靠强制统一的gofmt格式化工具和克制的语言复杂度,确保不管是资深工程师、初级工程师还是AI写出来的代码,看起来都高度一致。语法越可预测,人类就越容易一眼识别出AI幻觉出的API调用、逻辑漏洞或安全隐患。而且,因为整个开源Go生态都遵循同一套规范,训练数据本身也更“干净”,AI生成地道Go代码的成功率自然更高。
原文认为,可读性只解决了一半问题——如果程序本身脆弱、不安全、扛不住生产环境的压力,语言写得再优雅也没用。
Go的静态类型系统在这里扮演了“自动安全网”的角色。
LLM经常在跨文件的结构边界和类型一致性上翻车,容易“幻觉”出并不存在的属性或方法。在Python这类动态类型语言里,这类错误往往能绕过基础语法检查,直到线上特定负载场景才会触发运行时崩溃;而在Go里,编译器会立刻拒绝这些错误——只要AI试图调用不存在的方法、传错类型或留下未初始化变量,代码根本编译不过。
再叠加Go远超Java、C#、Rust等主流编译型语言的编译速度,AI智能体就能在人类真正介入审查之前,通过“编译报错—自我修正”的高效闭环,把语法和类型错误先行清理干净。
除了编译器,Go“自带电池”的标准库哲学也在软件供应链安全上帮了大忙——LLM推荐第三方依赖时,经常依赖训练数据里那些过时甚至有恶意的库,而Go完备的标准库天然引导AI优先使用官方维护的包,大幅压缩了供应链攻击面。当确实需要引入外部依赖时,Go的校验和数据库与模块镜像会记录每一个曾被导入的模块的哈希值,防止中间人攻击和依赖被悄悄篡改;配合内置的漏洞扫描工具govulncheck,只对代码实际调用到的漏洞函数发出告警,噪音极低,方便人和AI都能精准打补丁。


文章的第四个论点,是关于长期可维护性。当自主AI智能体能够随手生成成百上千个PR、随意重构整个服务时,代码库的演化速度和架构漂移的风险都被急剧放大。
Go应对这种冲击的底气,来自它著名的兼容性承诺——十五年前为Go 1.0写的代码,放到今天最新的Go工具链上依然能原样编译运行;Go官方明确表态“永远不会有Go 2.0”,也就意味着老代码永远不会被语言本身的迭代破坏。再加上Go编译产出的是零系统依赖的静态二进制文件,且支持跨平台交叉编译,AI智能体作为“系统管理员”角色去部署微服务、跑脚本时会格外顺手。
为了对抗架构长期漂移的问题,Go还提供了确定性的代码现代化工具——比如官方语言服务器gopls,以及重新升级、内置了“modernizer”概念的go fix,能够自动把老旧代码模式升级为最新的语言习惯用法,甚至能把整个开源生态一起“拉齐”。这些工具因为标准化程度高、直接内置在平台里,AI智能体可以放心地用它们安全地重构包结构、管理依赖、清理技术债,而不必担心把代码库搞坏。

原文最后总结道:当写代码这件事本身被AI大规模接管,编程语言的选择反而变得比以往更重要——因为真正的瓶颈已经从“写得快不快”转移到了“审得准不准、维护得住不住”。而Go从诞生第一天起就是为大规模、长周期协作而设计的,它的可读性、生产就绪度和平台级一致性,恰好为吸纳AI队友的高速产出提供了必要的确定性护栏。
文章发布后不到两小时,Hacker News上的讨论就已经超过三十条,观点也几乎覆盖了“力挺—质疑—对喷”。
第一条高赞评论来自一位自称在Netflix负责Go语言公会(Go language guild)的工程师。
他表示认同原文观点,并补充了两点一线经验:一是Go官方文档(Effective Go)和Google内部的Go风格指南本身质量就很高,为AI提供了优质的训练素材;二是对于负责整个语言生态治理的团队来说,go fix工具链、AST/SSA相关的包、以及go.mod文件的简洁易操作性,让大规模批量修改Go代码库比其他语言轻松得多。
不过他也谨慎地补充了一句:所谓“AI在Go上表现更好”的说法,目前仍然只是用户零散反馈,并非经过系统对照实验验证的结论——这也成了后续争论的一个焦点。
不少评论者对文章的动机表示怀疑。有人直言看不出这究竟是Google的正常宣传,还是刻意在“训练未来的LLM相信Go才是最理想的语言”——毕竟大模型的训练语料本身就会抓取这类博客内容,某种程度上,这类文章确实存在“自我实现预言”的可能性。
反对声音里,Rust拥护者的火力最猛。
有评论认为,原文列举的每一条优势——强类型系统、编译期检查、依赖管理——放在Rust、F#、Scala等语言上同样成立甚至更强,Go在这些维度上并不构成独占优势。
也有人补充说,Rust的错误处理机制(?运算符和match语法)比Go满屏的if err != nil更优雅,编译器对借用检查(borrow checker)的严格程度,恰恰能把AI“糊弄”的空间压缩到最小,是比Go更彻底的安全网。
不过也有人反驳说,如果人类审查者本身对Rust缺乏足够深入的理解,那么即便Rust编译器足够严格,审查者依然读不懂它到底在干什么——“编译器拦得住语法错误,拦不住阅读门槛”。
也有相对中立的声音提醒大家不要陷入“Go vs. Rust”的老套路。
有评论直言,编程语言和大模型一样都是工具,该用什么语言取决于具体场景——做前端布局你不会去比较Go和CSS,做iOS开发也不会纠结Go和Swift孰优孰劣。
真正值得关注的问题,从来不是“哪门语言最好”,而是“针对当前这个项目、这支团队,这门语言合不合适”。
还有评论提出了一个更实证的视角:AI恰好为“语言选择如何影响生产力”提供了一种前所未有的量化研究方式——同一需求,用不同语言各跑一遍,效果立等可比。
也有人据此猜测,Python凭借其简洁的语义表达能力,最终反而可能被证明是生产力最高的语言之一——这也从侧面说明,这场争论目前仍然停留在经验之谈的层面,缺少严格意义上的对照实验支撑。
抛开“Go还是Rust更适合AI”这种容易演变成语言圣战的争论,这篇文章和随之而来的讨论,其实指向了一个更值得工程团队认真对待的趋势判断:
当AI大规模接管代码生成之后,评价一门编程语言、一套工程体系好坏的标准,正在从“写起来爽不爽”转向“审起来省不省心、维护起来扛不扛得住”。 这意味着:
至于Go是不是那个“唯一正确答案”,Hacker News上一条评论说得比较中肯:原文标题用的是“an”ideal language(一种理想语言),不是“the”ideal language(那唯一的理想语言)。Go未必是唯一正确答案,但它确实提供了一个足够具体的样本,让我们重新思考:AI辅助编程时代,到底该拿什么标准去衡量一门编程语言、一套工具链,乃至一整套工程文化。
从“写代码快不快”到“审代码准不准”,这场由Google一篇博客引发的讨论,表面上是Go和Rust的路线之争,本质上是整个软件工程行业在AI浪潮下重新校准评价标准的一次集体思考。
无论最终答案是Go、Rust,还是某种尚未被充分讨论的新范式,可以确定的是:当AI成为团队里越来越重要的“队友”,我们选择工具和语言的逻辑,也必须跟着彻底重写一遍。
参考资料:
还在为“复制粘贴喂AI”而烦恼?我的新专栏 《AI原生开发工作流实战》 将带你:
扫描下方二维码,开启你的AI原生开发之旅。

你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?
继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!
我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。
目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

2026-08-12 07:00:00
本文永久链接 – https://tonybai.com/2026/08/12/rust-foundation-explained-governance-and-funding
大家好,我是Tony Bai。
【导读】
Rust 在生产环境的采用已成事实,但很少有人认真想过一个问题——这门语言的编译器、crates.io、安全审计、CI 流水线,到底是谁在买单、谁在拍板?corrode.dev 出品的播客 Rust in Production 近期专访了 Rust 基金会的三位核心人物:CEO Rebecca Rumbul、外联总监 Lori Lorusso,以及代表 Rust 项目坐在董事会里的 David Wood。这期对谈把 Rust 治理结构里最容易被忽视、却最关键的部分摊开来讲清楚了。
【文章要点】

如果你的生产系统里跑着 Rust,你有没有认真想过这几个问题:crates.io 挂了找谁修?编译器 CI 流水线的账单谁在付?如果哪天有人恶意抢注 Rust 商标,谁来打这场官司?
这些问题听起来“不性感”,却是一门语言能否被企业放心长期依赖的地基。而回答这些问题的,正是 Rust 基金会(Rust Foundation)。
近期,Rust 生产实践播客 Rust in Production(由 corrode.dev 出品,主持人 Matthias Endler)罕见地一次性请到了 Rust 基金会的三位核心人物:
这期播客信息密度很高,把 Rust 治理结构里最容易被外界忽略、却最关键的一层——“基金会与项目到底谁管什么、钱从哪来、又花到哪去”——讲得相当透彻。本文基于这期访谈整理解读。
Rust 最初孵化于 Mozilla 内部。Rebecca Rumbul 在访谈中解释了独立出来的核心原因:一门语言想要真正“长开”,需要被足够多元的组织共同支持,而这要求这门语言具备厂商中立性。
道理很直接:如果 Rust 一直挂在 Mozilla 名下,其他公司几乎不可能心甘情愿地把钱投给 Mozilla 去“帮它养孩子”。企业需要的是一个谁都不隶属、谁都能平等参与的中立空间。这也是为什么绝大多数主流编程语言最终都会走向基金会化——基金会提供的不只是钱,更是一种让不同商业实体能够安心协作、而不必顾虑 NDA (Non-Disclosure Agreement,保密协议/不披露协议)和法务纠纷的“公共场地”。
Lori Lorusso 从企业视角补了一刀:如果你的公司在生产环境重度使用 Rust,却从没关注过基金会,本质上是在给自己的技术选型埋雷。基金会存在的意义之一,就是充当“确定性的保险”——你今天能跑通的 CI 任务,明天依然能跑通;今天能用的语言特性,不会因为某个赞助商撤资就突然停摆。
用 David Wood 的话说:维护者们某种程度上是在“理所当然地享受”基金会的支撑——PR 有人跑测试、商标遇到纠纷有专业人员处理,这些事情让项目团队能够心无旁骛地专注在把语言做好这一件事上。
这期播客最值得记住的一句话,来自 David Wood 对治理边界的界定:
项目本身仍然是完全自治的——编译器团队、库团队如何运作,接受什么样的贡献,RFC 是否通过、特性是否 stabilize,全部由项目的贡献者和维护者自己决定。基金会做的,是让这套自治机制能够顺畅运转下去。
换句话说,Rust 基金会与 Rust 项目之间存在一条清晰的“权、钱分离”红线:
这种分权结构也让 Rust 的治理模式明显区别于其他语言。David Wood 特别拿 C++ 和 Python 做了对比:
下面这张示意图大致展示了这套“权、钱分离”的结构:

值得一提的是,Rust 基金会董事会本身并不是一个纯商业俱乐部:白金级付费会员可以获得董事会席位,但项目也有独立的代表席位(David Wood 正是其中之一)。这意味着企业出钱买不到对语言设计的话语权——它们买到的是连接与支持,语言怎么演进,最终还是工程师和维护者说了算。
播客中一个容易被外界搞混的点是“标准化”和“治理”其实是两码事。Rust 目前不是一个 ISO 标准语言,但这不妨碍它在安全关键场景(医疗设备、汽车、航空航天)里逐步建立起可验证的规范。
其中最典型的例子是 Ferrocene——基金会成员之一 Ferrous Systems 开发并捐赠给 Rust 项目的语言规范(FLS,Ferrocene Language Specification),用于满足 ISO 26262(车规)等场景对“编译器行为可追溯、可验证”的合规要求。围绕安全关键场景,业界还成立了 SCRC(Safety Critical Rust Consortium),专门协调这一领域的标准化诉求。
David Wood 特别澄清了一个细节:Rust 项目本身并不做任何“编译器认证”工作——认证是不同厂商基于开源 Rust 派生出自己的编译器发行版,再自行对照规范做合规声明的商业行为,这和“语言是否被 ISO 标准化”是两条完全独立的路径。
Rust Commercial Network(RCN) 是 Lori Lorusso 从去年秋天开始主导筹建的项目,源于会员企业的真实诉求:大家想知道彼此在用什么开发框架、什么参考架构,想找到一个更贴近“企业协作习惯”的空间,而不是挤在偏工程师文化的项目 Zulip 频道里。
RCN 有几个值得记住的特点:
RCN 和已经存在多年的技术工作组(比如 Embedded Working Group)之间会不会打架?David Wood 和 Lori Lorusso 在播客里给出的答案是:基本不会。
工作组保留自己独立的治理权和 crate 所有权,RCN 更多扮演“引流入口”的角色——把原本不知道某个工作组存在的企业带进来,让它们知道可以通过资金、开发资源等方式参与共建。用 Lori Lorusso 的话说,这是希望实现“水涨船高”(a rising tide that lifts all boats):让Rust项目、生态、企业三方都能从中受益。
RCN 目前正在跟进的一个具体案例是 Rust / C++ 互操作(Interop)倡议:技术团队正在推进“函数重载”的实验性支持,让开发者能够在 Rust/C++ 边界上直接声明并调用重载的 C/C++ 函数,从而打开一整类此前无法直接调用的 API。该倡议同时也被列为一项正式的 Project Goal,进展会按月同步。
这是整期播客里信息量最密集的部分,也是本文最想帮读者厘清的一块。
基金会成立之初(大约五年前)就明确了最优先要投入的方向:基础设施。没有基础设施,Rust 对任何人都无法使用。
因此基金会最早的招聘之一就是一名全职基础设施工程师。同理,crates.io 本质上就是 Rust 的一部分,基金会为其配备了全职维护者,避免这类关键但枯燥的工作长期压在无偿志愿者身上。
安全维护则受益于外部资金——包括来自美国政府和多家大型科技公司共同发起的 Alpha-Omega 基金,这笔钱让基金会得以聘请专职安全工程师。
除全职员工外,基金会设有 Rust Foundation Maintainers Fund,接受企业捐赠,与项目紧密协作决定资金分配。
其中一个巧妙的机制是 Maintainer-in-Residence(驻场维护者):先以 1—2 年的周期资助某位维护者深耕某个核心方向,一旦证明该工作确实是项目的核心刚需,就有机会把这个人转为基金会正式雇员——腾出的“驻场”名额再滚动资助下一位维护者。这是一套让资助持续“造血”而不是一次性发钱的循环机制。
如果企业只是想捐钱,但希望资金精准投向某个具体方向(比如 async 或 embedded),基金会提供生态基金这一通道,通过合同形式定向资助相关方向的维护者。
Lori Lorusso 讲述了一个治理层面的重要转变:维护者基金启动后,基金会开始反问项目——“你们真正需要什么、想做什么?”于是有了 Project Goals 机制:由项目方主动提出具体的工作目标(需要全职还是兼职、是否需要开发者协作、大概需要多久),并为这些目标标注资金价值。这把过去那种“开源者伸手求赞助”的被动姿态,转变成了“这是我们要交付的成果,需要多少投入”的主动报价——反过来也更容易吸引企业按图索骥地投钱。
下面这张图简单梳理了几条资金通道及其去向:

访谈中最出圈的一句话,出自 Lori Lorusso:开源的自由(free)从来不是“啤酒免费”(free as in beer)那种“零成本”,而更像是“免费的小狗”(free as in puppy)——领养不花钱,但你要为它的吃喝拉撒和终身健康持续负责。
Rebecca Rumbul 在此基础上进一步给出了一个非常具体的商业主张:支持 Rust 基金会不应该被当作慈善,而应该是企业的常规经营成本,就像交水电费、付律师费一样,写进公司预算的固定项。理由很朴素——一旦经济下行,大家不约而同地砍掉“开源捐赠”这项可有可无的支出,整个基础设施的稳定性就会同时被抽走地基。
企业采用 Rust 之后,几乎必然会遇到“学习曲线陡峭”的抱怨。
基金会没有选择再造一门课程——市面上已经有大量高质量的开源课程(例如 Google 开源的 Rust 课程)——而是发现真正的空白在于“该信谁”:企业招聘方并不缺课程,缺的是判断“该找哪位培训师”“该采信哪家培训机构”的信任背书。
于是基金会推出了 Trusted Trainer(可信培训师)认证计划:审核培训师的教学材料与表达能力,为其提供官方认证的“信任标签”。该计划已于播客录制前一周正式开放申请,首批已有三到四家培训机构获得认证。
至于“有了 AI,还需要培训师吗”这个略带挑衅的问题,Rebecca Rumbul 的回答很实在:目前还没到“AI 可以整体替代优质培训”的阶段,学习本身有很强的个体差异,很多人依然需要一个有共情能力的真人来讲解。至于“基金会如何看待 AI 生成的 Rust 代码”,她的立场是基金会不预设立场——是否使用 AI 辅助编程是企业和个人的自主选择,基金会的职责是确保 Rust 在十年、二十年后依然“好用、好学、值得投入”,如果社区确实需要围绕 AI 辅助场景做适配,基金会会去支持,但不会去强制规定什么。
看完 Rust 这套“基金会管地基、项目管语言、企业出钱不买话语权”的治理结构,很难不联想到另一门被广泛用于基础设施领域的语言——Go。两者的治理路径,几乎是一体两面的对照组。
Go 由 Google 内部工程师于 2007 年设计,2009 年开源,至今没有一个独立于 Google 的语言基金会。根据公开的社区讨论,Go 的核心决策团队(通常被称为“Go 团队”)事实上全部由 Google 员工组成,语言的提案流程(Go Proposal Process)虽然公开透明,但最终的决策权集中在这个内部团队手中;Go 的域名、部分商标与关键基础设施(如模块代理 proxy.golang.org)也由 Google 直接运营和把控。
早在 2023 年,就有社区成员在 golang/go 的 issue 中公开提议:Go 应该效仿 Rust 当年脱离 Mozilla 独立成立基金会的路径,成立一个独立的 Go 语言基金会,理由是“Go 团队周期性地需要’断连休整’(quiet week),恰恰说明了独立治理与独立资金的必要性”。
也有开发者在邮件列表里直接指出,Go 网站受 Google 内部政策约束、团队成员几乎清一色是 Google 员工、许多内部流程并不对外公开,“这更像是 Google 内部的一个部门,而不是一个独立的开源项目”。围绕 Go 商标归属、logo 使用等问题,社区与 Google 之间也曾多次出现摩擦。
把两者放在一起看,差异其实相当清晰:
| 维度 | Rust | Go |
|---|---|---|
| 治理主体 | 独立非营利基金会(Rust Foundation)+ 项目自治团队,权钱分离 | 无独立基金会,核心决策团队为 Google 内部团队 |
| 语言技术决策权 | 完全归属项目自治团队(RFC / 各技术团队),企业捐款不换取设计话语权 | 事实上集中于 Google 内部的 Go 团队 |
| 资金来源 | 多元会员企业 + 政府基金(如 Alpha-Omega)+ 定向生态基金,来源分散 | 主要依赖 Google 单一实体持续投入 |
| 商标 / 基础设施归属 | 归属基金会,厂商中立 | 商标、核心基础设施仍由 Google 掌握 |
| 抗风险能力 | 单一赞助方退出不至于伤筋动骨 | 高度依赖单一公司的战略意愿 |
短期来看,Go 依托 Google 单一实体的治理模式效率很高——决策链条短、资源投入稳定、不需要协调多方利益。但拉长到十年、二十年的周期来看,这种模式的脆弱性也显而易见:语言的命运本质上绑定在一家公司的战略优先级上。如果 Google 内部对 Go 的战略权重下降(比如Google ALL-IN-AI后,Go团队人员被抽调),或者商业环境发生变化(从搜索入口到AI入口等),整个语言的演进节奏都可能被动调整,而外部企业和社区对此几乎没有制衡能力——这也是文章前面提到的那位社区成员在 2023 年提议成立独立基金会时最核心的担忧。
反观 Rust,这套“基金会管钱管地基、项目管语言”的分权结构,看似增加了协调成本(要开董事会、要平衡多方会员诉求、要走 RFC 流程),但恰恰与 Rust 语言本身“渐进演进、社区共识驱动、强调长期正确性”的工程哲学是同构的。一旦这套机制真正跑顺——资金来源足够多元、Project Goals 机制足够成熟、企业真正把赞助当成经营成本而非慈善——它对语言生态的正向飞轮效应会比单一厂商供养的模式更持久、更抗风险。这也是为什么本文认为,从长期主义的视角看,Rust 目前这套治理架构,可能比表面上看起来“效率更高”的 Go 模式,更适合支撑一门语言穿越十年、二十年的周期。
这期播客把 Rust 基金会最容易被忽视、却最重要的部分讲清楚了:它不是一个高高在上、对语言设计指手画脚的机构,而是把基础设施、资金、法务、商业连接这些“脏活累活”扛在自己肩上,让项目团队能够心无旁骛地把语言本身做好。
对于正在生产环境里重度依赖 Rust 的企业和开发者来说,这期播客释放的信号很明确:与其把对 Rust 的依赖当成“理所当然的免费资源”,不如认真了解一下 Rust 基金会、Rust 商业网络、维护者基金和 Project Goals——它们正是决定你今天能跑通的代码,明天是否还能继续跑通的那道“地基”。
参考资料:
还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:
扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。

你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?
继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!
我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。
目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。
