위 그림은 '죠죠의 기묘한 모험'에 나오는 악역인 디오 브란도 입니다. 이 디오는 죠죠라는 만화에서 특이한 위치를 차지하는 악역입니다. 심지어 죠죠가문 3대째에 이르는 악역이기도 합니다. (혈통으로는 4대째이지만) 잔혹하고 무자비하지만 부하들에게는 공포로 또는 위엄으로 군림하고 상당한 힘을 가지고 있는데도 불구하고 힘으로만 밀어 붙이는 타입도 아니고 상당히 간교합니다. 뭐 자세한 건 직접 보시면 되고 '죠죠 3부'에 나오는 디오는 특이한 능력을 가지고 있습니다. 시간을 멈추는 능력을 가지고 있는 스탠드 (더 월드 라고 합니다)를 활용해서 기술을 쓰는데, 주인공 파티가 그 능력을 파악하지 못하고 속수무책으로 당합니다. 그러다 한 파티원이 혹시 시간을 멈추는 것이 아닐까 라는 내용을 주인공한테 전달하고 주인공(쿠죠 죠타로)은 시간을 멈춘다는 능력을 '인식'하는 순간 '더 월드'의 능력은 더 이상 속수 무책의 능력이 아니게 됩니다. (사실 그 연유는 길고도 긴 사연이지만..) 

  길게 사설을 늘어 놓은 이유는 바로 '인식'에 관한 이야기를 하고 싶어서 입니다. 길고 긴 세월동안 프로젝트를 진행하며 수 많은 프로그램을 만들어오면서 만들어야 하는 것이 어떤 것인지 인식하지도 못하고 만들었던 적도 많습니다. 재밌는 것은 그러한 인식없이 만들기 시작하다 보면 만들면서도 뭐를 어떻게 해야 하는지 전혀 감이 안온다는 것입니다. 그렇지만 그런 상태에서 조금 더 이해하기 위해서 노력을 기울이다 보면 어느덧 만들어야 하는 것이 어떠한 원리로 돌아가는 것이고 왜 그런 방식으로 만들어야 하는지 명확하고 '단순'하게 인식될 때가 있습니다. 그런 그 순간이 복잡했던 프로젝트가 단순해지며 오픈소스를 쓰고 있더라도 어떤식으로 응용해야 할지 명확하게 드러나는 순간입니다. 안타깝게도 이러한 '인식'의 순간을 빨리 맞이하는 것은 연차가 짧을 때는 잘 되지 않았습니다. 이런 저런 전산적인 경험을 쌓고 나서야 (그럼에도 불구하고 순식간에 인식을 맛보는 것은 아직까지 가능하지가 않더군요..) 가능해 지더군요. 이러한 인식의 순간이 경험과 상관없이 빠르게 맞이하는 존재들을 세상에서는 천재라고 부르는 것이겠지요. 

  어렵고도 잘 이해가 안되는 프로젝트를 진행하고 있거나, 역시 비슷한 정도로 어려운 오픈소스를 파고 있다면, 아직 인식의 순간이 오지 않았기 때문에 어렵다고 생각하시면 될 것입니다. 그래도 조금씩 힘내서 이거 저거 '단순화' 시키려고 노력하시다 보면 갑자기 전체적인 형태가 파악되고 결국 간단한 구동 원리를 구현하기 위해서 여러가지 살을 붙이다 보니 지금 처럼 복잡하게 됐다는 것을 깨달으시게 될 것입니다. 


