Agile 방법론에 관심이 조금이라도 있는 개발자들은 TDD(Test Driven Development)가 무엇인지는 대충 알 것이다. 간단하게 설명하면 테스트를 먼저 작성하고 그 테스트를 통과하기 위하여 코딩하는 개발 방법론이다.
지난 주 목요일에 신제용(http://jeyong.com)님을 오랫만에 만났다. 이런 저런 밀린 이야기를 나누던 중 실생활에 적용하는 TDD(참고: http://jeyong.com/MoinMoin/ns/moin.cgi/TDD_bb_fd_c8_b0_b9_e9_bc_ad)에 관한 이야기가 나왔다.
실생활에 적용하는 TDD의 예를 들면(참고 url에도 나와 있지만) 책상 정리를 할 때 책상 정리와 관련된 업무를 몇 개로 나누고, 각각의 test를 미리 정해 놓고 test를 통과할 때 까지 한 단계씩 수행해 나가는 것이다. 보다 구체적으로 이야기하면
- 책상 정리
1. 쓰레기 치우기 - Test : 책상 위에 쓰레기가 없으면 test 통과
2. 먼지 정리 - Test : (눈으로 보고 순간적으로 판단하기에)책상 위에 먼지가 없으면 test 통과
...
와 같이 하는 것이다. 개발에 적용하는 TDD와 큰 차이는 없다. Test 자동 framework이 있느냐, Test를 눈으로 수행하느냐의 차이일 뿐...
제용님에게서 이 이야기를 들었을 때 처음으로 든 생각은 '그렇게 일을 하게 되면 마음에 여유가 없어지고 너무 무미건조해지지 않을까?' 라는 의문이었다. 그에 대한 답변은 '어차피 해야 할 일을 정리해서 빨리 빨리 해치우면 그 만큼의 남는 시간에 삶의 질을 향상시킬 수 있다. 생활 속의 TDD는 이런 이유로 하는 것이다' 였다.
재미있을 것 같기도 하고, 개발할 때 TDD를 적용하려면 평소에 습관이 되어야 잘 할 수 있을 것 같기도 하고, 그래야만 TDD의 효과를 다른 개발자에게도 이야기 해 줄 수 있을 것 같아서 한 번 시도해 보기로 하였다.
실생활에 TDD를 적용하기 전에, 나름대로의 Rule을 만들어 보았다
1. 부담을 갖지 않는다.
뭐든 재미있어야 꾸준히, 오래 할 수 있다.
2. 일을 세부적으로 나누기 위해 노력하고, 가능하다면 각 일의 양을 기록해 둔다.
세부적으로 나누어야 예측이 가능하고, 일의 양을 기록해 두는 것은 다음에 참고하기 위해서이다
3. 세부적인 시간 기록이 힘든 일은 시작 시간 / 끝 시간 만을 적어 둔다.
너무 형식에 얽매이지 않기 위함이다
4. 다른 사람과 함께 하는 일은 적용하지 않는다(부담감을 느낄 수 있음).
TDD의 실용성을 잘 아는 사람이라면 함께 시도해 봄 직 하다
5. 즐기기 위한 일(취미 생활을 위한 독서, 축구 관람 등)에는 적용하지 않는다.
1번과 어느 정도 일맥상통함
6. TDD를 적용하면서 느낀 점을 반드시 기록해 놓는다.
회고 시 필요할 것 같아서 적어 놓았다
자, 이제 첫 번째 실생활 TDD 적용이다.
1. 장보기
- 출발
* test : 가방에 모든 소지품을 챙기고 맥도날드 밖을 나선다 - 롯데마트 앞 맥도날드에서 출발하였음-
* 시간 : 11:15 ~ 11:17
- OLIVE(롯데마트 근처 친환경매장) 쇼핑
* test : 콩나물/다시마/우유/시리얼 중 있는 것을 산다
* Failed(OLIVE가 열지 않았음)
- 롯데마트 도착, 준비 완료
* test : 가방을 넣어 두고, 쇼핑 카트 준비 완료
* 시간 : 11:20 ~ 11: 22
- 쇼핑
* test : OLIVE에서 사지 못한 것/기타 필요한 것을 골라 결재 완료
* 시간 : 11:22 ~ 11:36
- 정리 완료 후 나가기
* test : 가방을 다시 꺼내고, 쇼핑 카트를 넣어 두고, 롯데 마트 문 밖을 나섬
* 시간 : 11:36 ~ 11:39
- 정류장으로
* test : 정류장 도착
* 시간 : 11:39 ~ 11:43
본 task의 결과물은 다음과 같다. ㅋㅋㅋㅋ

콩나물, 시리얼, 다시마, 우유 등이 장바구니에 들어 있다.
2. 설거지
<일의 양 : 큰 그릇 4개, 수저/젓가락 6개>
<전체 시간 : 12:24 ~ 12:40> - 각 항목의 시간 측정이 쉽지 않아 전체 측정만 하였음 -
- 상 치우기
* test : 상 위 깨끗, 전자렌지그릇이 깨끗한 채로 싱크대에 엎어져 있을 것
- 모든 그릇은 오른쪽 싱크대로
* test : 모든 그릇이 오른쪽 싱크대로 옮겨짐
- 비누질해서 왼쪽 싱크대로
* test : 모든 그릇에 비누가 칠해진 채 왼쪽 싱크대로 모여 있을 것
- 물로 닦기
* test: 싱크대에 놓인 그릇이 하나도 없다
- 수세미로 마무리
* test : 싱크대가 깨끗한 채로 완료
3. 음식 준비
<일의 양 : 콩나물국 끓이기 / 소세지 익히기 / 오이 씻기 / 정리>
<전체 시간 : 12:40 ~ 1:10>
- 다시마 국멸치 물 올려놓기
* test : 다시마 국 멸치가 세팅된 물을 가스렌지에 올리고, 불이 켜짐
- 콩나물, 오이 씻기
* test : 다 씻겨진 콩나물은 플라스틱 그릇에, 오이는 접시에 세팅 완료
- 파,고추,마늘,새우젓,후추 준비
* test : 조리대에 이 재료들이 다 놓임
- 소세지 익히기
* test : 소세지 + 물이 들어간 냄비에 가스렌지불이 켜짐
- 조리 시작
* test : 지금까지 나온 모든 재료가 들어감
- 뒷정리
* test : 남은 재료 포장 --> 모두 냉장고로, 조리대 위는 깨끗할 것
이상 3가지 집안일에 대하여 TDD를 적용해 보니, 다음과 같은 시사점(?)이 있었다.
우선, 일을 세부적으로 나누면서
보다 효과적인 방법에 대하여 생각해 볼 수 있었다. 설겆이를 예로 들어 보면, 이전에는 그릇 하나를 비누칠 해서 물로 헹구고 또 다시 다른 그릇에 비누칠을 한 후에 물로 닦는 과정을 거쳤기 때문에 다소 시간이 많이 걸렸지만 위와 같은 방법을 사용하여서 보다 시간을 절약할 수 있었다. 콩나물 국을 끟일 때에도 이일 저일에 혼란스러워 하지 않고 효과적으로 시간을 사용할 수 있었던 것 같다.
각각의 일에 사용되는 시간 관련 backdata가 확보되어, 다음에 같은 일을 할 때 참고할 수 있게 된 것도 좋은 점이다. 이를테면
'추정' 이 가능해 진 것이다. 자투리 시간에 A라는 일을 할 수 있을지에 대한 판단 자료가 확보되어 시간을 효과적으로 사용할 수 있는 데에 큰 도움이 될 것 같다.
마지막으로,
일에 대한 집중력이 높아졌다. 무언가 기록하고 있다는 것 만으로도 일에 몰두하게 되는 효과가 있고, 복잡한 일이라도 스트레스 받지 않고 현재 하고 있는 항목에만 집중해서 하다 보면 모든 일이 다 끝나는 결과를 가져오게 되었다.
무엇보다도
재미있었다. TDD에 얽매인다던지, 귀찮다던지 하는 생각은 거의 없었고 TDD가 주는 효과와, 항목 하나 하나를 실행해 가면서 '이 복잡해 보이는 일이 사실은 별거 아니었군' 하는 생각을 같이 하게 되면서 상당한 흥미를 느꼈다.
앞으로도 일상 생활에서 특히 하기 싫거나 양이 많다고 생각되는 일에 집중적으로 이 방법을 사용해 보고, 몇 가지 특히 재미있었던 것은 블로그에 남겨서 자료로 써 먹어 보려고 한다.
사실 지금 하고 있는 블로깅도, TDD에 기반해서 하는 중이다. ㅋㅋㅋ
Trackback Address :: http://www.dreamjr.org/tt/trackback/98