如何做技术选型决策——一个可复用的决策框架
如何做技术选型决策——一个可复用的决策框架
适读人群:需要做技术选型或者参与技术选型的工程师 | 阅读时长:约17分钟 | 核心价值:一套可复用的技术选型决策框架,不是"选什么",是"怎么选"
我见过两种技术选型。
第一种:团队里有个技术大牛,最近在研究某个技术框架,觉得很好,然后在一个新项目里推动用上了。最终的选型理由通常是"XXX最近很火"或者"我觉得挺好用的"。
第二种:团队列了一个评估矩阵,从多个维度打分,收集了多方意见,最终做出有充分理由支撑的选择,并且把整个决策过程记录下来。
第一种在小公司或者技术探索项目里未必是问题,但在有一定规模的技术团队里,它会带来一些麻烦:决策不透明(别人不知道为什么选这个)、无法回顾(三个月后如果出了问题,说不清楚当时的决策依据)、难以复用(下次面对类似决策,还得从头来过)。
今天我想讲的是第二种——一个可以被反复使用的技术选型决策框架。
技术选型不只是技术问题
很多人把技术选型纯粹看成一个技术问题:哪个框架的性能更好?哪个数据库的功能更丰富?
但在实际工作中,技术选型的失败,很少是因为"选了一个技术上更差的方案",而更多是因为忽略了非技术因素。
常见的非技术因素:
团队学习成本:一个技术再好,如果团队里没有人用过,引入之后需要半年才能用得熟练,那这半年的效率损失算进去,这个决策未必划算。
社区和生态:一个技术再优秀,如果社区不活跃,遇到问题找不到资料,踩了 Bug 没有人修,会非常痛苦。
公司和组织的约束:有些公司有技术白名单,只允许用白名单里的技术。有些团队有运维标准,不支持某些运行环境。这些约束不考虑,做再详细的评估都白费。
长期维护成本:一个技术引入容易,但如果它的升级路径不清晰、版本之间 Breaking Change 多,长期维护成本会非常高。
我的技术选型六步框架
第一步:明确问题和约束条件
在评估任何候选方案之前,先把这个问题想清楚:我们到底要解决什么问题?
这个问题听起来简单,但实际上很多技术选型是在"问题还没有想清楚"的状态下开始的。
好的问题定义应该包含:
- 现状:当前是什么情况,为什么需要新的技术方案?
- 目标:新方案需要解决什么问题?有哪些关键的成功指标?
- 约束:有哪些硬性约束(不能超出的成本、不能打破的兼容性、必须满足的合规要求)?
- 规模预期:这个方案需要支持什么规模的数据量/请求量/用户量?现在是多少,预期1年后是多少?
举个例子:选消息队列
不好的问题定义:"我们需要一个消息队列。"
好的问题定义:
现状:用户行为数据目前通过同步调用写入日志系统,日志系统偶发的慢响应会影响主链路请求,导致超时。 目标:解耦用户行为数据上报和主链路,主链路不受日志系统影响。支持每天1亿条消息,允许秒级延迟。 约束:团队没有 Kafka 运维经验,现有云服务商提供 RocketMQ 托管服务。不接受新引入需要专职运维的组件。 规模:当前每天5000万条,预期1年内增长到1亿条,2年内可能到5亿条。
有了这个问题定义,候选方案的评估方向就非常清晰了。
第二步:列出候选方案,不要少于2个
不要一开始就锁定某个方案。列出至少2-3个候选方案(包括"什么都不改,保持现状"),才能做到真正的比较。
"什么都不改"也应该是一个候选方案,因为它的代价是已知的(现有的痛点),可以和其他方案做对比。
第三步:确定评估维度和权重
根据第一步里的目标和约束,确定评估维度。常见的维度:
技术能力维度:
- 性能(吞吐量、延迟)
- 可靠性(可用性、数据一致性)
- 功能完整性(是否覆盖所有场景)
- 可扩展性(未来扩展是否方便)
工程维度:
- 学习成本(团队上手难度)
- 运维复杂度
- 调试和排错能力
- 与现有技术栈的兼容性
生态维度:
- 社区活跃度
- 文档质量
- 商业支持(如果需要)
成本维度:
- 直接成本(许可证费用、云服务费用)
- 间接成本(学习时间、迁移成本)
关键是:不是每个维度的权重都一样。要根据你的具体问题,确定哪些维度是最关键的(高权重),哪些是次要的(低权重)。
比如对于刚起步的创业公司,开发效率和学习成本权重应该很高;对于金融系统,数据可靠性和合规性的权重应该最高。
第四步:收集信息,做原型验证
不要只靠官网文档和博客来做决策,要亲手跑一个最小原型。
我通常做3件事:
1. 快速原型:用候选方案写一个最简单的 Demo,能跑通核心场景就行。目的是:亲身感受这个技术是否符合直觉,是否有意外的坑。
2. 边界测试:针对你的关键约束,做一个最简单的压测或者极限测试。比如你关心的是高并发性能,就花半天时间写一个压测脚本,看看候选方案在你的场景下实际表现如何。不要相信官方的"百万 TPS",要测你自己的场景。
3. 调研已有案例:找到有类似场景的公司,看他们是怎么做的,有没有公开的技术文章讲他们的踩坑经历。他人的踩坑经历,往往是最有价值的信息来源。
第五步:写评估报告,明确推荐方案
评估报告不需要很长,但要包含:
- 背景和问题定义
- 候选方案列表
- 各方案的评估结果(矩阵形式,直观)
- 推荐方案和推荐理由
- 推荐方案的已知风险和缓解方案
重要:报告里要有推荐方案,不要写"两个方案各有优缺点,大家自己决定"。你做了这么多分析,就应该有一个明确的立场。没有立场的分析是没有价值的。
第六步:决策评审和记录
把评估报告发给相关人员(Tech Lead、架构师、相关业务方),组织一次技术评审,讨论评估结论,收集不同意见,最终做出决定。
决定做出后,把这个决定记录下来(就是上一篇讲的 ADR):做了什么决定,为什么,排除了哪些选项,理由是什么。
这条记录,在3个月后当有人质疑这个决策时,是你最重要的保护。
一次真实的技术选型案例
我做过一次 Java 框架的选型:在 Spring Boot 和 Quarkus 之间选择一个作为新微服务的标准框架。
问题定义: 团队准备新建4个微服务,希望启动速度快(当前 Spring Boot 应用冷启动需要15-20秒,影响 K8s 的弹性伸缩)。
评估过程: 做了一个原型,用相同的业务逻辑(一个简单的 REST API + MySQL 查询)分别实现了 Spring Boot 版本和 Quarkus 版本,对比了:启动时间、内存占用、开发体验、与现有 Spring 生态的兼容性。
结果: Quarkus 在启动速度(3秒 vs 17秒)和内存(80MB vs 250MB)上有显著优势,但团队所有人都熟悉 Spring Boot,Quarkus 的学习成本不可忽视,而且很多我们用的 Spring 内部工具和库只有 Spring Boot 版本。
决策: 保留 Spring Boot,但同时优化配置(延迟 Bean 初始化、减少不必要的自动配置),把启动时间压到了8秒以内,基本满足了弹性伸缩的需求。引入 Quarkus 的学习成本,在当前阶段不值得付出。
这个决策后来被证明是对的——因为半年后业务方向发生了变化,性能需求没有当初预期的那么极致,如果当时为了追求极致性能强行引入 Quarkus,团队会非常痛苦。
技术选型最常见的陷阱
陷阱1:被新技术的热度影响
一个技术在社区很火,不代表它适合你的场景。要关注"是否适合",而不是"是否流行"。
陷阱2:POC 过度美好
原型测试通常是在理想条件下做的,生产环境有各种意外(网络抖动、数据分布不均匀、并发竞争)。不要把 POC 的结果直接等同于生产环境的表现。
陷阱3:只关注当前规模,不考虑增长
现在1000 QPS 够用的方案,2年后10000 QPS 时可能完全不够用。要在选型时把增长因素考虑进去。
陷阱4:忽略"换掉它"的成本
引入一个新技术之前,要想:如果未来发现这个技术不合适,换掉它的成本是多少?如果替换成本极高(比如深度绑定了某个数据库的特性),就要对这个选型更加谨慎。
技术选型的文化问题
技术选型不只是技术问题,还是文化问题和权力问题。
我见过技术选型失败,不是因为选了"技术上错误"的方案,而是因为:
场景1:选型过程不透明 只有少数人参与决策,大多数人是被通知的而不是参与的。那些被排除在外的工程师,会对这个技术抵触,执行时不配合,最终导致推广失败。
解决方案:让会被影响的人参与评估过程,哪怕只是"提供意见"的层面,也比完全排除强。
场景2:强推个人偏好 技术负责人力推某个技术,不是因为这个技术最适合,而是因为"我熟悉这个,我觉得好"。
解决方案:评估要基于数据和分析,个人偏好要明确标注为"个人偏好",不要包装成"技术论据"。
场景3:对团队能力估计过于乐观 选了一个技术上更优秀但学习曲线更陡峭的方案,低估了团队的学习成本,导致推广缓慢、问题频出。
解决方案:在评估时,让实际要使用这个技术的工程师参与 POC,他们的学习速度和实际感受,是最真实的参考。
好的技术选型决策,是技术上有理由支撑、团队有能力执行、影响方都充分参与的结果。
