////
Search
Duplicate
💧

5장. 기술 실천 방법

기술 실천 방법이야 말로 애자일의 진짜 핵심으로 애자일을 하고 싶다면 배제해서는 안 된다.

테스트 주도 개발

테스트 주도 개발을 설명하려면 책 한 권 분량이 필요할 만큼 복잡한 주제다.
이 장에서는 기술적 요소를 깊이 설명하기보다는 동기와 도입 이유에 집중해서 간단히 살펴본다.
프로그래머는 다양한 기호를 사용해서 거대하고 굉장히 기술적인 문서를 만들어 낸다. 이 문서에 쓰이는 기호는 모두 정확해야 한다.
기호 하나만 틀려도 무서운 일이 벌어질 수 있을텐데, 이런 직업이 또 있을까? 바로 회계사다.
회계사는 어떻게 모든 기호가 올바른지 확인할까?

복식 부기

복식 부기에서는 모든 거래를 장부에 두 번씩 기록하는데, 회계 장부의 대변에 한 번 쓰고 다른 회계 장부의 대응되는 차변에 또 한 번 쓴다.
궁극적으로는 장부를 모두 취합하여 재무 상태표라고 부르는 문서 하나로 만드는데, 대변에 기록한 부채와 자본을 모두 더한 값과 차변에 기록한 자산을 모두 더한 값을 서로 비교하여 제대로 썼는지 검증한다. 두 값의 차이는 무조건 0이어야 한다.
테스트 주도 개발은 프로그래머의 복식 부기라고 할 수 있다. 구현해야 하는 동작을 두 번씩 입력한다. 한 번은 테스트로, 그리고 한 번은 이 테스트를 통과하게 만드는 제품 코드로 말이다.

TDD의 세 가지 규칙

TDD는 세 가지 단순한 규칙으로 설명할 수 있다.
해당 코드가 없어서 실패하는 테스트 코드를 쓰기 전에 제품 코드를 먼저 쓰면 안 된다.
테스트 코드를 쓸 때는 실패하도록 만들기 위해 필요한 것보다 더 많이 쓰면 안 된다. 컴파일 실패도 실패로 간주한다.
실패하는 테스트를 통과시키기 위해 필요한 코드보다 더 많은 제품 코드를 쓰면 안 된다.

문서화

TDD의 세 규칙을 따르며 작성한 테스트는 전체 시스템의 코드 예제가 된다.
즉, 테스트는 테스트하는 시스템을 설명하는 문서의 한 형태다.
그 외의 TDD를 사용했을 때, 얻을 수 있는 장점들을 간략하게 설명해주셨다.
빠른 피드백의 테스트를 통해서 코드 변경에 적극적일 수 있게 용기를 준다던가
TDD만으로 얻어진 커버리지가 낮다고 해서 굳이 모두 채울 필요가 없다던가

리팩터링

리팩터링은 코드의 구조를 개선하면서 동작은 바꾸지 않는 실천 방법이다.

빨강/초록/리팩터링

본질적으로 리팩터링은 TDD의 세 가지 규칙을 반복함으로써 이루어진다.
1.
먼저, 실패하는 테스트를 만든다.
2.
그리고 이 테스트를 성공하게 만든다.
3.
그리고 코드를 정리한다.
4.
1단계로 돌아간다.

더 큰 리팩터링

요구사항이 바뀌는 것이 반복되어 시간이 흐르게 되는 경우, 더 큰 리팩터링이 필요할 수 있다.
한 번에 끝내기 위해 기간을 잡아선 안 된다. 조금씩 조금씩 고쳐나가야 한다.

단순한 설계

단순한 설계 실천 방법은 리팩토링의 목표 중 하나로 단순한 설계는 최대한 단순하고 작고 표현력이 뛰어난 구조를 바탕으로 최소한의 코드만 작성하는 실천 방법이다.
켄트 벡이 세운 단순한 설계의 규칙은 다음과 같다.
1.
모든 테스트를 통과할 것
2.
의도를 드러낼 것
3.
중복을 없앨 것
4.
구성 요소를 줄일 것
규칙의 순서는 실행하는 순서이면서 동시에 중요한 순서이기도 하다.
1번은 당연하다. 코드는 테스트를 통과해야 하며 작동해야 한다.
2번은 코드가 일단 작동하면 다음으로 표현력 있게 만들어야 한다는 것이다. 프로그래머의 의도를 드러내야 한다.
긴 함수를 작고 적절한 이름을 가진 함수들로 쪼개기도 한다.
3번은 가능한 한 이해하기 쉽고 표현력 있게 만들어진 후, 코드 내의 중복을 찾아서 제거해야 한다는 뜻이다.
이 과정 동안 이루어지는 리팩토링은 조금 더 복잡하다.
중복을 제거하는 것이 단순한 경우도 있다.
중복인 부분을 함수로 빼낸 다음, 이 함수를 호출하도록 바꾸기만 하면 될 때도 있다.
디자인 패턴 같은 것들을 적용하기도 한다.
4번은 중복을 제거한 후에는 클래스나 함수, 변수 같은 구성 요소의 수를 줄이기 위해 노력해야 한다는 것이다.

설계 무게

설계가 복잡할수록 프로그래머에게 주어지는 인지 부하는 늘어난다. 이 인지 부하가 설계 무게다.
단순한 설계 방법을 사용하여 끊임없이 시스템의 설계를 리팩토링하라. 그렇게 요구 사항과 설계의 균형을 유지하고 궁극적으로 높은 생산성을 유지하라.

짝 프로그래밍

꼭 해야되는 것은 아니다. 누구도 짝 프로그래밍을 강요해서는 안 되며 모든 순간 함께해야하는 것도 아니다.

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

프로그래밍 문제를 두 사람이 함께 해결하는 행위다.
역할을 구분하여 하기도 하며 없이 하기도 한다.

짝 프로그래밍을 하는 이유

구성원끼리 지식을 공유하고, 지식의 칸막이가 생기지 않게 만드는 단연코 최고의 방법이기 때문이다.
코드 리뷰를 짝 프로그래밍으로 대체하기도 한다.

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

짝 프로그래밍의 코드 리뷰의 한 형태로 보기도 하지만 더 큰 장점을 가지고 있다.
짝 프로그래밍을 하는 동안 자연스럽게 이루어지는 코드 리뷰는 앞으로의 미래를 생각하며 현재 코드의 상태를 검토할 수 있게 한다.

둘이서만?

꼭 둘이서만 해야하는 것은 아니다. 재량적으로 필요에 따라 결정하면 된다.
셋 이상이 하는 짝 프로그래밍을 몹 프로그래밍이라고도 부른다.

관리자

눈살 찌뿌려가며 프로그래머가 같이 있는 것을 탐탁치 않아할 관리자는 잘 없을 것이다.
절대, 절대, 절대, 짝 프로그래밍을 허락맡지 말라, 당신은 전문가다. 결정은 당신이 한다.

결론

기술 실천 방법은 애자일의 활동 중 가장 핵심적인 요소다.
기술 실천 방법 없이 애자일을 도입하려는 시도는 실패할 수 밖에 없다.
애자일의 효율성 덕분에 프로젝트를 아주 빠르게 난장판을 만들 수 있기 때문이다.
기술적인 품질을 높게 유지할 수 있도록 돕는 기술 실천 방법이 없다면 생산성이 빠르게 추락하여 죽음의 구렁텅이로 빠지게 될 것이다.