경험 공유

조회수 44회
읽지 않은 첫 메시지로 건너뛰기

변신철

읽지 않음,
2008. 11. 20. 오전 12:20:0708. 11. 20.
받는사람 xper
작년10월 부터 12월까지 진행되었던 프로젝트 경험을 정리해 보았습니다.
Agile의 기법을 처음 도입해 본 것이라 다양한 시도는 해보지 못했습니다.

●어떤 프로젝트인가?
버스 운행 관리(BMS)를 위한 시스템입니다.
각 버스에 정보 처리 단말기를 설치하여 단말기는 GPS를 이용하여
현재 지나치는 교차로나 정류소에 관련된 정보와 운행 관련 정보를 처리하여
센터로 무선망(CDMA)을 이용해 전송을 합니다.
센터는 그 정보를 바탕으로 출/도착 정보를 공유하고
버스간에는 앞차/뒷차 간의 운행 간격을 제공합니다.
그 중에 버스에 설치되는 단말기의 Software부분 개발이 저희가 작업한 프로젝트입니다.

●몇 명이 몇 개월 작업한 것인가?
총 개발 기간은 3달 정도였고
Firmware 작업에 3명이 투입되었고,
Linux Porting에 2명이 작업하였습니다.
Paper work및 현장 작업을 담당해준 친구도 2명 있었습니다.
지금까지 유지 보수 계약에 따라 1명의 엔지니어가 관리하고 있습니다.

●언어나 플랫폼은?
ARM9을 사용한 단말기이고 언어는 C++을 사용하였고
GTK+위에 wxWidgets을 이용하였습니다.
Database는 SQLite를 이용하였고
UnitTest는 CPPUINT을 이용하였습니다.
CI는 cruisecontrol을 이용하였습니다.

● 전체 라인수는 어느 정도?
전체 라인 수는 23000line정도 입니다.

●테스트 케이스는 몇 개 정도?
테스트 케이스는 총 112개입니다. 좀 부족한 감이 많습니다.

●테스트할 때 어려운 문제는 없었는지. 어떻게 해결했는지?
1. 테스트 케이스를 만들어 낼 때 하나의 김밥 썰기 보다 김밥 해체 하기가 주를 이루게 되어서
함수간 의존성 등이 존재하는 경우가 간혹 발생해
테스트를 통합하여 module을 만들 때 예상치 못한 side effect가 있었습니다.
후반기 들어서는 테스트 케이스를 작성할 때
균형감을 유지하기 위해 많이 노력하였습니다.
균형감을 유지하는 데는 pair만 한 게 없었습니다.
동료와 테스트 케이스를 만들 때부터 수다 떨면서 작업하다 보면 서로에게 많은 영감을 줄 수 있었습니다.

2. Network단에 적용된 Mock Object를 수정하는 경우
대량의 test case를 수정해야 하는 상황이 발생해서
상당히 귀찮은 적이 있었습니다.
가능한 하나의 단위테스트에 여러 가지가 중복되지 않게 하기 위해 노력했지만
State pattern같은 순차적 테스트를 해야 하는 경우는
mock의 변화에 대한 해결책을 아직 못 찾았습니다.

3. 불필요한 Accessor들이 생겨납니다.
최근까지도 고민했던 부분들인데
Private으로 처리되었던 부분들이 Test Case때문에 Public이 된 상황에 대한 이야기입니다.
테스트 케이스를 작성할 때 friend를 이용하여 처리한 경우도 있고(이러면 Class단을 조건부 컴파일로 관리해야 합니다.)
귀찮을 때는 그냥 Public으로 선언하였습니다.
훌륭한 설계자 모임에 가입할 수 없어질지는 모르겠지만
요즘에는 Test를 위한 권한 조정은 설계를 크게 해친다고 생각이 들지는 않습니다.


●비슷한 프로젝트를 하려는 팀들에게 어떤 조언을 해주고 싶은지.
1. 후반기 작업이 바빠지고 다양한 요구사항들이 변경이 되서
약 2주간 1명의 엔지니어가 더 투입이 되었습니다.
결론적으로 이시기에 Test를 작성하지 않고 작업한 내용이 급증하였습니다.
복잡도도 이시기에 작성된 함수들이 전반적으로 높은 점수를 유지하고 있습니다.
인력을 더 투입하는 것 보다 가치가 떨어지는 부분을 약간 뒤로 미루는 것이
좀 더 현명한 것이 아닐까 합니다.

