技术动物园 — 指在项目中使用了多种异构语言、框架和工具,但没有统一策略的情况。在移动开发中,当一些模块用 Swift 编写,其他用 Objective-C,还有一些用 Kotlin,另一些通过 JNI 用 C++ 编写时,就会出现技术动物园。根据 TechBeacon (2024) 的数据,拥有 5 个以上不同技术栈的项目维护成本高出 40%。技术栈标准化不是官僚主义,而是降低运营成本的工具。
要点
技术动物园 — 指在一个项目或公司中使用了过多的不同工具来解决同一个任务。例如,三个不同的 HTTP 客户端(Alamofire、OkHttp、Ktor),两个状态管理器(Redux、MobX)和三个数据库(Realm、CoreData、SQLite)。
技术动物园与有意识地为不同任务选择不同工具之间的区别在于缺乏策略。如果团队 A 选择 React Native,团队 B 选择 Flutter,团队 C 选择 Kotlin Multiplatform,但没有共同决策 — 这就是技术动物园。多样性本身并无害,有害的是其不受控制。
项目中的每个新技术栈都会增加开发者的 认知负荷。为了有效工作,他们必须记住所有使用技术的细微差别。根据 Google (2024) 的数据,在不同技术栈之间切换上下文会使开发者的生产力降低 23%,与在统一技术环境中工作相比。
去中心化决策 — 主要原因。每个团队为自己的项目选择技术,而不考虑整体策略。后端团队使用 Kotlin,ML 团队使用 Python,移动团队使用 Flutter。单独来看这些决定是正确的,但放在一起就形成了技术动物园。
并购 — 当一家公司收购另一家时,技术栈会合并。两个系统以不同方式解决相同任务。例子:收购一家初创公司后,大公司获得了其基于 Ruby on Rails 的技术栈,而内部标准是 Java Spring。问题出现了:重写还是并行维护两个技术栈。
流行技术的变化 — 每个炒作周期都会增加一个新的技术栈。2015 年大家都在写 AngularJS,2017 年写 React,2020 年写 Svelte。缺乏纪律的情况下,项目会积累不同时代的层次。仍在运行但未维护的 遗留模块 增加了多样性,却无法快速消除。
新开发者的入职 变成了学习 5 种以上不同技术而不是一种。新手不是花一周时间熟悉项目,而是花一个月时间掌握所有使用的工具。达到生产力的时间 与项目中的技术栈数量成正比增加。
上下文切换 — 一天内处理 3 个以上技术栈的开发者每次切换后要花费多达 30% 的时间来恢复上下文。根据 加州大学(2023) 的数据,每次切换后需要 23 分钟才能恢复到初始生产力水平。每天 5 次切换 — 几乎浪费 2 小时。
安全风险 — 每个技术栈都需要更新、监控漏洞和了解最佳实践。团队不可能同时成为所有技术的专家。依赖疲劳 — 当使用的库数量超过团队跟踪和更新它们的能力时 — 对产品安全构成直接威胁。
基础设施复杂性 — CI/CD 必须为每个技术栈进行配置。不同的构建系统(Gradle、CocoaPods、npm、pip),不同的环境要求。基础设施团队花费资源来维护多样化的流水线,而不是改进它们。
技术栈盘点 — 编制所用技术的完整清单:语言、框架、数据库、CI/CD、监控系统。对于每种技术,注明项目/模块数量、支持级别和专业水平掌握该技术的开发者数量。
技术雷达 — ThoughtWorks 的方法,将技术分为 4 个象限:采用、试用、评估、暂缓。采用 — 推荐的技术栈,试用 — 实验性的,评估 — 正在评估中,暂缓 — 不推荐使用。例子:Flutter 在采用中,React Native 在暂缓中 — 团队知道该选择什么。
维护成本指标 — 估算每月用于维护每个技术栈的工程小时数。如果一个技术栈消耗了 10% 的资源但只用于 2% 的模块 — 它就有被替换的候选资格。技术栈的 热力图:"项目数量" vs "维护复杂度" 坐标直观地显示问题区域。
架构决策记录(ADR) — 记录架构决策并说明技术选择理由。每个 ADR 包含背景、考虑的替代方案和选择理由。Michael Nygard (2022) 推广了这种方法,如今 ADR 已成为控制技术多样性的团队的标准。
技术审查委员会 — 由资深开发者组成的委员会,负责批准项目中的新技术。决策基于以下标准:与现有技术栈的兼容性、社区支持、迁移成本、人才可用性。Spotify 自 2018 年起使用类似的委员会。
新项目网关 — 规则:每个新服务或模块只能使用已批准的技术栈。例外情况可通过 ADR 并说明理由实现。例子:新的微服务只有在团队证明 Java 不适合该任务时才能用 Kotlin 编写。禁止无限制地使用任何技术。
阶段 1:冻结 — 停止在不受支持的技术栈上开展新项目。为暂缓象限中的每个技术栈设定终止日期。新功能只在已批准的技术栈上编写。遗留模块 继续运行但不再开发。
阶段 2:整合 — 为每个任务选择一个工具。一个 HTTP 客户端、一个状态管理器、一个数据库。替代技术栈上的模块按优先级计划迁移。绞杀藤模式 — 在不停止系统的情况下进行替换的主要方法。
阶段 3:迁移 — 每个冲刺团队分配 20% 的时间将关键模块从过时技术栈重写为已批准的技术栈。目标架构 在文件中确定,未经委员会决定不得更改。过程根据技术动物园的规模持续 6 到 24 个月。
// 之前:一个项目中有3个不同的HTTP客户端
class HttpClientResolver {
def resolve(moduleName) {
switch(moduleName) {
case "payments": return new OkHttpClient()
case "chat": return new KtorClient()
case "analytics": return new RetrofitClient()
}
}
}
常见问题
没有明确的界限,但经验法则是:如果项目中有超过 3 种不同的编程语言,或超过 5 种解决类似任务的不同框架 — 这就是技术动物园。关键标志 — 开发者花费超过 20% 的时间在不同技术栈之间切换,而不是编写代码。
多样性在有意识的情况下是有益的。不同的任务 确实需要不同的工具:Python 用于机器学习,Kotlin 用于 Android,Swift 用于 iOS。技术动物园的问题在于重复:一个任务用 3 个框架。为多样性而多样性会增加维护成本,而对业务没有好处。
不要禁止 — 要讲道理。使用 成本效益分析:展示维护该技术栈花费了多少时间,以及迁移将带来什么好处。建议使用带有评估象限的技术雷达来评估新技术。团队可以研究新技术栈,但实施决策是客观做出的。
不要试图一次性重写所有内容。冻结阶段 — 阻止技术动物园的增长。优先级排序 — 选择 2–3 个技术栈在未来 6 个月内进行迁移。绞杀藤模式 — 逐个替换模块。一年后,技术动物园将在不中断产品的情况下缩小一半。
技术雷达 — 已做出决策的可视化地图。采用 — 我们在用,试用 — 我们正在一个项目中尝试,评估 — 我们在研究,暂缓 — 我们不用。团队可以看到哪些技术已获批准,哪些不推荐。雷达根据实际经验每季度更新一次。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。