C++之父开撕AI Coding:资深开发者宁愿退休也不愿伺候AI生成的代码
点击上方“图灵人工智能”,选择“星标”公众号
您想知道的人工智能干货,第一时间送达

“我已经看到一些高级开发者开始退休了——因为他们不想再处理这种验证工作:你每次改代码、改提示词,生成出来的东西都会变。”75 岁的 C++ 之父 Bjarne Stroustrup,在最新一期播客里说了这段话。
这句话很快在 X 上被转发、放大。有人把它浓缩成一句更适合传播的话:
“资深开发人员宁愿退休,也不愿处理 AI 生成的代码。”

严格说,这不是 Stroustrup 的原话。但它确实抓住了这段讨论里最让开发者有感触的部分:AI 写代码的争议,已经不只是“它能不能生成代码”,而是生成之后谁来验证、谁来理解、谁来承担系统长期运行的后果。
有网友评论说,Stroustrup 写系统代码的时间,比大多数 AI 工程师活过的时间还长。当他说“验证才是真正的问题”时,这并不是对变化的抵触,而是几十年来一次次看到系统出错、却无法追踪问题源头之后留下的经验。
“AI 生成的代码更臃肿,有更多 bug 和安全漏洞,而且很难验证。” Stroustrup 还指出,LLM 用旧代码训练,生成的代码在“模仿旧代码,得到旧的性能和旧的 bug”。
这期节目并不只谈 AI。Stroustrup 还系统回顾了他的职业生涯以及 C++ 四十余年的演进脉络,编程语言的设计哲学、C++ 标准化历程。
他直言 90% 以上的内存安全漏洞并非 C++ 语言本身的缺陷,而是“人们写的是 C 风格代码”;他透露 C++ 的市场营销预算是三年 5000 美元,而 Java 的营销投入“比 C++ 整个开发费用还多”;他回忆自己如何在 IBM 和 Intel 的工程师之间来回穿梭调解,最终促成一个被纳入 C++11 标准的技术妥协,而多年后双方都承认,他们实际使用的是双方方案的组合……基于该视频,InfoQ 对内容进行了整理与部分删改。
核心观点如下:

Ryan:C++ 的起源故事是什么?

但我学过 Simula,我认识发明了面向对象编程和 Simula 的 Christian Nygaard 和 Ole Johan Dahl,所以我决定把这两者融合起来。
可行的方式是把 Simula 中的类(class)概念拿过来,嵌入到 C 语言中,让它运行得更快,并用于系统编程。同时,我让类型系统变得更规整,用户定义类型与内置类型的处理方式完全一致。后来,为了支持泛型编程,我又必须添加重载(overloading),我需要把这种规则推广到用户定义类型和内置类型都适用。这就是 C++ 的起点。
Ryan:在你的一次讲座中,你提到用 BCPL 重写了一个模拟器,那是分布式 Unix 的工作吗?

但一旦完成,我的程序运行速度估计快了大约 50 倍。我拿到了数据,拿到了博士学位。但我也坚信:我再也不会用那么不称手的工具去解决一个问题了。所以我列出了一份理想语言应该具备的特性清单,C++ 没有包含全部,但它比任何其他现存语言都更接近,C++ 就是从那里诞生的。
Ryan: 在那次讲座中,你说用 BCPL 写那个程序太难了,你因此掉了一半的头发。
Bjarne: 几乎完全正确。后来我为了把 C++ 做起来,又掉了另一半。但不管怎样,它成功了。
Ryan:你提到了贝尔实验室,那是个传奇的地方。很多人对它充满好奇。当你博士毕业、考虑去哪里工作时,贝尔实验室在当时是个什么样的存在?

Ryan:面试过程是什么样的?

Ryan:你哪来的信心自费飞过去?连工作都没保证。

Ryan:像贝尔实验室这样的地方,项目选择是怎么运作的?你入职之后,他们怎么决定你做什么?

Ryan:我听说你每周和 Dennis Ritchie 吃一次午饭,持续了 16 年?他对你有什么影响吗?

Ryan:你写过三篇很长的 C++ 历史论文,里面提到 Dennis Ritchie 向 C 标准委员会提过一个“胖指针”的概念——指针里同时存储大小,但 C 委员会没批准。能讲讲这个故事吗?

Ryan:当你把一群真正令人印象深刻的人聚在一起,其他人的卓越会让人产生一种冒名顶替综合征的感觉,你曾经感受过或目睹过这种情况吗?

Ryan:说到语言设计,如果今天有人想从头构建一门编程语言,需要准备哪些东西?


Ryan:当你发现问题后,开始构建 C++ 时,有很多组件——编译器、链接器、解析器、词法分析器等等。在最初实现中,哪部分技术挑战最大?

