2008년 02월 11일
Integration의 유혹을 이겨내며

두 클라이언트 분과 함께 진행중인 프로젝트에 대해서 이야기 하는 자리였습니다.
클라이언트이신 N 팀장님이 저를 대신해서,
처음으로 프로젝트를 함께 하시는 G팀장님께 설명을 드립니다.
"제가 이 팀하고 일을 몇 번 해보니까, 소프트웨어라는 것이 그래요.
기간이 10이라고 하면 8이나 9가 될 때까지는 아무 것도 안보이다가,
갑자기 탁! 하고 나타나서 잘 도는 식이죠.
그러니까, 지금 G팀장님이 조급해도 믿고 기다려 보세요. 잘~ 될 겁니다."
클라이언트 입장에서 믿고 기다린다는 것이 얼마나 큰 용기가 필요한 것이지 알기에,
저희 팀을 믿고 기다려 주시는 두 팀장님께 진심으로 감사를 드리는 자리였습니다.
언제 자세하게 이야기 할 기회가 있겠지만,
이런 식으로 결과물이 나오는 이유는 ' Emulation과 Component 방식' 때문입니다.
Embedded 시스템 상에서 소프트웨어를 디버깅 하는 것은 매우 까다로운 일입니다.
그런 이유로 Host 시스템인 Solaris, Linux, Windows등의 Emulation을 통해 대부분의
버그를 수정하게 됩니다. 90% 이상의 버그는 이 Emulation상에서 처리하게 되죠.
결국 Emulation상에서 모든 기능을 확인한 후에야 Hardware와 Integration하게 됩니다.
클라이언트 입장에서 보게 되면,
Emulation시험이 완료되기 까지는 아무런 Output도 나오지 않게 되는 거죠.
두 번째 이유는 Component방식의 개발 스타일 때문입니다.
최종 Software의 90% 정도는 Component이고 나머지 10% 정도가 Application code로
이루어 집니다. Component라는 것은 레고 블록과 같이 정형화 된 Library를 의미합니다.
(Source가 아닌)
프로젝트는 달라도 Component는 반복적으로 재사용되는 방식이죠.
재사용이라는 것은 장점이지만,
Component의 버그가 여러 프로젝트에 영향을 미치게 되는 위험성은 단점이 됩니다.
그러다 보니, Component에 대한 시험에 많은 시간을 보내게 됩니다.
Upgrade되면서 자연스럽게 여러 버전이 사용되기 때문에
API Backward compatibility도 기본적인 시험에 포함됩니다.
이러다 보니, 최종 Integration까지는 바쁘게 일해도
클라이언트 입장에서 보면, Output이 없어 보이는 것이 당연합니다.
기다림의 시간이란 클라이언트도 참 힘든 시기이지만,
프로젝트를 수행하는 개발자에게도 힘든 시간 입니다.
Integration해보고 싶은 유혹을 이겨내야 하니까요.
몇 년 전이었습니다.
프로젝트의 종료가 얼마 남지 않은 시기였는데,
Mutual Exclusion 문제가 있다는 것을 알게 되었습니다.
(Task나 Thread간에 동일한 Memory Space/Global을 수정하게 되는 문제입니다)
이 문제를 해결하기 위한 방법에는 두 가지 선택이 있었는데,
하나는 Application에서 처리하는 방법이었고,
다른 하나는 공통 Component의 개발이었습니다.
첫 번째는 쉬운 방법이었지만 이 프로젝트에서만 사용할 수 있는 방법이고,
두 번째는 범용적으로 사용할 수 있지만, 어려운 방법이었죠.
시간이 부족하다는 것을 알고는 있었지만, 두 번째를 선택했습니다.
3주라는 시간으로 Draft 1이 힘겹게 나왔습니다.
Release Quality까지는 그 두 배의 시간이 필요한 상황이었죠.
프로젝트는 더 기다릴 수 없었고, Draft 1 상태에서 Integration을 했습니다.
다행히도 문제 없이 잘 돌았습니다.
'그렇게 문제가 해결 되는 구나~' 라고 생각을 했는데
가혹한 시험을 하기 시작하면서, 추가적인 문제가 발생하기 시작했습니다.
Overloading이나 Long-term Aging 시험을 하면서 오류가 발견되었습니다.
오류를 수정하고, 또 오랜 기간 동안 시험을 하고,
또 오류를 수정하고, 추가 적인 시험을 하는 것이 계속되었습니다.
나중에 계산해보니 이렇게 보낸 기간이 6개월 이상이 되었죠.
우습게도 그 기간이 지나도록 Release Quality에는 도달하지 못하였고,
많은 버그의 수정 이후에도 Component는 Draft로 남게 되었습니다.
이 실수를 하면서, '기다림' 라는 것의 중요성을 깨닫게 되었고,
낮은 수준의 시험을 통과하고 Integration하는 것이 어떤 대가를 요구하는지 배우게 되었죠.
3주의 시간을 더 사용하고 Integration을 했더라면 아마도 결과는 바뀌었을 겁니다.
여유로움을 가지고 차후에 진행을 했더라면 아마도 결과는 바뀌었을 겁니다.
아직도 클라이언트께 이런 내용을 쉽고 명확하게 전달할 재주는 없지만,
'저희 팀을 믿고 기다려 주십사' 하고 말할 수 있는 용기는 이때 힘들게 배운 것 같습니다.
기다림과 여유로움을 갖추시고,
제가 한 실수를 반복하지 마시라는 의미에서 적어 봅니다.
Integration의 유혹을 이겨내도록 도와주시는 클라이언트 분들의 믿음에 감사 드리고,
Integration의 유혹을 이겨내면서,
수준 높은 Release Quality에 열정을 실천하시는 팀원들과
숨어있는 많은 True 엔지니어들께 박수를 보내 드립니다.
# by | 2008/02/11 00:24 | 메인스토리 | 트랙백(1) | 덧글(15)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : test-infected
TDD, eXtreme Programming, Agile ... 이 따위의 고상한 이론들을 공부하다 보면S/W 개발에 있어 Test 가 얼마나 중요한지 실감하게 된다.그런데 막상 촉박한 일정이 주어지고 그 시간까지 결과물을 산출해야 하는 작업에적응한 사람들은 테스트를 단순히 정상적인 루틴일 경우 결과물에 대한 기능이 올바로수행되는지의 여부만을 생각하게 된다. (사실 기한 맞추기도 힘든데 기능 테스트만 잘되면 릴리즈 -_-;;)그런데 막상 이렇게......more
여유로움을 가지고 차근차근 문제에 대응했다면
충분히 해결될 일이건만 갑과 을중 어느 한쪽의 조급증으로 인해
망쳐버리는 일은 제가 하는 일에서도 가끔 벌어지더군요.
그런 일이 생길때마다 엔지니어로서 참 부끄러워져요.
이게 또 몇년 지나서 문제가 되어 돌아올땐,
제 능력에 대한 깊은 상처가 되기도 하고요.
서로가 좀 더 여유로우면 좋겠어요. 시간에서나 금액에서나말이죠~ ^^;;;
하지만, 진짜 능력있으신 분들은 어떠한 악조건속에서도
최상의퀄리티를 만들어내시는걸 보면
그분들은 정말 박수 받아 마땅하십니다!!!!
앞으로도 좋은 글 부탁드립니다.
즐거운 명절 보내셨겠죠 제임스님.^^
맞아요. 션님 이야기 들으니까 이케아(IKEA) 창업주 캄프라드 말이 생각납니다.
"어떤 디자이너든지 5,000 크로나 (75만원) 짜리 비싼 책상을 디자인 할 수 있다.
그러나 가장 뛰어난 디자이너는 디자인과 품질 모두 우수한 100크로나짜리 책상을
설계할 수 있다. 어떤 상품이건 턱없이 값비싼 물건은 재주가 부족한 사람들의
작품일 뿐이다."
더 열심히 해야겠어요 ^^
object님// 역시 제가 예상한대로 True 엔지니어의 특성을 고스란히 가지고
계시네요~ 함께 먼 시야를 가지고 전략적으로 일을 하면 훨씬 더 재미있고
더 밝은 미래가 있을 텐데, 그걸 볼 줄 아는 리더가 흔하지는 않은 것 같아요.
얼른 object님이 그런 리더가 되시면 좋겠네요.
게다가 Eminency님의 마음속 열정이 느껴지네요. 그 열정으로 작품을
일구어 내시길 바라겠습니다.
Paromix님// 네, 여유로운 설 연휴였답니다.
조급함이라는 단어가 모든 걸 설명 해주네요~ 역시
Core_Geek님// 네, 감사합니다. 설은 잘 쇄셨는지요.
이전에 해놓았던 프로젝트가 너무 엉망이라 새 프로젝트에서는 어떻게든 최적화 하고 모듈화 시키고 하고 싶은데 위에서는 어차피 똑같이 도는 거 왜 빨리 답을 안 내놓냐고 닥달입니다.
정말 갈등입니다...
Loondark님// 오~ 나오셨군요 ^^ 깜짝 놀랐습니다.
저야 주변 분들이 다 잘 이해를 해주시니 인내가 그다지 크지는 않은 운 좋은 경우죠. 그래도 쉽지는 않죠. 즐길 수 밖에요~
Host환경의 편의성을 누릴려고 Integration을 안하는 것이니까요.
소내기님 팀의 장점을 계속 살려나가시는 길이 제일 좋은 방법이라고 생각합니다. ^^
Component에 대한 테스트는 어떤 방식으로 진행하시나요?
자동화된 방법을 사용하시는지?ㅎㅎ
그리고 부득이하게 사이트별로 다른 요구사항 때문에 Component가 변경되야하는 일들이 생기는 경우엔 어떻게 하시나요?
저희 회사에서는 사이트별로 소스코드를 다 따로 관리해서 유지보수가 너무 힘들거든요.ㅠ
임베디드와 호스트 환경에서 함께 사용하기 때문에
Component의 대부분은 C로 작성되고요.
Test code는 template을 수정하여 사용하는데, 근본적으로는 100% 자동입니다.
Success / Fail을 표시하는 방식을 사용하죠.
사실 Test code는 어떤 tool이나 방법론을 사용하는 것 보다는
무엇을, 어떤 상황에서 test 하느냐가 더 중요한 것 같고요.
저희는 사이트는 아니고 제품별로 요구사항이 변경이 되는데요.
이런 요구사항을 위해 Component를 upgrade시킵니다.
Component에는 버전이 있고요. 1.0이었으면 수정한 버전은 1.1이 되는 식이죠.
중요한 것은 1.1은 1.0 API의 Backward compatibility를 유지 하도록 하여야 합니다.
이런 것들은 test code에 모두 포함이 되어 있고요.
이런 이유로 이전 Project에서 새 기능이 필요하면 upgrade된 component를 사용하면 됩니다.
물론, application code를 조금 수정하기는 해야겠죠. 하하
저희도 제품별로 소스를 따로 관리하기는 합니다.
Project는 Application code라고 하는 '소스' 하고 Component를 합쳐서 만들어 지게 되는데,
중요한 것은 소스와 Component의 비율 같아요.
가능하면 Component를 많이 사용하려고 노력하죠.
지난번 확인 때는 85% 정도를 Component로 사용합니다.
여기에는 Code Generation 부분도 포함이 되고요.
그리고, 어쩔 수 없는 소스는
template 형태로 사용하여 구조를 비슷하게 가져가는 방법을 사용합니다.
프로젝트는 달라도 다 비슷비슷해지는 거죠.
이런 식으로 말씀 드리면, 도움이 되나요? heestory님
감사드립니다^^...완전 도움이 많이 됐습니다..ㅎ