需求驱动 vs 技术驱动:你在为谁写代码
一、一个让我后背发凉的提问几年前我做过一个内部管理系统。日活两百多人峰值并发撑死几十个请求。但当时的我刚啃完一摞架构书满脑子都是高可用“可扩展”。于是我给它配了微服务拆分、消息队列、独立缓存集群、服务注册中心——一整套豪华全家桶。上线后系统确实很先进。代价是三个人维护一套本可以一个人搞定的东西每次改个表单字段要动四个服务线上排查问题得在五个日志源里翻来翻去。半年后接手的同事一句话点醒我“这套东西解决的是我们根本没有的问题。”后来我的同门阿陶学长说过一句更扎心的话。他评价某个团队的技术栈时讲“组件不断追新但并发根本没到那个程度。”短短一句把技术驱动的病灶剖得清清楚楚——我们升级 Redis 集群、引入 Kafka、上 K8s不是因为业务压力逼到了那里而是因为这些东西出现在了我们想写进简历的清单里。这就引出了今天的核心问题你写下的每一行代码、做的每一个选型到底是在为客户的真实需求服务还是在为自己的技术趣味服务二、两种驱动力本质是两套出发点技术驱动和需求驱动区别不在于用不用新技术而在于决策的起点是谁。技术驱动起点是我想用什么。看到一个酷炫的框架、一种时髦的架构先决定用它再回头找理由说服自己业务可能会需要。需求驱动起点是客户被什么卡住了。先把业务约束并发量、成本预算、交付时间、团队能力摆在桌面上再让这些约束去筛选技术方案。维基百科对过度工程Over-engineering的经典定义是以远比必要更复杂的方式设计产品而此时存在一种同样高效有效、却更简单的方案。而开发者 Paweł Głogowski 给了一个更精准、更刺痛的版本过度工程就是为你并不存在的问题写代码Code that solves problems you don’t have。这正是技术驱动最危险的地方。它不是做错了而是做了不该做的——你投入的每一分精力都没有对应到任何一个真实的用户痛点上。三、不只是小团队的病大厂也踩过同一个坑你可能会想过度工程是新手才会犯的错成熟团队不至于。恰恰相反。Stack Overflow 曾经是最具代表性的反例。他们的架构极为无聊——核心是少量高配物理服务器 SQL Server IIS几乎没有任何时髦的分布式组件。这套土得掉渣的架构长期以每天处理数亿次 SQL 查询、支撑数千万月活用户的方式稳定运行运维团队只有个位数。Stack Overflow 的工程师们甚至写过文章自豪地介绍他们不用 Kubernetes不用微服务不用 NoSQL——因为他们的业务需求根本不需要这些。真正的技术自信是在完全清楚备选方案的前提下选择了更简单的那个。另一个更直白的教训来自国内工程圈广为流传的反思“一个日活只有几百人的小型 SaaS却采用了微服务架构、容器化部署、服务网格等复杂技术栈开发团队花在选型、环境搭建、运维上的时间远多于真正用于业务功能开发的时间。”腾讯云技术团队把这类问题归结为技术债务的重要型——架构设计与实际业务需求不匹配——注意他们没说架构不够先进说的是不匹配。这两个例子揭示了同一个道理架构没有先进落后之分只有匹配不匹配之别。再看国内的视角。腾讯云技术团队在《研发团队必看的技术债务管理》中,把技术债务按紧急程度分级,其中重要型债务的典型表现就是**“架构设计与当前或未来业务需求不匹配”**——注意,他们没说架构不够先进,而说的是不匹配。一篇广为流传的工程反思文章也指出了同一个现象:“一个日活只有几百的小型应用,却采用了微服务架构、容器化部署、服务网格等复杂技术栈,开发团队花在选型、环境搭建、运维上的时间,远多于真正用于业务功能开发的时间。”数据层面同样值得警醒。2024 年我国技术合同成交额突破 9000 亿元约 9153.3 亿元技术投入的总盘子在飞速膨胀。盘子越大为技术而技术的浪费就越触目惊心——因为每一次错配的选型乘以这个量级都是天文数字的工程师时间被烧掉。四、把客户驱动意识装进决策回路那么怎么避免成为那个为不存在的问题写代码的人关键是建立一个第一过滤器在任何技术决策摆上台面前先让它过一遍客户/业务约束这道闸。下面这张四象限图是我后来给自己定的选型自检表横轴是技术方案的复杂度纵轴是业务的真实复杂度与并发压力。判断逻辑很简单务实区低业务 简单方案大多数项目的真实归宿。一个单体应用 一台数据库 简单部署足以支撑早期业务跑很久。这里不是将就而是把资源留给真正创造价值的功能开发。匹配区高业务 复杂方案当并发、数据量、可用性要求真实地涨上来复杂架构就有了买单的人——这是健康的技术投入。瓶颈区高业务 简单方案简单方案扛不住了这才是升级架构的正确时机。被业务推着走而不是被趣味拉着走。过度工程区低业务 复杂方案阿陶学长说的组件追新但并发没到那个程度正落在这里。表面光鲜本质是纯粹的成本黑洞。落到日常我会用三个问题逼自己回答“这个技术解决的痛点客户/业务今天真的存在吗”如果答案是将来可能那十有八九它现在不该上——记住那个递盐的笑话别人只是想要你递一下盐你却花二十分钟去开发一个可以递任意调味品的通用系统。“有没有更简单、同样有效的方案”如果有复杂方案需要拿出额外收益来证明自己值得这份复杂度。“这份复杂度未来谁来维护、用什么成本维护”技术债的利息从你提交那一刻就开始计算。这并不是要你拒绝学习新技术。恰恰相反——新技术依然要学、要深钻但学习的归宿应该是技术储备而不是直接倾倒进生产系统。个人成长的赛道和项目交付的赛道要分开跑。用业余时间和实验项目去追新用生产项目去对客户负责这两件事都重要但绝不能混为一谈。五、结尾技术的生命力长在真实痛点里回到最初那个让我后背发凉的提问——你在为谁写代码技术驱动的诱惑是真实的它能满足我们的好奇心、装点我们的简历、给我们走在前沿的成就感。但 Stack Overflow 用几台物理服务器扛住数亿次日查询的故事提醒我们脱离业务约束的先进是最昂贵的自我感动。需求驱动也不意味着平庸或保守。它意味着你把对技术的热爱校准到了真正能产生价值的方向上——你依然在解决难题只不过这些难题是客户真实遭遇的难题而不是你为了过瘾凭空发明的难题。所以把客户驱动意识当成你技术决策的第一个过滤器吧。在敲下第一行代码、画下第一个架构图之前先问一句这是业务的需要还是我的需要技术只有落地、只有解决了真实的痛点才有生命力。否则再优雅的代码也不过是写给自己看的、终将腐烂在仓库里的孤芳自赏。一句可带走的话别为不存在的问题写代码——你写代码是为客户不是为简历。