メインコンテンツへスキップ
カテゴリ: 原則
種類: 設計哲学
起源: 1960年代、米国海軍航空 / ソフトウェア工学、1970年代〜2000年代
別名: KISS、Keep It Simple Stupid、Keep It Simple and Stupid、KISSの原則
クイックアンサー — KISSの原則(Keep It Simple, Stupid)は、ほとんどのシステムは複雑にするよりも単純に保った方がうまく機能するという原則です。設計、実装、保守における単純性を提唱し、複雑さは脆弱性をもたらし、コストを増大させ、失敗の機会を生むという認識に基づいています。正確な起源には議論があり、1960年代の米国海軍航空と、その後のソフトウェアエンジニアによる採用の両方にルーツがありますが、この原則の知恵は数十年にわたり、工学、ビジネス、クリエイティブ分野で実証されてきました。

KISSの原則とは

KISSの原則は、システム、製品、ソリューションの作成において単純性をコアバリューとして提唱する設計哲学です。KISSは「Keep It Simple, Stupid」の頭字語です(「Keep It Simple and Stupid」や「Keep It Short and Simple」というバリエーションもあります)。その前提は驚くほど強力です。単純なソリューションは、理解し、実装し、保守し、デバッグするのが複雑なものより容易なのです。
「単純さは究極の洗練である。」— レオナルド・ダ・ヴィンチ
この原則は複数の分野での観察から生まれました。工学では、複雑なシステムほど故障点が多く、保守に手間がかかり、修正が困難です。ビジネスでは、複雑なプロセスはボトルネックを生み、関係者を混乱させ、変化に抵抗します。ソフトウェア開発では、過剰に設計されたコードは、チームを長年にわたって苦しめる技術的負債となります。KISSの原則はこれらの観察を実行可能なガイドラインに結晶化させています。複雑さが本当に必要でない限り、常に単純さを優先せよ、と。 よくある誤解は、KISSが「単純化せよ」や「原始的なソリューションを作れ」という意味だということです。実際には、単純さを達成するには、複雑さを作り出すよりも多くの努力が必要なことが多いのです。単純なソリューションは、完全で機能的、かつエレガントでなければなりません。実用的な目的に貢献しない不要な装飾を避けるだけです。

KISSの原則を3つの深さで理解する

  • ビギナー: 問題を解決する際、機能を追加する前に「これが機能する最も単純な解決策は何か?」と自問してください。決して実現しないかもしれない将来のニーズを予測する誘惑を避けてください。
  • プラクティショナー: 現在の要件に必要な最小限の複雑さでシステムを設計してください。賢いワンライナーより、明確で読みやすいコードを使ってください。実装したものだけでなく、なぜその決定を下したかを文書化してください。
  • アドバンスド: 単純さは文脈依存であることを認識してください。専門家にとって単純なものが、初心者には不可能かもしれません。必要に応じて複雑な振る舞いに組み合わせられる単純なインターフェースを構築することで、単純さと拡張性のバランスを取ってください。

起源

KISSの原則の正確な起源はやや不明瞭で、複数の信頼できる情報源が異なるルーツを主張しています。最も広く引用されている起源は、1960年代の米国海軍航空に遡ります。航空機整備エンジニアが、航空機システムを単純で保守可能に保つようリマインダーとして「KISS」を使用したと言われています。このフレーズは整備マニュアルの文脈で登場し、ほとんどの航空機は単純明快な手順で運用可能に保てることを強調していました。 この原則は、ソフトウェアエンジニアリングの複雑さが増す中で奮闘した1970年代から1980年代にかけて、ソフトウェアエンジニアリングでより広く認識されるようになりました。エクストリームプログラミングとテスト駆動開発のパイオニアであるケント・ベックは、単純さを、ほぼすべてのソフトウェア設計決定に影響を与えるコアバリューとして認めています。同様に、伝説的なエンジニアであるエイダ・ラブレスは、計算機械における単純性を提唱したとしばしば引用されています(ただし、時には不正確に)。 この原則は、数多くの思想家によって裏付けられてきました。アルバート・アインシュタインは「すべてはできるだけ単純にすべきだ。ただし、単純にしすぎてはならない」と有名な言葉を残し、単純さは機能に奉仕しなければならないというニュアンスを捉えています。ソフトウェアでは、「一つのことをうまくやれ」というUnix哲学が、オペレーティングシステム設計全体にKISSを反映しています。この原則の持続力は、その普遍的な適用可能性に由来しています。単純さは、ほぼすべての人間の営みにおいて、コスト、エラー、認知負荷を削減するのです。

要点

1

単純さは故障点を減らす

すべてのコンポーネント、機能、コード行は潜在的な故障点です。単純なシステムは、問題が発生する場所が少なく、問題が発生したときにトラブルシューティングが容易になります。
2

複雑さは時間とともに複利で増える

