多版本并存会瓦解一致性
别名: 双版本并存 · 两套按钮 · version skew · 并存瓦解
概念解释
产品里同时跑着旧按钮和新按钮,表面上像平滑过渡,实际上已经没有「按钮」这一件东西。两套 API、两套焦点行为、两套主题挂钩,使用方按自己的升级速度各拿各的。双版本并存(dual-version)一旦没有硬边界,就会从战术变成架构:一致性不是慢慢跟上,而是被两套语法同时教坏。
它针对的是野外同时可进口的两份实现,不是「破坏要有路径」,也不是「废弃要写日期」。路径和日期都可以很漂亮,只要两份实现无限期共存,人仍然学不会哪一份才算数。
机制
一致性依赖「同一名字指向同一份合同」。导入路径一分成 pkg/button 和 pkg/button-next,合同就裂了。团队为了赶发布会停在旧的上;另一团队为了用新槽位会切到新的。两套在页面上相遇——对话框用新的,页脚用旧的——间距、圆角、禁用的焦点处理开始分叉。设计师看全站走查时无法判断偏差来自实现错误还是版本差,走查成本翻倍,结论却更弱。
并存还会污染贡献:缺陷要不要两头修、新变体要不要两头加。维护者通常只修新的,旧的带着已知缺陷继续被高流量页面引用,于是「官方」看起来像一套,用户碰到的是带伤的那套。没有退役压力的并存不是桥梁,是永久的双轨。
边界
有意的长期双轨(稳定通道与实验通道、桌面包与移动包)如果名字、文档和安装入口从第一天就分开,那是产品线划分,不是同一按钮的两个年纪。构建期把旧导出编译成新实现的单份产物,运行时只有一份,也不算并存。第三方插件钉死旧主版本、产品自己无法改它的依赖时,并存是外部约束,要在边界上隔离(插件沙箱),不能让它和主应用的新按钮在同一层 DOM 里混排。演示环境和文档站为了对照故意并排渲染,必须标成对照,不能当产品模板复制。
怎么落地
- 给并存设上限:第二份实现只允许作为带期限的导入路径存在,主文档和脚手架只示范一份。
- 主应用禁止在同一页面树里同时导入新旧;构建或 lint 碰到混用就失败。
- 缺陷修复默认打在将被留下的那一份,旧份只接安全补丁,并在变更说明里写明「此缺陷不修旧份」。
- 验证:全库搜索该组件的导入路径,统计还在用的不同实现数。主应用里大于一,一致性已经在裂。把混用页并排截图,间距和焦点差应能追到两套合同,而不是「有人写错了样式」。