2008.12.31 04:12

TDD? TDD! 먼저 준비해야 할 것은 무엇일까요?

며칠 잠수하다 다시 논쟁거리를 들고 돌아왔습니다.

툭하면 문제를 던지는 문제아(?)라서 죄송하지만, 무턱대고 TDD 스터디를 진행하는게 과연 옳은가 싶은 생각이 자꾸 들어서 결국 참지 못하고 화두를 제기하고자 합니다. 여기서 제가 던지는 한 마디에 또 욱하실 분 있을지 모르지만, 섣불리 TDD에 접근하는 건 아닌지 하는 우려는 이미 다른 분들이 올리신 글에 포함된 늬앙스에 나타나고 있지 않습니까...?

새해를 시작하는 마당에 새로운 마음가짐으로 한걸음 나아기기 위해서 스터디를 신청하신 분도 많을 것이고, 수박 겉핧기로 공부한 것들을 제대로 체득해보고 싶다고 결심하신 분들도 많을 것입니다. 그런데 늘 우리가 잘못 알고 사는 것이 있는데 무언가를 익힌다는 것에 대해서 억지로라도 노력하면 내 것이 될거라는 그릇된 신념이 아닐까 생각합니다. 열심히 하면 될거다. 과연 그럴까요?

이미 새벽 시간이 되었으니 어제 일이 되어 버렸지만, 어제 회사에서 있는 에피소드를 하나 이야기해보고 싶습니다. 저는 최근 10년 넘게 거의 자바로만 개발을 해왔기 때문에 C++, 그것도 임베디드 리눅스 환경에서 개발하는 일을 떠맡고 나서 한동안 버벅거리고 있습니다. PC에 우분투 리눅스를 설치하는 것도 난감하고, 시리얼 케이블로 하드웨어와 통신하는 방법도 처음이라 이리저리 헤매다가 최근 며칠 사이에 겨우 개발 환경을 구축하고 더듬더듬 개발을 하고 있는 상황이죠. 휴대용 디바이스에 리눅스가 포팅되어 있고, 그 내부에서 동작하는 GUI 어플리케이션 구동을 위한 엔진을 개발하는 작업입니다.

그런데 한참 뚜닥뚜닥 거리면서 소스를 편집하고 있는데, 뒤에서 물끄러미 바라보던 동료들이 의아한 눈빛으로 쳐다보더군요. 마우스도 안쓰고 텍스트 에디터도 없는 것 같은데 곧잘 소스가 편집되고 있다는 겁니다. 유닉스, 리눅스를 좀 써보신 분은 알겠지만, 제가 지금 우분투 리눅스에서 사용하는 소스 편집기는 vi 입니다. 마우스를 전혀 사용하지 않고 control, alt 키도 누르지 않고 오로지 알파벳 키와 ESC 키 만으로 모든 편집 명령을 구사하죠.

vi 를 10년 만에 사용하는데 모든 명령을 자연스럽게 기억하고 있는 자신이 놀랍다는 생각이 들었습니다. 자랑하려는 얘기가 아닙니다. 왜 C++ 함수나 문법은 낯설기만 한데, vi는 기억할 필요도 없이 손가락이 알아서 명령들을 찾아내고 있는걸까 하는 생각을 하게 되었다는 겁니다. 자전거나 수영을 배우는 것과 비슷한 것이겠죠. 처음 배울 때는 답답해도, 어느새 익숙해지면 평생 잊지 않게 된다는 것입니다.

16년 전에 처음 vi를 사용하는 선배들을 보면서 신기해 하고, 또 열심히 암호 같은 vi 명령어 사용법을 인쇄해서 외우려고 애쓸 때에는 vi를 제대로 사용하지 못했습니다. 소위 말하는 독수리 타법 처럼 키보드를 쳐다 보면서 계속 필요한 명령을 되네이던 식이었습니다. 그런데, 지금은 어떤 명령을 떠올리는게 아니라, 소스를 복사해다 붙여야 겠다는 생각을 하면 자연스럽게 손가락이 움직여서 10여 단계에 이르는 명령키를 척척 누르고 있는 겁니다.

