AIを使えばアプリが爆速で作れる時代になった。バイブコーディングと呼ばれるスタイルで、雰囲気でコードを書き、動いたらリリースする。作るコストが劇的に下がったのは本当のことだ。ただ、作るコストと動かし続けるコストは別物だ。

後者の話をする人が少ない。「作れた」「リリースした」「動いた」で話が終わる。その先に何が待っているか——脆弱性対応、パッケージの陳腐化、プラットフォームの仕様変更、ユーザーからのバグ報告——は、作るよりずっと地味で、楽しくなく、誰にも褒められない仕事だ。それを最初から理解していないと、リリース後に詰まる。

列挙

運用コストの正体。

動かし続けるために向き合わなければならないものを並べると、こうなる。

// 主な運用コスト
脆弱性
セキュリティ脆弱性の対応。使用しているライブラリやフレームワークに脆弱性が発見されたとき、対応が必要になる。放置すればそこが攻撃の入口になる。自分では気づかない間に進行する。
パッケージ
ライブラリ・パッケージの更新。Flutterなら pub.dev、Node.js なら npm。依存するパッケージは常に更新され続ける。更新しないと古いAPIが使えなくなり、セキュリティ対応もできなくなる。溜まれば溜まるほど更新の難易度が上がる。
追従
OSとプラットフォームの仕様変更への追従。iOS・Androidのメジャーアップデートのたびに、動作確認と修正が必要になる。Apple は定期的に古いSDK対応アプリをストアから削除する。追従しなければ、いつの間にかアプリが消える。
バグ対応
バグ・クラッシュへの対応。リリース後に発覚する不具合。ユーザー環境の多様性から来るもの、エッジケース、想定外の操作——テストでは再現しなかったものが本番で出る。
外部依存
外部APIやサービスの変更対応。Firebase、Google Maps、認証サービス、決済API——これらが仕様変更・廃止・値上げをしたとき、こちらも変えなければならない。自分でコントロールできない部分だ。
法的
法的要件の更新。プライバシーポリシー、利用規約、各国の個人情報保護法への対応。放置すると審査で落とされるか、最悪ストアから削除される。
インフラ
証明書・ドメイン・契約の更新。SSL証明書の期限、ドメインの年次更新、クラウドサービスの課金設定。忘れたときに気づくのは、だいたい深夜か週末だ。

対応方針

何から、どう手をつけるか。

全部を同じ優先度で扱うと、何もできなくなる。優先度の基準は「対応しなかったときのリスクの大きさ」だ。

セキュリティ脆弱性は即対応が原則だ。CVE(脆弱性情報データベース)や使用しているライブラリのリポジトリをウォッチしておき、criticalやhigh評価のものはパッチが出たらできるだけ早く当てる。対応が遅れた時間は、そのままリスクが続く時間だ。

パッケージ更新は「溜めないこと」が一番の対策になる。大量に溜めてから一気に更新しようとすると、破壊的変更が重なって手に負えなくなる。マイナーバージョンは月次、メジャーバージョンは半期に一度くらいのペースで向き合う習慣をつけると、毎回の更新コストが小さく済む。

プラットフォーム追従はOSのリリーススケジュールに合わせて計画する。iOSは毎年9月前後にメジャーアップデートが来る。その1〜2ヶ月前から動作確認を始め、対応が必要なら修正してリリースする。バグ対応はSeverity(重大度)で仕分けして、クラッシュや動作不全から先に片付ける。UX改善やコンテンツ修正は後回しにしてもいい。

スパン

どのくらいの頻度で向き合うか。

スパン やること
日次 クラッシュレポート確認(Firebase Crashlyticsなど)。異常な課金・アクセスがないかチェック。
週次 ユーザーフィードバック、ストアレビューの確認。バグ報告があれば優先度をつける。
月次 パッケージのマイナーアップデート。脆弱性情報の確認。証明書・ドメインの期限確認。
半年〜年次 パッケージのメジャーアップデート。OS追従対応。法的要件の見直し。外部サービスの契約確認。
随時 重大な脆弱性情報が出たとき。外部APIの仕様変更通知が来たとき。クラッシュ率が急上昇したとき。

