7분

켄트 벡과 익스트림 프로그래밍(XP): TDD, 반복, 피드백

켄트 벡과 익스트림 프로그래밍(XP)이 어떻게 TDD, 짧은 반복, 피드백 루프를 대중화했는지—그리고 이 아이디어들이 오늘날에도 팀을 이끄는 이유를 살펴본다.

켄트 벡과 익스트림 프로그래밍(XP): TDD, 반복, 피드백

켄트 벡과 XP가 여전히 중요한 이유

켄트 벡(Kent Beck)의 익스트림 프로그래밍(XP)은 때때로 초기 웹 시대의 유물처럼 보인다: 흥미롭고 영향력 있지만 약간 구식인 것처럼. 그러나 자주 배포하기, 사용자로부터 빠른 신호 받기, 코드를 변경하기 쉽게 유지하기 같은 현대 소프트웨어 팀의 많은 습관은 XP의 핵심 아이디어와 직접 연결된다.

이 글의 목표는 간단하다: XP가 어디서 왔는지, 무엇을 고치려 했는지, 그리고 왜 그 핵심 부분들이 지금도 유효한지 설명하는 것이다. 찬사도, 반드시 따라야 할 규칙집도 아니다. 건강한 엔지니어링 팀에서 여전히 등장하는 원칙들에 대한 실용적인 안내로 생각하라.

반복해서 등장하는 세 가지 주제

XP는 여러 실천법의 묶음이지만, 세 가지 주제가 반복해서 나타난다:

  • TDD (테스트 주도 개발): 단순히 버그를 막는 것을 넘어서, 테스트를 통해 코드가 무엇을 해야 하는지 명확히 하며 설계를 형성한다.
  • 반복(이테레이션): 작은 단위로 자주 전달해서 더 빨리 배우고 검증되지 않은 긴 작업 구간을 피한다.
  • 피드백 루프: 테스트, 페어링, 통합, 실제 사용자 결과를 통한 "시도 → 관찰 → 조정"의 짧은 주기를 만든다.

누가 이 글을 읽어야 할까

엔지니어, 테크 리드, 엔지니어링 매니저, 또는 개발자와 밀접히 협업하는 제품 중심 독자라면, XP는 “부수지 않고 빠르게 움직이기”가 실제로 어떻게 보일 수 있는지에 대한 공통 어휘를 제공한다.

얻어갈 것

마지막에 다음을 할 수 있어야 한다:

  • XP 실천법 뒤에 있는 의도를 인식하기(그 의례만이 아니다).
  • 전체 XP를 도입하지 않고도 몇 가지 고영향 기술(짧은 반복, 촘촘한 피드백, 목적 있는 리팩토링)을 적용하기.
  • 흔한 오해(예: TDD를 단순한 절차 확인으로 대하거나, 반복을 계속되는 소모로 보는 것)를 피하기.

XP가 여전히 중요한 이유는 소프트웨어 개발을 예측의 문제로 보지 않고 학습의 문제로 보기 때문이며, 팀이 더 빨리 배울 수 있는 구체적 방법을 제공하기 때문이다.

켄트 벡의 맥락: XP는 어떤 문제를 해결하려 했나?

켄트 벡은 익스트림 프로그래밍(XP)이라는 이름을 붙인 사람으로 종종 소개되고, 이후 애자일 운동 형성에 기여했다. 하지만 XP는 이론적 연습으로 시작한 것이 아니다. 특정한 고통에서 비롯된 실용적 대응이었다: 요구사항이 계속 바뀌고, 소프트웨어가 자주 깨지며, 팀은 ‘진짜’ 문제가 너무 늦게야 드러나는 상황이었다.

XP를 낳은 프로젝트 압박

XP는 실제 전달 제약에서 나왔다—빡빡한 일정, 진화하는 범위, 늦게 발견되는 문제의 증가하는 비용. 팀들은 비즈니스가 무엇을 필요로 하는지 아직 결정 중인 상태에서 복잡한 시스템을 만들어야 했다. 전통적 계획은 안정성을 전제로 했다: 요구사항을 미리 모으고, 설계하고, 구현한 다음 출시 직전에 테스트한다. 그 안정성이 없을 때 계획은 무너졌다.

XP가 반응한 대상

XP가 주로 겨냥한 적은 ‘문서’나 ‘프로세스’ 자체가 아니라—늦은 피드백이었다.

