抽象化は複雑さを隠すが下位層の性質までは消せない

抽象化によって、利用者は下位層の仕組みを普段は意識せずに済む。 TCPは不安定なIP通信の上に、順序どおりにデータを届ける通信路を提供する。 しかし、回線が混雑すれば通信は遅くなり、切断されればデータは届かない。 隠したはずの下位層の性質が、遅延や障害として利用者に現れる。

このように、重要な抽象化が下位層の性質を完全には隠せないことを漏れのある抽象化の法則と呼ぶ。 SQLも取得手順を隠すが、性能問題が起きれば実行計画や索引を調べる必要がある。 高水準の問い合わせだけを見ていても、B+木索引が訪問するページの違いによる速度差は説明できない。

これは「抽象化を使うべきではない」という主張ではない。 抽象化は日常の作業から複雑さを取り除き、より大きな問題を扱えるようにする。 ただし、障害や性能劣化を診断するには、その抽象化が何を隠し、どの条件で隠しきれなくなるかを知る必要がある。 抽象化は作業に必要な手間を減らしても、熟達に必要な下位層の知識まで不要にはしない。

https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/

#software-design #abstraction #debugging