写点什么

微软首席工程师 Nick Cameron:Rust 要想取得更大的成功,需要解决这十大挑战

  • 2022-11-03
    北京
  • 本文字数:3651 字

    阅读完需:约 12 分钟

微软首席工程师Nick Cameron:Rust要想取得更大的成功,需要解决这十大挑战

日前,微软首席工程师 Nick Cameron 发文称,Rust 正面临十大挑战。


本文最初发布于 Nick Cameron 的个人博客。


Rust 正处于非常有利的位置,它正变得越来越流行,贡献者也越来越多,而且被用在了一些相当重要的地方。然而,这是一个不断变化的时代,从一个研究项目变为一门快速变化的新语言,再成为一个发展势头良好的流行项目,这个过程是非常困难的。


在本文中,我想从个人角度介绍下 Rust 目前及今后几年面临的 10 个最大的挑战。对于解决之道,我有一些想法,但那都是些又大又难的问题,想找出答案并不容易。所以,真正的解决方案需要迭代,并为此付出精力、发挥创造力。

治理挑战

1、如何掌握开发方向而又保持 Rust 的开放性?


在开源工作中,对于项目来说什么是最好的,和贡献者想要做什么之间往往关系紧张。如果你足够幸运的话,两者能够保持一致,那自然没什么问题,但通常情况并非如此。有许多方法可以缓解这种紧张关系:给大家发放酬劳,有令人信服的愿景和良好的说服技巧,制定严格的 PR 接受策略,将事情游戏化,用宣传、感谢、授权或最终的工作机会等作为奖励来激励某些工作的参与者,等等。


随着 Rust 社区不断发展,以及 Mozilla 直接支持的结束,对 Rust 来说,这种关系似乎变得更为紧张了。虽然有很多人在做必要的维护工作,但往往还是人手不足,有一些重要的领域缺乏资源,也缺少一些战略性工作,贡献导向力显得不足。


在某种程度上,采用一种自上而下的方法可能更简单。不过,那将使 Rust 丧失作为开源项目的优势。这里有一个很大的挑战是,要确保那些重要但没有吸引力的工作有人做,同时又不会失去那些让它成为优秀项目的特质。


我认为,我们当前应该着力完成以下几项具体的事情:


  • 先把一些已经开始的工作做完,而不是开始新的工作;

  • 按照工具、库、非技术性工作、语言与编译器这样的优先级顺序开展工作;

  • 优先考虑影响范围较小、成本较低、但完成后总体影响较大的工作(而不是大而迷人的工作)。与此相关的是,在开发过程中保持 Rust 项目的本色。特别是,项目如何发展并接受新的贡献者和领导者(以及由此而引发的不可避免的变化),而又不会忽视 Rust 的中心任务?随着观察员(和评论员)数量的增加,我们如何在讨论和决策过程中保持开放和透明?

2、多元化与包容性


尽管 Rust 以其热情友好的社区而闻名,但它的多样性数据却很糟糕,甚至比整个科技行业还糟糕。虽然在包容性方面,我们还算是一个做得比较好的项目,但事实是,还是有很多贡献者因为负面原因离开了项目,这表明我们应该做得更好(是的,避免倦怠也是包容性的一部分)。


包容性的一个重要方面是能够协调各种观点。如果我们只有在大家意见一致时才能和平共处,那么我们就不是多元化或包容性的。虽然在某些领域,对协商一致的偏好给我们带来了一些好处,但那也造成了一些问题。我们的文化更倾向于避免冲突而不是解决冲突,那是不健康的,会导致治理功能的失调。


要解决这些问题真的很难!但是,我们必须优先解决它们,即使很难,即使有时伴有阵痛。

3、避免僵化的低效流程


过去这些年,Rust 取得了难以置信的发展,但我们的流程和组织结构却未能跟上发展的步伐。任何与治理或流程相关的变革都很保守。即使现有流程存在着巨大的损耗,除了微调之外似乎也不可能做其他任何事情。我们积累的组织债务已经如此之多,需要进行根本性的变革,但这会非常困难。


我认为,问题的核心是项目不愿意把“管理(management)”(人员管理、项目管理、产品管理)作为项目领导层的一个重要组成部分。这些事情可以独立于技术领导层,但需要真正的权力下放(而不仅仅是工作下放)。


项目面临的挑战是愿意授权,支持这些活动,并引入新的流程,为项目提供更好的支持。

生态系统挑战

4、浏览 crate 生态系统


