KISS · DRY · YAGNI
KISS · DRY · YAGNI
세 머리글자는 소프트웨어 설계 원칙으로 자주 함께 인용. 출처와 의미가 조금씩 다르고, 서로 충돌하는 해석도 있습니다. 이 글은 각 원칙의 출처 · 의도 · 자주 혼동되는 사례.
1. KISS — Keep It Simple, Stupid
미국 항공우주 엔지니어 Kelly Johnson 이 1960 년대 록히드 스컹크웍스 (Skunk Works) 에서 정착시킨 표어. 풀이는 "간단하게 유지하라, 멍청아" 가 아니라 "평균적인 정비병이 야전에서 기본 도구만으로 수리할 수 있도록" 항공기를 설계하라는 의미. 머리글자의 두 번째 S 는 사람을 가리키는 모욕이 아니라 결과를 가리키는 형용사라는 해석이 정설.
소프트웨어로 옮겨오면 의미는:
- 시스템은 필요 이상으로 복잡해지지 않도록.
- 같은 결과가 나는 두 설계가 있다면 단순한 쪽이 보통 더 오래 삶.
- "단순함" 은 "기능이 적음" 과 다름. 단순한 시스템도 풍부한 기능을 가질 수 있음.
2. DRY — Don't Repeat Yourself
Andy Hunt 와 David Thomas 의 1999 년 책 The Pragmatic Programmer 26 쪽 근처에:
"Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."
원문이 "지식 (knowledge)" 이라는 점이 자주 잊힙니다. DRY 는 "비슷해 보이는 코드를 모아 하나로 합치라" 가 아니라 "같은 사실을 여러 곳에 적지 말라" 에 가까움.
자주 혼동되는 사례:
- 두 함수의 코드가 우연히 비슷하지만 표현하는 사실 (= 비즈니스 규칙) 은 다른 경우. 합치면 미래에 한쪽이 바뀔 때 다른 쪽이 끌려감. Sandi Metz 의 표현으로 "duplication is far cheaper than the wrong abstraction".
- 같은 상수 (예: 세율 · API URL) 가 여러 파일에 흩어진 경우. 이쪽은 DRY 가 명확히 적용되는 사례. 한 곳에서 정의해 import.
DRY 의 적용은 "코드 패턴이 같다" 가 아니라 "지식이 같다" 를 기준으로 하는 편이 안전하다는 평이 흔합니다.
3. YAGNI — You Aren't Gonna Need It
Extreme Programming (XP) 진영에서 자라난 표어. Ron Jeffries 가 정착시킨 것으로 인용. 의도는 단순:
현재 사용자 스토리에 필요하지 않은 기능은 지금 만들지 말라.
미래에 필요할 것 같은 추상 · 인터페이스를 미리 만들어 두면 다음 비용:
- 만든 시점부터 유지보수가 시작.
- 그 추상이 미래의 진짜 요구를 정확히 맞추리라는 보장이 없음.
- "만들었으니 쓰자" 는 압력이 잘못된 결합을 낳음.
Martin Fowler 가 자신의 글 "Yagni" (2015) 에서 이 비용을 네 가지 (개발 비용 · 이월 비용 · 수리 비용 · 지연 비용) 로 정리. YAGNI 는 추상을 영원히 거부하라는 뜻이 아니라 추상의 시점을 늦추라는 뜻.
4. 세 원칙이 충돌하는 사례
세 원칙은 자주 같은 방향을 가리키지만 충돌하기도:
- DRY vs YAGNI — 두 함수의 비슷한 부분을 추상으로 합치는 것은 DRY 적이지만, 지금 필요 없는 추상이라면 YAGNI 에 어긋남.
- KISS vs DRY — 단순함을 위해 약간의 중복을 남기는 선택과, 중복 제거를 위해 추상 계층을 추가하는 선택이 충돌.
이 경우 어느 한쪽이 절대 옳다고 보기 어렵습니다. 변경 빈도 · 코드 수명 · 팀 규모에 따라 적합한 쪽이 달라진다는 평이 흔함. 일반적으로는 "복제는 나중에 합치기 쉽지만, 잘못된 추상은 되돌리기 어렵다" 는 관찰.
5. 입문자가 자주 마주치는 함정
패턴 일치만 보고 두 코드를 합쳤다가, 한쪽 비즈니스 규칙이 바뀌어 if-else 가 끝없이 늘어나는 경우.
미래 확장을 위해 인터페이스를 미리 도입했으나 결국 구현이 하나밖에 없는 채로 1 년이 지나는 경우.
"단순하게 유지" 가 "검사 · 에러처리 생략" 으로 잘못 해석되는 경우 — KISS 는 사고를 위한 단순함이지 견고함의 포기가 아님.
하고픈 말
세 머리글자는 짧지만, 진짜 의미를 정확히 잡으려면 출처를 한 번 들여다 볼 만한 자리. KISS 는 정비병의 야전 수리, DRY 는 지식의 단일 표현, YAGNI 는 추상의 시점 늦추기. "잘못된 추상은 중복보다 비싸다" 는 한 문장이 셋의 균형을 잘 잡아 줍니다.
Next
- ssot-everywhere
- folder-as-contract
The Pragmatic Programmer · Martin Fowler Yagni · Wikipedia KISS principle · Sandi Metz The Wrong Abstraction · c2 wiki YouArentGonnaNeedIt · Hillel Wayne Empiricism and Knowledge 를 참고합니다.