0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIに「このバグ直して」って丸投げすると、なぜ半分ハズすのか — デバッグを"推測ゲーム"から"科学"に戻す、AIとの実践ガイド

0
Posted at

はじめに — その「直して」、たぶん半分はハズしてます

エラーが出る。真っ赤なスタックトレースをコピーして、AIにペタッと貼る。「これ直して」。

……このムーブ、僕もめっちゃやります。速いし、当たると気持ちいい。

でも、正直に言いましょう。当たり外れが、けっこう激しくないですか。

数字でも出ています。Lightrunの「2026 State of AI-Powered Engineering Report」(US/UK/EUの大企業のSRE・DevOpsリーダー200名調査、VentureBeat報道)では、AIが生成したコード変更の43%が、QAもステージングも通ったあとに、本番でもう一度手動デバッグが必要になったそうです。しかも、AIが出した修正を「1回の再デプロイ」で確定できた人はゼロ。88%が2〜3回、11%は4〜6回も直し直したと。

もうひとつ、生々しい研究があります。『How Coding Agents Fail Their Users』(arXiv:2605.29442, 2026-05)という論文で、実際の開発セッション20,574件を分析したところ、コーディングエージェントには共通のクセがあると分かりました。「調べる前に推測する(guessing rather than investigating)」、そして「根本原因に触れず、表層の対症療法を当てる(surface-level symptom fixes)」。

ここで大事なのは、これって「AIが賢くないから」じゃない、という点なんです。むしろ賢いからこそ、"それっぽい答え"を一瞬で出せてしまう。問題は頼み方のほう。「直して」という一言が、AIに推測を強要しているんですよね。

この記事は、その頼み方を根っこから変える話です。キーワードはひとつ。

推測させるな、観測させろ。

これ、実は新しい話じゃありません。デバッグの正しいやり方は、20年前にほぼ答えが出ています。今日はそれをAIと一緒に回す形に翻訳していきます。

なお、この記事が扱うのは「一件のバグを、自分の机で直す」開発デバッグの話です。本番障害の火消し(ログ集約・トリアージ・緩和・ポストモーテム)や、パフォーマンス改善(速さの計測)は、それぞれ別の型があるので、ここでは正しさ(correctness)のバグにしぼって話します。


まず、言葉をそろえましょう

無知の無知、つまり「知らないことすら知らない」状態で置いていかれるのが一番しんどい。なので、最初に用語を全部ざっくり定義します。分かる人は読み飛ばしてOKです。

  • バグ: プログラムが「こうあってほしい挙動」と違う動きをすること。エラーで落ちるだけじゃなく、"静かに間違った結果を返す"のもバグ。
  • 再現(repro): そのバグを、狙って何度でも起こせる状態にすること。「たまに起きる」を「必ず起きる」に変える作業。
  • スタックトレース: エラーが起きた瞬間の「関数の呼ばれ方の履歴」。事故現場に残ったブレーキ痕みたいなもの。
  • ログ / instrumentation(計器): コードの要所に「今ここ通ったよ、変数はこの値だよ」と喋らせること。車のスピードメーターを後付けするイメージ。
  • 根本原因(root cause)と対症療法(symptomatic fix): 雨漏りで例えると、天井のシミを塗り替えるのが対症療法、屋根の穴をふさぐのが根本原因。塗り替えても、また滲みます。
  • 回帰(regression): 直したはずのバグが、あとでまた復活すること。あるいは、直した拍子に別の場所が壊れること。
  • 回帰テスト(regression test): 「このバグが二度と戻ってこないか」を自動でチェックし続けるテスト。踏んだ地雷に刺す「立入禁止」の札。
  • 二分探索(bisect): 「どのタイミングで壊れたか」を、範囲を半分ずつに割って絞り込む探し方。犯人を「前半にいる?後半にいる?」で追い詰める。

このへんの言葉が体に入ってると、AIへの指示もグッと具体的になります。


なぜ「直して」丸投げは半分ハズすのか

理由を、根性論じゃなく構造で見てみましょう。3つあります。

① 文脈が足りないと、AIは"それっぽさ"で埋める

AIはあなたのコードベース全体も、本番のデータも、その関数がどういう約束(契約)で呼ばれてるかも、基本的には見えていません。見えない部分は、学習データの「よくあるパターン」で補完します。だからエラー文だけ渡すと、"世間一般のよくある原因"を、自信たっぷりに埋めてくる。当たることもあるけど、あなたの現場の事情はガン無視です。