Ryan:我注意到 C++ 工具链的某些部分是用 C++ 本身写的,这就有个鸡生蛋蛋生鸡的问题。怎么做到的?

Ryan:很多人以为 C++ 是纯面向对象语言,但你反复强调不是这样。

Ryan:你在设计 C++ 时,C 已经存在,而它的类型系统比 C++ 弱得多。为什么你选择让 C++ 的类型系统更强?

Ryan:C++ 是有名的静态类型语言,为什么你选择了静态类型?

Ryan:你刚才提到内存受限的问题,这让我想到静态类型和动态类型的另一个维度——开发效率。对于普通开发者来说,哪种方式更省时间?

Ryan: 说到保证,C++ 在内存安全问题上名声可不太好,那些“自爆开关”(foot guns)让很多人头疼。

Ryan:有没有办法让编译器直接阻止人们做那些危险的事?这在现代 C++ 里默认开启了吗?

Ryan:标准委员会是一个有趣的话题,语言由一个民主机构管理。如果它是一个独裁体制,你一个人说了算,你会加入哪些语言特性?

Ryan:如果你当时坚决说“不”呢?会发生什么?

Ryan: 光看采用率的话,C++ 显然比 Java 高得多。可我知道 Java 背后有大公司撑腰,砸了那么多营销的钱,而 C++ 呢,我记得你好像说过它的营销投入几乎为零。

Ryan:规则里写的最低底线是多少?

Ryan:民主决策是不是总得有点客观规则才行,万一召集人判断错了怎么办?

Ryan:你曾说过你提过的所有想法里,被怼得最惨的之一就是 auto。我知道 auto 后来还是进了标准,但当时它为什么那么不受待见?

Ryan:我还听说委员会内部有时会激烈争吵,比如你做过“穿梭外交”,在 IBM 和 Intel 的两拨人之间来回调解。

Ryan:1995 年你曾提议在 C++ 中引入某种形式的自动垃圾回收(garbege cllector)。这让我很惊讶,因为 C++ 没有垃圾回收器,我们得自己手动管理内存,这到底是怎么回事?

Ryan:那个标准接口是怎么工作的?是对内存分配方法做了一层包装?
Bjarne: 对。你对底层的`new`、`malloc`或`operator new`做不同的实现,然后`delete`也变得稍微不同。
Ryan:C++ 社区里有一个关于“瓦萨号”战舰的警示故事。为什么它这么流行?

Ryan:有人证明 C++ 模板实例化机制是图灵完备的。编译器在预处理 C++ 程序时,实际上可以用它来做计算,比如有人用它在编译时计算素数。这怎么做到的?

Ryan: 一般来说,大家对编程语言有个直觉:你离机器越近,性能就越高。我常听人说,C 比 C++ 更贴近机器。

Ryan:你好像在哪说过 C++ 可以比 C 性能更高,但我总觉得更多的抽象总得付出点代价吧。
Bjarne: 它在编译时被优化掉了。这就是我所说的“零开销抽象”。现在有人开始批评我,说这个说法低估了 C++ 编译器的能力——我们可以实现“负开销抽象”。
Ryan:如果我是一个汇编高手,有无限的时间,那比起来怎么样?

我跟一个在西班牙做流体动力学的朋友合写了一篇论文,我们拿一个性能测试套件里的真实例子,把那些聪明玩意儿全扔了,结果代码量减少到原来的百分之八十,性能反而提升了百分之二十。你只在需要的时候才做优化。Knuth 说,不要过早优化,但他也指出,只有那百分之二到三的地方才值得去优化。所以,先用高层次设施把东西搭起来,看看够不够好;如果不够,你必须去测量时间,找出时间都花在哪儿了,最后再优化那部分。但很多时候,你根本走不到那一步,它已经足够快了。
Ryan: 你说的“聪明”,是指靠人工手动管理去榨取性能,而你的意思是,如果不去做这些,编译器反而能得到更多信息去优化,而且它现在干得远比以前好。
Bjarne: 那些在九十年代被精巧而正确地优化过的代码,放到今天常常变成劣化,因为机器架构变了,编译器也进步了。
Ryan:如果越来越多的代码是由模型和机器写的,你觉得编程语言设计会跟着变吗?


当然,也许你可以改进它。我听说有人在写 Bjarne app,喂给它我的文章,但就算那样也有问题,因为我现在说的东西,并不完全等同于我 20 年前说的东西。
不过不管怎样,我们会看到结果的。嗯,甚至 Dijkstra 也研究过这种可能性,他当时声称,把自然语言当成编程语言的想法是愚蠢的。他没有我这么客气。
我的看法是,像英语这样的语言非常灵活,我们说的话往往非常含糊。但我们需要的是一种精确的编程语言,那是工程,是数学,不是英语。
Ryan: 对于那些性能攸关或安全攸关的代码,我猜还是会有一小群人尝试用 LLM 去弄。按你说的,那会导致更多的崩溃和 bug,因为它是没经过验证的。

