익스트림 프로그래밍 실천방법


익스트림 프로그래밍(XP)는 애자일 방법 중에서도 가장 유명하다. 단순하면서도 서로 의존적인 실천방법의 집합으로 구성되어 있다. 전체적으로 각 부분에 대해서 간단하게 살펴보자.

고객 팀 구성원

  • 고객과 개발자가 서로 긴밀하게 작업하면서 서로의 문제를 인식하고 해결
  • 고객 : 기능 요소를 정의하고 우선 순위를 매기는 개인 또는 그룹
  • XP프로젝트에서는 고객이 누구든 간에 팀의 멤버이며, 팀에서 일할 수 있음
  • 가장 최고의 상황은 개발자와 고객이 같은 공간에서 일하는 것

사용자 스토리

  • 프로젝트 일정 계획을 세우기 위해 요구사항을 알아야하지만 요구사항을 추정할 수 있을 만큼의 정보만 있으면 OK, 세부적인 것까지 필요 X
  • 요구사항의 구체적인 세부 내용은 시간이 지남에 따라 쉽게 바뀌기 때문
  • XP를 사용할 때, 고객과 대화함으로써 요구사항의 세부 내용에 대한 감을 잡음 -> 세부사항을 기록 X
  • 고객 -> 같이 합의해서 정한 색인 카드에 몇 개의 단어를 적어 그 대화 내용 기억
  • 개발자 -> 고객과의 대화를 바탕으로 추정한 내용을 카드에 기록
  • 사용자 스토리는 현재 진행 중인 요구사항에 관한 대화의 연상 기호
  • 고객이 우선순위와 추정 비용에 근거해 요구사항의 구현 일정을 수립하게 해주는 계획 툴

짧은 반복

XP 프로젝트는 개발 중인 소프트웨어를 보통 2주마다 공개한다. 각 반복마다 이해당사자의 어떤 요구를 처리하는 소프트웨어를 만든다. 그리고 각 반복의 끝마다 이해당사자의 피드백을 받기 위해 시스템을 시연한다.

반복계획

  • 보통 2주 단위로 진행
  • 마이너 공개 -> 최종 제품에 반영될 수도, 안될 수도
  • 개발자가 세운 예산에 따라 고객이 선택한 사용자 스토리의 집합
  • 개발자는 이전 반복을 기준으로 각 반복의 예산을 세움
  • 고객은 전체 견적이 그 예산을 넘지 않는 내에서 각 반복의 스토리를 선택
  • 반복이 시작되면 반복 동안에는 스토리 정의나 우선순위를 바꾸지 않는다고 약속
  • 개발자는 스토리를 자유롭게 태스크에 나눠 넣고 기술적, 업무적으로 가장 합리적인 순서로 그 태스크를 수행

릴리즈 계획

  • 약 6번의 반복 일정을 정밀하게 표현하는 릴리즈 계획을 수립
  • 보통 3개월 동안을 의미
  • 메이저 공개 -> 보통 최종 제품에 포함
  • 개발자가 제시한 예산에 맞춰 고객이 선택한, 우선순위가 정해진 '사용자 스토리' 묶음으로 구성
  • 개발자는 이전 릴리즈에서 얼마나 완성할 수 있었는가를 측정하여 릴리즈의 예산을 세움
  • 고객은 그 예산 내에서 릴리즈에 포함할 스토리를 선택
  • 고객은 릴리즈에서 구현될 스토리의 순서를 결정 가능
  • 릴리즈는 절대적인 것이 X -> 고객은 요구 사항을 언제든지 변경 가능(스토리 취소, 새로 작성, 우선순위 변경 등)

인수 테스트

  • 사용자 스토리의 세부사항은 인수 테스트의 형태로 기록
  • 인수 테스트는 그 스토리가 구현된 바로 앞 또는 구현되는 동시에 작성
  • 자동적으로, 반복적으로 실행될 수 있는 스크립트 언어의 한 종류로 작성
  • 고객이 명시한 대로 동작하는지 여부를 결정
  • 일반적으로 인수 테스트 툴 개발에 QA 부서를 참여시키고, 직접 인수 테스트를 만듬
  • 인수 테스트가 실패하면 그 빌드는 실패를 선언
  • 통과하면 통과한 테스트의 본문에 추가
  • 인수 테스트는 하루에도 몇 번씩, 시스템을 빌드할 때마다 계속 수행

짝 프로그래밍

  • 프로그래머 들이 함께 운영 코드를 작성
  • 한 멤버는 키보드를 잡고 코드 입력
  • 다른 멤버는 에러와 개선점을 찾음
  • 프로그래머 짝의 역할은 자주 바뀜
  • 결과물 코드는 두 멤버가 함께 설계하고 만들어낸 것
  • 적어도 하루에 한 번 바꿔서 모든 프로그래머가 매일 서로 다른 두 짝으로서 일할 수 있게 해야함
  • 한 반복 과정동안 팀의 모든 멤버는 팀의 다른 모든 멤버와 함께 일해봐야하고 그 과정에서 진행되는 모든 작업을 해봐야함
  • 이러한 방식으로 더 빨리 지식이 확산
  • 전문성을 요구하는 태스크도 짝을 이루어서 모두가 경험하게 하여 위기 상황에 대비 가능