② AIは「動く」を最適化する。「原因」は頼まないと出てこない

「直して」と言われたAIのゴールは、「エラーが消えるコードを返すこと」になりがちです。エラーさえ消えれば、原因を理解していなくても、タスクは"達成"に見える。だから try/except でエラーを握りつぶす、if x is None: return を足す、みたいな「症状を消すだけ」の修正が平気で出てきます。動く。でも、直ってない。

③ 対症療法は一瞬速いけど、負債になる

②の修正は、その場では動くから気持ちいい。でも根本原因が生きてるので、少し違う条件でまた顔を出す。しかも、握りつぶした場所には「なぜここでNoneが来るのか」という問いが埋められたまま。半年後の自分(かAI)が、その黒魔術を前に固まることになります。

冒頭の研究(arXiv:2605.29442)が20,574セッションで見つけた「推測」と「対症療法」は、まさにこの①②③が現場で噴き出した姿なんですよね。モデルを賢いのに替えても、頼み方が"推測を促す形"のままだと、この構造は変わりません。


リフレーム:デバッグは「コード生成」じゃなくて「仮説の探索」

ここで発想を一段ずらします。

多くの人はデバッグを「壊れたコードを、正しいコードに書き換える作業」だと思ってる。だからAIに「書き換え」を頼む。でも、それは仕上げの一部でしかありません。

デバッグの本体は、「なぜ壊れているのか、その理由を突き止める作業」です。これは書く仕事じゃなくて、調べる仕事。もっと言うと、仮説を立てて、観測で確かめて、絞り込んでいく科学なんです。

実はこれ、ソフトウェア工学ではとっくに整理されています。Andreas Zellerの名著『Why Programs Fail: A Guide to Systematic Debugging』(2005)は、デバッグに科学的方法を持ち込みました。流れはシンプルで、

  1. 失敗を再現する
  2. 原因の仮説を立てる
  3. 仮説が正しいなら「こう観測できるはず」を予測する
  4. 実験して、予測が合うか確かめる
  5. 説明が固まるまで、仮説を修正して繰り返す

同じZellerの「Delta Debugging」(IEEE TSE 2002)という論文のタイトルが、デバッグの気分を完璧に表しています。曰く、「Yesterday, my program worked. Today, it does not. Why?(昨日は動いた。今日は動かない。なぜ?)」。

この"科学"のフレームに乗ると、人間とAIの役割がスッと決まります。

  • 人間=科学者。何がおかしいと感じるかを定義し、仮説を立て、「何を観測すれば決着がつくか」を決め、最後に修正を承認する。ここはWhat / Whyの領域。
  • AI=めちゃくちゃ優秀な実験助手。ログやトレースを高速で読む、観測用のコードを書く、仮説を並べる、最小の修正差分を書く、回帰テストを書く。ここはHowの領域。

だから合言葉はこうなります。

推測させるな、観測させろ。

AIに「原因を当てて」と言うと推測ゲームになる。「この仮説を確かめる観測コードを書いて」と言うと、科学になる。同じAIでも、引き出すものが全然変わるんです。


デバッグの型:5つのステップ

科学的方法を、明日から手を動かせる5ステップに落とします。全体像はこれ。

① 再現(Reproduce)   失敗を必ず起こせる状態にする(失敗するテストを先に書く)
② 観測(Observe)     推測せず、事実を集める(ログ・トレース・二分探索)
③ 仮説(Hypothesize) 原因の候補を複数出し、確率順に並べる
④ 最小修正(Fix)     根本原因に、最小の差分で手を入れる
⑤ 再発防止(Prevent) バグを再現するテストを恒久化する(立入禁止の札)

そして、各ステップの人間とAIの分担をざっくり先に置いておきます。

ステップ     人間(What/Why)                     AI(How)
① 再現       何が「正しい」かを定義              MRE化・repro手順の整理
② 観測       どこを観測すれば決着するか決める    ログ差し込み・トレース読解
③ 仮説       仮説の妥当性を判断                  仮説を複数生成・確率付け
④ 最小修正   対症療法か根本かを見極め承認        最小diffの提案
⑤ 再発防止   何を守るべきかを決める              回帰テストのコード生成

ここから、1ステップずつ具体的にいきます。


Step1|再現(Reproduce):直す前に、まず「必ず落ちるテスト」を書く

デバッグで一番やりがちなミスが、再現できていないのに直し始めることです。再現できていないと、直ったのかどうかも確認できない。まぐれで消えたのか、本当に直したのか、区別がつかないんですよね。