vi 사용 방법을 공부할 때 시험공부 하듯이 명령을 외우기만 했다면, 이렇게 오래도록 기억하고 있지는 못할 겁니다. 자연스럽게 타이핑을 하는게 아니라, 다시 vi 명령어 목록표를 인쇄해서 모니터 옆에 붙여 두고 몇 줄 고칠 때마다 흘긋흘긋 쳐다보고 있을 겁니다. 그렇다면 이런 방식이라고 해야 할까... 아니면 학습 자세라고 해야 할까... 억지로 외우기 보다는 자연스럽게 반복 학습하는 태도를 TDD를 공부할 때 적용하는 건 어떨까 하는 생각을 해봤습니다. (물론 제 의견이지 이래야 한다는 강요가 아닙니다.)

TDD를 공부하려는 마당에 TDD의 정의, TDD의 법칙, TDD의 정석, TDD의 효과... 이런 걸 공부하고 또 외우려고 하는게 의미는 없다라고 생각합니다. 물론, 어느 공공기관에 TDD 자격증을 내놓을 계획이 있다면 열심히 외우고 예상문제 풀이를 해야겠죠. 하지만, 당분간은 그럴 일이 없을 것 같습니다. UML이나 방법론은 자격증 시험에 포함되고 있습니다만... (어차피 몇년 지나면 변할 기술에 왜 그리 자격증을 남발하는지 모르겠습니다만...) 소프트웨어 개발 방법론이니, 요구분석 노하우라던가, 설계 기법, 디자인 패턴... 이론적인 이야기들은 아무리 외워놔도 실전에 적용할 때는 전혀 떠오르지도 않고, 자연스레 적용이 되는 걸 본 적이 없습니다. (여기서 꼬투리 잡힐만한 이야기를 하나 던지는 군요... 어차피 논쟁을 위한 글이니 그냥 정돈하지 않겠습니다. 자칫하면 이론 공부 하지마라는 이야기로 와전될 수 있을 듯 한데... 에라 모르겠습니다..)

TDD를 학습하기 위해서 꼭 필요한 준비과정은 'TDD란 무엇인가?'라는 정의를 예습하는게 아니라, 왜 나는 TDD를 필요로 하는가? 하는 의문이 아닐까요? 그리고, 그런 질문에 대해서 각자에게 의미있는 답을 품고 첫 시간에 모여야 하지 않을까 싶습니다. (제게 있어서 TDD가 필요한 이유는 적지 않겠습니다. 이건 논쟁을 위한 글이니까요 ^^;)

아니 좀 더 과격하게 물어보고 싶은 게 있습니다. TDD를 학습하기 위한 선행 과정을 이해하고 계십니까? 그런게 필요 없다는 의견도 있을 수 있다고 생각이 들기는 합니다만, 비유를 들자면 무턱대고 자바 언어를 학습한다고 해서 자연스럽게 프로그램을 잘 짜게 되는 건 아니지 않습니까? 왜냐하면 자바, TDD, 스프링 이런 건 도구이니까요. 도구를 사용하기 위해서는 도구를 사용하는 사람이 언제, 어떻게, 왜 써야 하는지를 충분히 이해해야 하고 도구를 사용하기 위한 적합한 환경을 준비할 필요가 있는 것입니다.

너무 추상적인 질문을 드리는 것 같아서, 좀 더 구체적인 얘기를 해볼까 합니다. 저는 TDD에 대해서 Test Case를 작성하고 Test Case를 중심으로 구현해 나가는 과정이라고 알고 있습니다. 제가 알고 있는 지식이 틀릴 수도 있을 겁니다. 그러니 일단, 제가 아는 범주에서 TDD를 위한 준비는 무엇인가라고 묻는다면 저는 문제 이해, 혹은 요구사항 분석이라고 말하고 싶습니다.

웹 게시판을 제작한다거, 소매점을 위한 주문/판매 관리 시스템을 만든다거나, 혹은 메신저 같은 통신 프로그램을 작성하는 경우를 생각해봤을 때, 테스트 케이스를 만들기 위해서는 어떤 것을 테스트 해야 하는가에 대해서 고민할 필요가 있는 것이죠. 별로 중요하지도 않거나, 필요한 기능도 아닌데 열심히 테스트 케이스를 만드는 것은 의미 없는 일이 될 뿐이니까요. 아~ 그런 바보가 어디 있냐구요? 글쎄요. 바보가 없는 세상이라면 왜 모든 소프트웨어 개발 프로젝트는 절대로 예상한 시간에 끝나지 않는 것일까요?

