짝 프로그래밍(Pair Programming)
[!tldr] 한줄 요약 두 명이 한 컴퓨터에서 드라이버-내비게이터 역할을 교대하며 함께 코딩하는 실천법으로, 코딩이 아닌 대화와 협력을 통해 함께 자라는 것이 본질이다.
핵심 내용
정의
두 명의 개발자가 한 대의 컴퓨터 앞에서 함께 코드를 작성하는 익스트림 프로그래밍(XP)의 핵심 실천법이다. 단순히 같이 앉아있는 게 아니라, 계획·논의·코드 리뷰를 동시에 수행하는 능동적 협력이다.
두 가지 역할
- 드라이버(Driver): 키보드를 잡고 실제 코딩을 수행. 세부 구현에 집중
- 내비게이터(Navigator): 전체 그림을 보며 방향 제시, 잠재적 문제 파악, 실시간 리뷰
역할은 주기적으로 교대한다. 교대 기준은 세 가지:
- 시간 기반: 5~25분마다 알람으로 교대
- 태스크 기반: 하나의 작업 단위가 끝나면 교대
- 아이디어 기반: 드라이버가 방향을 제시하고 싶을 때 교대
주요 스타일
1. 드라이버-내비게이터(Driver-Navigator)
가장 전통적인 방식. 한 명이 코딩하면 다른 한 명이 실시간 검토 및 큰 그림을 제시한다.
2. 핑퐁(Ping-Pong)
테스트 주도 개발(TDD) 기반 개발에 적합하다. A가 실패하는 테스트 작성 → B가 구현 코드 작성 → B가 새 실패 테스트 → A가 구현. 한 명이 키보드를 독점하는 문제를 구조적으로 해결한다.
3. 강한 스타일(Strong Style)
"아이디어가 코드가 되려면 반드시 다른 사람의 손을 거쳐야 한다." 경험자가 내비게이터, 초보자가 드라이버 역할을 맡는다. 신입 온보딩에 특히 효과적이다.
4. 몹 프로그래밍(Mob Programming)
여러 명이 돌아가며 드라이버를 맡는 확장 형태. 커뮤니케이션 비용을 줄이고 코딩 스타일을 통일하는 데 효과적이다.
왜 효과적인가
- 결함 감소: 연구 결과 결함이 절반으로 줄어든다
- 지식 공유: 전문가의 암묵지(tacit knowledge) 전달, 신입 온보딩 가속
- 집중력 강화: 서로가 서로의 몰입(Flow) 상태를 유지시켜줌
- 즉각적 피드백: 4개의 눈으로 실시간 코드 리뷰
- 집단 코드 소유권: 모든 코드를 최소 2명이 이해하여 병목 현상 제거
- 의도적 수련의 장: 타인의 사고방식과 문제 해결 과정을 직접 관찰하며 학습
도전과제와 대응
| 도전과제 | 대응 방안 |
|---|---|
| 피로감 | 포모도로 기법(25분 작업 + 휴식), 하루 최대 6시간 |
| 키보드 독점 | 핑퐁 스타일로 강제 교대 |
| 기술 수준 차이 | 강한 스타일로 초보자에게 키보드를, 5초 규칙 |
| 감정적 마찰 | 심리적 안전감(Psychological Safety) 확보가 전제 |
| 생산성 저하 우려 | 약 15% 더 시간 소요되나 결함 절반 감소로 총 비용 절감 |
김창준의 관점
김창준은 짝 프로그래밍에 대해 실용주의적 접근을 강조한다:
- 고정관념을 버려라: 틀에 짜인 방식만 고집하지 말고 팀 상황에 맞게 유연하게 적용
- 사이드 바이 사이드 프로그래밍: 전통적 짝 프로그래밍이 어려운 환경(각자 다른 서비스를 담당하는 팀)에서의 실용적 변형
- 대화를 통한 추상화: 짝 프로그래밍의 본질은 코딩이 아니라 대화와 협력을 통한 추상화 수준 향상
워드 커닝햄과의 짝 프로그래밍 경험에서 김창준은 두 가지를 배웠다:
- 작은 단계로 나누기: 워드는 문제를 예상보다 훨씬 세밀하게 분절하고, "더러운" 중간 상태의 코드도 과감히 사용한다. 미학적 기준보다 학습과 진행 속도를 우선시한다.
- 예상치 못한 상황에 대한 태도: 에러 상황에서 "Hm... That's interesting"이라고 반응한다. 예상 못한 상황 하나하나가 학습으로 가는 길이다.
성공을 위한 핵심 원칙
- 타이핑보다 대화가 중요하다 — 직접 코딩하지 말고 지시하고 질문하기
- 실수하도록 두기 — 실수는 학습 기회. 5초 규칙(드라이버 실수 지적 전 5초 대기)
- "모른다"고 말할 수 있는 환경 — 심리적 안전감이 전제
- 정기적 휴식 — 지속적인 대화와 집중은 체력을 소모한다
- 불편함은 성장의 신호 — 다양한 배경의 팀일수록 초기 불편함이 크지만, 이를 극복한 팀은 더 강력한 성과를 낸다
예시
[!example] 핑퐁 스타일 (TDD 기반) A:
isEven(3)이false를 반환하는 테스트를 작성한다 B:isEven함수를 구현하여 테스트를 통과시킨다 B:isEven(-2)가true를 반환하는 테스트를 작성한다 A: 음수도 처리하도록 구현을 수정한다 → 역할이 자연스럽게 교대되고, 테스트와 구현이 동시에 진행된다
[!example] 강한 스타일 (온보딩) 시니어(내비게이터): "여기서
UserService의findById메서드를 호출해보세요" 주니어(드라이버): 키보드로 직접 입력하며 코드베이스를 익힌다 시니어: 이해가 어려우면 더 구체적으로 — "10번째 줄에서const user = await까지 입력해보세요" → 아이디어는 시니어의 머릿속에서 나오지만, 반드시 주니어의 손을 거쳐야 한다
참고 자료
- 실용주의적 짝 프로그래밍? - 김창준
- 워드 커닝햄과 짝 프로그래밍을 - 김창준
- On Pair Programming - Martin Fowler
- 짝 프로그래밍(Pair Programming)이란 - Heee's Development Blog
- 페어 프로그래밍이란 무엇일까? - KihoonKim:Dev
관련 노트
- 피드백 루프(Feedback Loop) — 짝 프로그래밍의 가장 빠른 피드백 채널
- 심리적 안전감(Psychological Safety) — "모른다"고 말할 수 있는 환경의 전제 조건
- 의도적 수련(Deliberate Practice) — 전문가의 암묵지를 관찰하며 학습하는 장
- 몰입(Flow) — 짝 프로그래밍이 집중력을 유지시키는 원리
- 테스트 주도 개발(TDD) — 핑퐁 스타일의 기반
- 익스트림 프로그래밍(XP) — 짝 프로그래밍이 속한 방법론
- 회고(Retrospective) — 짝 프로그래밍 경험을 돌아보는 피드백 의식
- 코칭(Coaching) — 강한 스타일에서 내비게이터의 코칭 역할