なので最初にやるのは、修正じゃなくて「そのバグを踏む、失敗するテストを1本書くこと」。これがあると、直ったかどうかが「テストが赤→緑になったか」で機械的に分かります。

たとえば「割引計算が、特定の条件でマイナスになる」というバグなら、こう書きます。

# test_discount.py
# バグを踏むための「失敗するテスト」を先に書く(red)
from pricing import apply_discount


def test_discount_never_goes_negative():
    # 100円の商品に、150%割引という不正な入力が来たケース
    price = apply_discount(base_price=100, discount_percent=150)
    # 期待: 価格は0円未満にならない
    assert price >= 0, f"価格がマイナスになった: {price}"

このテストが「赤(失敗)」になることを、まず確認する。再現できた瞬間、バグは半分片付いたようなものです。

ここで大事なのが決定論化。「たまに落ちる」バグは、AIにとっても人間にとっても地獄です。ランダム・時刻・外部通信・並行処理みたいな"ゆらぎ"を固定して、「必ず落ちる」状態を作りましょう。

# ゆらぎを固定して「たまに」を「必ず」にする
import random

def test_flaky_becomes_deterministic():
    random.seed(42)          # 乱数を固定
    # 時刻に依存するなら freezegun 等で「今」を固定する
    # 外部APIに依存するなら、その応答をモックで固定する
    ...

AIに任せるところは、この「再現手順の整理」と「最小再現(MRE)化」です。長い再現手順から、バグに関係ない部分をそぎ落として、最小の再現コードにしてもらう。プロンプトはこんな感じ。

【役割】あなたはデバッグの実験助手です。原因の推測はまだしないでください。

【状況】次の手順でバグが再現します(全文貼付)。
(再現手順・エラーメッセージ・関連コードを貼る)

【依頼】
1. このバグを再現する「失敗するテスト」を1本、pytestで書いてください。
2. 再現に関係なさそうな手順を削って、最小の再現コード(MRE)に絞ってください。
3. 再現が不安定な要因(乱数・時刻・並行・外部通信)があれば指摘し、
   それを固定する方法だけ挙げてください。
※ まだ修正案は出さないでください。まずは「必ず落ちる状態」を作るのがゴールです。

「まだ修正するな」と釘を刺すのがコツです。放っておくとAIは秒で④に飛んで推測し始めるので。


Step2|観測(Observe):推測させるな、観測させろ

再現できたら、次は事実集め。ここがこの記事の心臓部です。

原則はひとつ。AIにも自分にも、推測を禁止して、観測させる。 「たぶんここが原因」ではなく、「ここにログを入れて、実際の値を見る」。

スタックトレースは"読む"、AIには"次の一歩"を聞く

スタックトレースは上から下へ「呼ばれた順」に並んでいます。まず自分たちのコードで一番最後に出てくる行、そこが事故の入口であることが多い。AIに渡すときは、「原因を当てて」ではなく「次に観測すべき場所を1つだけ挙げて」と頼みます。

【役割】実験助手として、推測ではなく「次の観測点」を出してください。

【材料】
- 失敗するテスト(Step1で作成、貼付)
- スタックトレース全文(貼付)
- 該当関数のコード(貼付)

【依頼】
1. このトレースから「確実に言える事実」だけを箇条書きにしてください
   (推測と事実を混ぜないこと)。
2. 原因を特定するために、次に確認すべき変数・分岐を「1箇所だけ」挙げ、
   そこにログを入れるコードを提案してください。
3. その値が「何だったら、どの仮説が濃くなるか」も添えてください。

「事実と推測を分けて」「次の1箇所だけ」——この2つで、AIの暴走がかなり止まります。

計器(ログ)を差し込んで、値を"見る"

提案されたログを、実際に入れて動かす。ここで初めて「思ってた値と違う」が見えてきます。

import logging
logger = logging.getLogger(__name__)

def apply_discount(base_price, discount_percent):
    # 観測: 入ってきた値を、加工する前にそのまま見る
    logger.debug("apply_discount 入力: base=%s, percent=%s",
                 base_price, discount_percent)
    discounted = base_price * (1 - discount_percent / 100)
    logger.debug("apply_discount 計算結果: %s", discounted)
    return discounted

これを走らせて percent=150 が来ていると分かれば、「割引率の上限チェックが無い」という事実が観測できます。推測じゃなく、目で見た事実です。

「昨日は動いた」なら、二分探索(git bisect)

