Rust 核心团队大吐苦水:求求你们别再用 AI 提交“垃圾 PR”了!

本文永久链接 – https://tonybai.com/2026/03/26/rust-project-perspectives-on-ai

大家好,我是Tony Bai。

在这个大模型狂飙突进的时代,只要在推特或者掘金上刷一刷,你几乎每天都能看到这样的“成功学”分享:

“我是如何用 Claude Code + 4.6 Sonnet 在一天内向知名开源项目提交了 10 个 PR 的!”

“用 Cursor 混 GitHub 绿点,原来这么简单!”

这些利用 AI 工具轻松突破“开源门槛”的开发者们,正在享受着前所未有的技术平权红利。

但你有没有想过,站在这些开源项目背后的核心维护者(Maintainers)们,正在经历着怎样的地狱?

Go核心团队拒绝 AI 署名,为AIGC 时代的Go项目划下的“工程红线”后,前不久,Rust 项目的核心开发者、语言设计团队负责人 Niko Matsakis 在内部发起了一场长达数周的“大摸底”,旨在收集 Rust 核心贡献者和维护者们对于 AI 辅助编程的真实看法。

目前阶段性地汇总出的这份长达 20 多页的内部讨论纪要,犹如一枚深水炸弹,撕开了“AI 编程繁荣”背后的残酷真相:毫无节制的 AI 生成代码,正在不可逆转地榨干 Rust 核心团队的精力,甚至将开源社区推向崩溃的边缘。

今天,我们就来扒开这份极其硬核的内部讨论,看看在这个世界上一贯严谨、对代码质量要求极高的社区里,顶级的Rust工程师们是如何看待、抵制、甚至反制 AI 编程的。

当 AI 沦为“盲目自信”的催化剂

在很多人的幻想中,AI 是小白进阶的导师,是帮你看懂复杂底层源码的引路人。

但在 Rust 维护者们的眼里,绝大多数情况恰恰相反:AI 正在沦为某些开发者盲目自信的催化剂。

一位Rust贡献者一针见血地指出了问题所在:

“AI 给那些原本心怀愧疚、不敢随便提交低质量代码的人,盖上了一个‘官方批准’的假印章。对于那些处于‘达克效应(指能力欠缺的人产生虚幻的优越感)’状态的开发者来说,AI 简直就是一剂催化剂。它极大地膨胀了他们的自信,却严重削弱了他们真正的能力。”

在传统的开源世界里,“提交 PR”是一项极其庄重的工作。你需要阅读庞大的代码库,理解设计哲学,甚至要为了改一行代码而去推演上下文的几百个变数。这种“艰难的门槛”本身就是一种过滤机制。

但现在呢?

你只需要把报错信息扔给大模型或专门的编码智能体,比如Claude Code,它会生成一段看起来“极度合理”、语法看似“完美无瑕”的 Rust 代码。你连这行代码底层的生命周期(Lifetime)都没看懂,就欢天喜地地点了 git commit。

你以为你是在为开源做贡献,其实你只是把“寻找代码中细微致命毒药”的工作,无情地转嫁给了那些用爱发电的 Rust 维护者。

被“AI 传声筒”折磨到崩溃的维护者

如果说 AI 生成的代码只是质量差,那维护者大不了直接关闭 PR 就可以了。真正让 Rust 核心团队感到绝望甚至想要“退网”的,是那些把 AI 当作“传声筒”的贡献者。

让我们来看另一个让核心成员愤怒到使用加粗字体的真实案例:

“一些贡献者甚至充当起了审查者(Reviewer)和大模型之间的‘传声筒’!他们复制我提问的 Review 意见,扔给大模型,然后把大模型生成的胡言乱语直接复制回来回复我。看在上帝的份上,求求你们停下吧!我想强调,这极其令人抓狂。这是导致我极度倦怠(Burn out)的头号因素!

开源项目不仅仅是一堆冷冰冰的代码,它更是一个“人与人交流、碰撞、建立信任”的社区(正如 Peter Naur 在经典文章《Programming as Theory Building》中所言)。

当维护者满怀期待地与你讨论某个特性的底层设计时,你却用极其冗长、没有营养、甚至充满幻觉的 AI 废话来敷衍他们。这不仅是在浪费时间,更是在无情地践踏开源社区最宝贵的“信任契约”。

另一位Rust贡献者的控诉则充满了无奈:

“我完全不知道该怎么解决这个问题:‘没错,你很快就生成了一段看起来很合理的代码,但它在微妙的细节上完全是错的,而现在你正在浪费所有人的时间去排查它’。”

在没有 AI 的时代,分辨垃圾代码很容易;但在 AI 时代,大模型最擅长的,就是把垃圾包装成米其林三星的模样端给你。

