如果你学习 Rust 的过程感觉到艰难、痛苦或迷茫,不妨看一下这篇文章。 但如果你学 Rust 感觉很轻松,那这篇文章就对你无用,可以忽略。
虽然现在 Rust 学习资料非常丰富,但Rust 是一门学习成本相对比较高的语言。面对不同语言经验的人,学习成本略有差别。
在学习 Rust 之前,需要了解你将会在 Rust 学习过程中付出什么样的心智成本。
零基础的人,需要补足一些必要的计算机科学相关的基础,以及建立对编程的理解。初学编程本身就是一项很大的挑战。
有一定编程基础的人,虽然对学习 Rust 有一定帮助,但还是会有一些阻碍。
所以, Rust 入门曲线陡峭与否,除了语言本身的复杂性之外,也跟每个人的编程基础有关。
认识到 Rust 学习曲线的根由之后,你会发现,你以往的编程知识其实无法平滑迁移到 Rust 语言的学习中。
所以,你需要一个通用的学习框架,按这个框架来给自己制定学习计划,来达到对抗这个学习曲线,并达成入门 Rust 并持续学习的目的。
这个学习框架其实很简单,只需要明白两点即可:
说是学习框架,其实也是一种认知框架。接下来,我们来看具体操作。
对于有一定编程基础的朋友,学习 Rust 要经历至少三个阶段:
这三个阶段,面对不同经验的学习者,学习时间可长可短,因人而异。在学习过程中,可以搭配一些项目,由简入深。
要点就是,不要急于求成。
对于编程零基础的朋友,则在遵循上面三个阶段学习之前,需要补充一些必要的基础:
第一个阶段的学习,目标是全面了解 Rust 语法。可以让学习者在集中培训前自行学习。
何为掌握?
这个阶段不是让你一次性学会 Rust ,所以有些不理解的内容,也不要太钻牛角尖,允许自己暂时不理解,最好能记录一个问题清单。这个阶段的重点在于全面了解 Rust 语法,在头脑里构建出语法体系结构,其中分类是重点。要对语法进行分门别类梳理。比如数据类型、控制流程、结构体、trait和泛型、宏等等,它们分别的作用是什么。
第一阶段配套学习资料
看这些资料学习的时候,要围绕第一阶段的学习目标:全面了解 Rust 语法。
对 Rust 语法有一个基本了解之后,可以通过官方出品的Rust by example[3] 和 Rustlings[4] 来检验自己的学习成果。
第一阶段练手项目推荐
第一阶段练手项目的选择存在一些误区,很多人喜欢用 Rust 来刷题来学习 Rust 。但其实刷题的效果并不好。
因为 Rust 所有权的限制,对于实现一些算法和数据结构,没有其他语言那么灵活自由。如果没有对 Rust 所有权有深入了解,那刷题遇到困难,比较容易放弃对 Rust 的学习,不容易坚持。
所以这个阶段比较推荐的项目,还是以做一些让自己容易产生成就感的项目比较好。总的原则就是:结合你自己的领域经验,选择简单的项目入手。
这里推荐一些练手项目:
当然,练手项目也比较适合集中培训,由讲师来带领共同完成。
达成第一阶段的学习目标之后,就可以开始第二阶段的学习了。这一阶段可以集中培训。
第二阶段的学习目标就是,掌握 Rust 语言的关键概念。主要包含如下概念:
其中 「所有权和借用检查」是重点,只有在掌握了这两个概念之后,才算入门 Rust 语言。至于其他概念,可以在边做项目过程中逐渐掌握,但不能不知道它们。
第二阶段配套学习资料推荐
这里推荐的学习资料,不一定要全部都看完,可以着重去深入学习「所有权和借用检查」这部分重点。然后去了解 「类型系统与编程范式」、「宏」和「Unsafe Rust」等概念,也可以深入了解 Rust 设计模式相关概念。
之后,再花时间深入阅读一下 Rust 标准库文档,以及 学习 《Rust 编码规范》。
经过上面的学习,就能为投入 Rust 生产实践打下良好的基础。
第二阶段练手项目推荐
这个阶段比较推荐的项目,依然还是那个原则,即,结合你自己的领域经验,选择简单的项目,由简入深。与此同时,也可以开始阅读一些比较知名的优秀项目源码开始学习。
经过上面两个阶段的学习,学习者可以投入到自己的实际项目中开始学习了。如果没有自己的实际项目,可以参与到开源项目的贡献中去。
这个过程就是一个长期的学习和应用 Rust 的过程了。比如 Rust 并发和异步开发相关的内容,重点概念中关于类型系统、编程范式、宏、Unsafe Rust 的深入学习和应用,都在这个阶段去完成。
学习的过程,要保持输入和输出平衡。
什么叫输入?从各种学习资源中汲取各种知识,叫输入。
输出的形式很多。写一篇文章、参与一个项目、做一次分享,都是输出。
只有输入和输出保持循环,人的大脑才会处于思考模式,你输入的东西才会沉淀为结构化记忆。
所以,在上述学习阶段,除了输入,还要让自己保持输出。这样你的精力和时间才不会白费。
[1]《Rust 权威指南》: https://doc.rust-lang.org/book/
[2]《Rust Cargo Book》: https://doc.rust-lang.org/cargo/
[3]Rust by example: https://doc.rust-lang.org/rust-by-example/
[4]Rustlings: https://github.com/rust-lang/rustlings
[5]《Command Line Apps in Rust》: https://rust-cli.github.io/book/index.html
[6]toipe: https://github.com/Samyak2/toipe
[7]kyun : https://github.com/file-acomplaint/kyun
[8]《Rust Magazine》: https://rustmagazine.github.io/rust_magazine_2022/
[9]《Rust Design Patterns》: https://rust-unofficial.github.io/patterns/
[10]《Rust 编码规范》: https://rust-coding-guidelines.github.io/rust-coding-guidelines-zh/
[11]《Too Many lists》: https://rust-unofficial.github.io/too-many-lists/
[12]smallvec: https://github.com/servo/rust-smallvec
[13]toydb: https://github.com/erikgrinaker/toydb