시스템 설계의 두 가지 추상화: 숨기기 vs 줄이기
The Two Abstractions of System Design: Hide or Reduce
분산 시스템과 TLA+ 모델링에서 '추상화'가 왜 그렇게 어려운지에 대한 의문에서 출발한 글입니다. 저자는 CS 교육에서 가르치는 '모듈성 추상화'(캡슐화로 내부를 숨기는 것)와 모델링/수학에서 말하는 '모델링 추상화'(관심 있는 속성만 남기고 나머지를 줄이는 것)가 본질적으로 다르다고 주장합니다. 특히 동시성 측면에서 모듈성 추상화는 동시성을 숨기려 하지만, 모델링 추상화는 오히려 동시성을 드러내고 활용합니다. Lamport 시계, 합의, 선형화 가능성, 로그 기반 데이터베이스, MapReduce 등이 모델링 추상화의 예시로 제시됩니다.
모듈성 추상화는 캡슐화하고, 수직적 경계를 그리며, 아래 계층을 숨긴다. 모델링 추상화는 교차적이다: 시스템을 행동 평면을 따라 슬라이스하여 조사 중인 속성에 절대적으로 관련된 것만 남기며, 그것조차 '어떻게'가 아닌 '무엇'의 형태로 남긴다.
HN 토론
15- BoiledCabbage
나는 일반적으로 이 두 개념을 추상화(abstraction)와 일반화(generalization)로 논의하는 것을 들어왔다.
추상화는 불필요한 세부 사항을 숨긴다. 일반화는 항목들 사이의 공통점을 찾아내거나 표면화한다.
> oop - 추상화와 일반화의 차이점은 무엇인가? - Stack Overflow - https://stackoverflow.com/questions/19291776/whats-the-diffe...
프로시저/메서드를 만드는 것은 추상화의 한 형태이다. 그것이 매개변수를 받아들이도록 하는 것은 일반화의 한 형태이다(유사한 여러 입력에 대해 사용될 수 있게 함으로써).
단순히 정수 데이터 타입을 만드는 것은 매우 간단한 형태의 일반화이다. 연산이 어떤 정수에 대해서도 일반적으로 작동하도록 허용하는 것이다.
- danparsonson
> 모듈성 추상화는 인터리빙(interleavings)을 숨기고 연산을 원자적인 것처럼 제시하는 것을 목표로 한다. 그 목표는 모듈을 사용하기 쉽게 만드는 것이지만, 그렇게 함으로써 동시성이나 효율성 기회를 노출하지 않는다.
> 대조적으로, 모델링 추상화는 무엇이 누출되어야 하는지 식별하고 그것을 활용하는 것에 관한 것이다! 그것은 세분화된 동작과 순서를 노출하고, 인터리빙에도 불구하고 불변식(invariants)이 유지된다는 것을 증명한다. 이 작업의 보상은 시스템에서 최대의 안전한 동시성을 수확하는 것이다.
나는 여기서 논쟁을 이해하지 못하겠다. 왜냐하면 그것들은 나에게 같은 커스터드의 두 가지 다른 맛처럼 들리기 때문이다; 차이는 단지 인터페이스의 각 측면에서 수행하는 작업의 균형일 뿐이며, 그 결정은 프로젝트 특정 사용 사례에 달려 있다.
이것은 시스템 설계에 관한 요점을 만드는 것처럼 느껴진다? 추상화는 추상화이다 - 프로젝트 내에서 다른 수준에 적용할 수 있으며, 소프트웨어 개발 기술을 쌓는 큰 부분은 줌 인/아웃을 배우고 각 단계에서 추상화를 제대로 하는 것이지만, 궁극적으로 같은 일을 반복하는 것이다. 나는 개인적으로 그것의 범주가 필요하다고 생각하지 않는다.
- sigbottle
나는 이것이 '압축(compression)'의 서로 다른 개념이 얼마나 다양할 수 있는지를 보여준다고 생각한다(그 단어는 요즘 AI 때문에 많이 사용된다). 인간은 확실히 단순함을 좋아하지만, 단순함에는 다양한 사용 사례가 있을 수 있다.