-- 오늘도 밤늦게 까지 개발하시는 개발자 여러분 파이팅 -- 
  오픈소스를 만지작 거리다 보면 남의 소스를 볼 일이 무지하게 많습니다. 가장 최근만 해도 이동통신 관련한 소스를 줄기차게 보고 있는데 (지금까지 본것중에서 난이도가 openssl 에 필적합니다.) 이러한 소스는 보통 여러 사람이 몇년동안 작업을 한 것이 대부분 이기 때문에 처음부터 전부 이해하려고 하다보면 들어가는 시간이 엄청 걸립니다. 단기간에 필요한 부분만 꺼내서 이용할 수 있는 신공을 익혀야만 제대로 쓸 수가 있다는 이야깁니다. 이러한 오픈소스 (그 중에서 특히 C 로 만들어진) 들이 어려운 이유가 몇가지가 있습니다. 그중에서 개인적으로 어렵게 만드는 요인이라고 볼 수 있는 것 몇가지만 이야기 해 볼까 합니다. 

  1. 엄청 많은 매크로 
     
     코드를 이해하는 것만큼 이 엄청난 수의 매크로도 이해해야 합니다. 

  2. 핸들러(handler)로 표현되는 다양한 함수 포인터 (Function Pointer)
     
    왜 C 로 C++ 형식처럼 짜는지 대충 이해가 갑니다만 (속도를 위해서겠지요..) static 키워드를 이용해서 C를 마치 OOP 처럼 구현해 놨습니다. 물론 이해하기는 OOP 보다 어렵습니다. (OOP 도 남의 소스는 보기가 쉽지 않지요) 다양한 구조체와 이에 연관된 함수 포인터를 마치 멤버 함수처럼 이용하는 형식으로 구현했기 때문에 추적하기도 쉽지가 않고 어디서 어떻게 불리는 지 파악도 어렵습니다. 


  이 외에도 몇가지는 있겠지만 제가 느끼기에는 이것들이 중요한 요인입니다. 그렇다고 해도 소스를 못 따라갈 정도는 아니지만 일일이 따라가기에는 너무나 방대한 양이기에 제대로 추적하기가 쉽지가 않습니다. 

  그래서 이러한 오픈소스를 분석하거나 자신이 필요한 기능을 추출할 때 쓸만한 팁을 드릴까 합니다. 사실 팁이라고 할만한 것도 아닐 수 있습니다. 일단 '돌아가는 소스를 받아서 구동시켜야 한다' 가 전제가 되어야 하며 이 때 돌아가는 '흐름'을 추적해야 합니다. 너무 난해할 수도 있는데 세부적인 것을 다 파고 들어가는 것이 아니라 필요한 기능이 어떻게 흘러가는지 전체적인 흐름을 파악하고 나면 그 때서야 어디를 어떻게 시작해야 할지 목표를 설정할 수가 있는 것입니다. 흐름을 파악해야 하는 주요 목적은 어디를 어떻게 봐야 하는지 목표를 설정하는 것과 일맥 상통한다고 볼 수 있습니다. 이리 되면 필요한 부분에 Log 를 심는다던지 디버거를 이용한 다던지 하면서 데이터가 어떻게 흐르는지 파악을 하고 자세하게 필요한 부분을 살펴볼 수가 있습니다. 즉 정리하자면 

 

1. 프로그램이 어떻게 구동되는지 흐름을 파악한다. 
2. 세부 프로세스가 어떤식으로 함수가 호출되는지 파악한다. 
3. 함수에서 사용되는 데이타가 어떤식으로 흘러가는지 파악한다. 
4. 그 데이타가 어떤 구조체 (structure, class)에 담겨있는지 파악한다. 


  이런식으로 굵직하게 흐름을 파악하는 식으로 나아가면 단기간에 빠르게 소스를 분석할 수가 있습니다. 어느 정도에 이르신 분들에게는 필요 없는 팁일 수가 있지만, 이제 막 프로그램의 재미를 익혀나가서 다른 고수들의 프로그램을 살펴볼 필요가 있는 분들에게는 도움이 될 것입니다. 

ps. 
 
요즘 블로그에 소홀한 이유는 변명 아닌 변명이겠지만 지금 하고 있는 일이 바쁘고 난이도가 높기 때문입니다. 간만에 청춘으로 돌아간 듯 밤 늦게 까지 모니터를 쳐다보며 지내는 시간이 많아서 입니다. (물론 그렇다고 놀지 않는다는 말은 아니지요 ㅎㅎ)  

+ Recent posts