誤った抽象化より重複を(2016)

2026/06/22 1:08

誤った抽象化より重複を(2016)

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

開発者にとって最も重要な点は、コードを複製することが誤った抽象化を作成することよりも遥かに安く、安全であるということです。共有されたロジックが保守しづらくなったら、最適な解決策は通常、人工的な組織化を強制するのではなく、その具体的な呼び出し元にコードをインラインに書き戻すことです。このアプローチは、複雑さが増しても頑固に陳腐化した構造を維持しようとするプログラマーが見せる「沈没コストの罠」という現象に逆らいます。条件付け過多の冗長な手続き——不要な引数や if 文で混雑した肥大化関数——を取り除くことで、開発者はよりシンプルで回復力の高いソフトウェアを作り出します。もしコードが要件を満たすために引数を追加したり、条件分岐を追加したりする必要があれば、その抽象化は正しくありません。最も速い進め方は通常、「後退」ではなく「後方へ戻ること」です。この哲学を裏付けるかのように、著者は RailsConf 2014 で人気となった講演を拡張リソースとともに再公開し、書籍シリーズ「99 Bottles of OOP」の第 2 版をリリースしました。新刊は約 50% 長く、3 つの新たな章と、Ruby、JavaScript、PHP のそれぞれの独立した本が含まれています。これらは、様々な飲み物テーマにちなんで命名された各エディションで、ePub、PDF および他の形式で利用可能であり、これら資源により、悪質な抽象化よりも複製を優先するという重要なレッスンをより幅広い聴衆がアクセスできるようになりました。

本文

「誤った抽象化」への抵抗と進歩:沈没コストの罠から抜け出す方法

RailsConf 2014 の講演「すべて的小事なこと」で提唱した**「重複することは、誤った抽象化を作るよりもはるかに安くつく」**という考え方を再考します。 このアイデアに対し、多くの人々から「これこそ一万回も!」といった強力な共感と支持が集まりました。

1. 「誤った抽象化」が招く悪循環

一度作られた抽象化は、その存在自体に「正しい」という権威を持っています。しかし、要件が変わるにつれて以下のパターンが発生します:

  • 重複の発見: プログラマー A がコード内の重複を見つけます。
  • 新抽象化の作成: 重複に対処するために新しいメソッドやクラスを作成します(「コードは完璧だ」と思い込んじゃう)。
  • 時間の経過と新要件: 新しい要件が現れます。元の抽象化では対応できず、「ほぼ完璧」な状態だったものが通用しなくなります。
  • バリエーションの増加: プログラマー B が実装を担当し、すべてのケースに対応するために引数を追加したり、条件分岐を追加したりします。
  • 複雑化への陥落: さらに新しい要件(プログラマー X など)が現れれば、さらに引数や条件分岐が増え、「while 繰り返す」ようにコードは理解不能になります。

なぜ変更したくないのか:沈没コストの罠

既存のコードには強力な影響力があります:

  • 努力の保全: コードを作成するための労力や投資(インベストメント)を守るという動機が強力です。
  • 無意識の囁き: 「これほど混乱しているのを正すのは時間がかかろう」「膨大な努力を無駄にするのは罪だ」という心理が働きます。

この結果、第 8 ステップのあなたが直面するのは、「既存のコードを変更して新要件を実装せよ」という圧力です。しかし、その試みは苛烈なものになります:

  • コードは単一の抽象化ではなく、複数の漠然としたアイデアを埋め込んだ条件付き手続きになっている。
  • 理解が難しく、壊れやすくなる。

2. 最速の前進は「後退」することです

このような状況(誤った抽象化)に直面した際、沈没コストの罠に引きずられそうになったら抵抗してください。 進むためには、実際には後退する必要があります。

具体的なアクションプラン

以下の手順でコードを整理し直します:

  1. インライン化: 抽象化されたコードをすべての呼び出し先へ埋め込み(インライン展開)、再び重複を導入する。
  2. 特定化: 各呼び出し先内部で、渡された引数に基づき、そのケースに必要な分のみを選択する。
  3. 削除: その呼び出し先に不要な部分は大胆に削除する。

これにより:

  • 抽象化と条件分岐の両方を取り除く。
  • 各呼び出し元は、実行されるべきコードだけに還元される。

この「巻き戻し」を行うと、表面的には共有された抽象化を呼んでいたにもかかわらず、実際に実行されていたのは意外にもユニークなコードだったことに気づきます。古い抽象化を完全に削除した後、再び出発点とし、重複を取り出して新しい正しい抽象化を作成し直すことができます。

失敗しないためのマインドセット

過去に、誤った抽象化のまま無理に進み続けようと努力しましたが、ほとんど成功しなかったケースがありました:

  • 困難の蓄積: 新機能追加は極めて難しく、コードが複雑になり、次の追加をさらに困難にする悪循環に陥る。
  • 視座の変化:
    • 「このコードへの投資を守らねばならない」ではなく、
    • **「このコードは一時期意味がありましたが、恐らくそこから学ぶべきことはすべて学んだでしょう」**と捉え直す。

現在の要件に基づいて抽象化を見直し許容した瞬間から、全てが簡単になります。インライン化した後、進む道は明確になり、新機能の追加も急速かつ容易になります。

3. 教訓

コードをシンプルに保つための心構え

  • 沈没コストの罠に陥らないこと
  • 引数を渡したり、共有コードを通じて条件分岐を増やすことは、抽象化が誤っているサインです。当初は正しいとしても、その時はいくかもしれません。
  • 誤った抽象化と認識した瞬間、最適な戦略は再び重複を導入し、正解を見極めるまで待つことです。

いくつかの条件分岐を蓄積して状況を洞察することはありますが、誤った抽象化を早めに放棄するほど痛みは減らせます

