KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

04 · STAR 与话术:把交付经历讲成一个可信的故事 — keel 龙骨

这一章回答:怎么把"我配了一条流水线"讲成"我有工程判断力"。同样一段经历,讲法不同,结论完全不同。

这一章回答:怎么把"我配了一条流水线"讲成"我有工程判断力"。同样一段经历,讲法不同,结论完全不同。

一、为什么交付类经历特别适合 STAR

交付工作的成果通常是消除了尚未发生的麻烦:一条流水线跑得好,表现为"什么事都没发生"。这让你的经历天然难以讲述——所以要用人造的结构把它显现出来。

STAR 在这里的用法:

要素 交付话题下该怎么填 反面样例
S(情境) 说清规模与约束:单人/小队、几个服务、发布频率、有没有 K8s 只说"公司项目"
T(任务) 说清你被要求解决的是哪一类风险:怕发错、怕改了忘跑测试、怕发布过程不可重复 说"负责 CI/CD"这种空话
A(行动) 必讲设计取舍:为什么这么拆 job、为什么选 X 不选 Y、做了什么保证可重跑 只罗列步骤
R(结果) 机制 + 可验证事实:链路可重跑、免长期令牌、发布前置 Junior 检查;多处可公开查 编出来的百分比

二、三份可直接使用的 STAR 卡

卡片 A:完整发布链(开源主牌)

S  个人开源 CLI 工具,多系统多 Python 版本用户,手工发版既慢又容易漏校验。
T  目标不是"自动发",而是"发布过程可重复、发错了能安全地再来一次"。
A  拆成两个工作流:CI 在 push/PR 跑矩阵测试(3 OS × 2 Python,fail-fast: false)
   + ruff/mypy strict + 构建 + wheel 冒烟;Release 才触发发布链,三段有依赖顺序
   (PyPI → npm → Homebrew,因为下游引用上游产物)。四件事是刻意做的:
   ① 版本号以 tag 为事实源,构建前写回清单并做三方一致性校验;
   ② 每个渠道都做成幂等(skip-existing / 查重 / 读已发布产物),部分失败可以整体重跑;
   ③ 用 OIDC 换取发布凭证,仓库里不留长期令牌,npm 加 provenance;
   ④ 冒烟测的是产物不是源码——干净环境装 wheel 再跑 CLI。
R  有任何一段失败都可以原地重跑而不产生半成品;发布权限不再依赖某串需要保管的 token;
   全过程在 GitHub Actions / PyPI / npm 上公开可查。

关键点:A 段的四件事每一件都能被追问"为什么这么做",这才是这段讲的杀伤力所在。

卡片 B:发布过程的固化(公司侧,诚实版)

S  公司项目多服务(API + 异步 worker + Redis + MySQL),Compose + Nginx 部署,发布频率低但每次影响面大。
T  当时的痛点不稳定:每次上线步骤不完全一样,回滚靠人记。
A  我没有引入重平台(考虑过,但不划算:服务数不多、没有专人维护),做的是把变量消掉:
   ① 写清楚依赖启动顺序与健康判断;② 发布脚本化并保留可逆性;
   ③ 日志与版本号带上,出问题能定位到具体版本;④ 回滚步骤写进文档而不是记在某人脑子里。
R  发布从"看谁值班"变成"按文档执行";回滚有明确步骤。
   局限我也清楚:这条链路没有自动化触发,仍依赖人按一下。

这张卡的价值在于证明你有"取舍能力"——知道什么时候不该上重方案,比会上方案更稀缺。

卡片 C:一次被流水线挡住的错误(体现 CI 的目的)

S  一次重构的中间提交,本地只用了一个环境验证。
T  提交时我以为改动很小。
A  推送后矩阵里的另外两个平台报红,类型检查与某个平台的路径处理同时出问题。
R  这个红 run 我没有绕过它去合并,而是修完再推。它把"我以为改完了"挡在了发布之前——
   这恰恰是 CI 的目的:它提供的价值是信息,不是装饰。

这张卡的妙处在于用一次"失败"证明你理解 CI 的目的,而且完全诚实。

三、时间版:30 秒与 90 秒两个模板

30 秒版(被问"讲讲你做过的 CI/CD"):

