공룡호가 사는 세상 이야기

출처 : http://xper.org/wiki/xp/_b4_eb_b9_ae
ExtremeProgramming을 구성하는 실무 훈련 중의 하나로 짝 프로그래밍(PairProgramming)이 있다. 짝 프로그래밍의 경우 참여자 모두가 서로의 지식을 공유할 수 있다는 장점을 지니고 있으며 프로그래머 상호간의 단점을 보완하고 장점을 살릴 수 있으며 서로의 개성과 특성을 배울 수 있는 기회를 제공한다는 점에서 단순한 코딩 작업 이상의 효과를 얻을 수 있다. 필자는 7년 전 C 프로그래밍을 사용하여 프로그램을 개발한 경험을 바탕으로 그리고 현재 진행되고 있는 짝 프로그래밍을 바탕으로 얻은 경험을 정리하여 기술하고자 한다.


혼자서 프로그래밍을 작성할 경우 지루함을 느끼게 되기도 한다. 그리고 혼자서 프로그래밍을 하게 되면 자신이 작성하는 코드에 대한 책임과 의무가 동반하게 된다. 이와 같이 개인적인 프로그래밍의 단점을 극복하기 위해서 협력 프로그래밍(Cooperating Programming) 개념을 도입한 것이 바로 짝 프로그래밍이다. 두 사람이 함께 번갈아가면서 코드를 작성함으로써 지루함을 덜게 하고 책임과 의무를 어느정도 균등하게 분할할 수도 있으며 동시에 서로의 코딩 기법과 프로그래밍 지식을 배울 수 있다. 그리고 무엇보다도 협력이라는 요소가 도입됨으로써 프로그래밍 자체의 생산성과 품질성 그리고 만족성까지 증장한다. 이것은 바로 Kent Beck이 그의 서적에서 이야기한 바이다.


어떤 문제가 생겼을 때 이를 해결하기 위해서 혼자 고군분투하기보다는 다른 사람의 도움을 얻어 함께 문제를 궁리하고 해결하도록 하는 것이 바람직하다. 학교에서는 이것을 컨닝이라고 하여 못하게 하였으나 프로젝트 수행을 거시적인 차원에서 바라보았을 경우, 실제로 팀원들이 필요한 것은 모두 협심단결하여 문제를 해결해 내는 것이다. 누가 문제를 해결하느냐도 의미있겠지만 실제로 가장 중요한 것은 과연 우리가 문제를 해결해 낼 수 있는가라는 프로젝트 성공의 여부다. 필자의 경험상 프로젝트의 성패를 가름짓는 것은 Kent Beck이 그의 서적에서 말한 것 처럼 프로젝트 참여자들간의 원활한 의사소통(Communication)와 피드백(FeedBack?)을 통한 효과적인 협력모델을 만들어가는 것이다. ExtremeProgramming은 바로 협력모델을 중시하는 프로젝트 수행론이다. 그러므로 TestFirstProgramming과 함께 ExtremeProgramming의 양대 축을 이루는 짝 프로그래밍이 당연히 협력모델을 바탕으로 한다 것은 자연스러운 일이라 할 수 있다.


