开发越来越快,生产越来越慢
Posted by quentin 在 Monday, 7 September 2026过去五年,前端构建工具速度提升了10倍,但生产环境的用户体验并没有同步改善。Vite和Turbopack解决了开发者的等待焦虑,但用户的等待被转嫁了出去。构建工具优化的是开发体验,真正的性能瓶颈在运行时、在水合成本、在部署架构。前端正在从'让开发更快'转向'让生产更快'。
求知若渴,虚心若愚!
居安思危,积极进取!
过去五年,前端构建工具速度提升了10倍,但生产环境的用户体验并没有同步改善。Vite和Turbopack解决了开发者的等待焦虑,但用户的等待被转嫁了出去。构建工具优化的是开发体验,真正的性能瓶颈在运行时、在水合成本、在部署架构。前端正在从'让开发更快'转向'让生产更快'。
上周看到一个热搜话题:一个人用AI做出了过去需要一个团队才能做的产品。评论区一片焦虑,有人说"技术管理者要失业了"。
我觉得这话说反了。AI越能干,越需要有人决定让它干什么、不干什么。真正该焦虑的,是那些还在用"做得好"来定义自己价值的技术管理者。
做得太好,是一种甜蜜的陷阱
我见过不少技术leader,包括我自己,刚做管理时的第一反应是——代码review我得上,架构设计我得参与,关键技术选型我得拍板。
原因很简单:这是我们最擅长的事,也是最有安全感的事。写出一段精巧的代码、解决一个棘手的bug,那种成就感是开会、写文档、做1on1给不了的。
但问题是,如果你的时间都花在review代码上,谁来做技术规划?谁来协调跨团队的需求冲突?谁来处理团队里那个能力强但态度差的人?
没人做。因为这些事"不急"。或者更准确地说,我们下意识觉得这些事没有"亲手写出一个漂亮的函数"来得有成就感。
身份认同才是真正的瓶颈
我在金融科技团队里见过一个典型场景。新业务要上线,技术方案讨论时,CTO问了一个架构层面的问题。整个会议室沉默了十秒,所有人看向那个最强的工程师。
他答得很好。但我在想:如果这个团队继续发展,他还是那个被提问的人,还是那个回答问题的人?
你有没有过这种感觉——走进一个房间,抬头就看到一个黑色的小圆球对着你。
家里的智能摄像头、公司的安防系统、小区门口的人脸识别,它们无处不在。不管你怎么说服自己"又没做什么亏心事",那个镜头始终让你不太舒服。
我也一样。所以当我上周在 GitHub 上看到一个叫 RuView 的项目时,愣了好一阵。
这个项目做的事情很简单也很颠覆:用普通 WiFi 信号来感知你的存在、呼吸频率、心率,甚至能做姿态估计和跌倒检测。不需要摄像头,不需要穿戴任何设备,一颗 9 美元的 ESP32 芯片就够了。
WiFi 怎么"看"人
先别急着觉得这是科幻。
WiFi 信号本质上是一种射频电磁波。它在房间里传播时,会被人体吸收、反射和散射。你站在 WiFi 路由器和接收器之间,信号就会产生可测量的变化。通过分析这些变化——技术上叫 CSI(信道状态信息)——可以推断出空间里正在发生什么。
这个方向学术界已经研究了十几年。2015 年 MIT 的 RF-Capture 就展示过用 WiFi 信号追踪人体姿态;后来的 DensePose、MultiFormer 不断刷新精度。WiFi 感知在学术圈不算新鲜事。
DRY——Don't Repeat Yourself。这四个字母可能是软件工程里被引用最多、被误解最深的原则。
每个程序员入行第一天就被告知:重复代码是邪恶的,看到重复就要提取,看到提取就要抽象,看到抽象就要泛化。于是我们疯狂地消灭重复——公共函数、工具类、基础库、共享模块......代码库越来越"干净",重复率越来越低,CI里没有任何duplicate code的警告。
然后某一天,一个业务需求来了——需要改动某个"公共"逻辑。你打开那个被47个地方引用的utils函数,改了一行,跑了一下测试——绿了。上线,结果三个业务线同时报警。你突然发现,那三个业务线依赖的是同一个函数的三种不同行为,被那个"公共"函数强制统一了。
你消灭了重复代码,但你制造了耦合。而耦合,是比重复贵十倍的技术债。
重复代码不是问题,问题是不知道为什么重复
所有关于DRY的讨论,都默认了一个前提:重复等于坏。但这个前提本身就是幻觉。
重复代码至少有三种完全不同的面目。
第一种是意外重复——两个开发者不知道对方写了同样的功能,造了两个轮子。这种重复才是真正需要消灭的,因为它意味着信息浪费和潜在的不一致。
先说一个我在做推荐系统 AB 实验架构时观察到的现象。
某个业务团队跑了一个月的实验,结论是新的推荐策略效果显著,CTR 提升了 12%,上线。三个月后回头看,整体转化率没变——用户只是提前点了,没有多买。没人复盘这件事,因为所有人都已经在那个"12% CTR 提升"的实验报告上签了字。
这不是个例。在金融产品场景里,我见过太多 AB 实验的结果被当作结论使用,而实验本身的设计、指标选择、对照组偏差,几乎没人认真审视。大家需要的不是真相,是一个可以写进周报的数字。
数据驱动这个词已经被用烂了
每家公司都说自己是数据驱动的。但如果你仔细看他们做决策的过程,会发现一个很典型的模式:先有结论,再做实验。
产品经理已经有了想法,设计已经出了方案,开发已经排了迭代——实验只是最后的"验证"。注意,不是"验证假设",是"验证决策"。这两者有本质区别。验证假设的时候你真心想知道答案,验证决策的时候你只想要一个通过。
这种心态不是某个人有问题,是整个系统的激励结构决定的。一个做了三个月的项目,谁愿意在最后一步承认实验结果不支持上线?于是你会看到各种"实验结果不显著但趋势向好"、"主要指标未达显著但次要指标表现优异"的结论。翻译成人话就是:实验没通过,但我们还是要上。
每个技术团队都经历过这种场景:选型评审会上,几个方案摆出来,有人做性能对比,有人秀Demo效果,有人贴GitHub Star数。讨论半天,拍板一个,然后散会。团队满怀期待地开始新项目,三个月后开始骂娘。
这事儿我见过太多次了。选型时看到的都是优点,上线后暴露的全是成本。而且这些成本绝大多数在选型评审时根本没人提——不是不想提,是没人知道该提什么。
技术选型最大的陷阱不是选错了框架,而是你以为自己只选了框架。
你看到的是Demo,你看不到的是深渊
选型评审时,我们评估什么?功能列表、性能基准、社区活跃度、文档完整度。这些都是对的,也是不够的。
它们属于"可见成本"——你能在两小时的评审会上完成对比的东西。但框架的真正成本,从来不在这张表上。
打开任何一个前端项目,全局搜索 `catch`,你会看到什么?一大片空荡荡的 catch 块,偶尔跳出几个 `console.error`,再偶尔冒出一行 `message.error('系统异常')`。后端项目也好不到哪去,try-catch 包着业务逻辑,catch 里面的处理方式跟前端如出一辙——记个日志,打个错误码,然后呢?然后什么都没有。
我把这种写法叫"安慰剂错误处理"。它的作用不是解决问题,而是让写代码的人觉得自己处理了问题。就好像感冒的时候吃维C,你做了点什么,但那点什么跟治愈没有关系。
更残酷的事实是:大部分错误处理非但没用,还在制造新的问题。
try-catch 不是错误处理,是错误藏匿
先说一个很多人不愿意承认的事:try-catch 是所有错误处理手段里最廉价的那一种。它的成本最低,所以它的价值也最低。
我见过太多这种代码:一个函数内部包了三层 try-catch,每一层都把异常吞掉,最外层返回一个 `{ success: false, message: '操作失败' }`。调用方拿到这个返回值,判断 `success` 为 false,然后弹个 toast —— "操作失败"。用户看到这四个字,内心毫无波澜,因为他已经见过一千次了。
最近在和几个技术管理者交流时,发现他们都在规划或已经落地了BFF(Backend for Frontend)架构。问为什么要做BFF,得到的答案惊人地一致:"解耦前后端"、"提升开发效率"、"这是最佳实践"。
但当我问:"你们团队有多少后端开发?前端开发呢?",答案通常是"后端6-8人,前端3-4人"。这让我意识到一个问题:大部分团队上BFF,可能不是因为真的需要,而是因为"别人都在用"。
我想聊聊这个话题,不是要否定BFF的价值,而是想说:很多团队高估了BFF的收益,低估了它的成本。
BFF真正解决的问题
先说清楚,BFF不是伪需求。它在特定场景下确实有价值:
场景一:多端适配。你的后端API是为Web设计的,现在要支持移动端、小程序、IoT设备。不同端的数据需求、交互逻辑差异很大,用一套API很难搞定。这时候BFF可以为每个端定制API,后端保持稳定。
场景二:聚合调用。前端一个页面需要调用5-6个后端服务,串行调用太慢,并行调用又要处理复杂的依赖关系。BFF可以在服务端聚合这些调用,减少前端的复杂度和网络开销。
安装2012版的手机QQ之后一直不停的提示群消息,烦死了。
找了半天才发现原来设置在“群资料”里。步骤: