第2章:作り込みすぎのサインを見抜く 👀🚨
この章はひとことで言うと、「それ今いる?」を“根拠つき”で言えるようになる章だよ〜🙂✨ (ここができると、YAGNIが一気に強くなる💪🌸)
ちなみに今どきのC#周りは、.NET 10 が最新のLTSで、C# 14 が最新だよ〜(Visual Studio 2026 でも触れる感じ)🧁 (Microsoft)
この章のゴール 🎯✨
できるようになること ✅
- 仕様やコードを見て「作り込みすぎっぽい…」をサインで発見できる👀
- 「今必要」を**受け入れ条件(Acceptance Criteria)**で言語化できる🧾✅
- “今やらない”を先送りメモにして、安心してスコープから外せる🧊✂️
今日の成果物 📦
- 作り込みサインのチェックリスト(コピペで使えるやつ)🧾✅
- 自分用のYAGNI判定ルール(短い一文×3)🧠✨
まず大前提:作り込みは「気合い」じゃなくて「コスト」💸😇
作り込みが増えると、だいたいこうなるよ👇
- 書くコードが増える ➜ バグの置き場所が増える🐛📈
- 変更に時間がかかる ➜ “軽い修正”が重くなる🪨
- 読むのが大変 ➜ 未来の自分が泣く😇🫠
- AIも盛る ➜ 「立派だけど要らない建築物」が完成🏰😅
だから、**「最小で、変更しやすい」**が勝ち🏆✨
作り込みすぎのサイン図鑑(あるある)📚🚨

ここからが本番! 見つけたら一旦ストップして「今必要?」を聞くやつを並べるね🙂💡
サイン1:実装が1個しかないのに interface が先にある 🧩😅
症状:IUserService / IUserRepository みたいなのが最初からいっぱい よくある理由:「将来差し替えるかも」 YAGNI的ツッコミ:差し替える“確定の理由”ある?今つらい? いったんの対処:まずは具象クラス1個でOK。差し替え痛が出たら切る✂️
サイン2:プロジェクト分割が最初から豪華(Domain / Application / Infra…)📦📦📦
症状:フォルダじゃなくて、いきなり複数プロジェクトに分けてる よくある理由:「DDDっぽいから」 YAGNI的ツッコミ:今の規模で、分けたメリットが勝ってる? いったんの対処:最初は1プロジェクト+フォルダ分けで十分🙆♀️✨
サイン3:リポジトリ+UnitOfWorkが“儀式”になってる 🧙♀️🌀
症状:DBアクセスのために抽象が二重三重 よくある理由:「昔からのテンプレ」 YAGNI的ツッコミ:今のCRUDで、それ必要?ただの中継じゃない? いったんの対処:まずは素直に書いて、重複が“痛く”なったらまとめる🧵
サイン4:イベント駆動・メッセージバス・ドメインイベントが先に入る 📣🚌
症状:まだ画面1つなのに非同期基盤がいる よくある理由:「拡張性!疎結合!」 YAGNI的ツッコミ:今の要件で“非同期じゃないと困る”って何? いったんの対処:まず同期で。必要になったらイベント化(順番が逆)🔁
サイン5:設定ファイル・フラグ・プラグインで何でも差し替え可能 🔧🎛️

症状:「設定で機能を差し替えられます!」 よくある理由:未来の自由度を先に取りたい YAGNI的ツッコミ:その自由度、今使ってる?誰が運用する? いったんの対処:ifで十分ならifでOK。運用コストは重いよ🧯
サイン6:ジェネリクス汎用化が早い 🧬😵💫
症状:たった2箇所の似た処理を無理に共通化 よくある理由:「重複は悪!」 YAGNI的ツッコミ:“重複の痛み”がまだ弱いなら、将来の方が変わるかも いったんの対処:「3回出たらまとめる」ルールが超強い🧁✨
サイン7:パターン(Factory/Strategy等)が“目的”になってる 🎭📦
症状:困ってないのにパターンを当てはめる よくある理由:学んだことを使いたい YAGNI的ツッコミ:そのパターン、今の問題を何秒で説明できる? いったんの対処:困りごとから入る(逆じゃない)🙂
サイン8:将来の入力バリデーションが超完備(でも画面1つ)🧪🧷
症状:汎用バリデーション基盤、パイプライン、反射、属性まみれ よくある理由:ちゃんとしたい YAGNI的ツッコミ:今必要なルールは何個?まずは直書きでもよくない? いったんの対処:ルールが増えたら整理。最初からの“万能”は重い🪨
サイン9:例外ハンドリングやログの“仕組み”が先に立派 🧯📜
症状:ログ基盤が本体 よくある理由:安心したい YAGNI的ツッコミ:今必要なのは「最低限の観測」?「巨大基盤」? いったんの対処:まずは“困ったときに追える”最低限でOK🙂
サイン10:AIが出した設計が立派すぎる(盛り)🤖🎈
症状:AIが急に「Clean Architecture!CQRS!Event Sourcing!」 よくある理由:AIは“網羅的に良さげな提案”をしがち YAGNI的ツッコミ:今の要件で、その複雑さを支払う価値ある? いったんの対処:AIに「盛るな」って最初に釘を刺す🧷(テンプレ後で出すね)
「今必要」を決めるための“基準”🧭✅

