4.3 技术选型的评估维度

一句话

选型不是挑 “最好的技术”,而是在你的约束下挑总代价最小、且退出成本可控的技术;权重必须写在打分之前,否则评审会退化成偏好之争。

先把维度定死:七维 + 两个否决项

# 维度 问什么 典型权重 判不好会怎样
1 功能匹配 关键场景是否原生支持(事务、延迟消息、多租户…) 20–30 靠外挂补齐,复杂度转移到业务代码
2 成熟度与稳定 版本节奏、生产案例、故障史 15–25 上线后给别人当测试用户
3 性能与容量 目标负载下的 P99、扩展方式 10–20 到量才发现瓶颈在架构不在配置
4 生态与人才 招得到人吗、文档/客户端齐吗 10–20 只有 1 个人会,他就是 bus factor
5 运维复杂度 部署、升级、扩缩容、排障成本 5–15 隐形成本在第二年爆发
6 成本 三年 TCO(见 4.2 成本-收益分析),含人力 5–15 只算资源,自建永远"便宜"
7 锁定与可迁移 数据能否导出、协议是否标准 5–10 想换时发现要重写

🔑 **权重之和必须是 100,且任一维度权重 > 40 时要书面说明理由。**权重本质上是你对业务约束的排序,不是对技术的好恶。

一票否决在前,打分在后

否决项 判定标准 为什么是否决而不是扣分
合规不通过 行业规范/数据出境不允许(见 3.4) 扣分也过不了审,等于白选
无人维护 近 12 个月无 release,且无商业支持 出 0day 时你只能自己修
许可证不允许商用 强 copyleft 或限制性条款 法务风险不可用分数交换
零经验且无外部支持 团队 0 人用过,也买不到支持 首次故障的恢复时间不可控
数据无法导出 无标准协议、无批量导出 锁定成本无法估算

顺序很重要:先跑否决项,可能直接只剩 1 个候选;剩下的再打分。反过来做,会花两小时给一个不能用的方案打 85 分。

打分表长什么样 (示例:消息队列选型)

维度 权重 Kafka RocketMQ RabbitMQ
功能匹配(延迟消息/事务消息) 25 3 4.5 3.5
成熟度与稳定 20 5 4.5 5
性能与容量 15 5 4 2.5
生态与人才 15 5 4 4.5
运维复杂度 10 4 3 4.5
成本(3 年 TCO) 10 4 4 3.5
锁定与可迁移 5 5 4 4
加权总分 100 86.0 82.5 78.5

打分口径:1 = 明显不满足,3 = 够用,5 = 明显优于同类。分数必须能对应到一条事实 (文档、POC 数据、生产案例),不能是印象分。

用 10 行代码算,别用 Excel 手抖

WEIGHTS = {"功能匹配": 25, "成熟度": 20, "性能容量": 15, "生态人才": 15,
           "运维复杂度": 10, "成本": 10, "可迁移性": 5}

CANDIDATES = {
    "Kafka":     {"功能匹配": 3,   "成熟度": 5,   "性能容量": 5,   "生态人才": 5,   "运维复杂度": 4,   "成本": 4,   "可迁移性": 5},
    "RocketMQ":  {"功能匹配": 4.5, "成熟度": 4.5, "性能容量": 4,   "生态人才": 4,   "运维复杂度": 3,   "成本": 4,   "可迁移性": 4},
    "RabbitMQ":  {"功能匹配": 3.5, "成熟度": 5,   "性能容量": 2.5, "生态人才": 4.5, "运维复杂度": 4.5, "成本": 3.5, "可迁移性": 4},
}

for name, s in CANDIDATES.items():
    total = sum(s[k] / 5 * w for k, w in WEIGHTS.items())  # 归一化到 100 分制
    print(f"{name:10s}{total:6.1f}")

差距小于 10% 视为平手

86.0 与 82.5 差 3.5 分 (4%)——在打分噪声之内,不足以支撑 “Kafka 更好” 的结论。

分差 怎么处理
> 10 分 结论清晰,写进决策记录即可
5–10 分 对权重最敏感的 2 个维度做敏感性分析,看结论是否翻转
< 5 分 视为平手,改用非打分因素决断:团队经验、现有基础设施、招聘市场

⚠️ **用小数点后的差距做决策,是最常见的伪严谨。**打分是 1–5 的粗粒度估计,“86.0 优于 82.5” 这个精度的可信度是零。平手时的正确动作是:选团队最熟的,或者做 POC。

成熟度怎么判:五个硬指标

指标 健康线 看什么
Release 节奏 大版本 6–18 个月一次,小版本持续 两年不发版 = 停滞;一个月一个大版本 = 不稳
贡献者集中度 前 2 名贡献者提交占比 < 60% 超过就是 bus factor = 2
Issue 关闭率 > 60% 长期堆积说明维护力量不足
生产案例规模 有 ≥ 你 10 倍规模的公开案例 你的量级在别人的舒适区内
商业支持 能买到 SLA / 驻场 / 热修复 出事时有没有人跟你一起扛

💡 GitHub star 不是成熟度指标,它是 “流行度指标”。流行度高但维护停滞的项目,比小众但稳定的项目危险得多——因为你会误以为有人兜底。

性能对比必须同条件:五种常见的不公平

手法 为什么要不得
一边开持久化,一边不开 差的是可靠性,不是性能
数据量 1 万 vs 1 亿 小数据量下大多数系统都很快
单条写入 vs 批量写入 吞吐差 10 倍以上,比的不是同一件事
空载 vs 有背景流量 真实系统永远有干扰
只报平均值或 P50 长尾才是用户感知的(见 1.1 功能性需求与非功能性需求 的 P99)