2. 상시적인 Pair를 권해 드립니다.
가능한 많이 떠들면서(프로그래밍과 관련 없는 수다도 상관없습니다.) 작업할 것을 권해드립니다.
Peopleware에서 아저씨들이 조용한 환경을 이야기 했지만
저희의 경우는 조용할 수록 무섭기만(?) 하고 아무런 활기도 느낄 수 없었습니다.
활기가 없을 때의 코드는 황무지 같습니다. 고쳐야 할게 많았습니다.
그러나 떠들면서 Pair를 한 코드는 참으로 예쁩니다.
Refactoring도 더 해주고 싶습니다.
코드만큼 빈익빈부익부가 통하는 게 없는 것 같습니다.
예쁜 코드일 수록 사랑을 많이 받아 더욱더 깨끗해져 갑니다.
Clean code that works의 기본은 Pair로 부터라 생각합니다.

3. TDD는 생각보다 어렵지 않았습니다.
저도 좀 더 공부하고 고쳐 나가야 하지만 크게 어려움을 느끼지는 못했습니다.
테스트 케이스를 만들어 내는 과정도
Pair를 하면서 둘이 자리에 앉았을 때 우리가 하고자 하는 게 뭔지를 Check-in하고 나면
(물론 성숙도는 차이가 나겠지만) 작성에 크게 어려움이 없었습니다.
제가 기간 내내 팀원에게 가장 많이 한 말은 "너의 의도를 밝혀라"였습니다.
참고로 프로젝트 중반 쯤에 설계상의 결함이 발견되어
Event를 중간에서 처리하는 Queue를 통째로 수정해야 하는 경우가 발생했습니다.
Queue를 사용하는 덩치 큰 클래스도 많고
특히 많은 Thread들이 이 Queue를 중심으로 동작하고 있어
수정을 해도 될지 걱정이 많았습니다. 예전의 나였다면 가능한 상태를 유지하고 주변을 바꾸려 했을 겁니다.
하지만 동작하는 테스트 코드가 있다는 것은 생각보다 용기가 됩니다.
결과적으로 총 3시간 정도의 시간으로 성공적으로 수정이 되었고
준공이 끝난 지 1년이 되어가지만 아직 그 부분에서 결함이 발견되고 있지는 않습니다.
이것이 TDD의 힘이라고 생각합니다.

4. 관리자가 Agile을 의심한다면 아닌 척 할 필요도 있습니다.
감리를 담당한 분들이 Agile의 A도 모르는 분들이라 설명하려 해도 받아 들이게 할 수가 없었습니다.
수 십 년 씩 업계에서 폭포수와 함께 해 오신 분들에게
가능한 설계를 뒤로 미룬다는 따위의 이야기는 통할 리 만무합니다.
그래서 굳이 설명하지 않았습니다.
원하는 문서작업은 별도의 인력을 투입해서 낭비된 면이 없지 않지만
최소한 감리나 고객으로부터 일체의 불평을 듣지 않았습니다.
오히려 2주 단위로 나오는 발행에 크게 감동을 받아 프로젝트 말미에는
(Acceptance Test를 진행할 무렵) 새로 뭐 테스트 할게 있냐, 나는 걱정하지 않는다는 말을 고객으로부터 들었습니
다.

5.임베디드 상황이 너무나 다양하지만 환경제약에 너무 고민하는 경우가 많습니다.
하지만 저희는 가능한 Desktop과 같은 환경을 구축하기 위해 많은 노력을 기울였습니다.
OpenEmbedded를 사용해서 CrossCompile대한 부담을 대폭 낮추고
사용하고자 하는 플랫폼은 가능한 풀버전을 쓰기 위해 노력했습니다.
현재 ARM9이나 ARM11정도이면
Appllication 작업을 좀더 compact하게 구성하면 충분히 풀버전의 Framework을
임베디드 환경에서 쓸 수 있음을 경험하였습니다.
참고로 현재 진행중인 프로젝트(ARM11) 중 하나는 wxRuby를 이용하여
임베디드에서 Ruby로 Phone Application을 제작하여 외부 심사위원으로부터 긍정적인 평가를 받았습니다.
이것도 거의 풀버전의 Ruby로 작업이 되었습니다.

●평가는 어떤지?
1. 고객의 평가
위에서도 말했지만 고객의 만족도가 높았습니다.
참고로 저희가 프로젝트를 맡기 전에 다른 회사에서 납품을 했었는데
폭포수 모델의 전형을 보여주어서 준공나기 직전까지도
완성된 배포본이 발행되지 않았을 뿐만 아니라 버스 설치 후에도
잦은 Reset으로 불만이 상당히 높았습니다.
그것과는 상반되게 저희는 매 반복주기마다 실제 단말에서 돌아가는
firmware를 가지고 테스트차량에서 테스트 진행하는 모습이
인상적이었고 신뢰를 심어 주었다는 이야기를 들었습니다.
그리고 고객의 잦은 요구사항에 대한 대응을 유연히 하고
고객이 원하는 동작이 포함된 firmware를 빠르게 배포하는 것에 가치를 집중했더니
나중에는 오히려 고객이 기능 중 일부는 불필요하다면서
기능을 빼주는 실로 경이로운 장면이 연출되기도 했습니다.