무겁고 단계별인 방법론은 학습을 지연시키는 경향이 있었다:

  • 고객은 동작하는 소프트웨어를 늦게 보기 때문에 잘못된 가정이 몇 달간 살아남았다.
  • 테스트는 늦게 이루어져 결함이 쌓이고 수정 비용이 높아졌다.
  • 통합은 늦게 일어나 스케줄에 여유가 없을 때 충돌을 발견하게 했다.

XP는 순서를 뒤집었다: 행동과 정보 사이의 시간을 줄였다. 그래서 TDD, 지속적 통합, 리팩토링, 페어 프로그래밍 같은 실천법이 함께 어울린다—이 모두가 피드백 루프이기 때문이다.

XP는 단순한 "빠르게 움직이기" 그 이상이다

"익스트림"이라는 이름은 좋은 아이디어를 더 멀리 밀어붙이라는 상기였다: 더 빨리 테스트하고, 더 자주 통합하며, 계속 소통하고, 배우면서 설계를 개선하라는 것이다. XP는 가치(예: 소통, 단순성)에 의해 안내되는 실천의 집합이지, 대충 넘어가라는 허가가 아니다. 목표는 지속 가능한 속도다: 올바른 것을 만들고, 변화가 이어질 때 계속 작동하도록 유지하는 것이다.

실천을 이끄는 가치들

XP는 기술적 요령의 모음이 아니다. 켄트 벡은 XP를 코드베이스가 매일 변할 때 결정을 안내하는 가치들의 집합으로 구성했다. TDD, 페어 프로그래밍, 리팩토링, 지속적 통합 같은 실천은 무엇을 보호하려는지 알 때 더 의미가 있다.

다섯 가지 XP 가치(쉽게 풀어쓴 말)

소통(Communication): "지식이 한 사람 머릿속에만 갇히지 않게". 그래서 XP는 페어 프로그래밍, 공유 코드 소유권, 작은 빈도의 체크인을 강조한다. 중요한 설계 결정은 대화와 코드에 드러나야지 개인의 머릿속 비밀 모델에 숨겨져선 안 된다.

단순성(Simplicity): "오늘 동작하는 가장 단순한 것"을 하라는 의미다. 이는 작은 릴리스리팩토링으로 드러난다: 지금 필요한 것을 만들고, 깔끔하게 유지하며, 실제 사용이 다음 단계를 형성하게 놔둔다.

피드백(Feedback): "빠르게 배우기"다. XP는 TDD(정확성·설계에 대한 즉각적 신호), 지속적 통합(통합 위험에 대한 빠른 신호), 정기적인 고객/팀 리뷰를 통해 피드백을 일상화한다.

용기(Courage): "불편하더라도 시스템을 개선하는 변화를 하라"는 뜻이다. 용기는 리팩토링과 죽은 코드를 지우는 것을 정상으로 만든다. 좋은 테스트와 CI는 그 용기를 합리적으로 만든다.

존중(Respect): "사람에게 지속 가능한 방식으로 일하라"는 의미다. 이는 페어링(서포트), 합리적 속도 유지, 코드 품질을 공동 책임으로 여기는 관행 뒤에 있다.

가치가 실제 트레이드오프를 어떻게 이끄는가

흔한 XP 선택: 만약 미래를 대비해 유연한 프레임워크를 "혹시 몰라" 만들어둘지, 아니면 지금 단순한 솔루션을 구현할지 선택할 수 있다. XP는 단순성을 선택한다: 테스트와 함께 단순한 버전을 배포하고, 진짜 두 번째 사용 사례가 생기면 리팩토링한다. 이것은 게으름이 아니라 피드백이 추측보다 낫다는 베팅이다.

TDD의 기원: 테스트에서 설계 피드백으로

XP 이전에는 테스트가 종종 프로젝트 끝 근처의 별개 단계였다. 팀은 몇 주 또는 몇 달 동안 기능을 만들고, 그다음 QA에 넘기거나 출시 직전에 대대적인 수동 "테스트 패스"를 했다. 버그는 늦게 발견되어 수정이 위험해졌고, 피드백 주기는 느렸다: 결함이 드러날 때쯤이면 코드가 이미 그 주위로 성장해 있었다.

"늦게 테스트"에서 테스트 퍼스트 규율로