「先週まで動いてたのに」というバグは、どのコミットで壊れたかを探すのが最速です。手で1つずつ戻すのは大変なので、gitの二分探索を使います。良いコミットと悪いコミットを教えると、半分ずつ絞ってくれます。

# 今は壊れている、3日前は動いていた、が分かっているとき
git bisect start
git bisect bad                 # 今のコミットは「悪い」
git bisect good a1b2c3d        # 動いていたコミットを「良い」と伝える

# ここから git が中間コミットを次々チェックアウトしてくれる。
# テストを走らせて good / bad を答えるだけ。

# さらに自動化: テストの成否で自動判定させる
git bisect run pytest test_discount.py
# → 「このコミットが原因」と一発で出る

git bisect reset               # 終わったら元に戻す

犯人のコミットが分かれば、その差分を見るだけで原因がほぼ見えます。ここまで来ると、AIに渡す情報の質が段違いになりますよね。


Step3|仮説(Hypothesize):1つに飛びつかない

観測で事実がそろってきたら、原因の仮説を立てます。ここでの落とし穴は、最初に浮かんだ1つの仮説に恋してしまうこと。人間もAIも、これをやります。

対策は「複数出して、確率順に並べる」。そして各仮説に、その仮説をどう観測すれば否定できるか(kill条件)を先に決めておく。反証を用意しておくのが、科学の作法です。

【役割】実験助手として、原因の仮説を複数出してください。断定はしないこと。

【材料】観測で分かった事実(Step2の箇条書き)+関連コード(貼付)

【依頼】
1. 原因の仮説を3〜5個、「ありえそうな順」に並べてください。
2. 各仮説について、次の2つを必ず添えてください。
   - 「この仮説が正しいなら、こう観測できるはず」(確認方法)
   - 「もしこう観測されたら、この仮説は捨ててよい」(反証=kill条件)
3. どの仮説も、まだ修正はしないでください。

こうすると、AIの出力が「これが原因です(キリッ)」から「候補と、それを潰す実験セット」に変わります。あとは人間が、コストの低い実験から順に観測して、仮説を1つずつ消していく。残ったものが真実、という探偵ムーブですね。

ここで肝に銘じたいのは、AIが出した仮説は「主張」であって「事実」じゃないということ。もっともらしさと正しさは、全然べつものです。必ず観測で裏を取る。これは後の安全章でもう一度出てきます。


Step4|最小修正(Fix):根本原因に、最小の差分で

原因が観測で確定したら、いよいよ修正。ここでの合言葉は、根本原因に、最小の差分で、この一点です。

さっきの割引バグ。原因は「割引率の上限・下限チェックが無い」ことでした。悪い修正(対症療法)と、良い修正(根本修正)を並べてみます。

# ❌ 対症療法:症状(マイナス価格)だけを消している
def apply_discount(base_price, discount_percent):
    discounted = base_price * (1 - discount_percent / 100)
    if discounted < 0:      # マイナスなら0にする…
        discounted = 0      # → なぜ150%が来るのかは放置。次はまた別の顔で出る
    return discounted
# ✅ 根本修正:不正な入力そのものを、境界で止める
def apply_discount(base_price, discount_percent):
    # 割引率は 0〜100 の範囲でしか意味を持たない、という「契約」を明示する
    if not 0 <= discount_percent <= 100:
        raise ValueError(f"discount_percent は 0〜100 で指定してください: {discount_percent}")
    return base_price * (1 - discount_percent / 100)

対症療法版は「マイナスになったら0」と、症状を隠しているだけ。150%という不正な入力がなぜ来たのか、という本当の問いは残ったままです。根本修正版は、「割引率は0〜100」という契約を境界で守る。以後、変な値は入口ではじかれます。

AIに修正を頼むときは、「対症療法になっていないか自己批判させる」よう頼むのが効きます。

【役割】確定した根本原因(Step2/3で観測済み)に対して、修正案を出してください。

【原因】割引率の上限チェックが無く、100を超える値がそのまま計算される。

【依頼】
1. 症状を隠すのではなく、原因を断つ最小の修正diffを出してください。
2. その修正について、自分で次を点検してください。
   - これは「対症療法(症状隠し)」ではないか?
   - この変更で、別の呼び出し元が壊れる可能性はないか?
   - 変更範囲は必要最小限か?(ついでの整形・リファクタを混ぜない)
3. 懸念が残る箇所は「ここは人間が確認してください」と明示してください。

「ついでのリファクタを混ぜない」も地味に大事です。修正と無関係な変更が混ざると、レビューもロールバックも一気に難しくなるので。


