ひとことで言うと#
シンプルに保て、余計なことをするな。必要以上に複雑な設計やコードを避け、誰が読んでも理解できるシンプルさを最優先する原則。
押さえておきたい用語#
- YAGNI
- “You Ain’t Gonna Need It"の略。今必要でない機能は作るなという原則。KISSと相性が良い。
- 過剰設計(Over-Engineering)
- 現在の要件に対して必要以上に複雑な設計を行うこと。将来を見越しすぎた抽象化が典型例。
- 可読性(Readability)
- コードが他の開発者にとってどれだけ理解しやすいかの度合い。KISSの本質はここにある。
- 認知的複雑度
- コードを理解するために必要な脳のメモリ消費量。ネストの深さや分岐の多さで増大する。
KISS原則の全体像#
こんな悩みに効く#
- 自分が書いたコードを1ヶ月後に読み返して理解できない
- 「将来のため」に作った抽象化が、結局使われずに複雑さだけ残った
- チームメンバーがコードを理解できず、開発速度が落ちている
基本の使い方#
問題を解決する最も単純な方法は何かをまず考える。
- 「今の要件を満たす最小限の実装は何か?」を自問する
- デザインパターンや高度な技術を使う前に、素直な実装を検討する
- YAGNI(You Ain’t Gonna Need It)も意識する
ポイント: シンプルとは「手抜き」ではなく、本質に集中すること。
不必要な複雑さが混入していないか確認する。
- 1つの関数が50行を超えていないか?
- ネストが3段以上深くなっていないか?
- 使われていない引数や条件分岐がないか?
- 「頭のいいコード」を書こうとしていないか?
ポイント: コードレビューで「これ何してるの?」と聞かれたら、複雑すぎるサイン。
複雑さを見つけたら、シンプルな構造に書き直す。
- 長い関数は意味のある単位で分割する
- 条件分岐が多ければ、早期リターンやガード節を使う
- 使われていないコードは削除する(コメントアウトではなく削除)
ポイント: 「このコードを初めて読む人が理解できるか?」を判断基準にする。
具体例#
Before(KISS違反): 将来の拡張を見越して、権限チェックにAbstract Factoryパターン + Strategyパターン + カスタムアノテーションを導入。5つのクラスと3つのインターフェースで構成。現在の権限は「admin」と「user」の2種類だけ。合計250行。
After(KISS適用): if (user.role === 'admin') のシンプルな条件分岐で実装。合計8行。
結果: コード量は1/30に。新メンバーが読んでも即座に理解できる。権限が5種類以上に増えたときに初めてパターンの導入を検討すればよい。
状況: アプリの設定管理に「将来マルチテナント対応するかもしれない」という理由で、設定プロバイダー抽象層 + DB設定テーブル + キャッシュ層 + 設定変更のイベント通知を実装。クラス数12、設定1つ追加するのに4ファイル変更が必要。しかし2年間マルチテナントの話は出ず。
KISS適用: 設定は環境変数で管理、アプリ起動時に読み込んでインメモリに保持する素直な実装に変更。クラス数12から1に削減。
結果: 設定追加の工数が2時間から5分に。チーム全員が設定の仕組みを理解できるようになり、設定関連のバグが月3件からゼロに。
Before: 外部APIのレスポンスを変換するために、Visitor パターン + Builder パターン + 中間表現クラスを組み合わせた変換パイプラインを構築。「将来、変換ルールをプラグインで追加できるように」。実際の変換ルールは3つだけ。
After: 3つの変換関数をシンプルに直列で呼び出すだけの実装に。変換関数それぞれ10〜15行。
結果: コード量が400行から45行に削減。バグ修正時に「どの変換ステップで問題が起きているか」が即座にわかるようになった。新しい変換ルール追加も関数を1つ足すだけ。
やりがちな失敗パターン#
- 「将来のため」に過剰設計する — 来るかわからない要件のために複雑な抽象化を入れる。今の要件を満たす最小限の設計にして、必要になったら拡張する
- シンプル=短いコードだと思う — ワンライナーで書いたが誰も読めない。可読性が高いことがシンプルの本質
- 技術的なかっこよさを優先する — 新しいパターンやライブラリを使いたいがために複雑化する。技術選定の基準は「チームが理解・保守できるか」
- シンプルを言い訳に設計を怠る — 「KISSだから」と何も考えずにベタ書きし、コピペだらけになる。シンプルさは意図的な設計努力の結果であり、怠惰ではない
まとめ#
KISS原則は 「シンプルが最強」 という教え。複雑なコードは書くのは簡単だが、シンプルなコードを書くのは実は難しい。常に「もっとシンプルにできないか?」と自問し、不必要な複雑さを排除し続けよう。シンプルなコードこそが、最も保守しやすく、最もバグが少ない。