写给2025年的我:在保持真我与适应社会之间找到平衡点

在这个复杂多变的世界里,每个人都以自己独特的方式存在着,而我,则被周围人贴上了“憨”、“固执”这样的标签。面对这些评价时,我的内心经历了从最初的困惑不解到后来逐渐接受的过程。起初,我试图去改变自己,让自己看起来更加圆滑、世故,但很快我发现,这样的尝试不仅让我感到疲惫不堪,更重要的是,它违背了我的本心——那个渴望真实表达自我的灵魂。

工程师的沟通成本为什么总是被低估

博客分类: 

每个项目复盘的时候,技术负责人都会提一个问题:为什么又延期了?

然后大家开始列原因:需求变更、技术方案调整、第三方接口不稳定、测试环境问题……很少有人提"沟通"。

因为沟通好像不属于正经的工作。你写了一千行代码,那是产出;你开了三小时会,那是浪费时间。但实际情况是,你开的那三小时会,可能比写一千行代码对项目的影响更大——不管是正面还是负面。

 

沟通不是耽误开发,沟通本身就是开发

 

很多工程师有一种根深蒂固的观念:写代码才是正事,沟通是不得不做的打断。所以他们会尽量减少沟通——需求文档能不读就不读,能用文字说清楚的绝不开会,能自己决定的绝不找人讨论。

这种做法在个人项目里没问题。一个人写代码,沟通成本为零。但团队项目不一样。

一个五人团队,如果每个人对需求的理解偏差10%,最终集成出来的东西可能偏差50%。这不是数学平均,这是偏差的累积——前端理解的交互逻辑和后端理解的数据结构不一样,测试理解的验收标准和产品理解的验收标准不一样,等大家把代码合到一起才发现问题,修复的成本是开发阶段的十倍。

你的技术债务可能不是债务,是遗产

博客分类: 

技术债务这个比喻太深入人心了,以至于所有旧代码都被贴上了"债"的标签。重构计划里排满了"还债"任务,架构升级的理由是"降低技术债务",新人入职第一件事是听老人抱怨欠了多少债。

但仔细想想,你管它叫债,它就真的欠了什么吗?

 

债务这个比喻哪里不对

 

债务意味着你有偿还义务。你借了钱,必须还。到期不还,利息越滚越多,最终破产。

代码不是这样的。

一段跑得好好的代码,即使写法丑陋、架构混乱、没有测试覆盖,只要它在生产环境稳定运行,就没有人强迫你"还债"。业务的每一个需求都可能让你动这段代码,但你可以选择不动它——包一层,绕过去,新功能走新路径。

真正的问题不是"不还债会怎样",而是"你还了债能得到什么"。

大部分技术债务偿还计划高估了收益。重构一个模块,你的预期收益是什么?代码更整洁了,开发者体验更好了,将来改起来更方便了。但这些收益几乎无法量化。你很难说服老板说:"我花两个礼拜重构这个模块,将来的需求开发速度会提升百分之多少。"

而你需要放弃的成本是实实在在的:两个礼拜的业务产出,可能还有引入 bug 的风险。

这不是债务,这是投资。投资就得算回报,而不是用"还债"的道德感来绑架决策。

 

造轮子的真正代价不是开发,是走不掉

博客分类: 

每个技术团队都会经历这样一个时刻:现有工具不太顺手,自己做一个吧。

理由总是充分得无法反驳——市面上的组件库不支持我们这种交互模式,开源的表单引擎处理不了我们的动态字段逻辑,第三方的配置中心满足不了我们的合规要求。每一条拿出来都是刚需,每一条都指向同一个结论:我们得自己造。

没人会在这个阶段反对。因为反对意味着你要证明"现有的东西够用",而提出造轮子的人已经把"不够用"的场景摆上了桌面。你没办法反驳一个正在发生的痛点。

于是轮子开始转。第一周,大家很兴奋。第三周,初版出来了,确实比之前好用。第二个月,几个业务接入了。半年后,团队里有一半人的KPI跟这个轮子挂钩。一年后,最初写轮子的人提了离职。

这就是造轮子的故事。但今天我不想聊"该不该造"——这个问题已经被讨论过太多次,而且答案永远是"看情况"。我想聊的是一个更少人关注、却更致命的问题:造轮子最大的代价不是花时间开发,而是你再也走不掉。

 

开发成本只是首付

 

大部分人评估"要不要自己造"的时候,脑子里算的是开发成本。两个人做两个月,能搞定,成本就是四个人月。和采购方案比一比,好像更划算。这个算术本身没错,但它只算了首付。

真正的问题是后面几十年的月供。

设计系统的尽头是没人用

每个前端团队最终都会走上同一条路:建组件库,搞设计系统,画设计规范文档。

然后看着它慢慢死去。

不是夸张。我见过太多团队花大力气搭了一套设计系统,上线时热热闹闹,半年后只剩一个人在维护,一年后连那个人也转岗了。业务线该自己封装的还是自己封装,该重复的还是重复,设计系统变成了一座精美的鬼城。

这个现象太普遍了,普遍到已经不值得用"执行力不够"来解释。问题不在人,在设计系统这个事情本身的逻辑里。

 

建设者的幻觉

 

设计系统的出发点通常很理想:统一视觉规范,提高开发效率,减少重复劳动。听起来无懈可击。

但这个逻辑有一个隐含前提——业务足够稳定,需求足够规范,变化足够可控。

