技术探索这事儿,摸鱼时也能干点正经活

报警声中醒来
2026-01-15 06:48
阅读 778

上周五晚上九点半,办公室就剩我和测试小哥还在。他盯着我改完最后一个bug,幽幽地说:“你这代码,跑起来比我的发际线还飘。”我苦笑一声,默默点了杯续命的冰美式——其实我也不想加班,但谁让这个需求是老板在周一晨会上拍脑袋定下来的呢?

我在这家公司快两年了,日常就是一边佛系摸鱼,一边被各种deadline追着跑。用Mac写代码,Windows只用来测兼容性(毕竟客户啥系统都有),团队氛围还算轻松,领导不怎么push,但也别指望升职加薪——躺平挺好,至少头发还在。

最近半年,我开始悄悄研究Rust。倒不是想跳槽,纯粹是因为被JS里那些诡异的this指向和异步回调搞怕了,想找点“确定性”强的语言疗愈一下心灵。结果一入Rust深似海,从此摸鱼变“摸铁”(内存安全那套真硬核)。

今天想聊聊技术探索和实践优化的事儿。别看我整天喊着躺平,其实在技术选型、性能调优这些事上,我还是挺较真的——毕竟谁也不想半夜被线上告警吵醒,对吧?


那次差点让全公司放假的区块链需求

事情得从去年双11前说起。产品经理突然冲进技术群,说要“拥抱Web3.0”,给我们的用户中心加个“数字资产钱包”功能,支持NFT展示和交易记录同步。我第一反应是:又来了,又是PPT驱动开发。

但这次不一样——老板真批了预算,还拉了个跨部门小组。更离谱的是,运维大哥直接甩过来一句:“后端用Go还是Java?前端对接用JSON-RPC还是GraphQL?” 我心想,前端?我们连基本的用户登录都没做SSO,现在要搞区块链?

硬着头皮上呗。技术选型成了第一关。

我们评估了三个方案:

方案 语言/框架 开发速度 安全性 学习成本 是否适合我们
直接集成MetaMask SDK JavaScript (React) ⚡️极快 中等(依赖第三方) ✅ 快速验证MVP
自建轻节点 + JS库 JS + Node.js 低(需自己处理私钥) ❌ 不可控
Rust写核心逻辑 + WASM导出 Rust → WASM 极慢 ⭐️高 🤔 长期可考虑

最后我们选了第一种——用ethers.js + MetaMask provider,纯前端对接。为啥?因为Deadline就在两周后!而且我们只是展示和签名,并不托管私钥,安全边界清晰。

但问题来了:JavaScript处理大数(比如以太坊的wei单位)会精度丢失。有次测试发现,用户余额显示1000000000000000000 wei,结果JS一转,变成了1e+18,再转成ETH就是1,看起来没问题?但当余额是1000000000000000001时,JS直接给你变成1e+18,最后一位丢了!

这要是真让用户少了一wei,虽然不值钱,但体验炸裂。我们最后用了BigInt + ethers.BigNumber组合拳才搞定。这段经历后来还成了我面试别人时的经典面试题

“在JS中如何安全地处理以太坊的大整数?为什么不能直接用Number?”

答不上来的,基本pass。不是刁难,而是这真踩过坑。


JavaScript不是原罪,但得用对地方

说到JS,很多人一提性能就摇头。但我想说:JS本身没问题,问题在于你怎么用。

我们有个老项目,用Vue2写的,首页加载要5秒多。产品经理每次演示都尴尬得抠出三室一厅。我本来想躺平不管,直到某天运维大哥在群里@我:“兄弟,CDN带宽快爆了,你们首页加载了3MB的JS?”

我打开DevTools一看,好家伙:一个轮播图组件,居然打包进了整个Lodash + Moment.js + Chart.js!原因是早期为了赶工,直接import _ from 'lodash',而不是按需引入。

优化思路很简单:

  1. 拆包:用Webpack的splitChunks把公共库抽出来
  2. 懒加载:非首屏组件动态import
  3. 替换重型库:Moment.js换成day.js,Lodash用原生Array方法替代

改完之后,首屏JS从3MB降到600KB,FCP(首次内容绘制)从5s降到1.2s。最爽的是,再也不用听产品经理抱怨“页面卡得像我家十年前的WinXP”。

