现代化传统企业软件面临的挑战 | AI生成和翻译
Question: 为什么团队(尤其是拥有 Legacy projects 的大公司团队)更换工具、升级 Library 或 Framework 特别困难?
Answer:
没错 —— 个人面临的困难在团队和组织层面会成倍增加。原因如下:
个人习惯 × 团队规模 = 指数级阻力
团队中的每一位 Developer 都有自己的肌肉记忆、Mental models 和舒适区。要让团队转型,你不是在说服一个大脑,而是在同时说服 N 个大脑,且每个人都有不同的 Sunk costs 和风险承受能力。
Legacy Project 的乘数效应
Legacy codebase 增加了完全不同层面的引力:
1. 未知的 Dependencies 没有人能完全搞清楚现在的依赖关系。升级一个 Library 可能会触发连锁反应,导致几年前由早已离职的人编写的 Module 崩溃。
2. 缺失 Tests / 缺少安全网 Legacy projects 通常 Test coverage 很低。没有安全网,任何改动都显得极其危险。团队会理智地选择冻结技术栈,而不是冒险引发 Production 环境事故。
3. “能跑就别动”的文化 这在大公司中几乎是通用的。系统正在 Production 环境运行并创造收入 —— 组织内部存在巨大的压力去不要搞坏能赚钱的东西,即使它构建在十年前的依赖项之上。
4. 知识孤岛 (Knowledge Silos) 理解原始 Architecture 的人可能已经离开了。留下的团队继承的是他们畏惧的代码,而不是他们理解的代码。升级需要理解,而理解需要没人愿意分配的时间。
组织与企业文化层面
除了代码本身,大公司还增加了:
| 因素 | 影响 |
|---|---|
| 风险规避 (Risk aversion) | 追求稳定性;搞坏生产环境的大胆升级会导致你被解雇 |
| 预算周期 | 升级需要审批、人力和时间 —— 而这些都是稀缺资源 |
| 合规与审计 (Compliance & audits) | 更改经过认证/批准的 Tech stacks 需要重新认证 |
| 多个 Stakeholders | Infra、安全、QA、产品部门都拥有否决权 |
| 优先级压力 | 在 Sprint planning 中,业务功能永远优先于技术升级 |
技术债的复利效应
你每一年不进行升级,差距就会进一步拉大:
- 新版本与旧版本的差异越来越大
- Migration 迁移指南变得过时
- 社区对旧版本的支持逐渐消失
- Security vulnerabilities 安全漏洞不断累积
- 新员工不熟悉旧技术栈,老员工不熟悉新技术栈
这形成了一个恶性循环 —— 等待的时间越长,升级就越困难,于是你等得更久。
为什么大公司特别容易陷入困境
小型 Startups 可以推倒重写。大公司通常无法承受让船停下来整修引擎的代价。一个经典的隐喻:
“我们是在飞行过程中重建飞机。”
这就是为什么你仍能看到银行运行着 1970 年代的 COBOL,或者企业应用锁定在 Java 8,或者内部工具构建在几年前就已 Deprecated 的框架上。这并非因为无知,而是对规模化变革产生的实际成本和风险所做出的理智(尽管痛苦)的反应。
什么才是促使改变的真正原因
就像个人一样,团队通常只有在以下情况才会行动:
- 出现 Security vulnerability 安全漏洞,迫使进行紧急升级
- 供应商 停止支持 (例如 Python 2 EOL, Log4j 危机)
- 新项目 (New project) 采用了现代技术栈并证明了其可行性
- 新技术领导上任,并带有现代化的授权和预算
- 旧的技术栈字面上无法支持所需的业务功能
否则,惯性通常会赢得胜利 —— 几乎每一次都是如此。