学习 Rust 你需要一个认知框架

新的风投之王,a16z 合伙人 Chris Dixon 如何钻进加密货币的兔子洞?

前言

如果你学习 Rust 的过程感觉到艰难、痛苦或迷茫,不妨看一下这篇文章。 但如果你学 Rust 感觉很轻松,那这篇文章就对你无用,可以忽略。

虽然现在 Rust 学习资料非常丰富,但Rust 是一门学习成本相对比较高的语言。面对不同语言经验的人,学习成本略有差别。

在学习 Rust 之前,需要了解你将会在 Rust 学习过程中付出什么样的心智成本。

零基础的人,需要补足一些必要的计算机科学相关的基础,以及建立对编程的理解。初学编程本身就是一项很大的挑战。

有一定编程基础的人,虽然对学习 Rust 有一定帮助,但还是会有一些阻碍。

  • 只有 C 经验的人,学习 Rust 语法时候,有如下挑战:
  1. Rust 编程范式。c 语言是过程式,而 Rust 是混合编程范式,支持面向对象和函数式编程风格。c语言过来的人,很容易把 Rust 写成过程式风格,虽然用过程式也可以用 Rust 写出完整功能,但在代码架构上会损失 Rust 的优势。和编程范式相关的概念:泛型/ trait / 错误处理 / 结构体 / 枚举 。
  2. 所有权和借用检查。c 里面是 手动管理内存,但是 Rust 是用所有权来管理。c 里面都是用指针,但是在 Rust 里,将指针进行了安全抽象变成了引用,需要有借有检查。这些都是 c 开发者必须要掌握的概念。
  3. Unsafe Rust 安全抽象。c 语言开发者要理解 Unsafe Rust 的编码规范,理解如何进行安全抽象,这一点比较重要,尤其是和 C 相互调用时。
  4. 宏。Rust 中声明宏类似于 C 语言的声明宏,都是代码替换,但是功能比 C 的强大,这些应该也算一个学习挑战。Rust 还有功能更强大的过程宏,可以在前期学习的时候不用考虑,后期再学。
  • 有 Cpp 经验的人,默认其对 C 有一定了解,学习 Rust 语法时,有如下挑战:

  1. Rust 编程范式。Rust 的混合范式 和 Cpp 的混合范式不同。Rust 不是纯粹的面向对象语言,没有构造函数。Rust 中的泛型、 trait 、枚举 和 错误处理 对于 Cpp 开发者同样是重点。
  2. 所有权和借用检查。因为 Rust 也引入了 和 Cpp 11 引入的 基于RAII 机制的智能指针,所以在内存管理方面,对 Cpp 11 及以上版本有经验的人更容易理解。但是没有这方面经验的 Cpp 开发者就有一定难度了。
  3. Unsafe Rust 安全抽象。这一点和 C 语言开发者一样,是需要对 Unsafe Rust 的编码规范有一定理解。
  4. 泛型 和 过程宏。Cpp 开发者有模版,但是 Rust 中有泛型。Rust 中泛型的功能没有 Cpp 模版强大,但是有过程宏可以弥补。也就是说 Cpp 模版编程 等价于 Rust 的泛型和过程宏的结合。如果 Cpp 开发者也想要在 Rust 中追求 模版编程的效果,那么需要掌握 泛型和过程宏。
  • 只有 GC 语言使用经验的人,比如 Java、Python、Ruby 、Haskell等,学习 Rust 语法面临的挑战和 Cpp 基本相同,但因为使用 GC 语言的人,大部分对底层内存管理没有足够深入的了解,入门曲线会更加陡峭。

  • 所以, Rust 入门曲线陡峭与否,除了语言本身的复杂性之外,也跟每个人的编程基础有关。

    Rust 认知框架介绍

    认识到 Rust 学习曲线的根由之后,你会发现,你以往的编程知识其实无法平滑迁移到 Rust 语言的学习中。

    所以,你需要一个通用的学习框架,按这个框架来给自己制定学习计划,来达到对抗这个学习曲线,并达成入门 Rust 并持续学习的目的。

    这个学习框架其实很简单,只需要明白两点即可:

    1. 第一,不要急于求成,保持初学者心态,分阶段,分而治之。
    2. 第二,在每个阶段的学习过程中,不要仅有输入,更要保持输出。

    说是学习框架,其实也是一种认知框架。接下来,我们来看具体操作。

    分阶段学习

    对于有一定编程基础的朋友,学习 Rust 要经历至少三个阶段:

    1. 整体学习一遍 Rust 语法。对 Rust 语法和语言特性有一个充分了解。
    2. Rust 基本所有权概念需要一定深入理解
    3. 深入领域学习。上面两个阶段完成以后,就可以投入到领域实践中,进一步深入学习。

    这三个阶段,面对不同经验的学习者,学习时间可长可短,因人而异。在学习过程中,可以搭配一些项目,由简入深。

    要点就是,不要急于求成。

    对于编程零基础的朋友,则在遵循上面三个阶段学习之前,需要补充一些必要的基础:

    1. 计算机科学基础,推荐一些快速入门的书籍:《计算机是如何工作的》、《程序是如何跑起来的》、《网络是如何连接的》
    2. 入门一下 C 语言。入门 C 语言之后,学习 Rust 的时候有对比,更容易理解。
    3. 然后再遵循上面的三个阶段来学习 Rust 。

    第一阶段:全面了解 Rust 语法

    第一个阶段的学习,目标是全面了解 Rust 语法。可以让学习者在集中培训前自行学习。

    何为掌握?

    1. 对 Rust 语法有一个比较全面的了解。
    2. 对 Rust 语法进行分类。

    这个阶段不是让你一次性学会 Rust ,所以有些不理解的内容,也不要太钻牛角尖,允许自己暂时不理解,最好能记录一个问题清单。这个阶段的重点在于全面了解 Rust 语法,在头脑里构建出语法体系结构,其中分类是重点。要对语法进行分门别类梳理。比如数据类型、控制流程、结构体、trait和泛型、宏等等,它们分别的作用是什么。

    第一阶段配套学习资料

    1. 《Rust 权威指南》[1],即 Rust 官方出品的 Rust Book 。
    2. 《Rust Cargo Book》[2]
    3. 其他免费或收费的入门类 Rust 资料。

    看这些资料学习的时候,要围绕第一阶段的学习目标:全面了解 Rust 语法。

    对 Rust 语法有一个基本了解之后,可以通过官方出品的Rust by example[3]Rustlings[4] 来检验自己的学习成果。

    第一阶段练手项目推荐

    第一阶段练手项目的选择存在一些误区,很多人喜欢用 Rust 来刷题来学习 Rust 。但其实刷题的效果并不好。

    因为 Rust 所有权的限制,对于实现一些算法和数据结构,没有其他语言那么灵活自由。如果没有对 Rust 所有权有深入了解,那刷题遇到困难,比较容易放弃对 Rust 的学习,不容易坚持。

    所以这个阶段比较推荐的项目,还是以做一些让自己容易产生成就感的项目比较好。总的原则就是:结合你自己的领域经验,选择简单的项目入手。

    这里推荐一些练手项目:

    1. 结合官方的《Command Line Apps in Rust》[5]一书,实现一个简单的终端应用,比如读取 CSV 文件之类。
    2. 去 GitHub 开源仓库中寻找案例灵感:
      1. 比如实现一个终端打字练习的应用,比如toipe[6]
      2. 或者是一个简单的编辑器,比如 kyun [7]
    3. 《Rust Magazine》[8] 中寻找练手灵感。
    4. 其他,比如有些学习资料自身就配套应用案例。

    当然,练手项目也比较适合集中培训,由讲师来带领共同完成。

    第二阶段:掌握 Rust 语言关键概念

    达成第一阶段的学习目标之后,就可以开始第二阶段的学习了。这一阶段可以集中培训。

    第二阶段的学习目标就是,掌握 Rust 语言的关键概念。主要包含如下概念:

    1. 所有权和借用检查。
    2. 类型系统与编程范式。
    3. Unsafe Rust 和 宏。

    其中 「所有权和借用检查」是重点,只有在掌握了这两个概念之后,才算入门 Rust 语言。至于其他概念,可以在边做项目过程中逐渐掌握,但不能不知道它们。

    第二阶段配套学习资料推荐

    1. 《Rust 编程之道》
    2. 《Programming Rust》第二版
    3. 《Rust Design Patterns》[9]
    4. Rust 标准库文档
    5. 《Rust 编码规范》[10]
    6. 《Too Many lists》[11]
    7. 其他进阶类 Rust 书目,以及免费或收费的学习资料。

    这里推荐的学习资料,不一定要全部都看完,可以着重去深入学习「所有权和借用检查」这部分重点。然后去了解 「类型系统与编程范式」、「宏」和「Unsafe Rust」等概念,也可以深入了解 Rust 设计模式相关概念。

    之后,再花时间深入阅读一下 Rust 标准库文档,以及 学习 《Rust 编码规范》。

    经过上面的学习,就能为投入 Rust 生产实践打下良好的基础。

    第二阶段练手项目推荐

    这个阶段比较推荐的项目,依然还是那个原则,即,结合你自己的领域经验,选择简单的项目,由简入深。与此同时,也可以开始阅读一些比较知名的优秀项目源码开始学习。

    • 这个时候可以阅读 《Too Many Lists》来实现一个链表,或者,可以去 LeetCode 刷题,借此来检验自己对 Rust 所有权机制的理解。
    • GitHub 项目中获取灵感:
      • smallvec[12],比如实现一个自定义的 Vector 集合容器
      • toydb[13],比如实现一个简单的分布式数据库
      • 其他。学习资料中本身推荐的案例,或者依据学习者擅长的领域来选择适合的项目。

    第三阶段:深入领域学习

    经过上面两个阶段的学习,学习者可以投入到自己的实际项目中开始学习了。如果没有自己的实际项目,可以参与到开源项目的贡献中去。

    这个过程就是一个长期的学习和应用 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

    以太坊的「帝国模式」

    来源:David Hoffman,Bankless 联合创始人编辑:南风 Crypto 领域流行部落主义,一直如此。 CoinGecko 市值排行榜的第一名只有一个,我们都想要成为第一。 当前,Crypto 领域有足够的空间来“做大蛋糕”;我们只是处于诸多 C…

    Click to rate this post!
    [Total: 0 Average: 0]

    人已赞赏
    名家说小白百科每日优选

    新的风投之王,a16z 合伙人 Chris Dixon 如何钻进加密货币的兔子洞?

    2022-4-30 15:50:50

    名家说每日优选

    哈佛辍学,23岁华人女生如何在一年内从实习生晋升为a16z合伙人?

    2022-4-30 16:03:06

    0 条回复 A文章作者 M管理员
      暂无讨论,说说你的看法吧
    个人中心
    购物车
    优惠劵
    今日签到
    有新私信 私信列表
    有新消息 消息中心
    搜索