7년전 C 프로그래밍을 위해 직원과 둘이서 짝 프로그래밍을 하였을 때 필자는 프로그래밍을 인솔해 가면서 어떤 자신감과 긍지를 많이 느꼈다. 이것은 필자가 잘났다고 하는 자만심이 아니라, 무엇인가 필자가 가지고 있는 지식을 조금이라도 함께 일하는 직원과 나눌 수 있다는 보람 같은 거였다. 그리고 함께 짝 프로그래밍을 했던 팀원도 필자가 코딩하는 것을 옆에서 지켜보면서 자신의 생각을 필자에게 전해주기도 하고 필자가 코딩하는 방법에 대해서 묻기도 하였다. 필자는 그때 그때 대화를 통해서 함께 일하는 팀원을 코딩에 참여시켰다. 가끔씩 팀원이 무의미하게 던진 듯 한 이야기가 프로그램의 로직을 크게 변화시키는 중요한 요소로 작용하기도 하였고 팀원이 필자에게 묻는 의문들에 대한 답변 속에서 필자가 의식하지 못했던 코딩 방법과 체계를 확실히 정립하는데 도움이 되었다. 이때 필자가 느낀 짝 프로그래밍의 최대 장점은 항상 검증(Verification)에 근거한 프로그래밍을 하게 된다는 것이었다. 필자의 실수나 잘못된 로직 오류를 팀원이 정확하지는 않지만 팀원이 이야기하다 보면 그것이 옳든 그렇지 않든 다시 한번 로직을 점검하게 되기 때문에 그러는 과정에서 작성하는 코드에 대한 무결성 검증을 하게 되었다. 한편 여기서 검증이라는 것은 어떤 면에서 유지보수(Maintenance)를 위한 예비검증이라 할 수 있다. 필자가 함께 짝 프로그래밍을 했던 팀원보다 많은 것을 알고 있었지만 필자가 작성한 코드를 다른 이가 전수 받아 유지보수 해야 할 경우, 코드를 너무 난해하게 작성한다면 유지보수가 힘들 것이기 때문이다. 옆에 있던 팀원이 필자가 작성하는 코드를 지켜보면서 너무 이해하기 어렵거나 복잡하게 보이는 부분은 지적하면서 자신에게 설명해 달라고 요구한다. 필자는 한번 정도 사고를 가다듬어서 팀원에게 코드를 설명해 주고 필자가 스스로 생각하기에도 너무 어렵다고 생각하면 그 코드를 쉬운 방향으로 재조정하게 된다. 이것은 언뜻 생각하기에는 매우 생산성을 저하시키는 부담을 야기시킬 수 있는데, 그러나 여기에는 중요한 이득이 있다는 점을 간과해서는 안 된다. 그것은 바로 자신의 프로그래밍 로직 구조를 점검하는 동안 자신의 사고체계와 프로그래밍 작성 방법에 대해 정련 되고 세련된 방식을 찾아낼 수 있기 때문이다. 한번 얻어지고 단순화된 프로그래밍 기법은 자신에게 있어 앞으로 영구적인 지식이 될 수 있다. Extreme Programming의 단순성(Simplity)과 지식 공유(Knowledge Sharing)를 역설하고 있다는 점에서 이것은 매우 큰 의미를 갖는다. 사실, 이것은 단순한 지식공유를 초월한 새로운 지식발견 내지 지식창조라고 할 수 있다. picnic가 프로그래밍을 작성하면서 느낀 것은 서로 대화를 통해 프로그래밍을 해 나가다보면 지식을 공유하는 과정에서 모르던 새로운 지식을 발견하기도 하고 새로운 지식을 만들어내기도 한다. 극단적인 경우로, 어떤 컨설턴트나 전문가로부터 상담을 받는 것도 그와의 대화를 통한 짝 프로그래밍이라 할 수 있지 않을까 생각해 본다. 물론, 간접적이고 위력이 약하지만 말이다.


다음은 PairProgramming의 수준별 조합방식으로는 초보자(함께 했던 팀원) - 초급전문가 (개발경력5~6년, 필자를 말함) 방식을 따랐고 PairProgramming의 주도자별 조합방식으로는 초급전문가(필자) 참관 - 초보자 주도(함께 했던 팀원) 방식을 따랐다. 다음의 글은 이 사례에 대한 picnic의 PairProgramming 경험이다. 


KentBeck은 그의 저서에서 짝 프로그래밍은 단순한 교육이나 가정교사의 역할이 아니다라고 말했다. 물론 프로젝트 수행이라는 커다란 시각에서 바라본다면 분명 짝 프로그래밍의 최대 요소는 만족감과 품질향상이라고 말해야 할 것이다. 그러나, 자신이 알고 있는 지식을 짝에게 전수해 줌으로써 짝을 통해서 일을 성취할 수 있는 간접적인 성과를 무시할 수 없다. 필자는 요즘 이러한 형태의 짝 프로그래밍을 하고 있다. 즉, 일방적으로 가르쳐 주면서 (필자가 잘난 것은 별로 없지만) 필자의 코딩 기술을 전수시키고 있다. 상당한 피로와 힘이 드는 것은 사실이지만 그의 사고체계가 필자와 닮아간다는 점을 파악하고서는 그와의 친분성이 증대됨을 느낄 수 있었다. 즉, 내가 생각하고 의식하고 인식하는 일체의 것에 대해 짝도 비슷하게 생각하고 의식하고 인식하는 것을 느낄 수 있었다. 이것은 ExtremeProgramming의 기저를 이루고 있는 협력모델에 있어서 가장 중요한 공통의식의 확대라고 말하고 싶다. Kent Beck 등이 알고있었는지 모르고 있었는지 모르지만 필자는 ExtremeProgramming의 짝 프로그래밍을 통하여 함께 작업하는 짝과의 호흡과 마음을 일치시키는 것이 중요하다는 점을 경험으로 인식하게 되었다. 물론 호흡과 마음이 일치한다고 해서 둘 다 동일한 사고를 하게 되어 코드의 문제점을 발견해 내지 못하는 것은 아니다. 코드를 바라보는 여러 가지 시각이 존재하게 되는데(으례 프로그램 로직이 다 방향 제어 흐름과 다 방향 데이터 흐름을 지니고 있기 때문) 필자가 바라보는 관점 이외에 짝이 코드를 바라보는 관점이 다를 수 있어 문제점을 발견하고 그것을 지적할 수 있기 때문이다.