验收方式:任何引用的 benchmark,必须能回答 “硬件、数据量、副本数、ack 级别、消息大小、分位数” 这六项。答不全,就只能当参考,不能当依据。

POC:只验证最贵的两个假设

POC 不是 “跑个 demo 看看能不能用”,是用最小成本推翻最可能的错误。

要验证的假设 怎么验 通过标准
目标数据量下延迟可接受 造 1/10 生产数据量,压到目标 TPS P99 ≤ 目标值
故障能自动恢复 kill 一个节点 / 断网 30 秒 恢复 ≤ RTO,无数据丢失
运维真的简单 让没参与选型的人照文档部署一次 2 小时内完成,无需电话求助
迁移成本可控 导一份真实数据进去再导出来 导出格式可被下游直接消费

🔑 **“运维是否简单” 必须由不熟悉的人验证。**作者本人两小时装好,说明不了任何问题——上线后值班的不是他。

可替换性 > 选对

选错的概率永远大于选对的概率,因为信息永远不全。所以真正要设计的是纠错成本:

手段 做法
最小接口面 业务只依赖自己定义的 5–10 个方法,不直接调产品 API
防腐层 中间加一层适配,把产品的特殊语义挡在外面
数据可导出 选型时就验证"全量导出 + 导入到备选"这条路
退出计划写进 ADR "若出现 X(如连续 3 次 P0 事故),换 Y,预计 N 人月"

选型落地不等于结束:这条技术该待在哪个环、凭什么证据升级或降级、什么条件下撤下来,见 4.5 技术雷达与新技术跟踪。

反模式

反模式 后果
简历驱动开发(为了用新技术而选它) 团队拿生产系统练手,故障率上升
用别人的 benchmark 博客代替自己的 POC 条件不同,结论不可迁移
先打分后定权重(打完结再调权重凑结论) 决策过程失去可信度,事后无人认账
只看 star 数 / 只看大厂案例 忽略自身规模与团队能力差异
忽略运维人力,只比资源成本 第二年隐性成本反超(见 4.2 成本-收益分析)
选型会开成技术信仰之争 3 小时没有结论,最后靠职级拍板
没有退出计划 明知选错也换不掉,锁定成立

四条铁律

🔑 **权重先定、分数后打。**顺序反了,打分只是给偏好找理由。

🔑 **否决项优先于总分。**合规、维护性、许可证、数据可导出,这四条不参与加权——它们只有 “过” 和 “不过”。

🔑 分差 < 10% 就是平手,用团队熟悉度决断,别用小数点决断。

🔑 **选型结论必须带一句 “什么情况下我们会换掉它”。**没有这句话的决策记录,等于放弃了未来的纠错权。

自检

Q1 三个候选的加权总分是 86.0 / 82.5 / 78.5,你怎么定?

▸ 答案:先看分差——86 与 82.5 差 4%,在噪声内,不能据此说第一个更好。此时按顺序:① 确认否决项都已通过;② 看这两个候选在你权重最高的维度上差多少 (若功能匹配差 1.5 分,那正是你业务最在意的点,值得深挖);③ 做 POC 或选团队最熟的。用 “86 比 82.5 高” 当理由,评审时一问权重怎么来的就崩。

Q2 供应商给你一份 benchmark,说吞吐是竞品的 10 倍。你信不信?

▸ 答案:先要六项条件:硬件规格、数据量、副本数、ack/持久化级别、消息大小、报的是 P50 还是 P99。少任何一项都不能当依据。典型的 10 倍差距来自 “一边批量一边单条” “一边不持久化一边持久化” “小数据量对大数据量”——差的是测试设置,不是产品。

Q3 团队 0 经验,但某个技术明显更优,能选吗?

▸ 答案:能,但要把学习成本显式计入 TCO:培训人日、POC 时间、首次故障的恢复时间 (可能从 30 分钟变成 4 小时)、招聘溢价。如果这些加起来让三年 TCO 反超,那 “更优” 只存在于纸面。若仍要选,必须配 “外部支持 + 双人备份”,否则这家技术就变成了单点。

Q4 为什么说 “可替换性” 比 “选对” 更重要?

▸ 答案:因为选型是在信息不全下做的决策,选错是常态而非意外。可替换性把 “选错的代价” 从 “重写系统” 降到 “换一个适配层”。具体动作:业务只依赖自己定义的接口、加防腐层、验证数据可导出、ADR 里写退出条件。没有这四条,任何选型都是一次性押注。

Q5 为什么 “运维简单” 这一维必须由不熟的人来验证?

▸ 答案:因为选型者本人的熟练度是伪装成产品优势的。作者两小时装好,换一个值班工程师可能是两天,而且是在凌晨两点出事的时候。让没参与选型的人照文档走一遍,测出来的才是真实运维成本——这一项在 TCO 里往往比资源成本更贵。

Q6 有人说 “我们选它是因为 BAT 都在用”。这条论证成立吗?

▸ 答案:只成立一半。大厂案例能证明 “这个规模下可行”,但不能证明 “你团队能运维”。要补三个问题:① 他们的规模和你差几倍 (差 100 倍则结论不可迁移);② 他们有专职团队吗 (有,而你没有);③ 他们踩过的坑你有没有能力踩。这三问答完,“大厂在用” 才从背书变成证据。