Step5|再発防止(Prevent):バグに「立入禁止」の札を刺す

修正できた。テストが緑になった。……で終わらせないのが、プロの、いや明日の自分に優しい人のやり方です。

最後に、Step1で書いた「失敗するテスト」を、恒久的な回帰テストとして残す。これで、このバグが将来もう一度忍び込もうとした瞬間、CIが赤くなって止めてくれます。踏んだ地雷に「立入禁止」の札を刺すイメージ。

# test_discount.py(回帰テストとして恒久化)
import pytest
from pricing import apply_discount


def test_normal_discount():
    assert apply_discount(100, 20) == 80


def test_reject_out_of_range_discount():
    # かつてマイナス価格を生んだ入力。二度と通さない。
    with pytest.raises(ValueError):
        apply_discount(base_price=100, discount_percent=150)

このテストをCIに乗せておけば、再発は仕組みで防げます。

# .github/workflows/test.yml(抜粋)
name: test
on: [push, pull_request]
jobs:
  pytest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: pip install -r requirements.txt
      - run: pytest -q      # 回帰テストが赤なら、ここでマージが止まる

余力があれば、超軽量の「ポストモーテム」も1〜2行残すと最高です。ドラマチックな反省文じゃなくていい。

## bug: 割引価格がマイナスになった (2026-07-04)
- 症状: discount_percent=150 で価格が負値
- 観測できた事実: 入力に上限チェックが無く、100超がそのまま計算されていた
- 修正: apply_discount の入口で 0〜100 を検証(契約を明示)
- 再発防止: test_reject_out_of_range_discount を追加
- 学び: 「外から来る数値には、意味の範囲がある」。境界で守る。

これ、AIに観測ログと修正diffを渡して下書きさせれば10秒です。未来の自分(と次に触るAI)への置き手紙になります。


安全鉄則:ここだけは、絶対に外さない

AIとデバッグするとき、速さより先に守るべき線があります。

① 秘密・PII・本番接続を、ログやプロンプトに貼らない(最重要)

デバッグ中って、つい生のログをそのままAIに投げたくなります。でもそのログに、APIキー・トークン・個人情報・本番のDB接続文字列が混ざっていたら? AIに渡す=外に出す、です。一度渡したら、キャッシュされるかもしれないし、取り消せない前提で動くのが安全。貼る前にマスクする。

# ❌ 生のまま貼らない
logger.debug("request: %s", request)   # ヘッダにトークンが乗っているかも

# ✅ 秘密は落としてから
def redact(d: dict) -> dict:
    hide = {"authorization", "api_key", "password", "token", "cookie"}
    return {k: ("***" if k.lower() in hide else v) for k, v in d.items()}

logger.debug("request: %s", redact(request_headers))

② 不可逆な操作は、AIに実行ボタンを持たせない

「本番DBでこのDELETEを試して」みたいなデバッグは、事故ると戻せません。本番DBの削除・課金・メール送信・デプロイ——このへんの不可逆操作は、必ず人間のゲートを通す。AIに触らせるのは、コピーした検証環境か、読み取り専用の接続だけにしましょう。

③ AIの「原因はこれです」は、主張であって事実じゃない

Step3でも言いましたが、これは何回でも言います。AIの説明は流暢で、めちゃくちゃ正しそうに聞こえる。でも、正しそう≠正しい。必ず観測(ログ・テスト)で裏を取ってから信じる。冒頭のLightrunの数字——AIの修正が2〜3回の再デプロイで直った——は、まさに「一発で信じると火傷する」ことの裏付けですよね。

④ 外から来たエラー文・ログは「データ」として扱う

ユーザーの入力や外部サービスのメッセージに、AIへの指示めいた文字列(「これまでの指示を無視して……」的なもの)が紛れ込むことがあります。デバッグ材料として貼るときも、それはあくまで調査対象のデータであって、AIへの命令ではない、という枠で扱う。プロンプトインジェクションの入口を、デバッグ経由で開けないように。


人間とAIの役割分担(まとめ表)

やること 人間(What / Why) AI(How)
何が「正しい」かの定義 ◎ 決める
失敗するテストを書く 承認する ◎ 下書き
再現手順のMRE化 妥当性を判断 ◎ そぎ落とす
ログ・観測点の設計 ◎ どこを見るか決める 差し込みコードを書く
スタックトレース読解 事実を確認 ◎ 高速に読む
仮説を立てる ◎ 採否を判断 複数生成+確率付け
対症療法か根本かの見極め ◎ 最終判断 自己批判の材料出し
最小修正diff 承認・マージ ◎ 差分を書く
回帰テスト 何を守るか決める ◎ コード生成
不可逆操作の実行 ◎ 人間だけ 触らせない