좋은 지식을 최대한 극대화시키자. 양호한 방식을 최대한 이끌어내어 활용하도록 하자. 필자는 아마 이것이 Extreme Programming이 주창하는 정신의 근본적 요체라고 생각한다. Kent Beck이 자신의 서적에서 좋은 것은 극단에 이를 때까지 최대한 활용하자라고 말하였다. 좋은 지식은 올바른 통찰력에서 나온다. 통찰력은 안식 또는 식견이라고 하며 사물이나 현상의 배후에 있는 심오한 이치와 근원적 원리를 찾아내는데 있다. 짝 프로그래밍을 통해서 필자가 지닌 통찰력을 아낌없이 짝에게 전수해 주고 또한 짝이 지닌 통찰력을 필자가 전수 받는 다면 짝 프로그래밍은 매우 좋은 효과를 낼 수 있다. 지식의 전수 과정은 말로서 보다는 직접 코딩을 하고 훈수를 두고 짝이 프로그래밍을 해 나가는 과정을 지켜봄으로써 이루어진다. 프로그래머에게 있어서 코딩 자체만큼 완전한 지식은 없을 것이다. 필자와 짝 모두는 코드를 대면하면서 코드가 작성되고 수정되는 과정을 통해서 이에 대해 대화를 나눈다. 코딩을 하는 방향이 제대로 되었는가 빠진 부분은 없는가 비논리적인 오류를 갖고 있는 것은 아닌가 등 여러 가지 의문을 끊임없이 되풀이 하면서 코드를 만들어가고 다듬어간다.


한편, 주관과 객관을 조화시킬 수 있다는 점에서 짝 프로그래밍은 가치가 있다. 자신 혼자서 생각하고 프로그래밍을 작성한 후 "이 프로그램은 정상적으로 오류없이 작동하는 완전한 프로그램이다"라고 말한다고 하여 그 프로그램의 무결성이 보장되어지는 것은 아니다. 또 하나의 시각으로 바라본다면 짝 프로그래밍에서 짝은 옆에서 자신이 작성한 프로그램의 테스트 요원이 된다. 자신의 주관적 이해가 문제(Problem)를 해소시키는데 적합했는가를 판가름하는 판별사의 역할을 하는 제일 우선적인 사람이 짝이다. 짝은 보다 객관적인 입장에서 다른 짝이 작성한 프로그램에 대해 검증을 시도해야 한다. 이럴 때 짝은 냉정해 보일 수도 있다. 우리는 이를 둘이서 작업하기 때문에 나타나는 하나의 현상으로 인식해야 한다. 자신이 작성한 코드를 자신이 직접 테스트하는 것이 가능하지만 짝을 통해 검사를 받음으로서 보다 더 자신의 코드에 대한 적합성을 객관화할 수 있다. 프로그램의 완성도는 얼마나 많은 객관화를 얻어내는가에 어느 정도 비례한다고 생각한다. 많은 사람들이 테스트를 하고 운영한 프로그램일 수록 프로그램의 완성도를 높이는데 도움이 된다고 할 수 있다. 혼자서 개인적으로 프로그래밍하는 것보다 짝을 두어 함께 프로그래밍 하면 프로그램의 완성도를 더 높일 수 있는 기회를 가지게 된다.


자신이 할 수 있는 프로그래밍 능력을 남과 공유하라. 아마 이러한 이야기를 지원해주는 ExtremeProgramming의 하나가 짝 프로그래밍인 것 같다. 필자는 현재 어느 정도 기초만 알고 있는 분과 함께 짝 프로그래밍을 하고 있다. 프로그래밍은 단순히 지식을 공유하고 지식을 전수하는데 있는 것이 아니다. 필자는 최근 짝 프로그래밍을 통해서 사람과 사람과의 정신적 교류와 믿음(또는 신뢰감)이 중요하다는 것을 배웠다. 자신의 프로그래밍 능력을 프로그램 코딩이라는 하나의 과정을 통해서 짝과 공유하는 것이 짝 프로그래밍이라고 생각한다. 이 분과 짝 프로그래밍을 하면서 그 점을 많이 느꼈다.


