CatCoding

我如何学“会”了 Rust

2022-04-21

最近我打算把自己的小项目 Obweb 后端用 JavaScript 重写,之前是用 Rust 写的。

重写基于以下考虑:

  • Rust 受众少,和 Obsidian 的用户群体重合的就更少了
  • Rust 开发 Web 后端确实不便,虽然我也看过其他的 Rust Web Framework,但看起来都还不太成熟
  • 在使用 Web 框架 Warp 的过程中有很多坑,而且代码看起来异常复杂
  • Web 开发这块 JavaScript 有很多现成的库
  • 这个项目比较简单,性能不敏感,使用 Nodejs 也不会有大的差异
  • 我想写写 JavaScript

当初用 Rust 也只是为了练手,今天聊聊自己如何跟进这门小众而、难学的编程语言,顺便谈谈这些年我对 Rust 的一些感受。

我最早关注到 Rust 是 2014 年,当时还没发布 1.0,但是核心的概念和设计理念已经定了,那就是不走 GC,通过编译器保证类型和内存安全,兼顾性能和安全。

接触没多久后我试着实现一个简单的 scheme 解释器,就写这个小项目 rust-scm 。这种几百行的项目就能很好的上手一门编程语言,因为在这个过程中会涉及输入输出、递归、测试,抽象方式等。

当时我觉得 Rust 用起来还行,但是有些部分很复杂,比如指针还有 Borrow Checker,另外最大的问题当然是第三方库太少。

那时还有一个印度程序员 ckkashyap 开了一个坑,用 Rust 写一个 Unix-like 的操作系统 rustix: Unix kernel in rust ,我看有点意思就跟着做了几个 PR。没多久他就弃坑了,转去搞一门更小众的编程语言 Nim,打算重新用 Nim 实现 xv6 nim-xv6: Translate xv6 to nim 。不过我们一直保持联系,有时候在 gtalk 上聊聊。他工作了大概有 20 年,非常喜欢折腾。后来他换工作去了微软,碰巧随后几年我也去了微软,最近他给我发邮件说又开了新坑 lispware/minilisp ,一起来搞啊,哈哈,我们这些 Polyglot Programmer 就是这么容易见异思迁。

后来几年我也没太关注 Rust 了,只是偶尔看看官方的一些文章之类的。在这期间国内的数据库公司 PingCap 发展起来了,国内也出现了一些 Rust 语言爱好者。

中间这些年,我有时会在 https://exercism.org 上写写练习,这些上面的编程题不是算法,而是一些典型的简单编程挑战,包含测试用例,非常适合用来练手在学的语言。

这个网站更好的地方在于里面有一些各个语言的爱好者当导师,你可以选择让他们 review 你的代码,这样就可以从经验丰富的导师那里学一门语言的最佳实践:

最近一年多我重新关注 Rust,发现热度比之前好多了,Github 上不少项目都在用 Rust 写 (当然也可能是我自己之前关注了一些开发者,他们继续在折腾),相关的生态和工具链也发展起来了,比如 rust-analyzer 加上 VSCode 的开发体验非常好,比如 Cargo 管理包很好用。

Rust 近些年在区块链和 WebAssembly 两个领域发展得不错。我认为 Rust 适合那些性能和安全性要求比较高的项目,比如 Infrastructure、存储、交易之类的项目,而一般的纯业务之类的项目就不太适合。

回顾起来发现 2021 年我参与的几个项目都和 Rust 相关:

可以说我学会了 Rust,能自己写些小项目,能在 Rust 的中大型项目中做贡献,也对 Rust 本身做贡献,但是我对一些语言细节不太清楚,比如我做 Rust Quiz 发现好多都做不出来。事实上 Rust 因为走了一条独特的设计思路,导致语言本身比较复杂。

我的学习方法就是时不时地开个坑练手,或者去参与到一些比较活跃的开源项目中。我买了一本中文版本的 Rust 书,但是感觉没耐心看完。

对于大部分开发任务,我们没有必要掌握一门编程语言的所有细节。好办法是花尽量少的时间去掌握日常开发所需要的 80%,而不是花 80 % 时间去掌握平时比较少见的 20%。我觉得对于 Rust 来说,20% 包括宏、Unsafe,还有一些复杂的 Pointer、Pin 之类的东西,这些需要了解的时候再去看看就行。

前几天看到 geekplux 写的我是如何学会编程的 有类似的概括:

编程只是一个工具,学习一门技术的时候要快速掌握其最核心的部分,抛弃细枝末节,直接动手实现目标,中途遇到不会的再 Google 即可。这样才是高效快速的学习方式。

学会这个思维的好处是,我后来学什么都特别快,自我总结出一套学习方法。但坏处是知识点掌握的不牢靠,很多细节需要现学现卖,这在日常编程中好像没什么影响,随手 Google 随手写,但面试就很差了,毕竟面试是通过考察细碎的知识点来衡量你的知识面(我不苟同这个面试方式,但确实是现在最流行的)。

学习新东西从来不是线性的,所以如果你看别人给出一个最佳的学习路径,比如看完某本书,然后再看另外一本更深入的,然后再买个什么课….

这种路线也许可以参考,但也别太当真,学会了的标准肯定是能拿来应用。我认为绝大部分书没有官方的文档更有价值,大部分课程还没有直接在开源项目中实践更有效。

所以我建议不管是新手还是老鸟,要学一门新技术就去看官方文档,然后自己试着做些小项目,如果还想继续深入就做一些更大的项目,或是参与到开源项目中去。

通常是技术不难学,但是领域知识比较难学,因为要实践某些领域知识需要相关环境和工作内容。


2022 我打算好好学一下 JavaScript 😉

公号同步更新,欢迎关注👻
Tags: 编程