A Grounded Theory of Debugging in Professional Software Engineering Practice
通过对专业开发者和主播进行的扎根理论定性研究,本文提出调试是一个结构化的、迭代的诊断过程,其中经验丰富的工程师通过在导航策略与执行策略之间交替进行,以收集证据并解决漏洞,从而系统地更新对系统的心理模型。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
大局观:这篇论文是关于什么的?
想象你是一名正在试图破解谜团的侦探。你知道出了问题(一个“Bug”),但你不知道问题出在哪里,也不知道为什么会发生。这篇论文研究了七名专业软件开发人员和五名直播编程人员,旨在观察他们在实际工作中究竟是如何破解这些谜团的。
研究人员想知道:专家们究竟是如何在庞大且复杂的计算机程序中寻找并修复 Bug 的?
他们发现,调试(Debugging)不仅仅是猜测和检查。它是一个结构化的过程,开发者在此过程中构建一个关于问题的“心理地图”(Mental Map),随着发现线索不断更新这张地图,并尝试以最小的精力去修复它。
侦探的工作流:四个主要阶段
研究人员发现,专业的调试过程分为四个截然不同的阶段,就像侦探的案卷一样:
- 重现犯罪现场(Reproducing the Crime): 首先,开发者尝试故意让这个 Bug 再次发生。如果他们无法让错误再次出现,就无法解决它。
- 构建心理地图(最长的阶段): 这是见证奇迹的时刻。开发者试图弄清楚 为什么 会发生这个 Bug。他们在脑海中构建一幅图像,展示代码本该如何运作,以及实际是如何运作的。这一步占据了总时长的约 57%。
- 修复犯罪(Fixing the Crime): 一旦他们对自己的“心理地图”有了信心,就会编写一段代码来修复问题。
- 验证解决方案(Verifying the Solution): 他们尝试让 Bug 再次发生,以证明它已经消失。如果 Bug 消失了,案件结案;如果没消失,则回到第 2 步。
令人惊讶的是: 大多数人认为调试主要是关于编写修复代码。但研究表明,对于专业人士来说,调试的核心在于弄清楚到底出了什么问题。
核心策略:“足够好” vs. “完美”
研究中最有趣的发现之一是开发者如何处理他们的知识。
- 传统建议: 传统的教科书通常说:“在开始之前,先阅读整本手册,完美理解整个系统。”
- 现实世界: 研究发现,专业人士的做法恰恰相反。他们使用一种**“知识规避”(Knowledge Avoidance)**策略。
类比: 想象你在一个巨大且凌乱的房子里寻找一把特定的丢失钥匙。
- “完美主义”的方法是:在寻找钥匙之前,先打扫每一个房间,阅读房屋蓝图,并了解房屋的历史。这太耗时了。
- “足够好”的方法(专业人士所使用的)是:先从最有可能的地方开始找。如果你在厨房找到了钥匙,你就停止寻找。你不需要知道地下室的管道是如何工作的也能找到钥匙。
开发者努力只学习足以修复特定 Bug 的代码知识,从而避免陷入理解整个系统的“无尽努力”中。他们的目标是建立一个“足够好”的心理地图,而不是一个完美的地图。
如何收集线索:导航与执行
为了更新他们的心理地图,开发者使用两个主要工具,他们在两者之间切换,就像侦探在“阅读地图”和“走访犯罪现场”之间切换一样:
- 导航(阅读地图): 他们在不运行代码的情况下阅读代码。他们搜索文件、阅读函数名称,并追踪一个部分是如何连接到另一个部分的。
- 执行(走访犯罪现场): 他们运行代码。他们使用诸如“断点”(暂停程序以拍摄快照)或“控制台日志”(打印出计算机正在思考的内容)之类的工具,来观察实时发生的实际情况。
追踪模式:
- 向后追踪(Backward Tracing): 从错误开始,向后追溯以找到原因。(例如:“屏幕崩溃了,那么在那之前发生了什么?”)这在开发者对代码不太熟悉时很常见。
- 向前追踪(Forward Tracing): 从代码开始,预测将会发生什么。(例如:“如果我点击这个按钮,数据应该会流向这里……”)这在开发者非常熟悉代码时很常见。
“外部工具箱”:并非孤军奋战
开发者很少在真空中工作。研究发现,他们高度依赖外部资源来填补心理地图中的空白:
- “请教同事”法: 他们与同事交流或查看聊天记录,看看是否有人遇到过类似情况。
- “时光机”(版本控制): 他们查看代码的历史记录(就像一个“倒退”按钮),查看谁在何时更改了什么。这有助于他们精准定位 Bug 是何时引入的。
- “互联网与 AI”法: 他们使用搜索引擎(如 Google)和 AI 工具(如聊天机器人)来解释令人困惑的代码或寻找快速解决方案。
- 注: 研究发现,虽然 AI 在解释小段代码方面表现出色,但开发者通常仍需手动修复实际的 Bug,因为 AI 无法始终处理整个复杂且混乱的系统现状。
经验的角色
经验就像是一个捷径。
- 新手通常必须阅读每一行代码并测试每一种可能性。
- 专家则利用基于以往案例的“直觉”。如果他们看到特定的错误信息,可能会立即意识到:“啊,这是版本不匹配,”从而跳过漫长的调查。他们知道首先该看哪里,从而节省了数小时的时间。
总结
这篇论文告诉我们,专业的调试工作与其说是做一个无所不知的“代码巫师”,不如说是一个战略性的侦探。
- 他们构建关于问题的心理地图。
- 他们通过在阅读代码和运行代码之间切换来更新这张地图。
- 根据对系统的了解程度,他们在向前和向后思考之间切换。
- 他们依靠外部帮助(同事、历史记录、AI)来节省时间。
- 他们的目标是寻求一个**“足够好”的解决方案**来快速修复 Bug,而不是试图理解整个代码宇宙。
研究人员建议,开发工具的设计应旨在帮助开发者追踪这些“心理地图”并管理其不确定性,而不仅仅是为他们提供一份错误列表。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。