请写一篇关于【技术探索与实践优化实践】的技术文章
去年十月的一个深夜,我坐在出租屋里,泡面凉了都没顾上吃。屏幕上是 LeetCode 上第 387 题“字符串中的第一个唯一字符”,而我的脑子比那个空指针还空。老婆在隔壁房间轻声问我:“还在刷题?明天不是要交报名表了吗?”我嗯了一声,心里却翻江倒海——一边是月薪 22k 的互联网大厂后端岗,一边是老家地级市公务员笔试通知。我不是不想上岸,而是不知道该往哪边上。
我是谁?一个干了五年 Java 的在职程序员,坐标杭州,房租 3500,通勤一小时,每天在微服务、Kafka、Redis 里打转。三年前从二线小城杀出来,以为能靠代码改变命运,结果发现改命的前提是先活下来。现在 31 岁,存款刚够付老家一套房的首付,但身体已经扛不住凌晨三点的线上故障排查了。
事情得从一次“面试题挑战”说起。
上个月,我鬼使神差地投了一份老家省会的国企 IT 岗(算是考公的过渡选项)。一面是视频面试,对面是个戴眼镜的中年技术主管,语气和蔼:“我们这儿不搞什么高并发,系统稳定就行。”我心里一松,结果他下一句是:“不过,你得现场手写一个 LRU 缓存,不能用 LinkedHashMap。”
我当场懵了。LRU?这玩意儿我在阿里 P6 面试时都只口述思路,现在要手撸?更离谱的是,他说:“我们笔试也考算法,虽然岗位是运维开发,但基础得扎实。”
那一刻我突然意识到:无论你是在卷大厂还是奔体制,技术底子永远是你最后的退路。哪怕你明天就去当公务员,今天也得把 HashMap 的扩容机制讲清楚——因为面试官不信“稳定”两个字,他们信的是你能写出无 bug 的代码。
于是,我决定把这次“面试题挑战”当成一次技术复盘的机会。不为拿 offer,只为验证自己这几年到底有没有白干。
我选了个经典场景:优化一个慢查询接口。这是我们生产环境真实存在的问题——用户订单列表加载要 3.2 秒,前端天天在群里@我:“哥,能不能快点?用户都骂疯了。”
原始代码大概是这样(简化版):
List<Order> orders = orderMapper.selectByUserId(userId);
for (Order order : orders) {
Product product = productMapper.selectById(order.getProductId());
order.setProduct(product);
}
典型的 N+1 查询问题。100 个订单就要查 101 次数据库。我当初接手时就想重构,但 PM 说:“能用就行,别动老系统。”结果现在成了我的“技术债”。
这次,我逼自己动手。第一步:用 MyBatis 的
第二步:引入 Redis 缓存。把用户最近 50 条订单缓存起来,TTL 5 分钟。但缓存穿透怎么办?我加了布隆过滤器(Bloom Filter),用 Guava 实现,内存占用不到 5MB。命中率从 60% 提升到 92%。
第三步:异步预热。用户登录后,后台用线程池悄悄加载他的订单数据到缓存。这个 idea 是我在刷知乎时看到的,原以为是“过度设计”,结果上线后首屏加载直接压到 200ms 以内。
整个过程花了两周下班后的晚上。期间有次凌晨两点,Redis 集群主从切换失败,我一边远程连服务器一边跟老婆道歉:“再给我十分钟,马上好。”她叹了口气:“你是不是觉得,只有代码不会背叛你?”
我没回答。但我知道,这些优化不是为了炫技,而是为了在“万一失业”的那天,我能理直气壮地说:我的技术,经得起生产环境的毒打。
做完优化后,我把整个过程整理成一篇《从 3s 到 200ms:一次订单查询的极限优化实战》,发在公司内部 wiki 和掘金上。没想到 HR 看到了,跑来问我:“要不要参加下季度的技术分享会?很多新人想听实战案例。”
我答应了。上周五晚上,我站在会议室投影前,台下坐着二十多个实习生和 junior 工程师。我讲的不是八股文,而是如何用最土的办法解决最痛的问题。比如:
- 为什么不用 JPA 而坚持 MyBatis?因为老系统全是动态 SQL。
- 为什么选 Guava BloomFilter 而不是 Redis 的?因为 QPS 不高,省资源。
- 为什么不做分库分表?因为订单量还没到那个量级,过早优化是万恶之源。
有个实习生举手问:“哥,你这么拼,是为了跳槽涨薪吗?”
我笑了笑:“不,是为了给自己留条活路。”
现在回头看,那次“面试题挑战”像一面镜子,照出了我的焦虑,也照出了我的价值。技术人的安全感,从来不是来自一份稳定的工作,而是来自解决问题的能力。
我开始重新思考“回老家”这件事。不是非黑即白地二选一,而是问自己:如果我在老家做公务员,还能保持技术敏感度吗?如果我在杭州继续卷,身体和家庭能撑多久?
上周和老婆认真聊了一次。她说:“其实我不在乎你在哪上班,但我不想你每天回家像行尸走肉。” 我鼻子一酸。是啊,我拼命写代码,不就是为了让她过上轻松点的日子吗?
所以我的计划变了:
- 继续备考公务员,但不再把它当成“逃离”,而是多一个选择;
- 每周至少做一次技术分享,不管是公司内部还是写博客,保持输出;
- 把优化经验沉淀成可复用的组件,比如那个防缓存穿透的工具类,已经开源到 GitHub。
写这篇文章的时候,窗外又下雨了。杭州的秋天总是湿冷黏腻,像极了我的犹豫。但我知道,无论最终选择哪条路,那些深夜 debug 的经历、那些被线上报警吵醒的凌晨、那些把慢查询压到毫秒级的成就感,都不会白费。
技术探索不是为了成为大神,而是为了在人生的岔路口,多一分从容,少一分慌张。实践优化也不是为了卷赢别人,而是为了告诉自己:我还能打。
如果你也在纠结“要不要回老家”、“要不要考公”、“技术还有没有用”,我想说:
别急着选岸,先练好游泳。
因为真正的上岸,不是找到一份安稳的工作,而是无论在哪,都能稳稳地站着。
共勉。

评论 0