ソフトウェア開発における抽象化の漏れとは、システムの根本的な複雑さを簡素化して隠蔽することを目的とした抽象化が、その目的を完全に果たせなかった設計上の欠陥を指します。その結果、実装の詳細の一部が抽象化によって露出または「漏れ」てしまい、ユーザーはシステムを効果的に使用したりトラブルシューティングしたりするために、これらの根本的な複雑さについての知識を持たなければなりません。[1]
この概念はジョエル・スポルスキーによって普及した。彼は「漏れやすい抽象化の法則」という用語を作り出した。[2]
すべての非自明な抽象化は、ある程度、漏れがあります。
これは、適切に設計された抽象化であっても内部の仕組みを完全に隠蔽できない可能性があることを意味し、コンピュータ システムが複雑になるにつれて、そのような漏洩の可能性が高まります。これらの漏洩は、パフォーマンスの問題、予期しない動作、および抽象化とそれが隠蔽することを意図した基礎となる詳細の両方を理解しなければならないソフトウェア開発者の認知負荷の増加につながる可能性があります。これは、ソフトウェアの欠陥の原因、つまりソフトウェア開発者が抽象化の絶対確実性に依存していることを浮き彫りにします。不完全であるにもかかわらず、抽象化はソフトウェア開発において複雑さを管理するために不可欠ですが、常に完璧であるとは限りません。
歴史
「漏れやすい抽象化」という用語は、2002年にジョエル・スポルスキーによって普及しました。[2] [3] 1992年のキツァレスの論文では、不完全な抽象化に関するいくつかの問題について説明し、抽象化自体のカスタマイズを可能にすることで問題に対する潜在的な解決策を提示しています。[4]
ソフトウェア開発への影響
システムが複雑になるにつれて、ソフトウェア開発者はより多くの抽象化に頼らなければなりません。各抽象化は複雑さを隠そうとし、開発者が現代のコンピューティングのさまざまなバリエーションを「処理」するソフトウェアを作成できるようにします。
しかし、この法則は、信頼性の高いソフトウェアの開発者は、抽象化の根底にある詳細をいずれにせよ学習する必要があると主張しています。
例
Spolsky 氏の記事では、ソフトウェア開発に問題を引き起こす、漏れやすい抽象化の例を多数挙げています。
- TCP /IPプロトコル スタックは、信頼性の高い情報配信を試みるTCPと、「ベスト エフォート」サービスのみを提供するIPの組み合わせです。 IP がパケットを失うと、TCP はそれを再送信する必要があり、追加の時間がかかります。 このように、TCP は信頼性の高い接続の抽象化を提供しますが、実装の詳細は、パフォーマンスが変動する可能性がある形で漏れ出ます (データを再送信する必要がある場合、スループットと待ち時間の両方が低下します)。また、接続が完全に切断される可能性もあります。
- 大規模な 2 次元配列を反復処理する場合、要素がメモリに格納される順序によっては、垂直方向ではなく水平方向に反復処理するとパフォーマンスが根本的に異なることがあります。一方向では、キャッシュ ミスとページ フォールトが大幅に増加する可能性があり、どちらもメモリへのアクセスを大幅に遅らせます。
- SQL言語は、データベースを照会するための手順を抽象化して、必要なものを定義するだけで済むようにします。ただし、特定の SQL クエリは、他の論理的に同等のクエリよりも何千倍も遅くなります。さらに高いレベルの抽象化では、リレーショナル データベースを使用したオブジェクト永続性の実装からオブジェクト指向コードを分離するORMシステムでも、ORM 生成クエリのパフォーマンスが問題になるとすぐに、プログラマーはデータベース、テーブル、ネイティブ SQL クエリの観点から考える必要があります。
- NFSやSMBなどのネットワーク ファイル システムを使用すると、リモート マシン上のファイルをローカル ファイルのように扱うことができますが、リモート マシンへの接続が遅くなったり切断されたりして、ファイルがローカル ファイルのように動作しなくなる場合があります。
- ASP.NET Web フォーム プログラミング プラットフォーム (ASP.NET MVCと混同しないでください) は、ハイパーリンクのクリックを処理するコンパイル済みバックエンド コード (
<a>) とボタンのクリックを処理するコードの違いを抽象化します。ただし、ASP.NET では、HTML ではハイパーリンクからフォームを送信する方法がないという事実を隠す必要があります。これは、数行の JavaScript を生成し、ハイパーリンクにonclickハンドラーをアタッチすることで行われます。ただし、エンド ユーザーが JavaScript を無効にしている場合、ASP.NET アプリケーションは正常に動作しません。さらに、ASP.NET のイベント ハンドラーを、 Windows フォームなどのデスクトップ GUI フレームワークと同じように単純に考えることはできません。Web の非同期性のため、ASP.NET でイベント ハンドラーを処理するには、サーバーとのデータ交換とフォームの再読み込みが必要です。
2020年、マサチューセッツ工科大学のコンピューターサイエンスの教員であるアニッシュ、ホセ、ジョンは、gitのコマンドラインインターフェースは漏れやすい抽象化であり、gitを効果的に使用するには、gitデータモデルの基盤となる「美しい設計」を理解する必要があると主張しました。[5]
参照
参考文献
- ^ セイベル、ピーター(2006年11月1日)。実践的Common Lisp。Apress。p.96。ISBN 978-1-4302-0017-8。
- ^ ab Spolsky, Joel (2002). 「The Law of Leaky Abstractions」 。 2010年9月22日閲覧。
- ^ arvindpdmn (2019-08-23). 「Leaky Abstractions」. Devopedia . 2020-07-07閲覧。
- ^ Kiczales, Gregor (1992). 「ソフトウェア工学における抽象化の新しいモデルに向けて」(PDF) 。 2011-06-04 にオリジナル(PDF)からアーカイブ。2010-02-03に取得。
- ^ 「バージョン管理 (Git)」。the missing semester of your cs education 。2020年7月31日閲覧。
