作者 | 云昭
2022,越来越多的开发者会发现,组长开始让自己组用 Rust 来重构项目了,即便是组长不 Push,身边的同事好像也在悄咪咪地练习“borrow checker”,有时还会看见同事对着屏幕发飙:什么玩意儿,不倒腾了!
网友戏称:只需要十行 Rust 代码,就能让你果断放弃!
学 Rust 难,已经是一个共识。然而,那些吐槽难的同学,往往会过一段时间重新操练起来,屡战屡败,屡败屡战。曾有一位资深的技术大牛吐槽:我放弃 Rust 已经四次了!
Rust 让人既爱又恨,恨得脑袋火冒三丈,直喷这代码连键盘都不够敲了,但又每次看到 Github 上的项目运行得如此高效优雅,让人却之不恭。
来源:知乎
1、Rust 魅力所在
企业对于 Rust 的吹捧已非一时兴起。
以近日电商行业软件开发商 Shopify 宣布拥抱 Rust 为例,Shopify 从一致性、性能、社区、生产力、安全等 5 个方面阐述了 Rust 对于其业务的吸引力和评估考量。
业务需求一致对口,性能高效,入门虽然难但开发还挺高效,社区驱动的开源项目,内存安全。可以说 Shopify 已经把 Rust 的每个好处都说了个遍。
一致性:Shopify 的系统编程需要覆盖多个领域,而且随着时间的推移,这个数字可能会增加。它们包括高性能服务器、提高性能或连接到其他库的 Ruby 扩展,以及编译到 Web Assembly。Shopify 诉求是对单一语言进行投资,并将其应用到众多领域,这意味着要确定一种可以非常灵活使用的语言。
性能:Shopify 需要能够高效、可持续地扩展,以支持全球商业。Rust 为我们提供了可预测的本机代码性能,包括对内存使用的精细控制,这使得它适合于我们堆栈的最低级别。当然,Rust 并不是唯一能够提供或近似这种性能的语言。在此基础上,还可以考虑使用现代 C++,如果垃圾收集器的分配行为和性能可以接受,则可以使用 Go。
社区:Rust 语言和生态系统由一个健康的社区驱动,Shopify 计划像 Ruby、Rails、React Native 和其他开源项目一样参与这个社区。Rust 的 RFC 过程和治理结构为包容性、深思熟虑的讨论提供了强大的基础,以推动语言和工具的未来。我们的贡献不仅有望使 Rust 在 Shopify 的使用中更加高效,而且还将改善所有 Rust 开发人员的工作。这也是 Shopify 加入 Rust 基金会的原因。我们希望支持 Rust 优秀的治理模式和“Rust commons”的维护,并将 Shopify 的知识和观点带入更大的 Rust 对话中。
生产力:在某些圈子里,Rust 以难以学习和使用而闻名,但 Shopify 内部和外部的开发人员发现,在最初的学习期之后,他们使用 Rust 构建起来非常高效和舒适。Rust 还有一个强大的库生态系统(“crates”)和良好的 IDE 集成工具,当然还有非常好的编译器错误消息。类型和宏系统的强大功能允许非常有表现力的 API 和语法,将开发人员的精力集中在表达他们的意思上,而不是在头脑中玩弄大量的状态和不变量。Go 在这里也有很好的声誉,C 和 C++ 就不那么好了。
安全:Rust 提供了许多让编译器帮助确保程序正确的工具,包括它们安全地管理内存,并且可以“无畏地并行”。随着 Shopify 对 Rust 的使用越来越复杂,将找到更多的方法来使用 Rust 的类型系统和安全规则来保持系统中的不变量。从我们最初的项目中,我们发现与我们评估的其他语言相比,Rust 在编译时而不是运行时暴露更多的错误。Rust 开发者经常说“部署没问题”,原因就在于此。
2、背后推手
Rust 在编程语言界内算是年轻一辈,但能在 Stack Overflow 开发者调查的“最受喜爱编程语言”评选项目中连续七年摘下桂冠,足以说明背后实力不俗。
这种实力,除了 Rust 本身的特质,更多的则来自于多家顶级大型公司或者名人的背书。
外界耳熟能详的可能要首属微软。2019 年 2 月发布报告称 70% 的安全问题为内存安全问题,为了解决安全问题,开始尝试使用 Rust 来代替 C/C++ 重写 Windows 组件;微软的 DeisLabs 团队也选择 Rust 来构建 Kubernetes 工具 Krustlet,并称 Rust 比 Go 更适合 Kubernetes 的开发 。
再比如 Facebook: 从 2016 年开始使用 Rust,当时启动了一个名为 Mononoke 的重写项目;有 Mononoke 项目作为 Rust 语言是可行的,2019 年内部 Rust 开发团队达到了 100 人,并开始应用于 Diem 区块链项目;2020 年在内部成立了 Rust 开发者体验团队,继续为 Rust 社区做贡献,并支持内部 Rust 项目开发 。
还有谷歌:2016 年开始开发的 Fuchsia 操作系统,在 2020 年 12 月首次亮相于 google open source,其中 22% 的代码为 Rust 编写 。
值得一提的是,安全的语言特性与区块链的特性天生有重合性,因此区块链也成为较早引入 Rust 语言的领域之一。Gavin Wood 博士开发的 Parity 客户端应该是首个使用 Rust 的区块链项目,于 2015 年推出,Parity Technologies 的产品还包括 Polkadot、substrate 等 。Parity 一经发布在当时引起了不小的轰动。
对了,Mozilla 作为 Rust 项目的孵化起源地,FireFox 浏览器原本计划全部用 Rust 重写,但事与愿违,最后只完成了不到 10% 的比例,整个 Rust 项目就被砍掉了!不过正是因为被砍,才让 Rust 得以有了今天遍地开花的局面。
许多技术圈内的大佬对 Rust 也是推崇备至,Linux 便是其中之一。
由 Linux 基金会主办的 2022 开源峰会上,Linus 宣布:Linux 开始拥抱 Rust!
不久,Azure CTO Mark Russinovich 甚至在 9 月呼吁停用 C/C++,建议使用 Rust,一时引起网友热议。
而时任微软首席工程师的 Nick Cameron 在个人博客经常看到 Rust 的字眼,并给出了许多中肯的 Rust 发展建议。
甚至 Python 的创始人 Guido van Rossum,不惜自损 Python 4.0 也要夸一夸 Rust。Guido 表示 Python 4.0 很难看到曙光,并认为 Rust 是一种迷人的语言,几乎可以完美地处理内存管理问题。
视线拉回国内,华为、阿里、百度、字节等企业都已经入局了 Rust。华为作为国内唯一 Rust 基金会创始成员,可以说在 Rust 社区相当活跃,比如开发了代发度量工具 Tokei、Cargo-Geiger ,同时尝试将 Rust 应用于开源项目:StratoVirt 是 openEuler 上的企业级虚拟化平台,面向云数据中心,实现了一套架构统一支持虚拟机、容器、Serverless 三种场景。此外,华为还发起了 Rusted AI 的非商业组织,推动 Rust 在 AI 领域的应用落地 。
而字节跳动飞书团队则从 2017 年开始引入 Rust,飞书客户端非 UI 部分是由 Rust 跨平台实现 ;2021 年 5 月开源了 rsmpeg 项目(一个 FFmpeg 的库),也是采用 Rust 作为主要语言。
阿里则在云原生方面加码了 Rust 的投入,比如 11 月,Nacos 多语言体系中迎来了 Rust 版本。
3、2023,Rust 值得再次拾起吗?
值得,当然值得。不管是趋势还是现实,Rust 的价值已经十分清晰。
首先从流行度上而言,Stack Overflow开发者调查以及 Rust 的年度调查都在表明使用 Rust 作为工作语言的占比正在持续提高,这种惯性一旦养成,就会成为当年 Java 风靡全球之势。
此外还是 Rust 基金会的助力,这种趋势会越来越快。据悉,Rust 基金会的创始成员承诺在 2 年内,提供每年超过一百万美元的预算,用于 Rust 项目的维护、开发和推广。
其次,Rust 代表着一种“前卫”的编程理念。软件性能的提升总是滞后于硬件性能的提升。Rust 这种基于多核编程的理念,将对性能的低级(low-level)控制与现代语言功能结合在一起,语法上类似于 C++,但是又可以保证内存安全,足以让它在未来编程界站稳脚跟。
并且,Rust 陆续提出了“没有数据争用的并发性”、“没有垃圾回收的内存安全性” 和 “无惧骇客” 等引人瞩目的概念,将无数极客大牛吸引聚拢在其项目中,不断演进,呈现出越来越开放和健康的社区生态。
此外,Rust 还代表了一种新的、开源项目的协作方式:Rust 项目中的决策权是唯一委派和分配的,核心团队拥有更多特权。
最后,需求就在那里,如果说以前,领导让做 Rust 重构是为了讲故事,自己学 Rust 是为了耍酷,但现如今的 Rust 的应用场景愈发明晰:区块链开发、嵌入式开发、分布式、云原生、WASL、GUI 等等已经到处可以看到它的身影。
之前一种语言单挑多个领域的梦想,Java 尝试过,但梦碎了,Rust 却成为了新的希望,Shopify 等为代表的公司评估它与自身的业务十分契合,就是一个例子。
正如一位开发者所评论的:
Rust 在大型企业环境中的一大优势是它真的非常通用,能够用一种语言替换多种语言。Rust 真的可以做到 C/C++ 所能做到的一切,Java 所能做的一切,大部分 JavaScript 所能做到(随着 WASM 情况的改善)。这个一站式编程语言商店是 Java 的梦想,但嵌入式 Java 的失败和 Java 小程序的失败扼杀了这个梦想。Rust 有希望复活它。
4、难学:门槛如何降低
Rust 初学者经常写到一半,脑海中会出现一种声音:何苦为难自己呢?比如下面这位朋友——
本来想拿 Rust 写一个集成业务逻辑的 API gateway,结果被 future 的那些个 error 转来转去搞得烦不胜烦,想一想发现这玩意儿又没状态我折腾它有个屁用,所以拿 node 随便搞了搞就上线了。
Rust 学习曲线陡峭得厉害是公认的。每每一到挫败之时,Go、C#、Crystal、Dart 就成了它的替代品。许多开发者甚至学习了N个月也搞不明白借用检查器。
因此,即使 Rust 能产生十分高效的代码,公司也会对他们的开发者使用它的生产力持怀疑态度。
最大的问题是,Rust 是否会被技术水平较低的程序员接受,特别是在其复杂性不断增加的情况下。Rust 的教学和培训将是关键。
习惯是需要培养的,就像垃圾收集、运行时异常、函数式编程这些陌生的概念一样,是一个不断磨合与适应的过程。
我们可以看到 Rust 方面一直在推广在学习方面不遗余力,从社区的活跃度,教程的补充等等。此外,Linux 基金会也在如何用 Rust 编写内核模块方面发布了教程。
近期,一位有心之人就利用 OpenAI ChatGPT 学习 Rust 。有位作者尝试和它做一些有关 Rust 方面的交流,回答的可以说相当可以了。比如:
- 编写一个读取文件内容的程序并为每一行添加详细的注释
- 给它源码和编译器报的错误,他给了更清晰的解释并帮忙修复了
- 问了一个rust-anlyzer filed to discover workspace 这样的问题,ChatGPT给予了详细的解决办法。后面甚至让ChatGPT帮忙写了一个完整的命令行程序
人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。Rust 虐我千百遍,我待 Rust 如初恋!共勉!