一只阿木木

写 Bug 的人也需要第二大脑:一次线上事故的复盘记录

写 Bug 的人也需要第二大脑:一次线上事故的复盘记录

副标题:从「周五晚被电话吵醒」到「有模板、有记录、有改进」


我是一只阿木木,一个写后端代码、也常写 Bug 的普通人。

如果你也是写后台、值班、被电话吵醒过的那种人,大概率经历过这种场景:

  • • 手机半夜震个不停:“线上有问题,快看一下!”
  • • 各种报警、群消息、语音 call 一起涌进来
  • • 你一边开着日志、一边连着数据库、一边和产品语音,对着屏幕满头问号

那一刻你脑子里只有一件事:先把火灭了。

但等问题解决、大家散场之后:

  • • 事故细节已经记不清
  • • 问题是怎么排查出来的?后来怎么修复的?
  • • 哪些地方其实可以提前预防?
  • • 下次遇到类似情况,还会不会再乱成一团?

坦白说,之前的我是——每次线上事故都是「重新体验一次恐慌」。
等下一次再出事,又从零开始懵。

直到有一次事故之后,我认真做了一次复盘,
并且把这次经历塞进了我的第二大脑(Obsidian + AI)里。

现在再遇到线上问题的时候:

  • • 我有一个事故记录模板,一边处理一边填
  • • 我能在 Obsidian 里,迅速找到过去类似问题的排查思路
  • • 事后复盘,有模板、有卡片、有 checklist,
      每次事故都真的变成了「成长的 Bug 修复」。

这篇文章,是一次完整的故事复盘:

  • • 那次真实的线上事故,到底发生了什么
  • • 在慌乱和压力中,我是怎么一点点用第二大脑「托住自己」的
  • • 事后我是如何把这次事故,固化成「可复用的知识和流程」

希望你看完之后,可以带走三样东西:

  1. 1. 一套可以直接照抄的「事故记录模板」
  2. 2. 一条线上事故时「第二大脑介入」的流程
  3. 3. 以及,也许是最重要的——写 Bug 的人,可以怎样不再写同样的 Bug

一、事故那天的晚上:报警、恐慌和一地鸡毛

时间是某个周五晚上 10 点多。

那天我本来已经洗完澡,打开了游戏,准备愉快入坑。
手机突然开始疯狂震动:

  • • 钉钉:[严重告警] 支付成功率突降
  • • 监控群:
    • • 「有用户反馈支付失败」
    • • 「订单量突然掉了一半」
  • • 产品给我打电话:「是不是你下午发版的那个功能出了问题?」

一瞬间,熟悉的「完了、好像是我搞的」感袭来。

1.1 初步信息:一团糊

我连上电脑,打开监控和日志,大概看到这些信号:

  • • 某支付接口的 5xx 报警暴涨
  • • 订单系统请求量下降,成功率下滑
  • • 后台有少量「重复扣款」投诉(用户说钱扣了两次)

脑子里的问号越来越多:

  • • 是第三方支付通道的问题?
  • • 还是我们新加的重试逻辑出问题?
  • • 为什么有「支付失败」和「重复扣款」这两种看起来相反的现象?

平时写 Bug 的时候,你会觉得「这 Bug 不大,下次小心点就是」。
但线上一出事,这种「不大」就会在你心里被放大成:

「是不是会闹到领导那里?」
「是不是会影响 KPI?」
「会不会搞出新闻那种大事故?」

1.2 情绪状态:脑子完全不清醒

那 10 分钟我的真实状态是:

  • • 开了十几个窗口,切来切去
  • • 想起以前的类似问题,但只模模糊糊地记得一点
  • • 群里大家你一言我一语,我根本顾不上记录

那一刻我很清楚地意识到一件事:

不是我不会排查问题,而是我根本装不下这么多东西。
我需要一个「外置大脑」,帮我把现在发生的事装起来。

这就是这次事故中,「第二大脑」真正开始发挥作用的地方。


二、第二大脑是怎么介入这次事故的?

很多人听「第二大脑」,会以为是平时记读书笔记的那种系统。
但对我来说,它在事故里更像一个「作战记录板 + 应急手册」。

这次事故里,它帮了我三件大事:

  1. 1. 稳定住我的「注意力」:有模板,有结构,不至于乱成一团
  2. 2. 快速调出「旧经验」:过去类似事故的排查记录能马上看到
  3. 3. 为事后的复盘和改进打基础:现在记录的东西,未来都能用得上

下面我就按照时间线,把这三件事展开讲。


三、现场记录:从「乱七八糟的对话」变成「结构化事故日志」