켄트 벡이 TDD로 밀어붙인 것은 간단하지만 급진적인 습관이었다: 먼저 테스트를 쓰고, 실패를 확인한 다음, 통과시키기 위한 가장 작은 변경을 만든다. "먼저 실패하는 테스트" 규칙은 쇼가 아니다—코드가 어떻게 동작해야 하는지 명확히 하도록 강제한다.

Red–Green–Refactor를 쉽게 말하면

TDD는 보통 Red–Green–Refactor로 요약된다:

  • Red: 작은 동작에 대한 테스트를 작성한다. 예: "가격이 5와 7인 두 항목을 더하면 총합이 12다." 테스트를 실행해 실패를 본다.
  • Green: 테스트를 통과시키는 가장 단순한 코드를 구현한다(예: 항목 가격을 합산하는 total() 함수).
  • Refactor: 동작을 바꾸지 않고 코드를 정리한다—변수 이름 바꾸기, 중복 제거, 구조 개선—그런 다음 테스트를 다시 실행해 자신감을 유지한다.

단순히 "더 많은 테스트"가 아니었던 이유

더 깊은 변화는 테스트를 설계 피드백 도구로 대하기 시작한 것이다. 테스트를 먼저 쓰면 작은, 명확한 인터페이스로 유도되고 숨겨진 의존성이 줄어들며 변경하기 쉬운 코드가 만들어진다. XP 관점에서 TDD는 피드백 루프를 촘촘하게 했다: 몇 분마다 설계 방향이 작동하는지 배우며, 마음을 바꾸는 비용이 아직 낮을 때 배울 수 있다.

TDD가 일상 엔지니어링에 가져온 변화

TDD는 단순히 "테스트를 더 쓰는 것"이 아니다. 사고의 순서를 바꿨다: 먼저 작은 기대를 쓰고, 그다음 그것을 만족시키는 가장 단순한 코드를 작성하고, 마지막에 정리한다. 시간이 지나면 이 습관은 영웅적인 디버깅이 아니라 꾸준하고 저극적인 진전을 이끈다.

좋은 유닛 테스트의 모습

TDD를 잘 지원하는 유닛 테스트는 몇 가지 특성을 공유한다:

  • 빠름: 밀리초 단위로 실행되어 로컬에서나 커밋 전에 항상 실행할 수 있다.
  • 집중적: 각 테스트는 하나의 동작을 검사한다; 실패는 특정 문제를 가리킨다.
  • 읽기 쉬움: 테스트 이름과 설정이 의도(무엇이 일어나야 하는지)를 설명한다.

도움되는 규칙: 테스트가 왜 존재하는지 빠르게 말할 수 없다면, 그 테스트는 제몫을 하지 못하는 것이다.

API 설계에 대한 TDD의 조용한 영향

먼저 테스트를 쓰면 구현하기 전에 호출자의 입장이 된다. 이는 마찰이 즉시 드러나기 때문에 더 깔끔한 인터페이스로 이어지는 경우가 많다:

  • 어색한 생성자나 너무 많은 매개변수가 명백해진다.
  • 전역, 싱글턴, 시간, 무작위성 같은 숨겨진 의존성은 테스트 가능한 경계(seam)를 추가하게 만든다.
  • 작고 조합 가능한 함수들을 자연스럽게 설계하게 된다.

실제로 TDD는 사용하기 쉬운 API를 만들도록 팀을 유도한다. 그것은 단지 만들기 쉬운 API가 아니다.

흔한 오해

두 가지 신화가 많은 실망을 낳는다:

  • "TDD는 모든 것을 테스트하는 것이다." 중요한 동작을 적절한 수준에서 테스트하는 것이다. 어떤 코드는 통합 테스트나 간단한 어설션으로 검증하는 편이 더 낫다.
  • "TDD를 하면 통합 테스트가 필요 없다." 유닛 테스트는 작은 동작을 보호하고, 통합 테스트는 와이어링, 구성, 실제 의존성을 보호한다.

TDD가 가장 어려운 곳(그리고 대안)

TDD는 레거시 코드(강한 결합, 경계 없음)와 UI 중심 코드(이벤트 중심, 상태 많음, 프레임워크 접착)가 있는 곳에서 힘들다. 강제로 적용하기보다는:

  • 레거시 코드에는 기존 동작을 둘러싼 특성화(characterization) 테스트로 시작하고, 작은 단계로 리팩토링하라.
  • UI 중심 영역에서는 로직을 테스트 가능한 단위로 밀어넣고 경계에서는 통합/수용 테스트에 의존하라.

