自研了半年,发现买的那家已经做到 80% 的功能——这个场景的损失不在半年工时,而在你从未写下"什么情况下我会认输"。造与买的决策失败,多数不是算错了成本,而是只算了第一项成本。
1. 总拥有成本的五项,最常漏后三项
| 成本项 | 内容 | 是否常被计入 |
|---|---|---|
| 首次建设 | 设计、编码、联调、上线 | 几乎总是 |
| 持续维护 | 缺陷、依赖升级、安全补丁、兼容性 | 有时 |
| 人力占用 | 谁值班、谁接需求、占用谁的排期 | 很少 |
| 机会成本 | 这些人本可以做别的事 | 几乎没有 |
| 迁移与退出 | 换掉或换回时的数据迁移、双跑、回滚 | 从来没有 |
判据:把五项折成"人月"再比较。只看首次建设的结论几乎永远偏向自研,因为后四项在立项时是隐形的。买的报价是显性成本,自研的隐性成本要到第二年才开票。
2. "自研能省钱"的四个成立条件
| 条件 | 不满足时的后果 | 怎么验证 |
|---|---|---|
| 用量足够大 | 省下的单价抵不过固定投入 | 算临界点:自研固定成本 ÷ 单价差 |
| 需求足够特殊 | 通用产品稍作配置就够,自研是重复劳动 | 列出差异项,看是否超过功能的 20% |
| 团队有对应能力 | 学习曲线吃掉全部收益,还留下运维债 | 看团队是否修过同类系统的线上故障 |
| 周期足够长 | 摊销期不够,退出时投入全沉没 | 预期使用年限 ≥ 3 年才谈摊销 |
四条同时成立才叫"能省钱"。缺一条,结论就从"省钱"变成"用别的东西换钱"——通常是换灵活性,这没问题,但要写清换的是什么。
3. 差异化的判据:这东西是不是你的竞争力
这个能力会不会被客户直接感知?
├─ 不会 → 买或开源(除非它是成本结构的关键项)
└─ 会 → 它是否构成竞争壁垒?
├─ 是 → 自研,且要能持续投入
└─ 否 → 买,把人力放在壁垒上
多数团队在这一步失手,是因为把"我们有定制需求"当成"这是我们的竞争力"。定制需求是常态,竞争力是稀缺的。判断标准是:如果竞争对手用同样的现成方案,你的产品会失去什么? 答不上来,就不是壁垒。
4. 买的风险:四类,全部与时间有关
| 风险 | 早期信号 | 缓解手段 |
|---|---|---|
| 供应商锁定 | 数据导出要收费、专有格式、无批量 API | 合同里写导出条款,定期做一次真实导出演练 |
| 定价变更 | 按量计费改为按席位、免费额度缩水 | 算清"涨价 3 倍"时的成本,写进预算假设 |
| 能力停更 | 路线图连续两个版本无实质更新 | 要路线图,并核对兑现率而不是听承诺 |
| 数据出境/合规 | 数据落在无法审计的区域 | 部署形态、审计日志、删除权能否落实 |
锁定不是签合同那天发生的,是数据长在对方系统里之后发生的。所以缓解手段只有一条是有效的:定期验证"能不能带着数据走",而不是在合同里读一遍条款。
5. 开源是第三选项,成本结构不同
| 项 | 商业产品 | 开源自建 |
|---|---|---|
| 首次成本 | 许可费 + 集成 | 集成 + 学习 + 部署 |
| 维护 | 供应商 | 你自己(升级、CVE、兼容) |
| 故障责任 | 有 SLA 可追 | 全在你 |
| 灵活性 | 受产品边界限制 | 可改源码,但从此维护 fork |
| 长期风险 | 涨价、停更 | 上游弃维护、breaking change |
开源不是"免费",是"把许可费换成了运维工时与升级风险"。判断标准:团队里有没有一个人愿意为它值班。没有,开源方案的隐性成本会高于商业许可。
# 自建开源的隐性工作量,立项时就要写进排期
- 版本升级与 breaking change 迁移 # 每季度
- 安全公告跟踪与补丁 # 持续
- 备份/恢复演练 # 每季度
- 容量与性能基线 # 每半年
- 与内部监控/告警/日志对接 # 一次性 + 维护
6. 评估矩阵怎么写才算数
| 维度 | 权重 | 打分依据 | 常见虚高 |
|---|---|---|---|
| 功能匹配度 | 30% | 逐条对照需求清单,标"原生/配置/开发/不支持" | 只看 demo |
| 集成成本 | 25% | 需要写多少适配代码、要不要改现有模型 | 低估数据模型冲突 |
| 运维负担 | 20% | 新增几个组件、谁值班、备份怎么做 | 假设"托管就不用管" |
| 合规与安全 | 15% | 审计、加密、权限模型、数据位置 | 用"支持 SOC2"代替核实 |
| 路线图可信度 | 10% | 过去 12 个月兑现了几个承诺 | 听销售讲未来 |
score = sum(w * s for w, s in zip(weights, scores)) # 先算,再看排序是否反直觉
# 反直觉时不要改权重去凑结论,回去查打分依据
矩阵的作用不是给出答案,是暴露分歧点。如果两列分数接近,说明决策应该由"哪个更容易退出"决定,而不是由功能多少决定。
7. POC 只验最不确定的那一项
概念验证最常见的浪费是"把 demo 又做了一遍"。POC 的唯一目标是降低最大的不确定性,所以先问:这份方案里,哪一条假设一旦不成立,整个决策就翻转?
| 不确定项 | 验证方式 | 通过标准(示例口径) |
|---|---|---|
| 性能是否够 | 用真实数据量压目标接口 | P99 在预算内,压测可复现 |
| 数据模型能否容纳现有业务 | 导入一批真实脏数据 | 无信息丢失,异常可解释 |
| 集成工作量 | 只做一条端到端链路 | 不改现有核心模型即可打通 |
| 迁移可行性 | 真跑一次双向导出 | 字段、附件、权限均可还原 |
# POC 的收尾动作:写一页结论,只回答"假设成立/不成立"
# 不写功能清单,不写部署手册——那些是中标之后的事
时限要有:POC 超过两周还在扩范围,通常说明真正的问题不是技术可行性,而是需求没定。
8. 退出条件必须写下来
| 触发条件 | 动作 | 切换窗口 |
|---|---|---|
| 供应商涨价超过预算假设 | 启动备选评估 | 一个合同周期 |
| 关键能力停更两版 | 冻结新增依赖,评估迁移 | 一个季度 |
| 自研维护人力持续不足 | 转买或转开源托管 | 一个月 |
| 自研功能被上游覆盖 | 停止投入,做迁移评估 | 视数据量 |
退出条件写在立项文档里,和预算写在一起。没有退出条件的自研,等于默认无限追加投入。
9. 可逆性分级决定决策速度
| 类型 | 例子 | 决策方式 |
|---|---|---|
| 一次性、低影响 | 内部报表工具、一次性脚本 | 直接选快的,不必评估 |
| 短期可逆 | 日志/监控 SaaS、CI 工具 | 快速试,保留导出通道 |
| 中期可逆 | 消息队列、缓存层、搜索 | 评估 + POC,预留抽象层 |
| 长期难逆 | 核心数据库、身份体系、数据仓库 | 慢决策,必须写退出条件与迁移演练 |
判据:可逆性越低,越该多花时间在决策上,而不是多花时间在实现上。 反过来,可逆性高的东西纠结两周就是浪费。
10. 过渡期设计:先用开源跑通再决定
阶段1(1-2月): 开源方案跑通主链路,积累真实负载数据
阶段2(2-4月): 若瓶颈明确且属差异化能力 → 自研替换该模块
阶段3(持续): 保留对外接口不变,内部实现可替换
关键约束是接口先行:先定对内契约,再决定背后是谁。这样"造"与"买"的切换变成换实现,而不是改调用方。过渡期最怕的是把临时方案写成核心依赖——判断标准是:临时方案有没有出现在别人的架构图里。
11. 组织因素:谁维护、归哪个团队
| 问题 | 选"买"的答案 | 选"造"的答案 |
|---|---|---|
| 谁值班 | 供应商 + 一个对接人 | 一个固定团队,且是长期归属 |
| 需求排队 | 提工单等排期 | 自己排期,但要和业务抢人 |
| 故障责任 | 可追责、可索赔 | 全内部消化 |
| 绩效归属 | 不产生内部技术资产 | 产生资产,也产生维护债 |
组织因素常常比技术因素更能决定结果:没有明确归属团队的自研,一年后一定变成"没人敢动"的遗留系统。
12. 排错:决策走偏的六个信号
| 信号 | 说明 | 处理 |
|---|---|---|
| 立项只写了首次建设工期 | 后四项成本隐形 | 补 TCO 表,含退出成本 |
| "他们做不到我们的需求" | 未量化差异项 | 列差异清单,逐条标"必须/可配置/可放弃" |
| POC 做成 demo | 范围失控 | 只保留一个假设,两周内出结论 |
| 没有导出演练 | 锁定风险未验证 | 每季度真跑一次导出 |
| 自研排期总被业务挤占 | 人力未真正承诺 | 写进团队 OKR,或改买 |
| 决策文档无退出条件 | 无法止损 | 补触发条件与切换窗口 |
13. 边界
| 场景 | 判断 |
|---|---|
| 一次性需求(做完就不再变) | 买或直接用现成工具,自研毫无摊销 |
| 极度简单(几百行能写完) | 自研更快,别引入依赖 |
| 供应商极不稳定(频繁停更/易主) | 自研或换开源,锁定风险高于自研成本 |
| 强合规、数据不能出境 | 形态决定选择,功能次要 |
| 团队无对应运维能力 | 买,即使单价更贵 |
造与买的本质不是技术选择,是把不确定性放在哪一边:买是把不确定性放在供应商身上,造是放在自己团队身上。选哪个,取决于你更能承受哪种失控。
14. 自测
- TCO 五项里,哪三项最常在立项时被漏掉?
- "自研能省钱"需要同时满足哪四个条件?
- 怎么区分"定制需求"和"竞争力"?
- 供应商锁定真正的发生时刻是什么时候,怎么验证?
- POC 该验证什么,不该验证什么?
- 为什么可逆性越低越该慢决策?