근 5주..이젠 6주가 되어가나 동안 처음 3.5주는 그 일에만, 나머지 2 정도는 그 일과 다른 일을 진행하면서 수행한 프로젝트가 하나 있다. 편의상 프로젝트 A라고 부르자 — 사실 공식 명칭이 없거나 내가 모르거나.
평소에 프로그래밍할 때 C++/python/lua 정도를 쓰고 설정 같은 걸 lua/xml로 빼는 형식으로 주로 작업했었는데 이번에 해야했던 일은 서버는 (native) C++로, 클라이언트는 ActionScript 2.0으로 동작하는 녀석을 수정하는 일이었다.
내게 주어진 수정범위는 서버 전체 — 인터페이스와 동작 구조만 유지하는 범위에서 — 그리고 클라이언트가 통신에 사용하는 일부 코드였다. 그리고 주어진 자료는 프로토콜 문서와 서버 코드, 클라이언트의…껍데기쯤 되는 소켓 통신 부분 ((이게 만악의 근원이었던 것 같은 기분도 들지만))
팀에서 간단한 회의를 거친 결과 서버의 전면 개보수 + 클라이언트 소켓 부분을 서버에 맞게 수정하되 프로토콜은 유지한다라는 것. 그리고 이 프로젝트는 나 혼자 진행하게 되었다. 여튼 내가 생각하기에 내 문제였던 녀석들을 요약해보고자 한다.
의사 소통 문제
프로젝트 진행 초기에 내가 내렸던 의사 결정 중에 하나가 일종의 primary key비슷한 역할을 하는 변수의 타입을 변경한 것 이었는데 — 나는 원래 프로젝트 팀에서 내린 결정이 일종의 defect라고 생각했다 — 이게 기존 legacy 코드 ((문제는 나는 이 코드를 받지도 못했단 말이다 Orz 클라이언트 코드 중 극히 일부(껍데기?)만 받았으니…)) 랑 문제가 생겨서 내 작업을 일정 부분 수정해야 했다.
아무래도 이런건 내가 의사소통을 잘못했다고 밖엔…
이종 언어 문제
처음 겪었던 문제, 그리고 끝까지 발목을 잡았던 문제는 익숙하지 않은 언어 — ActionScript 2.0 — 에서 불거져나온 이것 저것들이었다. 내가 홍민희 님의 블로그에서 “워드의 메타프로그래밍” 이란 글 — 불편한 언어를 사용할 때 그냥 사용하는게 아니라 자신에게 편의를 줄 수 있게 언어에 추가로 빌딩블럭을 쌓아 “중력을 줄여가는/언어의 장애를 줄이는” 프로그래밍을 하자는 것 — 을 일찍 볼 수 있다거나, 혹은 애자일 블로그 내용을 기억하고 있었다면 ((저 글을 읽었을 당시엔 별 감흥이 없었는데… 지금은 뼈에 사묻힘(?) )) 참 좋았을텐데 불행히도 그렇게 일이 돌아가진 않았고, 전에 언급했던 것 처럼 C++에서 모든 프로젝트를 최대한 진행시키고, 해당 코드 베이스를 ActionScript에 반복하는 작업을 했다.
지금 다시 하라고 하면 ActionScript 코드에 더 많은 계층을 추가하지 않을까 싶다. 현재는 패킷을 받고, 이에 대한 이벤트를 전달하고, 패킷을 해석하는 계층만 있다 — 즉 프로토콜을 받아서 처리하는 콜백을 부르는 정도까지의 추상화.
테스트 케이스들도 C++쪽에 집중되어 있고… ActionScript 쪽의 제대로된 테스트 케이스도 오늘의 ASUnit 쪽으로 코드 테스트를 옮김으로써 제대로 작성된듯하다…
테스트 주도 개발
TDD(테스트 주도 개발;Test Driven Development)를 시작한건 작년 말 / 올해 초 정돈데 일단 C++ 쪽 코드 작성에서는 제대로 효과를 발휘한듯 하다. 개략적으로 defect를 찾고나서 이를 코드 베이스에 테스트 케이스로 반영하고 / 수정하고 / 다시 커밋하는데 평균적으로 1일 이하의 시간이 걸린 것 같다. 손으로 테스트 하지 않는데에서 상당히 빠른 코딩/컴파일/테스트/리포트 주기를 겪게 된 것도 같고. 다만 ActionScript 쪽의 TDD는 좀 야매였다고 생각해야한다 — .fla 파일에 assert 비슷한 함수를 만들고 그 함수에서 실패할 때마다 특정 메시지 형태로 찍게 하는 수준이었다. 지금이야 ASUnit으로 옮겨서 그런데로 볼만한 수준으로는 자동화 된 듯 하다.
UTF-8 문제
이종 언어 개발 쪽이랑 겹치는 문젠데, ActionScript 2.0에선 문자열의 bytes 길이 ((문자 수 길이랑 대비되는 개념. 예를 들어 “한글”이란 단어는 문자 수 길이로는 2지만, UHC(cp949 or euc-kr)에선 바이트 길이로 4, UTF-8에서는 바이트 길이로 6이다. 즉 의미론적인 길이가 문자수 길이고, 바이트 길이는 메모리에서 표현되는 길이)) 를 바로 얻지 못하고, 그것 때문에 패킷 생성에 오류가 생기는걸 생각하지 못해서 문제가 생겼다. 사실 이건 ActionScript쪽에서 테스트를 제대로 했으면 괜찮았을텐데, C++ 쪽 테스트에서 잘 되는 것만 믿고, 그걸 포팅한 AS 2.0 코드를 제대로 된 테스트 케이스 확보도 없이 넘어간게 크나큰 패인. 덕분에 어제 오늘은 회사에서 일해야 했다…
여튼 요약.
- 의사 소통이 가장 중요 — 의사 소통하기 쉬운 환경 / 코드베이스도 필요
- 프로젝트에서 쓰는 언어의 중력을 줄여라 — 프로젝트에서 쓰는 언어가 맘에 안들면, 자신에게 우호적인 환경으로 바꿀 수 있도록 하자
- TDD에 맞는 툴을 우선 확보하자 — mtasc와 ASUnit을 일찍 알았으면 C++에서 테스트하려던 욕구가 줄었을 텐데
다음 프로젝트 회고는 언제하게 될까 -_-a