10 KiB
特别策划|学习锦囊(一):听听课代表们怎么说
你好,我是专栏编辑叶芊。
马上要过年了,先预祝你新年快乐!毕竟很多同学可能已经在准备年后Rust的一、二、三……次入门了,多倍快乐正在路上。
因为专栏内容非常丰富,有很多特色的栏目,一直有新同学困惑到底怎么学才能更丝滑地上手:为什么我看了前6讲越看越懵?到底需要什么知识背景才能学Rust,才能学这个专栏?希望能提供专栏的食用手册,或者做相关背景知识整理之类的需求……
为了帮助你在新的一年更好地学习,我特地邀请了几位课代表来分享一下他们学习专栏、学习Rust语言的个人经验和方法,希望能给你一些参考和启发。
@newzai
你好,我是newzai,借这个机会跟你分享一下我的Rust学习过程。在学习Rust之前,我已经有了10年C++开发经验,4年Go开发经验。
我的学习之旅
我是在2019年开始尝试学Rust的,当时国内书籍不多,我也没有购买书籍,只是看官方英文的书籍,发现前面几章节和其他编程语言差异不大,顺着官方安装指南(macos)和代码,边看边敲,基本没有遇到太多障碍。
直到遇到所有权和生命周期,我就基本搞不明白了,后面看到trait也能理解一部分,毕竟和Go 接口或者cpp虚类也有点类似,但是面对trait丰富的功能太抓狂了,实在学不下去,短暂放弃了。
2020年底,距离我第一次学习Rust失败也有一段时间了,由于Go项目遇到一些性能,并发安全等问题,Rust恰好可以解决这方面的不足,所以开始了第二次学习,不过这次主要结合中文书籍和极客时间张汉东的视频课程一起学。
主要以书籍为主,我把当时国内的中文书籍基本都各自从头到尾阅读了1-2遍,《设计 Rust权威指南》《深入浅出Rust》《Rust语言程序设计》《精通Rust(第二版)》(前面几本都是2015版,精通第二版当时比较新是2018版)。恰好《Rust编程之道》这本没看,因为购买了张汉东的视频课程,本着是同一个人出品没必要重复购买和阅读的想法就一直没看。
这么多书看完到21年6月份了。学到这个阶段,很多语法、知识我也基本了解,但是对生命周期以及怎么进行项目实践还是搞不定,特别是涉及多线程对象互相引用的情况,之前研究了个把月也一直没搞不明白。毕竟学以致用是我们学习语言的最终目的。使用自己工作中熟悉的业务,用Rust来实现一遍是最好的方式,可以把自己日常零零散散的知识融会贯通。
因为我从事WebRTC SFU媒体服务器开发,一直在尝试用Rust重写SFU服务器。之前我用Go pion的webrtc库开发了公司的媒体服务器,而pion团队恰好也在用Rust重写Go版本的webrtc库,就一直关注webrtc-rs库beta版本的释放。
直到2021年9月份前后,webrtc rs的第一个0.1.0.0 版本释放了。这个时候正好我已经看完了张汉东的视频课程,也跟着学习陈天的Rust第一课有一段时间了,感觉积累得差不多,就着手自己写SFU服务器。
这个时候我知道不少第三方库了,主要还根据《精通Rust(第二版)》、极客时间张汉东视频课程,以及陈天Rust第一课中的推荐,基本上离不开这些库:tokio、anyhow、async-trait、prost、serde、axum等,如果你想自己用Rust写点什么,也可以重点掌握这些库,当然libs.rs网站也能给到很多其他资源。
我的项目实践过程
SFU服务需要提供WS和HTTP协议的服务能力,因此需要选择一个Web服务器框架。
刚开始根据网上的推荐选择的actix-web,由于它使用的tokio版本比较久,和新tokio库的配合有问题,一开始很多问题都搞不定,各种报错莫名其妙,最后使用RT全局方式自行桥接(定义一个全局的tokio::runtime对象,再actix的handler方法调用,后来知道有个库叫tokio-compat专门干这个事情) ,才把流程给跑起来了。
后来遇到axum后,就切换成了axum。切换也很丝滑,这得益于Rust trait的良好设计,就像陈天第一课中的KV服务的设计演进,替换协议、替换框架的代价都很低。
于是2021国庆期间,在之前累积的基础上,我用了5天的时间,实现了一个基本的SFU服务器,可以使用Janus gateway的H5作为客户端,进行视频会议的通信。虽然离在生产上运行的Go版本的功能还相差很多,但是,已经迈出了最重要的一步,后面就相对轻松多了。
最近大部分功能都已经完成,在做Rust SFU版本和Go SFU版本的性能指标压测,总体上能比Go有20%以上的提升,并发越高,差距越大。
寄语
今天重点分享了我自己学习和应用Rust的经历,我个人觉得,Rust值得我们投入时间去学习,从性能、安全、开发效率等方面,表现都很不错。而且我还发现随着自己对Rust的了解越多,收益越多。当然Rust目前也有一些不足,特别是编译时间、生态方面还比较弱,相信慢慢会改善。
世上没有两片相同的叶子,每个人有每个人自己的学习方法和成长路径,希望我的经验对各位有所帮助。
一门语言,如果只是为了糊口吃饭,学最流行的;如果是为了增长见识,增加自己的思维,可以多学几门,每一门语言基本都有自己的设计哲学,多了解一些,对自己的主力语言的理解使有帮助的,不要进入思维局限。
Rust正在经历Go 2016-2017的发展过程,所以从这个角度看,目前进入Rust的投资学习时机还是比较适合的。
最后学Rust 建议一定要过语法,基础知识全盘过1-2遍,如果和其他语言一样,边学习边练习工程的这种习惯,想直接上手Rust,你可能会崩溃的。
@MILI
你好,我是MILI,很荣幸收到编辑的邀请分享下我的Rust学习经历。我是一名前端全干工程师,工作快5年了,由于工作需要,偶尔全干,偶尔切图,乐于探索、自主学习。
我怎么了解到Rust的,得从几年前说起了,那会我还是前端小菜鸡,想学习一门新的编程语言丰富自己的编程之路,由于JS 是弱类型语言,所以希望学习的编程语言具备:强类型、高性能、安全等特性。
2018年我了解到Rust语言,官方只有一个the book 文档,异步还没有,Boss 直聘上的岗位也只有字节和为数不多的区块链,半个巴掌可以数完。经过这几年的飞速发展,现在 Rust 成立了基金会,在各个领域开花,有的领域已经结果了,尤其是前端,在更多地采用Rust改进工具链。
我如何学习Rust
初期Rust学习资料稀少,后来遇到了汉东老师的书和视频,到现在陈天老师的课程,现在网上Rust 的学习资料也越来越丰富。这里我也分享一下自己学习Rust的过程。
- 阅读 the book——看懂了,手没懂;
- 阅读汉东老师的书和视频——很全,后来为了方便还特地买了电子版,在持续学习中(电子版还会更新修订);
- 练手rustlings,小练习 可以让你习惯阅读和编写Rust代码——受打击,难受,做不动啊;
- 练手exercism,编程语言在线学习网站,里面的导师都很棒,而且是免费的给你编程指导,收益良多——在线学习网站,通关了基础部分;
- 刷题codewars,刷题网站,类似LeetCode——用Rust 语言升到了 5 KYU;
- 实战IM 系统——使用油条哥推出的poem和tauri,结合陈天老师的Rust第一课,我开始做 IM在线聊天系统,专栏开始有很多例子,代码写的很棒,我借鉴了很多代码,学着学着感觉没那么困难了。不过年底因为工作关系,没有继续做下去,仍然收获很多;
- 力扣刷题——初级算法+每日一题,简单级别重拳出击;中等级别努力做完,看三叶题解;困难级别,看三叶题解。因为做链表题,有助于Rust所有权、借用、引用、可变借用的理解,我再结合陈天老师在专栏中的讲解反复练习。
- 学到这里,我回头重新做了 rustlings,实际花费了不到1天的时间,并且还想到了很多举一反三的情况。
从我这段学习经历里,你也可以感受到我在反复入门,身为一名前端工程师,我的挫败感主要来自类型系统、所有权、生命周期等知识点,异步反而是一个优势,很好理解。
学习Rust的前期,可能非常不适应,会感觉Rust编译器一直在阻碍你编译完成,出现各种红色的报错,如果不去认真看报错会产生很大的挫败感,需要度过一个艰难的磨合期。
但当你熟悉之后,会特别希望编译器给你提示让你做的更好,因为Rust 编译器会重新教你编程的思考方式,围绕着内存安全,先将系统设计好,而不是编写边设计。这种体验目前也只有Rust 能做到。我们要做的,不是和编译器对抗,而是了解编译器提出的错误以及给出的解决提示。
磨合期之后,剩下来的就是超多的基础知识需要掌握,毕竟 Rust 只是一门编程语言,我们最终还是要用它去创造应用。这个部分,学到什么深度,就要看每个人自己的取舍。
对我自己来说,JS是弱类型语言,在没有其他强类型语言的背景下,陈天老师课程中的很多概念,理解都需要一定的时间,我需要自己补上这方面的知识,而不是完全依赖课程本身。但是在课程中有超多相关知识的超链接,可以非常方便地补充学习。
寄语
推荐多动手,多看错误提示,多思考错误场景,多了解为什么是这样,善用cargo 等Rust工具链的相关工具;推荐多使用 Dash 软件查询Rust语言的API,chrome插件 Rust Search Extension 也可以,偶尔你还可以发现新大陆。
期待在新的一年,与你们共同进步,提前祝贺大家新年快乐!
这就是今天两名课代表同学的分享,如果你有自己的Rust学习故事,欢迎在下方留言区留言互相交流,互相映证,共同学习,共同进步。
第二辑见~