🧭 ベストプラクティスが多すぎて選べない
✍️ 執筆: Claude Opus
JavaScript疲れに、プロは"決めない技術"で勝つ — 2026・Vercel × AI起業の意思決定
🧭 Section 1: なぜ選べないのか — JavaScript疲れの正体
このセクションの3点
① あなたの「常に選ばされている」という感覚は気のせいでなく、構造的に正しい
② "JavaScript疲れ(JS Fatigue)"は 2015年に命名された、10年来の既知の現象
③ 原因はnpmの細分化思想 × JSの汎用言語化 × 低参入障壁による選択肢の組合せ爆発
JS疲れ(JavaScript Fatigue)の起源
なぜ選択肢が爆発するのか — 3つの構造的原因
| 原因 | 具体的な現象 | 帰結(あなたへの影響) |
|---|---|---|
| ① npmの細分化思想 | 状態管理・ルーター・バンドラーがそれぞれ独立パッケージ。 Redux / React Router / webpack を別々に選ぶ設計になっている。 | 組合せ数が爆発し「正しいスタック」が無限に存在するように見える。 |
| ② JSがブラウザ唯一の汎用言語 | SPA / SSR / SSG / モバイル / CLI まで同一言語。 ユースケース全域で競合フレームワークが乱立する。 | 「自分の用途に合うのはどれか」という問いが永遠に続く。 |
| ③ npmの低参入障壁 | 誰でも数分でパッケージを公開できる。 2026年現在 npm には 300万超のパッケージが存在する。 | 「最新・最良」を探すほど候補が増え、情報が古くなるサイクルが速い。 |
300万+
npmパッケージ総数(2026年現在)
2015
JS疲れが命名された年(Clemmons)
10年
解決されずに続く構造問題
どのフレームワークが最強かを告げる代わりに、「どう決めるか」という意思決定の型を渡します。
型を持てば、今後どれだけ新しいツールが登場しても、同じ手順で素早く決断できるようになります。
→ 次の Section 2 では「データで見る2024-2026の多数派(収束先)」を解説する。まず現実の多数派を把握することが、最初の選択コストを最小化する。
📊 Section 2: データで見る"今の多数派"
このセクションの3点
① 迷ったらまず多数派に乗るのが探索コスト最小——正解を探すより"情報量が多い選択"を選ぶ
② 2024〜2026 の収束先は明確——State of JS 2024 / JS Rising Stars 2024 のデータが裏付け
③ Tailwind / shadcn / Next.js / Zustand + RSC が事実上の標準——迷う必要はすでに消えている
7.8M
Tailwind CSS 採用案件数(Bootstrap 5.2M を抜き 1 位)
+38k
shadcn/ui 2024 新規スターJS Rising Stars 総合 1 位
+10.8k
Zustand 2024 新規スター状態管理カテゴリ 1 位
44%
Next.js 使用率メタFW 最大シェア
メタフレームワーク — 使用率 × 保持率
| フレームワーク | 使用率 / 規模 | 保持率・満足度 | 特徴 |
|---|---|---|---|
| Next.js | 44%(最大) | 68%(メタFW中 低め) | エコ最大・Vercel公式・LLM学習量最多。RSC移行で覚えることが増えた |
| Astro | 小〜中規模 | 94%(最高) | コンテンツ重視・Islands Architecture・JS送信量ゼロが基本 |
| SvelteKit | 小〜中規模 | 90% | Runes(v5)・Form Actions・シンプル設計。Vercel × Cloudflare で動く |
| Nuxt | ~18% | 中程度 | Vue.js 案件で安定。Vue経験者以外は採用メリット薄 |
| Remix | ~8% | 中程度 | Web標準重視。React Router v7 と統合。Epic Stack の土台 |
状態管理 — 2024 新規スター数 × 位置づけ
| ライブラリ | 2024 新規スター | 位置づけ | 2026の採用判断 |
|---|---|---|---|
| Zustand | +10.8k(1位) | グローバル UI 状態の新規標準 | テーマ・モーダル等の真のグローバル状態に使う |
| Jotai | +3.1k | アトミック状態管理 | Zustand より細粒度。Recoil の後継として選ばれる傾向 |
| TanStack Query | 急成長 | サーバー状態の実質標準 | CSRでキャッシュ/再取得/楽観更新が要る場合。RSCなら不要になることも |
| XState | +2.1k | ステートマシン・複雑フロー | 複雑な状態遷移が必要な場面限定。学習コスト高め |
| Redux Toolkit | 絶対量最多・新規減少 | レガシー維持 | 新規プロジェクトでは基本選ばない。既存コードの保守用 |
スタイリング / UI コンポーネント — 2024〜2026 の状況
| ツール | 2024〜2026 の状況 | 採用判断 | 備考 |
|---|---|---|---|
| Tailwind CSS v4 | 7.8M 案件・1 位(Bootstrap 5.2M を抜く) | 積極採用 | CSS-first・Oxide エンジン。UIの記述場所が 1 箇所に固定 |
| shadcn/ui | Rising Stars 総合 1 位 (+38k)・90k+ stars | 積極採用 | コピペ所有モデル(ロックインなし)+ RSC 対応 + Radix プリミティブ |
| CSS Modules | 安定継続 | スコープ CSS 必要時 | RSC と相性良好。Tailwind と組み合わせ可 |
| vanilla-extract | 台頭・静的抽出 | 型安全 CSS が要る場合 | ゼロランタイム CSS-in-TS。デザインシステム構築向け |
| styled-components | 2025-03-17 メンテナンスモード入り | 新規非推奨 | Context API 依存で RSC 非互換。既存コードの保守のみ |
→ 次の Section 3 では「最適解が複数ある」という感覚の正体を、発想の転換から解剖する。
🔀 Section 3: 発想の転換 — 「最適解が複数」は意思決定の問題
このセクションの3点
① ベストプラクティスが複数あるのは「局所最適が多数ある」だけで、差は小さく可逆
② プロは各選択を最適化しない。「選択の回数」を減らすメタ戦略を最適化している
③ 以降の3戦略(枯れ技術 / オピニオネイテッドな束 / 一度決めて記録)が具体的な処方箋
選択を消す 3 つのメタ戦略
| 戦略 | 一言で言うと | 何の選択を消すか | 詳細 |
|---|---|---|---|
| ① 枯れた技術を選ぶ Choose Boring Technology | 「新しい」より「既知の失敗モードがある」を優先する | 「最先端 vs 安定」の比較検討コスト。未知のバグ調査コスト。 | sec4 → |
| ② オピニオネイテッドな束に乗る T3 / Epic Stack / next-forge | 個別に選ぶのをやめ、「誰かが決めた一式」を採用する | FW・ORM・認証・スタイリング…初期の数十個の選択がまとめて消える。 | sec5 → |
| ③ 一度決めて、記録する ADR | 決定を文書化し「なぜそうしたか」を残すことで再検討コストをゼロにする | 毎回の蒸し返し。AIが別技術を提案してくる際の迷い。 | sec6 → |
このセクションの結論
「どれが正解か」を調べ続けることに時間を使うのをやめる。 代わりに 「選ばなくてよくなる仕組み」 を手に入れることに1回だけ投資する。 プロが速い理由はここにあります。次の sec4〜6 で、3つのメタ戦略をそれぞれ具体的に展開します。
→ 次の Section 4 では「枯れた技術を選ぶ(Choose Boring Technology)」を Dan McKinley のイノベーショントークン概念とともに解説する。
🛠️ Section 4: 戦略① 枯れた技術を選ぶ(Choose Boring Technology)
このセクションの3点
① 新技術採用には「イノベーショントークン」という固定枠がある。枠を技術選定に溶かすとプロダクト本体に使えない
② 枯れた技術の強みは「既知の失敗モード」。新技術の怖さは「未知の未知(unknown unknowns)」
③ 2026年はAIに書かせる時代。枯れた・人気のスタックほどLLMのコード品質が高い
イノベーショントークンとは
3枚
イノベーショントークンの目安
未知
新技術が持つ「未知の未知」
既知
枯れた技術が持つ「既知の失敗モード」
枯れた技術が合理的な3つの理由
| 観点 | 枯れた技術(例: PostgreSQL / React / Tailwind) | 新しい技術(導入直後) |
|---|---|---|
| 失敗モード | 既知 — 過去の障害がドキュメント化されている。「あの問題はこう直す」が素早く分かる | 未知の未知 — まだ誰も踏んでいないバグが本番で出る。解決策が存在しないことも |
| 解決コスト | 低い — Stack Overflow・GitHub Issues・公式ブログに解答が山積。数分で解決 | 高い — 情報が少なく自力解決か Issue を立てるしかない。数時間〜数日を消費 |
| LLMのコード品質(2026) | 高い — 学習データが豊富なほど良質なコードを生成。ReactやPostgreSQLはLLMの学習量が圧倒的 | 低下しやすい — 学習データが少ないマイナー技術や最新リリース直後は誤ったコードを出す確率が上がる |
| 採用・引き継ぎ | 容易 — 経験者が多く、将来チームを組む際にも参入障壁が低い | 難 — 経験者が少なく採用コストが上がる。2〜3年後に廃れたら負債になる |
あなたのトークン、どこに使うか
❌ トークンを無駄遣いしている例
- 「話題の新しいORM試してみよう」
- 「Next.jsをやめてRemixに乗り換えてみよう」
- 「CSS-in-JSを比較して最良を選ぼう」
- 「最新バンドラーのベンチマークを測ろう」
✅ トークンを活かしている例
- 「競合が解いていない顧客課題の設計」
- 「AIを使った独自ワークフローの実装」
- 「差別化となるユーザー体験の発明」
- 「収益化モデルの実験」
→ 次の Section 5 では「戦略②:オピニオネイテッドな"束"に乗る」を解説する。T3 Stack・Epic Stack・next-forge など「誰かが決めた一式を丸ごと採用する」ことで、個別選択の数十個を一気に消す方法を見ていく。
📦 Section 5: 戦略② オピニオネイテッドな"束"に乗る
このセクションの3点
① 個別に最適解を探すのをやめ、「誰かが決めた一式(束)」をそのまま採用する
② T3 Stack / Epic Stack / next-forge が代表例。悩みを構造ごと外部委託できる
③ Convention over Configuration はあなたが Rails/Django で既に体験済みの思想—JS でも同じことが起きている
代表的なオピニオネイテッドスターター 比較
| スターター | 主な同梱技術 | 思想・誰向け | 出典 |
|---|---|---|---|
| create-t3-app T3 Stack | Next.js + TypeScript + tRPC + Tailwind CSS + Prisma / Drizzle + NextAuth | 型安全を最優先。tRPC でフロント→バック間の型ズレを根絶。フルスタック個人開発に最適 | create.t3.gg |
| Epic Stack Kent C. Dodds | Remix + SQLite + Prisma + Fly.io + 監視 / メール 一式 | 「analysis paralysis を越えるために確固たる選択を与える」が明示目的。Remix 派向け | epicweb.dev |
| next-forge Vercel 公式 | Turborepo モノレポ + Next.js + TypeScript + Tailwind + shadcn/ui + Radix + Clerk + Prisma / Neon + Stripe + Sentry + Resend | 本番 SaaS グレード。必須 env は DATABASE_URL のみ。Vercel × 個人起業で最短ゼロから本番へ | next-forge.com |
SvelteKit sv CLI公式 | ファイルベースルーティング / フォームアクション / Runes + アドオン選択(Drizzle / Lucia / Tailwind / Playwright) | 必要なものだけ対話で選ぶ軽量路線。保持率90%(State of JS 2024)。React に疲れた人向け | svelte.dev |
🚂 Convention over Configuration — あなたはすでにこれを知っている
Rails(2004年)と Django が確立した「設定より規約(Convention over Configuration)」の思想は、「デフォルトが正しければ差分だけ設定すればいい」という考え方だ。
あなたが Rails で app/models/user.rb に置けばモデルが認識され、config/routes.rb でルーティングが決まるという体験を持っているなら、それと同じ感覚がモダン JS でも再現されている。
| フレームワーク | 規約の例(設定不要) | Rails / Django との対応 |
|---|---|---|
| Next.js App Router | app/dashboard/page.tsx → /dashboard にルーティング |
Rails: resources :dashboards |
| SvelteKit | src/routes/blog/+page.svelte → /blog、+server.ts → API エンドポイント |
Django: urls.py + views |
| next-forge | 認証・決済・メール・監視がセット。DATABASE_URL だけ渡せば動く |
Rails の rails new --all に相当する一括宣言 |
あなたはこの思想を Rails / Django で身体で覚えている。「JS は設定が多くて辛い」と感じているなら、 それはオピニオネイテッドな束に乗っていないからだ——束を使えば体験は変わる。
10+
next-forge が消す選択数(認証/DB/UI/決済/メール/監視…)
1
next-forge に必須の env(DATABASE_URL のみ)
90%
SvelteKit 保持率(State of JS 2024)
2004
CoC の起源(Rails 登場年)
→ 次の Section 6 では「一度決めたら決め直さない」仕組み—ADR(Architecture Decision Records)を解説する。束を選んだ後、その選択をチームと AI に伝え続けるための記録術だ。
📝 Section 6: 戦略③ 一度決めて、決め直さない(ADR)
このセクションの3点
① 技術選定の最大コストは「決定そのもの」ではなく「何度も蒸し返すこと」にある
② ADR(Architecture Decision Records)は1決定1ファイルで"なぜそう決めたか"を残す仕組み
③ ADRをCLAUDE.mdからリンクしておくと、AIが勝手に別技術を使い始めたときに即指摘できる
ADR テンプレート(Nygard 形式)
# ADR 0001: ORM に Drizzle を使う
## Status
accepted
## Context
Neon (サーバーレス Postgres) を使う。型安全な ORM が必要。
候補は Prisma と Drizzle。個人起業フェーズで bundle サイズと
Cold Start を最小化したい。
## Decision
We will use Drizzle ORM.
- Prisma より bundle が小さく、Neon の HTTP ドライバと相性がよい
- TypeScript の型推論がスキーマから自動生成される
- 移行コストが低い(SQLに近い書き方)
## Consequences
良い: 型安全・Cold Start 短縮・schema-first で AI が迷わない
悪い: Prisma ほど学習資料が多くない(2026時点では追いついてきた)
中立: Prisma Studio のような GUI は別途用意が必要ADRがあるとないで何が変わるか
| 場面 | ADR なし | ADR あり |
|---|---|---|
| 新メンバー参加 | なぜ Drizzle か誰も知らない → 無思慮な踏襲 or 無思慮な入れ替え | ADR を読めば判断の背景が分かる → 理由を理解して従うか意識的に更新 |
| 技術の再検討 | 毎回ゼロから議論が再燃。決定コストを何度も払う | Status を "superseded" に更新するだけ。変更理由も記録される |
| AI(Copilot / Claude) | セッションをまたぐと記憶がリセット → 毎回別ORMを使い始める | CLAUDE.md から ADR へリンク → AI が逸脱したら即「ADR 0001 参照」と指摘できる |
| 個人開発(1人) | 3ヶ月後の自分が「なんでこれ入れたんだっけ」と迷う | 過去の自分へのメモとして機能。コンテキストスイッチコストが消える |
最小構成で始める ADR 運用
ディレクトリ
docs/adr/
連番ファイルを置くだけ。専用ツール不要。0001-use-drizzle.md のような命名が標準。
CLAUDE.md との接続
AI へのコンテキスト
CLAUDE.md(または AGENTS.md)に「技術選定は docs/adr/ を参照すること」と1行書く。AIへの記憶代わりになる。
更新のルール
既存ファイルは書き換えない
古い ADR を編集するのでなく、Status を superseded by 0007 に変え、新ファイルを追加する。変更履歴が残る。
→ 次の Section 7 では、戦略①②③を踏まえた「2026年の"とりあえずこれ"デフォルト構成」を一覧で示す。迷う時間をゼロにする具体的な技術スタックを確認しよう。
✅ Section 7: 2026の"とりあえずこれ"デフォルト構成
このセクションの3点
① 迷っている時間そのものが最大のコスト — 「まず動く構成」を手に入れることが先決
② ここで紹介する構成は next-forge(Vercel公式) 等の本番SaaSで実際に採用されている鉄板
③ "とりあえずこれ"で始め、不満が出た箇所だけ後で替える — それが最速の道
| レイヤー | 推奨 | 理由 |
|---|---|---|
| フレームワーク | Next.js 16(App Router) / 慣れてればSvelteKit | Reactエコ最大・LLM学習量最多・Vercelゼロコンフィグ。使用率44%(State of JS 2024) |
| 言語 | TypeScript | フルスタック型安全。AIの補助精度が上がり、型のズレをコンパイル時に検知できる |
| スタイリング | Tailwind CSS v4 | UIの記述場所が1か所に固定 = 迷いゼロ。案件数7.8Mでシェア1位 |
| UI部品 | shadcn/ui | コピペ所有モデル(ロックインなし)・Rising Stars 2024総合1位(+38k stars)・Radix+RSC対応 |
| クライアント状態 | 基本"不要"
(RSC+Server Actions) 要るなら Zustand / Jotai | RSCで`async/await`直取得が主流に。新規でReduxは選ばれない(react.dev) |
| サーバー状態 | TanStack Query or Server Actions直 | キャッシュ/再取得/楽観更新を委譲。自前で書かない |
| DB | Neon(サーバーレスPostgres) | 無料枠・Vercel統合・自動スケール。Vercelダッシュボードから直接セットアップ可 |
| ORM | Drizzle(推奨) or Prisma | Drizzle = 軽量・型推論強・Neon親和性高。Prisma = 学習資料が多く移行もしやすい |
| 認証 | Better Auth
(無料・自己ホスト) or Clerk(速度優先) | UIをゼロから作らない選択をする。Better Auth = 無料/自前DB。Clerk = MAU課金・最速導入 |
| デプロイ | Vercel | Nextゼロコンフィグ。個人は無料枠で十分。`git push`だけで本番反映 |
| メール | Resend + React Email | テンプレをReactコンポーネントで書ける。無料枠あり |
| 決済 | Stripe | 業界標準・LLMがStripeの良いコードを出す(学習データ量が多い) |
async/awaitでサーバーデータを直接取得できる。
フォーム送信はServer Actions(useActionState/useOptimistic)が担う。
「なんでもuseState + useEffect + fetch」という2020年代前半の書き方は、もう標準ではない。サーバーデータ
RSC で async/await
状態管理ライブラリ不要
フォーム/送信
Server Actions
useActionState で統合
真にグローバルなUI状態
Zustand / Jotai
テーマ・モーダル等に限定
対話形式で必要なものだけ選びたい
create-t3-app
Next.js + TS + tRPC + Tailwind + Prisma/Drizzle + NextAuth を CLIの質問に答えながら組み合わせる。必要最小限から始めたい人に。
https://create.t3.gg/本番SaaSを最初から見据えたい
next-forge(Vercel公式)
Turborepoモノレポ。Next + TS + Tailwind + shadcn/ui + Clerk + Neon + Stripe + Sentry + Resend を本番グレードで同梱。必須envは DATABASE_URL のみ。
SvelteKit派なら sv CLI でDrizzle/Lucia/Tailwind/Playwrightをアドオン選択するパターンが対応する。
→ 次のSection 8では「React状態管理とCSS、あなたの2大悩みの決着」を決定木で解説する。
🎯 Section 8: あなたの2大悩みの決着 — React状態管理 と CSS
このセクションの3点
① 状態管理の最適解は2026では「ほぼ要らない」に収束した — RSC + Server Actions が置き換える
② CSS は Tailwind + shadcn/ui で事実上決着。styled-components は2025年3月にメンテナンスモード入り
③ 「決定木」を持てば、個別ケースで迷わなくなる — 選択を毎回ゼロから考えない
React 状態管理の決定木 — 2026年版
| 状態の種類 | 2026の答え | 具体例 / 補足 |
|---|---|---|
| サーバーのデータ取得 | RSC で async/await 直取得 | キャッシュ・再取得が必要なら TanStack Query を追加。useEffect+fetch は不要 |
| フォーム送信・ミューテーション | Server Actions(useActionState / useOptimistic) | React 19 で標準統合。楽観更新も組み込みで実現可能 |
| URL に乗る状態 | URLSearchParams(状態管理不要) | フィルタ・ページ番号・検索クエリ。URL で共有可能になり UX も向上 |
| 局所 UI 状態 | useState(そのまま) | ドロップダウン開閉・入力中テキスト。コンポーネント外に出さない |
| 真にグローバルな UI 状態 | Zustand または Jotai(軽量) | テーマ切替・モーダル管理・ツアー進捗など。Redux は新規では基本不要 |
+10.8k
Zustand 2024年新規スター数(状態管理1位) 出典: Rising Stars 2024
React 19
useActionState / useOptimistic で Server Actions 統合済み 出典: react.dev
2025-03
styled-components がメンテナンスモード入り 出典: GitHub Discussion #5568
CSS の決定木 — 2026年版
| 状況・要件 | 2026の答え | 理由・補足 |
|---|---|---|
| 基本のスタイリング全般 | Tailwind CSS v4 | 案件数 7.8M(Bootstrap 5.2M を抜き1位)。CSS ファイルを別途管理しなくてよい。v4 は CSS-first で設定ファイル不要 |
| UI 部品(ボタン・ダイアログ等) | shadcn/ui | Rising Stars 2024 総合1位(+38k stars)。コピペ所有モデルでロックインなし。Tailwind + Radix プリミティブ + RSC 対応 |
| styled-components / Emotion | 新規採用しない | Context API 依存で RSC 非互換。styled-components は 2025-03 にメンテモード入り(公式 Discussion #5568) |
| CSS をファイルに分けたい・静的抽出したい | CSS Modules または vanilla-extract | CSS Modules はビルドツール標準対応で安定。vanilla-extract は TypeScript 型付きでゼロランタイム |
| SvelteKit を使っている場合 | Tailwind CSS v4 + shadcn-svelte | Svelte の <style> スコープと Tailwind は共存可能。scoped CSS は複雑なコンポーネントで補完的に使う |
→ 次の Section 9 では「AIバイブコーディングが微妙になる理由と対策6手」を解説する。スタックを固定した今、AIをどう束ねるかが次の問いになる。
🤖 Section 9: AIバイブコーディングが"微妙"になる理由と対策6手
このセクションの3点
① AIが"微妙"なのは能力の問題ではなく構造的な問題(平均化・記憶なし・過剰実装)
② 対策の本質は「AIに毎回ゼロから選ばせない」=スタックと規約を事前に固定すること
③ lint / 型 / ADR という機械的な矯正レールを引けば、AIは速く正確になる
なぜ"微妙"になるのか — 5つの構造的原因
| 原因 | 何が起きるか | 対策の方向 |
|---|---|---|
| ① 学習データの平均化 | 良いコードも悪いコードも均して"中央値"を出す。マイナー・新興技術ほど学習データが少なく品質が下がる | 人気・枯れたスタックを選ぶ(sec4のBoringTech戦略と直結) |
| ② セッション記憶なし | 昨日決めた設計方針・ライブラリ選択をAIは知らない。セッションを開くたびゼロスタートで"自分なりの最善"を選び直す | CLAUDE.md / AGENTS.md にスタックを明文化して毎回渡す |
| ③ 過剰実装 | 頼んでいないエラー処理・抽象レイヤー・型定義を追加し、コードが肥大化する。「役に立とう」バイアスが過多アウトプットを生む | 「最小実装のみ」「必要な箇所だけ編集」を毎回明示(Karpathyの4ルール) |
| ④ 確認せず仮定で進む | 曖昧な要件を自分で補完して実装し始める。「それは違う」が後から判明しリワーク多発(Karpathy指摘) | 前提・成功基準を先に定義させる。曖昧なら質問させるよう指示する |
| ⑤ 枯れ・人気の格差 | Next.js / React / Tailwind / Drizzle はLLMが大量に学習 → 良コード。マイナーORM・独自FWはコードが劣化する | デフォルト構成(sec7)の人気スタックに留まる |
対策6手 — AIを"決まった型の中で速く正確に"動かす
- 1
コンテキスト固定
固定スタックを CLAUDE.md / AGENTS.md に明記する
「このプロジェクトは Next.js 16・TypeScript・Tailwind v4・shadcn/ui・Drizzle・Neon を使う。他のORMやCSSソリューションは使わない」と一度書けば、全セッションで共通コンテキストになる。
AGENTS.mdは複数のAIツール(Claude / Cursor / Copilot)で横断認識される標準化傾向にある。プロジェクトルートに1ファイル置くだけでよい。→ 記憶なし問題を「外部記憶」で補う最小コスト対策
- 2
Linter as law
ESLint カスタムルールでアーキを機械強制する
Factory.ai が提唱する原則:"Agents write the code; linters write the law"(出典: factory.ai)。 「層をまたぐ import 禁止」「named export のみ」「
console.log禁止」等のカスタムルールを書く。 エージェントは lint エラーを自己修正フィードバックとして使い、lint green = アーキ準拠の代理指標になる。AIが勝手にルールを破っても CIで即検知できる。→ 平均化問題・過剰実装問題への機械的バリア
- 3
表現の固定
shadcn/ui でコンポーネントの書き方を1種類に絞る
「ボタンの実装」をAIに任せると
<button>/ MUI Button / 自作カスタムコンポーネント / shadcn Button が混在し始める。 shadcn/ui を導入してリポジトリにコードを取り込めば、「ボタン =@/components/ui/buttonを import する」が唯一の正解になる。 AI の出力が揺れても1種類に収束させられる。コピペ所有モデルなのでロックインもない。 - 4
型による制約
tRPC / Zod でAPIスキーマから型を自動生成し、逸脱をコンパイルエラーにする
tRPC はサーバー・クライアント間の型を共有し、APIの形が変わった瞬間に TypeScript コンパイルエラーが出る。 AIが「戻り値の型を勝手に変える」「フィールド名を変える」をしてもビルドが壊れるため即検知できる。 Zod でバリデーションスキーマを定義すると、フォーム・API・DB の3層で同じ型定義を再利用でき、AIが層ごとに別々の型を書き始める問題を防ぐ。
→ create-t3-app の中核思想。create.t3.gg
- 5
Karpathyの4ルール
「小さく作らせる」指示でリワークを消す
Andrej Karpathy が提唱する AI Coding Agents への4ルール(出典):
- ① 前提を明示し、曖昧なら質問させる(確認なし仮定問題への対策)
- ② 要求された最小実装のみ(過剰実装問題への対策)
- ③ 必要な箇所だけ編集する(スコープ外変更の防止)
- ④ 成功基準を先に定義する(「それは違う」リワークの防止)
→ CLAUDE.md の冒頭に「このルールに従え」と書いておくだけで全セッションに適用できる
- 6
ADRをAIに渡す
「なぜDrizzleか」を記録し、AIが別ORMを使い始めたら即指摘できるようにする
ADR(sec6参照)は人間の新メンバー向けだけでなく、AIへの制約文書としても機能する。
docs/adr/0001-use-drizzle.mdに「Prismaでなく Drizzle を選んだ理由」を書き、CLAUDE.mdから ADR ディレクトリへリンクしておく。 AIが「Prismaの方がいいと思います」と言い出したら「ADR 0001 を見ろ」で終わる。 逆に状況が変わって Drizzle を替えたい時は、ADR を更新して「AIに新しい判断根拠」を渡せる。→ Nygard 2011 / adr.github.io — 人間とAIの両方に効く「決め直さない」仕組み
6手 × 5原因の対応マップ
| 対策手 | 主に効く原因 | 導入コスト | 優先度 |
|---|---|---|---|
| ① CLAUDE.md / AGENTS.md | ② 記憶なし・⑤ スタックブレ | 低(1ファイル) | 最優先 |
| ② Linter as law | ① 平均化・③ 過剰実装 | 中(ESLint設定) | 高 |
| ③ shadcn/ui | ① 平均化・⑤ スタックブレ | 低(初期導入のみ) | 高 |
| ④ tRPC / Zod | ① 平均化・③ 過剰実装 | 中(スキーマ設計) | 高 |
| ⑤ Karpathyの4ルール | ③ 過剰実装・④ 仮定で進む | 低(CLAUDE.mdに追記) | 最優先 |
| ⑥ ADRをAIに渡す | ② 記憶なし・⑤ スタックブレ | 中(ADR文書作成) | 高 |
→ 次のSection 10では、ここまでの全戦略をまとめた「選択疲れに勝つ意思決定OS」と出典一覧を整理する。
🧠 Section 10: まとめ「選択疲れに勝つ意思決定OS」+出典
このセクションの3点
① 正解を覚えるな、決め方(意思決定OS)を持て
② 多数派×枯れ技術×オピニオネイテッド×一度決めて記録×AIを制約——この5層が選択疲れを終わらせる
③ 迷う時間を消した分を、プロダクトの独自価値に回す
あなたへの処方箋 ── Vercel × AI で個人起業する人の5ステップ
- 1
土台を固める
next-forge または create-t3-app で一括確定
フレームワーク・DB・認証・スタイリングの初期選択を「誰かがすでに決めた一式」に外注する。 Vercel × 個人起業なら next-forge(Vercel公式・本番グレード)、 または create-t3-app(Next+TS+tRPC+Tailwind+Prisma/Drizzle+Auth)。 これだけで最初の数十個の選択が消える。 - 2
UIを固める
Tailwind CSS v4 + shadcn/ui でUIの書き方を1種類にする
Tailwindで記述場所を1ファイルに固定。shadcn/uiのコピペ所有モデルで「ボタンの書き方」が1種類になり、AIの出力も揺れなくなる。 styled-componentsは2025-03-17にメンテナンスモード入り(RSC非互換)——新規採用は避ける。 styled-components discussion - 3
状態管理を整理する
状態はRSC優先・要る時だけ Zustand/Jotai
React 19 + Server Components 時代の答えは「クライアント状態管理ライブラリは基本不要」。 データ取得は async/await 直書き、フォームは Server Actions(useActionState/useOptimistic)、 真にグローバルなUI状態だけ Zustand か Jotai。Redux は新規では選ばない。 react.dev - 4
決定を記録する
ADRに1決定1ファイルで記録し、蒸し返さない
docs/adr/0001-use-drizzle.mdのように残す。 「なぜDrizzleか」を書いておけば、AIが別ORMを使い出した瞬間に指摘できる。新メンバーが加わっても無思慮な踏襲・変更を防げる。 決め直すのは状況が変わった時だけ——それ以外は蒸し返さない。 Nygard 2011 - 5
AIを束ねる
CLAUDE.md / AGENTS.md + ESLint で「AIが自由に選べない」構造を作る
AIに毎回ゼロから選ばせるとコードが揺れる。コンテキストファイルでスタックを明記し、ESLintカスタムルールで層またぎのimportを機械禁止する。 「Agents write the code; linters write the law」——lintがグリーンになればアーキ準拠の代理指標になる。 Factory.ai / Karpathy 4 rules
「ベストプラクティスは"知識"でなく"運用"。一度決めて、決め直さない仕組みを持つ者が速い」
── Choose Boring Technology(McKinley)× ADR(Nygard)× Linter as law(Factory.ai)の統合的実践
意思決定OS ── 5層の対応表
| レイヤー | 戦略 | 何の選択を消すか | 参照先 |
|---|---|---|---|
| 初期スタック | オピニオネイテッドな束 | FW / DB / 認証 / デプロイの初期選択 | next-forge / T3 / Epic Stack |
| 技術選定 | 枯れた技術を選ぶ | 未知の失敗・LLM出力品質の劣化 | McKinley / State of JS 2024 |
| UI実装 | Tailwind + shadcn で固定 | CSS方針の毎回迷い・AI出力の揺れ | Rising Stars 2024 (shadcn 1位) |
| 過去の決定 | ADR で記録・蒸し返さない | 毎回の再議論・AIの逸脱 | Nygard 2011 / adr.github.io |
| AI制御 | CLAUDE.md + ESLint で機械強制 | AIのランダム技術選択・アーキ逸脱 | Factory.ai / Karpathy |
意思決定OSを入れると何が変わるか
∞→1
初期スタックの選択肢(bundle→1スターター)
0回
ADR記録後の同じ議論の蒸し返し
lint green
AIアーキ準拠の代理指標
全部
浮いた時間をプロダクト独自価値へ
出典一覧
- JS疲れ起源 — Eric Clemmons "Javascript Fatigue" (2015) medium.com/@ericclemmons/javascript-fatigue
- State of JS 2024 — 使用率・保持率・スタイリング等 2024.stateofjs.com/en-US/libraries/
- JavaScript Rising Stars 2024 — shadcn/ui 総合1位・Zustand 状態管理新規1位 risingstars.js.org/2024/en
- React Server Components — react.dev 公式ドキュメント react.dev/reference/rsc/server-components
- styled-components メンテナンスモード — GitHub Discussion (2025-03-17) github.com/orgs/styled-components/discussions/5568
- Choose Boring Technology — Dan McKinley (2015) mcfunley.com/choose-boring-technology / boringtechnology.club
- create-t3-app — Next+TS+tRPC+Tailwind+Prisma/Drizzle+Auth スターター create.t3.gg
- Epic Stack — Kent C. Dodds / Remix+SQLite+Prisma+Fly.io epicweb.dev/epic-stack
- next-forge — Vercel公式 本番グレードスターター next-forge.com
- SvelteKit / sv CLI — 公式ドキュメント svelte.dev/docs/kit
- ADR (Architecture Decision Records) — Michael Nygard (2011) cognitect.com/blog/2011/11/15/documenting-architecture-decisions / adr.github.io / martinfowler.com/bliki/ArchitectureDecisionRecord.html
- Linter as law — Factory.ai「Agents write the code; linters write the law」 factory.ai/news/using-linters-to-direct-agents
- Karpathy 4 rules for AI coding agents — themenonlab.blog/blog/karpathy-claude-md-four-rules-ai-coding-agents