Rust 在最小标准库和“batteries included”之间取得了很好的平衡,这得益于蓬勃发展的生态系统和简单易用的包管理器。然而,浏览 crate 生态系统一直很费劲。crate 有很多,要找出一个适合的需要做大量的工作,或是非常积极地参与社区活动。随着不积极参与社区活动的用户越来越多,以及 crate 数量的增长,这个问题会越来越严重。

5、异步生态系统


异步编程对于 Rust 的许多应用领域来说都很重要,而且与 Rust 的编程模型非常契合。然而,这个生态系统在不同的运行时之间存在着一定程度的分裂,我们在这方面的改进工作一直很缓慢。我们在努力,但进展缓慢,最终能否成功也还是个变数。风险在于,我们最终把这些东西引入了标准库,而社区又不是很接受,最终导致这个生态系统比开始时还糟糕。

技术挑战

6、如何让这门语言在不失去核心特性的情况下拥有更广泛的吸引力?


Rust 在其细分市场已经非常成功,而且我认为还有很大的发展空间。不过,Rust 可能远不止于此。如今,有很多软件都是用具有托管运行时的语言编写的,这些运行时对性能都非常敏感,而 Rust 注重安全性、人体工程学和性能,可以开发出更好的产品,提高生产率。然而,与 GC 语言相比,Rust 目前的学习难度还很大,需要付出很高的认知成本。让 Rust 更易于学习和使用可能会提升 Rust 的影响力。


我认为,支持 GC、提供针对Rc<RefCell<T>>类型的语法糖或是添加各种语法糖并不是这个问题的解决之道。我们要简化一些东西,但又不能使 Rust 丧失其作为系统编程语言的优势。减少显式生命周期的使用,增强借用检查器,避免 trait 系统过于复杂,关注用户体验,避免成为一门庞大的语言,这些都会有所帮助。也许我们会发现新的抽象,显著简化所有权和生命周期?

7、内存模型和不安全代码


安全性是 Rust 的主要特性之一,也是许多人使用它的原因。遗憾的是,在安全的边界上是不安全代码,从安全到不安全没有一个平稳的过渡,只是一个不安全的悬崖,冰冷、可怕。我们需要提供更多的支持和更好的体验,让程序员完成不安全的工作。为此,我们需要更清晰地理解 Rust 的内存模型,然后再开发语言特性、库和工具。


所幸,这个领域很活跃,有学术研究、社区的出色工作、MIRI、不安全代码指南,等等。遗憾的是,这是一个非常复杂和困难的领域,许多来自外围的声音减缓了进展速度,增加了参与者的工作难度。一些真正有影响力的变更可能因为政治和技术原因而变得太大(参见上文的流程僵化挑战和下文的编译器的重大修改挑战)。

8、标准库演进


Rust 有一种严格而强大的方法来保持稳定性,包括针对向后兼容性定义了明确的保障措施。对于语言,一个版本可以有一些向后不兼容的演进而不会造成什么破坏。对于生态系统中的库,Cargo 和 Semver 文化亦使得演进成为可能。然而,对于标准库,除了单调发展之外没有其他任何方法(有些东西可以弃用,但永远不能删除,还有一些东西不允许修改)。


就其本身而言,这将导致标准库越来越大,越来越混乱。除此之外,还有一个次级效应:我们在稳定性方面必须非常保守,除了“永远稳定”和“只在 Nightly 版本可用并且完全可以更改”之外,API 再没有其他可能的状态(相比之下,对于 crate,pre-1.0 版本可能可以与稳定版的编译器一起使用,而 post-1.0 版本也可能要有选择地使用)。


与此相关,标准库是一笔全有或全无的买卖(技术上也有 liballoc)。有一个更细粒度的版本管理方案,让我们可以更细粒度地使用标准库,而不是要么核心库,要么全部,那将是非常有好处的。

9、编译器的重大修改


Rustc 现在是一个相当庞大的软件,有很多内在的复杂性(Rust 是一种复杂的语言,在保证快速编译的同时给出良好的错误消息非常困难),有很多大型软件常见的问题,还有很多技术债务。这里有一些很大的挑战,特别是在编译时(其中,增量编译和并行编译是两种正在研发中的方法),并且都是些很难实现的工作。


像 Chalk 和 Pelonius 这样的工作是特别大的项目(要好几个人做好几年才能完成)。将来,做出重大修改只会越来越难。幸运的是,编译器团队有能力、有精力,而且资源丰富。但是,对 Rustc 进行影响重大的修改仍然很有挑战性。

10、宏


宏有许多不完善的地方,也是该语言最不完善的部分之一。声明式宏引入了一种全新的子语言。过程宏很笨重,需要大量的依赖,并且很难掌握。所有宏在编译器(编译时间、增量编译、错误消息)和工具(IDE、rustdoc 等的各种问题)中的表现都很差。