"我的开源项目有一套完整链路:CI 侧是三系统两版本的矩阵测试,串了 pytest、ruff、mypy strict 和 wheel 冒烟;CD 侧是打 Release 才触发的多渠道发布链,用 GitHub OIDC 换发布凭证、仓库里不留长期令牌,每一段都做成幂等,任何一段挂了都能原地重跑。整套东西在 Actions、PyPI、npm 上都可以直接查。"

90 秒版(技术深聊 / 追问展开):

30 秒版 + 补充三段:
"① 版本管理上 tag 是唯一事实源,构建前会写回清单并做三方一致性校验,因为发布产物不可变,所以构建前必须校验;
② 发布链有依赖顺序,因为 npm wrapper 和 Homebrew formula 都引用 PyPI 上的产物,上游没有下游必失败——这是数据依赖不是拍脑袋;
③ 我还处理了跨系统的最终一致性:PyPI 刚发出来的版本 JSON API 可能还没可见,所以要轮询等待,这个问题形态和处理消息队列的消费滞后其实是一样的。"

第二段的三句分别展示:规范、依赖推理、问题迁移能力——第三句是最容易让人记住的一句。

四、雷区清单(交付话题专属)

❌ 把公司项目的脚本化部署说成 CI/CD            → 三问之内必露
❌ 说"我们用了 XX 平台"但说不出 job 与依赖      → 说明只见过别人搭的
❌ 编"提升了 X% 效率"                          → 追问数据来源就崩
❌ 把没实际运营过的东西说成"我在 DevOps 上很深"  → 方向不对:目标是够用不是转岗 SRE
❌ 被问"这一趴没做过的吧"时辩解                → 承认 + 转向我做过什么
❌ 主动提起 K8s/GitOps 却讲不清适用边界         → 懂名词不懂取舍是减分项
❌ 把 AI 自动修 CI 描述得像万能方案       → 必须同时讲边界,否则显得没真放过权限

五、给面试加分的两个反问

技术面后半段的反问环节,可以用这类问题把对话拉到同等层面:

反问 它在表达什么
"你们现在的发布频率大概是怎样的?回滚一般需要多久?" 你关心的是交付健康度,而不是单点技术栈
"流水线这边,最让团队难受的是排队慢、还是 flaky 测试?" 你有运营流水线的具体经验,能分辨不同类型的痛

这两个问题对方一答,你就知道这家公司的工程成熟度——这也是它们真实的价值:你在面试对方。

动手:可观察结果

动作 产出物 判断标准
把三张 STAR 卡写进自己的话术文档 三份文字稿 每张都能在不看稿的情况下讲完
录一遍 30 秒 + 90 秒版本 音频 时长达标;无"呃/那个/大概"超过 3 次
自测雷区清单 逐条打勾 七条里有哪条是自己会犯的,标出来改
准备两个反问 文字 能在对方回答后接得上话,而不是问完就断
找人做一次 15 分钟模拟 反馈记录 对方的复述里出现了"幂等/OIDC/产物冒烟"中的至少两个

故障注入

注入方式 观察什么 说明的现象
讲完被人复述一遍 对方记住了哪几个词 记住的是"搭过流水线"还是具体机制,差别很大
让对方打断追问某一步 能否展开三层 只能展开一层说明没动手做过
对方说"这些平台都能自动做啊" 你的回应 好答案:是工具能自动做,但幂等与权限边界是设计出来的不是自动的
讲公司项目时被人一句"所以没有 CI?"打断 会不会慌 标准处理:承认 + 解释为什么当时那样是合理的 + 转向开源实绩
反问后对方说"我们没统计过" 能否顺势 可以顺势讲 DORA 指标,这是加分机会

自测题

  1. 为什么交付类经历特别需要用 STAR 显式地讲出来?
  2. 卡片 A 的四个刻意设计,各自对应的"为什么"是什么?
  3. 卡片 B 证明了哪一种比"会上重方案"更稀缺的能力?
  4. 90 秒版里最能体现"问题迁移能力"的是哪一句?
  5. 雷区清单里,你自己最可能踩的是哪一条?打算怎么提前纠正?

进入 keel 阅读