개발과 연구, 개발자와 연구자

어린 시절 나는 찰흙을 가지고 무언가 만드느라 시간이 가는줄도 몰랐었다. 지금 생각하면 웃음이 나오는 일이지만, 신문과 TV에 나오는 각종 신기한 물건을 찰흙으로 만들어 나만의 세상을 만들고 스스로 조물주인양 흐뭇했었던 모양이다. 대학시절 전공했던 전자공학 대신 컴퓨터 관련 수업에 더 빠져들었던 것은 그때의 아련한 추억이 떠올라서였을까. 늘 물리법칙에 구속을 받는 전자공학과는 달리 컴퓨터는 프로그래머가 어떤 법칙에도 구속받지않고 마음껏 창조할 수 있는 자유를 부여하니 말이다. 

병역특례 근무를 했던 회사에서도 나는 참 즐거웠었다. 낮에는 통신회사의 복잡한 요금계산 로직을 구현하고 이를 실시간으로 처리하는 업무를 맡았지만, 밤에는 내 자신의 모든 정보를 내게 맞는 방식으로 관리해주는 프로그램을 만들었다. 처음에는 달력으로 시작했던 것이 연락처, 할일, 지식 등등이 멋붙고 나중에는 기록된 정보에 대한 통계를 멋진 차트로 만들어주는 모듈까지 생겼다. 스스로의 삶의 '만족도' 그래프가 (당시에 그런 것도 기록했었다 ;) 올라가는 것을 보면서 뿌듯했던 기억이 아직도 생생하다. 이처럼 자신에게 필요한 무언가를 만들고, 이를 실제로 활용하면서 문제점을 찾아내고, 차츰 개선해가는 과정은 참으로 만족스러운 것이었다. 

회사 생활을 마치고 유학을 시작할 무렵, 나는 드디어 내가 꿈꾸던 일을 한다는 희망에 부풀어 있었다. 혼자서 스스로를 위한 프로그램을 만드는 데서, 많은 사람이 혜택을 받을 수 있는 프로그램 및 기반 기술을 개발할 수 있을 것이라고 믿었다. 그리고 약 3년이 지나 나는 어느덧 실험하고 논문쓰는 대학원 생활에 익숙해졌다. 미국이라는 낯선 환경에도 어느 정도 적응을 했다. 그런데 최근들어 새로운 고민이 생겼다. 검색 관련 연구를 하다보니 알고리즘 및 프로토타입을 구현할 일이 자주 있는데, 예전만큼 프로그래밍이 잘 되지도 않고 개발에 대한 흥미도 많이 잃은 것이다. 

최근에 하는 고민입니다. 오늘은 이런 문제의식을 토대로 '개발(programming)'과 '연구'라는 활동의 관계를 생각해보고자 합니다. CS연구자에게 개발은 어떤 의미일까요? 개발과 연구를 병행하는 것은 가능할까요? 이를 효과적으로 하기 위해서는 어떻게 해야 하나요? 

왜 개발과 연구를 병행하는 것이 어려운가?
얼핏 생각하기에도 개발과 연구는 비슷한 점이 많습니다. 우선은 둘다 본질적으로 주어진 문제를 해결하는 과정입니다. 개발자는 프로그램의 설계와 구현을 통해서, 연구자는 가설과 검증을 통해서 문제를 풀어냅니다. 또한 끊임없이 뭔가를 쓰고, 결과를 확인하고, 고친다는 점에서도 유사합니다. 이처럼 본질적으로 유사한 활동이니 쉽게 병행할 수 있을까요? 3년간의 개발자 생활과 3년간의 대학원 생활을 통해 얻은 결론은 '생각만큼 쉽지는 않다'는 것입니다. 왜 그럴까요?

저는 두가지 활동이 각각 완전한 집중을 요하기 때문이라고 생각합니다. 폴 그라함은 좋은 개발자라면 머리속에 프로그램의 코드를 완전히 넣고 마음껏 조작할 수 있어야 한다고 말했습니다. 또한 학자들은 세상의 흐름을 밎고 자신의 문제에 오롯이 몰두하는 것이 보통입니다. 여기서 중요한 단어는 '완전한' 인데, 창조적 잠재력을 최대한 끌어내는데 있어 90%의 집중, 80%의 집중은 별 쓸모가 없기 때문입니다. 따라서 두가지를 모두 열심히 한다는 것은 서로 다른 두가지 방향으로 동시에 날려는 것과 같습니다.

또다른 측면은 연구와 개발이 내용상으로는 전혀 다른 영역의 활동이며 각각을 위해 상당한 양의 정신적 컨텍스트가 필요하다는 점입니다. 개발자가 효과적으로 일하기 위해서는 프로그램의 설계 및 구현에 관련된 세부사항, 실행환경, API, 기타 등등 엄청난 양의 배경지식이 머리속에 담겨야 하며, 연구자의 경우에도 기존 학설 및 자신의 가설, 실험 방식과 결과 등을 항상 기억해야 하기 때문입니다.  위에서 언급한 '완전한 집중'과 이점을 연결지어 생각해보면 개발(연구)을 위해 단련된 두뇌가 연구(개발)에 적응하는 데에는 상당한 시간과 노력이 필요하다는 점을 알 수 있습니다. 