3.1 打开 Obsidian,先建一条事故记录

意识到自己开始慌乱之后,我做了一个当时看起来有点「拖后腿」的动作:

打开 Obsidian,新建了一条事故记录笔记。

我有一个预先准备好的模板,叫:
tpl_线上事故记录.md,内容长这样:

Markdown

# 线上事故记录|{简要标题}

## 1. 基本信息

- 发生时间:
- 发现人/渠道:
- 涉及系统/服务:
- 当前影响范围(粗估):

---

## 2. 现象 & 指标

- 监控报警:
- 用户反馈:
- 日志特点:

---

## 3. 临时决策 & 行动

- 临时止血措施:
- 涉及的操作(回滚/限流/手工处理):
- 当前负责人:

---

## 4. 排查思路(实时记录)

时间线(按时间倒序补):
- [22:10] 做了什么?观察到什么?
- [22:15] 假设 A(后来被推翻)
- [22:25] 聚焦在 X 服务的 Y 接口
...

---

## 5. 初步结论(事故当晚)

- 疑似根因:
- 后续需要验证的点:
- 预计第二天要做的事:

那一刻我做的,就是一边排查、一边在这条笔记里补时间线:

  • • 22:12:第一次看到支付成功率下滑
  • • 22:18:发现最近 1 小时内有多次重试记录
  • • 22:25:怀疑和下午上线的幂等逻辑有关
  • • 22:30:先对部分流量熔断,避免进一步重复扣款

看起来像是在「记日记」,但这有两个非常直接的好处:

  1. 1. 每做一步,我都会强迫自己「用一句话说清楚我在干嘛」
     ——这样可以防止自己在日志里乱翻半小时,忘了目标
  2. 2. 一旦群里有人问「现在情况怎么样了」,
     我可以直接从笔记里拷一段发过去,而不是临时组织措辞

3.2 用 AI 帮我从混乱对话里抓要点

事故过程中,群里消息飞得很快:

  • • 运维在报硬件和网络情况
  • • 前端在说用户反馈
  • • 产品在问「影响多少订单?」
  • • 领导在问「能不能先恢复核心功能?」

我根本没空一条条理清楚。

我做了这样一件事:

  • • 定期(比如每 10–15 分钟),把最近一段群聊的关键内容复制出来
  • • 丢给 AI,说:

text

这是我们在事故过程中的一段对话记录,内容比较乱:

{粘贴最近 10 分钟的群聊关键信息}

请你帮我:
1. 用 3–5 条 bullet,总结出目前大家已经确认的事实(避免重复讨论)
2. 用 2–3 条 bullet,总结出目前还存在分歧/不确定的点
3. 给出 1–2 条建议:接下来最优先要验证的假设是什么?

AI 给出的结果,我会:

  • • 把「已确认的事实」贴回事故记录的【现象 & 指标】部分
  • • 把「待验证的问题」贴在【排查思路】里,作为接下来行动的 checklist

在这个过程中,AI 没有替代任何技术判断,
但帮我做了一件很关键的事:

在大家都很紧张、说话混乱的时候,
有人帮你按时间把信息「理一理」。

这对当时那个脑子快烧糊的我来说,非常重要。


四、问题定位:第二大脑帮我「叫出问题的名字」

这个事故的根因,最后被我们确认是:

在新增的重试机制 + 不完善的幂等 Key 设计之下,
在某些边缘网络场景下,出现了重复扣款。

这个结论听起来有点教科书,但我们当时得到它,其实走了不少弯路。

4.1 过去的踩坑记录,被我从 Obsidian 里翻了出来

在排查的过程中,有一个瞬间让我印象很深:

  • • 我在事故记录里写了一句:
      「感觉和最近加的幂等逻辑 / 重试策略有关系」
  • • 然后我突然想起:
      「我好像以前记过一条关于重试 + 幂等导致重复操作的笔记。」

于是我在 Obsidian 里搜了下「幂等」「重试」,
翻出了几个月前写的一条卡片:

Markdown

# 案例|重试 + 幂等Key失误导致重复执行

## 场景

...

## 根因

- 幂等 Key 设计只考虑了请求体的一部分
- 重试时生成了新的 Key,没有命中幂等缓存

## 教训

- 幂等 Key 设计需要完整覆盖「业务唯一性」维度
- 重试和幂等必须联合设计,而不是分别看

这条笔记本来只是我之前看一篇技术博客 + 自己想法的产物,
当时记完也没多想。