YAGNIって感覚じゃなくて、基準を置くと強いよ〜🙂✨ おすすめはこれ👇
基準A:受け入れ条件に必要?✅
- ユーザーが「できた!」と判定する条件に入ってる?
- 入ってないなら、まず削る候補✂️
基準B:ユーザー価値に直結?💎
- その機能がないと、ユーザーは目的を達成できない?
- “気持ちいい”だけなら後回し候補🙂
基準C:今日作らないと明日詰む?🧨
- いま入れないと後から入れられない“技術的理由”ある?
- ないなら後で良い可能性が高い🌿
ミニ演習📝:「今やらない」を3つ選ぼう✂️🧊
お題:学内サークルの出欠アプリ(最初の1ヶ月だけ使う)🏫💗
今ほしい(必須)
- 出欠を登録できる(名前+出席/欠席)
- 今日の出欠一覧が見られる
- 間違えたら修正できる
つい盛りがちな“未来候補” A) ロール管理(管理者/一般/閲覧のみ) B) CSVエクスポート C) Slack通知連携 D) 複数サークル対応(マルチテナント) E) 監査ログ(誰がいつ変更したか完璧に) F) プラグイン方式で拡張可能に
問1:この中から「今やらない」を3つ選んでね✅✂️
コツ:“必須3つ”に直接効かないものを狙う🙂
模範解答(例)🎯
- C) Slack通知連携(価値はあるけど“必須”ではない)
- D) 複数サークル対応(最初から地獄)
- F) プラグイン方式(運用コストが激重)
「じゃあBやEは?」ってなるけど、 B(CSV)は“要望が出てから追加”しやすいし、E(監査ログ)は“今の運用で必要か?”次第だよ〜🙂✨
超ミニ実演:YAGNIで“削る”ってこういうこと✂️🧁
ありがち(ちょい作り込み)例 😅
- IAttendanceRepository
- AttendanceRepositoryEfCore
- UnitOfWork
- AttendanceService
- AttendanceDomainEvent(登録時に発火)
…まだ画面1個なのに登場人物が多い😇
最初はこうでOK例 🙆♀️
- AttendanceService(ここでルール+保存+取得)
- DbContext(そのまま使う)
- 画面(登録・一覧)
「えっ、雑じゃない?」って思うかもだけど、 **最初の勝ち筋は“速く作って、学んで、直す”**だからね🌱✨
コードの雰囲気だけ(超短い)👇
public sealed class AttendanceService(AppDbContext db)
{
public async Task RegisterAsync(string name, bool isPresent)
{
db.Attendances.Add(new Attendance { Name = name, IsPresent = isPresent, Date = DateOnly.FromDateTime(DateTime.Now) });
await db.SaveChangesAsync();
}
public Task<List<Attendance>> GetTodayAsync()
{
var today = DateOnly.FromDateTime(DateTime.Now);
return db.Attendances.Where(x => x.Date == today).ToListAsync();
}
}
“差し替えたい”とか“テストつらい”とか、痛みが出たらそのとき初めて interface を切ればOK🙂✂️
AI活用🤖:「過剰設計か?」をAIにレビューさせるテンプレ 🕵️♀️🧯
Copilot ChatはIDE内で、説明・改善・テスト生成・デバッグ支援までしてくれるタイプだよ〜🧠✨ (Microsoft Learn)
テンプレ1:要件から“盛りポイント”検出 🎈🚫
Copilot/Codexにこう投げる👇
- 「次の要件だけを満たす最小の設計にして。拡張性・汎用化・プラグイン化・マイクロサービス化は提案しないで。もし提案するなら“今必要な理由”を必ず添えて」
テンプレ2:コードの“削り案”を出させる✂️🙂
- 「このコードは今の要件に対して過剰な抽象化がある?あるなら削った版を提示して。削る理由も一言で」
テンプレ3:受け入れ条件を作らせる✅🧾
- 「この機能の受け入れ条件を3〜5個で作って。ユーザー視点で、テストできる文にして」
仕上げ:作り込みサイン・チェックリスト(成果物)🧾✅
開発中、これを見て「ドキッ」としたらYAGNIタイム⏳✨
✅ サインチェック(Yesが多いほど作り込み注意🚨)
- 実装1個なのに interface / 抽象クラスがある
- プロジェクト分割が最初から多い
- “将来のため”が理由の仕組みが2つ以上ある
- 似た処理が2箇所なのに汎用化している
- 設定・拡張・差し替えができる仕組みが先にある
- パターン名(Factory等)が目的になってる
- 非同期・イベント・キューが先にいる
- AIの提案が「立派すぎる」と感じた
- 説明が長い(1分で言えない)
- 受け入れ条件に入ってないのに作ってる
自分用YAGNIルール(1文×3)🧠✨
最後にこれを書いて完成〜🎉(例も置くね)
- ルール1:受け入れ条件にないなら作らない✅
- ルール2:差し替えは痛みが出てから切る✂️
- ルール3:“将来”はメモに残して、今は捨てる📝🧊
宿題(10分)📝🌙
- いま書いてる(or 最近書いた)コードを1つ選ぶ
- チェックリストでYesを数える
- Yesが多い項目を1つだけ選んで「削れる?」を考える✂️🙂
次は第3章で、**「今必要」を決める“スコープの切り方”**を、もっと手順として固めていくよ〜✂️🗺️✨