2. 회사 내부의 평가
프로젝트에서 핵심기능인 가장 가까운 정류소를 찾는 작업을 진행할 때
단 한번도 Debugger를 구동하지 않고 작업을 완료했습니다.
모든 테스트케이스가 pass하고, 단말기에 설치를 하자 즉시 구동이 되더군요.
물론 TDD와 Pair의 힘이라 믿습니다.
이 사례를 회사에서 발표를 했더니 약간의 술렁임 같은 것을 느꼈습니다.
작은 팀에서 적용된 사례이다 보니 Agile의 힘이라기보다는
그냥 구성원들이 알아서 잘한 것이 아니냐는 그런 질문도 있었습니다.
참고로 3명의 개발자 중에서 1명은 신입사원이었고
1명은 C++경험이 거의 없는 개발자였습니다.
이 프로젝트가 종료되고 1명은 본래 자신의 팀으로 돌아갔습니다.
그 친구는 현재 팀 프로젝트에서 TDD적용을 위해 상당히 애쓰고 있습니다.
1명은 저와 같은 연구소에 배속이 되어 유지/보수 작업을 하고 있는데
워낙 표현이 없는 친구라 속내까지는 알 수 없지만,
제가 보기에는 현재까지 리듬감을 잘 유지하고 있습니다.
그 외에도 팀 전체는 아니지만 Agile의 기법을 도입하려는 팀이 2개 정도 있습니다.

정의의소

읽지 않음,
2008. 11. 20. 오전 12:38:4008. 11. 20.
받는사람 xper
사례 공유 감사합니다.
팀원들과 공유하여 어떻게 느끼는지 토의해 봐야겠네요. ^^;

아샬

읽지 않음,
2008. 11. 20. 오전 1:32:4708. 11. 20.
받는사람 xp...@googlegroups.com
좋은 글 감사드립니다. :)

2008년 11월 20일 (목) 오후 2:38, 정의의소 <kww...@gmail.com>님의 말:

Youngrok Pak

읽지 않음,
2008. 11. 20. 오전 1:43:3608. 11. 20.
받는사람 xp...@googlegroups.com
훌륭한 사례군요. 박수!!!


2008년 11월 20일 (목) 오후 3:32, 아샬 <ahas...@gmail.com>님의 말:

Redrails

읽지 않음,
2008. 11. 20. 오전 1:49:0008. 11. 20.
받는사람 xp...@googlegroups.com
와, 일전에 어디선가 잠시 들어본 적 있는 내용인데

이렇게 다시 읽어 보니까 정말 좋군요 ^^

저도 주말 쯤에 한번 올리겠습니다.

좋은 글 감사합니다. 짝짝!

2008/11/20 Youngrok Pak <pak.yo...@gmail.com>



--
10000000000.times { puts "굽신굽신" }

Kim Taedong

읽지 않음,
2008. 11. 20. 오전 2:00:1008. 11. 20.
받는사람 xp...@googlegroups.com
좋은 글 감사합니다.
(Google group에 가입하고 계속 눈팅만 하고 있습니다.^^)

김영현

읽지 않음,
2008. 11. 20. 오전 2:16:2808. 11. 20.
받는사람 xp...@googlegroups.com
계속 눈팅만 하고 있었는데, 좋은 글 감사합니다. ^^;
 
저도 임베디드 환경에서 일하고 있는지라 더욱 대단하게 느껴집니다.
 
2008년 11월 20일 (목) 오후 4:00, Kim Taedong <fly...@gmail.com>님의 말:

장회수

읽지 않음,
2008. 11. 20. 오전 2:17:3908. 11. 20.
받는사람 xp...@googlegroups.com
정말 좋은 내용 공유 감사드립니다.. 좋은 참고가 될것 같습니다.



2008년 11월 20일 (목) 오후 4:00, Kim Taedong <fly...@gmail.com>님의 말:
좋은 글 감사합니다.



--
[장회수 드림]
=========================================================
당신의 앞길에 축복이 가득하길 바랍니다.
Hoe-Soo Jang in Seoul~

회신 : archi...@gamil.com ; knb...@naver.com
Mobile : 010-7209-3108
Job : Developer
msn : hoes...@hotmail.com
nateon : likef...@nate.com
hobby: 현재를 즐기기
=========================================================








PyO

읽지 않음,
2008. 11. 20. 오전 3:25:2308. 11. 20.
받는사람 xp...@googlegroups.com
올해도 기년회를 한다면 자세히 들어보고 싶네요.

감사합니다.

2008/11/20 장회수 <archi...@gmail.com>



--
박준표 Park, Jun PyO