테스트 주도 개발

  • 모든 운영 코드는 실패하는 단위 테스트를 통과하기 위해 작성 (실패 -> 통과)
  • 테스트 케이스와 코드를 작성하는 사이의 간격은 1분 정도로 매우 빠름
  • 테스트 케이스의 완성된 본문은 코드와 함께 발전
  • 테스트는 개발자가 프로그램이 잘 동작하는지 점검할 수 있게 함
  • 프로그램을 조금 변경해도, 바로 테스트로 문제 여부를 판단 가능 -> 리팩토링을 굉장히 용이하게 함
  • 테스트 케이스를 통과하기 위해 코드를 작성한다면, 그 코드는 당연히 테스트 가능한 것
  • 코드를 모듈별로 분리하여 각각 독립적으로 테스트될 수 있게 해야한다는 필요성도 강력히 대두
  • 이러한 방식으로 작성되는 코드 구조는 상호 간섭이 아주 적음 -> 객체 지향 설계 원칙은 이런 비간섭화를 구현하는데 큰 역할

공동 소유권

  • 짝은 어떤 모듈이라도 점검하고 개선할 권리를 가짐
  • 하나의 개별적인 모듈이나 기술에 개인적인 책임 X
  • 모든 팀원이 모든 부분 작업에 참여
  • 누구도 어떤 모듈이나 기술에 대해 다른 사람보다 더한 권한을 갖지 않음
  • 전문성을 부정하는 것이 아닌 전문 분야의 일에만 묶여 있지 않게 하는 것

지속적인 통합

  • 긴 병합과정을 피해가 위해, 팀원은 모듈을 매우 빈번하게 체크인
  • 먼저 모든 테스트가 작동하는지 확인 -> 새로운 코드를 이미 존재하는 기반 코드에 통합 -> 통합 후, 통합된 새로운 시스템을 빌드하고 인수 테스트를 포함해 시스템에 있는 모든 테스트 실행 -> 통과하면 체크인 완료
  • XP 팀은 하루에도 여러 번, 처음부터 끝까지 전체 시스템을 빌드

지속 가능한 속도

  • 소프트웨어 프로젝트는 단거리 경주가 아닌 마라톤
  • 팀이 지속 가능한 속도로 달려서 에너지와 경각심을 보존해야함
  • 꾸준히, 적당한 속도로 달려야 한다.
  • 유일한 예외는 릴리즈의 마지막 주

열린 작업 공간

  • 팀은 열린 공간에서 함께 일함
  • 문제가 생기면 누구나 그것을 인지 가능
  • 각 팀원은 서로의 상태를 잘 알고, 개발자들은 집중적으로 대화할 수 있는 위치에 있음

계획 세우기 게임

  • 업무와 개발의 책임 분리
  • 업무 관련 인력(고객) -> 기능 요소가 얼마나 중요한지를 결정
  • 개발자 -> 그 기능 요소를 구현하는 데 얼마나 비용이 들 것인지를 결정
  • 각 릴리즈와 반복을 시작할 때, 개발자는 예산을 세워 고객에게 제출
  • 고객은 총비용의 합이 예산을 넘지 않는 정도로 스토리를 선택

단순한 설계

  • 설계를 가능한 단순하고 표현적으로 만듬
  • 현재 반복에서 작업하기로 계획했던 스토리에만 초점을 맞추어 공략
  • 다음에 작업할 스토리에 대해 걱정 X
  • 시스템이 현재 구현하고 있는 스토리에 가장 적합한 설계가 되도록
  • 기반구조를 이용해 시작하지 않음 (데이터베이스, 미들웨어 등 먼저 선택 X)
  • 가능한 가장 단순한 방식을 동작하게
  • 스토리가 진행되며 그것을 강요할 때만 기반구조를 추가

3가지 XP지침

어떻게든 동작하는 가장 단순한 것을 생각한다.

현재 스토리를 구현하는 가장 간단한 방법을 생각한다. 그리고 실제로 구현할 수 있을 정도로 최대한 단순한 솔루션을 선택한다.

필요하지 않을 것이라는 가정에서 시작한다.

기반구조가 필요하지 않을 것이라는 가정하에 프로젝트를 시작한다. 지금 기반구조를 추가하는 것이 기다리는 것보다 효과적이라는 확실한 증거가 있을 때, 적어도 아주 강한 근거가 있을 때 비로소 추가한다.

코드를 중복해서 쓰지 않는다.

중복 코드가 발견될 때마다 이를 제거한다. 중복 코드를 발견하면 함수나 부모 클래스를 만들어 제거한다. 가끔 둘 이상의 알고리즘이 비슷하긴 하지만 미묘한 부분에서 다를 경우, 함수로 바꾸거나 템플릿 메소드 패턴을 사용한다. 중복성을 제거하는 최선의 방법은 추상화이다. 중복성을 제거하기 위해 팀은 많은 추상형을 만들고, 그 결과 결합도도 낮아지게 된다.

리팩토링

  • 리팩토링은 행위에 영향을 주지 않고 시스템의 구조를 개선하는 일련의 작은 변환을 만드는 방식
  • 각각의 작은 변환이 끝나면 단위 테스트를 실시하여 문제 여부를 확인
  • 리팩토링을 통해 깔끔하고 단순하며 의미있는 코드를 유지 가능

메타포

  • 전체 그림을 의미
  • 메타포는 전체 시스템을 하나로 묶는 큰 그림
  • 모듈의 형태가 메타포와 일치하지 않는다면 그 모듈이 잘못되었음을 알 수 있음
  • 종종 시스템을 어떠한 이름으로 요약함 -> 시스템의 요소에 기호를 부여하고 그 관계를 정의하는 것을 도움

결론


XP는 애자일 개발 프로세스를 구성하는 단순하고 구체적인 방식의 집합이다. 여러 프로젝트에 XP를 적용하여 사용할 수 있을 것이고 경우에 따라서 방식을 추가하거나 수정할 수 있을 것이다.

profile
코드 품질의 중요성을 아는 개발자 👋🏻

0개의 댓글

Powered by GraphCDN, the GraphQL CDN