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

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

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


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

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

 

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


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

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


잘 나가는 업계 1위의 선도 업체들은 항상 자신과 같은 영역에 존재하는 2위의 업체에게 몰매를 맞고 점유율을
내주는 경우보다는 새로운 개념으로 무장한 신규업체에게 내 주는 경우가 많습니다. 왜 그럴까요? 항상 많은
대처를 하고 있으리라고 생각되는 1위 업체가 말입니다.

실상은 게임 이론 처럼 상대의 반응에 대해서 즉각적으로 대응하지 못하는 것이 분명하며, 대부분의 경우에는
'무시'를 한다는 것입니다. 그렇기에 새로운 업체의 등장이 이리도 화려한 것처럼 보이지만 실은 당연하다는
것입니다. 이런 예는 피자 시장 - 배달 피자로 새로운 입지를 굳힌 도미노 피자나 , 유기농 재료를 사용하는
파파존스 피자 - 뿐만 아니라 미국 맥주시장 - 버드 와이저 , 밀러, 하이네켄 등으로 일컬어지는 흔히 전쟁이라
표현되는 시장 - 에서 좋은 사례들이 나옵니다.

자 그러면 이미 확고한 1위가 잡힌 시장에 들어갈때도 이러한 것들을 고려하는 것이 좋겠습니다. 다음과 같은
질문을 던져서 한개라도 대답이 '아니요' 가 나온다면 경쟁사는 대응을 할 가능성이 없다는 것이겠지요.

① 경쟁사가 당신 회사의 행보를 인지할 수 있는가?
② 당신 회사의 행보가 경쟁사에 위협적인가?
③ 경쟁사가 당신 회사의 행보에 대응하는 것이 최선책인가?
④ 경쟁사가 조직의 타성을 극복할 수 있는가?

재밌는 질문이겠지요. 이런 질문에 비쳐 보면 이미 형성된 시장에 뛰어드는 업체라고 가정하면 기존의 시장
강자입장에서는 대응을 할래야 할 수가 없겠지요. 그래서 신규 업체에 많은 시장을 잠식당하는 것이 현실인
건가 봅니다.

+ Recent posts