19
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?

『バグ直った?』『直ったっぽい』──それは直っていない

Last updated at Posted at 2025-12-18

結論から言います

「バグが直ったように見える状態」は、プログラミングをしていると本当によく起きます。

そしてここで多くの人が、

「バグ直った?」
「直ったっぽい」

と口にしてしまいます。

ここで、 「直ったっぽい」 とかいう、史上最大級の失敗フラグを立てることになります。

──でも、それはバグが消えたわけではありません

ただ、再現条件が分からなくなっただけです。

そして、そのバグは必ず戻ってきます。最悪のタイミングで。
これは初心者だけの話ではありません。

この記事では、「直ったっぽい」を次のように定義します:

原因が分からないまま、たまたま動いている状態

これは「直った」ではなく、「見えなくなった」だけです。

「直ったっぽい」が起きる理由

バグというのは、特定の条件でしか起きないことがほとんどです。

  • ユーザーが特定の順番で操作したとき
  • データが特定の状態のとき
  • 何回目かの処理だけ
  • ログインしている/していないで挙動が変わる
  • データベースに特定のレコードがあるとき

こういう条件がそろわなければ、バグは起きません。

つまり、たまたま条件を踏まなかっただけで「あれ、直ってる?」と思ってしまうんです。

ここで覚えておいてほしいのは、「エラーが出ない = 安全」ではないということ。

バグは消えたのではなく、見えなくなっただけです。

下手をすると、東野圭吾のミステリー並に迷宮入りします。
伏線(ログ・条件・環境差)は大量にありますが、
回収できる人は、もう誰もいません。

そして厄介なのは、見えなくなったバグは、本番環境で、お客さんの前で、突然姿を現すということです。

初心者がやりがちな勘違い

私も最初はそうでした。こんなことを「直った」と思っていました。

パターン1: 1回動いたら「OK」と思う

「さっきエラー出てたけど、今は出ない。よし!」

→ 1回成功しただけでは何も証明できていません。バグの条件を踏んでいないだけかもしれません。

パターン2: リロードしたら直った気がする

「なんか知らんけど、ページ更新したら動いた」

→ リロードで状態がリセットされただけです。バグを引き起こす状態に再びなれば、また起きます。

パターン3: 環境を変えたら出なくなった

「Chrome では出るけど、Safari だと出ない。まぁいいか」

→ バグが消えたのではなく、Chrome を使うユーザーだけが遭遇する時限爆弾を残しています。

パターン4: 「よく分からないけど直った」

「とりあえず色々いじったら動くようになった」

これが一番危険です。 何を変えたか分からないということは、また壊れても気づけないということです。

どれも、原因不明のままです。

バグは消えていません。ただ隠れただけ。

※ 以下はすべて「実際によくある話」です。フィクションではありません。

具体例1:「ログイン状態によって起きるバグ」

実務でよくあるパターンです。

function getUserProfile() {
  const user = getCurrentUser(); // ログインユーザー情報を取得
  
  // ログインしていない場合、userはnullになる
  document.getElementById('username').textContent = user.name; // ここでエラー
  document.getElementById('email').textContent = user.email;
}

ログインした状態で開発していると、このバグに気づきません。

開発中は常にログイン状態だから、user は常に存在します。だから動く。

でも、ログアウト状態でページを開いたユーザーには、エラーが起きます。

「あれ、さっきまで動いてたのに」「自分の環境では再現しない」

これが「直ったっぽい」の典型例です。

正しい修正:

function getUserProfile() {
  const user = getCurrentUser();
  
  // ログインしていない場合の処理を追加
  if (!user) {
    document.getElementById('username').textContent = 'ゲスト';
    document.getElementById('email').textContent = '未設定';
    return;
  }
  
  document.getElementById('username').textContent = user.name;
  document.getElementById('email').textContent = user.email;
}

具体例2:「配列の順番に依存するバグ」

もう一つ、実務でよくあるパターン。

function displayFirstProduct(products) {
  const firstProduct = products[0];
  
  document.getElementById('product-name').textContent = firstProduct.name;
  document.getElementById('product-price').textContent = firstProduct.price;
}

開発環境では商品データが必ずあるので、これは動きます。

でも、本番環境で:

  • 検索結果が0件のとき
  • フィルタをかけて該当商品がなくなったとき
  • まだ商品を登録していない新規ユーザー

このとき products[0]undefined になり、エラーが起きます。

「開発環境では動くのに、本番で動かない」

開発環境と本番環境でデータが違うことは、よくあります。

正しい修正:

function displayFirstProduct(products) {
  // 商品が存在しない場合の処理
  if (!products || products.length === 0) {
    document.getElementById('product-name').textContent = '商品がありません';
    document.getElementById('product-price').textContent = '-';
    return;
  }
  
  const firstProduct = products[0];
  document.getElementById('product-name').textContent = firstProduct.name;
  document.getElementById('product-price').textContent = firstProduct.price;
}

具体例3:「非同期処理のタイミングバグ」

