# 「機能し得る最も単純なこと」を行い、必要になったときだけ追加するべき理由

NeoTechNews編集部

2025-08-29という出来事の日付に、あるソフトウェア設計の論考が、エンジニアリングにおける最も古い助言の一つをよみがえらせ、より明確な意味を与えた。それは「機能し得る最も単純なことを行え」というものだ。[16135]

著者が批判の対象とするのは、エンジニア、特に利用可能なインフラツールの多様さに胸を躍らせる人々に共通する設計上の本能である。多くのチームは現在のシステムと目の前の要件から出発するのではなく、高度な拡張性を持ち、洗練された形で分割され、将来のあらゆるシナリオに備えた理想的なアーキテクチャを想像することから始める。[16135] 論考は、これは順序が逆だと主張する。

代替案は、エンジニアリングを否定するミニマリズムではない。著者によれば、難しいのは既存システムを深く理解した上で、現実の問題に完全に対処できる最も手の込んでいない解決策を選ぶことである。[16135] この見方では、優れた設計は外から見ると往々にして印象的ではない。新たな要件によって本当に必要になるまでは、コンポーネント、サービス、抽象化を追加しないからだ。[16135]

いくつかの例が、この主張を具体的に示している。レート制限を必要とするGolangサービスの場合、最初にRedisのような永続ストレージを追加し、リーキーバケット・アルゴリズムを実装しようと考えるかもしれない。[16135] それでも機能するだろう。しかし論考は、機能する最も単純な答えは、代わりにメモリ内カウンターを使うこと、あるいはレート制限にすでに対応しているエッジプロキシを設定することではないかと問いかける。[16135] そうした、より容易な手法が実際の制約を満たせない場合に限り、チームはより多くのインフラへと段階を進めるべきだという。[16135]

著者はこの論理を、一般的なプロダクト構築戦略へと広げる。まず絶対的に最も単純な解決策から始め、要件が変わったときにだけ拡張するというものだ。[16135] 論考はこれを、より流行している多くの原則より上位にYAGNIを置き、支配的な設計原則として扱うことになぞらえている。[16135]

重要なことに、情報源は反論を予想している。その一つは、「最も単純なこと」が、雑な応急処置をリリースして壊れやすい混乱を蓄積する許可のように聞こえるというものだ。著者はこの考えを明確に退け、応急処置は、将来の開発者が永遠に覚えておかなければならない隠れた複雑さを加えるため、実際には単純でない場合が多いと主張する。[16135] 適切な修正が難しいのは、別の例外を重ねるのではなく、複雑さを取り除くのに十分な理解を必要とするからにほかならない。[16135]

もう一つの反論は定義に関するものだ。誰にとって、どのような条件の下で単純なのか。著者は、エンジニアの間で何が単純かについて意見が食い違うことが多いと認めている。[16135] その曖昧さを検討するため、論考は直感的な基準を提示する。要件が変わらなければ、より単純なシステムの方が安定していることが多いというものだ。[16135] 同じ問題を解決する二つの設計のうち、一方が他方より継続的な作業を多く必要とするなら、保守負担の少ない選択肢の方が単純さを主張する上で有力である。[16135]

この論考はまた、よく知られたツールを用いて、優れた設計がいかに地味に見え得るかを示している。Unixの基本機能を活用して重要な保証を実現するウェブサーバーの例としてUnicornを挙げ、標準的なRails REST APIを、派手なアーキテクチャなしで多くのアプリケーションに必要なものを正確に提供する、強力だが退屈なパターンとして紹介している。[16135]

この論考が共感を呼ぶ理由は、標語の新しさではない。抑制を専門性として捉え直す点にある。若手エンジニアは、複雑さが真剣さの証明のように感じられるため、自分が知っているあらゆるツールを使いたがることが多い。著者はその逆を主張する。熟達はしばしば、忙しく動く姿ではなく、静止した姿として現れる。[16135]

提供された証拠からは、抑制的だが意味のある結論が導かれる。これはソフトウェア設計において、規律を持って段階的に拡張することを求める主張である。現実が要求したときに、データベース、キュー、抽象化、分散システムを追加する。それまでは、優れたエンジニアリングの多くは、より少ないもので十分なときを見極めることから成る、と著者は述べている。[16135]