이렇게 사용하면 TDD는 순수성 검사(purity test)가 아니라 실용적인 설계 피드백 도구가 된다.

반복(이테레이션): 작은 배치로 배포하기

작업을 명확하게 공유하세요
커스텀 도메인으로 각 반복을 공유해 이해관계자의 피드백을 빠르게 받으세요.

XP에서의 반복은 작은 시간 박스 안에서 작업을 전달하는 것을 의미한다—완료, 검토, 학습할 수 있을 만큼 작은 배치다. 릴리스를 드문 이벤트로 다루지 않고, 전달을 빈번한 체크포인트로 다룬다: 작은 것을 만들고, 작동을 증명하고, 피드백을 받고, 다음에 무엇을 할지 결정한다.

짧은 주기가 위험을 줄이는 이유

큰 사전 계획은 몇 달 앞의 필요, 복잡성, 엣지케이스를 예측할 수 있다고 가정한다. 실제 프로젝트에서는 요구가 바뀌고, 통합에서 놀라움이 나오며, "간단한" 기능이 숨겨진 비용을 드러낸다.

짧은 반복은 틀릴 수 있는 기간을 제한해서 위험을 줄인다. 접근이 통하지 않으면 몇 달이 아니라 며칠 내에 알게 된다. 또한 이해관계자는 상태 보고서 대신 실제 가치 증분을 보게 된다.

가벼운 계획: 사용자 스토리 + 수용 기준

XP의 반복 계획은 의도적으로 단순하다. 팀은 종종 사용자 스토리를 사용하고—사용자의 관점에서 가치를 짧게 설명—수용 기준을 더해 "완료"의 정의를 평이한 언어로 적는다.

좋은 스토리는 누가 무엇을 원하는지, 왜 원하는지를 답한다. 수용 기준은 관찰 가능한 동작("내가 X를 하면 시스템이 Y를 한다")을 설명해 거대한 명세서 없이 모두의 정렬을 돕는다.

실용적 주기 예시(그리고 무엇을 검토할지)

일반적인 XP 주기는 주간 또는 격주다:

  • 주간 반복은 도메인이 불확실하거나 피드백이 중요한 경우에 적합하다. 범위를 작게 유지한다: 몇 개의 스토리, 얇은 수직 슬라이스, 빠른 릴리스.
  • 격주 반복은 다단계 작업에 약간 여유를 주면서도 정기적 통합과 검토를 강제한다.

각 반복의 끝에 팀은 보통 다음을 검토한다:

  • 무엇을 배포했는가(동작하는 소프트웨어 데모)
  • 수용 기준이 충족되었는가
  • 어떤 피드백이 우선순위를 바꿨는가
  • 무엇이 팀을 느리게 했는가(작은 회고와 하나 또는 두 개의 구체적 개선)

목표는 의례가 아니라 불확실성을 정보화된 다음 단계로 바꾸는 꾸준한 리듬이다.

피드백 루프: XP의 엔진

XP는 테스트, 페어링, 지속적 통합 같은 실천으로 자주 설명되지만, 통합 아이디어는 더 단순하다: 변화를 만들고 그것이 좋은지 아닌지를 배우는 시간을 줄이라는 것이다.

피드백은 실제로 어디서 오는가

XP는 여러 피드백 채널을 쌓아놓아 길게 기다리지 않도록 한다:

  • 테스트(특히 유닛 테스트): 동작이 여전히 유지되는지 즉시 신호를 준다.
  • 코드 리뷰/페어링: 맥락이 신선할 때 오해를 잡아낸다.
  • CI 빌드: 통합이 깨지는지 며칠 뒤가 아니라 빠르게 알게 한다.
  • 고객 데모(또는 이해관계자 체크인): 단지 "작동하는지"가 아니라 올바른 것을 만들었는지 검증한다.

빠른 피드백이 완벽한 예측보다 나은 이유

예측은 비용이 크고 종종 틀린다—실제 요구와 제약은 늦게 드러난다. XP는 모든 것을 예측할 수 없음을 가정하므로 방향을 바꿀 때 비용이 아직 감당할 수 있을 때 학습하도록 최적화한다.

빠른 루프는 불확실성을 데이터로 바꾼다. 느린 루프는 불확실성을 논쟁으로 만든다.

Idea → Code → Test → Learn → Adjust → (repeat)

느린 피드백의 비용