但是在这次事故里,它起到了两个作用:

  1. 1. 帮我叫出了问题的名字:
     「重试 + 幂等 Key 设计不完善 → 可能导致重复扣款」
  2. 2. 给了我一个排查路径:
     检查最近上线代码里幂等 Key 是怎么设计的、重试策略是怎么写的

于是接下来的动作就非常顺:

  • • 看配置:最近是不是改过重试策略
  • • 看代码:幂等 Key 包含哪些字段
  • • 查日志:问题订单的 Key 是否多次出现

几轮对比下来,问题基本指向:

「我们在一个子场景里,没有把用户 ID 和业务订单号一起纳入幂等 Key,
导致重试时命中错误。」

如果没有那条之前的 Obsidian 卡片,我多半还是能查出来,
但很可能会多走很多「先怀疑第三方 → 先怀疑网络 → 再怀疑新代码」的弯路。

4.2 AI 在这里做了什么?

在这个阶段,我主要让 AI 做两件事:

  1. 1. 帮我验证理解有没有问题

text

我现在对问题的初步理解是这样的:

{用自己的话描述:重试 + 幂等 Key 设计不完善 → 某条件下重复扣款}

请你从后端工程师的角度看看:
1. 我的理解有没有明显错误或逻辑漏洞?
2. 在这个问题上,还有哪些可能的隐含风险,是我现在没想到的?
  1. 2. 帮我写给非技术同事能看懂的解释

text

请帮我把下面这段技术原因,改写成产品/运营也能看懂的版本:

{粘贴技术原因说明}

要求:
- 不提幂等、重试这些术语
- 用现实生活中的比喻解释「重复扣款」是怎么发生的
- 控制在 200 字以内

得到的结果,我发给了产品和运营,
他们也能更快地理解:「这是哪里出问题了、接下来要干嘛」。


五、事后复盘:把事故变成第二大脑里的「知识资产」

事故当晚,我们做了临时止血和紧急处理:

  • • 限制了有风险的部分请求
  • • 手工处理了少数重复扣款的用户
  • • 准备第二天白天上线修复版本

真正决定这次事故「值不值」的,是之后的那一周。

5.1 用 Obsidian + AI 完整走了一次复盘流程

事后,我专门在 Obsidian 里,为这次事故建了一条复盘笔记:
2024-支付重复扣款事故-复盘.md

模板大致是:

Markdown

# 线上事故复盘|支付重复扣款

## 1. 事故概览(事实)

- 时间:
- 发现方式:
- 影响范围(用户数 / 金额 / 时长):
- 最终根因(简述):

---

## 2. 详细时间线(来自事故记录)

- [22:10] ...
- [22:18] ...
...

---

## 3. 技术原因分析

### 3.1 表面原因(代码/配置层面)

### 3.2 深层原因(设计/流程/沟通层面)

---

## 4. 哪些是「做对了的」?

- 本次排查中的亮点:
- 哪些预警/监控/流程起了作用:

---

## 5. 哪些是「没做好的」?

- 技术欠缺:
- 流程缺失:
- 沟通问题:

---

## 6. 后续行动 & 负责人

- 行动 1:
- 行动 2:

---

## 7. 对我个人的启发(成长 Bug 修复)

- 哪些认知是以前没有的?
- 我打算在自己的第二大脑里新增哪些卡片/模板?

这里面有几部分,我是用 AI 来「加速」的:

  1. 1. 时间线:直接从那晚的「事故记录笔记」里拷过来,
     再请 AI 帮我压缩 & 衔接语句。
  2. 2. 「做对了什么 / 没做好什么」:
     我先写 bullet,再让 AI 帮我分类和优化表述。
  3. 3. 「技术解释」:
     先写工程师版,再让 AI 帮我生成「面向产品/运营版」。

但是有一个部分,是我坚持自己写的——

5.2 「成长 Bug 修复」:把这次事故,修进自己的第二大脑

在复盘的最后一节,我给自己留了一个「成长 Bug 修复」小节。

我会诚实写下几条东西,比如:

  • • 以前以为「重试机制」= 尽量帮用户成功,现在知道必须和幂等严格绑定
  • • 自己有「上线压力大时,习惯先放过一些边缘场景」的坏习惯
  • • 每次事故后才写复盘,很容易只记得结果,忘了自己当时的思考过程

然后,我会在第二大脑里干三件事:

  1. 1. 新增一条「幂等 + 重试设计 checklist」卡片

Markdown

# Checklist|幂等 + 重试设计自查

- 幂等 Key 是否覆盖了业务上的「唯一性」?
- 重试策略是否考虑了:
  - 第三方超时
  - 客户端重试
  - 我们自己的后台重试