Ryan: 有人问你是什么支撑你一直搞 C++,你说,一是构建未来的那种乐趣,二是觉得自己有义务确保 C++ 不断前进。当你刚开始做 C++ 的时候,我很难想象你知道自己会踏上一条长达几十年的旅程。
Bjarne: 倒不是几十年,但我知道这会是条很长的路,因为我知道我没法一步到位造出我想要的语言,只能先造一个子集。原因有两个:第一,我是一个人在做这件事;第二,我缺少足够的反馈输入,来确保我设计的东西是对的。这就是工程上的问题了:尽你所能去建造,看看什么管用,然后再改进。所以我知道我在创建一门注定要持续演进的语言,而“注定要演进”意味着,你在做某些决定的时候,就已经知道这一点跟别的不一样。举个例子,这也是 C++ 不只是一个面向对象编程语言的原因之一,因为我当时看到了很多东西,似乎无法塞进那个范式里,所以我知道我们会演进。
支撑我走下去的另一半答案,是那些应用。看到那些有趣的用法,感觉真是太棒了。比如我去喷气推进实验室,跟搞火星车的人聊天,我还去过欧洲核子研究中心,去看他们怎么搞高能物理的。几年前,我跟一个哥们儿聊天,他的工作是开门和关门。那些门有几吨重,是铅做的,会横向移动,去封闭某个区域以防辐射什么的。启动这扇门倒不难,有引擎。但他必须确保能把它停住,因为当几吨重的家伙向一堵墙移动时,它可不会自己乖乖停下。他得写代码来处理这个,那段代码非常有意思。我至今仍在到处旅行,跟人聊天,看 C++ 正在被用在什么地方,这也是学习,而学习本身就很有趣。
Ryan:你有一个著名的比喻:C 让你容易射中自己的脚,C++ 让你更难射中,但一旦射中,整条腿都没了。
Bjarne: 对,这来自我 80 年代在波士顿的一次演讲。Arnold Penzias(诺贝尔物理学奖得主)曾试图向一群贝尔实验室的经理解释 C++。他说:“你不能在不了解如何使用的情况下使用电动工具,你用手锯,可以这么来回锯。可你要换了把电锯还这么干,它会直接弹起来,你要是不受伤那就算走大运了。”背后的意思就是,你拿到一件更强大的工具,却用错了方法,惹出的麻烦只会更大。
Ryan:你还有一句名言:“没有人应该自称专业人士,如果他们只懂一门语言。”你显然会建议大家学 C++,但如果他们为了成为更好的工程师或程序员,必须再学一门第二甚至第三语言,你会推荐什么?
Bjarne: 重要的不是学哪些语言,而是获得那些语言中蕴含的思想,你应该学和你当前语言不同的语言。具体挑哪种,我其实不太纠结。我当时好像说去学一门脚本语言,今天可能是 Python 或 JavaScript,在那时候大概是 Unix Shell 之类的。再看看一门函数式语言,ML 或 Haskell 是明显的选择。关键是不要只局限在你的语言里。就像那个笑话:懂三种语言的人叫“三语者”,懂两种语言叫“双语者”,懂一种语言叫“美国人”。编程语言也一样,但我觉得编程语言更重要,因为你是在构建东西,你应该用不同的思想和技术来拓宽你的视野。
Ryan:还有一个:“那些自以为无所不知的人,真的很烦我们这些自知一无所知的人。”
Bjarne: 有太多人认为世界上所有事情都有简单的解决方案。在这个语境下,他们会来告诉我 C++ 可以简单多少。确实,如果你只想做一件事,你可以做一门简单得多的语言。如果你扔掉 C++ 的一部分,它会更简单、更漂亮,通常他们想扔掉的是跟 C 兼容的部分。但那样你会惹恼几百万人,而且不会成功,因为他们会继续抱着旧东西不放。所以,这不过是我对那些过度简化事物的人表达挫败感的一种方式罢了。有些人觉得不用学编程就能写程序,不用学工程学就能当工程师,不用懂怎么管理公司或国家就能当政客,这种过度简化让我恼火。
Ryan:你说过 C++ 不是为所有人设计的,而是为严肃的程序员准备的。
Bjarne: 对。《C++ 程序设计语言》第一版的第一行是:“C++ 旨在让严肃程序员的生活更愉快。”第一版是的用词是“专业程序员”,后来改掉了,因为我见过非常优秀的业余爱好者。“严肃程序员”大概是为别人编程的人。如果你为自己编程,没关系,那是你自己的问题。如果你为朋友编程,你可能会失去朋友。如果你为一百万人构建东西,你可能会对世界造成伤害。Guido van Rossum 设计 Python 的明确目标是让更多人,甚至每个人都能编程,他成功了。我设计 C++ 是为了给严肃的程序员、工程师、数学家,提供真正好的工具,我也成功了。我们解决的是不同的问题。
Ryan:回顾 C++ 的整个旅程,有没有什么地方你觉得是错误,或者学到了教训?
Bjarne: 很多很多次。但大多数错误从未进入 C++——这就是你需要做实验、需要早期试用的原因。我认为语言的核心部分是对的,但每一个细节都可以改进。然而,稳定性和兼容性才是根本。你要是做个小改动,会惹毛一小部分人,影响不大;可你要是做了个大改动,你就会惹毛一大群人,而且根本行不通,因为比如会有上百万人坚守旧的方式。所以我努力的方向是,让这门语言在不破坏现有东西的前提下生长。
有个场景我反复遇到。人们跑来跟我说:“C++ 太复杂了,你得把它简化。”然后紧接着又是:“我需要这两个功能,昨天就要,你在简化的同时,必须给我加上这两个功能。”末了再加一句:“反正你干什么都行,千万别破坏我的代码,我有一百万行呢。”这根本行不通,根本不可能。这就是为什么我现在在研究编程指南和 Profiles,也就是强制性的规则集。通过这种方式,你可以设计一个 Profile,确保你能用到你需要的库,同时保证你不会误用那些在你那个领域里不必要、又危险的功能。
Ryan:对于想学习 C++ 的人,你有什么技术书籍推荐?
Bjarne: 有一本我教本科生时写的书——《编程:原理与实践(使用 C++)》。要学就用最新的 C++,先学现代的方式,别一上来就学那些糟糕的 C 语言老套路。可是很多课程还是让你先学 C,先学`malloc`、指针之类的问题,然后才学怎么用`vector`和`string`来避免这些问题。Profiles 就是为了让编译器和静态分析器支持这种思维方式,教育者也在要求类似的东西。很多人认为 Profiles 只是为了处理内存安全和性能。不,它是要给人一件更好的工具,既为了学习,也为了从事特定种类的工作。
Ryan:如果你能回到职业生涯的起点,给自己一些建议,你会说什么?
Bjarne: 天呐,这是个“时间机器”问题。我有时候会给我的学生布置这道题你有一台时间机器,回去给 Dennis 提点建议,干完这事之后,再往前跳十年,来给我一些建议。这是个很好的练习,我总能从学生那儿收到些很精彩的故事和建议。
我当时努力想避免 C 语言里内置类型之间的双向隐式转换,我本该在这件事上抗争得更坚决一些。我试过,但被贝尔实验室的人拦住了。他们比我更有经验,诸如此类。现在我明白了,我当时应该更进一步的。
还有,我本该推迟 C++ 的发布,直到我能拿出类似模板的东西,这样我就能做一个更好的标准库。即便当时做出来,也不会足够好,但它能让人们从一开始就养成使用标准的习惯。当时人人都在造自己的标准库,最后是 Alex Stepanov 用 STL 救了我们,但那纯粹是运气,因为我没有推迟发布,这确实是个错误,我本应该等到能造出一个好的 vector 和一套类层次结构的时候。
最后,如果我能带着现在对标准委员会和臃肿官僚体制的了解回到过去,我会非常努力地去建立一个指导小组。我们会有一个五百人的社区来贡献提议,然后由一个大概只有五六个人、拥有深厚经验并且关心整门语言的小组,基于这些提案来做决策。但我当时没有那个经验和知识去提出这样的建议。
我没提工具的事。C++ 在工具方面一直是个短板,那是因为它成长在一个早期时代,工具匮乏,算力有限,内存有限,所以我当时也根本做不到。我给学生们布置时间机器练习时,有一条约束是:确保你给的建议在当时是有可能被采纳的。如果我只是说“我想要这个”,那么许多事情可能要到二十年之后才能做到,因此也就永远不会发生。有很多语言是奔着“为未来的计算机和程序员而设计”去的,它们中的大多数都死了,因为十年后当它们终于面世时,世界早就变了。
访谈原链接:
https://www.youtube.com/watch?v=U46fJ2bJ-co&t=40s

文章精选:
1.编程时代已终结!ClaudeCode创始人断言:编程就像发短信一样自然,首曝个人最新工作流:自创Sloop循环,单日PR达150!传统SaaS护城河崩掉