먼저, 필자는 어느 정도 프로그래밍에 실력이 있는 중급 프로그래머이고 다른 한 분은 프로그래밍 언어과 개발툴에 대한 기초적인 내용만을 숙지하고 있는 초보 프로그래머이다. 따라서, 필자가 이 분으로부터 많은 것을 얻지는 못한다. 물론 때때로 요긴한 조언을 얻기는 한다. 이와 같은 상황에서 필자는 다른 분이 프로그래밍을 직접 하도록 하고 필자는 옆에서 지켜본다. 그리고 그 분이 프로그래밍을 하다가 막히면 필자가 해답을 제시해 준다. 물론 이 분이 어느 정도 고민할 수 있도록 약간의 시간을 제공한다. 그리고 이 분이 이해하지 못했다고 할 때 즉시 답을 제시한다. 따라서, 시간 지연 문제에 큰 부담을 겪지는 않는다. 물론 필자가 직접 코딩하는 것보다는 다소 느릴 수 있다. 하지만 이 분을 필자의 수준에 맞추어 스킬업을 시킬 수 있다는 점에서 장점이 그 단점을 보상해 준다.


그런데, 이 짝 프로그래밍에는 약간의 문제가 있다. 그것은 이 분이 마치 자신이 프로그램을 다 완성했다는 착각에 사로잡히기도 하고 때로는 필자에게 보다 어려운 의문을 제기하면서 당혹스럽게 한다는 점이다. 이 어려운 문제는 구현하기가 어려운 내용도 있고 상당히 오랜 연구가 있어야 될 문제이기도 하다. 따라서, 짝 프로그래밍은 잘못하면 초보자를 너무 거만하게 키우게 되는 문제가 발생할 수 있다. 그리고 조금 실력 있는 사람을 실험해 보려는 자세도 취하곤 한다. 이런 점을 생각한다면 짝 프로그래밍은 조금이라도 실력 있는 사람에게 더욱 힘이 들게 만드는 훈련이라고 할 수 있다. KentBeck은 짝 프로그래밍도 "훈련"(Discipline)이라고 하였다. 그렇다. 짝 프로그래밍은 엄연한 훈련이었다.


초보자가 자신보다 조금이라도 실력이 있는 사람이 있다면 그 사람과 짝 프로그래밍을 함으로써 도움을 얻을 수 있다. 하지만, 조금이라도 실력 있는 사람이 짝 프로그래밍을 하게 되면 어느 정도 자신이 손해를 봄을 감내해야 한다. 아량이 있어야 한다는 거다. 그렇지 않고는 온전한 짝 프로그래밍을 성취할 수 없을 것 같다. 필자가 함께 했던 프로그래머에게 힘들었던 이유는 필자가 가지고 있는 지식을 너무 아까와 한데서 연유했다. 그것이 필자의 짝 프로그래밍에서의 최대 실수 였다. 자신이 조금이라도 지식을 가지고 있을 경우, 그것을 초보 프로그래머와 공유하는 것을 아까와 해서는 안된다.


한편, 겸손하지 않고 내세우기를 좋아하는 프로그래머와 초보 프로그래머가 짝 프로그래밍을 한다면 초보 프로그래머는 남다른 고생을 할지도 모른다. 하지만 그래도 초보 프로그래머는 소프트웨어 기술과 기법들을 익히게 되어 그 고생만큼 얻는 것이 있다. 그러나, 문제는 이렇게 고생하면서 지식을 얻은 초보 프로그래머는 결코 자신을 고생시키면서 가르친 짝 프로그래머에게 고맙게 생각하지 않는다는 것이다. 따라서, 보다 나은 실력을 가진 사람은 항상 초보 프로그래머와 짝 프로그래밍을 할 때 이 점 또한 명심해야 한다.


필자도 처음에는 조금 힘들게 하던 초보 프로그래머가 지금은 그분이 어느 정도 실력이 늘어나니 필자에게 고마운 마음을 갖는 것을 느낄 수 있었다. 필자는 단순히 짝 프로그래밍의 주된 의의가 지식의 전수만이 아니라는 것을 알 수 있었다. 그것은 인간과 인간간의 신뢰와 감사 그리고 상호 인정과 존중이라는 보다 큰 덕목이 자리하고 있다는 것을 느낄 수 있었다.


