gitbook/陈天 · Rust 编程第一课/docs/482856.md
2022-09-03 22:05:03 +08:00

10 KiB
Raw Permalink Blame History

特别策划|学习锦囊(一):听听课代表们怎么说

你好,我是专栏编辑叶芊。

马上要过年了先预祝你新年快乐毕竟很多同学可能已经在准备年后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 系统——使用油条哥推出的poemtauri结合陈天老师的Rust第一课我开始做 IM在线聊天系统专栏开始有很多例子代码写的很棒我借鉴了很多代码学着学着感觉没那么困难了。不过年底因为工作关系没有继续做下去仍然收获很多
  • 力扣刷题——初级算法+每日一题简单级别重拳出击中等级别努力做完看三叶题解困难级别看三叶题解。因为做链表题有助于Rust所有权、借用、引用、可变借用的理解我再结合陈天老师在专栏中的讲解反复练习。
  • 学到这里,我回头重新做了 rustlings实际花费了不到1天的时间并且还想到了很多举一反三的情况。

从我这段学习经历里,你也可以感受到我在反复入门,身为一名前端工程师,我的挫败感主要来自类型系统、所有权、生命周期等知识点,异步反而是一个优势,很好理解。

学习Rust的前期可能非常不适应会感觉Rust编译器一直在阻碍你编译完成出现各种红色的报错如果不去认真看报错会产生很大的挫败感需要度过一个艰难的磨合期。

但当你熟悉之后会特别希望编译器给你提示让你做的更好因为Rust 编译器会重新教你编程的思考方式围绕着内存安全先将系统设计好而不是编写边设计。这种体验目前也只有Rust 能做到。我们要做的,不是和编译器对抗,而是了解编译器提出的错误以及给出的解决提示

磨合期之后,剩下来的就是超多的基础知识需要掌握,毕竟 Rust 只是一门编程语言,我们最终还是要用它去创造应用。这个部分,学到什么深度,就要看每个人自己的取舍。

对我自己来说JS是弱类型语言在没有其他强类型语言的背景下陈天老师课程中的很多概念理解都需要一定的时间我需要自己补上这方面的知识而不是完全依赖课程本身。但是在课程中有超多相关知识的超链接可以非常方便地补充学习。

寄语

推荐多动手多看错误提示多思考错误场景多了解为什么是这样善用cargo 等Rust工具链的相关工具推荐多使用 Dash 软件查询Rust语言的APIchrome插件 Rust Search Extension 也可以,偶尔你还可以发现新大陆。

期待在新的一年,与你们共同进步,提前祝贺大家新年快乐!


这就是今天两名课代表同学的分享如果你有自己的Rust学习故事欢迎在下方留言区留言互相交流互相映证共同学习共同进步。

第二辑见~