请写一篇关于【技术探索与实践踩坑记录】的技术文章

高勇
2025-12-29 01:26
阅读 1214

前言:凌晨1点,哄睡两个娃后打开VS Code

上周五晚上10点47分,我刚把老大塞进被窝,老二又在隔壁房间嚎啕大哭。这已经是今晚第三次了。老婆在视频那头笑着说:“你先哄他,我明天还要早起开会。” 我点点头,没说话——其实心里清楚,她只是不想让我觉得她在“缺席”育儿。

我们异地快一年了。她在杭州一家跨境电商做运营,我在成都一家中型SaaS公司做前端开发。房租3500,两个孩子的奶粉钱每月大概2800,再加上偶尔的老人帮忙补贴……说实话,经济压力不小。但真正压垮人的,从来不是账单,而是那种“一个人扛着所有”的疲惫感。

所以,当我终于在凌晨1点03分关掉最后一盏灯,坐到电脑前时,那种“终于轮到自己了”的感觉,比喝三杯美式还提神。

那天晚上,我本打算复盘一个刚上线的项目,结果一打开Git日志就看到满屏红色报错。那一刻,我真的差点想放弃。

但今天我想写的,不是抱怨,而是一次真实的技术探索、一次踩坑、一次成长——以及作为一个奶爸程序员,在深夜里如何用代码和架构思考,一点点把生活理顺。


项目背景:一个“简单”的需求,一场架构噩梦

事情要从去年十月说起。

我们团队接了一个新项目:给客户做一套内部协作平台,核心功能包括任务管理、文件共享、实时聊天。听起来不复杂,对吧?产品经理拍着胸脯说:“前端就用你们熟悉的React + Ant Design,后端用Node.js,两周出MVP。”

我信了。毕竟我之前做过类似的内部工具,组件库、状态管理、权限控制都驾轻就熟。但这次,我低估了“内部系统”背后的复杂性。

第一个坑:前端状态爆炸

最初的设计是“页面即状态”——每个页面维护自己的state,通过props层层传递。老大两岁那会儿,我还能熬夜重构,但现在?别说重构,连debug都要掐着时间:娃一醒,我就得放下键盘。

结果上线第三天,用户反馈“切换任务列表时页面卡死”。我查了半天,发现是因为某个深层组件在每次父级更新时都重新渲染,而它内部又绑定了大量DOM操作。

“这不是useCallback就能解决的吗?”同事小张在站会上随口问。

“问题是,谁还记得三个月前哪段逻辑触发了这个回调?”我苦笑,“而且现在加useCallback,可能又会引发别的组件性能问题。”

那一刻我意识到:当项目规模超过一定阈度,局部优化只会让整体更混乱


转折点:从“能跑就行”到“可维护优先”

真正的转机发生在去年12月的一个周末。那天老婆难得来成都看孩子,我本该陪她逛街,但她看出我心不在焉,主动说:“你去书房搞你的代码吧,我带娃。”

我坐在书桌前,盯着那个卡顿的页面,突然想起几年前读过的一句话:“架构不是设计出来的,是在约束中演化出来的。

于是,我做了三个决定:

  1. 引入Zustand替代部分Redux逻辑
    不是为了追新,而是因为它轻量、无样板代码,适合快速迭代。更重要的是,它的store是独立的,不会因为组件树变化而失效。对于我这种只能碎片化开发的人来说,减少上下文依赖太重要了。

  2. 拆分“业务模块”而非“页面”
    过去我们按路由拆组件:/tasks/files/chat。现在我改成按领域拆:TaskModuleFileModuleChatModule,每个模块有自己的状态、API层、UI组件。这样即使某天我要重写聊天功能,也不会影响任务模块。

  3. 建立“开发守夜人”机制
    因为白天要带娃,我没法参与日常CR(Code Review)。于是我写了个简单的脚本,每天凌晨2点自动跑一遍E2E测试,并把失败用例推送到企业微信。虽然简陋,但至少能保证主干不崩。

这些改动花了我三个周末的深夜时间。每次改完,都要等娃睡了才能验证。有次凌晨3点,我正调试WebSocket重连逻辑,老二突然发烧,我一边量体温一边在手机上回Jira评论:“建议把重连间隔从3s改成指数退避,避免雪崩。”

老婆后来吐槽:“你是不是把孩子当成异步任务了?”

