第1章:YAGNIってなに?「作らない勇気」の入門 🌱🙂
0. この章でできるようになること(ゴール)🎯✨
- YAGNIを“誤解なく”1文で説明できるようになる🗣️💡
- 「それ今いる?」を自分で判断する基準を持てるようになる🧭👀
- ありがちな“作り込みの罠”を回避する最初の一歩を踏めるようになる🧯🚧
- 最後に、自分専用のYAGNIルール1文を完成させる📦✍️
1. まず結論:YAGNIの一言定義 🧩

YAGNI = 「今、必要なものだけ作る」✨ もっと丁寧に言うと👇
- 「将来たぶん要るかも…」で機能を足さない
- “必要になった瞬間”に、ちゃんと作る
YAGNIはXP(エクストリーム・プログラミング)で語られてきた考え方で、ロン・ジェフリーズの有名な説明が軸になってます。 (ronjeffries.com)
2. なんでYAGNIが大事なの?(超リアルな理由)😅💥
「未来のために作っとこ!」って、優しさに見えるんだけど…実際はこうなりがち👇
- 未来が当たらない🎯💦(当たったとしても“別の形で必要”になりがち)
- 作った瞬間から保守コスト発生🧹🧾(テスト・例外・ドキュメント・理解コスト)
- 複雑さで速度が落ちる🐢(「変更したいのに怖い」になる)
- DDD初心者ほど“立派な箱”を先に作りがち📦📦📦(でも中身がまだ薄い…)
つまりYAGNIは、開発の体力を温存して、変化に強くするための作戦なんだよね💪🌸 (martinfowler.com)
3. よくある誤解をぜんぶ潰す(ここ超大事)🧯✨
誤解①:YAGNI = 手抜き?😵💫
違うよ〜!🙅♀️ YAGNIは「雑に作る」じゃなくて、価値が出るところに集中するってこと✨
誤解②:設計しないってこと?🫣
それも違う!🙅♀️ “後で育てられる”くらいの最低限の設計はするよ🌱 ただし、未来のための立派すぎる仕組みは今は作らない✂️
誤解③:リファクタしないならYAGNIでOK?😇
これが一番危険⚠️ YAGNIは、XPの文脈だと「シンプルに作って、必要になったら整える(リファクタ)」とセットで語られがち。 「今だけ動けばOK」で放置すると、ただの負債になる😇💣 (ウィキペディア)
4. KISS / DRY とどう関係するの?(ざっくりおいしく)🧁✨
KISS(シンプルにしよう)🍭
- YAGNIはシンプルに保つためのブレーキ🚦
- 「将来の拡張性のために…」で構造が複雑になるのを止める✋
DRY(同じことを繰り返さない)🍩
- DRYは大事だけど、早すぎる共通化は罠🎣
- まずは少し重複しててもOK。 重複が“痛み”になってから共通化すると、ちょうどいいことが多い🩹✨
(この「痛みが出たら直す」って感覚、YAGNIと相性よすぎる🤝💖)
5. ミニ演習📝:「今必要」だけに絞る練習✂️✨

お題:学内イベントの「参加登録」アプリ🎪📱
あなたは学園祭の運営。やりたいこと候補はこれ👇
候補機能リスト
- 参加登録(名前・学籍番号・メール)📝
- 登録済み一覧を見る📋
- キャンセル🗑️
- 管理者ログイン🔐
- QRコード受付📷
- 参加者へ一斉メール📧
- 支払い(チケット)💳
- 参加者の属性分析📊
- 多言語対応🌍
- 将来の他イベントにも使える汎用化♾️
ステップA:MVPを決めよう(3つまで)🍰
ルール:
- 「初日の運営が成立する」だけ考える
- “気が利く未来”は一旦スキップ🙈
例(答えの一例)👇
-
- 参加登録
-
- 登録済み一覧
-
- キャンセル
ステップB:「今は作らない」リストを作ろう🧊
-
- 管理者ログイン(最初は運営PC限定で運用で回す)
-
- QR受付(紙の名簿 or 検索で当面OK)
-
- 一斉メール(手動メールで当面OK)
-
- 支払い(無料イベントなら不要)
-
- 分析(まずは開催できることが優先)
-
- 多言語(来年要望が出たら)
-
- 汎用化(2回目が来てからでも遅くない)
ステップC:受け入れ条件を1〜2個だけ書く✅
例👇
- 「登録したら一覧に出る」
- 「キャンセルしたら一覧から消える」
6. “C#あるある”で見る:YAGNIの空気感 🧠🧯
ありがち:最初から全部「差し替え可能」にしたくなる😇
- まだ差し替えないのに
IService/IRepositoryを量産 - DIコンテナも早めに導入
- 抽象が増えて読むのがしんどい😵💫
でも、YAGNI的にはこう👇
- 差し替えの痛みが出たら切る✂️
- テストが辛くなったら、そこから“必要な分だけ”抽象化する🧪
例:最初は素直に書く(必要になったら整える)🌱
public sealed class RegistrationService
{
private readonly List<Participant> _participants = new();
public void Register(string name, string studentId, string email)
{
_participants.Add(new Participant(name, studentId, email));
}
public IReadOnlyList<Participant> List() => _participants;
}
public sealed record Participant(string Name, string StudentId, string Email);
まずはこのくらいでOK🙆♀️✨ 本当にDBが必要になったら、その時点でリポジトリを導入しても間に合うよ🌸
7. AI活用🤖:MVP範囲をAIに箇条書きさせる(盛らせないコツ付き)🧯✨
7-1. “盛らせない”プロンプト(コピペOK)📝
Copilot/Codexにこう投げる👇
あなたは厳しめのPMです。
以下の要件から「初回リリース(MVP)で必須な機能」を最大3つに絞ってください。
制約:
- 拡張性・将来対応・汎用化は考えない
- 例外的なケースや管理機能は後回し
- 受け入れ条件も各1つだけ添える
出力は箇条書きのみ。
要件: (ここに要件を貼る)
7-2. AIが盛ってきた時の“返し”テンプレ😇✂️
その提案のうち「将来のため」「便利そうだから」だけで入っている項目を列挙して削って。
MVPに残す理由を、受け入れ条件ベースで説明して。
8. 成果物📦:自分用YAGNIルール1文(これがゴール!)✍️✨
書き方テンプレ🧾
- 「◯◯の“痛み”が出るまで、△△は作らない」
例👇
- 「差し替えが本当に必要になって困るまで、
interfaceは増やさない」🪓 - 「要件にない汎用化は、2回目の類似案件が来るまで作らない」♾️✋
- 「運用で回せるなら、管理画面は後回しにする」🧑💻🗂️
9. 1分チェッククイズ✅🎓
- YAGNIは「設計しない」ことである。→ ✅/❌
- 「将来要るかも」だけで機能を追加するのはYAGNI的。→ ✅/❌
- まず小さく作って、必要になったら整えるのがYAGNIの感覚。→ ✅/❌
(答え:1❌ 2❌ 3✅)🎉
おまけ:いまの“最新”メモ(さらっと)🆕✨
- .NET 10 はLTSで、サポートは 2028年11月ごろまでの案内になってるよ📌 (Microsoft for Developers)
- C# 14 の新機能は Microsoft Learn にまとまってる🧠 (Microsoft Learn)
- Visual Studio 2022 は 17.14 系が現行の流れ(リリース履歴あり)🛠️ (Microsoft Learn)
次は第2章で、「作り込みすぎのサイン👀🚨」を“見抜く目”を作っていこうね〜!✨💪