마지막으로 개발과 연구 활동이 추구하는 목적 자체의 차이에서 기인하는 어려움도 있습니다. 보통의 개발은 그 결과물인 소프트웨어 자체가 목적이지만, 연구를 위한 개발에서 소프트웨어는 가설 검증을 위한 수단에 불과하기 때문입니다. 따라서 대부분의 연구 프로젝트에서 개발을 위한 시간과 노력은 그다지 높게 평가받지 못합니다. 연구를 하면서 개발에 대한 흥미가 떨어진 것은 연구자에게 개발이 갖는 우선순위가 낮기 때문인지도 모르겠습니다.

개발과 연구를 어떻게 병행해야 하는가?
이처럼 개발과 연구를 병행하는 것이 쉽지 않으니 어느 한가지에만 집중할 수 있다면 좋겠지만,  CS연구자에게 있어서 (계산이론 등의 순수 이론 분야를 제외하고는) 개발 능력은 상당히 중요한데, 연구의 생산성과 품질이 상당 부분 자신이 작성한 코드의 질에 영향을 받기 때문입니다. 머신러닝 등의 알고리즘 연구자라도 실험에 쓸 수 있을 정도의 성능과 정확도를 가진 프로그램을 작성해야 하며, 실제 사용자를 대상으로 실험을 해야 하는 검색이나 HCI등의 분야에서는 오랜 기간 사용가능한 견고한 프로그램을 만들어야 한다는 조건까지 붙습니다.

이처럼 피할 수 없는 개발, 어떻게 해야 연구와 병행할 수 있을까요. 가장 먼저 자신이 풀타임 개발자가 아니라는 사실을 인식해야 할 것입니다. 연구자의 본업은 연구이기에, 개발자로서는 파트타임입니다. 주어진 시간과 에너지를 온전히 개발에 투자할 수 있는 상황이 아니라면 머리에 항상 자신의 프로그램을 넣어둘 수 있는 사치는 허용되지 않으며, 프로젝트에 관한 사항을 모두 잊은 상태에서도 신속하게 다시 개발에 착수할 수 있어야 할 것입니다.

이런 이유에서 최근에 다시 깨닫고 있는 것이 문서화와 테스트의 중요성입니다. 잘 쓰인 문서를 읽고 테스트를 돌려보면 자신의 코드가 어떤 기능을 하는지 알고, 해당 기능의 동작을 확인할 수 있기 때문입니다. 문서가 없어 개발에 다시 착수할 때마다 소스코드를 다 훑어야 한다면, 그리고 테스트가 없어 코드를 수정하고도 제대로 동작하는지 확인할 길이 없다면 생산성이 떨어질 것은 불을 보듯 뻔한 일입니다. 물론 가능하면 애자일(agile)한 언어를 사용하고, 잘 모듈화된 코드를 작성하는 것은 기본입니다. (좀더 구체적인 개발 툴 및 방법론은 따로 포스팅하겠습니다.)

이외에도 건강한 코드 유지를 위해 필수적이라고 생각하는 것이 코드 리뷰(code review)입니다. 즉, 정기적으로 자신이 짠 코드를 훑어보고 문제점을 찾아내고, 테스트 및 문서를 추가로 작성하는 등의 유지보수 활동을 (주로 한가할 때) 해야 한다는 겁니다. 평소에 기능을 구현하거나 문제를 수정할 때에는 보통 시간이 부족하기 때문에 일단 돌아가는 코드를 만들고 끝내는 경우가 많은데, 이렇게 코드 리뷰을 통해서 전체 설계에 어긋나는 부분을 찾아서 개선하고 코드를 항상 최상의 상태로 유지할 수 있습니다. (기업의 코드리뷰 프로세스에 대해서는 고감자님의 글을 참고하세요.)

이런 준비를 하더라도 역시 머리가 개발 모드에서 연구 모드로 넘어가는 것은 쉬운 일이 아닙니다. 저같은 경우에는 개발에 착수한 후에 제대로 생산성을 내기까지 최소 이틀 정도가 걸리는 것 같습니다. 따라서 일정 조정을 통해 개발이 필요한 일을 한번에 모아서 처리하려고 노력하고 있습니다. 하루의 특정 시간에 특정 활동을 한다는 규칙을 세우는 것도 두뇌가 준비되는 데 도움이 됩니다. 저같은 경우에는 오전에 연구 관련된 활동을, 오후에는 개발을, 저녁에는 블로깅 등 기타 활동을 하기로 정하였습니다.

마치며
최근 개발 프로젝트가 문제에 봉착했을 때,  '개발을 전혀 하지 않고 살 수 있을까' 하고 생각해 보았습니다만 역시 불가능이라는 결론에 도달했습니다. 물론 회사에서나 학교에서나 나이가 들수록 실제로 코딩을 하는 빈도는 줄어드는 게 보통이지만, 스스로 개발을 하지 않더라도 관리자로서 개발 프로젝트에 관한 중요한 의사결정을 하거나 문제를 해결해야 하는 더 큰 책임이 주어질 것이기 때문입니다. 

하지만 개발자로서의 '감'을 잃은 관리자가 이런 상황을 효과적으로 대처할 수 있으리라고 상상하기는 매우 힘듭니다.  어쩌면 우리나라 소프트웨어 산업의 정체에는 개발에 대해 무지한 관리자들의 책임도 있지 않을까요? 아직도 제게는 쉽지 않지만, 위 사항을 지키기로 노력하면서부터 개발과 연구를 병행하는 일이 많이 쉬워진 느낌입니다. 어렸을 때 찰흙놀이를 하면서 느꼈던 희열, 처음 짠 프로그램을 실행시켰을때의 흥분을 머리가 희끗해질때 까지 간직하고 싶습니다.