当我2015年开始学习Rust的时候,我绝对没有想过要写一本Rust编程的书。

缘起

当时我刚刚翻译完《Ruby原理剖析》一书,开始对底层开发产生了一点点兴趣。从2006年入行以来,我就一直和动态语言打交道。虽然自己也想学习底层开发,但能选择的语言几乎只有 C++。我在学校里浅浅地学过 C++这门语言,也许是第一印象作怪,总难以提起对C++的兴趣。

当Rust 1.0发布时,我去官方网站了解了一下Rust语言,发现它的主要特点有以下几方面:

· 系统级语言

· 无GC

· 基于LLVM

· 内存安全

· 强类型+静态类型

· 混合编程范式

· 零成本抽象

· 线程安全

我一下子就被这些鲜明的特性“击中”了,从此开始了Rust的学习。

再一次爱上编程

第一次爱上编程是在上小学时。父亲给我买回来一台金字塔学习机,这台学习机有两种功能,一种是学习Logo语言,另一种是玩卡带游戏。编写Logo语言就是用小海龟画图,也许是因为太早了,也许是因为没有人引导,那时的我选择了痛快地玩游戏。总想着先玩游戏,再去学怎么编程,然后还幻想着能不能用 Logo 语言编写一个游戏。其实这时候的我对编程更多的是一种憧憬,并没有在学习编程上付出更多的实际行动。

第二次爱上编程是在大学初次学习C语言的时候。我本可以选择计算机科学专业,但是最后还是选了电子信息科学与技术专业。这样选是因为我想把软硬件都学了。想法是好的,可惜实施起来并不容易。最后的结果就是,软硬件都没学好。

第三次爱上编程是在遇到Ruby语言的时候。当时我在用Java,并且已经完全陷入了Java语言和Web框架纷繁复杂的细节中,痛苦不堪。Ruby on Rails框架的横空出世,把我从这种状态中解救了出来。Ruby语言的优雅和自由,以及“让程序员更快乐”的口号深深地吸引了我。这一次我是真正爱上了编程,并且积极付诸行动去学习和提升自己。此时也恰逢互联网创业大潮的开始,Ruby语言的开发效率让它迅速成为创业公司的宠儿,因此,我也借着Ruby这门语言参与到了这股创业洪流中。

第四次爱上编程是在遇到Rust的时候。此时,创业洪流已经退潮。技术圈有句话,叫“十年一轮回”。当年喜欢Ruby给开发过程带来的快乐,但是随着时代的变革和业务规模的增长,我不禁开始重新思考一个问题:何谓快乐?真正的快乐不仅仅是写代码时的“酸爽”,更应该是代码部署到生产环境之后的“安稳”。Rust恰恰可以给我带来这种“双重快乐”体验。

为什么是Rust

社区中有人模仿阿西莫夫的机器人三大定律,总结了程序的三大定律[1]

· 程序必须正确。

· 程序必须可维护,但不能违反第一条定律。

· 程序必须高效,但不能违反前两条定律。

程序的正确性,一方面可以理解为该程序满足了实际的问题需求,另一方面是指满足了它自身的程序规约。那么如何保证程序的正确性呢?首先,可以通过对程序的各种测试、断言和错误处理机制,来保证其满足实际的问题需求。其次,在数学和计算机科学已经融合的今天,通过较为成熟的类型理论即可保证程序自身的规约正确。

以我最熟悉的 Ruby 语言为例,程序的正确性必须依赖于开发者的水平,并需要大量的测试代码来保证正确性。即便在100%测试覆盖率的条件下,也经常会遇到NilError之类的空指针问题。也就是说,Ruby程序自身的正确性还没有得到保证。以此类推,C、C++、Python、Java、JavaScript等语言都有同样的问题。

而函数式编程语言在这方面要好很多,尤其是号称纯函数式的 Haskell 语言,它具有融合了范畴理论的类型系统,利用了范畴理论自身的代数性质和定律保证了程序自身的正确性。然而,Haskell也有比较明显的缺点,比如它不满足上述第三条定律,运行效率不高。

