プログラムがおかしな動きをして何時間もコードを見つめた末に、隣の席の同僚に助けを求めたことはありませんか。ところが不思議なことに、「ここでこの値を受け取って、こう渡して……」と説明している途中で、自分で「あ、ここが間違っていました」と答えを見つけることがよくあります。同僚はただうなずいていただけなのに、です。開発者の間では、この現象をあえて活用する方法が昔から伝えられてきました。それが「ラバーダック・デバッグ(Rubber Duck Debugging)」です。
ラバーダック・デバッグとは、簡単に言えば「机の上のゴム製のアヒルのおもちゃにコードを一行ずつ声に出して説明しながら問題を見つけ出すデバッグ手法」のことです。聞く側は何も言わなくてかまいません。説明するという過程そのものが、頭の中の思い違いや抜けを浮かび上がらせてくれます。
この記事では、ラバーダック・デバッグという名前が生まれた由来から、実際のやり方、説明が問題をあぶり出す仕組み、そして開発を超えて日常で活用するコツまでを順に見ていきます。
アヒルに話しかけるとバグが見える理由

『達人プログラマー』が残した話

この名前は、1999年に出版されたソフトウェア開発書『達人プログラマー(The Pragmatic Programmer)』を通じて広く知られるようになりました。アンディ・ハント(Andy Hunt)とデイブ・トーマス(Dave Thomas)の共著であるこの本は、今も多くの開発者が勧める古典です。
- 逸話の主人公(Greg Pugh):本によると、グレッグ・ピューという研究助手はいつもゴム製のアヒルを持ち歩き、行き詰まる問題があるとアヒルに説明していたといいます。
- 本の説明(Explaining the Problem):聞く側は一言も話す必要がなく、コードが何をすべきかを順を追って説明するだけで、問題が画面から勝手に飛び出してくることが多いと紹介しています。
- さまざまな変形(Other Objects):必ずしもアヒルである必要はなく、テディベアやペット、さらには紙を切り抜いて作った犬の模型に説明するという話も伝わっています。
結局のところ大切なのは、アヒルという小道具ではなく、誰かに最初から最後まで説明するという行動にあります。
一行ずつ声に出して説明する方法

ラバーダック・デバッグは方法が単純なぶん、手順を守ることが大切です。おおよそ次の三つのステップで進めます。
(1)アヒルにまず目標を伝える
まず、このコードが本来何をすべきなのかを一、二文で説明します。目標を言葉にまとめた瞬間、そもそも要件を誤解していたことが明らかになることもあります。
(2)一行ずつ飛ばさずに読む
コードを上から一行ずつ読みながら、その行が何をするのか、変数にどんな値が入っているはずかを声に出して言います。「ここは当然うまくいくだろう」と読み飛ばしていた部分も漏れなく説明することが、この方法の核心です。
(3)言葉と実際の結果を比べる
説明した内容と、プログラムが実際に出す結果が食い違う箇所を探します。たいていの場合、その食い違った行こそがバグの潜んでいる場所です。
このとき、頭の中だけで読まずに実際に口を動かして話すか、それが難しければ文章に書き出してみるのがよいでしょう。声に出して話すと自然とスピードが落ち、目で追うだけでは見過ごしていたカンマ一つ、不等号の向き一つまで確かめ直すことになります。オフィスのように話しづらい場所では、メモ帳に説明を書き連ねていく方法でも同じ効果が得られます。
アヒルは何も知らないふりをして聞いてくれる聞き手です。ですから、相手がまったく知らないと考え、ごくやさしい言葉でかみ砕いて説明するほど効果が大きくなります。
説明が問題をあぶり出す仕組み

頭の中だけで考えていると、すでにわかっていると思い込んでいる部分を無意識に飛ばしてしまいます。一方、言葉で説明しようとすると、考えを順番に一つずつ取り出して並べなければなりません。
- 抜けを浮かび上がらせる(Explicit Reasoning):言葉は思考よりも遅く、順序がはっきりしているため、頭の中で大ざっぱにつなぎ合わせていた論理の空白がそのまま露わになります。
- 視点を変える(Shift in Perspective):人に説明する立場になると、コードを書いた人ではなく、初めて見る人の目でもう一度見直すことになります。
- 自己説明効果(Self-Explanation Effect):学習科学の分野では、学んだ内容を自分で説明してみる学生のほうが理解をより深く固められるという研究が継続的に報告されてきました。
特にバグは、コードが間違っている箇所よりも「間違っているはずがない」と信じている箇所に潜んでいることが多いものです。説明していると、その思い込みの根拠を言わなければならなくなり、いざ根拠を挙げられなくなった瞬間こそ、見直すべきポイントになります。
一人でつぶやくよりも、聞いてくれる相手がいるほうがうまくいくという点も興味深いところです。たとえアヒルでも目の前に置いておくと、きちんと説明しなければという気持ちが生まれ、省略せずに話すようになるからです。
開発を超えて日常で活用する

ラバーダック・デバッグは今や、開発文化の象徴のような存在になっています。ハーバード大学のコンピュータサイエンス入門講義CS50は授業ツールにアヒルのキャラクターを取り入れ、質問回答サイトのStack Overflowは2018年のエイプリルフールに、ユーザーの質問を聞いて「クワッ」と鳴くだけのアヒルを登場させて笑いを誘いました。
この方法は、コード以外の問題にもそのまま使えます。レポートの論理がこんがらがったとき、数学の問題が解けずに行き詰まったとき、発表の内容がうまくつながらないとき、空いた椅子やぬいぐるみを前に置いて最初から説明してみると、つまずいている箇所がはっきりします。同僚に質問を送る前にまずアヒルに説明してみると、自分で答えを見つけられることも多く、たとえ答えが見つからなくても、質問がずっと明確になります。
言葉にして初めて見えてくるミスがあります。行き詰まった問題をアヒルに一つずつ話して聞かせる習慣、それこそが自分で答えを見つける問題解決の第一歩です。