Rust 编程第一课学习笔记之《让Rust成为你的下一门主力语言》
Table of Contents
Rust编程第一课学习笔记之《让Rust成为你的下一门主力语言》
Rust是一门非常重视开发者用户体验的语言。如果做一个互联网时代的编程语言用户体验的排行,Rust 绝对是傲视群雄的独一档。 一旦你适应了 Rust,就很难离得开。Rust 语言的这种极致用户体验不仅仅反映在编译器上,整个语言的工具链包括 rustup、cargo 等,都是如此简单易用、善解人意。 Rust会越用越享受。以我个人的开发经验看,很多语言你越深入使用或者越广泛使用,就越会有“怒其不争”的感觉,因为要么掣肘很多,无法施展;要么繁文缛节太多,在性能和简洁之间很难二选一。
而我在使用 Rust 的时候,这样的情况很少见。操作简单的 bit 、处理大容量的 parquet、直面 CPU 乱序指令的 atomics,乃至像 Golang 一样高级封装的 channel,Rust 及其生态都应有尽有,让你想做什么的时候不至于“拔剑四顾心茫然”。
Rust 被公认是很难学的语言,学习曲线很陡峭。
作为一门有着自己独特思想的语言,Rust 采百家之长,从 C++ 学习并强化了 move 语义和 RAII,从 Cyclone 借鉴和发展了生命周期,从 Haskell 吸收了函数式编程和类型系统等。
所以如果你想从其他语言迁移到 Rust,必须要经过一段时期的思维转换(Paradigm Shift)。
从命令式(imperative)编程语言转换到函数式(functional)编程语言、从变量的可变性(mutable)迁移到不可变性(immutable)、从弱类型语言迁移到强类型语言,以及从手工或者自动内存管理到通过生命周期来管理内存,难度是多重叠加。
而 Rust 中最大的思维转换就是变量的所有权和生命周期,这是几乎所有编程语言都未曾涉及的领域。
但是你一旦拿下这个难点,其他的知识点就是所有权和生命周期概念在不同领域的具体使用,比如,所有权和生命周期如何跟类型系统结合起来保证并发安全、生命周期标注如何参与到泛型编程中等等。 学习过程中,在所有权和生命周期之外,语言背景不同的工程师也会有不同难点,你可以重点学习:
- C 开发者,难点是类型系统和泛型编程;
- C++ 开发者,难点主要在类型系统;
- Python/Ruby/JavaScript 开发者,难点在并发处理、类型系统及泛型编程;
- Java 开发者,难点在异步处理和并发安全的理解上;
- Swift 开发者,几乎没有额外的难点,深入理解 Rust 异步处理即可。
只要迈过这段艰难的思维转换期,你就会明白,Rust 确实是一门从内到外透着迷人光芒的语言。
从语言的内核来看,它重塑了我们对一些基本概念的理解。比如 Rust 清晰地定义了变量在一个作用域下的生命周期,让开发者在摒弃垃圾回收(GC)这样的内存和性能杀手的前提下,还能够无需关心手动内存管理,让内存安全和高性能二者兼得。
从语言的外观来看,它使用起来感觉很像 Python/TypeScript 这样的高级语言,表达能力一流,但性能丝毫不输于 C/C++,从而让表达力和高性能二者兼得。
这种集表达力、高性能、内存安全于一身的体验,让 Rust 在 1.0 发布后不久就一路高飞猛进,从 16 年起,连续六年成为 Stack Overflow 用户评选出来的最受喜爱的语言。
如何学好 Rust?
Rust 如此受人喜爱,有如此广泛的用途,且当前各大互联网厂商都在纷纷接纳 Rust,那么我们怎样尽可能顺利地度过艰难的思维转换期呢?
在多年编程语言的学习和给团队传授经验的过程中,我总结了一套从入门到进阶的有效学习编程语言的方法,对 Rust 也非常适用。
我认为,任何语言的学习离不开精准学习+刻意练习。
所谓精准学习,就是深挖一个个高大上的表层知识点,回归底层基础知识的本原,再使用类比、联想等方法,打通涉及的基础知识;然后从底层设计往表层实现,一层层构建知识体系,这样“撒一层土,夯实,再撒一层”,让你对知识点理解得更透彻、掌握得牢固。
比如 Rust 中的所有权和生命周期,很多同学说自己看书或者看其他资料,这部分都学得云里雾里的,即便深入逐一理解了几条基本规则,也依旧似懂非懂。
但我们进一步思考“值在内存中的访问规则”,最后回归到堆和栈这些最基础的软件开发的概念,重新认识堆栈上的值的存储方式和生命周期之后,再一层层往上,我们就会越学越明白。
这就是回归本原的重要性,也就是常说的第一性原理:回归事物最基础的条件,将其拆分成基本要素解构分析,来探索要解决的问题。 精准学习之后,我们就需要刻意练习了。刻意练习,就是用精巧设计的例子,通过练习进一步巩固学到的知识,并且在这个过程中尝试发现学习过程中的不自知问题,让自己从“我不知道我不知道”走向“我知道我不知道”,最终能够在下一个循环中弥补知识的漏洞。
这个过程就像子思在《中庸》里谈治学的方法:博学之,审问之,慎思之,明辨之,笃行之。我们学习就要这样,学了没有学会绝不罢休,不断在学习 - 构建 - 反思这个循环中提升自己。Rust 的学习,也是如此。 想要学好任意一门编程语言,首先要吃透涉及的概念,因为编程语言,不过是这些概念的具体表述和载体。 Pascal 之父,图灵奖得主尼古拉斯·沃斯(Niklaus Wirth)有一个著名的公式:算法+数据结构=程序。想随心所欲地使用Rust 为你的系统构建数据结构,深度掌握类型系统必不可少。
在 Rust 里,你可以使用 Trait 做接口设计、使用泛型做编译期多态、使用 Trait Object 做运行时多态。在你的代码里用好 Trait 和泛型,可以非常高效地解决复杂的问题。 让我们携手,为自己交付 “Rust 开发” 这个大技能,让 Rust 成为你的下一门主力语言!