November 08, 2019

我的技术断离舍

在工作了一年多后,脑子里面满是想离职的事情。在此之前,我还在持续构思这一年多学习到内容的总结,然后品了品,这一年内,为了柴米油盐持续奔波,并没有留下过多的时间来学习新的技术,反而相比于刚刚毕业的那个时候,这时的我忘记的知识远远多于我学习到的。

然而又尽力过一段时间的沉思,我才意识到这可能并不是一件坏事,反而让我可以更好地学习下去。

别让你练手的项目成为前进的阻碍

大学阶段和刚工作时,我对造轮子有种极致的疯狂,面对各种奇奇怪怪的需求,我都希望通过自己的努力把它实现出来。我十分同意这确实很锻炼人。

为了研究 web 框架的原理,花了很大的精力看完了 flask tornado sanic 的 源码,自己造了一个 nougat 出来。看了 fastAPI 和 OpenAPI,写了一个能自动生成 swagger 信息的 flask 路由插件。为了不想用别人的 inline translator,自己写了一个极简的 Chrome 插件。为了管理 GitHub star,写了一个 Chrome 插件。等等这样的点子实在是太多太多了。

为了造轮子,同时找不到一样跟我有空又对这些项目感兴趣的前端劳动力,我于是决定学习前端。为此,我学了 React、Redux、Mbox 等这些现代的前端框架,又去折腾了 PWA,甚至还学了 React-Native 只是为了想把这些想法迁移到 IOS 或者安卓上。

这些经历看着属实很奇妙也很有意思,然而在此之后随之而来的便是各种维护噩梦。

WEB 框架 nougat 有人尝试使用了,也给了很多诸如「为什么你这个框架没有 CLI 控制能力」、「为什么别的框架写某某功能很舒服,然而你这个就那么难受」。于是我踏上了一条「重构-修BUG」的恶性循环之路,为了实现这些功能或者修复某个缺陷,导致了我需要花大量的时间投入在上面,甚者为了修复某些BUG需要把整个框架重构大部分。这显然不是我希望看到的,这个框架不是为了让别人使用而出现的,而是我的一个熟悉底层的过程。

这样占用大量时间的维护工作占用了我大量的业余学习时间。于是我做了一个很大的改变「我做的项目只为了解决我自己的需求」,在这样的前提下,我拒掉了大量的维护工作,让我可以更加轻松地投入到那些我不懂而又十分感兴趣的领域。

技术的世界里没有「银弹」

要时刻在脑子里面保留着一个概念就是「银弹不可能有。如果有,那你肯定被骗了」。

在大学后半段开始,我做了一个赌我以后职业之旅的决定「我要以 Rust 为我的主导编程语言」。现在看来,Rust 确实在慢慢火起来。但是当时的我,或者说是从开始工作没多久,我对 Rust 有种莫名的崇拜和狂热,希望什么都用 Rust 来实现,无论是能用 shell 实现的脚本,还是用根本还没成熟的 WASM 来写网页前端。

Rust 确实很强大,这点毋庸置疑。能做与擅长,是两件截然不同的事情。我就是把这两件事情混在了一起。为了用 WASM 写前端,我看了很多所谓的框架,实际上都是一个很简单的雏型。花了几十倍的消耗终于写出了一个性能提升无关的前端。

看似很有成就感的事情,仔细思考下来实则不然。写了那么多都还只是停留在调用他人框架的阶段,并没有真正地去了解框架的构造和执行原理,甚至没有去了解 WASM 的原理。相比于写逻辑,后者的知识才是更加值得研究的。

在意识到了这点之后,我慢慢的形成了语言只是一种工具,在合适的场景使用合适的语言才是一个成熟的表现。相比于用 Rust 来写机器学习,这种看着就不可能的事情其实很容易分辨,难就难在那些两者都表现出「我可以」的场景下。

快速成型、脚本工作就使用 Python;CLI 解析、网络代理处理等就用 Rust;网页前端使用 React。

银弹可能不存在,但是一把装满了不同「银弹」的手枪是可能存在的。

多刷文档,别重复工作

当擅长一门技术之后,就很容易成迷其中,希望写出很多所谓的作品出来表现自己,殊不知其实这些作品都只是表现出你单独一门技术的能力。

这段时间我就是陷入了这样的困境中,因为自己是擅长 WEB 方向的,同时在熟练使用 actix 之后,脑子里面都是做些什么作品出来。左想右想确实想出了很多,不少也事件出来了,但是都是基于 actix 这个 web 框架的,而且大部分工作都是在「写数据库模型 - CURD」的循环中。

看似做出了很多有意思的项目,实际上是「业务」,那些东西并没有脱离出那一个特定的技术。

同时长时间在业务层工作,会形成一种「知其然,不知其所以然」的困境。比如现在我都没搞太懂 actix 到底是怎么跑的,为什么他能做到碾压性的性能压制。

在这时,我才意识到了自己在底层认知的缺陷。长时间活跃在业务层,缺少了对实现层的了解。为此,如上述所说,我放弃维护了大部分的项目,把这些时间投入到了 RFC 等文档的阅读中。特别是在 Rust 领域里面,单纯的写 Rust 代码 和阅读 Rust RFC 的发展、参与对某个实现的讨论的感觉是完全不一样的。这也让我了解到了更多 PL 领域的内容。

同时在深入了解底层知识后,才深刻体会到语言只是一种工具的感觉。在工作之前,我都以 Python 和 Rust 为主,然而工作确实以 Java 为主,在没有过多的 Java 基础下,通过对底层抽象的了解,可以在工作中不至于出现什么问题。

在抛弃掉大量相似的项目后,反而有了更多的时间去了解其他领域的知识,这无论是在深度和广度都十分有用。