引子:一句耳熟的话
“你要从研发的角度来思考问题。”
做 DevOps、运维、质量的人,大概率都听过这句话的某个变体。它通常出现在一场僵持的讨论里,作为终结话题的筹码被甩出来。
这次它出现的场合是:研发想在 CI 流水线里硬编码一个 nginx 代理地址,DevOps 不同意。听起来是一场再普通不过的技术分歧——但它最终演变成了一场波及全公司办公网的带宽危机。
我完整旁观了这个案例的发酵过程。事后复盘,我发现它几乎是一个教科书级的样本:一个微小的架构缺口,如何在组织动力学的放大下,一步步变成全员皆输的系统性失败。 而每一方的每一步,单独看都"有道理"。
值得写下来。
第一幕:起因——一堵没有门的墙
背景很简单:
- 公司实行内外网隔离,这是安全团队的架构决策,本身无可指摘
- DevOps 上线了一个 CI 制品缓存服务,放在内网服务器区——因为安全侧无法提供开发环境到服务器区的通路,缓存只能放那里
- 研发环境访问不到这个缓存。而缓存服务存在的全部意义,就是让构建依赖"从公网拉一次,之后所有人走内网"
第一个关键事实:安全策略交付了"墙",没有同步交付"门"。
内外网隔离是业界极其普遍的架构,“隔离之后研发构建依赖怎么获取"是它的标准伴生问题——受控代理、分区 DNS、研发区缓存副本,成熟解法一抓一大把。但这些都没有被规划。墙先砌了,门没人管。
第二幕:收缩——有责无权的平台
按职责划分,CI 平台(流水线、runner、制品服务)归 DevOps 管,网络和安全归运维(安全)管。
理论上,DevOps 应该为研发把通路问题推动解决。实际上他的选择是:把职责范围收缩到内网服务器区,不管研发环境。
这个选择看起来像推卸,拆开看却完全理性:
- 给研发开跨区通路 = 找运维反复沟通、申请、走白名单,而运维水平有限、沟通费劲
- 更重要的是,DevOps 在组织里没有话语权——去谈也谈不下来
- 做成了没有收益记在头上,做不成沟通成本沉没
- 不做,代价不由自己承担——构建慢,疼的是研发
管理学有条铁律:责任大于权力时,责任必然收缩,收缩到权力够得着的范围。 组织给了 DevOps 对交付链路的责任,却没给他撬动基础设施的 authority。他的退缩不是性格问题,是结构的必然输出。
这是一种沉默的责任收缩:没有任何人宣布"研发环境的构建体验没人管”,它只是悄悄地变成了没人管。责任真空从不官宣。
第三幕:绕行——话语权开门
研发撞墙了。他们的选择是:自己动手。
凭借比 DevOps 强的话语权,研发直接找运维磨。运维开出了门——而且是两扇:
- 一个 nginx 代理 + 白名单,通向内网缓存
- 公网访问权限
研发一开始想把代理地址硬编码进 CI,被 DevOps 拦下(“会增大排错难度、造成耦合”)——这个技术判断完全正确,环境特定的基础设施知识不该混进流水线定义。但随后研发做了一个更省事的选择:两扇门里,公网那扇零沟通、零协调、即用即走。于是 CI 直接改成了公网的源。
注意这里的一个细节,它后来被证明是整个故事的钥匙:研发不是没得选,是内网那扇门"难走"——要依赖一个沟通费劲的运维去维护,出了问题没人接。公网门虽然又贵又不安全,但它不需要和任何人打交道。
第四幕:反噬——开门的人被自己的门噎住
结局来得很快,且完全可预测:
- 全公司只有一条 100M 出口带宽,服务器和办公共用
- 每个构建节点、每次构建,都在从公网全量重复拉取依赖——Docker 基础镜像几百 MB,npm/Maven 依赖动辄 GB 级
- 几个并发构建就能把 100M 打到归零
- 办公网陪葬:视频会议卡、网页打不开,全公司都在抱怨
- 天天吵带宽不够的,是运维自己
画面至此完成了闭环:缓存服务在旁边闲置,而全公司正在为"不用缓存"付出带宽、构建速度和供应链安全的三重代价。研发绕了一大圈,最终精确落在了这个系统被设计出来要避免的那个状态上。
而运维的处境用一句话概括:他在为自己开的那扇门交过路费,旁边那扇更安全、免费、已经建好的门在积灰。
解剖:每一层失败都有自己的名字
这个案例的每个环节,在方法论上都有明确的对应概念。逐层剥开:
1. 局部最优的纳什均衡
安全的 KPI 是隔离强度,门越难开越好;DevOps 的激励是别给自己揽没收益的活;研发的激励是构建立刻能跑。每个人都在自己的激励下做了"正确"的选择,合起来是一个糟糕的系统。系统思维第一定律:当每个人都是理性的而结果是坏的,问题在结构,不在人。 这也是为什么三方吵架永远吵不出结果——局部理性的各方无法自发跳出局部最优。
2. 外部性:谁不付账单,谁不优化
研发直连公网,对研发是免费的;带宽账单开在运维的表上。成本归属和决策权分离时,决策者会理性地无视成本。研发不换源不是固执,是结构上没有任何人给他们换的理由。
3. 权责不匹配,责任必然收缩
平台团队(DevOps)有责无权,于是职责范围悄悄收缩到权力够得着的边界内。你不能要求一个人为他调不动的资源负责。
4. 话语权驱动架构(Conway 定律的权力版)
Conway 定律说系统架构复制组织的沟通结构。这个案例展示了它的变体:当跨团队沟通靠政治资本而非流程时,架构就复制权力结构。 门为谁开、开成什么样,取决于谁去谈。研发话语权强,他们只需要"能通",于是开出来的门是一个没有监控、没有文档、没有标准接入方式的裸代理——一个影子基础设施。对于手握安全职能的组织,这尤其刺眼:跨区通道的开辟如果实质上由谁嗓门大决定,那安全治理就是形式治理。
5. 门的可用性定律
这是全案最核心的发现。回看每一环,所有角色在绕开同一个东西——找运维办事的摩擦成本:
| 角色 | 行为 | 在绕什么 |
|---|---|---|
| DevOps | 职责收缩,“不想管” | 绕开找运维开门的沟通 |
| 研发 | 两扇门里选公网 | 绕开依赖运维维护的内网代理 |
| 运维 | 开了更差但更省事的公网门 | 绕开自己维护受管代理的工作量 |
三方行为各异,驱动力是同一个:合规路径的协调成本高于绕行成本,于是绕行必然发生。 这不是任何人的性格缺陷,是水动力学——谁在那个位置都会这么流。DevOps 的职责收缩本质上也是一次绕行,只不过他绕的是责任,不是流量。
由此得到这条普适定律:
门不仅要存在,还必须比墙缝好走。门难走,就等于没门。
一个需要看脸色、反复求人、出了故障没人接的"官方通道",在功能上等价于不存在。安全团队砌墙时如果只关心墙的高度,不关心门的通行体验,那所有的墙最终都会被流量(和人心)绕开。
升华:这个案例真正教会我们的事
一、技术方案从不稀缺,稀缺的是权责对等的交付。
问题在第一天就有完整答案——那个内网缓存服务。它缺的从来不是技术,是一次跨越三个团队边界、有人负责的接入。组织里大量"无解"的问题都是这样:方案躺在货架上,卡在没有任何一方同时握有痛感、权力和责任。判断一个组织健康度的简单方法:看它的问题是"被解决"的多,还是"被绕过"的多。
二、被绕过的问题不会消失,只会连本带利地延期到货。
绕过内网缓存的代价,几个月后以带宽账单的形式回来了;如果继续不管,下一次会以供应链安全事故、凌晨告警的形式回来。技术债的利息从不缺席,它只是换着科目记账。
三、“从谁的角度思考"是个错误的问题。
这句话预设了视角是零和的。真正正确的角度只有一个:端到端价值流的角度。研发要构建快、运维要带宽稳、DevOps 要流水线可维护——这三个诉求在内网缓存这个方案里全部同时满足,它是一个没有任何人受损的帕累托改进。三方吵了几个月的东西,技术上从来就不是取舍,只是没有一个角色有为全局负责的立场。
四、平台的意义,是让正确的路成为最好走的路。
Platform Engineering 的核心信条是 paved road:不要靠流程拦人,也不要靠口号劝人,要让"正确的事"成为"最容易的事”。硬编码、直连公网、影子设施——这些从来不是靠批评能消灭的,只能靠提供一条阻力更小的正路来消灭。反过来说,每一个在产环境里泛滥的反模式,背后几乎都站着一个缺失或难用的官方能力。
五、给管理者的最后一句话。
这个案子逐层追责,研发、DevOps、运维各有一笔小账,但最终的根因只有一个:一个握着所有钥匙、开门慢、维护弱、沟通贵的守门职能,加上一个没有把权责配置对等的组织结构。 当一件正确的事需要跨三个团队、而没有任何一方有完整权责时,它的默认结局不是"被做好",而是"被绕过"。
而修复它的起点,也朴素得出乎意料——不需要组织架构调整,不需要运动式整改,只需要让一个握着钥匙的人自己感到疼。这个案例里,带宽被打爆的运维,恰好就是那个痛点、权力、责任三点终于重合的位置。
系统等了这么久,就是在等这个时刻。
结语
回到开头那句话。下次再听到"你要从研发的角度来思考问题"时,也许可以这样回应:
“我们可以讨论角度。但先回答一个问题——这个功能半夜挂了、带宽打爆了、流水线红了,是谁爬起来修? 谁承担后果,谁的声音就该进设计阶段。”
以及,对所有砌墙的人:
墙的高度决定不了安全水平。 门的好走程度,才决定。
(案例已脱敏。如果你的组织里也有一个闲置的缓存服务、一条天天被打爆的带宽、和一场永远在"换位思考"的争吵——欢迎对号入座。)