본문으로 건너뛰기
피드

잘못된 추상화보다 중복이 낫다는 샌디 메츠의 고전 조언

backend 약 5분
vote
0
댓글
북마크

샌디 메츠는 중복을 없애려다 잘못된 추상화를 만들면 코드가 조건문과 파라미터로 부풀어 더 위험해진다고 말한다. 이미 틀어진 추상화는 억지로 보존하지 말고, 다시 호출부에 인라인해서 중복을 되살린 뒤 현재 요구사항에 맞는 새 구조를 찾는 편이 빠르다는 주장이다.

  • 1

    중복 제거 자체보다 잘못된 추상화가 더 큰 유지보수 비용을 만든다는 주장

  • 2

    처음엔 맞았던 추상화도 요구사항이 바뀌면 조건문 덩어리로 변할 수 있음

  • 3

    잘못된 추상화의 신호는 파라미터와 분기 로직이 계속 늘어나는 것

  • 4

    해결책은 기존 추상화를 호출부로 되돌리고 각 호출부에 필요한 코드만 남기는 방식

  • 5

    매몰 비용 때문에 복잡한 코드를 계속 보존하려는 압박을 경계해야 함

  • 샌디 메츠의 핵심 문장은 이거임. “중복은 잘못된 추상화보다 훨씬 싸다.”

    • RailsConf 2014 발표에서 나온 문장이고, 이후에도 계속 반응이 커서 글로 다시 정리한 내용임
    • 보통 개발자는 중복을 보면 본능적으로 뽑아내고 싶어 하는데, 이 글은 그 반사신경에 브레이크를 검
  • 잘못된 추상화는 대개 아주 선한 의도에서 시작됨

    • 프로그래머 A가 중복을 발견함
    • 중복을 메서드나 클래스로 추출하고 이름을 붙임
    • 호출부의 반복 코드를 새 추상화로 바꿈
    • 여기까지만 보면 코드가 깔끔해 보이고, 다들 뿌듯하게 퇴근함
  • 진짜 문제는 다음 요구사항이 들어오는 순간부터 터짐

    • 새 요구사항은 기존 추상화와 “거의” 맞지만 완전히 같지는 않음
    • 프로그래머 B는 기존 추상화를 유지해야 한다는 압박을 느낌
    • 그래서 파라미터를 하나 추가하고, 그 값에 따라 다르게 동작하는 조건문을 넣음
    • 다음 요구사항이 오면 또 파라미터가 늘고, 또 조건문이 늘어남

중요

> 글에서 말하는 위험 신호는 명확함. 공용 코드에 파라미터와 조건 분기가 계속 붙고 있다면, 그건 더 이상 공통 추상화가 아니라 여러 아이디어가 뒤엉킨 절차 코드일 가능성이 큼.

  • 기존 코드는 생각보다 강한 권위를 가짐

    • 이미 존재한다는 사실만으로 “맞고 필요하니까 있는 코드”처럼 보임
    • 심지어 코드가 복잡할수록 “이 정도로 복잡하면 중요한 이유가 있겠지”라는 착각이 생김
    • 메츠는 이걸 매몰 비용 오류(sunk cost fallacy)로 설명함
  • 그래서 잘못된 추상화를 만났을 때 빠른 길은 앞으로 더 밀어붙이는 게 아니라 뒤로 감는 것임

    • 추상화된 코드를 각 호출부에 다시 인라인함
    • 각 호출부에서 전달하던 파라미터를 기준으로 실제 실행되는 코드만 남김
    • 해당 호출부에 필요 없는 분기와 코드를 삭제함
    • 이렇게 하면 공용 추상화와 조건문이 사라지고, 각 호출부는 자기에게 필요한 코드만 갖게 됨
  • 흥미로운 건, 이렇게 되돌려 보면 “공통”이라고 믿었던 코드가 실제로는 꽤 다르다는 사실이 드러난다는 점임

    • 호출부마다 비슷해 보였지만 실제 실행 경로가 달랐던 경우가 많음
    • 중복을 다시 드러내면 현재 요구사항 기준으로 무엇이 진짜 공통인지 다시 볼 수 있음
    • 그다음에야 새 추상화를 뽑아도 늦지 않음
  • 이 글의 조언은 중복을 찬양하자는 얘기가 아님

    • 중복은 여전히 신호이고, 언젠가는 정리할 수 있음
    • 다만 공통점이 충분히 검증되기 전에 추상화하면 나중에 훨씬 비싼 빚이 됨
    • 잠깐 조건문 몇 개를 쌓아 패턴을 관찰하는 건 괜찮지만, 틀렸다는 게 보이면 빨리 버리는 편이 덜 아픔
  • 결론은 꽤 실전적임. 틀린 추상화가 보이면 중복을 다시 도입하라

    • 그건 후퇴가 아니라 더 나은 방향으로 가기 위한 리셋임
    • 특히 팀 코드에서 “공용이라 건드리기 무서운 함수”가 계속 커지고 있다면 이 글을 다시 읽을 타이밍임

