노트

YAGNI

You Aren't Gonna Need It

설계#architecture · 연결된 개념 16개

쉽게 말하면

YAGNI는 아이가 크면 입히려고 미리 사 둔 옷이 막상 그때가 되면 취향도 치수도 안 맞는 것과 같아요. 지금 필요한 것만 만들고, 필요해지는 날 그때 맞춰 만들라는 원칙이에요.

비유가 깨지는 곳 옷은 버리면 그만이지만 코드는 나중에 고칠 수 있다는 자신감이 있어야 해요. 그래서 YAGNI는 좋은 테스트와 CI, 리팩터링 습관이 받쳐 줄 때 성립하고, 아키텍처를 아예 생각하지 말라는 뜻도 아니에요.

"그거 필요 없을 거야(You Aren't Gonna Need It)." 실제로 필요해지기 전까지 기능이나 확장 지점을 만들지 말라는 XP(Extreme Programming)의 원칙이다.

  • 미래를 위해 미리 넣은 매개변수·훅·추상 클래스(유연성 메커니즘, Flexibility Mechanism)는 상당수가 결국 쓰이지 않거나, 막상 요구가 오면 모양이 맞지 않아 오히려 고치기 어렵게 만든다
  • 지금 JSON(JavaScript Object Notation) 내보내기만 필요하면 JSON만 만든다. XML(Extensible Markup Language)이 필요해지는 날 추가한다
  • 추측성 일반화(Speculative Generality) 냄새: 하는 일 없는 추상 클래스, 쓸데없는 위임, 한 번도 쓰지 않은 매개변수, 테스트에서만 쓰이는 함수. 계층 합치기·인라인·죽은 코드 제거로 걷어 낸다

전제 조건

YAGNI는 "나중에 바꿔도 된다"는 자신감이 있을 때만 성립한다. 좋은 테스트와 CI(Continuous Integration), 그리고 리팩터링 습관이 있어야 필요할 때 구조를 고칠 수 있다. 그래서 YAGNI가 아키텍처를 아예 생각하지 말라는 뜻은 아니다. 문제를 더 깊이 이해했을 때 다루는 편이 낫다는 것이다. 파울러는 YAGNI가 진화적 설계(Evolutionary Design)에 기대는 동시에 그것을 가능하게 한다고 설명한다.

수많은 유연성 메커니즘을 갖춘 시스템보다 단순한 시스템이 바꾸기 훨씬 쉽다. KISS 원칙, 심플 디자인, 세컨드 시스템 효과와 같은 방향이다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · Laws of Software Engineering: YAGNI (You Aren't Gonna Need It) · Martin Fowler: Yagni · Refactoring.Guru: Speculative Generality

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 섣부른 최적화

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

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

  • AI 시대 엔지니어의 역할 변화

    AI가 코딩을 맡으면서 개발의 무게가 기획·검증·학습으로 옮겨 가고, 병목은 리뷰와 결정으로 이동한다.

  • 필요 낭비 (Type 1 무다)

    부가가치를 만들지는 않지만 지금은 없앨 수 없는 일. 도요타 생산 방식(Toyota Production System)에서 나온 린(Lean) 사고는 활동을 부가가치 활동(Value-Added), 순수 낭비(Type 2 무다), 필요 낭비(Type 1 무다)로 나눈다. 소프트웨어 개발에서는 프로덕션 코드를 쓰는 일을 빼면 대부분이 둘 중 하나의 낭비다.

  • 함께 자라기 (책 개요)

    개발자가 어떻게 배우고 함께 일해야 불확실성 속에서 자랄 수 있는지를 연구 근거와 함께 풀어 쓴 김창준의 책.

보기 옵션