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

はじめに

システム開発をしていると、開発環境では問題なく動いていたのに本番環境では動かなくなる、と言う事態に陥ることがよくあります。

今回は、「開発環境では動くのに本番では動かない」現象について、よくある原因をまとめて紹介します。

開発環境と本番環境の違い

まず前提として、開発環境と本番環境は完全に同じではありません。
開発環境は、開発者が機能を作ったり確認したりするための環境です。一方、本番環境は実際の利用者がサービスを使う環境になります。
例えば、次のような違いがあります。

  • サーバーの性能
  • OSやライブラリのバージョン
  • データ量
  • ネットワーク環境
  • 外部サービスとの接続先
  • セキュリティ設定

小さな違いに見えても、システムにとっては大きな影響を与えることがあります。
開発環境では基本的に安定した環境で開発者自身が操作することが多いのに対し、本番環境では様々な環境で想定外の操作が発生するため、本番環境のみ動かない、動いても安定して動かない、という事態が発生しがちです。

よくある原因

設定の違い

システムには多くの設定値があります。

例えば、

  • APIの接続先
  • データベース情報
  • 外部サービスの認証情報
  • 環境変数

開発環境では正しく設定されていても、本番環境で設定が不足していると正常に動作しません。「コードは正しいのに動かない」という問題の多くは、実は設定が原因だったというケースはよく見かけます。

データ量の違い

開発環境では数十件しかなかったデータが、本番では数万件、数十万件に膨らむことがあります。少ないデータでは一瞬で終わる処理でも、大量データでは数秒かかったり、タイムアウトしたりします。
そのためシステムは機能だけでなく、負荷テストを実施するなどして性能も確認する必要があります。

外部サービスとの連携

最近は、多くの外部サービスと連携させたシステムも増えてきています。
例えば、

  • 認証サービス
  • メール送信サービス
  • 決済サービス
  • 分析ツール
  • クラウドサービス

これらのサービスの設定や応答状況によって、システム全体の動きが変わることがあります。自社のシステムに問題がなくても、連携先の影響を受けることも珍しくありません。

本番だけの制約

本番環境では、安全性や安定性のために制約が設けられています。
例えば、

  • アクセス制限
  • セキュリティ設定
  • メモリ使用量の制限
  • 実行時間の制限

開発環境では自由に動かせていた処理が、本番では制限に引っかかって動かなくなることがあります。

本番で問題を起こさないための対策

では、こうした問題を完全になくすことはできるのでしょうか。
結論から言うと、すべての問題を事前に見つけて対策することは非常に困難です。
そのため、開発では「問題が起きることを前提に、できるだけ早く発見できるようにする」ことが重要になります。

本番に近い環境でテストする

開発環境と本番環境の違いをできるだけ小さくします。
例えば、

  • 本番と同じバージョンのソフトウェア使用
  • 本番に近いデータ量でテスト

などが挙げられます。
「開発環境では動いた」だけで終わらせず、「本番に近い条件でも動くか」を確認することが重要です。

様々な条件を想定してテストする

正常なケースだけではなく、異常なケースも確認します。
例えば、

  • ネットワークが遅い
  • サーバーからエラーが返ってくる
  • データが存在しない
  • 大量のデータがある
  • 同時に多くのユーザーが操作する

などです。
「普通に使えば動く」だけではなく、「問題が起きたときにも適切に処理できるか」を確認します。

ログや監視を用意する

本番環境で問題が起きた場合、画面だけを見て原因を特定するのは困難です。そのため、システムが何をしていたのかを記録する「ログ」が重要になります。エラーが発生した時間や処理内容などを確認できれば、原因を調査しやすくなります。
また、サーバーの負荷やエラー数などを監視しておくことで、問題が大きくなる前に異常を発見できる場合もあります。

本番環境への変更を慎重に行う

本番環境では、わずかな設定変更がサービス全体に影響する可能性があります。
そのため、

  1. 開発環境で確認する
  2. 必要に応じてテスト環境で確認する
  3. 本番環境へ反映する
  4. 反映後に正常に動作しているか確認する

というように、段階を踏んで慎重に変更することが重要です。一つずつ確認し、原因を絞り込むことも、開発の重要な仕事です。

まとめ

「開発環境では動くのに本番では動かない」という現象は、特別な失敗ではありません。むしろ、システムが多くの環境や条件の上で成り立っているからこそ起こる現象です。
だからこそ、「開発環境で動いたから大丈夫」ではなく、「本番で起こり得る条件をどこまで想定できるか」が重要になります。
本番環境を完全に再現することは難しいですが、本番に近い環境でテストを行い、様々な条件を想定し、ログや監視によって問題を早期に発見できるようにする。
こうした積み重ねによって、システムをより安定して運用できるようになります。