技术文章
聊聊我转岗开发这三年的技术探索与实践
坐标上海,租房在公司附近,每天走路十分钟就能到工位,这大概是我这几年做过最正确的决定之一。自从三年前从测试岗转到开发,我的日常就从天天“找茬”变成了“造轮子”和“填坑”。平时写代码主力机是MacBook Pro,丝滑的终端和触控板让我欲罢不能,也就只有在需要跑Windows兼容性测试,或者排查一些诡异的客户端崩溃时,才会捏着鼻子打开Parallels Desktop里的Win10虚拟机,瞬间被那卡顿感拉回现实。
最近业余时间一直在死磕Rust,那反人类的“所有权”和“生命周期”机制差点让我把键盘砸了,但熬过新手村后,那种内存安全带来的安全感真的是谁用谁知道。今天刚好周末,外面下着雨,不用去公司,就着咖啡跟大家聊聊我最近在工作里搞的一些技术探索和实践。
事情得从上周五晚上说起。那天快下班了,产品经理老李又双叒叕在钉钉上戳我,说内部那个代码审查辅助工具最近跑得越来越慢,每次跑全量扫描都要等半个多小时,严重影响了大家下班的节奏。当时我真的想顺着网线过去摇醒他,这工具是两年前刚转开发时我用Python撸的,当时为了赶deadline,各种正则和字符串拼接一把梭,现在代码量上来了,性能瓶颈早就该爆了。
但吐槽归吐槽,活儿还是得干。看着那个跑了十几分钟还在转圈圈的进度条,我烦躁地戴上耳机,决定先找点乐子缓解一下。前阵子不是那个AI音乐生成工具Suno挺火的嘛,我就顺手把老李提的需求和心里的吐槽编了几句词,扔进Suno里生成了一首死亡重金属。听着那嘶吼的“改需求改到半夜三更,扫描脚本卡得像只乌龟”,我居然奇迹般地平静了下来,甚至觉得这帮搞AI的确实有点东西,情绪价值直接拉满。
听完歌,我切回Mac的终端,开始正经审视那个祖传的Python脚本。说实话,以前做测试的时候,我最喜欢提这种因为语言特性导致的性能缺陷,现在自己成了开发,只能默默咽下自己酿的苦果。
Python里有个著名的彩蛋模块叫 antigravity,如果你在REPL里输入 import antigravity,它会打开一张xkcd的漫画,调侃Python让你飞起来。但在实际的高并发和大数据量处理场景下,Python的GIL(全局解释器锁)和不可控的GC(垃圾回收)停顿,有时候真不像“反重力”那么美好,反而像被绑了沙袋一样沉重。特别是那个老脚本里大量的字典嵌套和列表推导式,内存峰值经常飙到好几个G,GC一触发,CPU直接干到100%,整个进程就假死了。
“既然Python飞不起来,那就用Rust来反重力吧。”我当时脑子里就蹦出这个念头。正好最近学Rust有点走火入魔,决定拿这个模块开刀,用Rust重写核心的AST(抽象语法树)解析和规则匹配逻辑。
说干就干。我新建了一个Cargo项目,引入 syn 和 quote 这两个解析Rust代码的库(顺便把Python的AST解析也通过 rustpython-parser 搞了一下)。刚开始写的时候,我还是带着Python的思维,到处传递引用,结果编译器像个严厉的教导主任,满屏飘红。
最搞心态的是生命周期报错。我记得特别清楚,当时在写一个遍历语法树节点的函数时,遇到了这个经典的报错:
error[E0597]: `node` does not live long enough
--> src/analyzer.rs:42:15
|
42 | let rule_match = self.check_rules(&node);
| ^^^^^^^^^^^^^^^^-------
| | |
| | `node` dropped here while still borrowed
| borrow later used here
当时看着这红彤彤的报错,我差点破防。在Python里,这种局部变量传个引用简直是呼吸一样自然,但在Rust里,借用检查器(Borrow Checker)死死盯着你,告诉你“这玩意儿的生命周期不够长,我不允许你这么干”。我深吸了一口气,去翻了翻Rust官方文档的 lifetimes 章节,最后通过给结构体加上生命周期标注 'a,并用 Cow<'a, str> 来优化字符串的拷贝问题,总算让编译器闭了嘴。看着终端里终于亮起绿色的 Finished dev [unoptimized + debuginfo] target(s),那种长舒一口气的快感,真的只有写过Rust的人才能懂。
重构完成后,我迫不及待地在本地跑了个对比测试。为了公平起见,我用了同一个包含五万行代码的内部仓库作为测试集。
| 指标 | Python 老脚本 | Rust 重构版 | 提升幅度 |
|---|---|---|---|
| 全量扫描耗时 | 32分 14秒 | 1.8秒 | 约 1075 倍 |
| 内存峰值占用 | 2.4 GB | 45 MB | 降低 98% |
| CPU 平均使用率 | 95% (单核跑满) | 15% (多核并行) | 显著降低 |
| GC 停顿次数 | 约 120 次 | 0 次 | 彻底消灭 |
看着表格里这夸张的数据,我忍不住在工位上笑出了声。这哪是技术探索啊,这简直是降维打击。以前Python跑的时候,风扇转得跟直升机起飞一样,现在Rust编译后的二进制文件跑起来,安静得让我怀疑它是不是没在运行。
周一早上的站会,我把这个优化后的工具推了上去。老李试了一下,看着瞬间出结果的界面,愣了两秒,然后给我竖了个大拇指。那一刻,我觉得上周五晚上的加班和掉的那些头发都值了。
回过头来看这三年的转岗经历,从最初写业务代码时的战战兢兢,到现在敢于在核心模块上尝试新技术,我觉得技术探索最大的意义,并不是为了在简历上多写几个名词,而是当你面对一坨屎山代码或者棘手的性能瓶颈时,你脑子里能有更多的武器库去解决它。
不管是用Suno写首歌吐槽一下奇葩需求,还是用Rust去重构一个老旧的Python脚本,甚至是在Python里敲下 import antigravity 会心一笑,这些看似“不务正业”的折腾,其实都是保持技术敏感度和编程热情的最好方式。
不说了,雨停了,我得去楼下拿个快递,顺便买杯冰美式。下午还得把那个Rust模块的单元测试补齐,毕竟以前做测试留下的职业病,让我对代码覆盖率有着近乎变态的执念。咱们下篇博客再见!

评论 0