Skip to content

Commit

Permalink
update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
k27dong committed Apr 2, 2024
1 parent 9344c97 commit 723b308
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 19 deletions.
29 changes: 10 additions & 19 deletions docs/blog/2018.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,23 @@ title: 2018
abbrlink: 62747
date: 2018-12-31 00:00:00
---
# 用Rust重写了后端

## 1
在十二点钟声敲醒时,我正在北美大陆上空的云层上,透过飞机的玻璃看着被黑夜淹没的星空。机舱里一片安静,大部分乘客已经入睡,只有几个人还对着屏幕,电影画面将他们的脸庞晃的忽明忽暗。过去的十天是一个炎热的圣诞节,我吹过加勒比海岸的暖风,也曾经把全部头发浸入大西洋温暖的海水中。在狭小的船舱中摇摇晃晃的过了一周,如今终于要飞回家中。几个小时前,我在迈阿密的机场接到了飞机晚点的消息,我们对此无能为力,只能接受要在天上跨年的现实。

大二的时候我在一家银行实习,当时组内正在用Flask写后端,我在工作学习之余也用这个框架搭了我的个人网站,因为我也不会别的。网站本身非常简单,SPA + REST,前端从后端要东西,后端返回之后再渲染出来,整个过程没什么效率和内存方面的顾虑,所以拿Python写似乎正好合适
每年的这个时候,一个人总是会习惯性地回顾过去,想想在过去的一年中所发生的事情。也总是到了这个时候,我们才会发现在过去的一年中浪费了多少时间。曾经的理想没有勇气实现,过去的誓言也在重压之下无影无踪,不再提起。时光就这样顺着指尖溜走了。高中毕业以后,总觉得时间过的越来越快。大学的入学仪式仿佛还是前几周的事情,转眼间一个学期已经结束了;写简历时抓耳挠腮的感觉好像还停留在昨天,然而今天已经开始工作了。2019这个数字在脑海里是如此陌生,在填表的时候常常写错年份,来来回回打印了好几遍才上交。然而表格可以反复填写,错过的事情却再也没有机会挽留了。从理性上分析,这似乎是一件很残忍的事情,而我们却在成长的过程中却早已默认了这个事实——错过了就错过了,大过年的,不必为此忧心忡忡:“我还年轻,我还年轻”。我们躲在励志口号和激烈诗词的掩盖下,试图让自己相信美好的明天即将来临,然而在这些借口下面隐藏着的是空虚和犬儒,是被自己年轻的生命所掩盖的无能的本质

代码撸得很快,相比于其他语言,Python里面每一行都甜得像一颗语法糖,各种内置函数比如zip和连锁比较让我有一种在写Markdown的感觉。前端用React写完之后,后端写了几天就上线了,接下来几年时间在里面小修小补,加了一些别的endpoint,然后就一直安安稳稳的运行到现在。然而运行起来虽然没问题,但是写起来抱怨还是有的,主要来说是这几个:
王小波曾经说过:人的一切痛苦,都是对自己无能的愤怒。前几年,我每天都很愤怒。不知道自己为什么而活,更不知道自己为谁而活。我发现自己所做的一切全无意义,不会对周围的事物产生任何变化。我不喜欢我生活的城市,我不喜欢我的生活方式,我不认同比我年龄大的人,我看不起比我小的人。而凌驾于这些感情之上的是我对自己的痛恨。我无法改变现状,只能随波逐流。面对向我迎面而来的浪潮,无法迎头而上,却又避无可避。我尝试从更加宏观的角度去思考这些问题,得到的答案却更加悲观。我感觉自己像一个对着大海发脾气的孩子,偶尔激起的几层浪花也只会消失在水里。在我的世界里,天空不动,河水向前,对答案的寻找越来越虚弱。我不是没有为改变而努力过,但一切努力似乎没有意义。经历了相遇和告别,我还是像一块石头滚来滚去。

