开发者生态
morning
C++之父开撕AI Coding:资深开发者宁愿退休也不愿伺候AI生成的代码
2026-05-25
1 阅读
傅宇琪,Tina
“我已经看到一些高级开发者开始退休了——因为他们不想再处理这种验证工作:你每次改代码、改提示词,生成出来的东西都会变。”75 岁的 C++ 之父 Bjarne Stroustrup,在最新一期播客里说了这段话。 这句话很快在 X 上被转发、放大。有人把它浓缩成一句更适合传播的话: “资深开发人员宁愿退休,也不愿处理 AI 生成的代码。” 严格说,这不是 Stroustrup 的原话。但它确实抓住了这段讨论里最让开发者有感触的部分:AI 写代码的争议,已经不只是“它能不能生成代码”,而是生成之后谁来验证、谁来理解、谁来承担系统长期运行的后果。 有网友评论说,Stroustrup 写系统代码的时间,比大多数 AI 工程师活过的时间还长。当他说“验证才是真正的问题”时,这并不是对变化的抵触,而是几十年来一次次看到系统出错、却无法追踪问题源头之后留下的经验。 “AI生成的代码更臃肿,有更多bug和安全漏洞,而且很难验证。” Stroustrup还指出,LLM用旧代码训练,生成的代码在“模仿旧代码,得到旧的性能和旧的bug”。 这期节目并不只谈 AI。Stroustrup 还系统回顾了他的职业生涯以及C++四十余年的演进脉络,编程语言的设计哲学、C++标准化历程以及他对AI编程的看法。 他直言90%以上的内存安全漏洞并非C++语言本身的缺陷,而是“人们写的是C风格代码”;他透露C++的市场营销预算是三年5000美元,而Java的营销投入“比C++整个开发费用还多”;他回忆自己如何在IBM和Intel的工程师之间来回穿梭调解,最终促成一个被纳入C++11标准的技术妥协,而多年后双方都承认,他们实际使用的是双方方案的组合……基于该视频,InfoQ 对内容进行了整理与部分删改。 核心观点如下: 先做到你能做到的最好,然后观察哪些有效、哪些无效,修复问题,再重复,C++就是这样成长起来的。你必须先加固根基,确保它不是一堆随机功能的堆砌,因为那就是complexity。其次,不要妥协你的测试,这非常危险。第三,当高层老板说“必须做”的时候,他们不一定是对的。他们想淘汰初级程序员,因为人数太多了。可你把初级程序员都砍了,将来又从哪儿去找资深程序员呢?LLM用旧代码训练,生成的代码在模仿旧代码,得到旧的性能和旧的bug。重要的不是学哪些语言,而是获得那些语言中蕴含的思想,你应该学和你当前语言不同的语言。 C++的起源故事 Ryan:C++的起源故事是什么? Bjarne:最开始的起点是,我得到了贝尔实验室的一份工作,当时它是世界上最好的应用工程场所。我环顾四周,看到那里有那么多杰出的人:他们构建了Unix,构建了C语言,做了大量背后的理论工作。我意识到我必须做点重要的事情,否则我根本不配待在那里。 所以我决定要构建一个分布式Unix。因为很明显,计算机性能在提升,网络也在进步,我们需要那样的东西。如果我成功了,我们本可以提前10年拥有Unix集群。但当然,我一个人做不到,那不是一个单人能完成的项目。 但在这个过程中,我首先意识到的是“世界上没有一种语言能同时满足我的需求”,我需要两样东西:底层硬件访问能力——管理内存、进程调度、网络驱动、设备驱动;以及高层抽象能力——描述“这台计算机上的模块”和“那台计算机上的模块”以及它们之间的通信协议。有很多语言能做到其中之一,但没有一种能同时做到两者。 底层工作的明显选择是C语言,因为Dennis Ritchie(丹尼斯·里奇,C语言之父)和Brian Kernighan(布莱恩·柯林汉,C语言主要贡献者)就在走廊那头。我说要构建分布式Unix,是因为我就在Unix被发明、被持续构建的地方。而虽然高层语言数量不少,但它们都太慢了,而且不能操作硬件。但我学过Simula,我认识发明了面向对象编程和Simula的Christian Nygaard和Ole Johan Dahl,所以我决定把这两者融合起来。 可行的方式是把Simula中的类(class)概念拿过来,嵌入到C语言中,让它运行得更快,并用于系统编程。同时,我让类型系统变得更规整,用户定义类型与内置类型的处理方式完全一致。后来,为了支持泛型编程,我又必须添加重载(overloading),我需要把这种规则推广到用户定义类型和内置类型都适用。这就是C++的起点。 Ryan:在你的一次讲座中,你提到用BCPL重写了一个模拟器,那是分布式Unix的工作吗? Bjarne:不,那是在那之前。我去英国剑桥大学读博士,某天我意识到需要一个分布式系统上的软件模拟器来完成博士论文,三四年后分布式Unix的想法也是从同样的思维方式中诞生的。我用Simula写了一个非常好的模拟器,它其实被名字耽误了,它是一个通用编程语言。 我写了模拟器,写了小例子和测试用例,一切都很顺利。然后我尝试了第一次真正的全规模运行,占用了系里的主机很长时间。博士生不能那样做——化学家、天体物理学家们绝不会接受,所以我被踢下了机器。我可以用Simula很好地编写程序,但我负担不起运行它的成本。 于是我把程序移植到了一台很少使用的实验计算机——CAP计算机上,它有硬件保护和能力机制,天体物理学家用不了,但计算机科学家可以。唯一的问题是Simula从未被移植到这种机器,它是专有的、只用在主机上,在CAP计算机的上下文里完全行不通。所以我用BCPL重写了模拟器,BCPL是一种会让C语言看起来都像高级语言的语言,它只有一种数据类型:word,那是一次非常痛苦的经历。 但一旦完成,我的程序运行速度估计快了大约50倍。我拿到了数据,拿到了博士学位。但我也坚信:我再也不会用那么不称手的工具去解决一个问题了。所以我列出了一份理想语言应该具备的特性清单,C++没有包含全部,但它比任何其他现存语言都更接近,C++就是从那里诞生的。 Ryan:在那次讲座中,你说用BCPL写那个程序太难了,你因此掉了一半的头发。 Bjarne:几乎完全正确。后来我为了把C++做起来,又掉了另一半。但不管怎样,它成功了。 传奇的贝尔实验室 Ryan:你提到了贝尔实验室,那是个传奇的地方。很多人对它充满好奇。当你博士毕业、考虑去哪里工作时,贝尔实验室在当时是个什么样的存在? Bjarne:如果你想做大规模、世界级的实际工程,贝尔实验室就是首选。我们当时的计算机科学家数量,大概是MIT的两倍。 我在剑桥的最后一年,有个贝尔实验室的人来做讲座。英国计算机实验室的传统是:下班后去酒吧,跟人聊聊最近在做什么。那个人跟我说:“等你需要工作的时候,给我们打个电话。”于是我就真打了。我自费飞到新泽西,而我后来的上司Sandy Fraser告诉我,我来得不是时候,他们根本没职位。但第二天,我给一个开发团队做了报告。然后他们改变了主意,把我带到了研究组,我就在那里工作了二十年。 Ryan:面试过程是什么样的? Bjarne:其实根本没什么正式的面试流程,就是跟一些人聊聊,他们已经五年没招过新人了,全靠直觉和口碑。我跟他们聊完,他们去找主管说:“这家伙不错。”我对此一无所知,当时还在加州跟人聊天,突然接到主管的电话:“你愿意来工作吗?”一周后我就去了。 Ryan:你哪来的信心自费飞过去?连工作都没保证。 Bjarne:因为那