ディスカッション (11件)
優れたソフトウェア開発には、古くから語り継がれるいくつかの「法則」が存在します。これらを意識するだけで、設計の迷いが減り、生産性が劇的に向上します。ここでは、現場で役立つエッセンスを整理しました。
ボイドの反復の法則が抜けてるな。「複雑さを分析する際、深い分析よりも高速な反復の方がほぼ確実に優れた結果を生む」というやつだ。ボイドといえばOODAループを考え出した人として有名だね。
こういう「法則」って内部矛盾を大量に抱えてるから注意が必要。今回みたいにずらっと並べられると、自分の都合のいいように正当化できるやつを一つ選んで持ち出せちゃうからね。結局、どの法則をいつ、なぜ破るべきかを知っていることこそが一番難しいんだよ。
カーリーの法則がないじゃないか。 「変数は一つのことだけを意味すべき。ある状況ではこの意味、別のタイミングでは別のドメインの値を保持するとか、一度に二つの意味を持つべきじゃない。床用ワックスでありデザートのトッピングでもあるような代物であってはならない。常にたった一つのことだけを意味するべきなんだ。」
「時期尚早な最適化は諸悪の根源」か。ソフトウェア工学の原則でこれほど嫌いなものはないよ(SOLIDもいい線いってるけど)。 忘れてはいけないのは、これが1974年の論文からの引用だってこと。当時は今とは計算環境が全く違ったし、最適化の概念も別物だった。当時はアセンブリコードを書いてサイクルを数えることが最適化だったんだ。今でも特定のアプリケーションではやるけど、現代のパフォーマンスはアーキテクチャの選択で決まる部分が大きく、最初から考慮しておく必要がある。1974年にはそもそもアーキテクチャの選択肢なんてなかったし、ハードウェアがそれを許さなかったからね。 「クリティカルな3%」に集中する(つまりプロファイリングする)のは今でもいいアドバイスだけど、それは主に「パフォーマンスのバグ」、例えば意図せず二次関数的になっているアルゴリズムとか、ループ内で不要に繰り返されている処理なんかを修正するのには役立つ。でも、そうした問題を片付けた後に気づくんだ。時間の90%を抽象化の処理に費やしていることに。そしてその時点で修正するのは手遅れだから、キャッシングや並列化なんかを後付けすることになる。結果としてコードは複雑になり、最初からパフォーマンスを考慮していた場合よりも遅いものが出来上がる。今の時代、遅すぎる最適化は時期尚早な最適化と同じくらい、あるいはそれ以上にたちが悪いよ。
カーニハンの法則は大好きだよ。「デバッグは、コードを書くことの二倍の難しさがある。つまり、自分がいかに頭を使ってコードを書いたとしても、そのコードをデバッグできるほどの知能は自分にはない、ということだ」
「ソフトウェア工学の『法則』一覧」なんてページをわざわざ作るんじゃなくて、Vibe-code(感覚的なコード生成)でウェブサイト丸ごと作っちゃうっていう、その行為自体を禁じる法則なんて名前はないのかい?
ソフトウェア工学だけに限定した話じゃないけど、インターンや新人に最初に教える「法則」はチェスタトンのフェンスだね。
ソフトウェア工学の法則(2026年更新版)
- 全てのウェブサイトはClaude Opusを使ってVibe-codeされるようになる。
結果としてこうなる:
- 背景色はAnthropicを表現するためにクリーム系の色になる。
- タイポグラフィを覚えたてのデザイン学生が作ったかのように、同じページ内でフォントの種類やウェイトが無駄に多用される。
- スタイルがバラバラなカードが大量に並び、そのかなりの数がホバー時かあるいはデフォルトで、カードの「ちょうど一辺だけ」に色付きの丸いボーダーを纏っている。
テスラーの複雑さ保存の法則は、この一文だけで直感的に理解できる気がする。「全てのアプリケーションには不可避な複雑さが内在しており、それは移動させることはできても排除することはできない」 でも、その後の解説を読むと、結局「ユーザーに負担をかけるな」というありきたりな提案に落ち着いてしまっているように感じる。これにはあまり興味が持てないな。ユーザーが必要とする複雑さは、どんなことをしていようと必要なわけで、それを無理やり減らせばアプリケーションは融通の利かないおもちゃになっちゃう。だから、ある程度までは当たり前のことだよ。 リファクタリングをする時に思い出してほしいのは、システムのどこか一部を単純にしようとすると、往々にして別の場所が複雑になるってことだ。なぜわざわざ二回書き直して、結局同じくらいひどい状態に終わるようなことをするのかって話さ。
この記事へのコメントの中でこれが最高なのに、なぜか削除されちゃったな。
「ソフトウェア工学のメタ法則:ソフトウェア工学のあらゆる法則は、即座に誤解釈され、作成者が腰を抜かすような形で無思慮に適用される。LLMが重要なコンテキストを欠いたまま振る舞う様子を観察できる今なら、なぜそうなるのかが理解できるだろう。」
要するに、何十年もの知恵と経験を、パンチの効いたたった一行の引用に凝縮することなんてできないってことだよ。