피드백이 며칠 또는 몇 주 걸리면 문제가 증폭된다:

  • 재작업이 커진다: 잘못된 가정 위에 더 많은 것을 쌓게 된다.
  • 결함이 굳어진다: 작은 버그가 복사되고 의존되면서 체계적 문제가 된다.
  • 기대가 어긋난다: 이해관계자는 한 결과를 상상하는 동안 팀은 다른 것을 배포한다.

XP의 "엔진"은 어떤 단일 실천이 아니라, 이러한 루프들이 서로를 강화해 작업을 정렬하고 품질을 높이며 놀라움을 작게 만드는 방식이다.

페어 프로그래밍: 실시간 품질 관리

코드 작성 전에 계획하세요
Planning Mode를 사용해 코드를 생성하기 전에 수용 기준을 명확히 하세요.

페어 프로그래밍은 흔히 "두 사람, 하나의 키보드"로 묘사되지만, XP에서 진짜 아이디어는 지속적인 리뷰다. 풀 리퀘스트를 기다리지 않고 분 단위로 피드백이 일어난다: 네이밍, 엣지 케이스, 아키텍처 선택, 그리고 변경이 가치 있는지 여부까지.

지속적 리뷰 + 공유된 컨텍스트

두 사람이 같은 문제에 관여하면 작은 실수가 비용이 적을 때 잡힌다. 네비게이터는 누락된 널 체크, 불명확한 메서드 이름, 위험한 의존성을 발견해 버그 리포트가 되기 전에 잡는다.

동시에 페어링은 컨텍스트를 퍼뜨린다. 코드베이스는 개인의 영토처럼 느껴지지 않는다. 지식이 실시간으로 공유되면 팀은 "어떻게 작동하는지 아는 한 사람"에 의존하지 않고 온보딩이 덜 보물찾기가 된다.

체감되는 피드백 이점

피드백 루프가 즉시이기 때문에 결함이 나중 단계로 많이 빠져나가지 않는 경우가 많다. 설계도 개선된다: 복잡한 접근을 소리내어 설명해야 할 때 정당화하기 어려워진다. 결정을 서술하는 행위는 더 단순한 설계, 더 작은 함수, 더 명확한 경계를 드러내는 경향이 있다.

흔한 우려(그리고 XP 팀이 처리하는 방식)

  • "비용이 두 배 아니냐?" 그런 경우가 아니다—재작업, 긴 리뷰, 운영 이슈를 막으면 결과적으로 절약된다. 나중의 수습을 초기에 명확성으로 바꾼다.
  • 피로감: 하루 종일 페어링은 피곤할 수 있다. 많은 팀은 선택적으로 페어링한다(새 기능, 까다로운 리팩토링) 그리고 일상 작업은 단독으로 한다.
  • 기술 수준 불일치: 흔한 일이다. 잘하면 비공식 멘토링이 되면서도 산출물을 낸다.

실용적 페어링 패턴

드라이버/네비게이터: 한 사람이 코드를 쓰고 다른 사람은 리뷰, 앞을 생각하고 질문한다. 역할을 규칙적으로 바꾼다.

로테이팅 페어: 파트너를 매일 또는 스토리별로 바꿔 지식 사일로를 방지한다.

시간 박스 세션: 60–90분 동안 페어링 후 휴식하거나 작업 전환. 집중을 유지하고 소진을 줄인다.

리팩토링: 코드가 성장하면서 건강하게 유지하기

리팩토링은 소프트웨어의 동작을 바꾸지 않으면서 내부 구조를 변화시키는 관행이다. XP에서는 가끔 하는 정리 날이 아니라, 기능 개발과 함께 작은 단계로 일상적으로 수행하는 작업이었다.

왜 XP는 리팩토링을 습관으로 만들었나

XP는 요구가 바뀔 것이라 가정했고, 변경에 대응하려면 코드를 변경하기 쉽게 유지하는 것이 최선의 방법이라고 봤다. 리팩토링은 명명 혼동, 얽힌 의존성, 복사-붙여넣기 로직의 점진적 축적인 "설계 붕괴"를 막아 다음 변경을 더 빠르고 덜 위험하게 만든다.

TDD가 리팩토링을 안전하게 만드는 방법