反观Rust语言,对程序的三定律支持得恰到好处。它借鉴了Haskell的类型系统,保证了程序的正确性。但还不止于此,在类型系统的基础上,Rust借鉴了现代C++的内存管理机制,建立了所有权系统。不仅保证了类型安全,还保证了内存安全。同时,也解决了多线程并发编程中的数据竞争问题,默认线程安全。再来看代码的可维护性,Rust代码的可读性和抽象能力都是一流的。不仅拥有高的开发效率,还拥有可以和C/C++媲美的性能。当然,没有银弹,但Rust就是我目前想要的语言。

目前Rust被陆续应用在区块链、游戏、WebAssembly技术、机器学习、分布式数据库、网络服务基础设施、Web框架、操作系统和嵌入式等领域。时代在变化,未来的互联网需要的是安全和性能并重的语言,Rust必然会在其中大放异彩。

学习Rust带来了什么收获

Rust是一门现代化的语言,融合了多种语言特性,而且Rust语言可以应用的领域范围非常广泛。在学习Rust的过程中,我发现自己的编程能力在很多方面存在短板。突破这些短板的过程实际上就是一次自我提升的过程。

Rust 是一门成长中的新语言,学习 Rust,跟随 Rust 一起成长,可以体验并参与到一门真正工业化语言的发展进程中,感觉就像在创造历史。虽然我并未给Rust语言提交过PR,但也为Rust语言和社区多次提交过Bug,以及文档和工具的改进意见。

Rust自身作为一个开源项目,算得上是开源社区中的“明星”项目了。学习Rust的过程加深了我对开源社区的认识,也开拓了我的眼界。

为什么要写这本书

在学习Rust一年之后,我写下了《如何学习一门新语言》一文,其中记录了我学习Rust的心得,这篇文章颇受好评。也正因为这篇文章,电子工业出版社的刘恩惠编辑找到了我,并询问是否可以出一本Rust编程的书籍。我当时也正想通过一本书来完整地表达自己的学习心得,再加上中文社区中没有较全面系统的Rust书籍,于是,一拍即合。

写书的过程可以形容为痛并快乐着。Rust语言正值成长期,很多语言特性还在不断地完善。举一个极端的例子,比如写下某段代码示例并成功编译后,过了三天却发现它无法编译通过了。于是,我再一次跟进Rust的RFC、源码、ChangeLog去看它们的变更情况,然后再重新修订代码示例。这个过程虽然痛苦,但改完之后会发现Rust的这个改进确实是有必要的。在这个过程中,我看到了Rust的成长,以及Rust团队为保证语言一致性和开发者的开发体验所付出的努力,让我感觉自己花再多时间和精力去修改本书的内容都是值得的。

话说回来,任何人做事都是有动机或目的的,我也不例外。我写这本书的目的主要有以下三个。

· 为Rust中文社区带来一本真正可以全面系统地学习Rust的书。

· 以教为学。在写作的过程中,让自己所学的知识进一步内化。

· 传播一种自学方法。本书内容以Rust语言的设计哲学为出发点,按照从整体到细节的思路逐个阐述每个语言特性,希望读者可以产生共鸣。

结语

我自己作为本书的第一位读者,目前对这本书是非常满意的。衷心希望每一位读者都能从本书中收获新知。当然,我也知道不可能让每一位读者都满意。在我看来,写书不仅是在传播知识和思想,更是一种交流和沟通。所以,当你不满意的时候,可以来找我交流,提出更多建设性意见,帮助我成长。我争取在写下一本书的时候,让更多的人满意。而且,如果你的建议确实中肯,让我得到了成长,我也为你准备了不错的小礼物。


[1] https://medium.com/@schemouil/rust-and-the-three-laws-of-informatics-4324062b322b