跳至正文
杂学书库让好奇心有所归处
简体中文

说着说着就看见了bug:小黄鸭调试法(Rubber Duck Debugging)

你是否有过这样的经历:程序运行得莫名其妙,盯着代码看了好几个小时,最后只好向旁边的同事求助?奇妙的是,在解释“我在这里接收这个值,然后这样传过去……”的过程中,很多时候你会自己找到答案:“啊,原来是这里错了。”而同事只是点了点头而已。开发者之间很早就流传着一种有意利用这一现象的方法,那就是“小黄鸭调试法(Rubber Duck Debugging)”。

简单来说,小黄鸭调试法是指“把代码一行一行地出声讲给桌上的橡皮鸭玩偶听,从而找出问题的调试方法”。听的一方什么也不用说,讲解的过程本身就会暴露出脑海中的误解和漏洞。

本文将依次介绍小黄鸭调试法这一名称的由来、具体做法、讲解能暴露问题的原理,以及在开发之外的日常生活中加以运用的诀窍。


对着鸭子说话就能看见bug的原因

小黄鸭调试法的虚构代码案例。目标是80分及以上算通过,但条件写成了“分数大于80”,导致正好80分被漏掉;逐行讲解代码时发现了这个错误。改为“80分及以上”后再次验证:79分不通过,80分和81分通过。
用语言把目标与实际条件说出来并加以比较的小黄鸭调试法虚构案例。此方法并不保证一定有效,修改后仍需实际运行和测试。出处:Harvard CS50x、Stanford CS106B。

《程序员修炼之道》留下的故事

手拿橡皮鸭玩偶的开发者,在放着笔记本电脑和摊开书本的温馨书房书桌前,笑着向鸭子讲解着什么

这个名称因1999年出版的软件开发书籍《程序员修炼之道(The Pragmatic Programmer)》而广为流传。这本书由安迪·亨特(Andy Hunt)和戴夫·托马斯(Dave Thomas)合著,至今仍是许多开发者推荐的经典。

  • 故事的主人公(Greg Pugh):据书中所述,一位名叫格雷格·皮尤的研究助理总是随身带着一只橡皮鸭,每当遇到卡住的问题,就向鸭子讲解。
  • 书中的说明(Explaining the Problem):书中介绍说,听的一方一句话也不必说,只要一步步讲清楚代码应该做什么,问题往往就会自己从屏幕上跳出来。
  • 各种变体(Other Objects):并不一定非得是鸭子,据说也有人对着泰迪熊、宠物,甚至是用纸剪成的小狗模型讲解。

归根结底,关键不在于鸭子这个道具,而在于向某人从头到尾讲解这一行为。


一行一行出声讲解的方法

桌上的小黄鸭望着显示器,开发者一边用手指着屏幕一边出声讲解

小黄鸭调试法方法简单,因此遵守顺序尤为重要。大致按照以下三个步骤进行。

(1)先告诉鸭子目标
首先用一两句话说明这段代码原本应该做什么。在把目标用语言整理出来的那一刻,有时就会发现自己一开始就误解了需求。

(2)一行一行地读,不要跳过
从上往下一行一行地读代码,出声说出这一行做什么、变量里大概是什么值。把那些以往觉得“这里肯定没问题”而略过的部分毫无遗漏地讲出来,正是这一方法的核心。

(3)比较所说的内容与实际结果
找出所讲内容与程序实际输出结果不一致的地方。通常,那一行不一致的代码正是bug藏身之处。

这时,不要只在脑子里读,最好真的动嘴说出来;如果做不到,也可以用文字写下来。出声说话时速度会自然放慢,于是连用眼睛扫过时会忽略的一个逗号、一个不等号的方向都会重新确认。在办公室等不方便说话的地方,在记事本上写下讲解也能取得同样的效果。

鸭子是一位装作什么都不懂、默默倾听的听众。因此,越是假设对方完全不懂,用非常浅显的话来讲解,效果就越好。


讲解能暴露问题的原理

年轻的开发者托着下巴,望着桌上的橡皮鸭和泰迪熊陷入沉思,旁边放着空白笔记本、铅笔和笔记本电脑

只在脑子里思考时,会不自觉地跳过自以为已经弄懂的部分。而要用语言讲解,就必须把想法按顺序一个一个地摆出来。

  • 暴露漏洞(Explicit Reasoning):说话比思考慢,而且顺序分明,因此在脑海中随意拼接的逻辑空白会原原本本地显露出来。
  • 转换视角(Shift in Perspective):一旦站在向别人讲解的立场上,就会不再以写代码的人的眼光,而是以初次看到代码的人的眼光重新审视。
  • 自我解释效应(Self-Explanation Effect):学习科学领域不断有研究报告指出,尝试自己解释所学内容的学生,理解会更加深入扎实。

尤其是,bug往往不是藏在代码明显出错的地方,而是藏在你认为“不可能出错”的地方。讲解时你必须说出这种信念的依据,而说不出依据的那一刻,正是需要重新检查的地方。

有趣的是,比起自言自语,有一个倾听对象时效果更好。哪怕面前只有一只鸭子,也会产生必须好好讲解的心理,从而毫无省略地讲出来。


在开发之外的日常生活中运用

在明亮的书房里,一名大学生对着放在一摞教科书上的橡皮鸭,出声讲解解题过程

如今,小黄鸭调试法已经成为开发文化的一种象征。哈佛大学的计算机科学入门课程CS50在教学工具中加入了鸭子角色,问答网站Stack Overflow也曾在2018年愚人节推出一只听完用户提问后只会发出“嘎”声的鸭子,博得一笑。

这一方法同样适用于代码以外的问题。当报告的逻辑理不清、数学题解不下去、演讲内容不够流畅时,在面前放一把空椅子或一个玩偶,从头开始讲解,卡住的地方就会变得清晰。在向同事发问之前先讲给鸭子听,很多时候自己就能找到答案;即使找不到,问题也会变得清晰得多。

有些错误,只有说出口才能看见。把卡住的问题一步步讲给鸭子听的习惯,正是自己找到答案、解决问题的第一步。