리팩토링은 안전망이 있을 때만 편하다. TDD는 빠르게 반복 가능한 테스트 스위트를 만들어 리팩토링 중 실수로 동작이 바뀌었는지 알려준다. 테스트가 그린 상태라면 자신 있게 이름을 바꾸고, 재구성하고, 단순화할 수 있다. 실패하면 무엇을 망가뜨렸는지 빠르게 알 수 있다.

흔한 리팩토링 목표

리팩토링은 기교가 아니라 명확성과 유연성을 위한 것이다:

  • 가독성: 더 나은 이름, 더 작은 함수, 의도 명확화.
  • 중복 제거: 세 군데의 비슷한 로직 대신 하나의 잘 이름 붙여진 로직.
  • 명확한 경계: 책임을 분리해 변경이 도미노처럼 번지지 않게 하기(예: 비즈니스 규칙을 DB나 UI 코드와 분리).

피해야 할 안티패턴

두 가지 실수가 반복된다:

  • 테스트 없이 리팩토링하기: 눈감고 개선하면 팀은 만지기 무서워진다.
  • 리팩터로 위장한 대규모 재작성: 동작이 바뀌고 일정이 폭주하며 XP가 의존하는 꾸준한 학습을 잃는다. 리팩토링은 점진적이고 검증 가능하며 되돌릴 수 있어야 한다—작은 단계로 시스템을 건강하게 유지하면서 성장시켜라.

지속적 통합(CI): 문제가 작을 때 잡아내기

지속적 통합(CI)은 XP의 아이디어로 간단한 목표가 있다: 자주 병합해서 문제가 작을 때 드러나게 하라. 각자가 며칠(또는 몇 주)씩 격리되어 기능을 만들고 나서야 서로 맞지 않음을 발견하는 대신, 팀은 소프트웨어를 여러 번에 걸쳐 안전하게 통합할 수 있는 상태로 유지한다.

XP 관점의 CI: 자주 통합하라

XP는 통합을 피드백의 한 형태로 본다. 모든 병합은 실용적인 질문에 대답한다: 우리가 실수로 뭔가를 망가뜨렸는가? 우리의 변경이 다른 사람의 변경과 여전히 작동하는가? 그 대답이 "아니오"일 때, 그 사실을 몇 분 내에 알기를 원한다.

파이프라인이 하는 일(전문 용어 없이)

빌드 파이프라인은 코드 변경 시마다 실행되는 반복 가능한 체크리스트다:

  • 제품을 조립한다(그래서 "빌드"가 여전히 되는지 안다).
  • 자동화된 검사를 실행한다(핵심 동작이 여전히 작동하는지 확인).
  • 결과를 빠르게 보고한다(컨텍스트가 생생할 때 문제를 고칠 수 있게).

비기술적 이해관계자에게도 가치는 분명하다: 놀라운 장애가 줄고, 데모가 부드러워지고, 막판 소동이 줄어든다.

왜 반복을 가속화하는가

CI가 잘 작동하면 팀은 작은 배치를 더 자신 있게 배포할 수 있다. 그 자신감은 행동을 바꾼다: 사람들은 개선을 더 자주 시도하고, 안전하게 리팩토링하며, 변경을 쌓아두지 않고 점진적으로 가치를 전달한다.

현대적 추가 기능(교조 없이)

오늘날의 CI는 보안 스캔, 스타일 검사, 성능 스모크 테스트 같은 더 풍부한 자동 검사를 포함하고, 트렁크 기반 개발(trunk-based development) 같은 워크플로우를 사용해 변경을 작게 유지하고 빠르게 통합한다. 핵심은 단일한 "정답"을 따르는 것이 아니라 피드백을 빠르게 하고 통합을 일상으로 만드는 것이다.

비판, 오용, 그리고 XP를 조정해야 할 때

빠른 XP 스파이크 만들기
프롬프트로 React 웹앱 시제품을 만들고, XP 방식의 반복으로 범위를 조정하세요.

XP는 규율이 명확하기 때문에 강한 의견을 끌어모은다. 그게 오해되기 쉬운 이유이기도 하다.

흔한 반발(그리고 그 안의 진실)

사람들은 종종 "XP는 너무 엄격하다" 또는 "TDD는 속도를 늦춘다"고 말한다. 둘 다 일시적으로 사실일 수 있다.

