야크 털 깎기(Yak Shaving)
"야크 털 깎기(Yak Shaving)"라는 단어를 들어보셨나요?
단어만 들어서는 무슨 의미인지 전혀 파악이 어려울 텐데 "어떤 목적을 달성하기 위해 원래 목적과 전혀 상관없는 일들을 계속해야 하며 그중 마지막 작업"을 의미합니다.
예로 유명한 마케터인 세스 고딘(Seth Godin)의 "이제는 작은 것이 큰 것이다" 란 책에 "야크 털 깎기의 실제 예가 잘 설명되어 있습니다.
봄이 왔으니 세차를 해야 겠네.
이런 호스가 겨우내 터졌네. 홈 디포우에서 새거를 하나 사야겠군.
- 홈 디포우는 Tappan Zee 다리를 건너야 하고 그러려면 EzPass(하이 패스 같은 건가 봅니다.) 가 있어야 하는데.
- 음 옆 집 Bob 한테 EZPass 를 빌려야 겠군.
- 그런데 아들 넘이 옆 집 Bob한테서 보이스카웃에 가려고 베개를 빌려갔었는데.....
- Bob은 빌려간 베개를 돌려주기 전까지는 그의 EZPass 를 빌려주지 않을 거야...
- 음 그런데 베개에 있는 야크 털이 많이 빠져서 지금 당장 돌려줄수가 없겠네..
- 베개에 넣을 야크 털을 구해서 베개를 고쳐야 겠네..
- 그래서 세차를 하기 위해 동물원에 가서 야크 털을 깍는중..
우스개같지만 S/W 개발중에 저는 이런 상황을 많이 겪었고 주위에서도 겪는 것을 자주 보았습니다.
프로젝트중에 "야크 털 깍기"를 주의해야 하는 이유는 원래 목적이 무엇인지 잃어 버리고 엉뚱한 일을 하면서 엄청난 시간을 까 먹을수 있기 때문입니다.
물론 가끔 가다가 의도하지 않은 좋은 결과를 얻기도 하고 새로운 제품을 만들수도 있겠지만 정해진 기한과 목표물이 있는 프로젝트에서는 "야크 털 깍기"를 주의해야 합니다.
특히 프로젝트에 어떤 기능이 필요할 경우 무작정 구현부터 하는 경우를 많이 보았는데 해당 기능이 필요하다고 꼭 구현해야 하는 것은 아니며 잘 검증된 외부 라이브러리나 제품을 먼저 검토해 보는 것이 필요합니다.
하지만 프로세스나 체계가 없어서 이를 위해서 어쩔수 없이 "야크 털 깎기" 를 해야 하는 경우도 있습니다.
예로 소스 품질이 안 좋아서 테스트 코드를 작성하고 자동화된 테스트를 수행해서 품질을 높이려고 Test Framework 을 도입할 수 있습니다.
하지만 보통은 다음과 같이 흘러가는 경우가 많게 됩니다.
- 프로젝트에서 사용하는 JDK 의 버전이 낮아서 Test Framework 를 지원 안 함
- JDK 를 높였더니 담당자가 퇴사한 공통 코드에서 뻑이 나서 그걸 수정
- 구동했더니 WAS 에서 뻑이 나서 원인 파악후 WAS 업그레이드
- WAS 업그레이드후 상용 3rd party library 에서 문제 발생
- 3rd party 업체에 기술 지원 요청했더니 처음 보는 현상이라고 본사 연구소에 escalation 했는데 처리까지 몇 달 걸린다고 함.
담당자는 나름 품질을 높이고 리스크를 줄이기 위해 자동화 테스트를 하려고 한거지만 프로세스가 엉망일 경우 저렇게 야크털만 깎는 결과를 가져올 수도 있고 이런 경우 프로젝트 환경과 프로세스를 제대로 구성하지 않은 PM 의 잘못이 크다고 생각합니다.
모든 "야크 털깍기"가 의미가 없는 것은 아니며 가장 유명한 성공 사례로는 도널드 크누스(Donald E. Knuth) 교수의 TeX 을 들수 있습니다.
"The Art of Computer Programming" 을 저술중에 조판 시스템과 폰트가 맘에 안 들어서 메타 폰트와 조판 시스템을 만드는데 몇 년을 사용했고 그 결과물로 TeX 이라는 역사상 버그가 가장 적다는 문서작성 도구를 만들어 냈고 이를 사용하고 저술을 마무리했습니다.
하지만 "야크 털깍기"를 한 사람이 크누스 교수라서 가능했겠죠....
저도 gitlab 과 JIRA 를 연계하려다가 직접 PHP용 JIRA 라이브러리를 만드는 야크 털 깍기를 한 적이 있고 이 와중에 PHP용 json processor - jsonmapper 라는 유용한 라이브러리를 발견하여 사용기를 정리해 놓았습니다.
그럼 저는 깎다만 야크털을 마저 깎기 위해서 이만...