日常生活のあらゆる場面でAIを活用する時代になりました。
皆さんはAIとどのように付き合っていますか?
プログラミングから日常の悩み相談まで、AIは驚くほど便利なツールです。
しかし、その便利さの裏側で、私たちは大切なものを失いかけているかもしれません。
最近の研究では、「AIへの依存度が高まるほど、長期的な学習能力や分析力が低下する」という懸念も示されています。
AIに頼りすぎることで、自ら考え、解決策を導き出す「思考の筋肉」が少しずつ弱まっているのかもしれません。
時代の流れとしてAIを排除することはできませんが、依存しすぎるのも考えもの。
そこで私が注目したのが、「ラバーダック・デバッグ(Rubber Duck Debugging)」という手法をAIに取り入れる方法です。
そもそも、ラバーダック・デバッグは何?
エンジニアの世界には、昔から愛されている「ラバーダック・デバッグ」というユニークな習慣があります。
プログラムのバグが見つからないとき、机の上のアヒルのおもちゃ(ラバーダック)などの無生物に向かって、自分のコードを一行ずつ声に出して説明します。
他人に説明するように順を追って話すことで、自分自身の論理の矛盾に気づき、解決策が見つかるという仕組みです。
Geminiを「可愛くて賢いラバーダック」にカスタマイズ
私はGoogle Geminiのカスタマイズ機能である「Gem(ジェム)」を使い、このラバーダックをデジタル上で再現してみました。
(Gemは左のサイドメニューにあります。)
名前は「可愛くて賢いラバーダック」です!!
目指したのは、単に答えを出す「代行者」ではなく、私の思考を伴走してくれる「コーチ」のような存在です。Gemのカスタマイズ機能を使い、以下の5つの原則をGeminiに授けました。
急いで回答しない
質問で誘導する
前提を確認する
段階的な説明を要請する
ヒントを提示する
▼詳細設定内容
名前
可愛くて賢いラバーダック
説明
問題に対し、自ら考えられるようにサポートする学習ガイド
カスタム指示
役割 (Role)
君は世界で一番賢くて可愛いラバーダックで、開発者の論理的思考を助ける親切なパートナーです。
君の目的は、ユーザーに正解をすぐに提示することではなく、ユーザーが自分のコードを説明する過程で自らエラーに気づくように誘導することです。
核心ルール (Core Rules)
急いで回答しない: ユーザーがコードを載せた時、すぐに修正したコードを渡さないで、代わりに「このコードがどんな役割をしているか、一行ずつ説明してもらえますか?」と先に聞いてみてください。
質問で誘導する: ユーザーの説明が曖昧な部分(例:「ここでデータを取ってきます」)があれば、「どんな方法で取ってきますか?」「その時のデータの型は何ですか?」のように具体的な質問を投げかけてください。
前提を確認する: ユーザーが「当然こうだろう」と仮定している部分(例:「この変数には値が入っているはずです」)を見つけたら、「本当に値が入っているか、どうすれば確認できるでしょうか?」と質問してください。
段階的な説明の要請: 複雑なロジックであるほど、「まず、この関数の入力値と期待する出力値から定義してみましょうか?」と段階を分けて対話してください。
励ましと支持: ユーザーが自らエラーを見つけ出した時(Aha-moment)は惜しみなく褒めて、その原因が何だったのか要約してください。
ヒントの提示: ユーザーが3回以上のやり取りでも糸口を掴めていない場合は、ヒントを提供してください。
対話スタイル (Tone & Voice)
親切で、忍耐強く、少しウィットに富んだ口調(頻繁に「クワッ!」のような合いの手を入れてください)。
開発者がリラックスして自分のコードを説明できるように、傾聴する姿勢を維持してください。
インタラクションガイド (Interaction Flow)
ユーザーが問題を話したら: 「準備はいいよ!そのコードがどんな論理で動いているのか、僕に一行ずつ教えてほしいな。」
説明の途中で矛盾が見つかったら: 「ちょっと待って!さっき言った部分ではAだと言ったけど、コードではBになっているみたい。もう一度見てみようか?」
ユーザーが正解だけを答えたら: 「ちょっと待って!今言ってくれたのが正解ではあるけど、どんな論理でその正解にたどり着いたのかな?」
解決したと思ったら: 「やっぱり自分で見つけ出せると思ってたよ!今回のデバッグで学んだことを一行でまとめてみようか?」「親切なAI」 vs 「考えさせるAI」
実際に、普通の会話と「ラバーダックGem」に同じコーディング問題を投げて比較してみました。
▼入力プロンプト
問題:2つの数の比較 (Comparing Two Numbers)
2つの整数 AとBが与えられたとき、AとBを比較するプログラムを作成してください。
1. 入力 (Input)
1行目にAとBが与えられます。 AとBは1つの空白で区切られています。
2. 出力 (Output)
1行目に、次の3つのうちのいずれかを出力してください。
AがBより大きい場合は > を出力する。
AがBより小さい場合は < を出力する。
AとBが等しい場合は == を出力する。
3. 制約 (Constraints)
-10,000 =< A, B =< 10,000
入出力例
入力 (A B)出力
1 2 <
10 2 >
5 5 ==
この問題の答えを教えてください。通常のGeminiは即座に完成したコードを出力してくれます。便利ですが、私はそれをコピー&ペーストするだけで、思考はそこで止まってしまいます。
同一プロンプトを可愛くて賢いラバーダックに聞いてみます。
可愛くて賢いラバーダックはコードは出さず、「この部分では、データがどう受け取るのか?」や「その後の比較は?」といった質問を返してきます。
可愛くて賢いラバーダックの質問に対し、自ら考えた内容を一つずつ回答しながら、進めます。
(気づけば、自分の手で正解にたどり着いていました!)
このやり取りは、正直に言って「不便」です。
しかし、AIからのヒントを元に、可愛くて賢いラバーダックと対話するように一つずつ確認していくことで、最終的に自分の力でコードを完成させることができました。
おわりに:時には「遠回り」をしよう
忙しい現代社会において、AIの普及により私たちは「より早く」答えを出すことを求められ、いつの間にか「答えそのもの」だけに執着してしまっている気がします。
こうした時代だからこそ、あえて自力で悩み、考え抜く時間が必要なのではないでしょうか。
今回ご紹介した方法は、一見すると非効率かもしれません。しかし、AIという素晴らしいツールを単なる「正解自販機」にするのではなく、「共に歩む伴走者」として捉え直してみてはいかがでしょうか。
試行錯誤の末に自らの頭で導き出した答え、その達成感。それこそが、AI時代においても私たちが持ち続けるべき「知る悦び」なのだと信じています。
「学びて時に之を習う、亦た説ばしからずや」 — 孔子