그러니까, 잠시 짚어두고 넘어가겠습니다. TDD 자체에서 벗어난 것을 선행 학습하자는 이야기는 아닙니다. TDD를 위한 TDD, TDD라는 것을 도구로 바라보지 않고 자칫 목적으로 이해해버리는 어이를 상실해버리는 상황을 만들지 않기 위한 각자의 노력이 필요하다는 것을 말씀드리고 싶은 겁니다.

구체적으로 어떤 노력이 필요한 것일까요? 앞서 말씀드린 에피소드를 다시 떠올려 주시면 좋겠습니다. 즉, 노력하려 하지 않는 것이 필요하다고 생각합니다. 필요성을 느끼고, 정말 필요하다고 여기는 것을 자꾸 반복해서 학습하는 것. 그런 과정을 통했을 때에 비로소 깊이 경험이 체득되고 오래도록 남는 것이 아닐까요?

세상에 나온 많은 TDD에 대한 글을 읽고 이해해 보겠다거나, 이번 스터디 과정을 통해서 TDD에 대한 자신감을 얻고 싶다거나... TDD에 대한 이론들을 달달 외워 버리겠다는 시도는 하지 않았으면 좋겠습니다. 심하게 말해서 TDD를 실전에 적용할 수 있는 수준이 되겠다는 것조차 욕심이라고 생각합니다.

그저 여러분과 제가 10년 후에도 여전히 IT 분야의 소프트웨어 개발 현장에 남아있게 된다면, 그 후에도 아무런 거리낌 없이 Test Case를 작성하고 있을 거라는 희망을 걸고 싶습니다. 다시 얘기해 보겠습니다. 예전에는 vi 편집기를 잘 사용하는 개발자는 대단한 사람이라고 인정 받던 시절이 있었습니다. 지금은 어떻습니까? 리눅스에서도 웹 브라우저가 기본 설치되어 있고, 이클립스도 사용할 수 있습니다. vi를 사용한다는 저 같은 사람은 그냥 매니아일 뿐이라는 것이죠. 하지만, 저는 vi를 잘 다루기 때문에 나름 편하게 일을 하고 있습니다. 우분투는 낯설지만, 우분투에서도 vi가 동작하기 때문에 쉬이 적응하게 되는 것이죠.

지금은 TDD가 대단히 새로운 기술처럼 여겨지지만 과연 10년 후에도 그럴까요? 그러니까 굳이 긴장하고, 눈에 힘주고, 어깨 펴가면서 공부할 필요가 없다고 생각합니다. 편안하게 학습해야, 진정 앞으로 저와 여러분의 10년 후를 편하게 만들어주는 그런 도구로 남지 않을까요?

논쟁하겠다고 선언해 놓고 용두사미가 되어버렸습니다만, 그래도 논쟁거리(?)를 계속 남기고 싶습니다. 1월 4일까지는 며칠 남은 것 같은데 여러분은 TDD를 어떻게 준비하고 계십니까? 의견을 기다리겠습니다.

물론 제 의견에 대한 비판도 감사히 듣겠습니다.

----- 여기서부터는 제 주관적인 의견입니다. -----

참고로 제 나름의 노하우를 하나  알려 드릴까 합니다.
만약 프로젝트를 시작해야 하는 마당에 갑자기 본격적으로 스프링을 사용해야 하는 상황이 도래한다면, 저는 절대로 토비님이나, 영회님 블로그를 참조하지 않습니다. 나아가, 거의 모든 스프링 전문가들의 사이트를 읽지 않습니다. (그렇다고 제가 토비님이나, 영회님을 미워한다는 얘기는 아니고...)

왜냐하면, 대가이신 분들이 쓰시는 글과 그 내용은 그 분들이 몇 날, 몇 달 혹은 몇 년에 걸쳐서 고민하고, 실험하고, 시행착오를 거치면서 깨달은 내용을 압축한 것이기 때문입니다. (같은 맥락으로 저는 김창준님이나, 강규영님 블로그도 자주 읽지 않습니다... ^^;) 대체 그런 엑기스를 단숨에 소화해낼 자신도 없고, 도저히 불가능하다고 생각하기 때문입니다. 제가 드래곤 볼에 나오는 손오공이나 베지터는 아니니까 말이죠. 저는 크리링 수준에도 못 미친는 듣보잡 엑스트라 캐릭터입니다.