XP 실천은 의도적으로 마찰을 추가한다: 먼저 테스트를 쓰기, 페어링, 지속적 통합은 "그냥 코딩"보다 느리게 느껴진다. 그러나 그 마찰은 이후 더 큰 세금(불명확한 요구, 재작업, 취약한 코드, 긴 디버깅 주기)을 방지하려고 만들어진 것이다. 진짜 질문은 오늘의 속도가 아니라 다음 달에도 계속 배포할 수 있느냐이다.

XP가 가장 잘 맞는 상황—그리고 조정할 때

XP는 요구가 불확실하고 학습이 핵심 업무일 때 빛을 발한다: 초기 제품, 복잡한 도메인, 진화하는 고객 요구, 아이디어와 실제 피드백 사이의 시간을 줄이려는 팀. 작은 반복과 촘촘한 피드백 루프는 틀렸을 때의 비용을 줄인다.

규제가 심하거나 많은 종속성이 있거나 전문가가 많은 팀 같은 제약이 큰 작업에서는 조정이 필요할 수 있다. XP는 순수함을 요구하지 않는다. 무엇이 피드백을 주는지, 무엇이 문제를 숨기는지에 대해 정직하면 된다.

흔한 실패 양상

가장 큰 실패는 "XP가 작동하지 않았다"가 아니라:

  • 회고, 테스트, 고객 리뷰 같은 피드백 관행을 건너뛰고 회의만 남김
  • 의례를 모방하되("우리는 페어한다", "우리는 스탠드업 한다") 의사결정 검증 방식을 바꾸지 않음
  • TDD를 설계 피드백이 아닌 관료주의로 대함

작게 시작하기

한 가지 루프를 골라 강화하라:

  • 품질에 문제가 있다면: 가장 자주 변경되는 코드에 대한 테스트부터 시작하라.
  • 방향성에 문제가 있다면: 반복 주기를 줄이고 실질적 리뷰/데모 순간을 추가하라.

하나의 루프가 안정되면 다음을 더하라. XP는 시스템이지만 한 번에 모두 도입할 필요는 없다.

지속되는 문화적 영향: 현대 팀에서의 XP 아이디어

XP는 페어링, TDD, 리팩토링 같은 특정 실천으로 기억되지만, 더 큰 유산은 문화다: 품질과 학습을 프로젝트 끝이 아니라 일상적 작업으로 보는 팀 문화.

XP가 조용히 현대적 작업 방식에 끼친 영향

지금 팀들이 애자일, 데브옵스, 지속적 딜리버리, 제품 탐색이라 부르는 많은 것들이 XP의 핵심 움직임을 반영한다:

  • 배치 축소: 위험을 줄이기 위해 더 작은 변경을 더 자주 배포.
  • 피드백 촘촘화: 테스트, 동료, 운영에서 더 일찍 신호를 얻기.
  • 작업 가시화: "완벽한" 예측보다 업데이트 가능한 단순한 계획 선호.

팀이 "XP"라고 부르지 않을 때에도, 트렁크 기반 개발, CI 파이프라인, 기능 플래그, 가벼운 실험, 빈번한 고객 접촉 같은 동일한 패턴을 보게 될 것이다.

AI 지원 도구 시대의 XP

XP가 여전히 유효하게 느껴지는 이유 중 하나는 그 학습 루프가 현대 도구와도 잘 맞기 때문이다. 제품 아이디어를 실험할 때 Koder.ai 같은 도구는 반복 주기를 더 압축한다: 채팅으로 기능을 설명하면 작동하는 웹 앱(React)이나 백엔드(Go + PostgreSQL)를 생성하고, 실제 사용을 바탕으로 다음 스토리를 정제할 수 있다.

XP 친화적인 부분은 "마법 같은 코드 생성"이 아니라 배치를 작고 되돌릴 수 있게 유지하는 능력이다. 예를 들어 Koder.ai의 planning mode는 구현 전에 의도를 명확히 하는 데 도움을 주고(수용 기준을 쓰는 것과 유사), 스냅샷/롤백은 리팩토링이나 위험한 변경을 대규모 재작성으로 만들지 않고도 시도할 수 있게 한다.

지속되는 문화적 효과

XP는 팀을 다음으로 유도한다:

  • 공유된 소유권: 코드는 팀의 자산이며 개선이 한 사람을 기다리지 않는다.
  • 학습 지향성: 실수는 정보이며, 시스템은 실수를 반복하기 어렵게 변경된다.
  • 습관으로서의 품질: 테스트, 리팩토링, 리뷰는 "추가 작업"이 아니라 작업 방식이다.

