Post

클린 애자일(Clean Agile - Back to Basics) - 5장 기술 실천 방법

클린 애자일(Clean Agile - Back to Basics) - 5장 기술 실천 방법

많은 프로그래머가 애자일을 시도할 때 기술 실천 방법은 빼놓는다. 하지만 이런 시도는 실패하기 마련이다. 기술 실천 방법이야말로 애자일의 진짜 핵심이기 때문이다.

테스트 주도 개발

복식 부기

테스트 주도 개발은 구현해야 하는 동작을 두 번씩 입력한다. 한 번은 테스트로, 그리고 한 번은 이 테스트를 통과하게 만드는 제품 코드로 말이다. 두 번의 입력은 서로 딱 맞아야 한다.

TDD의 세 가지 규칙

  • 해당 테스트가 없어서 실패하는 테스트 코드를 쓰기 전에 제품 코드를 먼저 쓰면 안 된다.
  • 테스트 코드를 쓸 때는 실패하도록 만들기 위해 필요한 것 보다 더 많이 쓰면 안 된다. 컴파일 실패도 실패로 간주한다.
  • 실패하는 테스트를 통과시키기 위해 필요한 코드보다 더 많은 제품 코드를 쓰면 안 된다.

문서화

테스트는 테스트하는 시스템을 설명하는 문서의 한 형태다. 테스트는 전체 시스템의 코드 예제가 된다.

설계

사후 테스트를 만들기 힘든 이유는 테스트 가능 여부를 생각하지 않으면서 코드를 작성하고, 설계할 때도 테스트를 고려하지 않았기 때문이다.

테스트를 먼저 쓴다면 테스트하기 힘든 함수는 쓸 수가 없다. 테스트를 먼저 쓰기 때문에 테스트하기 쉬운 설계가 나오는 것은 당연하다.

용기

완벽한 테스트 묶음이 있으면 코드를 고치는 두려움이 사라진다.

리팩터링

리팩터링은 코드의 구조를 개선하면서 동작은 바꾸지 않는 실천 방법이다. 프로그램의 동작은 테스트로 정의해야 한다. 다시 말해서 테스트를 깨먹지 않으면서 이름이나 클래스, 함수, 표현식을 변경하는 것이다. 동작에 영향을 주지 않으면서 시스템 구조를 개선한다.

두려움 없이 코드를 리팩터링하려면 무언가 깨 먹지 않았다는 확신을 얻을 수 있는 테스트 묶음이 필요하다.

빨강/초록/리팩터링

리팩터링

  1. 빨강
    1. 실패하는 테스트를 만든다.
    2. 실패 메시지를 통해 “내가 무엇을 기대하는지”를 명확히 한다.
    3. “실패하는 테스트 없이 개발을 시작하는 것은 나침반 없이 항해하는 것과 같다.”
  2. 초록
    1. 이 테스트를 통과하게 만든다.
    2. 일단 테스트만 통과하면 된다.
    3. “지금은 동작하는 것이 전부다. 구조는 잠시 잊어라.”
  3. 리팩터링
    1. 코드를 정리한다.
    2. 이 과정에서도 계속 테스트가 초록이어야 한다.
    3. “리팩터링은 안전망 안에서 춤추는 것이다.”
  4. 1단계로 돌아간다.

리팩터링이라는 단어가 일정에 나타나서는 안 된다. 리팩터링은 계획을 잡고 하는 활동이 아니다. 리팩터링을 할 시간을 따로 할당해서도 안 된다. 리팩터링은 소프트웨어를 작성할 때 하는 일상적인 작업의 일부일 뿐이다.

단순한 설계

단순한 설계(Simple Design) 실천 방법은 리팩터링의 목표 중 하나다. 단순한 설계는 최대한 단순하고, 작고, 표현력이 뛰어난 구조를 바탕으로 최소한의 코드만 작성하는 실천 방법이다.

단순한 설계의 목표는 ‘설계 무게’를 가능한 한 가볍게 만드는 것이다.

짝 프로그래밍

짝 프로그래밍이란 무엇인가?

짝 프로그래밍은 프로그래밍 문제 하나를 두고 두 사람이 함께 해결하는 행위다.

짝을 지어 일하는 시간은 일반적으로 길지 않다. 짝 프로그래밍 한 번의 길이는 길어야 하루 정도고, 대부분은 한두 시간 안에 끝나야 한다.

짝이 스토리를 담당하지 않는다. 짝이 아니라 프로그래머 한 명 한 명이 스토리를 완성할 책임을 져야 한다.

짝 프로그래밍을 하는 이유

짝 프로그래밍의 목표는 지식을 모으는 것이 아니라 퍼트리고 교환하는 것이다. 짝 프로그래밍은 팀에 빠지면 안 되는 사람이 생기지 않게 만드는 최고의 방법이다.

짝 프로그래밍을 통한 코드 리뷰

짝 프로그래밍을 하는 과정에서 자연스럽게 기존 코드를 보고 리뷰를 하게 된다. 그래서 많은 팀에서 코드 리뷰를 짝 프로그래밍으로 대체했다.

비용은?

여러 연구에 따르면 직접적인 비용 증가는 15%정도라고 한다. 업무 시간의 50%를 짝을 지어 일한다고 가정하면 대충 계산했을 때 생산성이 8% 정도 떨어진다. 하지만 짝 프로그래밍이 코드 리뷰를 대체할 수 있다면, 결과적으로 생산성 감소는 전혀 없을 가능성이 크다.

그리고 서로 가르쳐주며 이루어지는 지식 교환이나, 강도 높은 협업에서 오는 이득도 고려해야 한다. 이런 이득은 정량화하기 힘들지만, 많은 경우 큰 의미가 있다.

결론

애자일의 기술 실천 방법은 모든 애자일 활동 중 가장 핵심적인 요소다. 기술 실천 방법 없이 애자일을 도입하려는 시도는 실패할 수 밖에 없다. 애자일의 효율성 덕분에 아주 빠르게 거대한 난장판을 만들 수 있기 때문이다. 기술적인 품질을 높게 유지하는 기술 실천 방법이 없다면, 생산성이 빠르게 추락하여 헤어나올 수 없는 죽음의 소용돌이 속으로 빠지고 말 것이다.

This post is licensed under CC BY 4.0 by the author.