////
Search
Duplicate
🌁

1장. 애자일 소개

2001년 2월, 17명의 소프트웨어 전문가들이 개탄스러운 소프트웨어 개발 현실을 논의하기 위해 유타주 스노버드에 모였다.
당시에는 소프트웨어를 폭포수나 래셔널 통합 프로세스같은 프로세스를 이용해서 개발했는데, 이런 프로세스는 비효율적이고 복잡한 데다 매우 형식적이었다.
그래서 자리에 모인 17명의 전문가들은 더 효율적이고 가벼운 접근 방법을 소개하는 선언문을 작성하고자 했다.
그렇게 탄생한 것이 애자일 선언으로 이는 지금까지도 소프트웨어 분야에서 가장 강력하고 오래 이어져온 운동이 되었다.
불행하게도 어떤 운동이 인기를 얻으면 오해나 잘못된 사용 때문에 운동의 이름이 퇴색하기 마련으로 실제 운동과는 아무런 관계가 없는 제품이나 방법론이 이름을 가져다 붙이기 마련이다.
여기서는 애자일의 근본적인 내용을 다룬다. 많은 사람이 이 근본적인 아이디어를 더 꾸미고 확장시키는데, 이렇게 꾸미고 확장된 것은 애자일이 아니다.
이 책에서는 애자일은 무엇이고, 무엇이었고 앞으로도 영원히 무엇일지를 다룬다.

애자일의 역사

애자일은 언제 탄생했을까? 아마 5만여 년 전, 인류가 처음으로 공동의 목표를 위해 힘을 모으기로 한 때였을 것이다.
중간 단계의 작은 목표를 고르고 그 진행 상황을 측정한다는 아이디어는 너무나 직관적이다.
현대 산업에서는 언제부터 애자일이 쓰였을까?
저자의 생각으로는 최초의 증기기관, 최초의 제분기, 최초의 내연기관 등이 모두 오늘날 애자일이라고 부르는 방법으로 만들어졌을 것이라고 추측한다.
측정 가능한 작은 단계들을 밟는다는 것은 너무나도 자연스럽고 인간적이어서 다른 방법으로 만들었으리라 생각이 들지 않기 때문이다.
소프트웨어에서 애자일은 언제 시작되었을까?
애자일이라고 부를 만한 행동들을 쉽게 찾아볼 수 있었으나 그때 당시에는 제조업과 산업 전반에서 상당한 성공을 거둔 과학적 관리법이라는 것이 유행이었다.
이는 하향식, 지휘 및 통제 접근법으로 관리자는 과학적 기법을 써서 목표를 달성하는 최고의 방법을 알아낸 후, 그 계획을 토씨 하나 틀리지 말고 따르라고 하급자한테 시킨다.
다시 말해 이는 계획을 세우는 데, 먼저 많은 노력을 기울인 다음 그 계획을 주의 깊고 세세하게 실천하는 것이다.
1970년, 소프트웨어 세계가 이 두 가지 기법의 갈림길 앞에 서있었다.
과학적 관리법은 변경 비용이 많이 드는 프로젝트에서 제일 잘 작동했다. 즉, 목표가 극도로 명확한 매우 상세하게 정의된 문제를 잘 풀었다.
선-애자일은 변경 비용이 작은 프로젝트에서 잘 동작했고 목표가 명확하게 세워지지 않은 불완전하게 정의된 문제를 잘 풀었다.
이 갈림길에서 던져야 했던 질문은 소프트웨어 프로젝트라는 것이 어떤 종류의 프로젝트인가 하는 것이었다.
변경 비용이 많이 들고 명확한 목표로 상세하게 정의된 것인가? 아니면 변경 비용이 적게 들고 불명확한 목표로 불완전하게 정의된 것인가
1970년, 윈스턴 로이스의 논문에서 폭포수 개발의 모델이 된 프로세스 형태가 제안되었다.
이는 과학적 관리법의 이론적인 후예로, 철저한 분석을 하고 상세한 계획을 세우고 계획을 실행하여 완성하는 것에 관한 이야기다.
시간이 흐르면서 이론적으로 완벽해보였던 폭포수 방법론은 결과적으로 성공적이지 못했고 소프트웨어 학계의 성장에 따라 점차 새로운 경량 프로세스에 대한 논의가 필요해지던 순간이었다.