실용적 미니 체크리스트(이번 주에 사용해보라)

  • 몇 분 내에 테스트나 빌드 결과를 얻을 수 있는가? 몇 시간이 아니라.
  • 몇 시간/며칠 안에 배포할 수 있는가? 몇 주가 아니라.
  • 일상 작업의 일부로 소규모로 리팩토링하는가?
  • 중요 변경에 대해 실제 피드백 의식(페어링, 리뷰, 또는 모빙)이 있는가?
  • CI가 빨리 실패하고 팀은 빨간 빌드를 긴급하게 다루는가?

더 탐구하고 싶다면 /blog의 다른 에세이를 읽어보거나, /pricing에서 가벼운 도입 계획이 어떻게 보일지 확인해보라.

자주 묻는 질문

익스트림 프로그래밍(XP)이란 무엇인가요?

XP는 작은 변경, 잦은 릴리스, 빠른 피드백을 통해 소프트웨어를 만드는 방식입니다. 켄트 벡은 요구사항이 바뀌어도 품질이 떨어지지 않도록 팀을 돕기 위해 이를 개발했습니다.

켄트 벡은 XP에 어떤 기여를 했나요?

켄트 벡은 XP를 정의하는 데 기여했고 테스트 주도 개발을 널리 알렸습니다. 그의 작업은 팀이 긴 사전 계획에 의존하는 대신, 작동하는 소프트웨어를 더 일찍 통해 배울 수 있도록 돕는 데 초점을 맞췄습니다.

테스트 주도 개발은 어떻게 작동하나요?

TDD는 원하는 동작을 설명하는 작은 테스트로 시작합니다. 간단한 코드로 테스트를 통과시킨 뒤, 테스트가 동작을 보호하는 동안 설계를 정리합니다.

Red-Green-Refactor는 무엇을 의미하나요?

일반적인 주기는 Red, Green, Refactor입니다. 실패하는 테스트를 작성하고, 가장 작은 유용한 변경으로 통과시킨 다음, 결과를 바꾸지 않고 코드를 개선합니다.

XP는 왜 짧은 반복을 사용하나요?

짧은 반복은 검증되지 않은 가정을 바탕으로 만들어지는 작업량을 제한합니다. 팀은 며칠 또는 몇 주 안에 작동하는 소프트웨어를 보여주고, 피드백을 수집하며, 우선순위를 조정할 수 있습니다.

XP는 어떤 피드백 루프를 사용하나요?

테스트는 동작을 확인하고, 페어 프로그래밍이나 리뷰는 오해를 잡아내며, CI는 변경 사항이 함께 작동하는지 확인하고, 사용자 데모는 기능이 올바른 문제를 해결하는지 검증합니다. 여러 피드백 루프를 사용하면 팀은 서로 다른 방향에서 더 빠른 신호를 얻습니다.

TDD가 통합 테스트를 대체하나요?

아니요. TDD는 빠르고 집중적인 확인이 유용한 동작에 가장 효과적입니다. 팀은 데이터베이스, 서비스, 구성 및 시스템 경계에서 함께 작동할 때만 검증할 수 있는 다른 부분을 위해 여전히 통합 테스트가 필요합니다.

페어 프로그래밍은 시간을 들일 가치가 있나요?

페어 프로그래밍은 두 사람이 설계에 즉시 의문을 제기하고, 엣지 케이스를 발견하며, 맥락을 공유할 기회를 줍니다. 많은 팀은 하루 종일 모든 작업에 적용하기보다 복잡한 작업, 익숙하지 않은 코드 또는 멘토링에 이를 활용합니다.

팀은 어떻게 안전하게 리팩터링할 수 있나요?

리팩터링은 코드의 동작은 그대로 유지하면서 구조를 바꾸는 작업입니다. 테스트를 자주 실행하며 작은 단계로 진행하면 정리가 예측하기 어려운 재작성으로 바뀌는 일을 막을 수 있습니다.

모든 실천 방법을 도입하지 않고 팀이 XP를 시작하려면 어떻게 해야 하나요?

가장 고통스러운 루프 하나부터 시작하세요. 자주 바뀌는 코드 주변에 빠른 테스트를 추가하고, 데모까지 걸리는 시간을 줄이거나, 모든 변경이 CI를 거치게 하세요. 유용한 피드백을 만드는 방식을 유지하고, 팀이 지속할 수 있을 때 다음 방식을 추가하세요.

Related posts