디버깅 0교시: 절차대로

@codemaru · November 04, 2011 · 8 min read

요즘 여기 저기 다른 일들로 불려 다니는 경우가 많다 보니 회사에서 진득하게 앉아서 코딩을 해 본 적이 거의 없는 것 같다. 난 개발이 좋고, 개발 일을 할 때가 가장 행복하고, 가장 잘하는 것도 개발이지만, 그렇다고 개발만하고 살수는 없는 거니까. 현실 세계에서 살아남으려면 결국 손에 물을 묻히기도 해야 하는 법이다. 어쨌든. 그러다 어제 조금 한 숨 돌릴 짬이 났다. 신규 업체에 SDK 파일들을 전달해 주기에 앞서서 이번에 새로 추가된 기능도 있고, 매뉴얼도 업데이트된 부분이 있어서 개발팀 막내에게 숙제를 하나 내주게 되었다. TCP/IP로 간단한 소켓 통신 프로그램을 만들고, 거기다 매뉴얼보고 그대로 적용을 해보라는 것이었다. 개밥 먹기라고 했던가? 우리가 만든 것들이 제대로 되는지 확인해보고자 하는 심산이었다.

뭐 어쨌든 돌아가는 놈들이니 다소 우여곡절이 있었지만 적용은 되었고 테스트가 진행이 되었다. 그런데 이상한 문제가 하나 발생했다. 이상하게 먼가가 정상적으로 돌아가지 않는 것이었다. 딱 2시간 걸린 것 같다. 막내가 매뉴얼에 적혀 있는 초기화 함수를 호출하지 않았던 것이었다. 로그 파일만 봐도 알법한 이 문제를 찾는데 2시간이나 걸리다니. 하지만 이건 복선에 불과했다.

그 아주 가벼운 문제를 해결하고 심층 테스트로 넘어가려고 하는 순간 정말 요상한 문제가 발생했다. 이상하게 새로 만든 클라이언트와 서버 사이의 통신이 안되는 것이었다. 그것도 아주 통신이 안되는 것이 아닌 우리가 전달하려고 하는 일부 패킷만 이상해지는 문제였다. 이 문제가 좀 더 심오하게 보이는 이유는 새로운 서버에 기존 클라이언트로 접속하면 잘 되었고, 기존 서버에 새로운 클라이언트로 접속하면 잘되기 때문이었다. 정말 희한하게 새로운 서버와 새로운 클라이언트만 통신을 하면 이상해지는 문제였다.

    0        md 0
새벽 4시였던가? 우리는 김밥천국에 앉아서 이 요상한 문제에 대해서 이야기를 했다. 김밥천국 주문서 쪽지에 그림을 그려가며, 떡볶이 국물을 튀겨가며, 이 이해할 수 없는 문제의 원인에 대해서 토론을 했다. 그 때가 디버깅하고 한 6시간은 지났던 시간이었던 것 같다. 그리곤 김밥을 먹고는 올라가서 디버깅을 이어갔다. 이 알 수 없는 문제를 해결하기 위해서 한 10가지 프로젝트를 열었고, 여기저기 단서를 추적하기 위한 내용들을 추가했다. 그리곤 결국 10시간 정도 지나서 문제를 찾았는데 다름 아닌 새로 만든 서버가 엉뚱한 내용을 클라이언트에 전달하고, 그 클라이언트가 그 내용을 우리 SDK에 바로 전달해서 발생한 문제였다. 로그 파일에 선명하게 남아있는 PacketError, 사실 로그 파일만 열어봤어도 이렇게 오랜 시간 디버깅을 할 필요가 없었을 텐데. 그 절차를 아무도 따르지 않았던 것이었다.

디버깅을 할 때면 ‘말렸다’는 표현을 쓸 때가 있다. 엉뚱한 곳에 휘말려서 정작 중요한 부분을 보지 못하고 헤매는 경우에 쓰는 말이다. 이렇게 ‘말리는’ 상황을 미연에 방지하기 위해서는 항상 침착하게 절차대로 디버깅을 진행해야 한다. 더불어 자신이 가진 모든 증거를 차근차근 나열해서 꼼꼼하게 생각하는 습관을 들여야 한다. 절대로 증거가 아닌 현상에 휩싸여서는 안된다. 그럼 지는 거다.

힘겨웠던 디버깅 세션을 마치고 집으로 돌아가는 길. WoW에 미쳤던 시절이 떠올랐다. 공대에서 불타는 성전의 거의 마지막 던전인 검은 사원을 트라이 하고 있었던 때였다. 나는 주말 공대였지만 평일에 다른 레이드 던전을 재미 삼아 다니다 보면 으레 지쳐서 5인 던전은 엄두도 못 낼 때가 많았다. 이런 상황임에도 우리 공대에는 하루도 거르지 않고 5인 영던을 꼬박꼬박 다니는 두 놈이 있었다. 한 날 그 녀석들과 영던 나들이를 갔다가 궁금해서 물었다. 지치지도 않냐고, 무슨 재미도 없는 영던을 그리 맨날 다니냐, 라는 질문. 대답이 가관이었다. 감각을 잃지 않으려면 매일 수련을 해야 한다는 것이었다. 레이드 던전을 매일 갈수는 없으니 영던에서 수련을 한다는 대답이었다. 게임 훼인스런 대답이긴 하지만 여기서 우리가 배울 점이 하나도 없는 것은 아니다. 녀석들의 말은 사실 게임을 떠나서 어떤 분야에든 적용될 수 있는 말이기 때문이다.

“숙련됨은 연습을 중단하는 그 시점부터 퇴보하기 시작한다.” 당신이 프로그램을 짜지않는 하루하루마다 숙련공으로 가는 길은 점점 더 멀어져 간다. – 프로그래머의 길, 멘토에게 묻다.

수련을 게을리하는 순간 우리는 퇴보한다. 그런 수련을 게을리한 나에게 일침을 놓는 디버깅 세션이었다.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중