스노버드

17명의 참가자는 서로 다른 몇 가지 관점을 대표했는데, 먼저 다섯 가지 경량 프로세스가 있었다.
XP, 스크럼, 기능 주도 개발, 동적 시스템 개발 방법, 크리스털 계열 프로세스(앨리스터 코오번)이 있었다.
회의는 이슈들을 카드에 쓰고 카드를 분류하여 관련된 것끼리 모아 바닥에 늘어놓는 식으로 진행되었다.
그런 회의에서 완성된 네 문장은 다음과 같다.
공정과 도구보다 개인과 상호작용
포괄적인 문서보다 작동하는 소프트웨어
계약 협상보다 고객과의 협력
계획을 따르기보다 변화에 대응하기
프로세스에 관한 이름 중, 애자일, 적응, 경량 등 다양한 이름들이 거론되었으나 최선은 없었고 애자일로 결정되었다.

애자일 개요

소프트웨어 프로젝트를 어떻게 관리해야 할까?
수년간 많은 접근 방법이 시도되었지만 결과는 대부분 상당히 좋지 않았다.

철십자

그런 기법들이 처절하게 실패하는 이유는 그 기법을 사용하는 관리자가 소프트웨어 프로젝트의 근본적인 물리 법칙을 이해하지 못하기 때문이다.
이 물리 법칙은 모든 프로젝트는 일종의 상충 관계를 벗어날 수 없다는 것인데, 이 상충 관계를 프로젝트 관리의 철십자라고 한다.
좋음, 빠름, 저렴함, 완성 이 중 셋만 고를 수 있다. 모두를 고를 수는 없다. 어느 하나는 포기해야하는 것이다.
좋은 프로젝트 관리자라면 이 네 가지 속성에 가중치를 둘 수 있다는 것을 이해하고 있다. 좋은 관리자는 프로젝트를 필요한 만큼 좋고, 빠르고, 저렴하고, 완성도 있게 진행한다.
좋은 관리자는 네 속성의 가중치를 관리하지 모든 속성이 100%가 되기를 원하지 않는다. 애자일은 이런 관리를 추구한다.
애자일은 개발자와 관리자가 프로젝트를 실용적으로 관리할 수 있도록 돕는 체계다. 무조건 좋다는 의미는 아니다. 애자일하더라도 실패할 수 있다.

벽에 걸린 차트

애자일은 어떻게 관리를 돕는 것일까? 애자일은 데이터를 제공한다. 애자일 개발팀은 관리자가 좋은 결정을 내리도록 필요한 데이터를 생산한다.
주간 스토리 포인트 양 차트를 예로 든다. 이는 생산량을 의미하는 것 같은데, 측정 단위가 포인트였다. 이는 이 팀이 어느 속도로 움직이고 있는지 누구나 알 수 있는 데이터를 제공한다.
그리고 남은 스토리 포인트의 차트를 하나 더 예로 드는데, 이는 마일스톤을 어느 시점에 달성할 수 있게 되는지 알 수 있게 한다.
만약 중간에 남은 스토리 포인트의 값이 예상대로 감소하지 않고 튄다면 요구사항의 변경이 발생했기 때문일 것이다.
이 두 차트를 벽에 거는 것이 애자일의 중요한 목표다. 관리자가 철십자의 네 가지 축의 가중치를 얼마로 할지 결정해야 할 때, 결정에 필요한 데이터를 제공함으로써 관리자가 프로젝트를 최선의 결과로 이끌도록 한다.
즉, 관리자에게 제공해야 하는 데이터는 팀이 어느 속도로 움직이고 있는지, 팀이 목표를 달성하기까지 얼마나 남았는지다. 그렇다면 이 데이터들은 왜 중요한 것일까?

가장 먼저 알게 되는 것

