Local Native 2021 SoC 总结 Blog

说起来这是我的公开的第二个Rust项目,第一个还是去年大四上学期和朋友一起做的Bevy游戏项目(我们还有一个项目正在做,但是因为我最近实在是太忙了,所以没有参与进去,感兴趣的可以参与一下:https://github.com/rgripper/village-sim )。我很感谢这两次机会,让我有足够的时间和精力去深入对Rust的学习和了解。这次总结,将会从三个方面来概述。

iced和Rust

Local Native的跨平台桌面端使用的是iced来写的,iced很好用,概念抽象的很简单,如果你习惯上了iced的各种抽象,你会感受到Rust作为高级语言来写的快感。同时官方社区也很有爱,有各种问题提了issue或者去官方的群里问,很快就会有回复。

但是现阶段的iced并不完美,仍然有很多缺陷,比如没有动画支持,没有富文本支持,没有官方的多语言支持,以及各种控件太少了,这些都是官方正在竭力去补全的,特别是它还选用了wgpu作为渲染后端,我相信在不远的将来,它会是一个很好的简易跨平台应用解决方案(style还是太难写了,如果有热重载和对style进行重构,iced会更强大)。

而iced使用的语言就是Rust,说到Rust,很想分享一下自己的学习经历。2018年初的时候,我只会python,而且还是超级菜的那种。那个时候听到不少言论,说除了python以外应该再学两门编程语言,一门足够底层,一门足够工业,前者我在知乎被各种帖子的鼓吹后(特别是Rust编程之道的作者,张老师),选择了Rust,后者因为学校的课程中就包含了C#和Java,所以没有特意的去学习。

刚开始接触Rust的时候:“呀,这些概念,好严谨,好透彻,完全能够从Rust里感受到各种设计的因果关系,实在太强了!”(可能是我其他语言接触的太少的原因,只会python的我被Rust深深吸引了)。

随着深入的学习了解,开始着手各种项目练手的时候,被编译器各种教做人:“生命期怎么这么难呀,范型、trait限定的写法好吓人呀,异步状态机的什么鬼,所有权咋这么难用!”这个阶段持续时间有长有短,每一个问题都能单独拿出来说,每次将这些困惑的问题解决掉,消化掉的时候,会从中汲取极大的满足感。我的建议是,多看几家的文档,教程,找出合适的自己的,多和群友交流沟通,一定有让你满意的答案。

现在的阶段,代码写起来很顺畅,编译通过很安心,逐渐的反而会去想为啥这种错误编译器没有报错之类的事了(写这个项目的时候,有用到as,不少地方出现了溢出的问题,所以如果习惯了被Rust编译器保护,突然来这么一下,感受还是挺奇妙的)。

Local Native

这次的项目我负责的是整个跨平台的前端开发,同时负责后端依赖更新到最新版本,保证后端功能正常。项目的架构比较常见,是通过json-rpc的方式在前后端进行数据交换,前端的开发在熟悉iced之后,进展还是很快的。整个过程有充足的时间让我学习和了解iced,以及深入Rust,也因此,整个项目实际上是进行了一个较大的重构,重构之后的代码更简洁,性能上也更好了。

重构的过程中找到了比之前更好的实现方法,以及各种更优雅的写法,最熟练的还是对迭代器的使用吧,长时间的各种对迭代器的使用,已经完全被这种方式给套牢了,好用确实是真的好用。

也因为有考虑过上架苹果的AppStore和微软商店,所以做了打包,打包过程比较容易,这得多亏了tauri团队对Rust社区的贡献,再次感谢!

比较麻烦的是和浏览器扩展做初始化吧,几乎有两周的时间在弄这个,虽然这期间有其他事耽误了一下,但因为多个平台的多个浏览器不一致,这部分还是写的比较麻烦的。

另外就是后端同步过程中出现的一些问题,调试也听花时间,知道截止发稿,还有个安卓11同步崩溃的问题没解决,这周有空可以搞一下。

个人总结

今年我毕业了,同时现在也找到了一份Rust开发的工作,是做substrate开发的。最近正在看文档之类的,多亏了早年被各种Rust英文教程的轰炸,让我现在看substrate文档没多大压力。

我很感谢这次的实习机会,因为如果没有这次的机会的话,我不一定能找到编程相关的工作。我本科是学化工的,做毕设期间老师也劝我找份化工的工作,说去厂里时间很充裕,足够我去研究编程之类的东西,不过最后还是没去,最大的原因还是这份实习吧,我想着如果能把这部分工作做好的话,找份Rust工作,应该还是可以的。

在之前项目快结尾时,我们Local Native团队参加了Dweb社区举办的项目分享活动,也是那个时候认识了现在的leader,经过交流之后加入了团队。团队对我最大的诱惑是leader对开源项目的态度吧,leader很鼓励我平时多参加开源社区,如果不出意外的话,在substarte开发能稳定进行之后,bevy之类项目会再搞起来。

说点牢骚话,此前在群里看到群友发的一句话,说有些人代码出道即屎山。一不小心就把自己带入进去了。抛开我Bevy的项目不谈,那个是和朋友一起写的,那个时候确实很菜,同时当时Bevy真的资料很少,所以这个就不深究了。这次的项目,现在的版本其实重构了一次的,在之前还有个从demo写过来的版本,重构过程很美好,此前的很多写法确实可以用屎山形容,最终呈现出来的代码还算满意,但有些地方还是没有处理好,比如绘制日期过滤器,交互上还可以加强,视觉上也是;比如主题风格,对颜色把握确实不够,还需要再好好调整。最终的教程,就是在这样的情况下写出来的,所以听到这样的话的时候,心里还是蛮愧疚的,不过,这些在未来都会被尽可能的解决,所有的教程及代码,都会维护到iced出1.0版本,至少会有个三到四年时间吧,对教程有各种需要改进的都可以提issue,或者给我发邮件:cupnfish AT icloud.com

关于cupnfish,这是一个很中国的名字,杯多鱼,类似的还可以cup1egg,cup2dog如果以后我真用bevy做自己的游戏项目了,这些就当作隐藏彩蛋吧。