初期の複雑さは管理可能に思えますが、保守がそれを複利で増やします。各機能は既存の機能と相互作用し、潜在的な問題の指数関数的な成長を生み出します。単純に始めることで、この蓄積を防ぎます。
3

単純なソリューションは修正が容易

複雑なシステムは、修正の全体的な影響を理解するために複雑な相互依存関係を把握する必要があるため、変化に抵抗します。単純なシステムは全体的に理解できるため、修正が安全になります。
4

明確さは賢明さに勝る

賢明に見えるコードは、作者だけが理解していることが多いため、時間の試練に失敗します。単純で明らかなコードは、誰でも保守でき、人事異動の試練に耐えます。

応用場面

ソフトウェア開発

読みやすく保守可能なコードを書いてください。明確な変数名、単純なアルゴリズムを使用し、過剰な設計を避けてください。機能する50行のソリューションは、説明が必要な10行のソリューションより優れています。

プロダクトデザイン

最小限のトレーニングで直感的に使えるインターフェースを持つ製品を作ってください。すべての機能は、技術的な能力を示すのではなく、実際のユーザーの問題を解決することで自身の存在意義を証明すべきです。

ビジネスプロセス

ワークフローを簡素化し、不要な手順を排除してください。複雑な承認プロセスは、結果を比例して改善することなく、遅延と不満を生み出します。

プロジェクト管理

本質的な成果物のみを含むようにプロジェクトスコープを定義してください。各追加をコア目標に対して厳密に評価することで、機能の範囲拡大を避けてください。

事例

2000年代初頭、Googleの検索インフラはKISSの原則を象徴的に体現していました。大規模な機能セットを持つ精巧なエンタープライズシステムを構築する代わりに、Googleの初期エンジニアは柔軟に組み合わせられる単純で信頼性の高いコンポーネントを構築しました。分散ファイルシステム(GFS)と並列処理フレームワーク(MapReduce)は、その単純さにおいてエレガントでした。一つのことをうまくやり、連鎖させて複雑な問題を解決したのです。この単純さにより、Googleのインフラは、はるかに複雑なシステムを構築した競合他社と比較して、比較的控えめなエンジニアリングのオーバーヘッドで、数百万件のクエリから数十億件のクエリへのスケールを可能にしました。教訓は明確です。単純で焦点を絞ったコンポーネントは、複雑で機能豊富なものよりよくスケールするということです。

境界と失敗モード

KISSの原則は強力ですが、重要な制限があります。第一に、過度の単純化は必要な機能を犠牲にする可能性があります。すべての複雑さが必要ないわけではありません。問題の中には本当に洗練されたソリューションを必要とするものもあります。鍵は、本質的な複雑さと偶発的な複雑さを区別することです。 第二に、ある対象にとっての単純さは、別の対象にとっての単純さとは限りません。専門家にとって単純なシステムは、初心者には理解不能かもしれません。KISSの原則は、システムの保守と使用を担当する人を考慮する必要があります。 第三に、単純すぎる単純さは脆弱性を生む可能性があります。時には抽象化のレイヤーを追加すること(即時の複雑さを増す)が、後により大きな複雑さを防ぐことがあります。この原則は、不要な複雑さを排除することを奨励すべきであり、必要な複雑さを避けることではありません。

よくある誤解

単純さは、可能な最小限を行うことではありません。不要な要素を排除しながら、完全な機能を維持することです。真に単純なソリューションは、複雑なものよりも多くの思考を必要とすることが多いです。
イノベーションは、複雑な問題に対するより単純なアプローチを見つけることから生まれることが多いのです。真のイノベーションは、しばしば追加ではなく、何かを取り除くことを意味します。
この原則は普遍的に適用されます。ビジネスプロセス、組織設計、コミュニケーション、プロダクト開発、そしてシステムやソリューションを含むほぼすべての人間の営みに適用されます。

関連コンセプト

オッカムの剃刀

競合する仮説の中で、前提が最も少ないものを選ぶべきです。KISSは、この哲学的原則の実践的応用です。

YAGNIの原則

実際に必要になるまで機能を構築しないでください。YAGNIは、時期尚早な複雑さを防ぐソフトウェア開発におけるKISSの特定の応用です。

DRYの原則

自分を繰り返さないでください。重複を減らすことでコードを単純化し、システムの保守と理解を容易にします。

Unix哲学

ソフトウェアは一つのことをうまくやるべきです。この設計哲学は、システムレベルでKISSの原則を体現しています。

Minimum Viable Product

価値を届ける最も単純なプロダクトを構築し、フィードバックに基づいて反復します。KISSは、本質的な機能を重視することでMVP戦略に情報を提供します。

一言で言うと

単純に保て。複雑さは追加するのは簡単だが、保守にはコストがかかる。常に機能する最も単純なソリューションから始め、必要であることが証明された場合のみ複雑さを追加せよ。