結論

「抽象化が間違っている場合、最速で前に進む道は後退すること」です。 これは撤退ではありません。より良い方向への前進です。やってみてください。あなたの人生だけでなく、その後に続くすべての開発者の生活も改善されるでしょう。


ニュース:『99 Bottles of OOP』第 2 版リリース!

オブジェクト指向設計の教科書とも言える『99 Bottles of OOP』第 2 版がリリースされました!

今回の主な変更点

  • 新章追加: 第 1 版に比べ、約 50% も長大な内容です。3 つの新章を収録。
  • 言語不依存: テクニカルな内容は共通ですが、サンプルコードとして Ruby, JavaScript, PHP の 3 言語を使用しています。
  • 多様なフォーマット:
    • 言語バリエーション: Ruby 版 / JavaScript 版 / PHP 版(3 バリエーション)
    • トーンバリエーション: ビール味 / ミルク味(2 バリエーション)
    • 配布形式: epub / kepub / mobi / pdf(4 フォーマット)

合計 $3 \times 2 \times 4 = 24$ 種類の書籍が存在しますが、内容は全て同一です。購入者はこれらのオプションから自由に選択・ダウンロード可能です。

同じ日のほかのニュース

一覧に戻る →

2026/06/22 6:29

アペルトス:主権 AI 向けのオープンファウンデーションモデル

## Japanese Translation: スイス AI イニシアチブによって、EPFL、チューリッヒ工科大学(ETH)、CSCS の協力により、画期的な完全にオープンな多言語 AI モデルが開発されました。本モデルは、全データの透明性を確保しながら強力な技術への即時アクセスを提供します——再現性を確保するため、すべてのデータ、コード、重み付け、手法、アライメント原則が文書化されています。1,000 以上の言語から DAY ONE にトレーニングを開始し、8B および 70B パラメータ規模の両方で競争力を誇る性能を実現しています。EU AI アクトの要件に厳格に準拠しており、データ opting-out を尊重し、個人情報を削除するとともに、メモライゼーションを防止します。スイスエコシステム内でスイスコミが戦略パートナーとして携わっており、本イニシアチブはさらなる開発のためのグローバルなスケーラブルな基盤となっており、強力な能力と責任ある管理の間でバランスを保つ道徳的で再現可能な枠組みを確立しています。

2026/06/22 6:40

私の以前の職場は不正行為があるためにだけ存在していたのでしょうか?

## Japanese Translation: 最も重要な教訓は、UK のスタートアップ GenieDB が、そのコア技術革新は後に真面目な業界プレイヤーによって採用されたにもかかわらず、ポートフォリオの成長のためではなく、投資家の資金を手数料主導で吸い上げるための仕組みを可能にするために、Stuart Frost 所有の US ベンチャーファンド「Frost VP」に買収された点である。GenieDB は M&A を狙って収益機会を積極的に見送っており、顧客数は最大 3 ヶ社を超えたことがなかった。また、チームが交代させられ、U.S. に残ったのは著者の一人だけだった。10 年後、Frost VP が SEC から詐欺容疑で訴えられたというニュースが明らかになり、同社は関連のないサービス(例:料理人を雇う個人シェフサービス、クリーニング業者、ビザスポンサーシップやマーケティング会社など)に対して過剰な手数料を徴収するインキュベーターとして活動していたことが判明した。仲裁の結果、投資家が勝訴し、反訴では上記のような詐欺の嫌疑が詳細に記載されていた。Frost は当初、投資家との共謀を主張したが、証拠に立ち向かうことができず敗訴した。GenieDB の CEO やインサイダーは両方とも、投資がこの手数料モデルに動機付けられていたことを認めたが、裁判所は GenieDB がなぜポートフォリオに加わったのかについて具体的な理由を判定することはなかった。このスキームは資金残高を枯渇させ、著者の人生軌道(U.S. 市民権の喪失やキャリアの安定性への影響を含む)を変え、さらに Frost から資金管理の禁止という恒久的な禁制を下すことで、事実上 Frost VP の運営を終了させた。この事例は、高額手数料型のインキュベーターモデルについて鋭い警告を示しており、詐欺的な手数料構造が正当な企業価値を覆い隠し、投資家や従業員双方に壊滅的な長期的影響をもたらす可能性があることを示している。

2026/06/22 6:10

すべては対数なりである

## Japanese Translation: 以下の文章は、情報のすべてを維持しつつ、流れと簡潔性を向上させるための改訂版である: > 本書は、対数($\log N$)を具体的な底を持たない抽象的な実体として捉え直すことで、特定の単位や底が選択される場合にのみ数値的値を獲得するという視点を提案する。この見解は、点そのものが基礎的なものであり、原点の選択を行うことで初めて数値的な変位(displacements)となるベクトル幾何学の概念と直接的な対応を確立する。この枠組みにおいて、対数の底の変更は物理的な単位系の変更、あるいは微積分における微分形式の書き換えに等しい。この議論は対称性を他の分野にも拡張しており、$p$ 進評価($p$-adic valuation)や複素解析における消滅位数(order of vanishing)は、対数代数的構造内での投影として機能し、さらにベクトル空間の対数としての振る舞いを見せる次元などは、分数次元といった仮想的な構成すら許容する。自然対数を多項式の振る舞いと関連付ける極限や導関数を通過して再定義することで、本書は次元、導関数、評価という一見異なる概念が、乗法的構造と加法的结构との間のより深い同型写像(isomorphism)の現れであるとして論じる。結局のところ、この視点を採用することにより、数学に一般共変性(general covariance)を適用することは、冗長な単位依存記号によって遮られている単純で座標freeな実在にアクセスする手段を示唆している。

誤った抽象化より重複を(2016) | そっか~ニュース