1. 部署困难。代码很快就写好了,但是真正部署到云服务器上的时候,虽然一开始可能没什么问题,但是时间长了gevent,flask,python本体,wsgi之间总有几个版本互相不兼容。然而解决这个冲突又没有什么很好的解决办法,只能反复来回实验。
2. 代码质量容易下降。一开始一切都很简洁,加上是弱类型语言,随便一个什么变量定义一下就可以拿来用,但是时间久了这些简洁的短代码都会变成后续维护的障碍。(后来在3.5中,官方加入了typing模块,这个我觉得相当舒服)。
3. Python2和Python3互不兼容。现在似乎一切都是py3,也就没有这个问题了。但是最早开始写代码的时候py2还没有完全被淘汰。我的mac内置了Python2,于是我只好单独去安装Python3,然而各种配置设置起来相当麻烦,还需要专门看教程才能正确的配置好环境。
4. 作为跨平台语言,在不同os下适应的并不是很好。我一开始只有一台mac,服务器上面选择了linux,然后过了两年自己装机换了windows,三个系统一起捣乱,不知道什么时候就会看到奇怪的报错,只能说这波跨的不是很平台。
5. pip,哪怕有virtualenv协助,依旧是一个逆天的包管理器。node_modules已经被黑成碳了,但是pip的安装逻辑和依赖地狱也不遑多让。加上python松散自由的社区,很多package完全没有完整的文档支撑。
这就是2018年初时我所面对的状况。在过去的十二个月里发生了很多事情,有些很快就过去了,有些却怎么也无法忘记,这些无法忘记的事情便永远不会忘记。正式从高中毕业,告别了最后的温柔乡,我冲到了久违的自由当中。不仅仅是因为再没有作业和课堂,更因为我终于有机会来亲自动手决定我的去处——不再是家和学校之间单调的两点一线。几周之后,我回归了祖国炎热的怀抱。从爸妈那里拿了一点钱后,为了想清楚一些问题,我动身去了朝鲜,在丹东边境线彻底与一切失去了联系。回来之后又去了洛阳和西安,花了一晚爬了华山。站在云端,朝阳照在每个人的脸上,我发觉自己离真正的终点还有很长的距离。可下山的路上,我已经打定了主意。一天之后,我出现在了西宁的火车站,又过了几天,我租车去了青海湖。一路上,我穿梭在两片大山之间,天上的云一会离我很近,一会遥远。再后来的时候,我站在无限金黄的油菜花地里,感到了一种久违的解脱感。离我不远的青海湖是泥土流出的泪水。偶尔能看到马,他们的鼻子呼出暖气,嘴沉入湖面中饮水食盐。两年来,我经常梦想自己站在青海湖边,而现在我真的做到了。当天晚上,我住在全世界的夜晚或某个不知名客栈中,背靠殷实的大地,面朝冰冷的天空,回家的时候到了。

至于速度和多线程这两个被大多数人黑的主要问题,因为使用场景的原因我倒没有什么感受。网站上线了三四年,最早写的代码现在来看已经非常烂,很多逻辑都拧巴在一起,也完全没有任何的顺序和报错机制。在代码前后都是问题的情况下,小修小改似乎很难一口气解决所有根本问题,不能再犹豫了,一定要出重拳!于是趁着放假就决定干脆整个重写了事
引擎声拖动整片草原,我顺着国道越开越远。先是西宁,然后是定西,再后来的一串地名我已经忘记。几天后,我又回到了北京西站,再一次在一团昏暗的热泽中穿行。后面的事情范善可陈,总之好像是一转眼,我就回到了冰天雪地之中,又回到了学生们中。压力接踵而至,我在生活的缝隙里试图寻找喘息的空间。被课本和公式轰炸一通,最开始的锐气慢慢消减,但我已经不会陷入痛苦。因为在北京,在西安,在洛阳,在青海湖畔,华山绝顶,多年未见的邻居门口,朝鲜农民深陷的眼窝,在每一株小麦和每一滴海水里,我似乎找到了答案。我仿佛很老了,又好像很年轻;我仿佛拥有了一切,又好像一无所有。踌躇仿佛已经停止了,又好像尚未到来。青春仿佛已经结束了,又好像刚刚开始

