← 所有文章

一个错误的数据库决策带来的15倍成本:决策时机的教训

我测量了一个数据库决策在三个生产系统中的成本。迁移成本在三年积累的数据和schema依赖中增长了15倍。

TL;DR

大多数工程师在决策时机上本末倒置:他们花数天时间讨论可逆的选择(使用哪个API客户端库),却在几分钟内做出不可逆的决策(sprint规划中的数据库schema)。Ray Dalio和Jeff Bezos从不同角度描述了同一个框架:可逆决策应该快速做出,因为延迟的代价大于不完美。不可逆决策值得与其风险相称的分析投入。我在三个系统中以惨痛的方式学到了这一点——早期的schema捷径最终累积成了六位数的迁移成本。


让我顿悟的那次迁移

在ZipRecruiter的第一年,我接手了一个系统,原团队选择了反范式化schema以加速初始开发。这个决策在当时是合理的:先快速上线,以后再范式化。”以后”从未到来。

到第二年,三个服务依赖于反范式化的结构。到第三年,该schema已积累了14个月的生产数据、假设反范式化布局的外键关系,以及六个会因任何结构变更而崩溃的报表查询。

第一个月的迁移成本大约是两个工程日。第十二个月时变成了两周。到第三十六个月,估算是三个月的专职工程时间,加上带有双写逻辑的滚动部署以避免停机。这就是15倍的乘数:不是因为问题变难了,而是因为爆炸半径随着每个月积累的依赖关系不断扩大。1


决策框架

可逆决策:几分钟内决定

为原型选择前端框架。确定变量命名约定。为预发布环境选择云区域。决定先写哪篇博客文章。

这些决策有一个共同特征:无论何时改变方向,改变的成本大致相同。延迟只会浪费时间,而不会改善结果。2

我的判断标准: 如果下周我能用不到一天的工作量撤销这个决策,我现在就做决定。

构建这个网站时,我花了大约十分钟选择HTMX而非React。如果HTMX是错误的选择,在一个使用服务器端渲染模板的个人网站上切换框架只需要一个周末。低逆转成本意味着速度比分析更重要。

不可逆决策:花几天时间决定

为客户数据选择数据库引擎。定义外部系统依赖的API契约。选择86个hook将构建其上的hook架构。

这些会产生复合效应。逆转成本随时间增长,通常是指数级的。3

我的判断标准: 如果撤销这个决策的成本每六个月翻一倍,我会投入与风险相称的分析。

我的.claude/ hook架构就是正确处理不可逆决策的一个例子。在编写第一个hook之前,我花了两周时间设计hook生命周期模型(PreToolUse、PostToolUse、Stop以及其他三个)。该设计现在支持涵盖git安全、递归控制、理念执行、质量门禁和可观测性的86个hook。此时更改生命周期模型将需要重写每一个hook。前期的分析投入已经多倍回本。4


五个正确和错误的决策

正确:选择纯CSS而非Tailwind

类型: 可逆。花费时间: 20分钟。

我为这个网站选择了纯CSS加自定义属性而非Tailwind。如果选错了,一个周末就能迁移到Tailwind。决策花了20分钟:相比框架带来的生产力提升,我更看重学习CSS基础知识。两年后,我很庆幸选择了纯CSS,因为每一次优化(达到Lighthouse满分)都需要理解CSS实际在做什么。但这个决策无论怎么选都不会有严重后果。

正确:投入时间设计Hook架构

类型: 不可逆。花费时间: 两周。

86个hook现在依赖于该生命周期模型。每一小时的前期设计都物有所值。

错误:仓促设计博客内容Schema

类型: 不可逆。花费时间: 30分钟。

我在一次会话中就定义了博客文章的ContentMeta数据类:title、slug、date、description、tags、author、published。我没有包含categoryserieshero_imagescriptsstyles。之后每次添加都需要修改解析器、更新每个使用元数据的模板,以及重新测试整个博客管道。三个月内的五次添加所花费的总时间,远超一开始仔细设计schema所需的时间。

错误:过度考虑博客文章的写作顺序

类型: 可逆。花费时间: 计划会议中的两小时。

我花了两小时决定先写哪些博客文章。顺序是完全可逆的。我应该立即开始写任何内容,然后根据实践中的学习重新排序。

正确:仔细设计共识阈值

类型: 不可逆。花费时间: 一周。

我的审议系统使用任务自适应的共识阈值:安全决策85%,功能开发80%,重构65%,文档50%。如果这些阈值设错了,要么会阻碍正当的工作(阈值过高),要么会批准危险的变更(阈值过低)。我在提交之前针对真实的任务历史测试了每一个阈值。


常见的本末倒置

工程师花数天时间选择API客户端库(可逆,切换成本低),却在sprint规划会议中设计数据库schema(不可逆,迁移成本高)。

管理者同样如此:花数周评估项目管理工具(可逆),却在一夜之间重组团队(不可逆,人力成本高)。5

这种倒置的发生是因为可逆决策在当下感觉很重大(团队可能会评判我的库选择),而不可逆决策感觉很抽象(迁移是三年后的事)。这种感觉恰恰是错的。


每次决策前的两个问题

  1. 六个月后逆转的成本是多少? 如果答案是”微不足道”,现在就做决定。
  2. 延迟是否能带来更好的信息? 如果等待不会产生新的数据,现在就做决定。

只有在两个条件都倾向于等待时才进行深思熟虑:逆转成本高昂并且随着时间推移会获得更好的信息。6其他一切都立即决定。


核心要点

给工程师: - 原型的技术栈选择是可逆的;用几分钟而不是几场会议来决定 - 数据库schema和API契约在规模化后是不可逆的;前期投入的分析应与依赖该决策的系统数量成正比 - 记录您的决策成本;量化15倍的迁移乘数改变了我评估前期投入的方式

给管理者: - 工具和流程变更通常是可逆的;快速试点,迭代改进 - 团队结构和招聘决策的逆转成本很高;按比例慎重考虑 - 当团队花一周时间选择一个库时,问问逆转成本是否值得如此长时间的讨论


参考文献


  1. 作者对ZipRecruiter三个生产系统数据库迁移成本的分析。迁移成本在三年积累的数据和schema依赖中增长了15倍。 

  2. Bezos, Jeff, “2015 Letter to Shareholders,” Amazon, 2016。”Type 1和Type 2决策”框架。 

  3. Dalio, Ray, Principles: Life and Work, Simon & Schuster, 2017。关于决策时机和极度透明的核心框架。 

  4. 作者的hook架构设计过程。86个hook跨6个生命周期点,记录于“Claude Code hooks”。 

  5. Kahneman, Daniel, Thinking, Fast and Slow, Farrar, Straus and Giroux, 2011。关于决策疲劳和认知偏差的研究。 

  6. Taleb, Nassim Nicholas, Antifragile, Random House, 2012。关于期权性和不确定性下决策的框架。