一条新开的跨境线路要不要多备一倍带宽?备了,月底 95 计费峰值可能根本跑不到,多付的端口费和过点费是实打实的成本;不备,赶上一次业务突发或对端抖动,客户体验立刻崩,投诉和退单跟着来。做这个决定的时候,我们团队里不少人都是非科班出身、边做边学过来的,这些年里反复在"成本"和"体验"之间来回权衡,产品也从套框架、买主题、上线测试,一路改版重构迭代过来。走到某个阶段你会发现,过去每一版积累下来的东西,既是今天的底子,也可能是三体人的智子——悄悄锁死了继续往前的路。
我们很清楚一件事:不前进,就一定会死。市场竞争、技术演进、产品迭代都是逆水行舟,没有躺平的余地。而陪着产品一路成长的老同事,在现有架构越维护越吃力的时候,往往都盼着来一个"破壁者"。但下一次迭代如果方向错了,它本身就是个陷阱,很容易把人拖进某种困境;只有跳出来,才有可能站上更高的那级台阶。
互相指责,其实是一场博弈
先看一组我们都不陌生的抱怨——在测试和开发之间:
1. 关于流程:提测单里不写测试范围,或者寥寥几句跟没写一样!系统里提的 bug 开发不及时处理,也不看测试邮件!
2. 关于标准:为什么开发写完代码都不自测就扔过来?测试提的 bug 不能复现,优先级还设成 major!
3. 关于资源:谁在测试环境调试?谁动了我们的测试数据?我们开发环境没数据,不用你们的用谁的?
4. 关于态度:测试什么都不懂……跟你说不清楚,用户根本不可能这样用。你们排计划根本不考虑测试,三天,三天怎么可能测得完!
把角色换一换,同样的对话会在市场和后端之间、实施和研究之间、需求和设计之间一遍遍重演。表面上是脾气和态度问题,往下挖,它是一个结构性的博弈。
什么是囚徒困境
囚徒困境是博弈论里的经典模型。1950 年由梅里尔·德莱希尔提出,后由塔克(Tucker)定型完善。
两名罪犯作为嫌疑人被抓,隔离关押候审,各自在想招供还是不招。
若二人都不招,各判半年;
若一人招供、另一人不招,招供者立功释放,不招者判 10 年;
若二人都招,各判 2 年。
因为无法沟通,二人困惑不已。
在企业里,同样的结构到处都是:
一名经理,数名员工;前提是经理比较苛刻。
若所有人都听从吩咐,待遇一样,但所有人都超负荷工作;
若某人不听、其他人听,则此人下岗、其他人继续;
若所有人都不听,则经理下岗。
但员工之间信息并不透明,谁都怕"别人听话、自己不听"而出局,于是只能一起继续扛着繁重的活。回到测试和开发:每一方都选了对自己当下最"安全"的策略——少写一点、少自测一点、把锅先甩出去——结果是两方都陷在低效里,谁都没赢。这就是困境的内核:个体理性的选择,叠加出集体的糟糕结果。
上帝视角不该只长在老板眼里
《教父》里有句台词:「花一秒钟就看透事物本质的人,和花一辈子都看不清事物本质的人,注定是截然不同的命运。」系统思维,大致可以类比成"用看全局的视角去看一件具体的事"。
就工作本身而言:工程师通常执着于某段代码、某个功能怎么实现;而往上一层看到的是,这个功能能不能迎合市场、留住客户、卖得出去,以及实现它要花多少成本、时间和资源。放到我们这行就更直接——给一条线路加一跳中转,技术上也许是最优路径,但过点费谁来摊、跨省比例会不会超、净结入是正是负,这些不进到视野里,“最优"就只是局部最优。
就团队氛围而言:我们没法要求每个人都有足够的视野、格局和沉淀去"聚焦核心"或"高屋建瓴”,也不可能把每件事都想得面面俱到。但"宰相起于州部,猛将发于卒伍"——今天不敢想、不往深里想,看上去一刻没停,最后却发现:要么交付的东西和最初的用户需求南辕北辙,捡了芝麻丢了西瓜;要么改好了 A,引入了 B 的隐患,顾此失彼。到这一步,跟测试解释"设计如此",跟老板讲"资源有限、只能妥协",跟客户强调"客观条件",就滑进了"互相指责、借口推脱、一起摆烂"的囚徒困境。
而在这个困境里,员工、老板、公司是双输,而且会一直输,除非局面被真正改善。逻辑很朴素:活干得累、产品不出彩、公司在市场上处于劣势、效益差、工资低、幸福感更差,于是下一版、下一个产品更糟……一路死循环直到公司消失。
在这段时间里,公司和老板输的是可量化的经济损失。但工程师输的是什么?是职场的黄金时间,是职业生命周期。而职业生命周期,恰恰是一个工程师能不能成长为资深工程师、架构师的起点。起点上就输了,后面基本不用再谈。
系统的定义
德内拉·梅多斯在《系统之美》里给系统下的定义是:
系统是一组相互关联的要素,它们以某种方式组织起来,从而实现某些功能。
照这个定义,我们可以把任何一个系统拆成四层来看:
- 环境:系统运行的环境——硬件、操作系统、使用场景。
- 要素:系统里最核心的组成部分是什么。
- 互联:要素之间怎么连接,关系是什么,输入输出走哪条路径。
- 目的:产品最终要达成什么。程序和功能本身都不是目的——帮用这套东西的人解决某个问题、达成某个目标,才是系统设计和产品研发真正的根。
拿我们自己的 CDN 调度来套一遍:环境是多地多运营商的节点、各不相同的线路质量和计费口径;要素是节点、端口、带宽、业务流量;互联是调度逻辑把哪股流量导到哪个节点、哪个端口,确保低价端口跑满、高价端口只跑到 95;目的不是"让调度系统跑起来",而是在成本可控的前提下,把用户的访问质量稳住。只盯着任意一层做优化,都会在别的层上还回去——削峰调度把成本压下来了,却可能把体验压到线下;一味追体验,月底的结算单又会教你做人。
研发和运维里的系统思维
把这套框架落到日常,设计一个功能或一条链路时,至少要同时想到几个面:功能本身、接口与集成、可靠性、性能、交互、安全。少想哪一面,这一面迟早会在生产上找回来——可靠性设计缺位,就是某个凌晨的故障;安全设计缺位,就是某次被打穿的高防。
测试这一环在智能化系统里尤其难。难在几处:算法性能、系统性能、可靠性、安全性——每一项都不是跑完一轮用例就能盖棺的,它要在真实流量、真实对端、真实突发下反复验证。这也正是为什么我们反对"测试什么都不懂"这种话:测试看到的"现象",恰恰是系统在真实环境里暴露出来的那一层。
难的事情才有价值,但别把难度转嫁给用户
做产品搞研发,总会遇到、也总会遗留一些难题和痛点。它们可能是行业通病,也可能是自身缺陷。但从宏观看:行业有痛点,产品才有卖点;缺陷还在,产品就还有提升空间。真正的技术难题被解掉,对工程师的成长、对产品、对公司都是加分。
但要警惕另一个方向——别设计出用起来特别复杂、技术难度堆得很高的东西。工程师和产品经理都容易迷恋这种功能,其中一部分或许是必须的,一部分可有可无。即便它必须存在,在交互和界面上也要化繁为简:复杂度该留在系统内部,而不是甩给用户。这里还有个顺带的好处——先把完整系统想清楚,你更容易拎出最关键、最有影响力的部分,减少项目推进中的方向漂移;而且很多东西不必从零造,一致的交互模式和已有组件能省下大量时间,核心骨架一旦立住,后面的添砖加瓦就轻松多了。
我们不搞甩锅文化
最后这条,是我们做复盘时反复强调的底线:
- 现场观测到的是现象,不针对某个具体的人或某个功能模块。
- 现象不等于故障。不好的现象,说明我们有提升的空间和不足——有提升,才有未来。
- 把现象的成因落实到某个环节、某个人,不是为了指责或处罚个体——针对个人的处罚本身不值一提,真正重要的是那个环节为什么会这样。
- 竞争环境就是这么残酷:只有品质过硬、可靠、性能到位,用户才会满意、才会买单,公司才有前途。
跳出囚徒困境没有捷径,它要的不是谁更努力地扛着,而是让信息透明、让每个环节都能看见自己在整个系统里的位置和目的。一旦大家看的是同一张全局图,“互相指责"的博弈就失去了土壤——因为这时候,合作才是对每个人都更优的选择。
