はじめに
Day1では、Claude Codeのインストールから初回起動までを進めました。ネイティブインストーラーでのインストール自体はすんなり終わったものの、PATHが自動で通らず「claude コマンドが見つからない」というエラーにハマったのが記憶に残っています。ただ、動作確認で「このフォルダには何がありますか?」と話しかけただけで、実際にファイルシステムを読み取って説明してくれる様子を見て、チャット版のClaudeとは違う手応えを感じました。
Day2の今日は、実際に既存のコードを読ませて、軽微な修正を依頼してみます。テーマは「簡単なタスクを投げてみる」です。
1. 今日やったこと
今日のテーマは「簡単なタスクを投げてみる」です。既存のスクリプトを読み込ませて内容を説明させ、その上で軽微な修正を依頼してみました。
練習用に、ゼロ除算のチェックが漏れた四則演算スクリプト calc.py を D:\AI\work\day2 に用意しました。
今日やった流れは以下の通りです。
- 練習用スクリプト
calc.pyを用意 - そのフォルダで
claudeを起動し、処理内容の説明を依頼 - Plan Modeに切り替え、ゼロ除算チェックの修正を依頼
- Claudeからの質問に回答し、計画を確定
- 計画を承認し、修正を適用
# 2. Claude Codeを起動
cd D:\AI\work\day2
claude
:: コマンドプロンプトの場合
cd D:\AI\work\day2
claude
起動後、まずは変更させずに読解だけを依頼しました。
このフォルダにあるcalc.pyの処理内容を説明してください
calc(a, b, op) の処理内容や show(x, y, o) の役割をきちんと説明してくれました。それだけでなく、こちらが仕込んだゼロ除算バグ(show(10, 0, "/") で ZeroDivisionError が発生する)に加えて、op が + - * / 以外の場合に r が未定義のまま参照される UnboundLocalError の潜在バグまで、読んだだけで指摘してくれました。
続けて、Shift+Tabキーを2回押してPlan Modeに切り替え、修正を依頼しました。
calc.pyのゼロ除算チェックが漏れている箇所を直したいです。まず修正方針を計画してください
すると、いきなり修正案を出すのではなく、「ゼロ除算(op="/" かつ b=0)が発生した場合、calc.py にどのような挙動を期待しますか?」と、修正コードのプレビュー付きで質問を返してきました。
選択肢は以下の2つでした。
- 1. エラーメッセージを表示して続行(Recommended)
- 2. 明示的な例外を送出する
推奨されていた「1. エラーメッセージを表示して続行」を選びました。
2. つまずいたポイント
今回は、環境構築やファイル準備で大きくつまずくことはありませんでした。強いて挙げるなら、calc.py の読解を依頼した時点で見つかった UnboundLocalError の潜在バグ です。
calc(a, b, op) は if/elif で + - * / の4パターンを判定しているだけで、それ以外の文字列が op に渡された場合の else 節がありません。この場合 r にはどの分岐でも値が代入されないまま return r に到達するため、UnboundLocalError になります。今回のテーマ(ゼロ除算チェック漏れの修正)とは別問題なので、対応スコープ外として扱いました。
3. どう解決したか
「対応しない」と決めた UnboundLocalError は放置しつつ、本題のゼロ除算チェックについては計画を最後まで進めました。
計画のContextでは、day2/calc.py の calc(a, b, op) が op == "/" のとき無条件に a / b を実行しており、b == 0 のケースをチェックしていないことが改めて整理されていました。そのため show(10, 0, "/")(19行目)の呼び出しで ZeroDivisionError が発生し、プログラムがクラッシュします。面白かったのは、この計画の中でClaudeが「これはDay2記事のテーマ『既存スクリプトの読解・軽微な修正』における題材であり」と言及していた点です。この作業がブログ記事用の練習だと認識した上で計画を立ててくれていました。
具体的な変更内容は、calc(a, b, op) 関数の先頭にゼロ除算のガード節を追加するというものでした。
def calc(a, b, op):
if op == "/" and b == 0:
return "エラー:0で割ることはできません"
if op == "+":
r = a + b
elif op == "-":
r = a - b
elif op == "*":
r = a * b
elif op == "/":
r = a / b
return r
show() 側は変更不要で、calc() の戻り値(数値またはエラー文字列)がそのまま f"{x} {o} {y} = {result}" で表示される仕組みなので、エラーメッセージもそのまま画面に出る、という説明も添えられていました。検証方法として、既存の3件(+ - *)が従来通り計算されること、10 / 0 で例外が発生せずエラーメッセージが表示されて正常終了することが挙げられていました。
実行方法は、差分を見る練習も兼ねて「2. Yes, manually approve edits」を選択しました。diffを確認しながら適用し、実行して 10 / 0 = エラー:0で割ることはできません が期待通り表示されることも確認できました。
4. 今日の学び
- Plan Modeは、要件が曖昧なときに黙って進めるのではなく、選択肢付きで質問を返してくれます。今回は「エラーメッセージを表示して続行」か「明示的な例外を送出する」かという、実装方針が分かれる場面で、修正後のコードプレビュー付きで聞いてくれたのが分かりやすかったです。
- 「説明してください」と読ませるだけで、想定していたゼロ除算バグ以外の潜在バグ(
UnboundLocalError)まで見つけてくれました。修正を依頼する前に、まず読解だけを依頼するステップを挟む価値を感じました。 - 計画のContextの中で、Claudeが「これはDay2記事の題材である」という文脈まで踏まえて計画を立てていたのは印象的でした。会話の目的(記事のネタ作り)を継続して認識してくれている、ということが伝わってきました。
- 見つけたバグをすべて直す必要はなく、「今回のスコープ外」として明示的に切り分けて進める、というやり取りが自然にできるのも、既存コードを扱う上で便利だと感じました。
5. 次回への疑問・やりたいこと
- 今日は1ファイルへの軽微な修正でしたが、次回(Day3)は複数ファイル・コードベース全体を触らせてみる予定です。Plan Modeが複数ファイルにまたがる変更でもどこまで的確に計画してくれるのか気になっています。
- 今回スコープ外にした
UnboundLocalErrorを、実際に直してもらうとどんな計画になるのかも、機会があれば試してみたいです。