但说实话,这种优化属于“修修补补”。如果重来一次,我会考虑用更轻量的框架,甚至部分逻辑用WASM加速——比如那个复杂的图表渲染,用Rust写完编译成WASM,性能直接起飞。


为什么我开始学Rust?因为JS让我睡不着觉

别误会,我不是JS黑子。我靠JS吃饭快五年了,React/Vue/Angular都玩过。但有些场景,JS真的力不从心。

比如我们有个数据同步服务,需要实时解析上万条WebSocket消息,做字段校验、转换、去重。用Node.js写,CPU飙到90%,还得开多个进程。有次线上GC停顿3秒,导致消息堆积,监控报警响彻凌晨三点。

后来我试着用Rust重写了核心解析模块。得益于零成本抽象和所有权模型,同样的逻辑,Rust版本内存占用只有Node.js的1/5,吞吐量翻了3倍。最关键的是——没有GC停顿!凌晨终于能睡个安稳觉了。

当然,学习曲线是真的陡。光是borrow checker就让我摔了三次键盘。有次写个简单的字符串处理,报错信息长达20行,我盯着屏幕愣了半小时,最后发现是生命周期标注错了。

但一旦跨过那道坎,你会爱上这种“编译即正确”的感觉。不像JS,运行时才发现undefined is not a function,Rust在编译阶段就把大部分错误拦住了。

现在我经常在摸鱼时间写点Rust小工具:日志分析器、API mock server、甚至自动整理桌面文件的脚本。虽然用Python或Shell也能做,但用Rust写出来的,有种“工业级”的踏实感。


技术选型:别被 hype 带节奏

现在技术圈有个怪现象:新框架一出,立马有人喊“XX已死”。Rust火了,就说“C++可以退休了”;Serverless流行,就说“运维工程师要失业了”。

但现实是:没有银弹,只有权衡

我们在做技术分享时,经常陷入两个极端:

  • 要么盲目追新,结果团队没人会,上线即事故
  • 要么死守老旧技术,连ES6都不用,还天天抱怨“前端太卷”

正确的姿势是什么?我觉得是:用最小的成本验证最大价值

比如想试试Rust,先别想着重写整个后端。可以从一个小工具、一个CLI脚本开始。我们团队现在有个规矩:任何新技术引入,必须满足两个条件:

  1. 能解决现有痛点(比如性能、安全、维护成本)
  2. 有至少两人愿意长期维护

否则,哪怕它再火,也别碰。毕竟,技术债比房贷还难还


面试题背后的真相:别背答案,要懂场景

说到面试题,我发现很多人只关注“标准答案”,却忽略了背后的真实场景。

比如常考的“JS事件循环”,背十遍宏任务微任务顺序,不如亲手写个setTimeout + Promise的嵌套demo,看看输出顺序。再比如“如何防XSS”,背DOMPurify没用,得知道为什么innerHTML = userInput危险,而textContent安全。

我在面试候选人时,喜欢问:

“你最近一次优化性能,具体做了什么?量化结果是多少?”

如果对方只说“用了缓存”、“减少了请求”,基本凉了。但如果能说出“通过懒加载+图片格式转WebP,LCP从4s降到1.8s,转化率提升7%”,那我立刻眼前一亮。

技术分享也一样。不要只讲“Rust多快”,要讲“在什么场景下,Rust比JS快,快多少,代价是什么”。这才是有价值的干货。


写在最后:摸鱼和精进,其实不冲突

很多人觉得“躺平”就是放弃成长。但我觉得,真正的佛系,是清醒地选择在哪里用力

我不卷加班,但会花周末研究Rust; 我不抢需求,但会主动优化卡顿的页面; 我不争晋升,但会在技术分享会上认真准备每一页PPT。

技术探索不是为了卷赢别人,而是让自己写代码时少一点焦虑,多一点掌控感。就像那天晚上,当我看到Rust程序稳定跑了一周零故障,心里那句“终于搞定了”比任何KPI都让人踏实。

所以啊,别被“必须996才能进步”的毒鸡汤洗脑。高效工作,聪明学习,适当摸鱼——这才是可持续的程序员生存之道。

下次如果你在GitHub上看到一个叫“lazy-coder-who-cares”的仓库,里面全是些小而美的Rust工具,说不定就是我在咖啡因加持下的摸鱼成果。

共勉。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