実践入門 ラバーダック・デバッグ


<!-- 発端や概要を記載 -->
# はじめに
あなたは **「ラバーダック・デバッグ」** というデバッグ手法をご存じですか？
IT業界では世界的に広く知られているのでご存じの方も多いかと思いますが、もし知らないようであればぜひ本記事で入門してください。

![rubber-duck-debugging.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491064/eb2a8590-eb2f-2c17-56a8-a3d5287a54ff.png)

この記事では`ラバーダック・デバッグとは何なのか`、また`どのような効果があるのか`を解説し、
具体的な実例を通じて`効果を実感できる`ことを目指していきます。

<!-- 各チャプター -->
<a id="#Chapter1"></a>

# 1.ラバーダック・デバッグとは
「ラバーダック・デバッグ」とは、プログラムの問題を解決するための手法の一つであり、
問題に直面した際に **黄色いアヒルちゃん(そして自分自身)** に対して説明することで解決の糸口を見つける方法です。
名前にデバッグと付いているように主にプログラミングを対象に用いられることが多いですが、実際はソフトウェア開発の全般の工程で役立ちます。

また単純にデバッグに役立つ以外にも有用な点があり、
個人差はあるでしょうが以下のような効果が期待できます。

### (1).自己理解が深まる
この手法は実際にデバッグ作業を行う際に`特定の物体に向かって自分の考えを話す`、という形式で行われ、
`問題を他者に説明することで自分自身の理解が深まり、問題解決の手助けになる`という点が特徴です。

本質的には`自分自身の考えを整理する`ということが重視されており、続けていけば自己理解に繋がるでしょう。
これがプログラムを改善するという目先の目的以上に有用であることは、言うまでもありません。

### (2).あなたの孤独を癒す
以下の状況を想像してください。
```
・あなたは一人暮らしのフルリモートのITエンジニアであり、定例会議は週2～3回程度
・担当しているプロジェクトは滞りなく進んでおり、今のところ炎上の気配はない
・平日の終業後や、週末は趣味の個人開発を精力的に進めている
・生身の人間との会話が発生するのは、深夜にコンビニへ食料を買いに行くときぐらい
```

どうでしょうか？
これが全く苦ではないという方もいるでしょうが、大半の方は耐えがたい孤独を感じるのではないでしょうか。
~~(そもそもITエンジニアが孤独なものだという前提は無視します。)~~

しかしもしそこに黄色いアヒルちゃんがいたらどうでしょうか。
彼らは`あなたの話を黙って聞いてくれる数少ない理解者`であり、
また同時に`寂しさを埋めてくれる貴重な友人`としての側面を持ち合わせています。

あなたが余程鈍感で無ければ、
彼らが`最高の相棒`だと気が付くまでに長い時間はかからないでしょう。

### (3).話のネタになる
副次的でなおかつ俗っぽいですが、ラバーダック・デバッグは話のネタになるでしょう。

職場の同僚など同業者であれば`共通の話題`として、
あなたの配偶者や家族など仕事と直接関係のない人に対しては、`あなた自身をよりコミカルな存在と印象付ける`ことができるでしょう。

ただしあまり熱心に話し込み過ぎるとあらぬ心配を招いてしまうので、程々に...。


<a id="#Chapter2"></a>

# 2.ラバーダックの選定
次に考えるべきことはどのようなラバーダックを選ぶかです、
効果の最大化を狙うのであれば無作為に選ぶべきではないでしょう。

ただし結局はあなたが気に入ったものが一番なので、以下は参考程度にしていただければと思います。

### (1).適切なラバーダックの条件
```
➀.静かで気を使わない物体
  デバッグ中に気を使わずに自由に話せる物体が理想です。
  ラバーダックのように、無言で受け止めてくれる物体が最適でしょう。

➁.視覚的な存在感
  物体の視覚的な存在感が、話したくなる気持ちをサポートします。
  ただあまりに派手な外見だと気が散ってしまうので、親しみやすさを重視したほうがいいでしょう。

➂.汎用性
  作業する場所を選ばず使用できる物体を選ぶと良いでしょう、
  もし出社する場合は職場のデスクにおいても恥ずかしくないものが適切でしょう。
```

