四眼检查无处不在。银行要求大额交易的双重批准。IT团队在生产部署前强制要求同行审查。制造业要求质量检查的双重签署。财务部门强制要求付款的双重签名。运营团队要求两名工程师批准基础设施变更。逻辑看起来无懈可击——两个人审查同一个操作应该能发现错误并防止问题。
这种控制措施随处可见。安全框架要求职责分离。DevOps实践要求代码审查。制造业强制执行双重质量检查。制造商-检查员流程跨越各个行业。两双眼睛审查关键操作应该为错误、欺诈和灾难性错误提供强有力的保护。
但这种广受信任的控制措施创造了危险的漏洞。组织实施四眼检查并假设他们受到了保护。他们减少其他控制措施,相信双重批准提供了足够的安全性。这种虚假的信心创造了盲点,关键错误到达生产环境,安全漏洞通过代码审查,运营错误导致中断。
我为什么写这篇文章
我看到四眼检查在不同组织和环境中反复失败。一个关键的生产错误被两名高级开发人员在代码审查中批准。一笔欺诈交易通过了双重授权。一个基础设施变更尽管有两名工程师签署,却导致了重大中断。每次,事后审查都揭示了相同的模式:两个审查者都是橡皮图章,没有实际验证。
我反复看到的一个模式是组织将流程分解为多个子流程,每个都有自己的批准步骤。部署流程被分为:代码审查(两次批准)、安全审查(两次批准)、基础设施审查(两次批准)和最终部署批准(两次批准)。八个人在四个阶段批准同一个部署。组织相信这提供了深度防御——多个检查点捕获不同的问题。
但这创造了相反的效果。每个审查者假设其他阶段会捕获问题。代码审查者假设安全审查会捕获漏洞。安全审查者假设代码审查验证了功能。基础设施审查者假设前两个阶段都验证了变更。最终批准者假设所有先前的批准意味着部署是安全的。没有人进行全面审查,因为每个人都相信其他人已经做了。
子流程方法还分割了上下文。代码审查者看到代码变更但看不到基础设施影响。基础设施审查者看到配置变更但看不到业务逻辑。安全审查者看到潜在漏洞但看不到运营约束。每个子流程审查一个片段而不理解整体。跨越多个领域的关键问题被遗漏,因为没有单个审查者拥有完整的上下文。
最让我困扰的不是这些控制措施失败——而是组织继续盲目信任它们。每次事件后,典型的回应是"我们需要更好的培训"或"审查者需要更加小心"或"我们需要更多批准阶段"。没有人质疑控制措施本身是否根本有缺陷。
本文探讨为什么四眼检查如此一致地失败,何时它们实际有效,以及什么替代方案提供更好的保护。问题不在于概念——而在于人类在现实条件下执行这些检查时的实际行为。
批准疲劳的心理学
当有人要求你批准某事时,你的大脑中实际发生了什么?
橡皮图章效应
⚠️ 批准疲劳模式
数量压倒审查
- 批准者每天面临数十个请求
- 每次审查都需要时间和精神能量
- 维持工作流程速度的压力
- 默认行为转向批准
信任取代验证
- "如果不对,他们不会提交"
- 假设第一个审查者做了彻底检查
- 关系信任覆盖流程验证
- 不延误同事的社会压力
责任扩散
- "其他人会发现问题"
- 共同责任变成无人负责
- 每个审查者假设另一个仔细检查了
- 失败发生时责任分散
第一个审查者提交交易申请批准。第二个审查者看到同事的请求。他们信任这个人。他们每天一起工作。请求者不会提交不正确或欺诈的东西——他们是值得信赖的。
这种心理捷径将验证转化为橡皮图章。第二个审查者瞥一眼请求,看到熟悉的模式,然后批准。他们不验证账号,不重新计算金额,不验证业务理由。他们信任。
专业知识错觉
组织经常将四眼检查分配给具有相似角色和专业知识的人。两个开发人员审查代码变更。两个会计师批准日记账分录。两个系统管理员授权配置变更。
一些组织试图通过让经理审查其团队的工作来解决这个问题。IT经理审查工程师的生产变更。开发经理批准其团队的代码。这看起来更好——经理有责任、更广阔的视角和权威。但它因不同原因而失败。
这创造了一个危险的错觉——相似的专业知识提供独立验证。但具有相似背景的人共享相似的盲点:
🎭 共同盲点
共同心理模型
- 相同的培训创造相同的假设
- 相似的经验导致相似的错误
- 共享的专业知识意味着共享的差距
- 行业实践变成不被质疑的规范
专业偏见
- "我们一直是这样做的"
- 技术正确性掩盖业务风险
- 专注于熟悉方面,忽略不熟悉的
- 专业知识创造信心,减少质疑
两个开发人员审查代码都错过了相同的安全漏洞,因为他们的培训从未涵盖那种攻击向量。两个会计师批准相同的欺诈条目,因为两人都学习了相同的过时控制程序。两个运营工程师批准一个将导致级联故障的配置变更,因为两人都假设负载均衡器会处理它。相似的专业知识不提供独立验证——它放大共享的弱点。
经理审查神话
许多组织相信经理审查解决了四眼检查问题。经理有责任、权威和据说更广阔的视角。IT经理审查工程师部署应该捕获同行审查错过的问题。但经理审查一致失败:
技术深度与广度权衡:经理获得广度但失去技术深度。审查20名工程师工作的IT经理无法在每个技术栈、框架版本和系统架构中保持深度专业知识。他们在表面层面审查——检查测试是否存在,而不是测试是否全面。验证文档是否存在,而不是是否准确。确认变更遵循流程,而不是技术上是否合理。
数量压倒能力:经理审查其团队产生的一切。拥有10名工程师的经理可能每周审查50+个变更。每次审查得到5-10分钟。彻底的技术审查需要30-60分钟。数学不成立。经理成为瓶颈,为了保持工作流程而橡皮图章。
信任覆盖验证:经理对团队成员的信任与同行不同。雇用工程师、指导他们并给予积极绩效评估的经理已经投资于那个人的能力。质疑他们的工作感觉像是质疑自己的判断。经理基于谁提交了工作而不是工作包含什么来批准。
权威创造压力:当经理审查时,工程师感到压力要为自己的工作辩护而不是接受反馈。挑战经理的技术关注有职业后果的风险。工程师学会自信地展示工作,经理学会信任自信的展示。审查变成表演而不是验证。
责任不等于能力:经理对结果有责任,但这不给他们捕获每个问题的能力。事件发生后,经理面临后果——但这不意味着他们可以通过更好的审查来防止事件。没有能力的责任只是创造责备而不改善结果。
串通问题
四眼检查假设审查者之间的独立性。但人类形成关系、联盟,有时是阴谋。
游戏系统
四眼检查创造可预测的模式,人们学会利用——不总是恶意的,有时只是为了完成工作。
关系利用:信任取代验证。在安全环境中,欺诈者随时间与两个审查者建立关系。在开发团队中,开发人员形成审查伙伴关系,每个人都橡皮图章另一个的代码。在运营中,一起工作夜班的工程师发展相互批准模式。关系成为批准的基础而不是工作质量。
顺序妥协:在安全中,攻击者通过社会工程或胁迫妥协一个审查者。在生产环境中,一个工程师推动有风险的部署,第二个审查者——看到可信同事的批准请求——橡皮图章它。无论意图是恶意还是只是权宜,模式都是相同的。
互利方案:两个内部人员为了互利而串通。在金融中,他们轮流批准欺诈交易。在开发中,他们轮流批准彼此测试不良的代码以满足冲刺截止日期。在运营中,他们批准彼此的捷径以避免文档工作。设计用来防止问题的控制成为启用问题的机制。
子流程分割问题
我观察到组织通过添加更多批准阶段来回应四眼检查失败。他们将流程分解为子流程,每个都有双重批准。这看起来合乎逻辑——更多检查点应该捕获更多问题。但它创造了危险的分割。
跨阶段的责任扩散:当部署需要代码审查批准、安全审查批准、基础设施审查批准和运营批准时,每个审查者假设其他人在全面检查。代码审查者狭隘地专注于代码质量,假设安全审查会捕获漏洞。安全审查者扫描已知漏洞,假设代码审查验证了业务逻辑。基础设施审查者检查配置语法,假设先前阶段验证了变更有意义。运营批准者看到三个先前的批准阶段并橡皮图章。每个人批准他们的狭窄部分,而没有人验证整体。
上下文分割:每个子流程只看到图片的一部分。代码审查者看到数据库查询优化但不知道它会在高峰时段导致锁争用。基础设施审查者看到缓存配置变更但不知道它破坏了关键应用功能。安全审查者看到认证变更但不知道它影响业务关键集成。完整图片不存在于任何地方——它在子流程边界间分割。
批准疲劳倍增:子流程不是减少批准疲劳,而是倍增它。单个部署现在需要8个批准而不是2个。每个批准者面临更高的数量,因为他们审查触及其子流程的每个变更。代码审查团队审查一切。安全团队审查一切。基础设施团队审查一切。数量同时压倒每个阶段。
虚假信心放大:多个批准阶段创造与阶段数量成比例的虚假信心。"这个部署在4个阶段有8个批准——它必须经过彻底审查。"审计员看到广泛的批准轨迹并假设发生了严格审查。管理层看到多个检查点并相信风险得到控制。现实是8个人橡皮图章而没有全面审查,但控制的外观比以往任何时候都强。
压力锅
组织创造四眼检查成为障碍而不是控制的环境:
🔥 压力点
时间压力
- "这需要立即批准"
- 生产中断需要立即修复
- 业务截止日期覆盖安全流程
- 延迟批准被归咎于错失机会
权威压力
- 高级管理人员请求批准
- "CEO需要今天完成这个"
- 阻止请求的职业后果
- 权力动态覆盖控制有效性
同行压力
- "不要难相处"
- 团队凝聚力比验证更重要
- 彻底的审查者被标记为阻挠者
- 质疑同事的社会成本
在压力下,四眼检查崩溃。第二个审查者快速批准以避免冲突、维持关系或防止职业损害。控制在纸面上存在但不提供实际保护。
虚假安全悖论
四眼检查最危险的方面不是它们失败——而是组织相信它们有效。
降低警惕
当组织实施四眼检查时,他们经常减少其他控制:
监控减少:"我们有双重批准,所以我们不需要如此密切地监控这些交易。"在安全中,自动警报被禁用。在生产中,部署监控变得宽松。在运营中,变更跟踪变得不那么严格。检测控制减弱,因为预防控制似乎足够。
技术控制减弱:“我们有人工审查,所以我们不需要系统验证。“在安全中,输入验证被简化。在开发中,自动化测试要求减少,因为"代码审查会捕获问题”。在运营中,自动化健康检查被跳过,因为"两个工程师批准了变更”。技术保障措施侵蚀,因为人工判断似乎更灵活和可靠。
测试减少:"我们有同行审查,所以我们不需要广泛测试。"集成测试被跳过。负载测试变成可选。回滚程序未经测试。两个人审查代码的假设取代了它实际工作的验证。
审计范围缩小:"这些变更有双重批准,所以我们将审计工作重点放在其他地方。"安全审计员花费更少时间审查双重批准的交易。生产事件审查跳过双重批准的部署。应该接受审查的控制被假设为有效。
这创造了一个危险的悖论——四眼检查的存在通过创造削弱其他防御的虚假信心来降低整体安全性。
合规剧场
四眼检查成为满足要求但不提供真正保护的复选框练习:
📋 流程与现实
流程重于实质
- 控制存在于文档中
- 批准发生但验证不发生
- 审计轨迹显示双重签名
- 流程的证据,不是有效性的证据
测量失败
- 指标跟踪批准速度,不是质量
- 成功通过流程完成来衡量
- 没有测量捕获的错误
- 没有验证审查者的勤勉
生产示例
- Git显示拉取请求的两个批准
- 部署日志显示两个工程师签署
- 变更票据显示双重授权
- 但没有证明实际审查发生
组织通过在日志中显示双重批准来证明合规性。安全审计看到交易上的双重签名。DevOps仪表板显示每个部署两个批准。变更管理系统显示双重授权。但日志不揭示审查者是否实际验证了任何东西。它们显示两个人点击了"批准"——不是两个人独立验证了工作。
四眼检查何时有效(何时无效)
四眼检查不是固有无用的——但它们需要特定条件才能有效。
成功条件
✅ 四眼检查何时有效
真正独立性
- 不同部门或业务单位
- 审查者之间没有报告关系
- 单独的绩效激励
- 物理或组织分离
明确验证标准
- 要检查的特定项目已记录
- 客观验证要求
- 复杂审查的检查清单
- 需要验证证据
可管理的数量
- 每人有限的审查数量
- 为彻底审查分配足够时间
- 没有快速批准的压力
- 质量比速度更重要
问责机制
- 跟踪个人审查者身份
- 定期批准质量审计
- 橡皮图章的后果
- 捕获错误的奖励
真正独立性
独立性意味着审查者没有批准可疑请求的激励。这需要组织分离,不只是不同的人。当财务经理审查其自己部门提交的交易时,独立性不存在——他们共享相同的目标、压力和激励。真正的独立性意味着审查者来自具有单独绩效指标和预算责任的不同业务单位。
经理审查未通过独立性测试。审查自己团队工作的经理有批准的每个激励。他们的绩效指标取决于团队生产力。他们的声誉取决于团队能力。他们的预算取决于展示团队价值。阻止部署延迟他们团队的可交付成果。捕获错误反映他们的雇用和培训不佳。经理不是独立的——他们是投资的利益相关者。
在生产环境中,独立性意味着开发人员不审查来自在同一冲刺上工作的直接团队成员的代码。它意味着来自不同班次或地区的运营工程师审查彼此的基础设施变更。它意味着安全团队审查访问请求而不是请求部门批准自己的需求。它意味着经理不审查自己团队的工作——独立团队或自动化系统做。
物理或组织分离创造自然独立性。不同办公室、时区或报告链中的审查者有较少的关系压力和不同的上下文偏见。他们更可能质疑假设并捕获对内部人员看起来正常的问题。审查自己团队的经理有最大的关系压力和相同的上下文偏见。
明确验证标准
像"审查并在可接受时批准"这样的模糊指令保证橡皮图章。有效的四眼检查提供明确的检查清单:验证账号与发票匹配,确认金额不超过阈值,验证业务理由包括成本中心代码,检查批准权限与交易规模匹配。
在代码审查中,明确标准意味着:验证单元测试覆盖新功能,确认不存在硬编码凭据,验证所有外部调用的错误处理,检查数据库查询使用参数化语句。审查者确切知道要验证什么,而不是对代码质量做主观判断。
记录的标准也创造问责。当事件发生时,你可以确定审查者是否遵循了检查清单。没有标准,审查者可以声称他们"适当地"审查了,即使他们橡皮图章了。
可管理的数量
人类注意力是有限的。每天处理5个批准的审查者可以彻底验证每一个。每天处理50个批准的审查者必须匆忙通过它们。数量压倒勤勉。
有效的四眼检查通过自动化和基于风险的方法限制数量。低风险交易获得自动批准。中等风险交易获得带自动验证的单一批准。只有高风险交易需要双重人工审查。这保持数量可管理并将人类注意力集中在最重要的地方。
时间分配同样重要。如果彻底审查需要15分钟但审查者每个批准有5分钟,数学不成立。组织必须减少数量、增加审查者能力,或接受审查将是表面的。
问责机制
没有问责,四眼检查成为橡皮图章。有效的问责意味着跟踪个人审查者身份,不只是"两个人批准了"。当事件发生时,你需要知道谁批准了什么以及他们是否遵循了验证程序。
定期质量审计抽样批准的交易并验证审查者实际检查了所需项目。他们验证账号了吗?他们确认业务理由了吗?他们验证代码变更与描述匹配了吗?审计揭示审查者是勤勉还是橡皮图章。
后果很重要。如果橡皮图章没有后果,它成为常态。如果捕获错误的彻底审查者得到奖励而橡皮图章者面临问责,行为改变。大多数组织跟踪批准但从不测量质量——确保平庸。
失败条件
❌ 四眼检查何时失败
高数量 + 时间压力
- 每个审查者每天数十个批准
- 需要立即批准的紧急请求
- 工作流瓶颈归咎于审查延迟
- 速度指标优先于质量
关系依赖
- 审查者在同一团队工作
- 社会关系覆盖验证
- 阻止同事的职业后果
- 信任取代独立验证
模糊标准
- "审查并在可接受时批准"
- 没有要验证内容的检查清单
- 没有指导的主观判断
- 没有实际检查内容的证据
没有问责
- 跟踪批准但不跟踪质量
- 橡皮图章没有后果
- 失败发生时责任扩散
- 没有测量捕获与错过的错误
现实差距
大多数组织在失败条件下运作,同时期望成功结果。他们实施四眼检查与同团队审查者(没有独立性)、模糊的"审查并批准"指令(没有明确标准)、每人每天数十个批准(不可管理的数量),以及没有审查质量测量(没有问责)。然后他们想知道为什么关键问题被遗漏。
当失败发生时,组织经常通过添加更多子流程批准阶段而不是修复根本问题来回应。这使事情变得更糟——倍增批准疲劳、分割上下文、放大虚假信心,同时对独立性、标准、数量或问责问题无所作为。
成功条件不是可选的好东西——它们是强制要求。没有所有四个条件,四眼检查提供剧场而不是保护。在没有这些条件的情况下添加更多批准阶段只是创造更精心的剧场。组织必须创造这些条件或承认控制实际上不起作用并实施替代方案。
更好的替代方案:自动化胜过人工勤勉
四眼检查的根本问题是它们依赖于在使勤勉几乎不可能的条件下的人工勤勉。解决方案不是更好的培训或更严格的政策——而是自动化。
人类在重复验证任务上很糟糕。我们会疲劳、分心和自满。我们受关系、压力和认知偏见影响。但我们在判断调用、创造性问题解决和处理新情况方面很出色。
有效的控制利用自动化来做机器擅长的事情,并为人类擅长的事情保留人工判断:
自动化验证
自动化验证为人类难以可靠应用的规则提供一致、不知疲倦的执行。更重要的是,自动化控制随着政策演变和新威胁出现而持续改进。
业务规则执行:系统自动根据业务规则验证交易。无效交易在人工审查前被拒绝。人类审查例外,不是常规交易。随着合规要求变化,规则在代码中更新并立即应用于所有交易。新的监管要求成为自动化检查而不是培训主题。
自动化测试:全面的测试套件自动验证代码变更。单元测试验证功能。集成测试捕获交互错误。负载测试验证性能。安全扫描检测漏洞。人类审查测试结果,不只是代码。当新的漏洞模式出现时,安全扫描工具更新并立即检查所有代码。当性能要求变化时,负载测试阈值自动调整。
模式检测:异常检测识别不寻常的交易进行审查。机器学习标记偏离正常模式的情况。部署监控检测异常行为。人工审查专注于真正可疑的活动。随着攻击模式演变,检测模型在新数据上重新训练。随着系统行为变化,基线自动调整。
限制控制:硬限制防止过度交易,无论批准如何。系统强制的阈值不能被双重批准覆盖。部署门阻止失败自动化检查的变更。技术控制为人工判断提供后备。当风险容忍度变化时,限制集中更新并立即应用于所有系统。
持续改进:自动化验证的关键优势是持续改进。当事件发生时,新检查被添加以防止再次发生。当合规政策变化时,验证规则立即更新。当发现新的安全漏洞时,扫描工具在所有代码中检测它们。人工审查者必须单独重新培训并希望他们在压力下记住新要求。自动化系统从部署的那一刻起一致地执行新要求。
每个事件都成为加强自动化控制的机会。通过代码审查的生产错误成为新的自动化测试。通过双重批准的欺诈交易成为新的业务规则检查。两个审查者错过的安全漏洞成为新的扫描规则。系统从失败中学习并系统地防止它们,而不是希望人类记住经验教训。
职责分离
功能分离:不同的人在流程中执行不同的功能。一个人发起,另一个批准,第三个对账。没有单个人控制整个流程。
系统强制分离:系统防止同一用户执行冲突功能。技术控制自动强制分离。人类串通变得不足以绕过控制。
检测控制
持续监控:所有交易监控可疑模式。生产部署监控错误和性能下降。异常警报触发调查。检测发生,无论批准流程如何。
金丝雀部署:变更首先推出到小百分比的用户。自动化监控在完全部署前检测问题。问题在有限爆炸半径内被捕获。渐进推出提供多个验证点。
定期对账:独立对账在事后捕获错误和欺诈。部署后验证确认变更按预期工作。差异触发调查。随时间的多层验证。
审计抽样:双重批准交易的随机抽样。部署代码的质量检查验证审查者勤勉。事后审查检查批准质量。维持批准质量的问责。
前进之路
四眼检查将继续存在——它们嵌入在法规、标准和公司政策中。但理解它们的局限性能够实现更好的结果:
不要仅仅依赖四眼检查:分层多个控制。将人工审查与自动化验证结合。使用检测控制捕获失败。在生产中,将代码审查与自动化测试、金丝雀部署和监控配对。
为人类行为设计:承认人类在压力下橡皮图章。减少批准数量。提供明确的验证标准。给审查者要验证内容的检查清单。测量质量,不只是速度。跟踪多少百分比的审查捕获实际问题。
维持独立性:确保审查者真正独立。分离组织单位。不同的激励结构。没有关系依赖。轮换审查分配以防止伙伴关系模式。
验证验证者:定期审计批准质量。抽样双重批准的交易和部署。审查事件以查看批准流程是否失败。让审查者对勤勉负责。奖励那些捕获错误的人。
自动化人类做得不好的事情:人类在重复验证上很糟糕,但在判断调用上很好。自动化语法检查、安全扫描、测试执行和合规验证。为架构决策、业务逻辑和边缘情况保留人工审查。
投资持续改进:将自动化控制视为随威胁和要求演变的活系统。当事件发生时,更新自动化检查以防止再次发生。当政策变化时,立即更新验证规则。当新漏洞出现时,更新扫描工具以检测它们。持续改进的自动化控制比依赖记忆和勤勉的人工审查提供更好的保护。
四眼检查不是固有危险的——但对它们的盲目信仰是。它们是许多控制中的一个,只有在特定条件下才有效,并且容易受到人性的影响。理解这些局限性的组织构建更好的系统。那些不理解的创造危险的盲点,同时相信他们受到保护。
最好的组织不问"我们有四眼检查吗?"他们问"我们的四眼检查实际上在工作吗,当它们失败时会发生什么,什么自动化控制支持它们?"他们投资于持续改进的自动化验证,而不是在压力下退化的人工流程。