Programmer Interruption — IDE 数据告诉你被打断后多久才能继续敲代码
是什么
Parnin & Rugaber 2009 是第一篇用 IDE 行为数据告诉你”程序员被打断之后,过多久才会重新开始敲代码”的论文。日常类比:像在地铁站门口装计时器——不问你”你回家了吗”,只看你”几点钟刷的卡”。
研究者把一个叫 Mylyn Monitor 的 Eclipse 插件部署到 73 个 Java 工程师 + 12 个 C# 工程师的电脑上,连续 6-12 个月,被动收下来 4.5M 个鼠标键盘事件。然后他们提出一个新指标 edit-lag——一段编程会话里,从第一个事件出现到第一个真正修改代码的事件之间隔了多少分钟。
最被引用的两个数字:只有 10% 的会话能在 1 分钟内开始改代码;30% 的会话超过 30 分钟还没敲下第一个字符。
为什么重要
不知道这篇文章,下面这些事都解释不清:
- 为什么 JetBrains Focus Mode、VS Code Zen Mode、Slack Snooze、GitHub PR Draft 几乎在同一年代集体出现
- 为什么”程序员平均 23 分钟才能恢复 flow”被到处引用,但这数字其实不在这篇论文里
- 为什么”你只是看了眼微信”的代价远比你想象的大
- 为什么写日报、留 TODO 注释、在 Cursor 对话窗里啰嗦解释思路——这些笨办法实际上在修补一个 2009 年就被量化的工程问题
核心要点
读懂这篇论文记三件事就够:
-
edit-lag = 会话开始到第一次改代码的分钟数。类比:你坐回桌前到真正敲下第一个字之间发了几分钟呆。这个数字在 IDE 里能自动测,不需要问你”你恢复了吗”——之前的 HCI 研究都靠日记法 / 自评法,被试容易把”我以为我恢复了”和”我真的在写代码”混为一谈。
-
分布是长尾。10% 会话 < 1 分钟(一坐下就接着改),30% 会话 > 30 分钟(半小时找不回上下文)。中间多数落在 1-15 分钟。长尾才是恢复成本的主要来源——大多数人记得短时间的恢复但忽略掉那条尾巴,所以才会觉得”我感觉每次切回来都很快”。
-
6 类恢复策略,Navigate-to-New 占 83%。多数会话不能直接从上次的位置接着敲,必须先跳到别的文件 / 方法 / 错误信息列表里重新拼一次上下文。“记得自己上次停在哪”的会话只有 17%——但这 17% 里 35% 能在 1 分钟内开始编辑,是恢复速度的最大杠杆。
实践案例
案例 1:把抽象数字变成你自己的体感
跑一个最小自我观察:
# 装 ActivityWatch(开源,本地跑,不上传任何数据)brew install --cask activitywatch# 装 VS Code 插件 aw-watcher-vscode打开 ActivityWatch 自带的 web UI,看自己一周的”应用切换 → IDE 第一次按键”间隔。你会发现:
- 5 分钟以内的短打断(喝水、看微信)→ edit-lag 通常 < 30 秒
- 1 小时以上的长打断(午饭、开会)→ edit-lag 经常 5-15 分钟
数字变体感后再读论文的 Figure 3 长尾分布就一目了然——那个右尾不是”奇葩程序员”,是被开会切片的普通工作日。
案例 2:会话切分阈值的概率论根据
为什么论文用 15 分钟事件间隔 切会话?
事件间隔分布(论文 Section 3.4): <1 秒: 占 60% 以上 1 秒-1 分钟: 占 38% 总计 < 1 分钟: 98% > 15 分钟: < 0.5%任何 ≥ 1 分钟的阈值都能切出”密集事件簇”,但 15 分钟比 1 分钟更稳——能容忍冲咖啡 / 接电话这种”短暂离开但同一会话”。这种用数据反推阈值的写法,是后来所有”开发活动会话化”分析(Meyer 2017 / VS IntelliCode)的祖宗。
案例 3:6 种策略对应你今天用的工具
策略 使用率 现代等价工具1. Continue Last Edit 7.5% IDE 自动恢复光标位置2. Nav-then-Continue Last 17% 最近文件列表(Cmd+E)3. Navigate-to-New Location 83% 全局搜索(Cmd+P)/ Cursor4. View Revision History 4% git log / GitHub PR diff5. View Problem List (errors) 9% IDE 红波浪线 / TS errors6. View Task / Bug List 9% Linear / Jira / TODO 注释百分比加起来 > 100%——单个会话经常组合多个策略。比如先看 task list(策略 6),再 navigate 到代码(策略 3),最后看上次改了什么(策略 4)。
策略 5 / 6(Problem List / Task List)反直觉:用了它们的会话反而更慢——75% 的 edit-lag > 30 分钟。论文 Section 4.3 的解释是”这些场景对应复杂调试或长期挂起的 task”,不是工具本身慢。
踩过的坑
- 把”23 分钟”当论文原话——这是后人合并 Solingen 1998 的”15 分钟工业观察” + Mark 2008 CHI 的”23 分 15 秒”+ Parnin 长尾分布的简化。Parnin 论文从未给出”平均 23 分钟”这个数。
- 把 6 策略当互斥分类——Table 9 的频率加起来 > 100%,每个策略列代表”是否使用过”而不是”主策略是哪个”。把它们画成饼图就错了。
- 把 edit-lag 等同于认知负荷——edit-lag 包含 IDE 启动 + 文件加载 + 用户去厕所等环境固定开销。论文 Section 5.4 自己承认无法分离”恢复任务”与”开始新任务”。
- 把 2008 数据外推到 2026——LSP / hot reload / Copilot / Claude Code 完全改变了开发节奏,LLM agent 对话窗口本身就是论文没列的”第 7 类策略”。
- 以为 filter 后的 5175 会话代表全体——9899 → 7492 → 5175 的两步过滤丢了近一半短会话,10% < 1 分钟的数字其实是”中长会话”里的统计,对短会话本身偏向悲观。
适用 vs 不适用场景
适用:
- 设计 IDE focus / context restore 工具——优先优化 Continue Last Edit 这条 7.5% 的小路
- 评估自己的工作节奏——拿 ActivityWatch 跑 5 天 self-observation 就能复现机制
- 写学术论文 cite “程序员被打断很贵”——这是公认 first quantitative evidence
- 做 dev productivity tooling 的产品决策——6 策略给你优先级地图
不适用:
- 评估 pair / mob programming 团队——Williams 2003 强调协作里”打断”性质完全不同
- 估算 LLM 时代的 edit-lag 绝对值——工具栈代际差异太大,结论需要重做实验
- 测”是否进入 flow”——edit-lag 是”开始打字”,flow 比这更深一层
- 推断个人差异——论文混合统计 73 个用户,没分新手 / 资深
历史小故事(可跳过)
- 1990s:Csikszentmihalyi 写 Flow,主观心理学,没有量化指标
- 1998:Solingen 在 IEEE Software 用工业问卷得到”开发者 15 分钟恢复”
- 2004-05:Czerwinski / Mark 在 CHI 用 diary study 测办公室任务,但是被试自评数据
- 2008:Mylyn Monitor 工具成熟,Parnin 在博士期间开始攒 IDE telemetry
- 2009:本文 ICPC,第一次把”恢复时间”从 self-report 升级到事件 ground truth
- 2011:Parnin & Rugaber 在 Software Quality Journal 出长版,扩展到 6 策略的频率细节
- 2017+:Meyer 等人在 TSE 把样本扩到 N > 5000,验证 Parnin 的分布形状
之后催生了 JetBrains Focus Mode(2018)/ VS Code Zen Mode / Slack Snooze / GitHub PR Draft / Linear 子任务树等一连串工程化产物。
学到什么
- 被打断的代价不是”23 分钟均值”,是右尾长尾——多数会话恢复很快,但 30% 的会话超过 30 分钟,这才是吃掉全天产出的部分
- 行为数据比自评可靠 10 倍——“我以为我恢复了”和”我真的开始改代码了”差距很大,能在 IDE 里测就别问问卷
- 预留 cue 比恢复时努力专注更有效——离开前 30 秒留 TODO 注释 / 写日报最后一行,比回来后强迫自己集中注意力性价比高得多
- 多数恢复需要重读代码:83% 的会话要 navigate 到别处,程序员不是发呆,是在重读——所以”代码自解释”和”留 cue”才这么重要
- 方法论的迁移性大于结论本身:用事件流定义”开始做事”的时间戳、用 ≥15 分钟切会话、用频率分布报告策略——这套框架后来被搬到 debug、review、文档写作等几乎所有”知识工人”研究里
延伸阅读
- 视频:Chris Parnin — Programmer, Interrupted (talk)(一作自己 30 分钟讲一遍核心数字)
- 论文 PDF:Parnin & Rugaber 2009(10 页,方法学密度极高)
- 长版本:Parnin & Rugaber 2011 SQJ — 同样的数据扩展到期刊,多了 5 个策略相关的图表
- 后续大样本:Meyer, Fritz, Murphy-Hill 2017 TSE Work Life of Developers(N > 5000,把 Parnin 的 N=85 扩到全公司)
- 反对者视角:Williams & Kessler 2003 Pair Programming Illuminated(同期工作,主张协作里打断不是打断)
- program-comprehension-fmri —— 程序员读代码时大脑亮的是语言区,解释为什么”重读”代价这么高
关联
- program-comprehension-fmri —— 同 HCI 实证派,给”读代码”的脑科学证据
- cognitive-load-theory —— 解释为什么打断后 working memory 信息丢失
- pair-programming —— 反向流派,认为协作里打断不是打断
- debugging-dichotomy —— 同样靠 IDE 数据看程序员行为的实证工作
- compiler-errors —— 错误信息也是一种”恢复 cue”,论文 Section 4.3 提到 9% 用户用 Problem List 当线索
- copilot-rct —— 现代 AI 助手把对话历史当外置上下文,论文没法预见的”第 7 类策略”
- beck-tdd —— TDD 留下的红绿测试本身就是 Parnin Section 5.3 强调的 prospective cue
反向链接
- beck-tdd —— Beck TDD — 用红绿重构循环让设计自己长出来
- ci-effects —— CI Effects — 持续集成不是免费午餐,价值看实现细节
- cognitive-load-theory —— Cognitive Load Theory — 学不会不是不努力,是工作记忆装不下
- compiler-errors —— Compiler Error Messages — 让编译报错有用
- copilot-rct —— Copilot RCT — AI 编程助手的第一个严格随机对照实验
- debugging-dichotomy —— Debugging Dichotomy — 程序员真实 debug 行为分两轨
- lampson-hints —— Lampson Hints — 把做系统的隐式品味写成 27 条经验法则
- no-silver-bullet —— No Silver Bullet — 软件难度的二分手术刀
- pair-programming —— Pair Programming — 两个人共用一台机器写代码
- program-comprehension-fmri —— Program Comprehension fMRI — 程序员读代码时大脑亮的是语言区不是数学区
- sillito-questions —— Sillito 44 问题 — 程序员改代码时到底在问什么