마감 기한은 변하지 않고 요구 사항은 계속 바뀐다는 점이다. 이런 상황에서 개발팀은 어떻게든 프로젝트를 성공적인 결과로 이끌어야 한다.
폭포수 개발 방법에 따르면 분석, 설계에 비해 구현은 결과물이 명확하다. 따라서 분석, 설계는 계획에 명시된 기간이 끝나면 끝난거고 구현은 이해관계자와 고객의 요구사항을 만족시키는 제품이어야 한다.
구현을 하는 과정에서 설계에 문제가 있음을 깨닫거나 요구사항이 변경되면서 기존 설계에 변경사항이 발생한다. 그리고 이 변경사항은 또 다른 변경사항을 낳는다.
이를 저자는 따라잡을 수 없는 프로세스 인플레이션이라고 부른다.

더 나은 방법

폭포수 모델의 발상은 꽤 타당하다. 먼저 문제를 분석하고 해결 방법을 설계하고, 그 설계를 구현한다.
단순하고 직접적이며 명확하다. 그러나 틀렸다.
애자일 프로젝트의 접근법은 방금까지 읽은 것과는 완전히 다르다. 딱 와닿는 느낌을 준다.
애자일도 분석으로 시작한다. 대신 프로젝트 일정을 일정한 크기로 더 작게 나눈다. 이를 반복 주기 또는 스프린트라고 부른다.
길이는 보통 1주일 혹은 2주일인데, 저자는 1주일을 더 선호한다. 2주일은 감당하기에 너무 많은 변경사항이 발생할 수 있기 때문이다.

반복 주기 0

첫 번째 반복 주기는 종종 반복 주기 0이라고도 한다. 반복 주기 0에서는 짧게 기능 목록을 만드는데, 이를 스토리라고 부른다.
뒤에서 더 자세하게 다루며 지금은 개발해야 하는 기능이라고 생각하자.
반복 주기 0 동안 개발 환경을 준비하고 스토리의 크기를 추산하고 최초의 계획을 세운다.
이때 계획은 단순하게 세운다. 처음 반복 주기 몇 번 동안 처리할 스토리를 대략 할당한다. 마지막으로 개발자와 아키텍트는 잠정적인 스토리 목록을 바탕으로 초기 시스템 설계의 잠정적인 밑그림을 그린다.
스티로를 쓰고, 그 크기를 추산하고, 계획을 세우고 설계를 하는 이 과정은 끝없이 계속된다. 그래서 애자일의 프로젝트 표를 보면 탐색이라는 영역이 전체 프로젝트를 관통하며 걸쳐있다.
즉, 맨 처음부터 끝까지 프로젝트의 모든 반복 주기에 분석과 설계, 구현이 각각 조금씩은 들어 있는 것이다.
이 설명을 듣고 애자일이 짧은 폭포수를 반복하는 것이라고 받아들이는 사람도 있을 것이다. 하지만 그렇지 않다.
반복 주기는 3단계로 나누어지지 않기 때문이다. 꼭 반복 주기의 앞부분에만 분석을 하는 것도 아니다. 반복 주기가 끝날때쯤 구현을 하는 것도 아니다.
반복 주기 전체에 걸쳐 요구 사항 분석, 아키텍처 수립, 설계, 구현 활동이 끊임없이 일어난다.
애자일 프로젝트에서 반복 주기는 가장 작은 단위가 아니다. 애자일에는 여러 계층이 있고, 분석, 설계, 구현은 각각의 계층에서 일어난다.

애자일은 데이터를 만든다

반복 주기 1의 시작, 가장 먼저 스토리를 몇 개나 완료할 수 있을지 추산해 본다. 그리고 반복 주기 동안 팀은 이 스토리들은 완료하는데 필요한 일을 한다.
물론 끝내기로 계획한 스토리를 모두 끝낼순 없다. 실제로 그 문제에 뛰어들어 해결하기 전까지 정확한 작업기간을 추산할 수 없기 때문이다.
반복 주기가 끝나면 우리가 얼마나 스토리를 쳐낼 수 있는지 알게 된다. 이것이 앞서 말한 포인트 지표다.
이 데이터에 기반하여 원래의 계획을 조정하고 프로젝트의 새로운 종료 일자를 계산할 수 있다. 물론 계산 결과는 매우 실망스러울 가능성이 높다.
오차 범위를 줄이려면 반복 주기를 몇 번 더 해보고 결과를 산정하는 것이 정확하다.
이 과정을 통해 기존의 마감기한에 맞춰 프로젝트를 끝낸다는 것이 헛된 희망임이 확실해져 간다.

