一人工程 · solus opus

← 全部作品

solo-engineerinfrastructurefeature-flagdeploymenthn-show

Feature flag 不必要:我就是 flag

solo engineer 没有 feature flag。simedw 一个人 deploy Core ML iPhone app——他决定何时打开新 feature,他决定何时关闭,他决定 rollout 给哪个用户。feature flag 是大公司协调工具,一人工程的决定 = flag。

solo engineer 没有 feature flag。

大公司做 feature flag:

  • LaunchDarkly / Split / Statsig / Optimizely(feature flag 平台)
  • 多 flag 矩阵(10 个 flag × 100 个 user segment × 100 个 treatment = 10 万种组合)
  • A/B test 集成(flag = experiment bucket)
  • 5% rollout → 25% → 50% → 100%(分桶灰度)
  • 即时回滚(kill switch 一秒内关闭 feature)

一人工程做 feature flag:

  • 没有 flag
  • 没有 rollout
  • 没有 kill switch
  • 没有 A/B test

simedw 的 feature flag 哲学

simedw 是 iPhone piano app。他没有 feature flag:

  • top-k / top-p / min-p / XTC / top-h / Mirostat v2 采样切换:simedw 自己选择哪个 sampling 方法作为默认
  • Core ML INT8 量化:simedw 决定是否 quantize
  • RoPE KV cache ring buffer:simedw 决定是否实现(Core ML 不暴露 Q/K/V → 算了,挺快乐)
  • DPO β=0.03 vs β=0.10:simedw 自己选择哪个超参

每个 decision 都是 simedw 自己做的。没有 flag。

simedw 的 iPhone app 新版本正在 App Store 审核:

  • 11 天审核期(苹果审核不是 flag,是 gate)
  • simedw 提交后等 11 天
  • 通过后所有用户同时收到新版本
  • 没有 5% rollout,没有灰度

不需要 LaunchDarkly,因为:

  • 开发者就是唯一一个 maintainer
  • 开发者的决定 = 100% 用户的决定(如果有 100 个用户都像开发者)

feature flag 在大公司的政治

feature flag 不是工具——是协调工具

  • 工程师:要 flag 控制功能上线时机
  • PM:要 flag 控制 A/B test 时长
  • SRE:要 flag 紧急回滚
  • 安全:要 flag 限制新 feature 给特定用户
  • 法务:要 flag 控制受监管地区的 feature

每个 stakeholder 都要 flag 协调:

  • 工程师 flag = "我做完 feature,可以上线"
  • PM flag = "feature 给 5% 用户 A/B test"
  • SRE flag = "feature 出问题,一秒回滚"
  • 安全 flag = "feature 只给内部员工"
  • 法务 flag = "feature 在 EU 关闭"

没有 flag = 没有协调 = 10 个团队撞车。

一人工程没有协调问题:

  • 开发者 = 工程师 = PM = SRE = 安全 = 法务
  • 一个人的决定 = 100% 协调
  • 不需要 flag

rollout 在大公司的必要性

大公司有 rollout——5% → 25% → 50% → 100%:

  • 5% rollout:1 万用户先试 → 看 error rate → 决定下一步
  • 25% rollout:5 万用户 → 看 metric → 决定下一步
  • 50% rollout:50 万用户 → 看 metric → 决定下一步
  • 100% rollout:所有用户 → 完成

每次 rollout 决策基于 metric:

  • error rate < 0.1% → 继续 rollout
  • error rate > 0.5% → 回滚
  • metric 不显著 → 等下个星期

一人工程没有 rollout。一人工程有:

  • 新版本提交 App Store:等 11 天审核
  • 审核通过:所有用户同时收到
  • 审核拒绝:修复后重新提交

不需要 5% rollout,因为:

  • 开发者自己测过
  • Crashlytics free tier 监控 crash
  • App Store 评论反映用户反馈

kill switch 在大公司的必要性