我认为,这之所以成为一项巨大的挑战(不仅仅是又一个可以有针对性进行研究的语言特性)是因为这些问题涉及面广而且难度大。(可能)没有什么银弹,而只有大量的工程和设计工作。许多问题(如宏卫生性)需要的专业知识在社区中并不存在。宏的优先级不够高(毕竟,从根本上讲,它们还是有效的),对于贡献者来说也不够有吸引力。

未来展望


像这样列出 10 个问题,并把它们都说成是“大”问题,可能会让人感觉有点消极。但我认为,这些都是现实存在的挑战。好消息是(我觉得是),所有这些问题对于从事项目研发的各类人员来说都是已知的,而且,对于其中的许多问题,人们正在积极地寻求解决之道。尽管任何解决方案的难度都不会小,但我认为,所有这些挑战都有切实可行的解决方案。


如果我们能够专注于解决这些问题(当然还有其他一些日常的挑战),那么我认为,Rust 将可以继续发展并取得更大的成功。


原文链接:https://www.ncameron.org/blog/ten-challenges-for-rust/

2022-11-03 16:204909

评论 1 条评论

发布
用户头像
"principla engineer"直接翻译成“首席工程师”, 呵呵
2022-11-08 11:14 · 北京
回复
没有更多了
发现更多内容

Java开发人员不得不收集的代码,史上最全的微服务专业术语面试50问

Java 程序员 后端

Java开发实战讲解,牛客网面试经验,Java编程入门教材

Java 程序员 后端

Java开发究竟该如何学习,年末阿里百度等大厂技术面试题汇总,程序员翻身之路

Java 程序员 后端

Java开发经验谈,linux视频教程百度网盘,逆袭面经分享

Java 程序员 后端

Java开发自学技巧!极客学院百度云资源,2021最新Java笔试题目

Java 程序员 后端

Java开发教程,极客时间架构师训练营,面试流程4轮技术面+1轮HR

Java 程序员 后端

Java开发面经分享,springboot项目案例百度云,实战篇

Java 程序员 后端

Java开发入门与实战!极客学院和黑马程序员,Java高级工程师系列学习路线介绍

Java 程序员 后端

模块一作业

忘记喝水的猫

架构训练营

Java开发岗还不会这些问题,想拿高工资

Java 程序员 后端

Java开发自学教程!尚学堂java,我被面试官绝地反杀了

Java 程序员 后端

Java开发你需要了解的那些事,Java线程池基础入门和简单实践以及使用技巧

Java 程序员 后端

Java开发实战讲解,牛客网面试经验,Java高级知识图谱

Java 程序员 后端

Java开发工程师笔试题目,图灵学院vip百度云盘,阿里P8大牛手把手教你

Java 程序员 后端

第1周作业

波波

「架构实战营」

Java开发视频教程,linux使用教程,BIO和NIO有啥区别

Java 程序员 后端

Java开发核心知识笔记共2100页,如何保证Redis与数据库的双写一致性

Java 程序员 后端

Java开发者应该会哪些东西才不会被公司淘汰,美团Java面试

Java 程序员 后端

Java开发者跳槽面试,尚硅谷java课程,netty框架面试题

Java 程序员 后端

Java开发经典实战!自学java教程百度云盘,阿里程序员的Java之路

Java 程序员 后端

Java开发还不会这些,极客学院和黑马,进阶学习工作最全指南

Java 程序员 后端

Java开发面试基础,java架构师全套百度网盘,Java基础面试重点

Java 程序员 后端

Java开发人员不得不收集的代码,精选Java面试真题集锦

Java 程序员 后端

Java开发从零开始,牛客网java选择题库,程序员Javaweb源码

Java 程序员 后端

Java开发最佳实践手册全网独一份,vue视频教程百度网盘,正式加入字节跳动

Java 程序员 后端

Java开发经验的有效总结,以商品超卖为例讲解Redis分布式锁

Java 程序员 后端

云栖收官:想跟远道而来的朋友们说

阿里巴巴云原生

云原生 云栖大会 收官 致谢

Java开发还会吃香吗,Java微服务架构从入门到精通

Java 程序员 后端

Java开发从零开始,java基础入门传智播客网页版,Java后端路线图

Java 程序员 后端

Java开发前景怎么样,java全套教程百度云,linux基础入门教程

Java 程序员 后端

Java开发者跳槽指,牛客网算法初级班,春招我借这份PDF的复习思路

Java 程序员 后端

微软首席工程师Nick Cameron:Rust要想取得更大的成功,需要解决这十大挑战_开源_Nick Cameron_InfoQ精选文章