【ITニュース解説】Bad things might happen if you ignore this
2025年09月18日に「Dev.to」が公開したITニュース「Bad things might happen if you ignore this」について初心者にもわかりやすく解説しています。
ITニュース概要
学生SEがAI利用制限システム実装で、本番環境と開発環境が同一だったため、フロントエンド変更前にバックエンドを更新しシステムを停止させた。ステージング環境での十分なテストと、変更前に必ず確認することの重要性を痛感した。
ITニュース解説
このニュース記事は、システム開発の現場で起こりがちな失敗と、そこから得られる重要な教訓について、ある大学生インターンの実体験を通して語っている。彼はPointblankという教育プラットフォームを提供するスタートアップでインターンとして働いている。このプラットフォームは、教師がAIを使って教材を作成し、学生がそれを使って学習できる便利なサービスだ。
インターンが最初に任された仕事は、AI機能の無制限利用を制限するためのクレジットシステムを導入することだった。これまでは、ユーザーはAI機能を何度でも使えていたため、会社は利用状況を管理し、適切な制限を設ける必要があったのだ。
彼はこの機能を実装するために、まずデータベースに工夫を凝らした。彼のチームが使っていたのはFirebaseという、クラウド上で利用できるデータベースサービスだ。彼はこの中に「トークンコレクション」と呼ばれる新しい情報を保存する場所を作った。このコレクションには、各ユーザーを識別するための「userId」(ユーザーID)、ユーザーが契約している「プラン」、そしてそのユーザーが現在持っている「クレジット(トークン)」の数が記録されるように設計した。
さらに、彼は「カスタムフック」と呼ばれる仕組みを作り上げた。これはプログラムの中で特定の処理をまとめて、必要な場所で簡単に呼び出せるようにする技術だ。このカスタムフックの役割は二つあった。一つは、ユーザーがAI機能を使おうとしたときに、そのユーザーがクレジットを持っているかを確認すること。もう一つは、AI機能の利用が成功したら、持っているクレジットの数から一つ減らす処理を行うことだった。
具体的な実装としては、AIサービスを呼び出すプログラムのどこかで、このカスタムフックを使ってユーザーのクレジットをチェックするようにした。そして、そのAIサービスを呼び出す際には、ユーザーの識別情報であるuserIdを、ユーザーが操作する画面側(フロントエンド)から、サーバー側で処理を行う部分(バックエンド)へと渡すようにした。バックエンドでは、このuserIdを使ってデータベースからユーザーの情報を取得し、本当に存在するユーザーなのか、そしてクレジットが残っているのかを確認する仕組みを作り上げた。
彼はこれらの変更を終え、開発中のコードを管理するシステムに提出した。彼の変更は承認され、既存のコードに統合された。最初はすべてがうまくいっているように見えた。しかし、ここから予期せぬ問題が発生する。
それは深夜1時過ぎのことだった。彼は寝ようとしていた時に、何件かのメッセージを受け取った。その内容は、サービスが利用できない状態になっている、つまり「プロダクション環境がダウンした」というものだった。プロダクション環境とは、実際にユーザーが日常的に利用している本番のサービスが動いている場所のことだ。
なぜこのような事態が起こったのか。彼は、彼が変更したプログラムを、コードを管理するシステムに統合する際に、バックエンドのリポジトリ(コードの保管場所)には、開発用の環境と本番用の環境を明確に分けるための「ステージングブランチ」が用意されていなかったことを知らなかったのだ。通常、システム開発では、開発途中のコードは「開発環境」や「ステージング環境」と呼ばれる場所で十分にテストされ、問題がないことが確認されてから、初めて「プロダクション環境」に反映される。しかし、彼のチームのバックエンドは、開発用のコードも本番用のコードも同じ場所で管理されていたため、開発中の変更がそのまま本番環境に影響を与えてしまう状態だったのだ。
問題の核心はこうだ。彼は、フロントエンドの変更を本番環境に反映する前に、バックエンドの変更を本番環境にプッシュしてしまった。彼のバックエンドの変更は、フロントエンドからuserIdが渡されることを期待していた。しかし、本番環境で動いていたフロントエンドは、まだ古いバージョンのままで、userIdをバックエンドに渡すような変更は含まれていなかった。
結果として、バックエンドは、フロントエンドからの要求を受け取ったときにuserIdが見つからないため、ユーザーの認証やクレジットの確認ができず、「ユーザーが存在しない」と判断してしまった。この状態が続いてしまい、サービス全体が機能しなくなり、本番環境がダウンしてしまったのだ。
この緊急事態を受けて、彼らはすぐにバックエンドの変更を元の状態に戻した。これを「リバート」と呼ぶ。これにより、サービスは再びオンラインに戻り、ユーザーが利用できるようになった。その後、彼らは新しいフロントエンドとバックエンドのコードを両方とも反映させた「ステージング環境」を改めて用意し、そこで徹底的なテストを行った。ステージング環境とは、本番環境とほぼ同じ構成を持つテスト用の環境で、本番への影響を最小限に抑えながら最終確認を行うために使われる。十分なテストを経て、ようやくクレジットシステムは本番環境に正常に導入された。
この経験から、彼らは二度と同じ失敗を繰り返さないために、バックエンドにも「ステージングブランチ」を別途作成することを決めた。これは、安定した本番コードとは別に、開発中のコードを管理するための独立した作業線を用意するということだ。
この一連の出来事は、彼にとって非常に大きな学びの機会となった。彼は「常に尋ねる、決して推測しない(Always Ask, Never Assume)」という教訓を強く胸に刻んだ。変更をプッシュする前に、チームの環境構成について一度確認するべきだったと痛感したのだ。
そして、記事の最後には、さらに別の小さな失敗談が付け加えられている。クレジットシステムが導入された後も、彼は既存のユーザーに対して、新しいクレジットシステムのデータベース情報(トークンドキュメント)を作成し忘れたために、またもやプロダクション環境をダウンさせてしまったという。これは、新しいシステムを導入する際には、既存のデータとの整合性を保つための「データ移行」作業も非常に重要であることを示している。
これらの経験は、システムエンジニアを目指す初心者にとって、開発プロセスにおける環境管理の重要性、フロントエンドとバックエンドの連携、データベースの役割、そして何よりも「コミュニケーション」と「確認」がいかに大切かを教えてくれる貴重な事例と言えるだろう。