노트누수 추상화의 법칙
Law of Leaky Abstractions
설계#architecture · 연결된 개념 11개
쉽게 말하면
누수 추상화의 법칙은 아무리 잘 만든 포장도 결국 안쪽 사정이 비친다는 말이에요. 자동 변속기가 기어를 감춰 줘도 가파른 언덕에선 엔진 사정이 드러나듯, ORM도 느려지면 결국 쿼리를 들여다봐야 해요.
비유가 깨지는 곳 그렇다고 추상화를 쓰지 말라는 건 아니에요. 추상화는 일을 줄여 주지만 배울 것까지 줄여 주진 않으니, 깨질 때를 대비해 한 층 아래가 어떻게 돌아가는지 이해해 두라는 거예요.
자명하지 않은 모든 추상화는 어느 정도 새어 나온다는 법칙. 조엘 스폴스키(Joel Spolsky)가 2002년 글에서 TCP(Transmission Control Protocol)가 불안정한 IP(Internet Protocol) 위에서 신뢰성을 흉내 내지만 결국 네트워크 문제가 드러나는 사례 등으로 소개했다.
- ORM(Object-Relational Mapping)은 SQL(Structured Query Language)을 감추지만 성능 문제가 생기면 결국 생성된 쿼리를 봐야 한다. N+1 문제와 지연 로딩이 대표적인 누수다
- 가비지 컬렉션(Garbage Collection, GC)은 메모리 관리를 감추지만 GC 멈춤은 성능에 드러난다
- 프레임워크의 캐시나 렌더링 최적화도 내부 동작을 모르면 이해하기 어려운 버그로 새어 나온다(Next.js 캐시 계층, 재조정(Reconciliation))
- 부동소수점(Floating Point)은 실수를 감추지만
0.1 + 0.2에서 드러난다(부동소수점 (IEEE 754))
교훈은 추상화를 쓰지 말라는 게 아니라, 추상화가 깨질 때를 대비해 한 층 아래를 이해해 두라는 것이다. 추상화는 일을 줄여 주지만 배울 것을 줄여 주지는 않는다. "모든 모델은 틀렸지만 일부는 유용하다"는 말과도 통한다.
출처: The Law of Leaky Abstractions 조엘 스폴스키 · Laws of Software Engineering: The Law of Leaky Abstractions
연결된 개념
이 노트를 가리키는 문서
뜻이 가까운 노트
- 포스텔의 법칙
"자신이 하는 일에는 보수적으로, 남에게서 받는 것에는 관대하게." 존 포스텔(Jon Postel)이 TCP(Transmission Control Protocol) 명세에 적은 견고성 원칙(Robustness Principle)이다. 출력은 명세를 엄격히 지키고, 입력은 조금 어긋나도 받아들여 시스템 간 상호 운용성을 높이라는 뜻이다.
- 『UX/UI의 10가지 심리학 법칙』
존 야블론스키가 사용자 경험(User Experience, UX) 디자인에 자주 쓰이는 심리학 원리를 정리한 책. 법칙마다 기원, 핵심 내용, 실제 사례를 짧게 다루고, 마지막 장에서 이 원리들이 사람을 조종하는 데 쓰일 수 있다는 윤리 문제를 짚는다. 같은 내용을 저자의 사이트 lawsofux.com에서도 볼 수 있다.
- 테스트 냄새
테스트 코드나 테스트 습관에서 나는, 더 깊은 문제를 알리는 신호. 제라드 메스자로스의 xUnit 테스트 패턴 정리가 이름을 붙였다.
- 심플 디자인
켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.
- 복잡성 보존의 법칙
모든 애플리케이션에는 더 줄일 수 없는 고유한 복잡성이 있고, 그 복잡성은 없앨 수 없으며 옮길 수만 있다는 법칙. 래리 테슬러(Larry Tesler)가 초기 GUI(Graphical User Interface) 작업 중에 정리했다.