システム設計の2つの抽象化:隠すか、削るか
The Two Abstractions of System Design: Hide or Reduce
分散システム研究者がTLA+などのモデリングで重要視する「抽象化」は、CS教育で教わる従来の抽象化とは根本的に異なる。モジュール化抽象化は内部を隠して境界を引くのに対し、モデリング抽象化は対象の性質に本質的な部分だけを残してシステムを切り詰める。この違いを理解することで、モデリングのスキルギャップの謎が解ける。Lamportの論理クロックやPaxos、線形化可能性など、分散システムの設計はモデリング抽象化の好例だ。
モジュール化抽象化は隠す。モデリング抽象化は削る。
HNでの議論
15- BoiledCabbage
一般的に、この2つの概念は「抽象化」と「一般化」として議論されているのをよく聞きます。
抽象化は不要な詳細を隠します。一般化は項目間の共通点を見つけ出し、表面化させます。
> oop - What's the difference between abstraction and generalization? - Stack Overflow - https://stackoverflow.com/questions/19291776/whats-the-diffe...
プロシージャやメソッドを作ることは抽象化の一形態です。それにパラメータを受け付けさせることは一般化の一形態です(類似した多くの入力に対して使えるようにすることで)。
単に整数データ型を作ることは、非常に単純な一般化の一形態です。演算を任意の整数に対して汎用的に機能させることは、さらにその一歩先を行きます。
- danparsonson
> モジュール性の抽象化は、インターリービング(交錯)を隠し、操作をあたかも原子的であるかのように提示することを目指します。その目標はモジュールを使いやすくすることですが、その代償として並行性や効率性の機会を公開しないのです。
> それとは対照的に、モデリング抽象化は、何を漏らすべきかを特定し、それを活用することです! それは細かいアクションや順序を公開し、インターリービングにもかかわらず不変条件が維持されることを証明します。この作業の見返りは、システムから最大限の安全な並行性を収穫することです。
私にはこの議論が理解できない気がします。なぜなら、それらは同じカスタードの2つの異なるフレーバーにしか聞こえないからです。違いは、インターフェースの両側で行う作業のバランスだけであり、その決定はプロジェクト固有のユースケースに依存します。
これはどちらかというと、システム設計についての指摘のように感じます。抽象化は抽象化であり、プロジェクト内の異なるレベルで適用できます。ソフトウェア開発のスキルを構築する大きな部分は、ズームイン・ズームアウトを学び、各段階で抽象化を確実に行うことですが、結局は同じことを繰り返しているのです。個人的には、抽象化にカテゴリが必要だとは思いません。
- sigbottle
これは、「圧縮」の概念がどれほど異なるかを示していると思います(その言葉は最近AIのせいでよく使われます)。人間は確かに単純さを好みますが、単純さにはさまざまなユースケースがあり得ます。