大公司有 kill switch——一秒内关闭 feature:

  • feature 出 bug → kill switch 关闭 → 100% 用户立即恢复旧版本
  • feature 被 exploit → kill switch 关闭 → 100% 用户立即安全
  • feature 违反 SLA → kill switch 关闭 → 不赔钱

kill switch 需要:

  • flag 系统(LaunchDarkly / Split)
  • 监控系统(Datadog / Grafana)
  • 决策流程(oncall 工程师决定何时按 kill switch)
  • 自动回滚(Datadog trigger 自动关 flag)

一人工程没有 kill switch。一人工程有:

  • App Store 加急审核:紧急 bug 提交后 24 小时审核
  • 撤回版本:苹果不允许撤回已发布版本,只能发新版本修复
  • 用户退款:用户自己决定是否退款
  • 自己快速响应:simedw 看 Crashlytics → 修复 → 提交新版本

不需要 kill switch,因为:

  • iPhone app 不是 server,不能远程 kill switch
  • 苹果 App Store 不允许撤回,只能 forward fix
  • 紧急响应 = 24 小时加急审核 + 新版本

A/B test 在一人工程里的位置

之前写过 no-a-b-test——A/B test 在一人工程里 = HN 评论 / App Store 评论。这次重点是 flag vs A/B

  • A/B test = 用户反馈对比(user feedback comparison)
  • feature flag = 用户分组(user segmentation)

A/B test 是 数据收集,feature flag 是 用户分组

大公司同时用 A/B test + feature flag:

  • feature flag 分配用户到 treatment A / treatment B / control
  • A/B test 收集 metric 比较 treatment vs control

一人工程没有 flag,没有 A/B test。只有:

  • App Store 评论:用户主动评论
  • HN 评论:用户主动评论
  • Crashlytics:自动收集 crash

不需要 flag 分配用户——用户自然形成对照组(喜欢新版的 + 不喜欢新版的)。

一人工程的 flag 哲学

大公司 feature flag 是因为他们有:

  • 100 万用户(需要分桶)
  • 10 个 PM(要 flag 协调)
  • 10 个 SRE(要 kill switch 紧急响应)
  • 5 个法务(要 flag 限制地区)
  • 1 个安全团队(要 flag 限制用户)

一人工程没有这些。一人工程有:

  • 100 用户(不分桶,所有用户同时收到)
  • 0 个 PM(自己就是 PM)
  • 0 个 SRE(自己就是 SRE)
  • 0 个法务(如果出问题自己承担)
  • 0 个安全团队(如果被 exploit 自己处理)

feature flag 在一人工程里 = 自己的决定

我就是 flag

大公司 feature flag 是配置

  • LaunchDarkly dashboard 上 100 个 flag
  • 5% / 25% / 50% / 100% rollout 按钮
  • kill switch 一秒关闭

一人工程 feature flag 是决定

  • 脑子里决定
  • 不需要 dashboard
  • 不需要配置
  • 不需要按钮

simedw 的 iPhone app 新功能:

  • simedw 决定打开
  • simedw 决定关闭
  • simedw 决定发给谁(所有 iPhone 用户 = 100%)

没有 flag 配置——simedw 的决定就是 flag。

苹果 App Store = 大公司的 feature flag

讽刺的是:App Store 审核就是大公司的 feature flag 模拟:

  • 11 天审核 = 灰度期
  • 审核通过 = 100% rollout
  • 审核拒绝 = kill switch

但这是苹果的 flag,不是 simedw 的 flag。

simedw 不能秒回滚(App Store 不允许撤回),但 simedw 可以:

  • 加急审核(24 小时紧急)
  • 新版本覆盖(forward fix)
  • 用户通知(App Store release notes)

一人工程 + 我就是 flag

simedw 没有 feature flag。 simedw 决定新功能。 simedw 决定采样方法。 simedw 决定 KV cache 实现。 simedw 决定 β 超参。

feature flag 在一人工程里不是工具,是决定


solo engineer 没有 feature flag。 solo engineer 的 feature flag = 我自己的决定。

solus opus.