기술 맥락

  • 여기서 말하는 선택은 “중복을 제거할 것인가, 잠깐 남겨둘 것인가”예요. 중복 제거가 항상 이득처럼 보이지만, 요구사항이 아직 안정되지 않았을 때는 공통점을 너무 빨리 확정하는 비용이 더 커질 수 있거든요.

  • 잘못된 추상화가 무서운 이유는 호출부의 차이를 숨겨버리기 때문이에요. 처음엔 같은 로직처럼 보였는데, 시간이 지나면서 각 호출부가 조금씩 다른 이유를 갖게 되면 파라미터와 조건문이 그 차이를 억지로 떠안게 돼요.

  • 메츠가 제안하는 방법은 공용 코드를 다시 호출부에 펼쳐놓고, 각 호출부가 실제로 쓰는 코드만 남기는 거예요. 이렇게 해야 “정말 같은 것”과 “그냥 우연히 비슷했던 것”이 눈에 보이기 때문이에요.

  • 이 접근은 리팩터링 순서를 바꾸자는 얘기에 가까워요. 먼저 추상화를 지키려고 애쓰는 대신, 현재 요구사항 기준으로 코드를 다시 관찰하고 나서 새 추상화를 뽑자는 거예요.

이 글이 오래된 글인데도 계속 회자되는 이유는 간단함. 리팩터링의 적은 ‘중복’만이 아니라, 팀 전체가 건드리기 무서워하는 그럴듯한 공용 코드이기도 해서임.

댓글

댓글

댓글을 불러오는 중...

backend

덕디비는 왜 빠를까: 서버 없는 분석 엔진의 내부 구조 뜯어보기

DuckDB가 단일 바이너리, 인프로세스 실행, 컬럼형 저장, 최적화 패스, Parquet 푸시다운으로 빠른 분석 쿼리를 처리하는 방식을 깊게 설명한 글이다. 6GB Parquet 파일을 노트북에서 바로 SQL로 읽는 경험 뒤에 어떤 설계가 깔려 있는지 따라간다.

backend

피지독, 포스트그레스를 수평 확장시키겠다고 550만 달러 투자 유치

피지독은 포스트그레스 앞단에 프록시를 두고 샤딩과 라우팅을 처리해 수평 확장을 가능하게 하겠다는 오픈소스 프로젝트다. 이미 프로덕션에서 초당 200만 건이 넘는 쿼리를 처리하고, 확인된 규모만 20테라바이트 이상을 샤딩했다고 밝히며 550만 달러 투자를 공개했다.

backend

펜타시스템, EDB 포스트그레SQL로 국내 엔터프라이즈 DB 전환 시장 공략

펜타시스템테크놀러지가 EDB와 파트너 계약을 맺고 국내에 EDB 포스트그레SQL 기반 데이터 플랫폼을 공급한다. 기존 상용 DBMS 정책 변화로 비용 부담이 커진 기업들을 겨냥해, 오픈소스 기반 엔터프라이즈 데이터 플랫폼 전환 수요를 잡겠다는 전략이다. 금융, 공공, 제조, 유통, 클라우드, AI 데이터 분석 환경까지 적용 범위를 넓히려는 움직임이다.

backend

펜타시스템·EDB, 국내 오픈소스 DBMS 전환 시장 공략

펜타시스템이 EDB와 파트너십을 맺고 엔터프라이즈 오픈소스 데이터 플랫폼 시장에 본격적으로 들어간다. 핵심은 PostgreSQL 기반 대안 DBMS로 공공·금융·제조 영역의 비용 절감, 고가용성, 백업·복구 수요를 잡겠다는 전략이다.

backend

펜타시스템, EDB와 손잡고 엔터프라이즈 오픈소스 데이터 플랫폼 시장 공략

펜타시스템테크놀러지가 EDB와 국내 파트너 계약을 맺고 엔터프라이즈 오픈소스 데이터 플랫폼 사업을 확대한다. 양사는 PostgreSQL 기반 대안 데이터베이스 시장, 클라우드와 인공지능 데이터 분석 환경, 고가용성 및 백업 복구 영역을 함께 공략할 계획이다.