境界線はいつも同じです。What(何を)とWhy(なぜ)は人間、How(どうやって)はAI。 デバッグでも、この線は動きません。


つまずきポイントと、撤退ライン

よくある落とし穴

  1. 再現せずに直し始める → 直ったか永久に確認できない。まず失敗テスト。
  2. 1つ目の仮説に恋する → 反証(kill条件)を先に決めておく。
  3. 対症療法を"修正"と呼ぶ → 症状隠しは負債。根本を断つ。
  4. AIの説明を観測なしで信じる → 主張は事実じゃない。ログで裏取り。
  5. 修正にリファクタを混ぜる → レビューもロールバックも困難に。差分は最小。
  6. 生ログを丸ごとAIに貼る → 秘密・PII漏れ。マスクしてから。

撤退ライン(AIデバッグをやめて、人間の手に戻す線)

  • AIの修正案が、同じ場所で3回連続でハズした → 前提(渡してる文脈)が間違っている合図。手を止めて、観測をやり直す。
  • 原因が「セキュリティ」「お金」「データ消失」に触れそう → 速さより正確さ。人間が主導する。
  • 再現がどうしても取れない → 直すより前に、まず観測(ログ強化・監視)を仕込んで"次に起きたとき捕まえる"に切り替える。

「AIに任せない」も、立派な設計判断です。どこまで任せてどこから握るかを決めるのが、これからのエンジニアの腕の見せどころかなと思います。


おわりに — 今日刺した回帰テストは、明日の自分への「あざっす」

長くなったので、いちばん大事なところだけ持って帰ってください。

デバッグは、コードを書き換える作業じゃなくて、仮説を観測で確かめる"科学"です。 そして、

推測させるな、観測させろ。

AIに「原因当てて」と言えば推測ゲーム。「この仮説を確かめる観測コード書いて」と言えば、科学になる。同じAIから、まるで違うものが引き出せます。人間がWhat / Why(何が正しくて、なぜそう言えるか、何を観測すれば決着するか)を持ち、AIにHow(読む・書く・並べる・作る)を任せる。この線を守るだけで、冒頭の「43%が本番で再デバッグ」みたいな事故は、ぐっと減らせるはずです。

最後に、ひとつだけ気持ちの話を。

バグを出したとき、「なんでこんなの見落としたんだ」って過去の自分を責めたくなりますよね。でも僕は、そこは責める軸じゃなくていいと思っています。バグは、出るもの。大事なのは、今日それを踏んで、観測して、根本を直して、"立入禁止"の札(回帰テスト)を1枚刺しておくこと

その札は、半年後にまた同じ穴に落ちかけた自分を、CIの赤ランプで止めてくれます。そのとき明日の自分は、こう言うはずです。「札さしといてくれて、あざっす」。

デバッグの型も、観測の習慣も、積み上げた回帰テストも、AIには奪えない、あなたに積み上がっていく資産です。まさに Code as Capital。道具は借りても、"直せる力"だけは、自分のものにしていきましょう。

明日からの4ステップ

  1. 次にバグを踏んだら、直す前に「失敗するテストを1本」書く。
  2. 「原因を当てて」じゃなく、AIに「次に観測すべき1箇所」を聞く。
  3. 修正案には「これは対症療法じゃない?」と一言、自己批判させる。
  4. 直したら、そのテストを回帰テストとして残してCIに乗せる。

これだけで、あなたのデバッグは「推測ゲーム」から「科学」に変わり始めます。明日の自分が「あざっす」って言ってくれる一歩、今日ひとつ、置いていきましょう。


参考文献・出典

  • Andreas Zeller, Why Programs Fail: A Guide to Systematic Debugging, Morgan Kaufmann, 2005(科学的方法によるデバッグ)
  • Andreas Zeller, "Simplifying and Isolating Failure-Inducing Input"(Delta Debugging, IEEE TSE 2002)
  • Tang et al., How Coding Agents Fail Their Users: A Large-Scale Analysis of Developer-Agent Misalignment in 20,574 Real-World Sessions, arXiv:2605.29442, 2026-05
  • Lightrun, 2026 State of AI-Powered Engineering Report(VentureBeat報道/SRE・DevOpsリーダー200名調査)
  • Git 公式ドキュメント(git bisect
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?