バイブコーディングとは?AIにコードを任せるとき人がすべきこと
バイブコーディングを単に「言葉で頼めばAIが勝手に作ってくれるもの」と捉えるのではなく、人が要件と確認基準を決め、AIが作った結果を点検する作業方法として理解します。架空の家計簿CSV集計ツールを例に、入力・出力・してはいけないこと・確認方法を1ページのメモに整理します。
すでに動作している家計簿の月別集計ツールに`--by-category`オプションを追加する例を通じて、Claude Codeのplanモードで先に変更計画を確認する方法を学びます。実装前に変更範囲と出力形式を固定し、承認後に完成コードを実行して、既存の月別合計とカテゴリ別合計を両方確認します。
対象読者Claude Codeで既存のPythonファイルを修正する前に、変更範囲と想定結果を先に確認する習慣を身につけたい初心者
現在のsummarize.pyはexpenses.csvを読み込み、月別のamount合計を出力します。今回は既存機能を削除せず、`--by-category`オプションを指定したときだけ、各月のcategory別合計も表示するよう拡張します。機能を一つ追加するだけでも、すぐにファイルを修正させると、出力形式、既存動作を維持するかどうか、並び順といった詳細をAIが任意に決める可能性があります。そのため最初に「何をそのまま残し、何だけを変えるか」を固定します。
| 項目 | 現在の動作 | 今回の変更後 |
|---|---|---|
| 通常実行 | 月別合計を出力 | 同じまま維持 |
| オプション実行 | なし | `--by-category`のときカテゴリ別合計を追加 |
| ライブラリ | Python標準ライブラリ | 変更なし |
| 入力ファイル | expenses.csvを読み込む | 元ファイルは変更しない |
| 検証値 | 2026-09 = 26600, 2026-10 = 9800 | 既存値を維持 + 9月 food 20500, transport 2900, supplies 3200 |
ここで重要なのは、新機能そのものより回帰を防ぐ基準です。オプションを追加しても`python summarize.py expenses.csv`の既存出力が変わってはいけません。新しいオプションの結果だけでなく、既存の実行結果も一緒に確認する必要があります。
Claude Codeは`claude --permission-mode plan`でplanモードから開始できます。このモードは読み取り中心でコードと作業範囲を分析し、計画を確認するときに使います。初心者は既存コードがある状態でいきなり編集権限を広げるより、まず計画を出してもらう方が理解しやすくなります。
cd vibe-expenses
claude --permission-mode planセッションが始まったら、まず現在のsummarize.pyとexpenses.csvを読み、どこを変える予定か説明させます。この段階の依頼文には「まだ修正しないで」と明記します。計画が合わなければ、ファイルに触れないまま要件から直せます。
summarize.pyを読んで、現在の動作を先に説明してください。
次に、`--by-category`オプションを追加する変更計画だけを作成してください。まだファイルは修正しないでください。
通常実行`python summarize.py expenses.csv`の出力はそのまま維持してください。
オプション実行`python summarize.py expenses.csv --by-category`では、各月のcategory別合計を追加してください。
Python標準ライブラリだけを使い、expenses.csvは修正しないでください。
2026-09のカテゴリ別期待値はfood 20500, transport 2900, supplies 3200です。計画を受け取ったら、コードが洗練されて見えるかより、要件がすべて反映されているかを先に確認します。特に既存出力の維持、オプションがない場合の動作、categoryの並び順、不正なオプションの処理、外部パッケージ追加の有無を確認します。計画が曖昧なら、実装前にもう一度質問します。
[編集例 · 実際の応答ではありません]
1. 現在のCSV読み込みと月別合計計算の構造は維持します。
2. 月別のcategory合計も累積するデータ構造を追加します。
3. 二番目の引数が`--by-category`か確認し、オプションを使うか決めます。
4. 通常実行では既存の月別合計だけを出力します。
5. オプション実行では月別合計の次の行にcategory名と合計を並べ替えて出力します。
6. 実装後、通常実行とオプション実行をそれぞれ行い、期待値と比較します。上の計画例は説明用の編集例であり、実際のClaude Codeの応答ではありません。実際のセッションではモデルが別の実装順序を提案することがあるため、計画文そのものを正解として覚えるのではなく、自分の要件に合っているかを確認します。
計画が要件に合っていることを確認してから実装を進めます。Claude Codeで実際にファイルを修正したりコマンドを実行したりする際は、環境や権限設定に応じて承認を求められることがあります。以下のコードは、この記事で結果検証に使った完成例です。Claude Codeの実際の応答をコピーしたものではなく、この記事の要件に合わせて作成し、GPTチャットのPython実行環境で別途実行したコードです。
import csv
import sys
from collections import defaultdict
def read_totals(path):
monthly = defaultdict(int)
by_category = defaultdict(lambda: defaultdict(int))
with open(path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
month = row["date"][:7]
amount = int(row["amount"])
monthly[month] += amount
by_category[month][row["category"]] += amount
return monthly, by_category
def main():
if len(sys.argv) not in (2, 3):
print("Usage: python summarize.py expenses.csv [--by-category]")
raise SystemExit(2)
if len(sys.argv) == 3 and sys.argv[2] != "--by-category":
print("Usage: python summarize.py expenses.csv [--by-category]")
raise SystemExit(2)
monthly, by_category = read_totals(sys.argv[1])
show_category = len(sys.argv) == 3
for month in sorted(monthly):
print(f"{month} = {monthly[month]}")
if show_category:
for category in sorted(by_category[month]):
print(f" {category} = {by_category[month][category]}")
if __name__ == "__main__":
main()このコードはcsvモジュールとcollections.defaultdictだけを使います。通常実行では月別合計だけを出力し、正確に`--by-category`が二番目の引数として渡されたときに、月別合計の下へcategory別合計を並べ替えて表示します。別のオプションや引数数が渡された場合は使い方を表示して終了します。
機能を追加した後は、二種類の実行をどちらも確認します。まずオプションなしで実行して既存結果が維持されているか確認し、次に`--by-category`を付けて新機能を確認します。この記事のPythonコードはGPTチャットのPythonツールで実際に実行し、以下の期待出力と正確に一致しました。
python summarize.py expenses.csv
python summarize.py expenses.csv --by-category通常実行の期待出力:
2026-09 = 26600
2026-10 = 9800
--by-categoryの期待出力:
2026-09 = 26600
food = 20500
supplies = 3200
transport = 2900
2026-10 = 9800
food = 98009月のcategoryの出力順はアルファベット順なので、food, supplies, transportの順です。合計値自体はシリーズ最初の記事で定めた基準値food 20500, transport 2900, supplies 3200とすべて一致します。10月はfoodだけなので9800と表示されます。
planモードの目的はAIの計画を長く受け取ることではなく、修正前に人が判断するポイントを作ることです。次のようないくつかの質問を通過すれば実装を承認し、一つでも曖昧なら先に計画を修正します。
| 質問 | 今回の例の答え | 判断 |
|---|---|---|
| どのファイルを変えるか | summarize.py | 範囲が狭い |
| 既存の動作は維持されるか | オプションなしの月別出力を維持 | 必ず再確認 |
| 新しい動作はいつ有効になるか | `--by-category`指定時 | 条件が明確 |
| 元データは変わるか | expenses.csvは読み取りのみ | 変更禁止を維持 |
| どう検証するか | 二つの実行コマンドと期待値を照合 | 人が直接確認可能 |
次の記事では、このような変更の前後をgitで記録します。Claude Codeにチェックポイントがあっても、gitは別のバージョン管理手段です。人が変更ファイルとdiffを読む流れを身につけておくと、AIが何を変えたのかをより明確に追跡できます。
GPTチャットのPythonツールの実行環境で、仮想expenses.csvと本文のsummarize.pyをファイルとして保存して実際に実行 · Claude Codeは実行していない
PythonコードはGPTチャットのPythonツールで実行して出力値を検証しましたが、Claude Codeで生成・実行した記録はありません。実際のClaude Codeの計画内容、承認画面、権限動作は利用環境やアカウント設定によって異なる場合があります。