これは見逃しやすいバグの代表格です。

let userData = null;

async function loadUser() {
  const response = await fetch('/api/user');
  userData = response.json(); // awaitを忘れている
}

function showUserName() {
  console.log(userData.name); // ここでエラーになることがある
}

loadUser();
showUserName(); // すぐ呼び出している

開発環境では、回線が速いので動くことが多いです。

でも、ユーザーの回線が遅いとき、APIのレスポンスが遅いとき、userData がまだ Promise のまま showUserName() が実行されてエラーになります。

「自分の環境では再現しないんですよね...」

ネットワークの速度は環境によって違います。 これも「直ったっぽい」の原因になります。

正しい修正:

async function loadAndShowUser() {
  const response = await fetch('/api/user');
  const userData = await response.json(); // awaitを正しく使う
  
  // データを取得してから表示
  console.log(userData.name);
}

loadAndShowUser(); // 順番を保証

await で処理の順番を保証すれば、回線速度に関係なく正しく動きます。

「本当に直った」と言える最低条件

専門的なテストの話はしません。初心者が最低限押さえるべきことだけ書きます。

本当に直ったと言えるのは、この5つが全部クリアできたときです。

✅ いつ起きるか説明できる

「○○を△△したときに起きる」と言える状態。

「ログアウト状態でページを開くと起きる」
「商品が0件のときに起きる」

こういう説明ができるなら、バグを理解しています。

✅ なぜ起きていたか説明できる

「□□が原因だった」と言える状態。

「user が null なのに、プロパティにアクセスしていたから」
「配列が空なのに、[0] を取得しようとしたから」

原因を言えるなら、同じミスを防げます。

✅ 何を変えたか説明できる

「××を修正した」と言える状態。

「null チェックを追加した」
「配列の長さを確認するようにした」

何を変えたか言えないなら、それは修正ではなく「たまたま」です。

✅ 同じ操作を何回やっても起きない

1回じゃなく、5回、10回試しても大丈夫。

バグは条件次第で起きたり起きなかったりします。何度も試して初めて「直った」と言えます。

✅ 異常系のパターンも試した

  • ログインしてない状態
  • データが0件の状態
  • 必須項目が空の状態
  • 回線が遅い状態

正常に動くときだけ試しても意味がありません。 バグは異常系で起きます。

この5つ全部がYESなら、直ったと言っていい。

「治ったっぽい」を防ぐ考え方

バグを直すとき、一番大事なのはまず再現させることです。

「なんか適当にやったら動いてるからヨシ!」じゃないんですよ。

再現できないバグは、安定して直すことができません。原因が分からない修正は、不安定です。

直す前に、分かるようにする

これが全てです。

分からないまま直そうとすると、「直ったっぽい」になります。分かってから直せば、本当に直ります。

初心者向けチェックリスト

次にバグを直したとき、このチェックリストを使ってください。

  • なぜ起きてた? → 言える?

  • 何を直した? → 言える?

  • 同じ操作を5回以上試した? → YES?

  • ログアウト状態でも試した? → YES?

  • データが空のときも試した? → YES?


全部YESなら、「直った」と言っていい。

1つでもNOなら、まだ直っていない可能性があります。

よくある質問

Q: 毎回そんなに確認する時間ないんですけど...

A: 確認しないまま本番に出して、お客さんの前でバグが起きたら、もっと時間がかかります。

最悪ブチギレられます。

「直ったっぽい」で進めて、後で戻ってくる方が、結局は時間の無駄です。

Q: 原因が分からないときはどうすれば?

A: 分からないなら、まだ直せません。再現できて初めて「修正」が始まります。

先輩に聞く、エラーメッセージで検索する、デバッガで動きを見る。

分かるまで調べることが、成長の近道です。

Q: リリース直前で時間がないときは?

A: それでも、最低限の確認は必要です。

「直ったっぽい」でリリースして、本番で障害が起きる方が、よっぽど大変です。

時間がないなら、リリースを延期する判断も必要です。

まとめ

「直ったっぽい」は、成長途中のサインです。

悪いことじゃない。誰もが通る道です。

でも、そこから一歩進むには、 「説明できる修正」 をすることが必要です。

バグ修正は、運じゃなくて理解です。


覚えておいてほしいこと:

  • エラーが出ない = 直った、ではない
  • 1回動いた = 直った、ではない
  • 原因不明の修正 = 直った、ではない

本当に治ったと言えるのは:

  • なぜ起きたか分かる
  • 何を直したか分かる
  • 何度試しても起きない

次に「直った?」と聞かれたとき、 「なぜ直ったか説明できるか」 を自分に問いかけてみてください。

この記事を読んで、こう思ってもらえたら嬉しいです。

「あ、前に"直った"と思ったやつ、ただ再現条件を見失ってただけかも」

それに気づけたら、もう一歩成長しています。

次のバグ修正では、「直ったっぽい」じゃなく、「直った」と自信を持って言えるようになりますように。

19
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
19
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?