노트

언어적 안티패턴

Linguistic Antipattern

개발 문화#learning · 연결된 개념 9개

쉽게 말하면

언어적 안티패턴은 '설탕'이라고 적힌 통에 소금이 들어 있는 상황이에요. 라벨만 믿고 커피에 넣었다가 낭패를 보듯, 코드 이름이 실제 동작과 다르면 읽는 사람이 잘못 짐작해요.

비유가 깨지는 곳 소금은 맛보면 바로 알지만 코드는 읽는 사람이 이름만 보고 덩어리로 묶어 넘어가서 잘못이 한참 뒤에야 드러나요. 그래서 get이 상태를 바꾸거나 is가 boolean이 아니면 인지 부하가 특히 커져요.

메서드나 변수의 이름(그리고 타입, 주석)이 약속하는 것과 실제 동작이 맞지 않는 상태다. 베네라 아르나우도바(Venera Arnaoudova) 등이 정리한 개념으로, 『프로그래머의 뇌』는 이것이 특히 인지 부하를 크게 높인다고 설명한다.

예

// get인데 상태를 바꾼다
function getUser(id: string) {
  cache.clear();
  return db.find(id);
}
 
// is로 시작하지만 boolean이 아니다
const isValid = validate(form); // { ok: boolean, errors: string[] }
 
// 복수형 이름인데 하나만 담는다
const users = findFirstUser();

왜 해로운가

이름을 읽는 순간 뇌는 장기 기억에서 "get은 읽기만 한다", "is는 참/거짓이다" 같은 지식을 꺼내 코드를 덩어리로 묶는다(청킹과 코드 읽기). 그 지식이 틀리면 잘못된 덩어리로 이해하고, 나중에 실제 동작을 확인하느라 더 많은 부담을 진다(인지 부하). 이름이 나쁜 코드에서 버그가 더 많이 발견된다는 연구도 있다(인과관계까지 밝혀진 것은 아니다).

이름에서 예상한 대로 동작하라는 최소 놀람의 원칙, 조회와 변경을 나누라는 명령-질의 분리이 같은 문제를 다른 쪽에서 다룬다.

좋은 이름을 만드는 3단계

드로르 페이텔슨(Dror Feitelson)이 제안한 방법이다.

  1. 이름에 담을 개념을 고른다 (무엇을 나타내는가)
  2. 각 개념에 쓸 단어를 고른다 (팀과 도메인이 쓰는 말로)
  3. 단어를 조합하는 틀을 정한다 (코드베이스 안에서 일관되게)

이름을 바꾸는 것만으로도 좋은 리팩터링이다 → 함수 선언 바꾸기. 코드 어휘를 도메인 어휘와 맞추는 습관은 상호 참조 전략와 이어진다.

출처: 『프로그래머의 뇌』 펠리너 헤르만스 (원서 The Programmer's Brain)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 코드 냄새

    당장 버그는 아니지만 이해나 변경 비용을 높이는 구조적 신호. 리팩터링을 언제 시작하고 멈출지에 정확한 공식은 없어서, 냄새라는 어휘로 직관을 공유한다.

  • 테스트 냄새

    테스트 코드나 테스트 습관에서 나는, 더 깊은 문제를 알리는 신호. 제라드 메스자로스의 xUnit 테스트 패턴 정리가 이름을 붙였다.

  • 디자인 패턴

    반복해서 나타나는 설계 문제에 대한 검증된 해결 구조와 그 이름. 복사해 쓰는 완성 코드가 아니라 객체들이 협력하는 방식을 설명하는 어휘다. 1994년 이른바 GoF(Gang of Four, 네 명의 저자)의 책 『Design Patterns: Elements of Reusable Object-Oriented Software』가 23개 패턴을 정리하며 널리 퍼졌다.

  • 행동 패턴

    객체 사이의 책임 분배와 대화 방식을 정리하는 패턴들. 요청 전달, 알고리즘 교체, 상태 변화, 알림, 작업 캡슐화 같은 문제를 다룬다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

보기 옵션