{"content_id":"sjuxeehxgw","slug":"vibe-coding-project-architecture-and-four-hour-rescue-sprint","locale":"ja","schema_type":"TechArticle","category":"how_to","category_name":"ハウツー","title":"バイブコーディングプロジェクトの構造的問題と4時間復旧スプリント","summary":"バイブコーディングプロジェクトがリリース直前で行き詰まる原因は、プロンプトのスキルよりも、不明確な構造、一貫性のないコード、外部サービス間の境界にある可能性があります。4時間復旧は完成したサービス全体を保証する方法ではなく、範囲を固定し、核心となるフローを再実装して実行可能なベースラインを作る条件付きスプリントとして理解する必要があります。","author":{"name":"Injoys 編集部","url":"https://injoys.com/ko/about"},"key_points":["React、Next.js、Supabase自体が問題なのではなく、責任の境界と実装ルールを定めずに組み合わせると、複雑性が急速に増大する。","AIはリポジトリ全体の設計意図と運用条件を自動的に保持しないため、同じ機能が異なるパターンで実装される可能性がある。","Ruby on Railsは慣例と統合された構成要素によって選択肢を減らすが、決済、セキュリティ検証、運用準備まですべて自動的に解決するわけではない。","4時間復旧は、確定した要件、絞り込まれた核心範囲、準備済みのアカウントとインフラ、熟練した作業者がそろっている場合に可能な、初期再構築または安定化作業である。","既存コードの修正を続けるか作り直すかは、コードの状態だけでなく、データ移行、外部連携、テスト、チームの能力、リリースリスクを併せて比較した上で判断しなければならない。"],"content_markdown":"バイブコーディングとは、自然言語による指示とAIコーディングツールを活用し、アプリケーションを素早く実装する作業方法を意味する。初期段階では画面や機能が急速に増えていくが、リリースが近づくと、認証・データ・決済・デプロイのように複数のレイヤーを横断する問題が表面化しやすい。\n\nこの現象を、特定の技術スタックの欠陥やユーザーのプロンプト能力だけで説明してはならない。重要なのは、**誰が構造的一貫性を管理するのか**、**各コンポーネントの責任が明確か**、**完了したかどうかを検証するテストがあるか**である。\n\n## バイブコーディングプロジェクトが後半で行き詰まる理由\n\n### 画面の完成とサービスの完成は異なる\n\n開発初期には、ボタン、入力フォーム、一覧のように目に見える成果物が素早く作られる。しかし、実際のサービスには次のような目に見えない条件が必要になる。\n\n- ユーザーが自分のデータだけにアクセスできるようにする権限チェック\n- 重複リクエストやネットワーク再試行に耐えるデータ処理\n- 決済の成功、失敗、キャンセル、返金とWebhook検証\n- 入力値の検証とエラー復旧\n- データベースの変更および既存データの移行\n- 秘密鍵の管理、ログ、モニタリング、バックアップと復元\n- デプロイ後も主要機能が維持される自動テスト\n\n画面が動作するという事実だけで、これらの条件が満たされるわけではない。後半で見つかる欠陥は突然生じたものではなく、初期実装で確認されないまま蓄積していた場合が多い。\n\n### AIはリポジトリ全体の設計意図を常に維持できるとは限らない\n\nAIコーディングツールは、与えられたファイル、会話の文脈、検索されたコードと指示に従って変更案を生成する。プロジェクトのルールが文書化されていなければ、次のような不整合が生じる可能性がある。\n\n- 同じデータ取得をサーバーコンポーネント、APIルート、ブラウザーコードでそれぞれ異なる方法で実装\n- 認証状態をCookie、クライアント状態、外部SDKで重複管理\n- 同じ検証ルールを画面とサーバーに異なる形で記述\n- エラーを根本的に解決せず、例外処理や条件文だけを追加\n- 既存の抽象化を見つけられず、類似した関数とデータモデルを繰り返し生成\n\nこの状態で新しいエラーを修正すると、あるレイヤーの変更が別のレイヤーの前提を崩す可能性がある。ユーザーにはAIが同じところを堂々巡りしているように見えるが、実際にはAIが従うべき単一の構造と検証基準が存在しない状況かもしれない。\n\n## React・Next.js・Supabaseの組み合わせを正確に理解する\n\nReact、Next.js、Supabaseを、単に問題のある組み合わせ型スタックと規定するのは正確ではない。それぞれの技術には、広く利用されている独立した役割と利点がある。\n\n| 技術 | 基本的な役割 | プロジェクトで決定すべき事項 |\n|---|---|---|\n| React | ユーザーインターフェースを構成するライブラリ | 状態管理、データリクエスト、コンポーネント境界 |\n| Next.js | ReactベースのフルスタックWebフレームワーク | レンダリング方式、サーバー・クライアント境界、キャッシュとAPI構成 |\n| Supabase | PostgreSQL、認証、ストレージなどを提供するバックエンドプラットフォーム | アクセスポリシー、データモデル、セッション処理、サービス権限 |\n| Ruby on Rails | サーバー中心の統合型Webアプリケーションフレームワーク | Railsの規約に沿ったモデル、コントローラー、ジョブ、メールおよびデプロイ構成 |\n\nNext.jsは画面だけを担当するツールではなく、サーバー機能も提供する。Supabaseも単なるデータベースではなく、認証やストレージなどを含めることができる。問題は複数の機能を利用する際に、**権限とビジネスルールの最終的な責任がどこにあるのか**を決めていないことから生じる。\n\nたとえば、注文作成ルールがブラウザーコード、Next.jsのサーバールート、Supabaseのデータベースポリシーに分散していれば、エラーの追跡は難しい。反対に、書き込み処理はサーバーのサービスレイヤーを通し、データベースポリシーは最後の防衛線として使用するというルールを定めれば、同じスタックでも安定して運用できる。\n\n## Ruby on Railsが代替案になり得る理由\n\n### 設定より規約で選択肢を減らす\n\nRuby on Railsの代表的な原則である設定より規約は、繰り返し下さなければならない構造上の決定を、フレームワークの基本ルールによって統一する。モデル、コントローラー、データベース変更、ジョブ、メール、テストの配置と接続方法が比較的予測しやすい。\n\nAIコーディングでは、この予測可能性が特に有用である。明確な規約に従えば、AIが新機能をまったく異なるパターンで追加する可能性を抑えられ、人間による変更内容のレビューも容易になる。\n\n### Webサービスの共通機能を一つの体系で扱う\n\nRailsは、データベースアクセス、ルーティング、サーバーレンダリング、非同期ジョブ、メール、リアルタイム通信、テストとデプロイのための公式コンポーネントおよび手段を提供する。これにより、別々のツール間の接続部分を減らすことができる。\n\nただし、次のような限界も明確に存在する。\n\n- 決済処理には、Stripeのような外部決済事業者が引き続き必要である。\n- 管理画面がすべての要件に合うよう自動的に完成するわけではない。\n- 認証機能を生成したりライブラリで構成したりしても、権限設計とセキュリティレビューは別途必要である。\n- 複雑なリアルタイムインターフェースや独立したモバイルAPIには、追加設計が必要である。\n- Railsの経験がないチームであれば、学習と採用のコストが発生する。\n\nしたがってRailsは、AIにすべての問題を解決させるツールではなく、**AIと人間が従うべき基本ルートを絞り込む選択肢**である。\n\n## 4時間で何を解決できるのか\n\nログイン、決済、管理機能、データ移行、セキュリティレビューと本番デプロイを含む任意のサービスを、4時間以内に完成できるという普遍的な根拠はない。現実的な4時間の目標は次のとおりである。\n\n- 現在の構造と障害箇所を把握する。\n- 保守と再実装のどちらかを選択する。\n- 最も重要なユーザーフローを一つ動作させる。\n- テスト可能な新しいベースラインを作る。\n- 可能であればステージング環境にデプロイする。\n- 残ったリスクと後続作業を一覧として残す。\n\n### 4時間で再実装できる条件\n\n次の条件を多く満たすほど、短時間での再実装が可能になる。\n\n1. 必要な画面とユーザーフローがすでに確定している。\n2. 主要なデータ項目と関係が整理されている。\n3. デザインを新たに議論せず、既存画面を参考にできる。\n4. リポジトリ、ドメイン、デプロイ環境、外部サービスのアカウントにすぐアクセスできる。\n5. 既存データの移行を省略するか、小さなサンプルだけを移せばよい。\n6. 決済は、サンドボックスの基本的な成功フローのように狭い範囲に限定する。\n7. Railsとデプロイ環境を理解する担当者がAIの出力をレビューする。\n\n数か月にわたって進めてきた既存プロジェクトが役立つ理由もここにある。その期間にユーザーフロー、必須フィールド、失敗事例と優先順位が具体化されていれば、調査にかかる時間を短縮できる。ただし、企画が自動的に完璧になったという意味ではなく、既存プロジェクトで検証済みの要件だけを再利用すべきである。\n\n## 実践的な4時間復旧スプリント\n\n| 時間 | 作業 | 最小成果物 |\n|---|---|---|\n| 0:00~0:30 | リポジトリと運用状態の保全、技術スタックの調査 | バックアップ、コンポーネント一覧、秘密情報の漏えい確認 |\n| 0:30~1:00 | 主要フローとデータモデルの確定、修理・再実装の決定 | 一文で示した範囲、完了条件、リスク一覧 |\n| 1:00~2:00 | Railsのベースラインまたは既存プロジェクトの構造的修正 | 実行可能なアプリ、データモデル、認証の骨格 |\n| 2:00~3:15 | 主要ユーザーフローの垂直実装 | 画面からデータ保存までつながった一つのフローとテスト |\n| 3:15~3:45 | 外部連携の最小構成とステージングへのデプロイ | サンドボックス連携、デプロイURL、環境変数の構成 |\n| 3:45~4:00 | スモークテストと引き継ぎ | 成功・失敗結果、未完了項目、次の作業順序 |\n\n### ステップ1：原本を保全する\n\n修正前にリポジトリの別ブランチまたはコピーを作成し、データベースをバックアップする。AIとの会話にAPIキー、データベースのパスワード、個人識別情報を貼り付けない。すでに漏えいさせた場合は、該当する秘密情報を失効させ、新たに発行するのが安全である。\n\n### ステップ2：根拠とともに技術スタックを調査する\n\nAIに単に技術スタックを推測させるのではなく、次の資料を確認するよう要求する。\n\n- パッケージとバージョンが記録されたマニフェストおよびロックファイル\n- データベーススキーマとマイグレーション\n- 認証とセッションを処理するファイル\n- APIルートとサーバー関数\n- デプロイ設定、環境変数名、外部サービスのSDK\n- 自動テストと継続的インテグレーションの設定\n\n利用できる依頼例は次のとおりである。\n\n\u003e リポジトリを読み、フロントエンド、サーバー、データベース、認証、ストレージ、決済、デプロイ、テストツールを表にまとめよ。各判断の根拠となるファイルパスを記載し、ビジネスルールが重複している箇所と、サーバー・クライアント境界に違反している可能性を示せ。コードはまだ修正せず、秘密の値は出力しないこと。\n\n### ステップ3：主要な垂直フローを一つだけ選ぶ\n\n垂直フローとは、画面からサーバーロジックとデータ保存までつながる、一つの完全な経路である。たとえば次のようなものがある。\n\n- 会員登録 → ログイン → プロフィール表示\n- 商品選択 → 注文作成 → 決済サンドボックス承認\n- 管理者ログイン → 投稿作成 → 公開ページへの表示\n\n一度に複数の画面を作るよりも、主要フロー一つを成功・権限なし・不正な入力という条件で検証する方が、構造上のリスクをより早く明らかにできる。\n\n### ステップ4：完了条件をテストで固定する\n\nAIに機能実装だけを依頼すると、画面上の成功事例だけに合わせたコードが出てくる可能性がある。最低限、次の条件を自動テストまたは反復可能なチェックリストとして固定する。\n\n- 正規ユーザーは作業を完了できる。\n- ログインしていないユーザーは保護されたデータにアクセスできない。\n- 他のユーザーの識別子を入力しても、そのデータにアクセスできない。\n- 不正な入力は保存されず、理解可能なエラーを返す。\n- 同じ決済または書き込みリクエストが繰り返されても重複処理されない。\n\n### ステップ5：ステージングまでに限定してデプロイする\n\n4時間スプリントでのデプロイは、一般的に本番確定ではなく、ステージングでの検証と考えるのが安全である。実際のユーザーと決済を受け入れる前に、セキュリティ、データ移行、バックアップ復元、モニタリングと障害対応を別途確認しなければならない。\n\n## 既存プロジェクトを修正するか作り直すかを決める基準\n\n| 状況 | 既存構造の維持・修理 | Railsなどによる再実装を検討 |\n|---|---|---|\n| 主要機能とテスト | 大部分が動作し、テストがある | 主要フローさえ繰り返し壊れる |\n| データ | 本番データが多く、移行リスクが高い | データがないか、移行範囲が小さい |\n| 構造 | 責任境界とパターンが概ね一貫している | 同じ機能が複数のレイヤーに重複している |\n| フロントエンド要件 | 複雑なインタラクションと既存のReact資産が重要 | サーバー中心のCRUDと業務フローが中心 |\n| チームの能力 | 現在のスタックを運用できる人材がいる | Railsの規約がチームの作業方法により適している |\n| 外部連携 | 多数の安定した連携がすでに運用中 | 連携が初期段階にあるか、置き換え可能 |\n\nファイル数が多い、またはエラーがあるという理由だけで全面的に書き直してはならない。書き直しによって、既存システムで解決済みだった例外的な状況への対応を失い、新しい欠陥を生み出す可能性がある。まずは小さな垂直フローを2つの方式で実装し、開発速度、テスト可能性、コードの理解しやすさ、デプロイリスクを比較するのがよい。\n\n## リリース前に別途確認すべき項目\n\n4時間でベースラインが作られても、次の項目が残る可能性がある。\n\n- 権限モデルとRailsのセキュリティ設定のレビュー\n- 決済Webhookの署名、重複防止、キャンセルと返金の処理\n- 本番データの移行および件数・合計の検証\n- データベースのバックアップと実際の復元テスト\n- エラー追跡、ログの保存、可用性のモニタリング\n- 負荷テストとコスト見積もり\n- 個人情報の取り扱い、利用規約と関連する法的レビュー\n- アクセシビリティ、ブラウザーおよびモバイル環境の確認\n- 障害発生時のロールバック手順と担当者の指定\n\n## 結論\n\nバイブコーディングプロジェクトが後半で停滞する理由は、AIのコーディング能力だけでは説明できない。自由度の高い構成で、ルール、責任境界、テスト、運用基準を定めなければ、AIが作った局所的な解決策は互いに衝突しやすい。\n\nRuby on Railsは、規約と統合された構造を通じて、この自由度を減らす実用的な代替案になり得る。しかし、すべてのプロジェクトをRailsで作り直すことが正解ではない。まず現在のスタックを根拠に基づいて調査し、主要フローを定めたうえで、4時間を**完成品の制作時間ではなく、構造を検証し、復旧可能なベースラインを作る時間**として使うべきである。","content_html":"\u003cp\u003eバイブコーディングとは、自然言語による指示とAIコーディングツールを活用し、アプリケーションを素早く実装する作業方法を意味する。初期段階では画面や機能が急速に増えていくが、リリースが近づくと、認証・データ・決済・デプロイのように複数のレイヤーを横断する問題が表面化しやすい。\u003c/p\u003e\n\u003cp\u003eこの現象を、特定の技術スタックの欠陥やユーザーのプロンプト能力だけで説明してはならない。重要なのは、\u003cstrong\u003e誰が構造的一貫性を管理するのか\u003c/strong\u003e、\u003cstrong\u003e各コンポーネントの責任が明確か\u003c/strong\u003e、\u003cstrong\u003e完了したかどうかを検証するテストがあるか\u003c/strong\u003eである。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#%E3%83%90%E3%82%A4%E3%83%96%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8C%E5%BE%8C%E5%8D%8A%E3%81%A7%E8%A1%8C%E3%81%8D%E8%A9%B0%E3%81%BE%E3%82%8B%E7%90%86%E7%94%B1\" class=\"anchor\" id=\"バイブコーディングプロジェクトが後半で行き詰まる理由\"\u003e\u003c/a\u003eバイブコーディングプロジェクトが後半で行き詰まる理由\u003c/h2\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E7%94%BB%E9%9D%A2%E3%81%AE%E5%AE%8C%E6%88%90%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%AE%8C%E6%88%90%E3%81%AF%E7%95%B0%E3%81%AA%E3%82%8B\" class=\"anchor\" id=\"画面の完成とサービスの完成は異なる\"\u003e\u003c/a\u003e画面の完成とサービスの完成は異なる\u003c/h3\u003e\n\u003cp\u003e開発初期には、ボタン、入力フォーム、一覧のように目に見える成果物が素早く作られる。しかし、実際のサービスには次のような目に見えない条件が必要になる。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eユーザーが自分のデータだけにアクセスできるようにする権限チェック\u003c/li\u003e\n\u003cli\u003e重複リクエストやネットワーク再試行に耐えるデータ処理\u003c/li\u003e\n\u003cli\u003e決済の成功、失敗、キャンセル、返金とWebhook検証\u003c/li\u003e\n\u003cli\u003e入力値の検証とエラー復旧\u003c/li\u003e\n\u003cli\u003eデータベースの変更および既存データの移行\u003c/li\u003e\n\u003cli\u003e秘密鍵の管理、ログ、モニタリング、バックアップと復元\u003c/li\u003e\n\u003cli\u003eデプロイ後も主要機能が維持される自動テスト\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e画面が動作するという事実だけで、これらの条件が満たされるわけではない。後半で見つかる欠陥は突然生じたものではなく、初期実装で確認されないまま蓄積していた場合が多い。\u003c/p\u003e\n\u003ch3\u003e\n\u003ca href=\"#ai%E3%81%AF%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%85%A8%E4%BD%93%E3%81%AE%E8%A8%AD%E8%A8%88%E6%84%8F%E5%9B%B3%E3%82%92%E5%B8%B8%E3%81%AB%E7%B6%AD%E6%8C%81%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A8%E3%81%AF%E9%99%90%E3%82%89%E3%81%AA%E3%81%84\" class=\"anchor\" id=\"aiはリポジトリ全体の設計意図を常に維持できるとは限らない\"\u003e\u003c/a\u003eAIはリポジトリ全体の設計意図を常に維持できるとは限らない\u003c/h3\u003e\n\u003cp\u003eAIコーディングツールは、与えられたファイル、会話の文脈、検索されたコードと指示に従って変更案を生成する。プロジェクトのルールが文書化されていなければ、次のような不整合が生じる可能性がある。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e同じデータ取得をサーバーコンポーネント、APIルート、ブラウザーコードでそれぞれ異なる方法で実装\u003c/li\u003e\n\u003cli\u003e認証状態をCookie、クライアント状態、外部SDKで重複管理\u003c/li\u003e\n\u003cli\u003e同じ検証ルールを画面とサーバーに異なる形で記述\u003c/li\u003e\n\u003cli\u003eエラーを根本的に解決せず、例外処理や条件文だけを追加\u003c/li\u003e\n\u003cli\u003e既存の抽象化を見つけられず、類似した関数とデータモデルを繰り返し生成\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eこの状態で新しいエラーを修正すると、あるレイヤーの変更が別のレイヤーの前提を崩す可能性がある。ユーザーにはAIが同じところを堂々巡りしているように見えるが、実際にはAIが従うべき単一の構造と検証基準が存在しない状況かもしれない。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#reactnextjssupabase%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%82%92%E6%AD%A3%E7%A2%BA%E3%81%AB%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B\" class=\"anchor\" id=\"reactnextjssupabaseの組み合わせを正確に理解する\"\u003e\u003c/a\u003eReact・Next.js・Supabaseの組み合わせを正確に理解する\u003c/h2\u003e\n\u003cp\u003eReact、Next.js、Supabaseを、単に問題のある組み合わせ型スタックと規定するのは正確ではない。それぞれの技術には、広く利用されている独立した役割と利点がある。\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e技術\u003c/th\u003e\n\u003cth\u003e基本的な役割\u003c/th\u003e\n\u003cth\u003eプロジェクトで決定すべき事項\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"技術\"\u003eReact\u003c/td\u003e\n\u003ctd data-label=\"基本的な役割\"\u003eユーザーインターフェースを構成するライブラリ\u003c/td\u003e\n\u003ctd data-label=\"プロジェクトで決定すべき事項\"\u003e状態管理、データリクエスト、コンポーネント境界\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"技術\"\u003eNext.js\u003c/td\u003e\n\u003ctd data-label=\"基本的な役割\"\u003eReactベースのフルスタックWebフレームワーク\u003c/td\u003e\n\u003ctd data-label=\"プロジェクトで決定すべき事項\"\u003eレンダリング方式、サーバー・クライアント境界、キャッシュとAPI構成\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"技術\"\u003eSupabase\u003c/td\u003e\n\u003ctd data-label=\"基本的な役割\"\u003ePostgreSQL、認証、ストレージなどを提供するバックエンドプラットフォーム\u003c/td\u003e\n\u003ctd data-label=\"プロジェクトで決定すべき事項\"\u003eアクセスポリシー、データモデル、セッション処理、サービス権限\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"技術\"\u003eRuby on Rails\u003c/td\u003e\n\u003ctd data-label=\"基本的な役割\"\u003eサーバー中心の統合型Webアプリケーションフレームワーク\u003c/td\u003e\n\u003ctd data-label=\"プロジェクトで決定すべき事項\"\u003eRailsの規約に沿ったモデル、コントローラー、ジョブ、メールおよびデプロイ構成\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eNext.jsは画面だけを担当するツールではなく、サーバー機能も提供する。Supabaseも単なるデータベースではなく、認証やストレージなどを含めることができる。問題は複数の機能を利用する際に、\u003cstrong\u003e権限とビジネスルールの最終的な責任がどこにあるのか\u003c/strong\u003eを決めていないことから生じる。\u003c/p\u003e\n\u003cp\u003eたとえば、注文作成ルールがブラウザーコード、Next.jsのサーバールート、Supabaseのデータベースポリシーに分散していれば、エラーの追跡は難しい。反対に、書き込み処理はサーバーのサービスレイヤーを通し、データベースポリシーは最後の防衛線として使用するというルールを定めれば、同じスタックでも安定して運用できる。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#ruby-on-rails%E3%81%8C%E4%BB%A3%E6%9B%BF%E6%A1%88%E3%81%AB%E3%81%AA%E3%82%8A%E5%BE%97%E3%82%8B%E7%90%86%E7%94%B1\" class=\"anchor\" id=\"ruby-on-railsが代替案になり得る理由\"\u003e\u003c/a\u003eRuby on Railsが代替案になり得る理由\u003c/h2\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84%E3%81%A7%E9%81%B8%E6%8A%9E%E8%82%A2%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99\" class=\"anchor\" id=\"設定より規約で選択肢を減らす\"\u003e\u003c/a\u003e設定より規約で選択肢を減らす\u003c/h3\u003e\n\u003cp\u003eRuby on Railsの代表的な原則である設定より規約は、繰り返し下さなければならない構造上の決定を、フレームワークの基本ルールによって統一する。モデル、コントローラー、データベース変更、ジョブ、メール、テストの配置と接続方法が比較的予測しやすい。\u003c/p\u003e\n\u003cp\u003eAIコーディングでは、この予測可能性が特に有用である。明確な規約に従えば、AIが新機能をまったく異なるパターンで追加する可能性を抑えられ、人間による変更内容のレビューも容易になる。\u003c/p\u003e\n\u003ch3\u003e\n\u003ca href=\"#web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%85%B1%E9%80%9A%E6%A9%9F%E8%83%BD%E3%82%92%E4%B8%80%E3%81%A4%E3%81%AE%E4%BD%93%E7%B3%BB%E3%81%A7%E6%89%B1%E3%81%86\" class=\"anchor\" id=\"webサービスの共通機能を一つの体系で扱う\"\u003e\u003c/a\u003eWebサービスの共通機能を一つの体系で扱う\u003c/h3\u003e\n\u003cp\u003eRailsは、データベースアクセス、ルーティング、サーバーレンダリング、非同期ジョブ、メール、リアルタイム通信、テストとデプロイのための公式コンポーネントおよび手段を提供する。これにより、別々のツール間の接続部分を減らすことができる。\u003c/p\u003e\n\u003cp\u003eただし、次のような限界も明確に存在する。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e決済処理には、Stripeのような外部決済事業者が引き続き必要である。\u003c/li\u003e\n\u003cli\u003e管理画面がすべての要件に合うよう自動的に完成するわけではない。\u003c/li\u003e\n\u003cli\u003e認証機能を生成したりライブラリで構成したりしても、権限設計とセキュリティレビューは別途必要である。\u003c/li\u003e\n\u003cli\u003e複雑なリアルタイムインターフェースや独立したモバイルAPIには、追加設計が必要である。\u003c/li\u003e\n\u003cli\u003eRailsの経験がないチームであれば、学習と採用のコストが発生する。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eしたがってRailsは、AIにすべての問題を解決させるツールではなく、\u003cstrong\u003eAIと人間が従うべき基本ルートを絞り込む選択肢\u003c/strong\u003eである。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#4%E6%99%82%E9%96%93%E3%81%A7%E4%BD%95%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%8B\" class=\"anchor\" id=\"4時間で何を解決できるのか\"\u003e\u003c/a\u003e4時間で何を解決できるのか\u003c/h2\u003e\n\u003cp\u003eログイン、決済、管理機能、データ移行、セキュリティレビューと本番デプロイを含む任意のサービスを、4時間以内に完成できるという普遍的な根拠はない。現実的な4時間の目標は次のとおりである。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e現在の構造と障害箇所を把握する。\u003c/li\u003e\n\u003cli\u003e保守と再実装のどちらかを選択する。\u003c/li\u003e\n\u003cli\u003e最も重要なユーザーフローを一つ動作させる。\u003c/li\u003e\n\u003cli\u003eテスト可能な新しいベースラインを作る。\u003c/li\u003e\n\u003cli\u003e可能であればステージング環境にデプロイする。\u003c/li\u003e\n\u003cli\u003e残ったリスクと後続作業を一覧として残す。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e\n\u003ca href=\"#4%E6%99%82%E9%96%93%E3%81%A7%E5%86%8D%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%8D%E3%82%8B%E6%9D%A1%E4%BB%B6\" class=\"anchor\" id=\"4時間で再実装できる条件\"\u003e\u003c/a\u003e4時間で再実装できる条件\u003c/h3\u003e\n\u003cp\u003e次の条件を多く満たすほど、短時間での再実装が可能になる。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e必要な画面とユーザーフローがすでに確定している。\u003c/li\u003e\n\u003cli\u003e主要なデータ項目と関係が整理されている。\u003c/li\u003e\n\u003cli\u003eデザインを新たに議論せず、既存画面を参考にできる。\u003c/li\u003e\n\u003cli\u003eリポジトリ、ドメイン、デプロイ環境、外部サービスのアカウントにすぐアクセスできる。\u003c/li\u003e\n\u003cli\u003e既存データの移行を省略するか、小さなサンプルだけを移せばよい。\u003c/li\u003e\n\u003cli\u003e決済は、サンドボックスの基本的な成功フローのように狭い範囲に限定する。\u003c/li\u003e\n\u003cli\u003eRailsとデプロイ環境を理解する担当者がAIの出力をレビューする。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e数か月にわたって進めてきた既存プロジェクトが役立つ理由もここにある。その期間にユーザーフロー、必須フィールド、失敗事例と優先順位が具体化されていれば、調査にかかる時間を短縮できる。ただし、企画が自動的に完璧になったという意味ではなく、既存プロジェクトで検証済みの要件だけを再利用すべきである。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA4%E6%99%82%E9%96%93%E5%BE%A9%E6%97%A7%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88\" class=\"anchor\" id=\"実践的な4時間復旧スプリント\"\u003e\u003c/a\u003e実践的な4時間復旧スプリント\u003c/h2\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e時間\u003c/th\u003e\n\u003cth\u003e作業\u003c/th\u003e\n\u003cth\u003e最小成果物\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"時間\"\u003e0:00~0:30\u003c/td\u003e\n\u003ctd data-label=\"作業\"\u003eリポジトリと運用状態の保全、技術スタックの調査\u003c/td\u003e\n\u003ctd data-label=\"最小成果物\"\u003eバックアップ、コンポーネント一覧、秘密情報の漏えい確認\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"時間\"\u003e0:30~1:00\u003c/td\u003e\n\u003ctd data-label=\"作業\"\u003e主要フローとデータモデルの確定、修理・再実装の決定\u003c/td\u003e\n\u003ctd data-label=\"最小成果物\"\u003e一文で示した範囲、完了条件、リスク一覧\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"時間\"\u003e1:00~2:00\u003c/td\u003e\n\u003ctd data-label=\"作業\"\u003eRailsのベースラインまたは既存プロジェクトの構造的修正\u003c/td\u003e\n\u003ctd data-label=\"最小成果物\"\u003e実行可能なアプリ、データモデル、認証の骨格\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"時間\"\u003e2:00~3:15\u003c/td\u003e\n\u003ctd data-label=\"作業\"\u003e主要ユーザーフローの垂直実装\u003c/td\u003e\n\u003ctd data-label=\"最小成果物\"\u003e画面からデータ保存までつながった一つのフローとテスト\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"時間\"\u003e3:15~3:45\u003c/td\u003e\n\u003ctd data-label=\"作業\"\u003e外部連携の最小構成とステージングへのデプロイ\u003c/td\u003e\n\u003ctd data-label=\"最小成果物\"\u003eサンドボックス連携、デプロイURL、環境変数の構成\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"時間\"\u003e3:45~4:00\u003c/td\u003e\n\u003ctd data-label=\"作業\"\u003eスモークテストと引き継ぎ\u003c/td\u003e\n\u003ctd data-label=\"最小成果物\"\u003e成功・失敗結果、未完了項目、次の作業順序\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971%E5%8E%9F%E6%9C%AC%E3%82%92%E4%BF%9D%E5%85%A8%E3%81%99%E3%82%8B\" class=\"anchor\" id=\"ステップ1原本を保全する\"\u003e\u003c/a\u003eステップ1：原本を保全する\u003c/h3\u003e\n\u003cp\u003e修正前にリポジトリの別ブランチまたはコピーを作成し、データベースをバックアップする。AIとの会話にAPIキー、データベースのパスワード、個人識別情報を貼り付けない。すでに漏えいさせた場合は、該当する秘密情報を失効させ、新たに発行するのが安全である。\u003c/p\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972%E6%A0%B9%E6%8B%A0%E3%81%A8%E3%81%A8%E3%82%82%E3%81%AB%E6%8A%80%E8%A1%93%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%99%E3%82%8B\" class=\"anchor\" id=\"ステップ2根拠とともに技術スタックを調査する\"\u003e\u003c/a\u003eステップ2：根拠とともに技術スタックを調査する\u003c/h3\u003e\n\u003cp\u003eAIに単に技術スタックを推測させるのではなく、次の資料を確認するよう要求する。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eパッケージとバージョンが記録されたマニフェストおよびロックファイル\u003c/li\u003e\n\u003cli\u003eデータベーススキーマとマイグレーション\u003c/li\u003e\n\u003cli\u003e認証とセッションを処理するファイル\u003c/li\u003e\n\u003cli\u003eAPIルートとサーバー関数\u003c/li\u003e\n\u003cli\u003eデプロイ設定、環境変数名、外部サービスのSDK\u003c/li\u003e\n\u003cli\u003e自動テストと継続的インテグレーションの設定\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e利用できる依頼例は次のとおりである。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eリポジトリを読み、フロントエンド、サーバー、データベース、認証、ストレージ、決済、デプロイ、テストツールを表にまとめよ。各判断の根拠となるファイルパスを記載し、ビジネスルールが重複している箇所と、サーバー・クライアント境界に違反している可能性を示せ。コードはまだ修正せず、秘密の値は出力しないこと。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973%E4%B8%BB%E8%A6%81%E3%81%AA%E5%9E%82%E7%9B%B4%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%B8%80%E3%81%A4%E3%81%A0%E3%81%91%E9%81%B8%E3%81%B6\" class=\"anchor\" id=\"ステップ3主要な垂直フローを一つだけ選ぶ\"\u003e\u003c/a\u003eステップ3：主要な垂直フローを一つだけ選ぶ\u003c/h3\u003e\n\u003cp\u003e垂直フローとは、画面からサーバーロジックとデータ保存までつながる、一つの完全な経路である。たとえば次のようなものがある。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e会員登録 → ログイン → プロフィール表示\u003c/li\u003e\n\u003cli\u003e商品選択 → 注文作成 → 決済サンドボックス承認\u003c/li\u003e\n\u003cli\u003e管理者ログイン → 投稿作成 → 公開ページへの表示\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e一度に複数の画面を作るよりも、主要フロー一つを成功・権限なし・不正な入力という条件で検証する方が、構造上のリスクをより早く明らかにできる。\u003c/p\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974%E5%AE%8C%E4%BA%86%E6%9D%A1%E4%BB%B6%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B\" class=\"anchor\" id=\"ステップ4完了条件をテストで固定する\"\u003e\u003c/a\u003eステップ4：完了条件をテストで固定する\u003c/h3\u003e\n\u003cp\u003eAIに機能実装だけを依頼すると、画面上の成功事例だけに合わせたコードが出てくる可能性がある。最低限、次の条件を自動テストまたは反復可能なチェックリストとして固定する。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e正規ユーザーは作業を完了できる。\u003c/li\u003e\n\u003cli\u003eログインしていないユーザーは保護されたデータにアクセスできない。\u003c/li\u003e\n\u003cli\u003e他のユーザーの識別子を入力しても、そのデータにアクセスできない。\u003c/li\u003e\n\u003cli\u003e不正な入力は保存されず、理解可能なエラーを返す。\u003c/li\u003e\n\u003cli\u003e同じ決済または書き込みリクエストが繰り返されても重複処理されない。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e\n\u003ca href=\"#%E3%82%B9%E3%83%86%E3%83%83%E3%83%975%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%97%E3%81%A6%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B\" class=\"anchor\" id=\"ステップ5ステージングまでに限定してデプロイする\"\u003e\u003c/a\u003eステップ5：ステージングまでに限定してデプロイする\u003c/h3\u003e\n\u003cp\u003e4時間スプリントでのデプロイは、一般的に本番確定ではなく、ステージングでの検証と考えるのが安全である。実際のユーザーと決済を受け入れる前に、セキュリティ、データ移行、バックアップ復元、モニタリングと障害対応を別途確認しなければならない。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#%E6%97%A2%E5%AD%98%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B%E3%81%8B%E4%BD%9C%E3%82%8A%E7%9B%B4%E3%81%99%E3%81%8B%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B%E5%9F%BA%E6%BA%96\" class=\"anchor\" id=\"既存プロジェクトを修正するか作り直すかを決める基準\"\u003e\u003c/a\u003e既存プロジェクトを修正するか作り直すかを決める基準\u003c/h2\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e状況\u003c/th\u003e\n\u003cth\u003e既存構造の維持・修理\u003c/th\u003e\n\u003cth\u003eRailsなどによる再実装を検討\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"状況\"\u003e主要機能とテスト\u003c/td\u003e\n\u003ctd data-label=\"既存構造の維持・修理\"\u003e大部分が動作し、テストがある\u003c/td\u003e\n\u003ctd data-label=\"Railsなどによる再実装を検討\"\u003e主要フローさえ繰り返し壊れる\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"状況\"\u003eデータ\u003c/td\u003e\n\u003ctd data-label=\"既存構造の維持・修理\"\u003e本番データが多く、移行リスクが高い\u003c/td\u003e\n\u003ctd data-label=\"Railsなどによる再実装を検討\"\u003eデータがないか、移行範囲が小さい\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"状況\"\u003e構造\u003c/td\u003e\n\u003ctd data-label=\"既存構造の維持・修理\"\u003e責任境界とパターンが概ね一貫している\u003c/td\u003e\n\u003ctd data-label=\"Railsなどによる再実装を検討\"\u003e同じ機能が複数のレイヤーに重複している\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"状況\"\u003eフロントエンド要件\u003c/td\u003e\n\u003ctd data-label=\"既存構造の維持・修理\"\u003e複雑なインタラクションと既存のReact資産が重要\u003c/td\u003e\n\u003ctd data-label=\"Railsなどによる再実装を検討\"\u003eサーバー中心のCRUDと業務フローが中心\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"状況\"\u003eチームの能力\u003c/td\u003e\n\u003ctd data-label=\"既存構造の維持・修理\"\u003e現在のスタックを運用できる人材がいる\u003c/td\u003e\n\u003ctd data-label=\"Railsなどによる再実装を検討\"\u003eRailsの規約がチームの作業方法により適している\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"状況\"\u003e外部連携\u003c/td\u003e\n\u003ctd data-label=\"既存構造の維持・修理\"\u003e多数の安定した連携がすでに運用中\u003c/td\u003e\n\u003ctd data-label=\"Railsなどによる再実装を検討\"\u003e連携が初期段階にあるか、置き換え可能\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eファイル数が多い、またはエラーがあるという理由だけで全面的に書き直してはならない。書き直しによって、既存システムで解決済みだった例外的な状況への対応を失い、新しい欠陥を生み出す可能性がある。まずは小さな垂直フローを2つの方式で実装し、開発速度、テスト可能性、コードの理解しやすさ、デプロイリスクを比較するのがよい。\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E5%89%8D%E3%81%AB%E5%88%A5%E9%80%94%E7%A2%BA%E8%AA%8D%E3%81%99%E3%81%B9%E3%81%8D%E9%A0%85%E7%9B%AE\" class=\"anchor\" id=\"リリース前に別途確認すべき項目\"\u003e\u003c/a\u003eリリース前に別途確認すべき項目\u003c/h2\u003e\n\u003cp\u003e4時間でベースラインが作られても、次の項目が残る可能性がある。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e権限モデルとRailsのセキュリティ設定のレビュー\u003c/li\u003e\n\u003cli\u003e決済Webhookの署名、重複防止、キャンセルと返金の処理\u003c/li\u003e\n\u003cli\u003e本番データの移行および件数・合計の検証\u003c/li\u003e\n\u003cli\u003eデータベースのバックアップと実際の復元テスト\u003c/li\u003e\n\u003cli\u003eエラー追跡、ログの保存、可用性のモニタリング\u003c/li\u003e\n\u003cli\u003e負荷テストとコスト見積もり\u003c/li\u003e\n\u003cli\u003e個人情報の取り扱い、利用規約と関連する法的レビュー\u003c/li\u003e\n\u003cli\u003eアクセシビリティ、ブラウザーおよびモバイル環境の確認\u003c/li\u003e\n\u003cli\u003e障害発生時のロールバック手順と担当者の指定\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\n\u003ca href=\"#%E7%B5%90%E8%AB%96\" class=\"anchor\" id=\"結論\"\u003e\u003c/a\u003e結論\u003c/h2\u003e\n\u003cp\u003eバイブコーディングプロジェクトが後半で停滞する理由は、AIのコーディング能力だけでは説明できない。自由度の高い構成で、ルール、責任境界、テスト、運用基準を定めなければ、AIが作った局所的な解決策は互いに衝突しやすい。\u003c/p\u003e\n\u003cp\u003eRuby on Railsは、規約と統合された構造を通じて、この自由度を減らす実用的な代替案になり得る。しかし、すべてのプロジェクトをRailsで作り直すことが正解ではない。まず現在のスタックを根拠に基づいて調査し、主要フローを定めたうえで、4時間を\u003cstrong\u003e完成品の制作時間ではなく、構造を検証し、復旧可能なベースラインを作る時間\u003c/strong\u003eとして使うべきである。\u003c/p\u003e\n","tags":["AIコーディング","バイブコーディング","Ruby on Rails","ウェブ開発","プロジェクト復旧"],"faqs":[{"question":"バイブコーディングのプロジェクトは、最初は速いのに後半になると遅くなるのはなぜですか？","answer":"初期には目に見える正常系のフローを作る作業が多い一方、後半には権限、データの一貫性、障害復旧、決済、デプロイ、セキュリティなど、複数のレイヤーをつなぐ問題が集中するためです。構造上のルールとテストがなければ、AIが追加した局所的な修正が既存のコードと衝突し、速度がさらに低下する可能性があります。"},{"question":"React、Next.js、Supabaseの組み合わせを使用すると、必ずスパゲッティコードになりますか？","answer":"いいえ。3つの技術はそれぞれ明確な役割を持つツールであり、熟練したチームであれば安定したサービスを構築できます。問題になるのは、データアクセス、認証、ビジネスルール、エラー処理の責任範囲を定めないまま、同じ機能を複数のレイヤーで重複して実装するやり方です。"},{"question":"Ruby on Railsに切り替えると、すべての外部サービスが不要になりますか？","answer":"いいえ。Railsでは、データアクセス、ジョブ処理、メール、リアルタイム通信、テスト、デプロイを一貫した仕組みで扱えますが、決済事業者、メール送信インフラ、クラウドホスティング、モニタリングなどの外部サービスは依然として必要になる場合があります。"},{"question":"アプリ全体を本当に4時間で作り直すことはできますか？","answer":"一般的に保証することはできません。要件とデータモデルが確定し、コアフローが非常に限定的で、外部アカウントとデプロイ環境が準備され、熟練者がAIの出力をレビューする場合には、実行可能なベースラインや小規模なMVPを作成できます。本番運用レベルのセキュリティ、決済の例外処理、データ移行、障害対応には通常、追加の時間が必要です。"},{"question":"既存のコードを捨てて書き直すべき兆候は何ですか？","answer":"中核となるビジネスルールが複数の箇所で重複し、小さな修正によって無関係な機能が繰り返し壊れ、自動テストがなく、データがまだ少なくて移行コストが低い場合は、再実装を検討できます。運用データと安定した外部連携が多い場合や、現在の構造にテストがある場合は、段階的な修正のほうが安全な可能性があります。"},{"question":"AIに現在のプロジェクトの技術スタックをどのように調査させればよいですか？","answer":"パッケージファイル、ロックファイル、データベーススキーマ、認証コード、APIルート、デプロイ設定、テストファイルを読み、技術ごとの役割と根拠となるファイルを表にまとめるよう依頼する必要があります。すぐにコードを修正せず、機密値を出力せず、重複したビジネスルールや境界違反の可能性も示すようにするとよいでしょう。"},{"question":"4時間の復旧作業で最初に実装すべき機能は何ですか？","answer":"サービスの価値を代表する中核的なユーザーフローを1つ選ぶ必要があります。画面を作るだけでなく、認証、サーバー側の検証、データ保存、エラー処理までつなぎ、正規ユーザーと権限のないユーザーの条件をテストすることで、構造の妥当性を迅速に判断できます。"},{"question":"Railsを使用すると、セキュリティ上の問題は自動的に解決されますか？","answer":"いいえ。Railsは複数のセキュリティに関するデフォルト設定や保護機能を提供しますが、権限設定の漏れ、機密情報の漏えい、脆弱な外部連携、誤ったデプロイ設定まで自動的に防止するわけではありません。フレームワークのセキュリティガイドに従い、アプリケーションごとの権限とデータフローを別途確認する必要があります。"}],"sources":[{"url":"https://react.dev/learn","title":"Reactを学ぶ","type":"source"},{"url":"https://nextjs.org/docs","title":"Next.jsドキュメント","type":"source"},{"url":"https://supabase.com/docs","title":"Supabaseドキュメント","type":"source"},{"url":"https://rubyonrails.org/doctrine","title":"Railsのドクトリン","type":"source"},{"url":"https://guides.rubyonrails.org/","title":"Ruby on Railsガイド","type":"source"},{"url":"https://guides.rubyonrails.org/active_job_basics.html","title":"Active Jobの基礎","type":"source"},{"url":"https://guides.rubyonrails.org/action_mailer_basics.html","title":"Action Mailerの基礎","type":"source"},{"url":"https://guides.rubyonrails.org/action_cable_overview.html","title":"Action Cableの概要","type":"source"},{"url":"https://guides.rubyonrails.org/security.html","title":"Ruby on Railsセキュリティガイド","type":"source"},{"url":"https://guides.rubyonrails.org/testing.html","title":"Railsアプリケーションのテストガイド","type":"source"}],"images":[{"id":359,"url":"https://injoys.com/rails/active_storage/blobs/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDI0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--671c6671ab2b4dd55a12c8db4a32cd95021e1402/ai-ff797ac5.webp","is_representative":true,"generation_method":"ai_image","license":"ai_generated","mime_type":"image/webp","translations":{"ko":{"alt":"얽힌 시스템 연결망과 정돈된 계층 구조 사이에 서 있는 개발자","caption":"복잡하게 얽힌 프로젝트를 명확한 계층 구조로 재정비하는 과정을 보여준다.","description":null},"en":{"alt":"Developer standing between tangled system connections and an orderly layered architecture","caption":"The illustration shows a tangled project being reorganized into a clear layered structure.","description":null},"ja":{"alt":"絡み合うシステム接続と整然とした階層構造の間に立つ開発者","caption":"複雑に絡んだプロジェクトを明確な階層構造へ整理する過程を表している。","description":null},"es":{"alt":"Desarrollador entre conexiones de sistema enredadas y una arquitectura ordenada por capas","caption":"La ilustración muestra un proyecto enredado que se reorganiza en una estructura clara por capas.","description":null},"id":{"alt":"Pengembang berdiri di antara koneksi sistem kusut dan arsitektur berlapis yang rapi","caption":"Ilustrasi ini menunjukkan proyek yang kusut sedang ditata ulang menjadi struktur berlapis yang jelas.","description":null},"pt":{"alt":"Desenvolvedor entre conexões de sistema emaranhadas e uma arquitetura organizada em camadas","caption":"A ilustração mostra um projeto emaranhado sendo reorganizado em uma estrutura clara de camadas.","description":null},"zh-hant":{"alt":"開發者站在糾結的系統連線與井然有序的分層架構之間","caption":"插圖呈現將混亂糾結的專案重新整理為清晰分層架構的過程。","description":null},"de":{"alt":"Entwickler zwischen verworrenen Systemverbindungen und einer geordneten Schichtenarchitektur","caption":"Die Illustration zeigt, wie ein verworrenes Projekt in eine klare Schichtenstruktur überführt wird.","description":null}}},{"id":360,"url":"https://injoys.com/rails/active_storage/blobs/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDI1NSwicHVyIjoiYmxvYl9pZCJ9fQ==--dd1b9b18b3b924f01625710e0b4bafd8fbbd0002/ai-74d32191.webp","is_representative":false,"generation_method":"ai_image","license":"ai_generated","mime_type":"image/webp","translations":{"ko":{"alt":"무너진 절벽과 견고한 플랫폼 사이의 다리를 수리하는 개발자들과 보안·배포 아이콘","caption":"개발자들이 불안정한 프로젝트 구조를 보강해 안정적인 시스템으로 복구하는 과정을 보여준다.","description":null},"en":{"alt":"Developers repairing a bridge between a crumbling cliff and a stable platform, with security and deployment icons","caption":"Developers reinforce a fragile project structure to restore it as a stable system.","description":null},"ja":{"alt":"崩れた崖と安定した基盤を結ぶ橋を修復する開発者と、セキュリティやデプロイのアイコン","caption":"開発者が不安定なプロジェクト構造を補強し、安定したシステムへ復旧する過程を表している。","description":null},"es":{"alt":"Desarrolladores reparan un puente entre un terreno agrietado y una plataforma estable con iconos tecnológicos","caption":"Los desarrolladores refuerzan una estructura frágil para recuperar un sistema estable.","description":null},"id":{"alt":"Pengembang memperbaiki jembatan antara tebing retak dan platform kokoh dengan ikon keamanan dan deployment","caption":"Para pengembang memperkuat struktur proyek yang rapuh untuk memulihkan sistem yang stabil.","description":null},"pt":{"alt":"Desenvolvedores consertam ponte entre penhasco rachado e plataforma estável, cercados por ícones de tecnologia","caption":"Desenvolvedores reforçam uma estrutura frágil para recuperar um sistema estável.","description":null},"zh-hant":{"alt":"開發人員修復連接崩裂懸崖與穩固平台的橋梁，周圍有安全與部署圖示","caption":"開發人員加固脆弱的專案結構，使其恢復為穩定的系統。","description":null},"de":{"alt":"Entwickler reparieren eine Brücke zwischen brüchiger Klippe und stabiler Plattform, umgeben von Technik-Symbolen","caption":"Entwickler verstärken eine fragile Projektstruktur und stellen ein stabiles System wieder her.","description":null}}}],"published_at":"2026-07-30T13:43:49+09:00","updated_at":"2026-07-30T13:43:49+09:00","license":"cc_by","translation_status":"reviewed","available_locales":["ko","en","ja","es"],"data_locales":["ko","en","ja","es","id","pt","zh-hant","de"],"url":"https://injoys.com/ja/articles/vibe-coding-project-architecture-and-four-hour-rescue-sprint"}