티스토리 뷰

<해당 포스트에서 다루고 있는 책인 Effective Debugging은 한빛 미디어로부터 지원을 받아, 이를 바탕으로 리뷰를 썼음을 알려드립니다>

 어느덧 회사에서 개발자로 일한지 2년째가 되어간다. 아마 다른 포스트에서 소개했는지는 모르겠지만, 회사에서 하는 일은 통신 관련 소프트웨어, 그중에서도 특정 플랫폼에 올라갈 드라이버나 wrapper를 개발하는 업무를 한다. 물론 상황에 따라서는 개발 환경 구성 및 공유의 역할을 하기도 하지만 main job은 임베디드 소프트웨어를 개발하는 일이다.

 회사에서 하는 일중에 개인적으로 느끼는 어려운 일을 꼽아보면 여러개가 있겠지만, 그 중에서도 디버깅이 차지하는 비중에 가장 크지 않을까 싶다. 아무래도 임베디드 소프트웨어라면 그 하드웨어에 맞는 문서를 분석하고 그에 맞게 개발해야 되는데, 말 그대로 디버깅이 필요하다는 말은 십중팔구 내가 해당 하드웨어의 스펙을 잘못 이해하고 개발했을 가능성이 크기 때문이다. 그말은 즉, 다시 문서를 읽고 문제의 원인이 무엇인지, 또 그 문제를 해결할 수 있는 솔루션을 찾아야 하는 번거로움이 필요하다는 것이다. 일정에 치이고 있는 상태에서 디버깅을 위해 시간을 내기란 참 어려운 일이다. 그래서 디버깅 방법론에 대해서 항상 고민하고, 어떻게 하면 빠르고 쉽게 원인 분석과 해결 방법을 얻을 수 있는지 관심을 가진다. 이번 포스트에서 다룰 책이 바로 이 디버깅을 어떻게 하면 효율적으로 할 수 있는지에 대한 방법론을 제시한다.

 사실 이 책의 구성은 지금까지 내가 읽은 여타 책의 진행방식과 확연히 달랐다. 이 책은 크게 디버깅에 대한 66가지 방법론을 쭉 서술해놓은 책인데, 글을 읽다보면 좀 당황스러운 부분들이 종종 있었다. 가령

 위의 사진과 같이 아이템 x번 참조와 같이 어떤 장으로 되돌아가야 해당 내용을 살펴볼 수 있는 형식으로 전체 맥락이 진행된다. 마치 프로그래밍으로 비유를 하자면 스파게티 코드? 글의 흐름이 딱 순차적으로 흘러가는게 아니라 몇 장 건너 어디를 참조하라는 식으로 되어 있어 읽은 느낌이 들지 않는 경우가 종종 있었다. 또한 글의 내용이 특정 언어에 한정되어서 언급된게 아닌지라 해당 언어에 익숙하지 않은 사람이라면, 읽기가 매우 힘들지 않을까 하는 생각이 들었다. 예를 들어 한창 C code로 언급되다가도 갑자기 shell script가 나오는가 하면, 어떤 부분에서는 Java로 설명되어 있는 부분이 있어, 해당언어가 익숙하지 않는 독자의 입장에서는 관심을 잃고 그냥 넘겨버릴 수 있을 것 같았다. 물론 해당 내용에서 저자가 말하고자 하는 핵심만 파악한다면 언급된 언어가 무엇이던간에 상관없을 듯한데, 이런 방식의 책을 처음 읽는 독자라면 금방 흥미를 잃을 수도 있을 여지가 있다.

 사실 이 책을 이해하는 방법은 글의 서두에 잘 표현이 되어 있다.

이 책은 전형적으로 방법론을 쭉 나열한 책이기 때문에 물론 처음부터 읽고, 이해하는 방법이 가장 좋겠지만 그게 아니라면 필요한 파트를 먼저 읽고 거기에서부터 파생되어 읽는게 좋다고 언급되어 있다. 책에서 주요하게 언급되고 있는 파트는 크게 전략기법/기술도구/디버깅 요령 으로 나누고 있는데, 가령 멀티쓰레드 환경에서 contention 에 대한 내용을 찾고 싶으면 책의 맨 뒷절에 소개되어 있는 "멀티스레드 코드 디버깅하기" 라는 챕터를 읽으면서 내용을 숙지하면 된다. 굳이 앞 챕터에 있는 내용에 신경을 써가며 볼 필요가 없다는 것이다. 

 여러모로 초급 개발자가 뭔가 개발 디버깅에 대해서 숙지하기 위해 읽을 책으로 추천하기엔 조금 불편한 책이다. 앞에서 언급한 내용도 그럴 뿐더러 이를 실습할 수 있는 예시 언어/환경이 제각각이라, 해당 환경에 대해서 익숙하지 않는 사람이라면 쉽게 건드릴 수 없는 내용들이 책 곳곳에 숨어 있다. 예를 들어 네트워크에서 발생할 수 있는 문제에 대해서 디버깅을 해보는 예제를 따라해보려 해도, "아 어떻게 해당 환경을 구성하지..." 하는 고민만 남기고 시도도 못해봤다. 그런 예제 진행과 관련한 부분은 이 책에서 설명이 부족하다는 느낌을 많이 받았다.

 단, 이책에서 나온 용어를 이해하고 있는 수준이고, 뭔가 디버깅에 대한 경험이 어느정도 쌓인 상태에서 비기를 얻고 싶다 하는 중급 개발자 이상이라면 이 책은 더할 나위없이 디버깅 실력을 늘릴 수 있는 좋은 책이 될거란 생각을 해본다. 어떻게 보면 실력이 는다기 보다는 이 책의 제목에서 언급하는 효율적인 디버깅을 적용할 수 있는 범위를 확장시킬 수 있는 좋은 기회가 될 수도 있다. 보다보면 정말 많은 언어와 방법(책의 장수가 생각보다 많지 않아 여기에 과연 적합한 내용이 담겼을까 하는 고민도 들긴 했지만)들이 소개되어 있다. Python이나 Java같은 High level language부터 Assembly 같은 Low level Language도 다루고 하드웨어 관점이 강한 Multicore나 Cache 관련 문제 발생시 디버깅 방법에 대해서도 언급되고 있다.

 마지막으로 책을 다 읽으면서 딱 책의 제목을 곱씹어보았다. 다시 읽어보기도 했지만, 이 책은 "디버깅이 무엇이다" 라는 것을 설명하는 책은 전혀 아니고, "디버깅을 효율적으로/광범위하게 쓰기 위해서는 무엇을 해야 한다" 라는 것을 언급하고 한 책이라는 느낌이 든다. 아마 이 책을 고려하는 독자라면 이 부분을 고려하고 선택하면 좋을 거 같다.


 참고로 저자의 github repo에 가면 해당 책에 대한 예제 소스가 올라와 있다. 책 내용이 궁금한 사람이라면 예제라도 살펴보면서 저자가 말하고 했던 요지에 대해서 이해할 필요가 있겠다.

댓글