個人開発でこれを全部やるのは、かなり重い。だから最低限として「クラッシュは毎日見る、パッケージは月に一度確認する、OS追従は年次で計画する」の3つだけでもやっておくと、致命的な状態を避けられる確率が上がる。

放置のリスク

対応しないと、何が起きるか。

一番わかりやすいのはストアからの削除だ。Appleは定期的に、古いSDKバージョンに対応していないアプリに警告を送り、更新がなければ削除する。通知は来るが、見落としたまま放置すると数ヶ月後にアプリが消える。ユーザーがいれば当然クレームになる。

セキュリティ脆弱性を放置した場合は、悪意ある第三者に攻撃される可能性がある。Firebaseのセキュリティルールが甘ければ大量リクエストで課金が爆発する。認証の穴があればデータが抜かれる。気づいたときには損害が出ている、というのがこのリスクの厄介な点だ。予防コストより事後対応コストの方が、桁違いに高い。

パッケージを長期間更新しないと、「更新したいのに更新できない」状態になる。依存パッケージ間の互換性が崩れ、一つ更新すると別が壊れる。その状態で新機能を追加しようとしても、土台が腐っているから乗せられない。技術的負債は利子がつく。後回しにすればするほど、返済コストが上がっていく。

評価されない現実

正常に動いていても、誰も気づかない。

運用保守の最も残酷な特性は、うまくやっても誰にも見えないことだ。脆弱性を塞いでも「ありがとうございます、セキュリティを維持してくれて」とは誰も言わない。パッケージを最新に保っていても、ユーザーには何も変わって見えない。iOS新バージョンに対応して動作を維持しても、それは「当たり前」として処理される。

一方で、何かが壊れたときは即座に見える。「動かなくなった」「クラッシュする」「データが消えた」——問題が表面化した瞬間に批判が来る。何百時間もかけて維持してきた実績より、一回の障害の方が印象に残る。これはインフラエンジニアが長年感じてきた非対称性と全く同じ構造だ。

バイブコーディングで作った側には、この現実が届きにくい。作るのは楽しい。でも運用は楽しくない。「楽しくないのに続けなければならない」という時間が、アプリの寿命の大半を占める。その覚悟がないままリリースすると、問題が出た段階で詰まる。

出口戦略

畳み方か、保守不要の構成か。

運用コストに向き合えないなら、向き合わなくて済む構成を最初から選ぶか、畳み方を決めておくかのどちらかだ。

保守が少ない構成を選ぶという方向は現実的だ。外部依存が少ないほど更新の必要がなくなる。静的サイトならサーバー管理がほぼ不要だし、ライブラリを最小限にすれば更新対象も減る。Firebaseを使うならルールだけ正しく書いてあれば、コア機能は長期間維持できる。「シンプルに作る」は設計の美学だけでなく、運用コストの削減でもある。

畳み方を決めておくことも、作る前から考えておくべきことだ。いつ、どういう条件になったら終了するか。ユーザーへの告知をどうするか。データはどう扱うか。運用できなくなったときに「突然消える」だけでは、使っていたユーザーへの責任を果たせない。サービス終了はプロジェクトの一部だ。

もう一つの選択肢はOSSとして公開することだ。自分で保守できなくなっても、コードを公開して誰かに引き継げる形にしておく。ユーザーがゼロでなければ、誰かが引き取ってくれる可能性がある。

まとめると

バイブコーディングで作るコストは下がった。運用コストは下がっていない。作ることへの熱量と、動かし続けることへの覚悟は、別物として持っておく必要がある。どちらかが欠けていると、リリース後に静かに行き詰まる。