HN 日本語サマリー

← 一覧へ戻る
プログラミング

現時点での最良のシンプルなシステム

Best Simple System for Now (dannorth.net)

70 pointsby daan-k15 コメント

要約

本記事は、ソフトウェア開発における「完璧主義」と「実用主義」の二項対立に対し、第三の道として「現時点での最良のシンプルなシステム(BSSN)」という考え方を提案しています。BSSNは、現在の製品ニーズを満たす最もシンプルなシステムであり、将来を予測せず、必要最低限の堅牢性を持つコードで記述されます。このアプローチは、過剰な設計や技術的負債の蓄積を防ぎ、変化への適応性を高めることを目指しています。

全文翻訳

目次 3 Feb 2025 26 分 プログラミング ソフトウェア アジャイル ケーキを食べても、うまく焼けば残しておける。 「手っ取り早く済ませて後で代償を払うか、丁寧にやって今払うか。」これはソフトウェア開発における「完璧主義」と「実用主義」の根本的な二項対立のように思えるが、全くトレードオフである必要はないと私は考えている。 CTOの友人は、山の二つの道を切り開く比喩を使っている。左の道は迅速かつ雑で、マチェーテと力任せで切り開かれる。誰もついてくることを期待せず、ただ道を切り開くだけだ。しかし、すぐに進歩できる。右の道は、より広く、より明確で、舗装された道であり、より堅牢だが、進みながら構築するのに時間がかかる。左の道は、トレイルの先に何があるかを確認するために偵察するのに役立つ。右の道は、トレイルが安全であることを知って、皆を導く場所だ。 私の友人は、左の道を進む人々(彼の仕事はトレーディング会社なので、この議論は非常に重みがある!)と、回復力があり持続可能な製品を構築したい右の道の人々の間で、常に緊張状態にある。これは私が関わってきた多くの組織を説明している。両側の緊張は、「もう一方の方法」が間違っているという考えに基づいている。右派の支持者は、左派が技術的負債を積み上げており、それが「実用主義」の名の下に彼らを苦しめることになると心配している。左派の人々は、右派の人々が「完璧主義者」であり、過剰設計や金メッキをしていると考えている(そして、しばしば多くのビジネスマネージャーが彼らに同意するために並んでいる)。 私は、両方が見落としている中間的な道があると提案する。私はこの道を「現時点での最良のシンプルなシステム」、またはBSSNと呼ぶ。この考え方を形成するのに長い時間がかかった。それは長年「平易な場所」に隠されていた。いくつかの情報源がこれを暗示しているか、少なくとも示唆しているが、私はそれを明示的に述べたことはない。ここにそれを提示する。 現時点での最良のシンプルなシステムの特徴 現時点での最良のシンプルなシステムは、現在の製品のニーズを満たす最もシンプルなシステムであり、適切な基準で書かれている。それは余分な、あるいは過剰に設計されたコードを持たず、持っているコードは必要なだけ堅牢で信頼性が高く、それ以上でもそれ以下でもない。 「現時点での最良のシンプルなシステム」の各部分は意図的であり、各部分は相互に補強し合っている。いずれかの部分に逸脱があれば、それはもはや「現時点での最良のシンプルなシステム」ではなく、厳密にはそれより劣るものとなる。それぞれの部分を詳しく見ていこう。 現時点では システムは将来を一切予測すべきではない。これは、私がプログラマーとして受けた、あるいは与えた、ほぼすべての助言に反する! プログラマーが問題に直面すると、私たちは一般的な解決策に偏る。それに関するxkcdもあるので、それは真実であるはずだ。 私たちは「それはルールエンジンだ!」とか「それはステートマシンだ!」からほんの少しの飛躍しか離れていないので、私たちの効率的なエンジニアリングの心は、時間を節約し、やり直しを避けるために、すぐにこの解決策に手を伸ばすことを決定する。この決定の一部は、各変更にはコストがかかるという知識であり、したがって、どこかに到達するためにいくつかの小さなステップを踏むことは、私たちが「知っている」必要な大きな一歩を踏むことよりも常に非効率的であるということだ。 私たちは、自動的かつ無意識的なパターンマッチングに頼って、意識的な処理のための余地を作る。ダニエル・カーネマンの『ファスト&スロー』では、これらをそれぞれシステム1とシステム2と呼んでいる。パターンマッチングは無意識のシステム1活動であり、私たちはそれに長けており、自然にできてしまう。「実際に見えているものを見る」ことはより困難であり、意識的な思考と努力を必要とする。 現時点での設計はこれの対極にある。それは、あなたの脳が提示するパターンにもかかわらず、実際に見えているものを見る芸術である。これはBSSNの核心であり、「ビソン」と発音されるかもしれない。私たちがしばしばシェービングすることになるヤクの仲間として。 シンプル 何かを設計する際、通常は対立する二人の自分がいる。「賢い」自分、つまり数十年分の経験と大きなエゴを持つ自分は、ここにあるものが次に変わることを知っているので、それをインターフェースにすべきだと知っている。あるいは、ほぼ間違いなくこの量のデータを持つことになるので、単純なシリアルアルゴリズムではなく、この並列バージョンを構築することにしようと考える。より謙虚な自分は、私の予測は常に間違っているだろうと知っている。なぜなら、私は何度も何度も間違ってきたからだ。だから、今は保留にした方が良いかもしれない。より謙虚な自分は通常負ける。 だから、未来が起こるとき、私は二つのモードのどちらかになる。一つは、私の予測が次に起こったことと少し違っていたために、私が下した仮定の周りで作業すること。もう一つは、コードを元に戻して、私が望むように柔軟に変更できるものに戻すこと。しかし心配しないで、私の賢い自己は私に、これは一度きりのことだった、そして次回は正確にうまくやるだろうと保証してくれる!これは私に何度も起こる。私は30年以上お金のためにソフトウェアを書いてきたので、もうわかっているはずだが、そうではない。 長年にわたり多くのコードベースを見て、そこで作業してきた経験から、これは他のすべての人にも起こっていると静かに確信している。私が遭遇するほとんどのコードには、投機的な継ぎ目やインターフェースがあり、それは何十年も前のものだ。それらは、それが提供する12人のユーザーではなく、20,000人の同時ユーザーにとって素晴らしいものだったであろうアルゴリズムや技術の選択だ。私の想像を絶する「スケーラビリティ」や「柔軟性」のためのフックや拡張ポイントがあり、おそらくこれが彼らの最高傑作システム、彼らのキャリアを定義するシステムになるだろうという希望のもとに書かれている。そしてもちろん、このコードは、これらすべての複雑さの相互作用による微妙なバグで散乱している。 私が繰り返し学んだことは、シンプルさは現在の関数であるということだ。つまり、私は現在の要件と制約のために、常に最も少ない複雑さを探し求めている。これらの要件と制約が変わると、「シンプル」の定義も必然的に変わる。 「完璧は、付け加えるものがなくなったときではなく、取り除くものがなくなったときに達成される。」— アントワーヌ・ド・サン=テグジュペリ この定義によれば、私たちは完璧を求めている!現在のシステムから何かを取り除いても、それが現時点で必要とするものをまだ提供できるなら、それは決してそこにあるべきではなかった。 BSSNは、すべての可能な未来に対応することによって「将来性」、「スケーラビリティ」、または「柔軟性」を達成するのではなく、非常にシンプルであることによって、私たちが望むように柔軟に対応できる。もしそれがより高い負荷を処理する必要があるなら、私たちはそれを達成できると確信している。もしそれがより広い範囲の入力を管理する必要がある、または異なる検証を提供する、あるいは予期しないアップストリームまたはダウンストリームサービスと統合する必要があるなら、私たちはそれも同様に容易にできると確信している。もしそれがまだ考慮していない次元に沿って進化する必要があるなら、私たちは他のどのソリューションよりも容易にそれを実行できるだろう。 投機的なインターフェース、過度に広いデータ型、特定のコードが適している場合に汎用的な機能はない。代わりに、それは非常に意見が強く、意図的に狭い設計になっている。 逆に、私はギャルの法則1を現実世界で何度も経験してきた。エンタープライズデータ辞書から汎用ワークフローソリューション、クリックオペレーション設定可能なルールエンジンまで、失敗への避けられない3〜5年の軌跡がある。 「機能する複雑なシステムは、機能するシンプルなシステムから進化したものであることが常に発見される。最初から設計された複雑なシステムは決して機能せず、機能するように修正することもできない。機能するシンプルなシステムからやり直す必要がある。」— ジョン・ギャル ベスト 物事をシンプルに保つことは、手抜きを意味しない。どのような状況でも、物事を行う正しい方法があり、私たちはそれを行うことを選択できる。完璧主義者と実用主義者の両方にとっての課題は、「正しい方法」が文脈依存であるということだ。ビジネスの核となる機能を支えるコード