全面封杀,还是“用魔法打败魔法”?

面对这群不知疲倦的“AI 水军”,Rust 核心团队该怎么办?

在这份内部文档中,关于“如何对待 AI”的讨论,呈现出了极其撕裂的两种极端:

极端一:道德洁癖与坚决抵制

一些拥有极客精神的老兵认为,目前所有的 LLM 都是建立在“盗窃版权数据”的基础上的。不仅如此,大模型的训练正在消耗极度恐怖的能源,甚至让那些本该关闭的煤炭发电厂死灰复燃,加剧气候危机。

对于这些开发者而言,在 Rust 中拥抱 AI,就是对开源精神的背叛,是“令人作呕的”。他们主张全面封杀 AI 提交,并要求所有贡献者必须证明其代码完全由人类编写。

极端二:承认现实,用魔法打败魔法

但现实是残酷的。Niko Matsakis 等负责人非常清楚:“潘多拉的魔盒已经打开,堵是堵不住的。”

既然无法阻止人们用 AI 写 PR,那就想办法用规则甚至用 AI 自身来防御 AI。

在这场激烈的讨论中,Rust 团队提出了几项极具参考价值的“防御性架构与策略”,值得每一个饱受 AI 代码折磨的团队学习:

  1. 引入“反垃圾邮件”级的审查门槛:不再一视同仁地对待所有 PR。建立类似“Web-of-Trust(信任网)”的机制。只有当你在社区里通过人类交互证明了你的能力(提交过 N 次高质量代码)后,你的 PR 才会被优先审核。对于那些上来就提交上千行完美格式代码的陌生账号,直接打入冷宫。
  2. 强制签署“反 AI 免责声明”:在提交 PR 时,强制要求作者勾选确认:“我完全理解我提交的每一行代码,并能亲自回答 Reviewer 的任何问题;我没有直接复制大模型的回复来敷衍维护者。” 如果一旦发现充当“AI 传声筒”,立即实施封禁。
  3. 以毒攻毒,引入 AI 门卫:既然你们用大模型批量生成 PR,那我们就用大模型来做“初筛”。在人类 Reviewer 看代码之前,先让 AI Agent 去自动扫描那些“看似合理实则荒谬”的逻辑漏洞,直接打回重做。

AI 狂欢下的“零付费”收割

在整份纪要中,最让我感到扎心的一段话,是关于“开源维护者生存现状”的拷问。

目前,像 OpenAI、Anthropic 这样的 AI 巨头,估值动辄千亿美元。它们的模型能写出越来越好的 Rust 代码,很大程度上是因为它们疯狂吸收了 Rust 社区十几年积累的心血。

然而,当这些估值千亿的公司推出“编程 Agent”,导致开源社区的维护工作量呈指数级爆发时,那些没日没夜帮这些“AI 垃圾代码”擦屁股的 Rust 核心维护者们,却拿不到一分钱的报酬!

一位核心成员悲愤地提议:

“也许我们应该直接去找那些 AI 公司(他们内部也在大量使用 Rust),要求他们出资赞助我们的维护者。虽然很多人在道德上抵制这些公司,但我依然希望拿他们的钱来养活我们的兄弟们。”

这就好比一家巨无霸外卖平台,每天把几十万份外卖倾倒在你的社区门口,然后让社区里那些没有工资的清洁工志愿者去疯狂打扫。

在 AI 巨头狂欢的盛宴下,开源世界的基石正在被悄无声息地榨干。

小结:退潮之后,谁在裸泳?

这份长达 20多 页的讨论,给所有沉浸在“AI 改变命运”幻觉中的开发者敲响了一记震耳欲聋的警钟。

不可否认,AI 确实是极其强大的工具。文档中也有不少成员承认,使用 AI 让他们感到了“赋能(Empowered)”,让他们能轻松搞定平时不愿意碰的繁琐文档和构建脚本。

但工具的强大,永远无法掩盖使用者的平庸。

当你可以用 Claude Code 在 10 秒内生成一段精妙的多线程 Rust 代码时,请记住:

只有当你真正懂所有权(Ownership)、懂借用检查(Borrow Checker)、懂底层内存布局,并且能在发生诡异 Panic 时独立完成 Debug 的那一刻,这段代码才真正属于你。

否则,你不过是 AI 巨头商业版图上,一个毫无感情的、廉价的“代码搬运工”。

不要用战术上的(生成代码)勤奋,去掩盖战略上的(底层认知)懒惰。

在代码生成的迷雾中,保持清醒的头脑,去深钻那些 AI 无法替代的系统级设计思维和底层工程哲学,才是我们在大模型时代唯一的生路。