희망 대신 관리

희망을 없애는 것이 애자일의 주요 목표다. 애자일을 실천하면 희망이 프로젝트를 죽이기 전에 희망을 파괴할 수 있다.
애자일이 빠르게 나아가는 것이라고 생각하는 사람이 있다. 그렇지 않다. 빠르게 나아가는 것이었던 적은 없다. 애자일은 우리가 얼마나 망했는지를 최대한 빨리 아는 것이다.
최대한 빨리 알아야 상황을 관리할 수 있기 때문이다.

철십자 관리하기

이제 관리해야할 때다. 프로젝트 관리의 철십자로 돌아가 좋음, 빠름, 저렴함, 완성들을 관리자가 프로젝트에서 얻은 데이터에 기반하여 결정을 내릴 시간이다.
이 프로젝트는 얼마나 좋고, 빠르고, 저렴하고, 완성되어야 할까?
일정 변경하기
프로젝트 관리자에게 프로젝트를 연기하자고 해보자. 이런 대화는 보통 끝이 좋지 않다.
마감 기한은 타당한 사업성의 이유로 결정된 것으로 잘 변경되지 않는 사항들이다.
사람 추가하기
일정을 늘리지 못했다면 사람을 추가해보자. 사람을 두 배 늘리면 일도 두 배 이상 빠르게 할 수 있지 않을까?
사실은 그 반대다. 브룩스의 법칙에 따르면 지연된 프로젝트에 인력을 추가하면 더 늦어진다.
새로운 사람이 기존 사람들의 생산성을 빨아먹기 때문에 몇 주 간의 생산성은 곤두박질친다. 그러다 잘 풀리면 점점 도움이 되기 시작한다.
이것도 불가하다면 다음으로 넘어가 품질에 대한 이야기를 해보자.
품질 떨어뜨리기
테스트도 하지 않고, 리뷰도 하지 않는다. 이런 상황에서 코드 리팩토링은 사치품이다.
하지만 이는 소용없는 행동이다. 쓰레기를 만든다고 더 빨리 갈 수는 없다. 더 느려질 뿐이다.
빠르게 가는 유일한 방법은 제대로 가는 것이다.
범위 변경하기
이제 바꿀 수 있는 것은 단 하나 남았다. 기능에 우선순위를 두어 몇몇 기능을 제거하는 것이다.
합리적인 조직이라면 이 제안을 받아들일 것이다. 그리고 계획을 면밀히 살펴 급하지 않은 기능을 찾는다.
이렇게 계획이 조정되고 몇 가지 기능은 연기된다.

비즈니스 가치 순서

우리는 비즈니스 가치의 순서를 잘 모른다. 따라서 이해관계자들에게 물어 도메인을 이해해야 한다.
그리고 기능을 순차적으로 개발해나가야 한다. 그렇지 않으면 중요하지 않은 기능부터 만들고 있을 가능성이 높다.

개요가 끝났다.

애자일의 핵심을 가볍게 살펴봤다.
애자일은 프로젝트를 더 작은 반복 주기로 나누는 프로세스다.
각 반복 주기의 결과물을 측정하여 지속적으로 일정을 평가하는 데 사용한다.
기능은 비즈니스 가치 순서대로 구현하므로 가장 중요한 것이 먼저 구현된다. 품질은 가능한 한 노게 유지한다. 일정은 주로 기능의 범위를 조절하여 관리한다.
이것이 애자일이다.

삶의 순환

이는 XP의 실천 방법을 설명하는 론 제프리즈의 그림으로, 삶의 순환이라는 애칭으로 불리곤 한다.
이 책에서 XP의 실천 방법을 소개하는 이유는 모든 애자일 프로세스 중에 XP가 가장 잘 정의되어 있고 가장 완전하며 가장 덜 혼란스럽기 때문이다.
사실상 다른 애자일 프로세스들은 XP의 부분 집합이거나 XP의 변종이다. 이 말은 다른 것들을 얕잡아보는 것이 아니다.
XP는 애자일의 프로토타입이자, 최고의 대표주자이며 본질이고 핵심이다.
⇒ 뭔가 XP가 애자일의 대표적인 구현체라는 느낌이 들었다.
삶의 순환 그림은 세 개의 고리로 나누어진다.
가장 바깥은 비즈니스와 관련된 XP의 실천 방법을 보여준다. 이 고리는 본질적으로 스크럼 프로세스와 동일하다.
이 실천 방법들은 개발팀과 사업 부서가 의사 소통하는 방법과 프로젝트를 관리하면서 지켜야할 원칙에 대한 체계를 제안한다.
계획 게임
가장 중심적인 역할을 하며, 프로젝트를 기능, 스토리, 작업으로 쪼개는 방법을 알려준다.
크기를 추정하거나 우선순위를 결정하거나 기능이나 스토리, 작업의 일정을 정하는 데 필요한 지침을 제공한다.
작은 릴리스
팀이 일을 조그만 크기로 나눠 하도록 이끈다.
인수 테스트
기능이나 스토리, 작업의 완료를 정의할 수 있게 해준다. 완성 조건을 모호하지 않게 규정하는 방법을 보여준다.
전체 팀
소프트웨어 개발팀이 여러 가지 역할로 구성되어 있음을 나타내는 개념이다. 팀을 이루는 프로그래머, 테스터, 관리자 등은 같은 목표를 위해 함께 일한다.
가운데 고리는 팀과 관련된 실천 방법을 담고 있다. 이는 개발팀을 관리하고 팀원들이 서로 의사소통하는 체계와 원칙을 제공한다.
지속 가능한 속도
개발팀이 자원을 너무 빠르게 소진해 결승선에 도달하기도 전에 탈진해 버리는 것을 막기 위한 실천 방법이다.
공동 소유
팀이 프로젝트 안에 칸막이를 쳐 지식이 퍼지지 못하게 만드는 것을 막는다.
지속적 통합
피드백 고리가 자주 돌게 만드는데 계속 집중하게 만든다. 이를 통해 언제나 팀의 위치를 인지할 수 있어야 한다.
메타포
시스템에 대해서 팀과 사업 부서가 의사소통할 때 사용할 어휘나 표현을 만들고 널리 공유하는 실천 방법이다.
삶의 순환에서 안쪽 고리는 기술 실천 방법을 담고 있다.
짝 프로그래밍
기술팀이 지식을 공유하고 서로 리뷰하고 협력하도록 하여 혁신과 정확성을 끌어내는 방법이다.
단순한 설계
팀이 노력을 낭비하지 않도록 도와주는 실천 방법이다.
리팩토링
모든 작업 산출물의 지속적인 개선과 향상을 장려한다.
테스트 주도 개발
기술팀이 최고의 품질을 유지하면서도 빠르게 움직이기 위해 사용하는 안전망이다.
이 실천 방법들은 애자일 선언의 목표와 적어도 다음과 같이 밀접하게 매핑되고 있다.
공정과 도구보다 개인과 상호작용
전체 팀, 메타포, 공동 소유, 짝 프로그래밍, 지속 가능한 속도
포괄적인 문서보다 작동하는 소프트웨어
인수 테스트, 테스트 주도 개발, 단순한 설계, 리팩토링, 지속적 통합
계약 협상보다 고객과의 협력
작은 릴리스, 계획 게임, 인수 테스트, 메타포
계획을 따르기보다 변화에 대응하기
작은 릴리스, 계획 게임, 지속 가능한 속도, 테스트 주도 개발, 리팩토링, 인수 테스트

결론

애자일이 무엇인지, 그리고 어떻게 시작되었는지 살펴보았다.
애자일은 작은 소프트웨어팀이 작은 프로젝트를 관리할 수 있게 도와주는 작은 규칙이다. 하지만 이런 작고 작은 규칙들이 어마어마한 영향력을 갖고 있다.
모든 큰 프로젝트는 작은 프로젝트들이 모여 만들어지기 때문이다.