语言选择了Rust,因为我不会Rust,而且它的一些新机制看着也很有趣。选择了一个看着还比较轻量级的后端框架[Actix Web](https://actix.rs/),学习了一下语言特性,然后就是动手一点点把每个endpoint迁移过来。Rust的代码明显比Python麻烦一些,多了一些关键词和符号,而且并不像Python一样在很多逻辑细节上显得理所应当,反而是违背直觉的。这些限制强迫我在写代码的时候去用电脑的方式思考,从向CPU索取一块内存开始,到这块内存被重新释放出去结束,而不是想到哪里写到哪里。我认为这种脚铐对于我这种菜鸟来说是有益的
脱离苦海之后,我逃离了现场。来到了迈阿密,虽然一切过往离我而去,朋友们离我越来越远,但大海会给予每个人足够的宁静。在甲板上,我看到的景象和过去一亿三千万年中每一双眼睛在此所看到的一样。我在西印度群岛以北的海面上绕了一圈,发现临近赤道时,一片叶子也可以长满魔力

## 2
这是即将过去的这一年的尾声,绝对算得上完满。完满到上飞机的时候,我还难以想象今年的尽头是如此突兀。飞机起飞,手机关机。我闭上双眼,却难以入睡。18岁是我的黄金时代,可周围的世界却在飞速地旋转,一切格局都在越来越大。以前不懂的,现在不得不面对事实;以前了解的,现在却全然不懂。市场也在洗牌,每一把玩得越来越快。父辈们在中国二线城市写字楼中所积累的改革开放时期生存指南到现在已经无法使用,无论是学术圈还是娱乐圈都在准备迎接二十一世纪的百家争鸣,所有大骗子和假和尚,连同农贸市场如今全无踪迹,新来的事物却又无穷无尽。然而无论在什么时候,总有一些事情是无法改变的,我们所要做的就是尽量远离那些随潮涌来的浮叶,那些快餐式的,用完而弃的快乐和悲伤,而去拥抱那些真实的,具有实体的品质。

写了一小段时间的Rust,说一下自己的感受:
话又说回来,假期结束之后,还是要脚踏实地的做一些东西。在船上没什么事情,看了很多书。有一些是技术方面的,大部分是小说和书信。我觉得以后会写一些感想的,可现在暂时还没有。最要紧的是学业方面的事情。学术上的学习告一段落,但是平时还是要以自学为主,因为马上要开始四个月的实习了。重心肯定还是要放在技术方面。虽然编程考的还行,可也只是因为我有一些很小的基础而已,要发展自己的能力还需要长久的摸索。自己生活是另外一个挑战,衣食住行都要考虑。这是我第一次彻底独自生活,以前无论是夏令营,还是大学的宿舍,总能得到来自家人的帮助。然而再过一周,我就要去一个离家300多公里的小城去生活了。人口不足五千,紧挨着圣劳伦斯河,气温寒冷,离最近的金士顿也要有30多公里的距离。离群索居,与世隔绝。听起来挺惨的,不过我倒是很向往这种生活,因为可以静下心来做一些事情了。

1. 官方撰写的[”The Book”](https://doc.rust-lang.org/book/)内容相当丰富,并且有完整的翻译和代码片段。虽然对于完全的初学者来说似乎会比较难,但是应该也没有人会拿Rust来入门写代码,很适合有了一点别的语言上的经验后再来看。
2. 有了其他编程语言的前车之鉴,Rust团队在语言诞生之初就在工具链上下了很大功夫。无论是rustc还是cargo都能看得出从别的语言上借鉴的地方,但是都比较好的解决了一些前辈们的历史遗留问题。当一个社区已经发展到一定规模,再想推出一款放之四海皆准的标准工具是相当困难的(君不见npm, yarn, pnpm, bun之事乎)。
3. Rust引入了所有权机制来处理垃圾回收,虽然类似的手法在C++ RAII中已经出现了,而且思路基本一致,但是这毕竟也只是一个可以选择的设计模式,加上C++的历史,也只能是一个可供选择的模式,不能强加给用户,而Rust作为新生语言做起来就没有这种顾虑。在以往的语言中,GC的处理基本分为两种:一种是自动GC,比如java,js,或者python。用户不需要去处理分配出去的内存,因为这些编译器都会帮你处理好;另外一种是手动GC,比如C++,用户手动调用一块内存出来(malloc),用完了再手动释放掉。而在Rust(以及RAII)中,每一块内存都被制定了一个所有者,当所有者超出范围的时候,其所拥有的内存会被自动释放掉。以往的手动回收需要用户去考虑什么时候释放内存,而Rust中因为每一块内存从语法上被保证了一定会被释放掉,所以用户需要去考虑的是什么时候不释放内存,而这一点需要通过所有权转移以及生命周期控制完成。
4. 编译器的提示以及报错机制太强大了,有一种被老师手把手上课的感觉。让我短暂地忘记了`Segmentation fault (core dumped)`
5.`Option`完全代替了`Null``null`这个东西在任何语言里处理起来都很麻烦,经常会在毫无防备的时候被这个值搞一手。Rust把可能为Null的数值都分为了Some(val)和None,虽然逻辑比较奇怪,而且要不停地在代码里unwrap,但是总体上来说还是让代码更加严谨。
用这样的方式来结束2018,实在有些意想不到。文章也不知不觉写得很长。从高中的结束到大学的开始,一口气说了很多东西。虽然大体上还是无可避免的沦为流水账,不过好歹是对过去有了个交代。那个惊心动魄的夏天已经过去很久,现在正值严冬。可推开窗户,那时的阳光依旧洒在我的书桌上。

总而言之,Rust作为一名新生的语言,完全没有大多数流行语言身上沉重的历史包袱,可以在设计上取各家之长,然而总体上又没有过于激进的设计。学习过程虽然对新手不太友好,也暂时很难想象我会用这个语言去做一些大的项目,但是
太阳看起来圆圆的。
Loading

0 comments on commit 723b308

Please sign in to comment.