### (2).個人的におすすめのラバーダック
```
➀.ラバーダック
  名前の由来となったラバーダックは、その象徴的な存在感と、
  デバッグ作業をサポートするために特化した物体と言えます。
  また周囲の人に目撃された場合でも、
  ラバーダック・デバッグの歴史的経緯を説明することで誤解を解くのに多少は有効でしょう。

➁.フィギュアやぬいぐるみ
  あなたの好みに応じたフィギュアやぬいぐるみも効果的です、
  親しみやすさを感じながら話しかけることができるでしょう。

➂.植物
  小さなサボテンやポトスなどの観葉植物、何なら造花でもなんでも...。
  ささやかな緑は目に優しいだけでなく、マイナスイオンも摂取できて一石二鳥と言えます。
```

なお筆者は以下のようなメンダコを模したぬいぐるみを利用しています。
実は中に鈴が入っていて、振るとシャンシャン音が鳴るところがお気に入りです。

![mendako.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491064/7237f27a-d91d-9b2e-37c3-6db850b0dcdd.jpeg)


<a id="#Chapter3"></a>

# 3.具体的なデバッグ手順
他のデバッグ手法と同様に、ラバーダック・デバッグにも大まかな順序があります。

あなたが自分にとって最適な方法を心得ていれば、その方法に従うのが良いでしょう。
ただし特に決まった方法がない場合は、以下の手順で進めることで大抵の問題はすぐに解決するでしょう。

### (1).問題の明確化
ラバーダック・デバッグの第一歩は、`問題を明確`にすることです。
自分が直面している問題やバグを、ラバーダックに対して詳細に説明します。
この際、以下のポイントを押さえると良いでしょう。

```
➤ 問題の概要：何が問題であるかを簡潔に説明する
   例: アプリケーションがデータベースからユーザー情報を取得できない。
       特定のクエリだけタイムアウトしてしまう。

➤ 再現手順：問題を再現するための手順を詳しく説明する
   例: 1. アプリケーションを起動する。
       2. ユーザー情報のページに移動する。
       3. データベースからの情報が表示されるまで待つと、タイムアウトエラーが表示される。

➤ 期待される結果：正常な動作や期待される結果について説明する
   例: ユーザー情報のページに移動すると、
       データベースから取得したユーザー情報が正常に表示されるべきである。
```

### (2).説明を通じた理解の深化
ラバーダックに対して問題を説明する際、`細部にわたって話すこと`が重要です。

自分が問題をどのように捉えているかを整理することで、
`新たな視点`や`被疑となる箇所`、また`解決策`が見つかることがあります。

### (3).解決策の探索
大抵の場合(1)～(2)の段階で原因が特定できますが、問題を説明し終えても原因がわからない場合は、
ラバーダックに対して説明した内容を振り返りながら、以下のような点を再考してみましょう。

```
➤ 問題の本質：問題がどこにあるのかを再確認する
   例: データベースクエリがタイムアウトする原因がネットワークの遅延なのか、
       クエリのパフォーマンスの問題なのかを特定する。

➤ 可能性のある原因：これまで考えられなかった原因に思いを巡らせる
   例: データベースの負荷が高いためにタイムアウトが発生している可能性がある。
       もしくは、クエリが非効率なために処理が遅くなっている可能性がある。
       そもそもクエリの投げ方自体が誤っているかも？

➤ 解決策の試行：知識や経験を活かして解決策を試す
   例: データベースのログを確認してタイムアウトの原因を調査する。
       または、クエリの最適化を行い、パフォーマンスを改善するための調整を試みる。
```


<a id="#Chapter4"></a>

# 4.さいごに
様々なデバッグツール、また生成AIが全盛期の現代ではラバーダック・デバッグは少々古典的な方法ではありますが、
この記事で紹介したアプローチを活用して、少しでもデバッグ作業を効率的に進めていただければ幸いです。

なお実践する際は周囲の視線に注意してください。
残念の事実ですが、余程あなたへの理解がある人でない限りは、
`黄色いアヒルちゃんと喋るあなたは不審者以外の何物でもないのですから...。`

![rubber-duck-debugging-end.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491064/a5fd220c-7bf2-2ba6-1478-4006a740fdcd.png)