여하튼, 조금 발전된 프로그래머와 함께 짝 프로그래밍을 할 수 있다면 초보 프로그래머는 어느 선상까지는 도움이 된다. 어느 선상이라는 것은 자신 스스로 생각하고 코딩하고 설계 틀까지 바로잡고 시정하도록 조언할 수 있을 정도가 되는 수준을 말한다. 이렇게 되면 이 초보 프로그래머는 더 이상 초보 프로그래머가 아니고 발전된 프로그래머로 나아가게 되는 것이 된다. 그리고 자신이 짝 프로그래밍을 통해 선임자로부터 배웠던 것을 후임자에게 전수시키기 위해 다시 다른 초보 프로그래머와 짝 프로그래밍을 하게 된다. 이와 같은 짝 프로그래밍이라는 훈련을 통해 소프트웨어 개발 전승이 이루어지게 되며 프로그래머들간의 지식은 교류되고 공유되어 진다. 초보 프로그래머가 그 정도 수준에 이를 때까지는 많이 힘들고 어려움이 있을 수 있다. 자신이 짝 프로그래밍에서 보다 낫은 프로그래머라면 짝이 되는 초보 프로그래머에 대해서 이 점을 항상 염두 해 두고 초보 프로그래머를 대하고 이끌어 줄 수 있는 지혜가 필요하다.


필자가 경험적으로 느끼는 점은 초보 프로그래머가 지나치게 문제에 대해서 도전적이지 않다면(비록 그렇다 할지라도) 자신이 조금이라도 인내하고 양보하면서 이 초보 프로그래머를 교육시켜 짝 프로그래밍을 성공적으로 수행하는 것이 중요하다고 생각한다. 초보 프로그래머가 의문이 너무 많거나 생각이 너무 풍부하면 짝 프로그래밍을 하는데 조금이라도 발전된 프로그래머라면 힘든 점을 많이 느끼게 된다. 물론, 초보 프로그래머의 풍부한 사고와 진취적 도전 정신을 인정하고 자신의 사고도 그에 맞도록 조율하는 것도 중요할 것이다. 하지만 더욱 중요한 것은 초보 프로그래머의 모든 시선과 의식을 프로젝트 수행과 문제의식 형성에 두어야 한다는 점이다. 그렇지 않을 경우 프로젝트는 시간을 먹어가면서 지연되게 될 테니까 말이다.


그리고 초보자와 전문가가 짝 프로그래밍을 할 경우에는 과거 도제살이를 현대화시켜 놓은 거라고 볼 수도 있다. Kent Beck이 짝 프로그래밍은 교육이나 교사의 일이 아니라고 말했지만 교육적인 요소를 무시할 수 없다. 그리고 지식 공유는 서로간의 교육에서 이루어지는 것이기 때문이다. 또한, 자신이 초보 프로그래머보다 월등히 실력이 뛰어나다고 해서 너무 거만해서는 안된다. 위엄과 거만은 별개의 뜻을 지니고 있다. 프로그래밍에 있어서 자신이 배운 노하우는 확률적으로 초보 프로그래머도 감사히 배우는 경향이 있다고 생각한다. 자신이 학문을 할 때 정성을 들여 배웠던 것 처럼, 초보 프로그래머와 짝 프로그래밍을 할 때도 정성을 들여야 할 것이라 생각한다. 자신이 거만해져도 문제고 초보 프로그래머가 건방지게 되도 문제다. 서로의 단점을 극복하도록 노력하는 것이 Extreme Programming에서의 짝 프로그래밍이 우리에게 전해주는 메시지가 아닐까 한다.


지금까지 짝 프로그래밍에 대해서 여러 가지 이야기를 다루었다. 결론적으로 필자가 짝 프로그래밍을 통해서 얻은 경험을 정리하자면 자신의 지식을 아까와 해서는 안되며 함께 하는 짝 프로그래머가 수준이 낮고 대하기 어렵더라도 그를 존중해 주어야 한다는 점이다. 청출어람(靑出於藍)이란 말이 있다. 자신이 가르친 사람이 나중에 자신보다 실력이 더 특출날 수 있다. 물론 그렇지 않을 수도 있다. 여하튼 우리는 인간존중이라는 도덕적 덕목을 바탕에 두고 짝 프로그래밍을 수행해야 할 것이다. 아마, KentBeck 등의 ExtremeProgramming 주창자들도 이 점에 대해 공감하리라 생각한다.