일단은 당장 현장에서 써먹을 수 있는 샘플 코드, 당장 써먹을 수 있는 예제, 간단한 가이드 위주의 문서를 읽습니다. 그리고 몇번에 걸쳐서 적용하고 응용하면서, 예제에 나와 있지 않지만 필요한 부분이 있으면 레퍼런스 문서를 참조합니다.

점점 실전에서 스프링은 어떻게 쓰는구나라는 감을 익히고 전체적인 윤곽을 파악한 후에 그제서야 스프링에 관한 전문가 블로그들을 찾아 다닙니다. 기본은 익혔으니까, 응용법도 학습해야될 테니까요. 그리고, 어느 정도 실전 경험과 이해력을 얻은 후에 전문가 글을 읽어야 그 분들이 시행착오 경험을 추론할 수 있고, 간접 경험 만으로도 빠르게 새로운 지식을 체득할 수 있게 됩니다. 이런 말이 있죠? 고기도 먹어본 놈이 안다고 말입니다.

아~ 참고로 기선님 블로그도 수준이 높으니까, 스프링 공부하시려면 즐겨찾기에 일단 저장해두시고 나중에 보세요. ^^;

----- 여기서까지는 주관적인 의견입니다. -----

Trackback 0 Comment 9
  1. 영회 2008.12.31 08:39 신고 address edit & del reply

    '어느 정도 실전 경험과 이해력을 얻은 후에 전문가 글을 읽어야 그 분들이 시행착오 경험을 추론할 수 있고, 간접 경험 만으로도 빠르게 새로운 지식을 체득할 수 있게 됩니다.'

    예전에 로드 존슨 책이 읽어도 읽어도 도무지 이해가 가지 않던 기억이 떠오르네요. 그러한 책들은 나중에 내가 개발자로서 지내온 날을 측정하는 바로미터 역할도 해주는 듯 합니다. :)

    예전에 모임에서 TDD 관련 발표를 한다고 했는데... 정확히는 TDD가 아니고 '멀티 레이어 환경에서 자동화 테스트 작성 기법' 정도가 되겠죠. 써니님 글을 보니 어느 정도 스터디가 진행한 후에 제 생각을 공유해보는게 좋을 듯 합니다.

    숫자가 늘어난 것을 보니 스터디가 높이 평가되는 듯해 보기 좋지만, 자칫 강의식으로 흐를 수 있지 않을까 우려감도 생기네요. 노련한 분들이 계시니까 순항하시겠죠?

    • is윤군 2008.12.31 09:29 신고 address edit & del

      공유 잊지 안고 기다리고 있겠습니다..ㅋㅋ

  2. 기선 2008.12.31 09:36 신고 address edit & del reply

    결국 이 긴 글의 요지는 본문 맨 마지막 문장..

    "1월 4일까지는 며칠 남은 것 같은데 여러분은 TDD를 어떻게 준비하고 계십니까?"

    이것 인가요? @_@ 그냥 그렇게 물어보셔도 되는데.. 너무 돌리신듯 합니다.

    참고로 이번 스터디는 TDD를 익힌다기 보다는 "테스트"를 익히는 스터디이고 그 방법으로 TDD를 이용하는 것 뿐입니다. 꼭 TDD로 개발할 필요가 있나요? 하고 싶음 하는거죠. 대신 중요하고 복잡한 로직에 대한 테스트는 꼭 필요하다고 생각합니다. 그럴 때 얼마나 신속하게 효율적인 테스트를 작성할 수 있는가... 이것이 이번 스터디의 목표라고 할 수 있겠습니다.

    그렇다면.. 이번 스터디 "테스트"를 위해 준비해야 할 것은 무엇이 있을까요?

    "열정"만 있으면 됩니다. 자바를 잘 몰라도 됩니다. 완전 초보여도 괜찮습니다. 주변에 잘하는 분들이 많아서 잘 도와줄 겁니다.(오히려 좋은 기회죠. 테스트도 배우고 프로그래밍 언어도 익히고) 자기가 작성한 코드를 잘 '테스트 하고 싶다는 의지'.. 그걸 실천할 수 있는 손가락과 머리만 있으면 되는 것이지 그 외엔 아무것도 필요 없습니다.

    부담 갖지 마시고 가벼운 마음으로 오세요~

  3. 김재진 2008.12.31 09:37 신고 address edit & del reply

    인간이 불을 사용하기 이전에 최초에 불을 쓴 사람을 쳐다보던 사람들은
    왜 굳이 귀찮게 불을 써야할까 날고기도 맛있는데 라고 생각할지도 모르겠습니다.
    하지만 누군가 쓰는 불을 힐끗 훔쳐보고 고기도 익혀먹어 보고 동굴에 온도도 높혀보고 하면서
    "불이란 날고기를 익혀 먹으면 맛있고 따뜻함을 준다" 라는 필요성을 느끼고
    더욱 더 불을 관리하는법을 더 익히고 잘 쓰고자 할 것입니다.

    "불이란 날고기를 익혀 먹으면 맛있고 따뜻함을 준다" 라는 필요성의 부분을 깨닫는건 누군가가
    불을 쓰는것을 훔쳐보기라도 하고 같이 써보기라도 해야 필요성을 느끼거나 또는 자기가
    느끼고 있던 필요성에 더 높아지지 않을까 생각합니다. 그래서 저는 자신이
    TDD를 스터디 해야 하는 필요성 이유를 가지고 있는 분들도 환영이지만
    TDD가 먼지 힐끗 훔쳐보고 싶고 그런 필요성을 가지고 싶은 분들도
    스터디에 좋은 영향을 끼칠 수 있다라고 생각합니다. 그래서 TDD 스터디에
    대한 방향도 TDD에 대한 마스터 또는 매니아 수준이 아닌 가벼운 TDD에 대한
    이해와 적응력 향상이라고 생각합니다.

    또한 영회님(왠지 회장님이라고 부르고싶어지네요) 말씀처럼 갑작스럽게 늘어난 인원때문에 걱정
    스럽지만 새해니깐 다들 열심히 하고 좋은일 있을거라고 기대합니다!

  4. Max 2008.12.31 09:53 address edit & del reply

    (글이 너무 길어요... 제발~ ㅡㅜ)

    봄싹 스터디 성격도 그렇고, 너무 철학적이거나, 논리적이거나, 대의나 명분 또는 진정한 의미를 꼭 알 필요는 없을것 같아요. 새해도 되었고, 스터디로 하고 싶은데, 마침 이런저런 제약조건이 느슨한 스터디가 있어서 아무런 구체적인 학습목표 없이 참여할수도 있을 것 같아요. 만약 봄싹 스터디가 이런저런 절차나 사전지식 등을 요구하는 형식에 구애가 있었다면 모르지만, 처음부터 그런것을 과감히 제거하고, 대신 의지가 있는분들이 준비해서 발표하는 형식이였던것 같습니다.

    물론 스터디 주제에 대해서 미리 생각해보고 오면 학습에 도움이 됩니다만, 학습주제에 대한 나름대로의 사상이 꼭 없더라도 막연히 TDD란걸 들어보고, 실제 몇몇분이 하는걸 보면서 조금씩 개념을 나름대로(객관화가 아닌)의 정의로 만들어가는것도 학습행위 중에 하나 일듯 합니다.

    느슨한 조건에 모여서 대압착 학습성과를 이루는....뭐 그런....ㅡㅡ;;;

    • 기선 2008.12.31 10:17 신고 address edit & del

      정확하게 보셨네요.
      바로 이게 봄싹 스터디의 정체성입니다.

    • is윤군 2008.12.31 15:53 신고 address edit & del

      성한님이 바라던 그런 스터디의 모습이지 않습니까?ㅋ
      편안한 맘으로~ 누구나 쉽게~ 먼가를 시작해보는 ..
      좋은 발판이 되어 주는 봄싹스터디 ㅋㅋ 그러나 하다보면 중독되는 스터디..ㅋㅋ
      아마도 이런 신념은 이번 스터디에서도 쭈욱 이어지지 않을까 싶네요;;ㅋ