온라인학습생태계 기획단
Yonsei Univ. Center for Youth and Cultural Studies
Tel: 02-2123-4259
Fax: 02-363-1095


조현종

읽지 않음,
2008. 11. 20. 오전 4:18:2708. 11. 20.
받는사람 xp...@googlegroups.com
오호, 상당히 인상적이네요.

2008년 11월 20일 (목) 오후 5:25, PyO <djr...@gmail.com>님의 말:



--
__________________________
Google Talk: han...@gmail.com
blog  : http://hangumkj.blogspot.com/
phone: 010-4120-3601

Cho Hyun jong

ㄴㅇㄱ

읽지 않음,
2008. 11. 20. 오후 8:31:2108. 11. 20.
받는사람 xp...@googlegroups.com
잘 읽었습니다.!!
감사합니다.

2008/11/20 조현종 <han...@gmail.com>



--
--
노우경 Woo-Kyoung Noh
Email: wooka...@gmail.com
Mobile: 016-9377-2012
http://me2day.net/wookay

이용화

읽지 않음,
2008. 11. 20. 오후 8:34:1108. 11. 20.
받는사람 xp...@googlegroups.com
너무나 깔끔하고 일목요연하게 작성해 주셔서 감사합니다.
애자일에 관심만 많은 현재 위치에서 저도 경험을 공유할 수 있도록 노력해야겠다는 생각을 합니다.
 
 

2008년 11월 20일 (목) 오후 6:18, 조현종 <han...@gmail.com>님의 말:

이병준

읽지 않음,
2008. 11. 23. 오후 7:51:0808. 11. 23.
받는사람 xp...@googlegroups.com
좋은 내용 잘 읽었습니다.
 
그런데 불필요한 Accessor들이 많이 생겨난다는 것에 대해서인데
Refactoring이라는 책에도 나왔던 것 같습니다만
그런 Accessor들이 꼭 불필요하다고 생각하지는 않습니다.
기존에 private으로 설계된 부분이 public으로 바뀌는 것이 마음에 걸리는 일은 저도 있었습니다만,
Template Method 패턴을 써서 테스트를 진행하는 경우에는 그런 메소드를
public 대신 protected로 두고 테스트를 진행할 수 있어서 만족했던 것 같습니다.
저 개인적으로는 protected 메소드로 변경할 수 있는 메소드를 식별해 내는 과정에서
주 알고리즘의 robustness가 좋아지는 경험을 했고,
원 클래스의 확장성이나 테스트 가능성도 같이 좋아지는 경험을 할 수 있어서
좋았던 것 같습니다.
 
사례 공유해 주셔서 정말 감사합니다. ^^

2008년 11월 20일 (목) 오후 2:20, 변신철 <tran...@gmail.com>님의 말:

변신철

읽지 않음,
2008. 11. 23. 오후 10:56:1108. 11. 23.
받는사람 xp...@googlegroups.com

Template Method 패턴을 써서 테스트 Unit을 사용하신 부분에 대해 조금만 더 상세히 설명해 주시면 감사하겠습니다.

June Kim

읽지 않음,
2008. 11. 25. 오후 9:23:0508. 11. 25.
받는사람 xp...@googlegroups.com
Class Under Test, Testing Class가 있다고 했을 때,

CUT에서 테스트하고 싶은 메소드가 protected이면, Testing Class가 CUT를 상속받은 상태에서 해당 메소드를
테스트할 수 있습니다.

private이나 protected 테스트시 보통은 friend를 많이 씁니다.
http://praveen.kumar.net.in/journal/2008/01/02/how-to-unit-test-c-private-and-protected-member-functions/


2008년 11월 24일 (월) 오후 12:56, 변신철 <tran...@gmail.com>님의 말:

June Kim

읽지 않음,
2008. 11. 25. 오후 9:33:4008. 11. 25.
받는사람 xp...@googlegroups.com
참고로 이런 방법도 있습니다.

http://parkpd.egloos.com/1746713

2008년 11월 26일 (수) 오전 11:23, June Kim <june...@gmail.com>님의 말:

이병준

읽지 않음,
2008. 11. 28. 오전 1:49:2708. 11. 28.
받는사람 xp...@googlegroups.com
저는 위와 같이 했습니다.
자바라서 아마 원하시는 것에 딱 맞아떨어지지는 않겠습니다만...
어쨌든 저렇게 할수 있었습니다.
이미 김창준님이 좋은 글 몇개 소개를 해주셨으니,
그냥 참고 정도만 하시기 바랍니다. ^^

2008년 11월 24일 (월) 오후 12:56, 변신철 <tran...@gmail.com>님의 말:

Template Method 패턴을 써서 테스트 Unit을 사용하신 부분에 대해 조금만 더 상세히 설명해 주시면 감사하겠습니다.

전체답장
작성자에게 답글
전달
새 메시지 0개