TECH NOTES
왜 우리는 같은 버그를 반복해서 만드는가 — 추상화가 감추는 것, 드러내는 것, 그리고 팀이 치르는 비용
추상화는 복잡도를 없애는 도구가 아니라 옮기는 도구다. 무엇을 감추고 무엇을 드러내는지에 따라 팀이 치르는 비용이 달라진다.
같은 종류의 버그가 반복된다면 그것은 개인의 실수가 아니라 구조의 신호다. 대개는 추상화의 경계가 잘못 그어져 있다.
추상화는 복잡도를 없애지 않는다
추상화는 복잡도를 없애는 것이 아니라 다른 곳으로 옮긴다. 호출하는 쪽이 편해진 만큼 구현하는 쪽이 그 부담을 떠안는다. 문제는 그 이동이 장부에 기록되지 않는다는 점이다.
그래서 추상화의 성패는 "얼마나 줄였는가"가 아니라 "누구에게 옮겼는가"로 판단해야 한다. 옮겨진 쪽이 그 복잡도를 감당할 이유가 있어야 한다.
모든 추상화는 새는 구멍이 있다. 문제는 구멍의 유무가 아니라 언제 새는지를 아는가이다.
— 설계 노트
감추는 것과 드러내는 것
좋은 추상화는 무엇을 감출지보다 무엇을 드러낼지를 먼저 정한다. 실패 모드, 성능 특성, 순서 의존성은 감추면 안 되는 축에 속한다.
이 셋을 감춘 추상화는 처음에는 편하지만, 문제가 생겼을 때 사용자가 내부를 뜯어보게 만든다. 그 순간 추상화는 비용만 남기고 이득은 사라진다.
팀이 치르는 비용
추상화의 비용은 코드가 아니라 사람에게 청구된다. 새로 합류한 사람이 경계를 이해하는 데 걸리는 시간, 장애 대응에서 한 단계 더 내려가야 하는 시간이 전부 비용이다.
- 이 추상화가 감추는 것 중 실패 모드가 있는가
- 사용하는 쪽이 내부를 알아야 하는 순간이 있는가
- 경계를 설명하는 데 몇 문장이 필요한가
세 질문에 답할 수 없다면 아직 추상화할 때가 아니다. 중복을 조금 더 견디는 편이 잘못된 경계를 유지하는 것보다 싸다.
자주 묻는 질문
추상화를 줄이면 버그가 줄어드나?
아니다. 추상화가 없으면 같은 결정을 여러 곳에서 반복하게 되고, 그 불일치가 다시 버그가 된다.
좋은 추상화는 어떻게 알아보나?
그 추상화를 쓰는 쪽이 내부를 몰라도 되는지를 본다. 자꾸 내부를 들여다봐야 한다면 경계가 잘못 그어진 것이다.
작성자
AI와 기술을 발견하고, 이해하고, 기록합니다.