애자일 팀이 계획, 개발, 테스트를 한 번에 길게 이어 가는 방식(워터폴) 대신 짧은 단계를 반복하며 만드는 이유(반복 방식), 그리고 그것이 팀이 지치지 않고 몇 년씩 계속 일할 수 있게 해 주는 이유를 설명합니다. 읽는 데 약 10분이 걸립니다.
카페를 연다고 생각해 보세요. 한 가지 방법은 1년 동안 완벽한 카페를 설계하고 전부 지은 다음, 문을 열고 사람들이 좋아해 주기를 바라는 것입니다. 다른 방법은 커피 수레 하나로 시작해서 사람들이 실제로 무엇을 주문하는지 보고, 좌석을 더하고, 음식을 더하며 계속 고쳐 나가는 것입니다. 둘 다 결국 카페가 됩니다. 하지만 사람들이 내 커피를 원하는지 일찍 알려 주는 것은 한쪽뿐입니다.
| 워터폴 | 반복 방식 | |
|---|---|---|
| 일을 나누는 방식 | 단계별로: 계획을 전부 하고, 그다음 전부 만들고, 그다음 전부 테스트 | 짧은 주기로: 주기마다 작은 조각 하나를 계획하고 만들고 테스트 |
| 사용자가 작동하는 것을 처음 보는 때 | 맨 마지막, 흔히 여러 달 뒤 | 첫 주기가 끝난 뒤, 보통 몇 주 안에 |
| 우리가 틀렸음을 알게 되는 때 | 늦게, 예산 대부분을 이미 쓴 뒤 | 일찍, 작은 조각 하나를 만든 뒤 |
| 변경에 드는 비용 | 큼: 계획, 설계, 완성한 작업을 버려야 함 | 작음: 다음 작은 조각을 조정하면 됨 |
| 진척을 재는 방법 | 문서와 퍼센트("80% 완료했습니다") | 사람들이 직접 써 볼 수 있는 작동하는 제품 |
| 위험이 있는 곳 | 마지막에 한꺼번에 쌓임 | 모든 주기에 얇게 나뉨 |
핵심 개념: 반복 방식은 "계획이 없다"는 뜻이 아닙니다. 추측으로 모든 것을 한 번에 계획하는 대신, 실제 근거를 가지고 조금씩 자주 계획한다는 뜻입니다.
워터폴은 어리석은 방식이 아닙니다. 완전한 계획, 정해진 날짜, 분명한 예산이 있으니 안전하게 느껴집니다. 문제는 그 안에 숨어 있는 가정들입니다.
틀렸을 때 치르는 비용은 걸음의 크기만큼 커집니다. 12개월짜리 걸음을 내디디면 잘못 든 길 하나가 12개월을 앗아 갈 수 있습니다. 2주짜리 걸음이라면 많아야 2주입니다. 가끔 틀리는 것을 막을 수는 없지만, 틀리는 비용을 싸게 만들 수는 있습니다.
일이 잘 알려져 있고, 이미 여러 번 해 본 일이며, 나중에 바꾸기가 물리적으로 어렵다면(콘크리트 기초를 붓는 일, 정해진 법적 기준을 맞추는 일) 먼저 자세히 계획하는 것이 합리적입니다. 대부분의 소프트웨어와 지식 업무는 그 반대입니다. 매번 새롭고 바꾸기 쉽습니다. 작은 걸음으로 만드는 방식이 빛을 발하는 곳이 바로 여기입니다.
짧은 주기는 매번 실제로 작동하는 작은 조각으로 끝납니다. 이 습관 하나에서 여섯 가지 이점이 나옵니다.
실제 사용자가 2주 정도마다 실제 결과물에 반응합니다. 그 반응이 다음 걸음을 정합니다. 출시 뒤에 쓰는 보고서가 아닙니다.
가장 걱정되는 불확실한 부분부터 작은 실험으로 다룹니다. 안 되는 아이디어라면 10개월째가 아니라 2주째에 알게 됩니다.
가장 가치 있는 조각을 먼저 만들기 때문에, 나머지를 만드는 동안 이미 효과를 내기 시작합니다.
모든 걸음은 작동하는 결과물로 끝납니다. 예산이나 우선순위가 바뀌어도 그때까지 끝낸 것은 모두 남습니다.
진척은 슬라이드 위의 퍼센트가 아니라 오늘 작동하는 것입니다. 마지막에 놀랄 일이 없습니다.
주기마다 조금 더 잘 일할 기회가 있습니다. 1년에 스물여섯 번의 작은 개선이 프로젝트 끝의 "교훈 정리" 회의 한 번보다 낫습니다.
| 문제 | 워터폴에서 발견하는 때 | 반복 방식에서 발견하는 때 |
|---|---|---|
| 사용자의 요구를 잘못 이해했다 | 끝 무렵 사용자 테스트에서 | 몇 주 안에 열리는 첫 리뷰에서 |
| 기술적인 접근이 통하지 않는다 | 몇 달 뒤 전체를 합칠 때 | 그 부분을 처음 다루는 주기에서 |
| 일이 추정보다 크다 | 마감이 밀릴 때 | 한두 주기 뒤, 실제 속도를 보고 |
| 우선순위가 바뀐다 | 변경 요청, 재계획, 지연 | 다음 주기 전에 목록 순서를 바꿈 |
점진적(incremental)이란 조각을 하나씩 더해 간다는 뜻입니다. 반복적(iterative)이란 이미 만든 것을 다시 다듬어 더 좋게 만든다는 뜻입니다. 좋은 팀은 둘 다 합니다. 모든 걸음이 작동하는 얇은 조각을 하나 더하고, 동시에 이미 있는 것을 다듬을 기회가 됩니다.
화가를 떠올려 보세요. 캔버스 한쪽 구석을 완벽하게 끝낸 뒤에야 나머지에 손대는 것은 점진적이기만 한 방식입니다. 전체 그림을 거칠게 스케치한 다음 여러 번에 걸쳐 세부를 더하는 것이 반복적인 방식입니다. 거친 스케치는 첫날부터 쓸모가 있습니다. 구도가 잘못되었는지 바로 볼 수 있기 때문입니다.
미니 워터폴을 조심하세요: "설계 스프린트", 그다음 "개발 스프린트", 그다음 "테스트 스프린트"는 잘게 나누었을 뿐 여전히 워터폴입니다. 모든 주기는 작동하고 실제로 쓸 수 있는 결과물로 끝나야 합니다. 일을 그렇게 자르는 방법은 슬라이싱과 사이징에서 다룹니다.
애자일 선언문의 열두 가지 원칙 중 하나는 후원자, 개발자, 사용자가 일정한 속도를 언제까지나 유지할 수 있어야 한다고 말합니다. 여기서 "지속 가능하다"는 것은 그런 뜻입니다. 느리다는 것이 아니라 오래갈 만큼 꾸준하다는 것입니다.
워터폴에서는 막판 몰아치기가 거의 정해져 있습니다. 예상 못 한 일은 끝에 가서 터지고 날짜는 고정되어 있으니, 더 내놓을 수 있는 것은 사람들의 저녁과 주말뿐입니다. 작은 걸음으로 일하면 뜻밖의 일을 생길 때마다 조금씩 처리합니다.
유용한 테스트: 팀이 이번 주와 똑같이 앞으로 2년 동안 일할 수 있을까요? 답이 "아니요"라면 지금의 속도는 빌려 온 것이고, 이자를 붙여 갚게 됩니다.
| 반론 | 답 |
|---|---|
| "예산을 승인받으려면 전체 계획이 필요합니다." | 계획은 세우되 알맞은 수준으로 세웁니다. 분명한 목표, 대략적인 로드맵, 예산이면 됩니다. 달라지는 점은 세부 사항을 근거가 쌓이는 대로 단계마다 정한다는 것입니다. |
| "반복 방식은 아키텍처나 설계가 없다는 뜻이죠." | 다음 몇 걸음에 필요한 만큼 설계하고 자주 다시 본다는 뜻입니다. 큰 결정도 여전히 신중하게 내립니다. 다만 더 많이 알게 된 나중에 내립니다. |
| "고객은 확정된 날짜를 원합니다." | 날짜와 예산을 고정하고 범위를 유연하게 두세요. 가장 가치 있는 조각부터 만들기 때문에, 그 날짜까지 끝낸 것이 곧 가능했던 최선의 버전입니다. |
| "덜 된 것을 보여 주면 프로답지 않아 보입니다." | 우리가 보여 주는 것은 작지만 완성된 결과물이며, 덜 된 것과는 정반대입니다. 이해관계자 대부분은 큰 약속보다 작더라도 작동하는 것을 더 좋아합니다. |
| "피드백을 받으려고 멈추면 느려집니다." | 잘못된 것을 한 번도 만들지 않는 팀이라면 그렇습니다. 대부분의 팀은 잘못된 것을 만들고, 그 사실을 늦게 알수록 훨씬 더 느려집니다. |