现实呢?

金融产品恨不得每周换一轮视觉,大促活动页面跟日常页面完全是两套设计语言,某个业务线因为合规要求必须用特殊样式,另一个业务线因为老板拍板要用新风格。你精心设计的 Button 组件有十二个 variant,但业务要的是第十三个。

设计系统的建设者往往是架构团队或基础设施团队。他们离业务远,有时间做抽象。但离业务远恰恰是问题所在——你抽象出来的东西,天然跟不上业务的节奏。

Serverless:复杂度没有消失,只是换了地址

2018年前后,Serverless在国内技术圈火了一阵。各大云厂商轮番布道,"按需付费"、"零运维"、"自动扩缩容"——每个口号都精准戳中了团队的痛点。我当时也投入了不少精力研究,毕竟谁不想不用管服务器?

几年过去了,当初那些All in Serverless的团队,相当一部分已经在往回走。不是Serverless不好,而是很多人慢慢意识到:当初以为消灭的复杂度,其实只是搬了个家。

 

那些承诺里没写的小字

 

Serverless的核心承诺有三条,每一条都有对应的现实版本。

"不用管服务器"——开发者只需写业务逻辑,基础设施平台托管。这对前端团队尤其有吸引力,写完函数丢上去就能跑,不用折腾部署和运维。但现实是,你很快会发现自己需要关注函数的内存配置、超时时间、并发限制、冷启动策略、VPC配置、IAM权限……这些不叫"服务器运维",但本质上还是在管基础设施,只是换了个仪表盘。

"按需付费"——代码不运行就不收钱,空转成本消失。但下一句没人告诉你的是:按需付费的反面是成本不可预测。一个函数死循环触发重试,一个爬虫突然疯爬你的API,一个配置错误导致无限调用——这些异常场景下的账单,会让你深切怀念固定成本的日子。

AB实验的真相:你以为的数据驱动,其实是数据背书

博客分类: 

先说一个我在做推荐系统 AB 实验架构时观察到的现象。

某个业务团队跑了一个月的实验,结论是新的推荐策略效果显著,CTR 提升了 12%,上线。三个月后回头看,整体转化率没变——用户只是提前点了,没有多买。没人复盘这件事,因为所有人都已经在那个"12% CTR 提升"的实验报告上签了字。

这不是个例。在金融产品场景里,我见过太多 AB 实验的结果被当作结论使用,而实验本身的设计、指标选择、对照组偏差,几乎没人认真审视。大家需要的不是真相,是一个可以写进周报的数字。

 

数据驱动这个词已经被用烂了

 

每家公司都说自己是数据驱动的。但如果你仔细看他们做决策的过程,会发现一个很典型的模式:先有结论,再做实验。

产品经理已经有了想法,设计已经出了方案,开发已经排了迭代——实验只是最后的"验证"。注意,不是"验证假设",是"验证决策"。这两者有本质区别。验证假设的时候你真心想知道答案,验证决策的时候你只想要一个通过。

这种心态不是某个人有问题,是整个系统的激励结构决定的。一个做了三个月的项目,谁愿意在最后一步承认实验结果不支持上线?于是你会看到各种"实验结果不显著但趋势向好"、"主要指标未达显著但次要指标表现优异"的结论。翻译成人话就是:实验没通过,但我们还是要上。

技术选型的隐性成本:你选的不只是框架,是未来三年的约束

每个技术团队都经历过这种场景:选型评审会上,几个方案摆出来,有人做性能对比,有人秀Demo效果,有人贴GitHub Star数。讨论半天,拍板一个,然后散会。团队满怀期待地开始新项目,三个月后开始骂娘。

这事儿我见过太多次了。选型时看到的都是优点,上线后暴露的全是成本。而且这些成本绝大多数在选型评审时根本没人提——不是不想提,是没人知道该提什么。

技术选型最大的陷阱不是选错了框架,而是你以为自己只选了框架。

 

你看到的是Demo,你看不到的是深渊

 

选型评审时,我们评估什么?功能列表、性能基准、社区活跃度、文档完整度。这些都是对的,也是不够的。

它们属于"可见成本"——你能在两小时的评审会上完成对比的东西。但框架的真正成本,从来不在这张表上。

你选的 Git 工作流,暴露了你的发布能力

每次团队讨论 Git 工作流,场面都很热烈。有人搬出 Git Flow 的严谨分支模型,有人推荐 Trunk-Based Development 的极简主义,还有人觉得 GitHub Flow 够用就行。辩论往往持续一个下午,最后投票选一个,README 里写上规范,全员执行。

然后三个月后你会发现:分支还是乱成一锅粥,release 分支上堆了二十个 cherry-pick,hotfix 从 master 拉出来合不回去,有人偷偷开了 feature branch 三周没合,还有人在 master 上直接 commit——"就改了一行,没必要开分支"。

工作流选错了?不,工作流没选错。是大部分团队在选工作流的时候,选的是自己向往的工作方式,而不是自己实际具备的发布能力。

 

Git Flow:为发布窗口而生的妥协

 

Vincent Driessen 在 2010 年提出 Git Flow 的时候,他的假设非常明确:你的软件有固定的发布周期。develop 分支积累功能,release 分支冻结测试,master 分支只放生产代码,hotfix 从 master 拉出紧急修复。每一步都有清晰的语义。

页面