资料链接:https://nikomatsakis.github.io/rust-project-perspectives-on-ai/feb27-summary.html


今日互动探讨:

在你的日常开发或开源贡献中,有没有被同事或陌生人提交的“AI 垃圾代码”狠狠坑过?你觉得开源社区应该全面封杀 AI 代码,还是张开双臂拥抱它?

欢迎在评论区疯狂吐槽与分享!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


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

Go 语言之父亲自下场道歉:藏在 Spec 里的十年“笔误”,终于要修正了!

本文永久链接 – https://tonybai.com/2026/03/25/go-spec-contradiction-in-types-section

大家好,我是Tony Bai。

在 Go 语言的世界里,type 是我们每天都在打交道的关键字。但如果我今天问你一个极其基础的问题:

Go 语言内置的 bool 类型,到底是不是一个“Defined Type(已定义类型)”?

你可能会愣一下,然后不假思索地回答:“那必须是啊,bool 是语言自带的,当然是已定义的。”

但如果我再追问一句:“既然它是 Defined Type,为什么我们不能给它绑定方法,像 func (b bool) IsTrue() {} 这样写?”

你可能就彻底懵了。

别慌,如果你对这个问题感到困惑,说明你已经触及到了 Go 语言类型系统设计中最深、也最容易被忽视的一个“历史遗留问题”。

就在最近,Go 官方 GitHub 仓库中,一个看似在“抠字眼”的 Issue #78208(spec: contradiction in Types section) 引来了社区里多位Go开发者下场激烈辩论,最终甚至连 Go 语言三巨头之一、被誉为“Go 语言之父之一”的 Robert Griesemer 都亲自现身,发表了一段长文来“认错”,并用拉丁语写下了那句沉重的 “Mea culpa”(我的锅)

今天,我们就来当一次“技术侦探”,顺着这个 Issue 的蛛丝马迹,硬核扒开 Go 语言规范(Spec)的底层,看看这个小小的 bool 类型背后,到底藏着 Go 团队一段怎样的设计“原罪”,以及它对我们日常编码产生了多大的深远影响。

一段自相矛盾的官方“圣经”

故事的起因非常简单。一位开发者在精读 Go 语言官方规范(Spec,被誉为 Go 语言的“圣经”)时,发现了一个极其明显的逻辑矛盾。

Types 章节,规范明确地将“具名类型(Named types)”分为了三类:

“Predeclared types, defined types, and type parameters are called named types.”
(预声明类型、已定义类型和类型参数,统称为具名类型。)

这里的措辞,清晰地将这三者并列。

但当你翻到 Boolean types 章节时,却赫然写着:

“The predeclared boolean type is bool; it is a defined type.”
(预声明的布尔类型是 bool;它是一个已定义类型。)

矛盾爆发了!

如果“预声明类型”和“已定义类型”是平级的、不同的两个分类,那 bool 怎么可能既是前者,又是后者?这就像生物分类学里说“哺乳动物和爬行动物是不同的两个纲”,然后又说“老虎是一种爬行动物”一样荒谬。

这个问题瞬间在社区里炸开了锅。

一场关于“定义”的思辨

Issue 下方的评论区,堪称一场神仙打架。

一部分开发者认为这是明显的 Spec 笔误。他们旗帜鲜明地指出:

“bool 不是一个已定义类型。因为它不能拥有方法。对于一个已定义类型 T,它必须出现在 type T … 的定义中。”

这话说得掷地有声。我们都知道,type MyInt int 之后,MyInt 才是一个真正的 Defined Type,我们可以给它绑定方法。而 bool 显然不符合这个特征。

但另一派开发者,也开始了精彩的“诡辩”。他们认为:

“Spec 并没有说这三个分类是互斥的。‘预声明’只是意味着这个类型是编译器内置的,但它本质上依然是一个‘已定义’的类型。只不过它的定义对我们不可见罢了。”

双方你来我往,从类型的方法集,辩论到 Go 1.9 引入类型别名(Type Alias)时的历史背景,再到 Go 1.18 引入泛型后对“具名类型”的重新定义。

就在大家争得面红耳赤之时,Go 语言之父之一 Robert Griesemer 悄然现身,一锤定音。

Go 语言类型系统的“原罪”

Robert Griesemer 的长篇回复,像一本尘封已久的历史档案,为我们揭开了 Go 语言在类型设计上的一段“黑历史”。

他首先承认:“没错,你们都被搞糊涂了。这个 Spec 写得确实有歧义,我们马上就改。”

然后,他开始讲述这个“小小的”用词不当背后,隐藏的 Go 团队在设计类型系统时的“原罪”。

原罪的根源:Go 团队混淆了“拥有名字”和“拥有唯一身份”这两个概念。

  1. Go 1.0 时代

那时只有“具名类型”和“匿名类型”。为了让 int、bool 这些内置类型拥有独一无二的身份(Type Identity),Go 团队很自然地把它们也归入了“具名类型”,毕竟它们确实有名字。这在当时看起来很完美。

  1. Go 1.9 时代(引入类型别名)

type NewString = string 这样的类型别名出现了。NewString 也有名字,但它的身份和 string 是完全一样的。这就和原来的“具名=唯一身份”的假设冲突了。

为了解决这个问题,Go 团队做了一个现在看来极其糟糕的决定:他们把原来表示“唯一身份”的“具名类型”,改名为了 “已定义类型(Defined Type)”。而 bool、int 这些内置类型,为了保留它们的唯一身份,也就跟着一起被“定义”成了 Defined Type。

  1. Go 1.18 时代(引入泛型)

类型参数 T 出现了。T 也有名字,而且不同的类型参数(比如 T 和 P)必须拥有不同的身份。于是,Go 团队不得不又把“具名类型(Named Type)”这个概念重新捡了回来,这次用它来统称所有“拥有唯一身份”的类型。

看懂了吗?

bool 之所以被错误地描述为 defined type,完全是一次历史的意外。它是 Go 团队在不断给语言打补丁、修补旧概念的过程中,留下的一块“历史伤疤”。

Robert Griesemer 最后感慨道:“Mea culpa(我的锅)。”

这个小小的用词问题,背后是 Go 语言设计者在面对一个不断演进的复杂系统时,所做出的艰难权衡与无奈妥协。

他甚至自嘲般地补了一刀:

“为了让你们更受伤一点,我再告诉你们一个秘密:预声明的 any 类型,其实根本不是一个具名类型,它只是匿名接口 interface{} 的一个别名。”

最后,我们看到了Robert Griesemer 提交了一个cl,给出了修改方案:在spec中明确”predeclared types are named, not defined types”,即预声明类型是具名类型,但不是已定义类型。同时加上了对 any 这个预声明类型不是具名类型的澄清。

这个“抠字眼”的争论,对我们写代码有何意义?

看到这里,你可能会觉得:“搞了半天,不就是改几个英文单词吗?关我写业务代码什么事?”

关系太大了。理解了这段“黑历史”,你才能真正打通 Go 类型系统的任督二脉,尤其是在处理泛型和接口时。

1. 你才能真正理解“类型约束”的本质。

在泛型函数中,~string 这个约束,匹配的是所有底层类型为 string 的类型。它包含了 string 本身,也包含了 type MyString string 这种 Defined Type。

但如果你只写 string,那么 MyString 类型的变量是传不进去的。

因为 string 是“预声明类型”,而 MyString 是“已定义类型”,尽管底层结构一样,但它们的“身份”在 Go 的世界里是完全不同的。

2. 你才能彻底搞懂“方法集”的规则。

为什么 bool 不能有方法?因为它不是通过 type 关键字在你的代码里定义的。方法只能绑定在你明确定义的类型上。这个规则,是 Go 语言不允许你“污染”内置类型的安全护栏。

3. 你才能在写库时,做出更高级的 API 设计。

当你设计一个库的 API 时,到底是应该接受 string,还是应该接受 interface{ String() string }?

如果你只接受 string,那么所有基于 string 定义的新类型都必须强制转换,非常不便。

但如果你接受接口,就意味着你放弃了对底层数据结构的强约束。

理解了“预声明类型”与“已定义类型”在身份上的本质区别,你才能在这两者之间做出最合理的架构权衡。

小结:于细微处,见真章

一个看似吹毛求疵的 Issue,最终牵扯出了 Go 语言长达十几年的演进历史和设计哲学。

它告诉我们: 一门伟大的编程语言,并不是一蹴而就的天才设计,而是在无数次的妥协、修补和自我反思中,不断螺旋上升的有机生命体。

而我们作为开发者,对这门语言最好的尊重,就是不仅要知其然,更要知其所以然。

下次当你在面试中被问到 Go 的类型系统时,不妨把这个关于 bool 的故事讲给面试官听。相信我,这远比你背诵一百遍枯燥的语法规则,更能证明你对这门语言的深刻理解。

资料链接:

  • https://github.com/golang/go/issues/78208
  • https://go-review.googlesource.com/c/go/+/757120

今日互动探讨

在你的 Go 开发生涯中,遇到过哪些让你对 Go 的类型系统感到极其困惑,甚至怀疑人生的场景?比如类型断言的 panic、空接口的转换、还是泛型的约束?

欢迎在评论区分享你的踩坑经历!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats