TDD 음미하기

김주형·2022년 11월 16일
0

자라기

목록 보기
12/22

왜 TDD?

작동하는 깔끔한 코드 (clean code that works)

  • 테스트 주도 개발의 궁극적 목표
  • 왜 이게 훌륭한 목표일까?
  1. 예측 가능한 개발 방법이다.
    • 버그에 대한 걱정 최소화
  2. 코드가 가르쳐주는 학습 기회
    • 처음 생각나는 대로 후딱 완료해 버리면 더 나은 것에 대해 생각할 기회를 잃게 된다.
  3. 사용자의 삶을 향상시켜주는 소프트웨어를 만들 수 있다.
  4. 동료와 서로 존경할 수 있게 된다.
  5. 작성하는 동안 기분이 좋다.

어떻게 TDD?

테스트 주도 개발이라 불리는 것은 다음과 같은 개발 방식이라고 한다.

  1. 자동화된 테스트로 개발을 이끌어 간다.
    • 오직 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
  2. 중복을 제거한다.

단순하게 두 가지 규칙만을 따른다. 기술적인 함의로 인해 개인이나 집단 차원의 행동 패턴이 만들어진다.

  • 결정 사항에 대해 피드백을 제공하는 실행 가능한 코드를 기반으로 하는 유기적 설계
  • 자동화된 테스트를 다른 사람이 만들어주길 기다릴 수 없다. -> 직접 테스트 작성
  • 작은 변화에도 빠르게 반응
  • 테스트를 쉽게 만들려면 반드시 응집도는 높고 결합도는 낮은 컴포넌트들로 구성되게끔 설계해야 한다.

빨강, 초록, 리팩토링

  1. 빨강
  • 실패하는 작은 테스트를 작성한다.
  1. 초록
  • 빨리 어떻게든 테스트가 통과하게끔 만든다.
  1. 리팩토링
  • 일단 테스트를 통과하게만 하는 와중 생겨난 모든 중복을 제거한다.

아니 실패하는 테스트를 왜 먼저 작성할까.. 라고 생각할 수 있지만
이런 프로그래밍 방식이 코드의 결함률을 극적으로 낮춰줄 뿐 아니라, 코드가 정말로 깔끔해져서 누구나 코드를 쉽게 알아볼 수 있게 해준다면?

"필요한 만큼"만 코딩할 수 있다.

  • 코드의 품질 보증을 능동적으로 전환시킬 수 있다.
  • 예외 상황의 숫자를 충분히 낮춰 추정하고 개발 과정에 참여시킬 수 있다.
  • 기술적 대화의 주제가 충분해져 일일 단위 혹은 주 단위 협력에서 분 단위 협력이 가능해진다.
  • 결함 밀도를 최소화 -> 매일 선적 가능한 새로운 기능을 가지고 고객과 새로운 비즈니스 관계 창출이 가능하다고 한다.

경험은 없지만 그렇다고 한다.. 근데 그런 비즈니스 경험이 없는데도 배워야한다면 "왜"일까?


용기 - 두려움 관리 방법

두려움이란 "😭 응애, 나 아기개발자 아무것도 몰라요 무서워요"가 아니라,
정말 어려운 문제라서 시작 단계인 지금은 어떻게 마무리 될 지 알 수 없다고 생각하는 식의 두려움을 말한다.

두려움은 다음과 같은 원인을 제공한다.

  • 망설이게 만든다.
  • 커뮤니케이션을 덜 하게 만든다.
  • 피드백 받는 것을 피하도록 만든다.
  • 까다롭게 만든다.

이 중 어떠한 것도 프로그래밍에 도움 되지 않는다. 특히 어려운 코드를 짤 때 더더욱.
문제는 어려운 상황에 어떻게 맞서야 할까?

'켄트 벡'님은 다음과 같은 방법을 제시한다.

  • 불확실한 상태로 있는 대신, 가능하면 재빠릴 구체적 학습을 하기 시작한다.
  • 침묵을 지키는 대신, 좀 더 분명하게 커뮤니케이션 한다.
  • 피드백을 회피하는 대신, 도움이 되고 구체적인 피드백을 찾는다.
  • 자신의 나쁜 성깔을 직접 해결해야 한다.

프로그래밍 문제가 어려울수록 각각의 테스트는 좀 더 작은 부분을 커버해야 한다. 일단 테스트 하나를 작동하게 하면, 지금 현재 그리고 앞으로 영원히 작동할 거라는 걸 알 수 있다. 테스트가 망가져 있을 때에 비해, 모든 것이 작동하는 쪽으로 다가가는 것이다. 다음 테스트를 작동하게 하고, 그 다음, 그 다음..

단순하게 시작하고, 자동화된 테스트를 만들고,
새로운 설계 결정을 한 번에 하나씩 도입하기 위해 리팩토링이 가능해진다.
외관상 복잡해 보이는 문제에 대해 신중히 사고하기만 하면 된다는 의미이다.

또한 테스팅에 쓰는 시간 일부는 사실 분석 혹은 설계 결정에 쓰이므로 필요 낭비라고도 할 수 있다.

테스트를 유용하고 문제 해결에 본질적인 시스템 사용의 예로 바라보는 것이 테스트 주도 개발이다.


프로그래밍과의 승부

프로그래밍(TDD)은 컴퓨터 화면과의 승부가 아니다.
컴퓨터 화면 속 이상으로 중요한 곳이 있다. 바로 우리의 머리 속이다.
올바른 길을 따라가지 못한다고 느끼면 자책과 자기비하가 일어난다. 이런 생각은 승부를 곤두박질치게 하는 것과 달리, 나의 내면에서 벌어지는 일에 관심을 갖고 심리적 안정 상태를 유지하면 엄청난 차이를 경험하게 된다.

"자신의 생각과 컴퓨터가 보여주는 것이 서로 다르다고 해서 절대 낙심하지 마세요. 다름을 느끼고 즐기려고 하세요."
"빨리 테스트를 통과시키려고, 혹은 프로그램ㅁ을 빨리 작성하려고 조바심 내지 마세요."
"자신감을 가지세요. 프로그래밍을 쫓아가려고 하지마시고 자신을 따라오게 하세요. "

이렇게 해서 심리적인 안정 속에서 프로그래밍을 할 수 있게 되면 놀라운 일들을 경험하게 된다. 전에는 보지 못하던 것들을 보게 되며, 생각하지 못하던 것들을 생각해 내게 된다. 하늘에서 떨어진게 아니라 내 속에 이미 있던 능력이라고 한다.

profile
왔을때보다좋은곳으로

0개의 댓글