技术选型评估·权重与 TCO
选型翻车,多半不是「选错了」,而是该比的没比:维度没给权重、权重加起来不是 100、
评分越界或随手填了一堆「待定」、只写了个总分却看不到 TCO 明细、用了 GPL 这种传染性许可
却没标商用风险、闭源单一供应商却没人评锁定风险、迁移成本干脆没算、没有 PoC、没有退出方案……
等到评审会上被追问,决策依据就站不住脚了。
本工具读一份选型对比表 CSV(列名可自动识别),做两件事:
- 体检:逐条检查评估要素是否齐全、权重与评分是否可用,输出可定位到行/方案/维度的分级问题清单;
- 测算:按权重算各方案综合分,按 TCO 分项算各方案总拥有成本与年均成本,给出推荐。
定位是「写选型方案的人自查 + 评审前置过滤」,不替代评审结论,也不替你做商业决策。
执行原则
- 先算账再推荐。 权重之和、评分量程与 TCO 分项都核对后再给推荐;不要在权重之和不为 100 或评分越界时直接下结论。
- 只查表内要素。 只判「要素有没有写、账有没有算」;不要评价维度选择是否合理、评分是否客观,也不要替评审拍板。
- 核心列缺失先报。 候选方案 / 维度 / 评分任一识别不到时先报
MISSING_COL(高)并跳过相应计算;不要在没有核心列时硬算综合分。 - 许可与时效只作提示。
S6/S7/S12是文本级启发式命中;不要把它当法律结论,也不要据此否定供应商报价。 - TCO 是估算口径。 分项金额来源与含税 / 币种 / 年-vs-月口径由你保证;不要声称数字已核实。
何时使用
CRITICAL: 只要用户提出评审 / 自查技术选型对比表(CSV),或要横向比较几套方案的综合得分与 TCO,就必须使用本 skill,即使看起来可以用别的方式解决。
- 技术选型 / 架构评审之前,先自查一遍对比表「该算的算了没、该评的评了没」。
- 用户给出一份选型对比表(CSV),问「这个对比表能不能上评审 / 有没有漏」。
- 需要横向比较几套方案的综合得分与总拥有成本(TCO),并要一个初步推荐。
何时不该使用
| ✅ 使用 | ❌ 不用(改用什么) |
|---|---|
| 选型对比表 CSV 的要素与算法自查 | 真实安全渗透 / 压测 / 供应商报价谈判 —— 超出表内静态自查 |
| 权重与评分校验、TCO 测算、方案推荐 | 无法量化的纯偏好选择 —— 本工具只做表内规则 |
| 评审前的要素补齐检查 | 替评审拍板商业决策 —— 只给推荐与依据 |
| 许可 / 锁定 / 迁移 / 退出 / PoC 等维度缺失提醒 | 出具法律意见 —— S6 / S7 是文本级启发式 |
| 表内静态自查与横向比较 | 校验金额真实性 —— TCO 分项是估算口径,来源由你保证 |
易混淆场景
| 用户说的 | 实际意图 | 正确路由 |
|---|---|---|
| 「帮我把评分加个总分」 | 想要加权结论 | 先校 S2 权重之和、S3 评分越界,再算综合分 |
| 「哪个方案便宜」 | 要比长期成本 | 用 TCO(--years / --discount),不是只比首年报价 |
| 「这个对比表能上评审吗」 | 要要素完整性判断 | 查 S4 / S5 / S8 / S9 / S10,有高风险先补齐 |
| 「GPL 能用吗」 | 要法律结论 | 只提示 S6 传染性许可的商用风险,转法务 |
| 「帮我选一个」 | 要决策 | 给综合分 + TCO + 推荐,但不替你拍板 |
怎么用
# 基础检查 + 默认 TCO(3 年,不折现)
python3 scripts/stack_lint.py 选型对比表.csv
# 指定 TCO 年限与折现率(5 年、5%;折现率按百分数填,填 0.05 也按小数处理)
python3 scripts/stack_lint.py 选型对比表.csv --years 5 --discount 5
# 指定时效判定基准日(默认今天),输出 JSON
python3 scripts/stack_lint.py 选型对比表.csv --as-of 2026-10-11 --json
# 用内置问题样例看效果(覆盖 S1–S12)
python3 scripts/stack_lint.py --sample
退出码:0 = 未发现问题;1 = 发现问题(或输入不可读/为空)。
输入格式
输入为 CSV(UTF-8,含 BOM 兼容)。推荐「长表」:每行一个「候选方案 × 评估维度」,
成本分项填在该方案的行上(同一方案多行重复填写同一成本分项时,脚本按分项取最大值去重)。
候选方案,维度,权重,评分,备注,授权/订阅,人力,硬件/云,迁移,运维
方案甲,安全合规,20,90,已完成 PoC;含回退方案,12000,60000,20000,30000,9000
方案甲,社区活跃度,15,85,,12000,60000,20000,30000,9000
方案甲,许可协议,10,95,MIT 许可,12000,60000,20000,30000,9000
方案乙,安全合规,20,80,,30000,90000,26000,50000,12000
列名按关键词自动识别(大小写、空格、括号、斜杠差异均兼容):
| 角色 | 候选关键词 | 用途 |
|---|---|---|
| 候选方案 | 候选方案 / 候选 / 方案 / 选项 / 选型 / 产品 / 技术 / 工具 | 分组、对比、推荐 |
| 维度 | 评估维度 / 维度 / 评估指标 / 评估项 / 指标 | 权重与评分的主键 |
| 权重 | 权重 / 权值 / 比重 / 占比 | 加权评分、S1/S2 |
| 评分 | 评分 / 得分 / 分数 / 打分 / 分值 | 加权评分、S3 |
| 备注 | 备注 / 说明 / 标注 / 风险 | 许可/锁定/退出/PoC/时效等文本判定 |
| TCO 分项 | 授权·订阅 / 人力 / 硬件·云 / 迁移 / 运维 | TCO 测算、S5/S8 |
> 「候选方案 / 维度 / 评分」为核心列:任一列识别不到时会先报一条 MISSING_COL(高),
> 并跳过相应计算。TCO 分项列缺失或全空时会报 S5;迁移列缺失或全空时报 S8。
规则码与清单
| 规则码 | 含义 | 严重度 | 定位 |
|---|---|---|---|
S1 |
维度无权重 | 中 | 维度 |
S2 |
权重之和 ≠ 100(容差 ±1,计算时自动归一化) | 高 | 全表 |
S3 |
评分越界或非数字 | 高 | 维度 |
S4 |
缺关键评估维度(安全合规/社区活跃度/许可协议/迁移成本/团队熟悉度/长期维护) | 高 | 全表 |
S5 |
只有总分没有 TCO 分项明细(无分项列,或列在但无数据) | 高 | 全表 |
S6 |
含传染性许可(GPL/AGPL 等)却未标注商用风险 | 高 | 方案 |
S7 |
单一供应商/闭源锁定风险未评估 | 中 | 方案 |
S8 |
未计迁移成本(无迁移列,或值空/为 0) | 中 | 全表 |
S9 |
无回退/退出方案 | 中 | 全表 |
S10 |
无 PoC/试点计划 | 低 | 全表 |
S11 |
只有 1 个候选,无法对比 | 高 | 全表 |
S12 |
数据有明确时效但已过期(超过 1 年,按 --as-of 判定) |
中 | 全表 |
MISSING_COL |
缺少必要列(候选/维度/评分) | 高 | 全表 |
EMPTY_TABLE |
文件为空 | 高 | 全表 |
NO_ROWS |
只有表头、没有数据行 | 高 | 全表 |
> 说明:S6/S7 是文本级启发式判定(在方案相关单元格里找许可/锁定信号与风险标注),
> 命中后请人工确认。S4 判定依据是「维度列里是否出现该维度」,与 TCO 的「迁移」成本列不是一回事。
结论分三档:有高风险 → 先补齐再决策;仅中风险 → 建议补充后评审;全低/无 → 要素基本完整。
TCO 公式说明
对每个候选方案,把成本分为一次性与年度经常性两类:
- 年度经常性成本
A = 授权/订阅 + 人力 + 硬件/云 + 运维 - 一次性成本
M = 迁移 - 总拥有成本
TCO = M + Σ(y=1..N) A / (1 + r)^y - 年均成本
= TCO / N
其中 N = --years(默认 3),r = --discount(默认 0,按百分数填,如 5 表示 5%)。
r = 0 时退化为 TCO = M + A × N。综合分则按 Σ(权重 × 评分归一值) / Σ权重 计算,
评分量程自动识别(0–5 或 0–100),统一归一到 0–100 后比较。
输出示例(节选)
候选方案:2 个(方案甲、方案乙)
评估维度:6 个(权重合计 100)
问题合计 3 项:高 1 · 中 2 · 低 0
结论:存在关键问题(权重/评分/TCO/合规等),先补齐再决策
—— 高风险 ——
[S6] 方案「方案乙」含传染性许可,未标注商用风险
· 说明:GPL/AGPL 等传染性许可对闭源商用有约束,未评估会给上线埋法律风险
· 建议:在备注中标注许可结论与商用风险(如「AGPL,商用需法务确认」)
—— 中风险 ——
[S12] 评估数据最新时效为 2021-03,已超过 1 年(截至 2026-10-11)
...
—— 加权评分(0–100,量程 0–100 归一)——
方案甲:86.8
方案乙:82.2
综合分最高:方案甲
—— TCO(5 年,折现率 5%)——
方案甲:总拥有成本 467,277 · 年均 93,455(一次性 30,000 + 年经常 101,000)
方案乙:总拥有成本 734,057 · 年均 146,811(一次性 50,000 + 年经常 158,000)
总 TCO 中位数:600,667
成本最优:方案甲
设计边界与免责
- 纯标准库 Python(3.12+),只读,无网络请求,无
subprocess/eval/exec/os.system。 - 输入按 UTF-8(含 BOM)读取;仅支持 CSV,Excel/Word 请先导出为 CSV。
- 规则是启发式的:只判「要素有没有写、账有没有算」,不评价维度选择是否合理、
评分是否客观、成本估算是否贴近真实报价——那需要人工与业务判断。 - TCO 分项默认为估算口径:本工具不校验金额来源,请自行保证口径一致(含税/币种/年 vs 月)。
S6/S7关键词命中不等于法律结论;S12只按单元格里出现的日期串判定,未标注日期则不会触发。- 内置样例的候选、金额、日期全部虚构,
--sample仅用于演示,不涉及任何真实系统或供应商。
安全与合规说明
- 脚本只读输入 CSV,不写文件、无网络请求、无凭据读取、无
subprocess/eval/exec。 - 本包为开源改编作品,来源与改动见
来源与许可.md,遵守 MIT 许可证(LICENSE.md)。
交付物模板
可交付的 Markdown 模板见 assets/选型评审交付模板.md(复制后填充,不适用项写「不适用」,不要留空)。
免责声明
本技能输出的是对选型对比表的静态自查参考,不是评审结论,也不构成法务或采购意见:
许可与锁定风险为文本级启发式命中,TCO 分项金额来源与口径未经核实,须由评审与法务确认。评估结论是基于给定输入的推断,需结合实际上下文判断——同一组评分在不同业务阶段、不同团队能力结构下的结论可能不同。
依赖
仅需 Python 3.12+,使用标准库,无需联网、无需安装第三方包。