jevbooks

← 全部设计模式

信号灯

分级阈值 · Traffic light

红停黄看绿行

几个动作就配几条线:越难收回的动作,要求越高的把握。

.45.8放行追问拒绝放行追问拒绝

问题

你在做一个代码评审机器人。每次有人提交,它读一遍 diff(这次改动的那几行),判断有没有违反团队的规范。你给它配了一个数:超过 0.5 就挡住合并。

第一个撞上它的同事,一次评审收到十四条阻断评论,其中十二条是错的。他照样合了代码,把机器人在自己仓库里关掉,还劝别人别装。

你想到的第一个修法是把线抬到 0.9。噪音确实没了,别的也一起没了:那两处真的违反规范的改动,概率是 0.62,现在机器人对它们也一声不吭。一条线要么吵,要么哑,它没法「小心」。

真正的毛病在于:你的机器人能做三件事——自己改掉、留一句话给人看、什么也不说——而一条线永远只能在其中两件之间挑。

解决方案

信号灯模式说:先数清楚你到底有几个动作,再从重到轻,每个动作配一条线。把动作清单老老实实写下来——自己改、提一句、不出声——因为决定的形状是这张清单,不是模型。

最难收回的动作配最高的线。这个示意策略把改代码的线放在 0.8、评论放在 0.5;两个数字都不能证明错误率可接受。先用带标签的调参样本选线,再用独立验证样本检查它是否适合自己的任务和模型版本。最低那条线以下的一律落到「什么也不做」,而「什么也不做」同样是一个决定,同样该被计数。

把这几条线放在一起,别散在代码各处的 if 里。哪天有人说机器人太吵,你想动的是一个数,而且想一眼看清跟着它动的都有什么。

问 · 答 · 拍

  1. 问把改动的那几行和一条团队规范放进去,问它:这次改动违反这条规范吗?
  2. 答0.83。
  3. 拍过了最高那条线,机器人自己把代码改掉。要是回来的是 0.62,它只会留一句话;0.30 就什么也不说。

名字从哪来

一个路口只有一盏灯,就只有两种状态,司机不是猛冲就是急刹。黄灯是专门为中间那种情况留的:慢下来看一眼。你的中间那一档就是黄灯——而且跟真的黄灯一样,得真有人在看,它才有用。

什么时候用

你手上确实有三个以上代价不同的动作:自动改掉、交给人看、放过去。

什么时候别用

你只有两个动作。别为了凑出档位发明一个中间动作:没人负责看的那一档,会悄悄变成「什么也不做」,而且几个月都没人发现。

做这件事的项目

  • abide — 用 Jev 强制编码代理遵守项目规则。
  • jev-axi — 为 TypeSafe 的 Jev 提供的 CLI:从 shell 快速获得校准判断。
  • jev-review — 由 Jev 把关的分阶段代码审查工作流与本地仪表盘。

用这种模式的全部项目 →

看谁的代码
想看代码
const TIERS = [[0.8, "fix"], [0.5, "comment"]];   // 示意阈值,使用前需本域验证
function route(p) {
  for (const [line, action] of TIERS) if (p >= line) return action;
  return "quiet";
}
switch (route(answers.violation.p)) {
  case "fix":     return rewrite(edit);          // 不问人,自己改
  case "comment": return mention(edit);          // 占一个人十秒钟
  default:        return count("quiet");         // 什么也不做,这也是一个决定,要数
}
jevbooks 怎么认出它

我们怎么知道一个项目用没用这一招?拿它的 README 问 Jev 一句话,Jev 给个百分比,数字越高说明越像。你要抄这道题,记住一点:别问「这个项目好不好」,要问「有没有讲到这一件具体的事」。

questions.json · 每份 README 都发这道题
{
  "tiered-thresholds": {
    "type": "noul",
    "instructions": {
      "what": "Does the text describe two or more probability cut-offs mapping to different actions, such as act / flag / clear or deny / ask / allow?",
      "not_for": "A single yes-or-no threshold at 0.5."
    },
    "criteria": {
      "true": "The text explicitly describes this. One sentence is enough; other content does not cancel it.",
      "false": "The text does not describe this."
    }
  }
}

用 Jev 做一个 →