- 是否对「幂等失败」有监控?
- 是否在评审时进行了一次「最坏场景」演练?
  1. 2. 更新「线上事故记录模板」

加入了一项:

Markdown

## 0. 事故级别 & 决策人

- 级别(P0/P1/...):
- 临时决策拍板人:

避免未来在「谁有权拍板先止血」上浪费时间。

  1. 3. 在个人「成长 Bug 列表」里,新增一条

Markdown

# 成长 Bug|习惯在压力下牺牲边缘场景

- 触发案例:支付幂等性事故
- 现象:评审时觉得「这种情况很少,不会发生吧」,没有继续往下推
- 修复方式:
  - 对关键链路的「边缘场景」,至少列出 3 种最坏情况
  - 在 Obsidian 里建一个「最坏场景清单」模板,下次上线前过一遍

这三件事,让这次事故真正留在了我的第二大脑里,
而不是变成「某年某月我好像也出过一次线上问题」这种模糊记忆。


六、如果你也想让线上事故不再白挨骂,可以这样开始

说完故事,总结一下这次经历里「第二大脑 + AI」真正做了什么。

6.1 事故当下:一个简单的「作战记录」模板

你可以抄我这个事故记录模板,放进任何笔记软件:

Markdown

# 线上事故记录|{简要标题}

## 1. 基本信息

- 时间:
- 发现方式:
- 涉及系统:
- 影响范围(初步):

## 2. 现象 & 指标

- 报警:
- 用户反馈:
- 监控变化:

## 3. 临时行动(止血)

- 措施:
- 风险:

## 4. 排查时间线(实时补)

- [hh:mm] 做了什么,看到什么

## 5. 当晚初步结论

- 疑似根因:
- 第二天要验证的事:

关键点不是模板有多完整,而是:
从下一次事故开始,一边排查,一边按这个结构记录。

6.2 事后复盘:用 AI 帮你「写清楚」,而不是「替你负责」

复盘时可以用到两个简单的 Prompt:

1)整理时间线

text

下面是我在事故处理过程中记录的一些零散片段:

{粘贴你的时间线/聊天记录片段}

请你帮我:
1. 按时间顺序整理一条清晰的事故处理时间线
2. 使用「[时间] 做了什么 → 得到什么结果」的格式输出

2)帮你把技术原因翻译成非技术版

text

这是我写的技术原因说明:

{技术分析}

请帮我改写成产品/运营也能看懂的版本:
- 不用太多术语
- 强调「发生了什么 → 对用户有什么影响 → 我们做了什么修复」
- 控制在 200 字以内

6.3 长期:在第二大脑里,建立你的「事故知识库」

每次事故结束,你可以在第二大脑里做 3 件小事:

  1. 1. 建一条「事故卡片」:
  • • 标题:案例|xxx 事故
  • • 包含时间、原因、影响、解决方案
  • 2. 从中抽出一个「可迁移教训」:
    • • 变成 checklist 或设计原则,放进你的知识库
  • 3. 在「成长 Bug 列表」里,诚实写下一条:
    • • 这次暴露了你哪方面的习惯 / 认知问题?
    • • 你准备怎么修?

    做了几次之后,你会发现:

    你不再只是一个「在生产上救火的写 Bug 人」,
    而是一个「把每次 Bug 都修进自己系统里的工程师」。


    七、尾声:写 Bug 的人,也配拥有第二大脑

    以前我总觉得:

    • • 第二大脑是给那些「高效人士」「终身学习者」用的
    • • 写 Bug 的人,先把 Bug 写少点再说吧

    但经历过几次线上事故之后,我反而更坚定了一件事:

    越是会写 Bug 的人,越需要第二大脑。

    因为:

    • • 我们要在压力下做决策,要在混乱中抓重点,要在事后诚实面对问题
    • • 光靠一时的记忆和勇气,是撑不住的
    • • 你需要一个「外置空间」,帮你记录、整理、沉淀,再慢慢升级自己

    所以我现在把第二大脑当成是:

    • • 代码层面的「日志 + 监控 +告警 + 自恢复」
    • • 自己成长层面的「记录 + 复盘 + 模板 + 升级」

    如果你最近也经历过线上事故、或者正在担心哪天会遇到,
    不妨从今天开始,先给自己准备一条最简单的「事故记录模板」——

    下一次手机半夜响起来的时候,
    至少你不会再完全靠「硬扛」,
    而是有一块地方,能帮你把这次宝贵(又痛苦)的经历,好好留住。

    如果你愿意,可以在评论里简单写下:

    • • 你最近一次印象最深的线上事故
    • • 以及,你现在有没有在用某种方式记录 & 复盘它