我笑不出来——因为某种程度上,确实是。


工具链的取舍:不是越多越好,而是越稳越好

很多人以为技术探索就是用最新框架、最炫工具。但对我这种“夜间开发者”来说,稳定性 > 新颖性,可恢复性 > 性能

举个例子:我们原本用Vite + TypeScript + Tailwind CSS,看起来很现代。但Tailwind的原子类在大型项目中导致CSS体积膨胀,而且一旦配置出错,整个样式就崩了。有次我改了个颜色变量,结果聊天窗口的文字全变透明了——因为text-transparent被误写成了text-transparant

后来我果断砍掉Tailwind,回归传统CSS Modules + PostCSS。虽然少了“写class就能出样式”的爽感,但至少我能靠语义化类名快速定位问题。而且,当你的开发时间是以“分钟”计算时,减少认知负担比提升效率更重要

另一个关键是本地开发体验。我给项目加了Docker Compose,一键启动前后端+数据库。为什么?因为我试过太多次:周末改完代码,周一上班发现本地环境和CI不一致,白白浪费半天。

现在,我只要在终端输入:

docker-compose up -d

然后泡杯咖啡,等娃睡着,就能无缝继续工作。这种“确定性”,是我对抗生活不确定性的最后防线。


开发心得:架构的本质是“降低协作成本”

很多人谈架构,总爱说高并发、微服务、DDD。但对我而言,架构的第一要务,是让一个疲惫的奶爸,在凌晨1点还能看懂自己写的代码

这意味着:

  • 命名要直白:别用handleXxx,直接叫submitTaskForm。三个月后你再看,不会懵。
  • 错误要可追溯:每个API调用都打唯一traceId,结合Sentry,哪怕半夜报错也能快速定位。
  • 文档要内嵌:我在关键函数里写JSDoc,不是为了规范,而是因为我不记得自己为什么要这么写了。

上周,团队来了个新人,他看了我的模块拆分后说:“哥,你这不像前端,像后端思维。”

我笑了笑:“可能是因为,我没法指望别人帮我兜底。”


薪资与选择:技术深度 vs 生活平衡

今年3月,有猎头联系我,说某大厂愿意给22k月薪(我现在15k),但要求996。我犹豫了很久。

那天晚上,我和老婆视频聊到凌晨。她说:“如果你去了,周末见面就没了。而且,你能保证每天晚上哄睡孩子吗?”

我沉默了。

最终我拒绝了offer。不是不爱钱,而是我算了一笔账:多赚7k,但失去陪伴孩子成长的时间,失去和老婆短暂相聚的周末——这笔交易,不值。

反而,我开始把精力放在提升单位时间产出上。比如:

  • 用Plop.js生成标准化组件模板,减少重复劳动;
  • 把常用Hook封装成npm私有包,跨项目复用;
  • 写自动化脚本处理PR、部署、监控。

这些看似“小”的改进,累积起来,让我每周能多出5-6小时的有效开发时间——足够完成一个feature,也足够陪孩子读两本绘本。


结语:在缝隙中种花

写这篇文章时,已经是凌晨2点17分。老二刚刚翻了个身,嘟囔了一句“爸爸”。我没动,怕吵醒他。

作为一个异地奶爸,我的技术之路注定不酷炫:没有Hackathon,没有开源明星项目,甚至很少参加技术大会。我的战场在深夜的台灯下,在孩子睡着后的寂静里,在一次次“能跑就行”和“必须优雅”之间的妥协中。

但正是这些限制,逼我思考什么是真正重要的架构原则:不是炫技,而是可持续;不是完美,而是可维护;不是速度,而是韧性

如果你也像我一样,在生活的夹缝中坚持编码,我想说:别自责进度慢,别羡慕别人985大厂。真正的技术深度,往往诞生于约束之中

下次当你在凌晨调试一个诡异的内存泄漏,而孩子在隔壁房间安稳睡觉时,请记住:你不仅是在写代码,更是在为家人构建一个更稳定的未来。

共勉。


后记:本文写于2024年6月15日凌晨,成都家中。
老大2岁8个月,老二11个月。
老婆下周六回来,我答应她这次不碰电脑,专心陪娃。
(但如果线上崩了……应该可以破例吧?)

评论 0

最热最新
暂无评论
高勇Lv.1
0
影响力
0
文章
0
粉丝