在 9 月 27 日直播的【开源漫谈】第 14 期节目中,开源中国 OSChina 邀请到了马全一、冯洋以及张汉东三位 Rust 专家就“快十年了,Rust 怎么还没有取代 C++”这一话题展开讨论。期间,他们对网上盛传的“Rust 学习曲线陡峭”这一观点进行了反驳,并对如何着手学习Rust提出了简单可行的建议。
马全一:江湖人称 “马道长”,目前在华为负责 Rust 编程语言在国内的生态建设和推广,曾运营 openEuler 项目并推动 Docker 容器社区的发展。
张汉东:资深 Rust 专家,著有《Rust 编程之道》一书,参与了不少开源项目,当前主要工作是承接 Rust 咨询。
冯洋:南京大学计算机科学与技术系助理研究员,主要研究方向是复杂软件系统的质量保障,同时在南京大学教授编译原理这一课程。研究 Rust 已有两年,主要集中在两个方向:一是以 Rust 为核心支撑的软件工程技术研发,二是带领团队基于 Rust 的编译技术做一些尝试。
以下内容根据直播整理:
Rust学习曲线陡峭已成为泛滥的梗
冯洋:我不是那种只讲课的高校老师,而是从头开始学Rust,真的上手写过代码。Rust学习梯度陡峭性,被江湖上的兄弟们夸大了,Rust被说得太难了。实际上我认为,如果你真的开始动手写Rust代码,写1000行左右就会熟悉它。
另外我觉得,学Rust可以很深入地理解内存模型。以前我学C语言,对内存的理解就不是很深刻。而会Rust的程序员,对计算机底层的理解可能要更深刻一些。
马全一:我学Rust的时候,最早是看了张汉东老师的书,看完以后我也挺懵的。后来我想,还是要动手写。可能是因为我之前写Go,学Rust的门槛就低一点。
另外Rust 编译器会给非常明确的错误提示,只要认真去看错误提示,基本上都知道到底犯了啥错误。
在“开源之夏”项目做导师带学生的时候,我的感受就是,对大学生来说,Rust没有所谓的学习曲线。没有人跟我抱怨说太难了,学不会Rust,写不出来。
张汉东:在Rust刚出来的时候,它确实难。包括我学Rustust也花了很大的功夫。
我之前主要使用的是动态语言,这类语言不需要开发者关注内存管理,因为有垃圾回收(GC)机制。长时间使用动态语言后,我对底层的内存模型了解不多,最多只是了解了一下GC的工作原理和算法,这对于性能优化并没有太大帮助。
学Rust语言之后,我发现其学习曲线非常陡峭,这与底层基础知识体系紧密相关。如果开发者有C++等语言的经验,学习Rust会更快,更容易理解内存模型和类型系统。Rust的学习难点主要分为两个方面:一是底层内存管理机制,二是类型系统。
然而,经过六年的发展,以及AI代码能力增强,加上Rust语言丰富的教程和视频资源,使得学习Rust变得相对容易。
“1+1=2”这样很简单的数学知识,在2000年前也是很难的。但是经过十年的发展,经过知识的积累,再来学习并不难。
Rust学习曲线陡峭已经成为一个泛滥的梗。我前段时间看了一篇文章。作者比较了很多编程语言的优劣。写到Rust的时候,第一条就是说学习曲线的。然后我跟他聊天以后,发现他自己都没有学过。要学Rust,最好自己去了解一下,不要道听途说。
如果你觉得Rust难学,可能是因为你的底层基础知识体系较弱,这正是你突破和学习的机会。
国内大厂基本没有用Rust?事实上并非如此
马全一:华为很多项目都在用Rust,比如交换机一些项目,OpenHarmony里也有rust框架。字节很多应用都是用Go语言,但有些中间件业务用的是Rust。蚂蚁用Rust 写的操作系统内核“星绽”(Asterinas)也是。
目前,国内很多跨平台应用——在Web端、桌面端以及移动端(手机侧)都有相应的APP,都在使用Rust语言开发,比如飞书就是。
虽然现在很多大型互联网公司都在采用Rust,但还没有形成一个规模化的、全量全站的应用体系。
此外,国内的一些数据库产品,如TiKV,就是使用Rust编写的。还有许多新的数据库项目也在转向使用Rust,这些项目原本是用C或C++编写的,现在逐渐替换为Rust。这类项目在国内实际上是非常多的,国内在这方面的发展速度是非常快的。
在安卓里面,其实Google一直在做大量的这个重写,把原来一些不安全的代码改用Rust。最近我不知道大家看没看这个新闻,在安卓里面新增的native的代码(不使用Kotlin和Java语言编写的代码),使用Rust写得代码的数量已经超过了C。
张汉东:谷歌在9月24号,发布了一篇文章。文章中包含了一张统计图表,展示了自2019年开始的bug数据。统计的上限是250个bug。截至2024年9月的数据显示,内存安全相关的bug数量为27个。从2019年到2024年,采用Rust后,内存安全漏洞的比例大约下降了90%。
马全一:微软在Rust这件事情上的投资也是很大的。Windows 11预览版,有一些组件也在用Rust语言重写。
张汉东:我感觉就大家有这种错觉(指国内没什么人用),和Rust语言特性有关系。大厂引入一个语言,肯定有一个理由。就是Rust非常适合底层系统基础设施的开发,比如操作系统、浏览器,还有数据库。华为、谷歌、Facebook很早就用Rust。对外还没有什么Rust的岗位,是因为公司内部在逐步采用,不可能一下大规模换掉。
马全一:华为内部最新的文件是这么说的,将优先招聘掌握Rust语言的程序员。具体来说,如果应聘者同时具备C语言和Java等其他编程语言的技能,但同时也掌握了Rust,那么在招聘评价中,这些应聘者的评价将会更高。华为已经对外发布的招聘要求,就明确表示优先考虑那些懂得Rust语言的程序员专家。
学习Rust,有什么项目适合入门?
张汉东:Rust本身是一款开源语言,其生态系统也主要是开源的。如果你不确定自己应该编写什么项目,你可以浏览Rust社区推荐的项目列表,这些项目规模不一。
我建议你可以尝试使用终端UI库,如RTUI,来开发一些工具。例如,你可以用RTUI编写一个网络分析工具,或者一个终端版的待办事项列表(to-do list)任务管理器。
这些都是很好的实践项目。无论你是使用Windows、Linux还是Mac,作为开发者,你肯定会在某种程度上使用终端。利用终端来开发一个具有终端UI的工具是一个很好的入门项目,可以帮助你开始实践和学习Rust。
马全一:我觉得你不需要特别强调入门,你自己想写啥,你写就好了。比如我对版本管理感兴趣,那么就可以用Rust去实现一个相关的工具。我自己可能没有太多时间亲自编写代码,但我和实习同学一起参与了一个项目,我们用Rust重写了一个Git的某些部分。
我在之前的博客中也提到过,我们今年在华为参与了一些与教育部合作的项目,在这些项目中我们推动各个学校教授Rust。包括冯老师在内的100多位老师在50多所学校中开设了Rust编程语言的课程,有些老师可能会在讲授操作系统或软件工程课程时引入Rust。
我编写了一个案例,是关于如何在软件工程教学中使用Rust来实现版本管理。你可以用Rust去实现一个Git命令,比如我已经实现了基本的push命令。作为学生,你可以尝试编写自己的命令,比如log命令,或者实现一些未完全实现的参数,比如commit命令的-s或-a参数。
我的建议是,根据你自己喜欢的专业方向,用Rust重新实现一些东西,这就是所谓的“造轮子”。
通过这个过程,你不仅会加深对Rust的理解,而且会对你所从事的技术领域有更深入的认识。我自己也是通过编写Rust代码来推广这门语言的,如果你没有亲自写过,那么你可能也无法很好地进行这项工作。
所以,不要过于纠结于入门学习或者选择哪个项目,选择你最熟悉的技术领域,用Rust重新实现它。因为你已经熟悉这个领域,所以入门的门槛并不高。最开始,你可能会写出类似C语言或Go语言的风格,但没关系,通过不断的编写和修改,你的代码会逐渐变得更加健壮和完善。所以,不要犹豫,尽早安装Rust编译器,写一些小程序,亲自体验一下。
冯洋:如果你还没有写过任何Rust代码,那么从最简单的事情开始,比如编写一个命令行计算器。即使是一个科学计算器,代码量大概也只有五六百行。如果你能够用Rust完整地编写出来,那么你对Rust的语法就会基本熟悉。
接下来,可以尝试更大一些的项目,比如用Rust编写一个简单的编译器,或者是一个简单的爬虫。通过这些实践,你将能够快速掌握Rust的基本编程技巧。当你编写到一两千行Rust代码时,你对Rust的基本使用就会变得非常熟悉。
所以,我的建议是,各位同学不必过于担心,通过实际编写代码来学习Rust,你会在实践中逐渐熟悉并掌握它。
张汉东: 确实,在学习Rust时,没有必要一开始就掌握所有的语言特性。社区中经常讨论的特性,比如生命周期,可能会让人感到困惑。你可以保持冷静,不必急于深入学习这些复杂的概念。在初期,你可以选择绕过这些问题,先从Rust的基础和更简单的特性开始学习,随着经验的积累,再逐步深入理解那些更高级的特性。
马全一:如果你之前没有编写过代码,你可以找一个简单的项目来动手实践。如果你已经有过很多编程经验,比如从事web前端开发或API网关的工作,你可以尝试将你之前的项目用Rust重新实现一遍。这样,你就能体会到Rust与你之前使用的语言有何不同。
首先你应该专注于让代码能够运行起来,然后再考虑优化的问题。就像我们目前的工作进度一样,可能不会很快,特别是当我们处理的是文件操作系统这类复杂的项目时,我们使用数据库来处理,速度可能不会很快,而且代码的大小也会有所不同。但这些都是可以接受的,因为只要代码能够运行,我们就可以逐步对其进行优化。
微信扫码,观看直播回放: