아래 그림을 보고 예전에
Agile Software Development, Principles, Patterns, and Practices에 정리했던 글을 다시 옮겨본다. 이 그림은 두 장을 출력해서 하나는 사무실 책상에 붙여놓았고, 다른 하나는 집에다 붙여놓을 생각이다. 배열이나 폰트가 이쁜게 전지현 사진만은 못하지만 걸어 놓을만 하다.

이미지 출처:
Vincent Xu: Agile 101: Pair Programming & Simple Design2003년 말이나 2004년 초에 작성한 것으로 짐작되는 내용을 3년이 조금 더 지난 시점에서 수정한다. (아직 수정 전인데 그때 내가 어떻게 생각했을지, 지금은 생각이 좀 성숙했을지 궁금하다. ^^)
XP 열 네 가지 프랙티스에 대한 생각
1. Customer Team Member
XP에서는 고객(Customer)이 시스템의 기능과 우선 순위를 정한다. 고객은 사용자를 대표하는 사람일 수도 있고, 개발팀과 같은 조직의 업무 분석가나 마케팅 관련자가 될 수도 있다.
고객이 누구건 중요한 것은 XP에서는 고객을 개발팀의 구성원으로 생각한다는 점이다.
고객을 익숙하지 않은 일에 적극적으로 참여하게 하는 것은 쉬운 일이 아니다. 종종 필수라고 요구되는 사항 중에 시스템을 실제 사용할 사람들은 전혀 관심이 없는 것들도 많다. 최종 사용자는 대개 바빠서 요구사항을 줄 수 없는 경우도 흔하다. 한편, 요구사항을 정형화된 형태로 정리하느라 진짜 하고 싶은 말을 못하는 경우도 있다.
실제로 요구사항 기술을 전문으로 하는 직원이 있는 경우도 수차례 경험했다. 그중에서는 요구사항을 제시하는 사람이 시스템을 쓰지 않는 직원인 경우도 있었다. 최종 사용자의 의도가 요구사항을 제시하는 사람에게 전달되는 과정에서 소실/오해가 일어난다. 또한, 잘모르는 것을 분석가나 개발자에게 전달하는 과정에서 또 한번 소실/오해가 일어난다. 직접 만나서 하지 않고 글로 쓰기까지 한다면 소실/오해의 정도는 급격하게 늘어난다.
고객이 팀원이 된다는 것을 문자 그대로 받아들여서 현실성이 없다고 프랙티스 전체를 부정할 필요는 없다. 현실적으로 가능한 만큼 정말 시스템을 슬 사람의 요구를 수집하도록 최대한의 노력을 하면 되는 것이다.
2. User Stories
요구사항 분석을 Estimation 즉, 프로젝트에 필요한 비용, 기간과 인력 등을 측정할 수 있을 정도에서 끝내라는 것이다. UP(Unified Process)를 학습하면서 꼼꼼히 분석을 할 때, 점차 구현에 대한 불안감이 마음에 자리한다. UP에서는 상당기간을 아키텍처를 수립하는 쪽에 중점을 둔다. 매우 잘 조직화 된 개발팀이 아니면 상당히 위험할 수 있다. 기존의 소프트웨어에서 위험요소(Risk)로 인식했던 것을 XP에서는 개발 프로세스의 메커니즘으로 수용해버렸다.
프로젝트 초반에 요구사항에 집중하고, 개발은 잠시 미뤄두는 것이 아니라 요구사항과 구현을 동시에 고려하는 것이다. 매우 바람직한 방향이지만 고객과의 협업 주기가 짧다는 것이 전제되어야 한다. 만일, 일주일에 한번 미팅하는 정도로 요구사항을 정립하는 상황이라면, '글쎄'를 떠올려봐야 하지 않을까.
3. Short Cycles
Interation 은 2주마다, Release 는 3개월마다 라고 하는 가이드를 제시해준다. UP에서 Iteration을 Use Case를 기준으로 계획하듯이 XP에서도 Iteration은 User Story를 기준으로 계획한다. Use Case나 User Story나 개발 산출물 관리단위로 쓰이는 점은 같다.
앞서 언급한 것처럼 요구사항 분석과 개발이 동시에 고려되어 작은 주기를 만들어낸다. 개발관점에서만 보면 상당히 안정성이 높다고 할 수 있다. 그러나, 관리자나 프로젝트 지원팀 입장에서는 막막할 수 있다. 처음부터 필요한 S/W와 H/W를 구매해야 하는데다가 사용하는 S/W나 H/W 사양이 바뀔 수도 있다. 게다가 분석가와 개발자가 다른 사람이 된다면 비용이 두 배가 소요된다. 앞에서는 분석가만 투입하고, 나중에는 개발자만 투입하는 식이 어렵기 때문이다. 결국, 어자일 개발을 위해서는 어자일 관리와 지원(?)이 뒤따라야 한다.4. Acceptance Tests
Acceptance를 우리말로는 '인수'라고 번역할 수 있다. RUP에서는 상당이 복잡한 인수 계획을 세우고 인수 절차를 밟는 상황을 전제하고 있다. 왜냐 하면 대개 최종적인 인수에 집중되어 있다.
그러나, XP에서는 Acceptance 자체도 점진적이다. 어차피 계속적으로 돌아가는 소프트웨어가 나오기 때문에 인수 절차를 막판으로 미룰 이유가 없다. 일회적인 인수절차는 고무줄이 될 가능성이 높다. 문제를 미리 파악하지 못하기 때문에 막판에 문제가 복잡하게 꼬여서 발생하기 때문이다.
5. Pair Programmig
실험삼아 해본 적이 있는데 경험이 많은 개발자일수록 꺼리는 경우가 있다. 일단 자기 실력을 그대로 노출하는 것 자체에 대한 거부감이 컸다. 프로그래밍이라는 작업이 두뇌 노동이고
방해받지 않는 독립된 작업공간을 좋아하다 보니 혼자 하는 것을 즐기는 경향도 느낄 수 있었다.
하지만, 지식과 경험이 자연스럽게 전달되는데 이보다 좋은 프랙티가 있을까? 동시에 서로간의 의사소통 비용을 엄청나게 줄인다. 작게는 서로 말하는 습성을 알게 되어 같은 말에 대해서도 이해가 깊어진다. 또한, 지속적으로 페어를 구성해서 작업하다보면 회의의 필요성은 급감하지 않을까?6. Test-Driven Development
Test-driven이란 먼저 테스트 케이스(Test Case)라고 하는 테스트를 위한 코드를 먼저 작성하고, 해당 코드가 정상 작동하도록 실제 코드를 개발하는 것이다. 이러한 방식에 익숙하지 않은 사람들에게는 무척 버거운 일이 될 수 있다. 얼핏 보아도 코딩의 양이 두 배쯤 늘어나는 것으로도 보일 수 있다.
JUnit을 이용하여 실제로 이런 식으로 작업을 해보았지만 여간 번거로운 일이 아니었다. 그 필요성은 덩치가 커졌을 때 비로소 나타날 것이다.
좋은 습관이 좋은 인성을 만드는처럼
좋은 개발 습관을 통해 만들어진 코드는 그만큼 건강할 것이기 때문이다.Test-driven 개발은 또한 두 가지 두드러진 장점을 가는다. 하나는 테스트 케이스들이 모여서 구성된 테스트 스위트(Test Suite)가 모이면 리팩토링(Refactoring)을 용이하게 해준다.
리팩토링은 기능은 그대로 두고, 중복 코드를 제거한다거 하는 등 구조를 개선하여 프로그램의 품질을 높이는 작업이다. 축적된 테스트 스위트는 기능이 정상 작동해주는지는 보장해주기 때문에 리팩토링 하면서 수시로 테스트를 해볼 수가 있는 것이다. 만일 이러한 테스트 스위트가 없다면 많은 개발팀에서 볼 수 있는 현상처럼
안돌아갈까봐 손을 못대는 현상이 빈번하게 발생할 것이다.또 하나의 장점은 모듈간의 의존성을 낮춰준다. Test-driven 개발을 하다 보면 자연스럽게 테스트가 용이하게 프로그램을 구성하게 된다. 이는 외부에서의 의존도를 줄이는 결과를 초래하여 의존성이 감소하는 방향으로 발전할 가능성이 크다.
7. Collective Ownership
코드의 공동 소유. XP에서는 어떠한 모듈도 누구나 이를 작성하거나 수정할 수 있다. 다시 말해서 명확한 책임자나 소유자가 없다는 것이다. 그러면 문제가 생겼을 때는 누가 해결한다는 말인가?
여러분의 이해를 돕기 위해 내가 경험한 일화를 떠올려보겠다.
2002년의 이야기다. 한창 데이터를 분석해서 그래프를 그리고, 엑셀로 보고서를 작성하는 프로그램을 만들고 있었다. 나는 데이터 분석과 그래프 작성을 책임졌고, 나와 짝을 이뤄 작업을 하는 동료는 엑셀에 데이터를 뿌리는 일을 맡았다.
VB를 사용해서 작업을 할 때였는데 둘 다 오피스 라이브러리를 이용하여 개발해본 경험이 없어서 MSDN 등을 뒤지고 다녔다. 나는 테이블 조인해서 데이터를 분석하는 것으로 골치를 앓아 동료에게 오피스 프로그래밍을 위한 샘플 코드를 분석해서 방법을 알아내길 부탁했다.
그 친구는 무척 더디게 알아냈는데, 내 입장에서는 그 결과가 한심했다. 결국 내가 MSDN을 뒤져서 방법을 알아냈고, 그 친구에게 이를 가르쳐줬다. 그리고 나서 본격적으로 프로그래밍을 하는데 상대적으로 작업량이 작은 그 친구는 어떻게 하는지 모르겠다면서 자꾸 일을 미뤘다. 그 사이에 나는 1000라인이 넘는 코드를 작성하면서 세 개 이상의 테이블을
조인해서 분석 결과를 뽑아내느라 골치가 아팠다.
그 친구가 원래 작업을 마치고 내가 하는 부분을 도와줘야 하는데 상당히 간단한 작업이었는데, 허걱... 아직 시작단계였다. 나는 너무나 화가 나서 그 친구를 심하게 나무랬다.
다혈질인데다가 그 당시 스트레스가 심해서 욱하고 치밀어올랐다.
문제는 바로 작업 분담에 있었다. 일단 그 친구에게는 일의 양을 떠나 아직 익숙하지 않은 일이었다. 대개 숙련도가 낮은 친구에게 작은 양의 코드를 맡긴다는 것은 '어떻게 해서든 이거라도 해내라'라는 압력일 수 있다. 이는 아직 준비가 되지 않은 동료에게 책임을 떠넘기는 것이다. 따라서, 그 부분이 완성되지 않을 위험도 있는 데다가 설사 그 친구가 책임을 완수했다고 하더라도 품질은 어떨까?
그렇다, 결국 개발팀 전체가 결과에 대해 책임을 져야 한다. 숙련도가 낮은 친구가 있다면 그 친구에게 적은 양의 프로그램이라도 하라고 떠넘기는 것이 아니라 숙련도가 높아져서 다른 팀원들처럼 작업할 수 있도록 함께 프로그래밍 해야 한다. 이것은 Pair Progamming이 추구하는 것이 아닐까? 이것이야 말로 '팀'으로써 시너지를 극대화 할 수 있는 방안이 아니겠는가?