在飞速演进的技术浪潮中,Rust 编程语言凭借出色的性能、安全性与对开源的坚持脱颖而出。作为 Rust 项目的核心负责人,Josh Triplett 数十年深耕 Rust 开发,专注于并发、系统优化与生态建设上的突破。他坚信,Rust 的继任者就是 Rust 自己,它始终在自我革新。
作为一位有前瞻眼光的战略家和高效编程专家,Josh Triplett 通过持续建设开源社区文化来推动 Rust 前行,带动了语言特性与生态发展的双重突破。他也分享了如何在社区中传承开源精神,以及如何培养下一代 Rust 程序员成为 10x 工程师。
GOSIM 很荣幸邀请 Josh Triplett 与全球技术爱好者分享他宝贵的经验。在 GOSIM CHINA 2024 大会期间,他主持了一场名为“炉边对话”的圆桌讨论。会后,GOSIM 的 Open AGI Forum 特别邀请他与 CSDN 资深技术编辑王启隆(Eric Wang)展开独家对谈,深入探讨 Rust 的特性与未来发展,并畅谈开源的前路。
对话亮点:
-
传说中的“10x 工程师”是真实存在的。成为 10x 工程师的秘诀,是让另外 10 个人的生产力翻倍。
-
人们常常猜测谁会成为 Rust 的继任语言。我们语言团队的一位成员曾说过:“Rust 的继任者就是 Rust 自己。“尤其是随着各类特性不断加入,Rust 始终在追求自我完善。
-
人们常怀有一种矛盾的心态:一方面渴望享受开源带来的便利,另一方面又想把自己的成果藏起来。这种矛盾的中间地带是——绝大多数东西都应该开源。
-
如果你想用专有软件驱动商业发展,那就坚持下去,并为之自豪。但如果它不是开源的,就别给它贴上开源的标签。
-
WebAssembly 在可移植性与底层硬件访问之间取得了平衡,这与 Rust 化解目标冲突的核心哲学完全契合。
-
我们都有过生产力爆棚的日子,也有过自我怀疑的时刻。我们往往只看到别人分享出来的漂亮成果,却忽略了背后的失败。这种信息不对称的比较,很容易让人觉得自己不够好。
1. 开源与互助:成就 10x、100x 高效程序员的核心
Eric Wang: 作为英特尔 Chrome OS 前首席软件架构师,您在从闭源走向开源的转变中获得了哪些新的认识?
Josh Triplett: 作为英特尔 Chrome OS 的前首席软件架构师,我处理过许多与 Chrome 和 Chromium 差异相关的问题。Chromium 是 Chrome 的开源版本,Chromium OS 则是 Chrome OS 的开源版本。
人们常常陷入一种矛盾的心态:一方面渴望享受开源带来的好处,另一方面又想把自己的工作保密。虽然大多数驱动都已开源,但某些领域——比如摄像头的工作机制——是不能对外公开的。一旦公开,竞争对手可能会照搬,从而失去所谓的独特价值。此外,不同群体都觉得自己的核心竞争优势非常强,除非自愿开源,否则别人就该无条件地把源码分享出来供其使用。
这种矛盾的中间地带是:绝大多数东西都应该开源。这段经历让我意识到,真正的创新应该聚焦于打造卓越的硬件,比如高性能摄像头、强大的处理器和高品质的笔记本电脑。如果你想脱颖而出、做出人们愿意付费的东西,就得依靠真正先进的技术,而不是靠保密来削弱对手。
我非常欣赏开源条件下能避免重复劳动这一点。过去三十年我之所以如此专注于开源,就是因为人们可以分享工作原理,避免重复造轮子。当然,这需要合理的报酬——没有资金和有保障的工作环境,任何工作都无法推进。如果你是硬件公司,通过开源来促进硬件销售是说得通的。但对软件公司而言,构建一个完全开源的商业模式非常有挑战。
我坚信开源的价值,它是对世界的巨大贡献。同时我也理解,人必须在开源与专有软件之间找到平衡。最让我沮丧的,是有人把“几乎开源但并不完全开源”的东西贴上“开源”的标签。这种“接近开源但不完全开源”的许可证潮流,是对开源精神的扭曲。如果你想用专有软件驱动商业,那就坚持专有并为之自豪。如果它不是开源的,就别给它贴上开源的标签。
Eric Wang: Rust 的社区文化有什么独特之处?
Josh Triplett: 从一开始,Rust 就把“如何对待人”“如何做到包容”放在优先位置,这是 Rust 的核心精神。我们始终强调社区的友善与包容。我们从不宣称自己完美,但我们承诺会持续改进。
我坚信 Rust 一直在努力站在这个领域的前沿。作为 Rust 领域的引领者,以身作则至关重要。
随着项目成长,创始人最初的文化与后来自然演变出的东西之间,总会存在某种张力。面向公众的项目往往容易回落到平庸。越来越多的人带着“把活干完就行”的心态来到 Rust。如果不刻意维护,它就可能退回到软件行业对待人的平均水平。任何项目,如果不在新成员加入时有意识地维护和发展自身文化,都会失去这种文化。
Eric Wang: 为了推动构建一个包容而积极的开源社区,您采取过哪些举措?这个过程中需要克服哪些挑战?
Josh Triplett: 我最初接触 Rust 时,就被它极高的参与便利性吸引了。Rust 社区有一套开放的开发流程,语言或库的任何变更都会以透明的方式讨论和呈现。这种开放的流程带来了积极的影响。
刚开始参与时我注意到,Rust 社区里从领导者到团队成员——包括当时作为新用户的我——都在牺牲自己一部分工作和优先级,花时间去指导新用户、把他们带进社区。他们花了大量时间去引导他人、帮助迭代,而不只是盯着自己的代码。
我努力效仿这种做法,并把它传给下一代 Rust 程序员。我花在评审他人 Rust 提案上的时间比花在自己提案上的更多,也会与 Rust 社区的其他成员一起打磨设计。我觉得这有一种倍增效应。传说中的 10x 工程师是真实存在的。成为 10x 工程师的秘诀,是让另外 10 个人的生产力翻倍。要成为 100x、1000x 乃至 10000x 的高效者,唯一的途径就是提升他人的生产力。如果你不肯花时间去指导新用户,就永远无法把社区规模化。
Eric Wang: 作为一位经验丰富的开源贡献者,对于那些想为 Rust 项目做贡献的人,您有什么建议?
Josh Triplett: 网上有一些很棒的指南,教人如何完成第一次贡献。在这里,我可以推荐两条不错的路径。
第一,如果有什么是你真正热爱的,就优先去做。如果你对某个特定领域充满热情,可以从一个你感兴趣但并非业务关键的项目入手。比如我曾经因为兴趣,用 Rust 围绕 Git 版本控制系统做过一个工具,也想借此学习 Rust。现在回头看那些旧代码,写得相当糟糕!但我们都是从某个地方起步,然后一步步变好的。
你也可以选择那些力所能及、做得动的任务。有些小问题只需十行代码就能修好,它们能帮你学会如何为一个项目做贡献。这些小贡献很重要,因为你不可能一步就从零跨到一切。
编译器错误信息中的问题是极好的起点。当你发现哪里不对时,提交一个 10 到 15 行的补丁去改进错误提示。Rust 的一大长处,就是让编译器尽可能高效。一旦你发现了问题,去打磨出最好的错误信息,是开始贡献的好方式。
当其他程序员看到你帮忙改进过的错误提示时,他们会松一口气,而你已经帮到了很多人。恭喜,你已经成了一名 10x 工程师——你让成千上万人的效率都提升了一点点。
2. Rust 如何博采众长,实现跨语言融合
Eric Wang: 在推动更多公司采用 Rust 的过程中,您遇到过哪些挑战?又是如何应对的?
Josh Triplett: 首先,把 Rust 引入现有项目,意味着它需要与其他技术和谐共存。面对庞大而成熟的 C 代码库时,你需要规划渐进式地引入 Rust,而不是彻底重写。我不想用 Rust 去激进地取代其他技术,我希望它们能顺畅协作。
一个可行的方案是:在一个 C 项目中逐步把部分代码从 C 迁移到 Rust,同时确保测试通过、用户满意。也许几年之后,这个大项目会主要依赖 Rust,但不必着急。
Rust 与 C 的互操作性非常好。Rust 内置的 C 编译器让你可以把 Rust 和 C 代码一起编译。Zig 走了另一条路,追求不同层次的安全性,其一大亮点就是无缝互操作。因此,更好的互操作性是 Rust 融入现有项目、实现有效协作的关键,它能简化迁移过程。
另一个挑战在于:Rust 强调安全、清晰表达与掌控力,而 Python 或 Java 这类语言会自动处理某些流程,比如内存管理,两者之间存在张力。举例来说,带垃圾回收的语言会自动管理内存,而 Rust 需要手动管理,比如通过引用计数(Arc 或 Rc)。
Rust 允许你写出高度优化的代码,通过大量使用借用机制来把内存分配降到最低。Rust 并不强迫你一上来就把内存使用优化到极致。你可以先用克隆、Arc 和互斥锁,再做性能分析,找出瓶颈所在。
Eric Wang: 除了 C、Python 和 Java,Rust 与 Go 这类新兴的系统编程语言有实际的联系吗?Rust 能从这些语言中学到什么?
Josh Triplett: 我们努力与许多语言保持友好关系。Rust 倡导的原则之一,是不贬低其他语言。我们有时会做一些比喻性的对比,但会尽量避免落入贬损其他语言的陷阱。许多开发者会把 Python 和 Rust 一起用,也有 C 与 Rust、甚至 C++ 与 Rust 并用的。我也见过一些出色的工作,让 Rust 与 C 对接——几乎任何语言都有可能与 Rust 实现互操作。
在 Rust 崛起之前的那些年,确实出现了一场真正的语言复兴,很大程度上是由 LLVM 编译器推动的。LLVM 的开源与宽松许可让所有人都能用上它。你只需要写一个编译器前端,就能把 LLVM 当作后端来使用。
Eric Wang: 您在两个看似不同的领域做过研究:Linux 内核与 WebAssembly。这些研究如何影响了 Rust?
Josh Triplett: 这些经历让我深入理解了语言如何在处理器和硬件上运行、如何利用多核处理或特定指令集,以及会生成什么样的代码。因此,对于 Linux 内核的代码生成,我能轻松看到其底层细节。
我对 Rust for Linux 项目特别兴奋,因为它大幅简化了用 Rust 做贡献的流程,让编写复杂驱动变得更容易。我期待看到那些曾经在 C 中靠纪律约束的规则,如今被内化进 Rust 的类型系统。在内核里用 C 编程时,你的程序可能崩溃;运气不好的话,数据可能已经损坏了你却毫无察觉。相比之下,Rust 的编译器能告诉你代码是否正确。
至于 WebAssembly,可移植计算这个概念非常有吸引力。WebAssembly 是一个快速且高度通用的可移植层,是 JavaScript、Python 或 Lua 这类脚本语言的理想替代。如今嵌入 WebAssembly,可以让程序、游戏或应用具备脚本能力。WebAssembly 在可移植性与底层硬件访问之间取得了平衡,这与 Rust 化解目标冲突的核心哲学完全契合。
3. 挑战 C 的统治地位:Rust 的继任者必须是它自己
Eric Wang: 您如何看待 Rust 在系统编程、Web 开发、嵌入式等不同领域的应用?哪个方向最有潜力?
Josh Triplett: Rust 最初的重心非常明确,就是“简化系统编程”。当团队接近 1.0 版本发布时,他们做出了几个在当时看来相当激进、事后证明极其明智的决定。这并非源于某个宏大的蓝图,而是源于对这些复杂系统的深刻理解。团队在做 Rust 1.0 时强调稳定性,但那并不是从根本上就能保证的事——事实上,有些特性直到今天仍未进入稳定状态。
我听过一种说法:如果你去找那些试图取代 C 的语言,历史上遍地都是它们的遗骸。通过一系列决策,Rust 不仅成为一门能与 Go 或 Python 竞争的语言,还能与 C 竞争,这是前所未有的。这让 Rust 在固件、操作系统内核和浏览器等领域脱颖而出。往后看,C/C++ 也将是 Rust 重点发力的方向。
在 Web 领域,Rust 同样表现优异,尤其是作为编写 WebAssembly 的理想语言。我认为 Rust 正在走向一门通用语言,但总会有一些任务是 Python 或 JavaScript 处理得更好。
人们常常猜测 Rust 的继任语言会是什么样子。我们语言团队的一位成员曾说过:Rust 的继任者就是 Rust 自己。尤其是随着加法系统这类特性不断加入,Rust 一直在追求自我完善。我们不会原地踏步,也不会轻易宣称“大功告成”——一旦那样,就意味着我们开始衰落了。
Eric Wang: 展望未来五到十年,您认为 Rust 语言及其生态最令人期待的发展是什么?
Josh Triplett: 我们会逐步演进 Rust 的语法,提升语言的易用性,力求在清晰与自动化之间找到更好的平衡,减少大多数代码中为克隆 Arc 或处理互斥锁而写的额外细节,让这些操作更简单。此外,我预计会出现一种类似 Rust 的脚本方言,那会让 Rust 用起来更加灵活。
Rust 可能会提供更便捷的方式来声明互斥锁、Arc 这类复杂结构,而不必一味追求 C 那样的极致性能。Rust 的目标不是成为更好的 C,而是成为一门更好的、类似 Python 的语言,提供易用的 REPL。
Rust 与 C、C++ 的互操作性也会更好。眼下开发者用 Bindgen 之类的工具来实现互操作,但未来我们可能会看到一种新模式:C 与 Rust 在同一个项目中并用,互操作接口被明确声明出来。
我希望看到的是,Rust 和 C 文件能用同一个编译器编译并无缝协作,就像 C++ 与 C 的互操作那样。C++ 最重要的特性之一就是与 C 的完美兼容,我希望 Rust 也能达到这个水平。
4. Josh Triplett:被热情驱动的开源领导者
Eric Wang: 您的博士研究聚焦于可扩展的并发编程。这个领域在 Rust 项目中扮演了什么角色?
Josh Triplett: 我读博期间的研究,集中在构建能够在任意数量 CPU 上无缝扩展的数据结构。那时候,想用上 64 核或 128 核的系统难得离谱。而现在,只需每小时几美元就能在云上租到这些资源。
今天,有了像 Rust 这样把并发作为一等概念的技术,还有其他语言,写并发程序比以往容易得多。借助 Rust 或类似技术,实现并发功能现在只需几分钟,而不是几小时甚至几天。Rust 在简化并发编程上做出了重要贡献。
Eric Wang: 能举些例子说明您在可扩展并发编程上的研究如何影响了 Rust 的特性设计吗?
Josh Triplett: 在业界,说到基于 Rust 的并发算法,我们看到了 RCU(读-复制-更新)风格技术以及危险指针等相关方法的采用。Rust 是一个绝佳的范例,它把前沿的编程语言研究与务实的实现融合起来,让这些概念变得可及。
学术界长期研究区域类型、内存生命周期跟踪与所有权等问题。Rust 借鉴并发展了这些思想,从 OCaml、ML 和 Haskell 等语言汲取灵感,同时以一种更容易被采纳的形式呈现出来。得益于设计上的优化,Rust 确保了非学术背景的读者也能轻松上手。
看到这么多来自学术研究的思想最终被纳入 Rust,我非常高兴。如今,许多研究者已经基于他们在 Rust 上的工作完成了博士学位或发表了论文,形成了从研究到应用的闭环。
Eric Wang: 您为“系统优化”这一愿景工作了 16 年。这个长期目标如何影响了您个人和职业上的发展?
Josh Triplett: 这里有两个关键方面。第一,人们花在构建软件上的时间极其可观。把想法变成代码,是智力劳动转化为有形产品的关键时刻。光靠空想是不够的——你需要结果来指引下一步。而这个阶段最不该有的就是等待。
我们拥有如此强大的算力,用它来编译代码本该更轻松才对。要说服别人为开发者花一万美元买高端工作站很困难,尽管那会极大提升生产力。我的目标是缩短构建时间,让开发者有更多时间去构思绝妙的想法、验证它们并快速迭代。
另一方面是我对“让行业能够灵活地用各种组件来构建软件”的执着。几乎我参与过的每个项目都面临这个挑战。无论是把 20 种不同类型的资源——代码、软件资源、图片、3D 模型——组合起来,还是把用五种不同语言写的代码整合成一个可部署的软件镜像或安装包,这都绝非易事。
企业曾试图构建内部定制或开源的构建系统来解决这个问题,但一直没有出现真正跨语言、跨平台的方案。我正在努力简化这个流程,让多样化的组件更容易被整合进软件,而 WebAssembly 是我用来把它们绑在一起的构建脚本工具。
Eric Wang: 您有没有遇到过个人兴趣与项目需求冲突的情况?您如何平衡两者?
Josh Triplett: 对我来说这两者并不冲突。我认为开源的核心在于,开发者是被多种因素驱动去规划和分配自己的时间的。只依据个人或公司需求来决策、而忽视更广泛的社区需求,是不可取的。但把个人或公司需求作为安排自己时间与工作内容优先级的依据,则是合理的。
我会花时间去改进 Rust 的构建速度,或者探索更高效的并发处理方式。同时我也关注异步编程,希望改善 Rust 的异步编程体验——因为从真实项目中提炼出来的实践经验,远比那些不常使用自己所设计语言的人能提供的更有价值。
我的工作恰恰就是我的兴趣所在。这份驱动力来自几个不同的地方:作为 Futurewei 的顾问,他们常就改进 Rust 征询我的建议;我也经营着一家专注于构建系统服务的公司。这促使我写大量 Rust 代码,并为推进前沿的 Rust 技术做出贡献。
Eric Wang: AI 浪潮来袭时,许多程序员经历了自我怀疑。您对此有什么感受?
Josh Triplett: 确实,很多人面临冒名顶替综合征,总觉得自己不够聪明,只是勉强跟上别人。有一点非常重要:我们只看得到别人的高光时刻,却清楚自己经历的全部。我们都有过生产力爆棚的日子,也有过怀疑自己智商的时候。而对别人,我们只看到他们漂亮的成果,却忽略了他们可能经历过的失败。这种信息的不对称,很容易让人觉得自己不够好。
其实,把失败的时刻看作过程中正常的一部分,会很有帮助。我喜欢公开地分享这些经历。
关于 AI 的影响,最近一项关于 AI 辅助工作效率的讨论发现:人们在使用 AI 时感觉自己更高效了,但实际生产力并没有显著提升,这与 RLHF(基于人类反馈的强化学习)中的许多观点是吻合的。我们训练 AI 代码助手,让人们觉得自己写代码更轻松、更高效了,但这并不必然意味着它真的提升了生产力。
也许有一天,AI 能写出与人类同等质量和可靠性的代码。但至少在短期内,我并不太担心自己作为程序员的工作,新入行的程序员也不必过于忧虑。AI 和人类犯的错误类型不同,解决问题的方式也不同。关于 AI,我们还有很多更值得担心的事情,而我们真正该聚焦的,是让 AI 更好地对齐人类的需求,从而有效地为我们服务。
作者 | Harper Zhuo
采访 | 王启隆 Eric Wang
编辑 | 何苗
出品 | GOSIM 开源创新汇
