본문 바로가기

기타

웰빙족 고수 프로그래머의 길(웰빙과 고수로 가는 스터디 모임)

Chapter 6. 웰빙과 고수로 가는 스터디 모임



본장에서는 정신의 집중과 안정 그리고 희열을 가져다주는 “웰빙과 고수로 가는 스터디 모임”에 대해서 설명하고자 합니다. 사실, 본 원고는 마이크로소프트웨어 월간 컴퓨터 잡지에 프로그래머와 세상이라는 범주 하에 기재될 예정이었으나 사정이 여의치 않아서 기재되지 못한 내용입니다. 프로그래머가 세상을 이해하고 적극적으로 세상을 살아가는데 있어 스터디 모임은 많은 도움을 줍니다. 스터디 모임은 명상처럼 정신의 안정성을 얻고 정신적 유희와 희열을 얻도록 도와줍니다. 즉 스터디 모임은 웰빙족 프로그래머에게 필수적인 공간이며 이 공간을 통해서 프로그래머는 생각하는 프로그래머로 도약하게 됩니다. 웰빙족 프로그래머가 되려면 스터디 모임 하나는 기본적으로 해봐야할 것입니다. 그리고 효과적인 스터디 모임은 원활한 인간관계와 지식공유의 초석이라고 할 수 있습니다.  



또한 스터디 모임은 고수로 가는 길에 큰 도움이 됩니다. 고수 프로그래머를 포함하여 거의 모든 고수들은 스터디 모임을 한 번 정도는 한 적이 있을 겁니다. 수행자에게 있어서는 도반이라고 말합니다. 스터디 모임은 내공 향상과 실력 향상에 지대한 도움을 줍니다. 고수 프로그래머들 대부분은 대학의 동아리나 학과 써클(동아리) 그리고 학원의 스터디 모임을 통해서 고수로 성장하였습니다. BIT 컴퓨터 학원에서도 학원생들이 스터디 모임을 통해서 프로젝트를 수행합니다. 주변에 프로그래밍을 잘하고 인격적으로도 훌륭한 사람들을 살펴보면 대부분 스터디 모임을 통해서 공부를 한 사람들입니다. 그만큼 스터디 모임은 고수로 가는 길에 도움이 됩니다. 고수는 혼자만 공부하는 것이 아니라 휴먼 네트워크를 잘 활용하여 협력적인 스터디를 통해 고수로 성장하게 됩니다.



그리고 요즘 인터넷 기술의 발달로 인터넷 커뮤니티(Internet Community)가 인기가 있습니다. 많은 프로그래머들이 각종 커뮤니티에 가입하여 활동하고 있으며 질문과 답변 등, 서로의 지식과 노하우를 공유하고 있습니다. 이러한 커뮤니티도 또한 공동체로서 서로의 배움을 교류하고 지식을 증진시키는데 큰 역할을 하고 있습니다. 자세히 살펴보면 스터디 모임이라는 것도 일종의 소규모 커뮤니티라고 할 수 있습니다. www.objectworld.org 사이트나 www.javastudy.co.kr 그리고 www.devpia.com 등의 사이트는  그 자체로서 커뮤니티를 이루거나 자체 내에 커뮤니티를 갖추고 있는 동시에 자유롭게 스터디 모임 활동을 진행하고 있습니다. 커뮤니티란 사람 사는 곳에서 뜻이 같은 사람들끼리 모여 만든 모임마당이므로 스터디 모임과 어떤 면에서 궤적을 같이 합니다. 스터디 모임이 외부적으로 확대된 것이 커뮤니티라고 보면 좋을 듯 합니다. 물론, 팀웍은 스터디 모임이 회사 내부적으로 이루어진 것이라 할 수 있습니다. 스터디 모임에 대한 자세한 내용은 본론에서 설명합니다.



    1. 효과적인 스터디 모임 써머리

여기서는 먼저, 소프트웨어 개발 업체에서 일어나는 팀웍과 관련하여 스터디 모임을 고찰합니다. 프로그램 개발을 위해서는 팀웍이 원활해야 하며 협력정신이 투철해야 합니다. 이러한 팀웍을 위해서는 대학이나 학원 시절부터 스터디 모임을 통해서 멤버들 간의 단합과 화합을 도모할 줄 알아야 합니다. 본 단원에서는 먼저 팀웍에 대해서 소개하며 그 다음으로 스터디 모임의 필요성에 대해서 설명합니다.



필자의 프로그래머로서의 경험에 비추어 봤을 때 급변하는 소프트웨어 기술의 발전과 이러한 변화에 효과적으로 대응하기 위해서는 첫째 기존 기술지식을 보다 공고히 하는 동시에 기존 기술지식을 새로운 차원과 미래 지향적으로 확장시킬 수 있어야 하며, 둘째 꾸준히 최신기술을 습득해야 하며, 셋째 기존의 기술을 최신기술과 수월하게 접목시켜나갈 수 있어야 합니다. 물론, 모든 프로그래머들이 이 세 가지를 만족시킬 정도로 공부를 많이 한다는 것은 상당히 버거운 일입니다. 그리고 실제로 기존 기술 자체만을 꾸준히 활용하여 경제적 이윤을 추구하는 소프트웨어 개발 기업들이 있으며 또한 자신이 보유한 기술을 약간만 변형시키거나 약간만 업그레이드해서 새로운 제품을 만들어 구매자들이나 고객들의 새로운 요구를 충족시키는 기업들도 있습니다. 물론, 또 다른 기업에서는 새로 태동하는 기술을 잘 활용하여 새로운 시장을 개척하기도 합니다. 일반적으로 기존 기술의 확장, 신기술 채용, 신기술과 기존 기술의 병용 등을 통해서 모든 소프트웨어 제품은 일정 기간이 지나면 새로운 모델과 새로운 버전으로 꾸준히 업그레이드되어 상업화 됩니다.



이러한 소프트웨어 제품들의 중심에는 그 누구 못지않게 땀을 흘리며 고생하는 프로그래머들의 노력이 자리 잡고 있습니다. 그리고 프로그래머들에게 있어서 기술지식은 그들의 소중한 재산이라 하지 않을 수 없습니다. 프로그래머라면 자신의 환경과 상황에 맞추어 신속히 기술지식을 습득해 나가야 합니다. 즉, 만약 자신이 소속한 기업에서 기존 기술지식을 보다 공고히 하고 확장시켜 나가는데 주력한다면 이에 맞추어 공부를 해야 하고, 만약 자신이 몸담고 있는 기업에서 최신기술을 습득할 것을 요구하면  이에 적응해서 공부해야 하며, 또한 자신이 일하고 있는 기업에서 기존에 알고 있는 지식과 기술을 공고히 하는 동시에 최신기술을 함께 활용해야 한다고 하면 이에 적합하게 더 많은 공부를 해야 할 것입니다. 프로그래머 혼자서 이러한 기존 기술지식의 확고한 정립과 확장 그리고 최신 기술지식의 습득 및 최신기술과 기존 기술의 병용 등을 모두 이루는 것은 사실 매우 어렵습니다. 물론, 프로그래머가 한 가지 기술지식을 공고히 하는 것도 혼자서 하는 것보다 함께 연구하고 협력할 때 그 효과가 증대됩니다. 그래서 프로그래머는 혼자서 만이 아니라 여러 명이서 함께 공부하고 일하는 법을 배워야 합니다. 기업에서의 직접 일을 배울 수 있는 공부란 바로 팀웍에서 출발합니다. 또한, 일반적으로 기업에서는 혼자서 제품을 개발하는 것이 아니라 함께 협력해서 제품을 개발하게 되므로 공동으로 연구하고 공부하며 일하는 팀웍(Team Work)이 필요합니다.



팀웍은 기업이나 조직체에서 프로젝트를 공동으로 수행할 때 매우 중요한 사안이라 할 수 있습니다. 프로젝트가 성공적으로 완수되기 위해서는 공고하고 협력적인 팀웍이 형성되어야 합니다. 이러한 팀웍은 구성원들의 기술지식을 원활하게 공유시키고 소통시킬 수 있어야 하며, 새로운 기술지식을 창출해 낼 수 있어야 하며, 또한 개발자, 관리자 그리고 고객들 간의 신뢰와 믿음을 이루어낼 수 있어야 합니다. 팀웍은 단순히 기술지식을 얻는데 있는 것이 아니라 다양한 인격체들이 구성된 조직체를 통해 인간관계라는 또 하나의 삶의 지혜를 얻는데 있다고 할 수 있습니다. 그리고 팀웍으로 인해 서로 친밀하고 협력하는 회사 분위기를 형성하게 되면 자연스럽게 서로 기술지식을 부담 없이 나누는데 도움이 됩니다.



최근 프로그래머들에게 있어서 소프트웨어 개발 이슈는 아마 팀웍(Team Work)일 것입니다. 그리고 이러한 팀웍을 극대화하기 위해서는 협력정신을 이해해야 합니다. 필자의 경험상 효과적인 스터디 모임은 실전에서의 팀웍을 다지는데 도움이 됩니다. 효과적인 스터디 모임은 진솔한 대화와 진지한 의사소통을 통해서 서로의 지식과 지혜를 교류하고 서로의 마음을 이해하며 궁극적으로 삶의 번뇌를 어느 정도 해소시킬 수 있는 매우 훌륭한 시스템이라고 생각합니다.



팀웍을 이야기 하다 보면, 당연히 협력 정신에 대한 이야기가 나와야 하고 협력 정신은 바로 팀원들 간의 원활한 의사소통과 팀원들의 지식공유 그리고 팀원들 간의 믿음이 뒷받침되어야 합니다. 즉, 팀웍을 성공적으로 성취하기 위해서는 이에 기반이 되는 많은 요소 사항들이 있습니다. 스터디 모임은 팀웍과 직접적인 연관관계는 없지만 그래도 모종의 연관성은 있습니다. 그것은 바로 팀웍이나 스터디 모임이 어느 정도 같은 요소사항을 공유하고 있기 때문입니다.



팀웍은 프로젝트 수행을 중심으로 하며, 스터디 모임은 대부분 원서로 된 책이나 소형 프로그램 제작을 중심으로 합니다. 그리고 팀웍은 어떤 울타리 안에서 속박당한 듯한 분위기에서 진행되지만 스터디 모임은 개방적이고 자유로운 분위기에서 진행됩니다. 그러나 팀웍이나 스터디 모임 모두가 구성원을 필요로 하며 구성원들 간의 원활한 의사소통이 필요합니다. 그리고 지식 공유가 필수이며, 이를 통해서 인간관계를 돈독하게 할 수 있으며 더 나아가 신기술을 배우고 공동정신을 창출할 수 있습니다.



기업체에서 팀웍이 중요한 것은 사실입니다. 이러한 팀웍을 잘 이해하기 위해서는 협력문화를 잘 알아야 하며, 이러한 협력문화를 대학이나 학원 시절 때 배워두는 것이 필요합니다. 필자의 경험상 직장에서의 팀웍을 잘 이해하기 위해서는 대학이나 학원 시절부터 스터디 모임을 통해서 이를 익혀두는 것이 필요합니다. 물론, 스터디 모임을 잘 하는 사람이 반드시 팀웍을 잘 유지한다고 단정적으로 이야기할 수는 없습니다. 하지만, 스터디 모임으로부터 팀웍에 필요한 의사소통, 지식교류, 의견해소 및 협력정신과 포용력 등을 배울 수 있습니다. 프로그래머를 지망하시는 분들은 대학의 동아리나 인터넷 온/오프라인 동호회 그리고 학원을 통해서도 스터디 모임을 할 수 있습니다. 필자의 경험상 스터디 모임이 대학에서 그리고 학원 등 어디에서 이루어지더라도 스터디 모임에 참여한 프로그래머들 또는 프로그래머 지망생들이 열심히 협력하고 노력한다면 회사에서의 팀웍을 이해하는데 도움이 될 뿐만 아니라 여러 가지 면에서 직간접적으로 도움이 될 것입니다.



직장인의 경우에도 objectworld(www.ObjectWorld.org 사이트) 등의 스터디 모임을 통해 이 주일에 한 번 정도나마 저녁 오후에 2시간 정도의 시간을 내어 스터디 모임을 갖고 서로에게 필요한 기술지식들에 대해서 모임 참가자들이 함께 모여 토론하고 지식과 지혜를 공유할 수 있습니다. 규칙적이고 성실하며 진지한 스터디 모임은 협력문화의 소중함을 일깨워주고 함께 공부하는 기술지식을 보다 명료하게 꿰뚫어 볼 수 있는 안목을 얻게 해줍니다. 원활한 스터디 모임을 통해서 참여하는 모든 참가자들은 마음의 조화와 화합을 얻을 수 있으며 무엇보다도 서로의 의견을 존중하고 서로에게 감사하는 마음을 배울 수 있습니다. 그리고 스터디 모임을 효과적으로 수행함으로써 서로가 생각하는 바와 의도를 정확하게 분석하고 이해하는 방법을 배울 수 있습니다. 상대방으로부터 말하는 법을 배우며 상대방의 말을 듣는 법을 배우며 또한 자신이 말하는 법을 배우며, 자신의 말을 상대방에게 이해할 수 있도록 하는 법을 배웁니다. 또한, 서로의 사고체계와 논리체계의 장점과 단점을 허심탄회하게 이야기함으로써 서로에 대해서 잘 알게 되며 결국 긍정적인 인간관계를 형성하는 초석이 됩니다. 회사 일에서 서로에게 쌓였던 다소간의 불만이나 언짢음 등도 스터디 모임이라는 장을 통해서 다소 해소될 수 있습니다. 그것은 모든 스터디 모임 참가자가 하나의 공통된 주제에 깊이 몰입해 감으로써 서로의 개인적 벽(아집이나 이기심 및 자만심)을 넘어서 서로에게 필요하고 중요한 기술지식을 탐구해 나가게 되기 때문입니다. 스터디 모임을 잘 활용하면 참가자들은 공동으로 올바른 지식과 지혜를 찾아내는데 힘을 모으게 됩니다. 스터디 모임을 통해서 특정 주제에 대한 문제의식이 깊어지고 문제의식에 깊이 몰입하면 이를 통해 얻어진 정신적 힘에 의해 외면적인 세계는 망각되며, 서로를 근원적인 측면에서 이해하는 힘을 얻게 됩니다. 또한, 스터디 모임 참가자들이 서로 깊이 한 가지 의문에 대해서 심도 있게 탐구하게 되면 문제의 본질 속에서 서로 만나게 됩니다. 이러한 심오한 경지에 이르게 되면 너와 나라는 개별적인 주장이나 의견은 사라지고 다만 문제의 본질 그리고 문제가 현현하는 경이적 진리만이 존재합니다. 즉, 어떤 주제나 내용을 대강 해석해 들어가면 그 내용의 피상적 의미만을 이해하게 됩니다. 하지만 더 토론과 사색을 통해서 궁구해 들어가면 보다 새로운 의미를 터득하게 됩니다. 그리고 더욱 더 참구해 들어가면 언젠가는 문제의식에 대한 진리의 근원으로 다가서게 됩니다. 만약 심오하게 탐구하는 작업을 중도에 그만두면 문제의식에 대한 진리의 본모습을 대면할 수 없는 것이지요. 또한 스터디 모임을 통해서 비록 1~2주마다 한번씩 이루어지고 2 시간~3 시간 정도의 짧은 시간이지만 참가자 모두가 적극적으로 참여하게 되면 스터디 모임은 개체 의식을 넘어서 전체의식을 얻는데 도움이 될 것입니다. 물론, 스터디 모임은 개인의 지식을 자랑하는 것이 아니라 겸허하게 자신의 의견을 알리고 다른 이로부터의 생각을 긍정적으로 해석하고 이를 통해서 서로의 의식을 각성시키고 지식체계를 확장하는데 그 목적이 있습니다.



독자 제현님들께서는 지금까지 저의 글을 통해서 스터디 모임이 중요하다는 것을 어렴풋이나마 인식하셨으리라 생각합니다. 물론, 스터디 모임이 잘 되면 엄청난 것을 얻을 수 있지만 그렇지 못하면 시간 낭비가 될 수 있습니다. 그리고 무엇보다 스터디 모임이 제대로 이루어지기 위해서는 스터디 모임에 대한 구체적인 방법들을 알고 있어야 합니다. 여기서는 필자가 대학 때부터, 대학원 그리고 소프트웨어 개발 회사 및 인터넷 스터디 모임 등을 통해서 인문 서적에서부터 전산학 서적 및 프로그래밍 서적에 대한 스터디 모임으로부터 얻은 경험을 바탕으로 글을 정리하였습니다. 물론, 필자의 이야기가 모든 스터디 모임 방법의 표준이라고 할 수는 없습니다. 그리고 본 글만으로 효과적인 스터디 모임을 수행하기에는 어려움이 있을지도 모릅니다. 하지만 그래도 본인의 경험이 조금이나마 도움이 된다면 하는 뜻에서 스터디 모임을 하고자 하시는 분들을 위해 글을 정리하였습니다.

   

    2. 효과적인 스터디 모임

여기서는 앞 절에서 설명한 스터디 모임을 좀 더 자세하게 설명하고자 합니다. 다소 중복되는 부분도 있으니 그 점에 대해서는 독자제현님들의 너그러운 양해를 구합니다. 하지만 반복을 통해서 스터디 모임의 효과에 대해서 더욱 확실하게 이해할 수 있으리라 생각합니다. 우선, 스터디 모임의 요체는 신뢰에 바탕을 둔 의식의 원활한 교류에 있습니다. 즉, 신뢰가 바탕이 되어진다면 의식의 교류가 중요하다는 뜻이지요. 이러한 의식의 교류 또는 순환을 에너지 써큘레이션(Energy Circulation)이라고 말합니다. 이러한 의식의 순환에 의해서 스터디 모임 구성원들은 더욱 돈독한 유대감과 공감대를 형성하게 됩니다. 그리고 서로 뜻을 모으고 이해를 같이하여 목적의식을 통일시킬 때 서로 간의 협력과 유대감은 향상된다 할 수 있습니다. 즉, 서로 마음이 맞아야 한다는 것이죠. 마음이 일치하기 위해서는 공동의 목표를 지향하는 자세를 가져야 합니다. 한마디로, 목적이 같아야 된다는 것이죠. 누구는 C 언어를 공부하고자 하고, 누구는 C++를 공부하고자 하고 누구는 Java를 공부하고자 한다면 목적의 일치에서 멀어지게 됩니다. 또한, C 언어를 공부하더라도 누구는 그래픽 제어 프로그램에 맞는 알고리즘을 중심으로 공부하고 누구는 사운드 칩 제어 프로그램에 맞는 알고리즘을 중심으로 공부하고 하면 정확한 목적의 통일성을 얻기 힘듭니다. 따라서 스터디 모임 구성원 모두가 구체적으로 단일한 목적을 지녀야 합니다. 물론, 어떤 프로그래밍 언어와 어떤 컴퓨터 영역을 공부하건 간에 서로가 전산학 및 프로그래밍을 공부한다는 점에서 대동소이하지만 작은 차이가 큰 차이가 될 수 있으므로 서로 간의 차이를 최대한 줄이는 게 좋습니다. 간격이 넓어지면 목적의식과 방향감각이 서로 뒤틀리게 되며 불화가 발생할 수 있습니다. 따라서 스터디 모임을 결성할 때는 모든 구성원이 한 가지 주제에 몰입한다는 기본적인 가정을 전제해야 할 것입니다. 일반적으로 큰 주제에 대해서는 동일합니다. 즉, C 언어를 공부하거나 C++을 공부하거나 Java를 공부하거나 특정 언어를 한 가지 선택하는 데는 문제가 없을 것입니다. 그러나 구체적으로 C 언어를 활용하는 측면에서 보면 서로 관심분야가 다를 수 있기 때문에 자신의 관심주제와 생각으로 인하여 스터디 모임에 불협화음을 일으킬 수도 있습니다. 즉, 일반적인 내용에서 벗어나 지극히 협소한 영역을 다루게 되면 서로가 지루하게 되므로, 스터디 모임 참가자들이 대부분이 공통적으로 배우고자 하는 프로그래밍 분야를 선택하는 것이 중요합니다. 일단 스터디를 하고자 하는 주제와 책이 결정되면 비록 자신이 좋아하지 않는 분야더라도 조금이라도 참여해 보고 싶다면 다른 이들의 관심사에 맞추어 자신의 관심사를 확장시키는 것도 중요합니다. 즉, 비록 자신이 주로 관심을 두고 있는 프로그래밍 분야가 있더라도 이를 조화롭게 스터디 모임에 개합시키도록 하는 것이 필요합니다. 물론, 지나치게 자신이 필요로 하는 주제와 책과 거리가 멀어서 억지로 스터디에 참여하는 것은 바람직하지 않습니다. 따라서 스터디 모임의 주제는 항상 모든 참가자들이 공감하고 서로 관심을 가지고 있는 주제를 선택해야 합니다.



대부분의 스터디 모임은 지나치게 세부적인 주제를 다루지 않고 C, Design Patterns, UML, JAVA, C++, MFC 등 보편적인 주제를 다루는 경향이 있습니다. 다만, 일단 주제와 책이 결정되었다면 책의 내용을 발표하는 발표자들을 선정할 때는 당사자들이 관심 있는 내용을 맡도록 하는 것이 좋습니다. 즉 되도록 자신이 잘 알고 좋아하는 분야를 중심으로 발표하는 것이 스터디에 효과적입니다. 또한 토론 시에는 스터디 모임의 결속과 원만한 진행을 위해서 항상 보편타당성에 근거하여 모든 구체적 기술지식을 논의해야 합니다. 이 점이 참으로 어려운 부분이며 이를 위해서 스터디 모임 진행자의 역할이 중요합니다. 스터디 모임 진행자(일명 모임리더)는 발표자나 토론자가 지나치게 개인적인 관심사와 한 가지 주제에 집착하여 보편타당한 지식체계에서 벗어나게 되면 논의의 주제를 다시 보편타당하고 거시적 관점으로 화합시키도록 노력해야 합니다. 또한, 심오하게 궁리하는 것과 편협한 주제에 헤메이는 것과는 차이가 있습니다. 이 차이를 잘 식별할 수 있어야 합니다. 일반적으로 발표자가 다른 이들이 잘 모르는 부분을 무미건조하고 지나치게 세부적이고 파고들게 되면 듣는 이들은 따분하고 지루하여 졸기도 하고 딴 생각을 하기도 합니다. 항상 세부적 내용을 설명하기 위해서는 거시적인 지식체계에 기반을 두고 설명해야 합니다. 그래야, 발표자나 토론자들의 이야기를 듣는 사람들이 생각의 길을 잃지 않게 됩니다. 발표자는 심오한 기술지식을 논의하기 위해서는 비약해서 토론을 진행시키는 것을 삼가고 되도록 점진적으로 기술지식의 차원을 논의해 나가야 합니다. 즉, 단계적인 논의를 통해서 점차로 토론자들이 서서히 의식을 개화시키도록 해 나가야 합니다.



한편, 스터디 모임의 결성을 위해서는 모임의 주창자가 확고한 의지를 가지고 있어야 합니다. 즉, 무엇을 어떤 방식에 의해서 공부할 것인가를 명료하게 인식해야 한다는 것이죠. 따라서 무엇보다도 모임의 주창자는 뚜렷한 목적의식과 리더쉽이 필요합니다. 하지만 그렇다고 해서 주창자에게 모든 것을 맡기고 회원들은 그냥 따르는 것은 좋다고 할 수 없습니다. 주창자를 도와주고 자신이 언제 모임의 리더가 될지도 모른다는 자세로 항상 성실하게 스터디 모임에 임해야 할 것입니다. 스터디 모임을 처음 만드는 초기 참가자들은 어떻게 해서든 스터디 모임이 중간에 와해되지 않도록 하는데 주의를 기울이고, 스터디 모임이 제대로 빠짐없이 이루어지고 스터디의 효율성을 높이는데 노력해야 합니다. 그리고 이러한 노력은 스터디 모임의 리더나 초기 참가자들뿐만 아니라, 스터디 모임에 참석하는 모든 이가 함께 공유해야 할 정신입니다.



지금까지 논의한 대로 한다면, 스터디 모임 참가자들이 어떤 마음가짐을 가져야 할지 대강은 알 수 있으리라 생각합니다. 그러나 몇 가지 더 언급해야 할 마음가짐이 있습니다. 스터디는 개인의 지식을 신장시키고 지식을 얻는다는 것보다 스터디를 통해서 참신한 아이디어를 공유하고 새로운 지식을 창출하는데 목적을 두어야 한다는 것입니다. 스터디 모임이 제대로 가동되기 위해서는 구성원들 모두가 지식을 공유하고, 지식을 얻기보다는 서로 나누어 주고자 하는 마음가짐이 필요합니다. 물론, 무턱대고 사변을 늘어놓는 것이 아니라 서로에게 도움이 되는 참신한 지식을 나누는 것이 중요합니다. 또한 자신이 잘났다고 지식을 자랑하거나 교만해 해서는 안 되며, 항상 배우는 자세로 임해야 할 것입니다. 그리고 스터디 모임을 통해서 무엇인가 새로운 아이디어와 참신한 지식을 발굴해 내도록 심혈을 기울일 필요가 있습니다. 스터디 모임 참가자는 항상 진지하게 사색하고 연구해야 합니다. 예를 들어, Design Patterns 스터디 모임 시에 여기에서 등장하는 위임(Delegation) 개념을 놓고 토론한다고 했을 때 Delegation 과 같은 개념을 여러 가지로 생각하고 궁구해 보는 것이 필요합니다. 왜 이름을 Delegation이라고 했는가? Delegation의 코드구현은 어떻게 나타나는가? Delegation은 어떤 용도와 목적으로 사용되는가? Delegation을 사용할 때의 문제점과 단점은 무엇인가? Delegation을 사용하지 않는 대안의 방식은 없는가? 또한 Delegation과 상속은 어떻게 다른가? 등등 많은 이야기를 서로 진지하게 토론하는 것이 필요합니다. 이를 통해서 서로 한 가지 기술지식에 대해서 매우 포괄적이고 심도 있게 공부하게 됩니다. 이러한 토론을 통해서 책이나 일반적으로 알려진 사실이나 지식보다도 훨씬 심도 있는 지식과 지혜를 얻게 됩니다.



또한, 스터디 모임은 단순한 지식의 공유가 아니라, 의지와 열성과 이해의 화합을 필요로 합니다. 즉, 1차적인 수준에서의 지식 공유를 넘어서서 보다 높은 차원으로 스터디 모임을 이끌어 가는 것이 요구됩니다. 필자는 스터디 모임을 통해서 집단 삼매(Samadhi)에 이를 정도로 깊이 몰입한 적이 있었습니다. 스터디 모임이 제대로 활성화되면 특정 문제에 대한 포괄적인 이해를 얻을 수 있으며 동시에 사유의 범위를 크게 확장할 수 있습니다. 즉, 특정 문제의식을 스터디 모임 참가자들이 공유하게 되면 서로가 그 문제의식을 이렇게 해석하고 저렇게 해석해 감으로써 문제의식을 보다 생명력 있고 Social하게 이끌어 낼 수 있으며 인간관계와 삶의 전반에 대한 문제로 확대할 수 있습니다. 이를 통해서 모종의 보편적 사유와 일반적 사유 그리고 합리적 사유를 얻어낼 수 있습니다. 이러한 보편타당한 사유 속에서 스터디 모임의 참가자들은 모두가 의지와 열성을 합일시키게 되며 깊은 동화를 이루게 됩니다. 개인적인 이기심이나 아만심은 사라지고 오직 문제에 대한 전반적이고 확실한 이해를 얻기 위해 서로 협력하는 모습만이 존재하게 됩니다. 이는 마치 헤르만 헤세의 소설 “유리알의 유희”에서 언급되는 이야기와 유사합니다. 물론, 헤르만 헤세의 이야기가 다소 현실적이지 않은 것으로 보이나 실제로 필자의 스터디 모임들을 통한 경험에 비추어 볼 때 그러한 이상향을 이루는 것은 어렵지 않다는 것이 필자의 지론(持論)입니다.



자 그렇다면 어떻게 스터디를 진행하면 될 것인가에 대해서 구체적으로 고찰해 봅시다. 스터디 모임이 원활히 가동하기 위해서는 최소한 3명 정도의 구성원이 존재해야 합니다. 그리고 5명에서 6명 정도 되면 가장 안정되고 적당한 스터디 모임이 될 것입니다. 저의 경험상 사람이 너무 적어도 다양한 의식의 교류가 잘 진행되지 못하고 사람이 너무 많아도 함께 주제에 몰입하는데 어려움을 겪습니다. 물론, 20 여명에서 30여명에 이르는 구성원으로 스터디를 한 적도 있습니다. 이때는 특히, 스터디 모임의 리더가 중요한 역할을 합니다. 스터디 구성원이 많아지면 필요에 따라 적절한 통제를 잘 해주는 모임 리더의 가이드와 리더쉽이 필수적입니다. 일반적으로 필자가 알기에 모임의 열기가 유실되지 않기 위해서는 소수정예 형태로 모임을 구성하는 것이 필요합니다. 그리고 한 가지 주제에 대한 스터디 모임의 기간은 3개월에서 6개월 정도로 잡는 게 좋습니다. 너무 짧아도 많은 것을 얻지 못하고 너무 길어도 지루해지고 나태해 집니다.



그럼, 본격적으로 스터디 진행 방법에 대해서 논의하겠습니다. 먼저, 스터디를 하기 위해서는 스터디 모임의 성격을 확실히 해야 합니다. 즉, 스터디 모임의 주제가 명확해야 한다는 것이죠. Java 언어를 공부하는 스터디 모임이 된다면 Java 스터디가 되겠고, Agile 소프트웨어 개발에 대한 공부라면 Agile 소프트웨어 개발 스터디 모임이 되겠지요. 어쨌든 스터디 모임이 무엇을 배우는 것인지 명료하게 설정할 필요가 있습니다. 그 다음으로는 스터디 모임을 간접적으로 혹은 직접적으로 지도해 줄 분을 한 분 선임하는 것이 중요합니다. 대부분 간접적인 조언자를 별도로 두고 스터디 모임에서 발생하는 문제점과 어려운 점에 대해서 조언을 구할 수 있습니다. 특히, 스터디 경험이 많고 스터디 주제에 대해 해박한 전문지식을 갖춘 사람을 조언자로 구하고 간접적이나마 조언을 구하는 것이 필요합니다. 조언자로는 대학 교수님이나 실무 경험자 그리고 대학 선배 등 스터디 참여자들과 인연이 되는 가장 친근하고 자상하신 분을 선택하는게 좋습니다. 그리고 스터디 모임의 주 교제와 스터디 모임의 방향도 이런 분의 조언을 통해서 결정하는 것도 괜찮습니다. 물론, 스터디 모임 구성원들 간의 의견도 수렴해야 되며 여러 가지 제반 사항을 고려하여 교재를 정하고 그리고 스터디 모임의 방향을 정해야 할 것입니다. 그러나 스터디 모임 참가자들이 경험이 풍부하고 공부를 많이 했으며 서로를 이해하는 마음이 깊다면 별도의 자문을 둘 필요는 없을 것입니다.



구체적으로 스터디 모임의 교재를 정해야 하는데, 크게 한글 책과 영문 책 두 가지로 나뉠 수 있습니다. 스터디 모임의 목적은 자신의 실력을 한층 더 높은 차원으로 끌어올리고 배양하는 것이므로 자신의 실력보다 조금은 높은 수준의 공부를 해야 합니다. 그러므로 교재 선택 시 서로가 혼자서 공부하기에는 버거운 책을 선택할 것을 권장합니다. 그래야, 스터디를 하는 의의가 있고 토론의 소재들이 발생하고 스터디를 한 후에도 남는 것이 있습니다. 한글 책일 경우에는 원서보다 더 어려운 책으로 하는 게 좋겠습니다. 그리고 원서의 경우에는 지나치게 사변적인 책(말이 많은 책)은 삼가시고 적절히 프로그램 코드가 섞여 있는 책을 선택하십시오. 물론 한글 책도 마찬가지입니다. 즉, 코드가 적절히 섞여 있는 책을 선택하십시오. 그렇다고 코드가 너무 많은 책은 토론의 소재가 적어지므로 그것도 바람직하다고 말하기는 어렵습니다. 따라서 코드와 설명이 적절히 배합되어 있는 서적을 권장합니다. 그리고 처음 특정 주제에 대해서 스터디를 할 경우 반드시 분량이 적은 것을 선택하십시오. 그리고 스터디 모임의 성격과 스터디 방법에 확신이 설 경우 분량이 많은 서적으로 차원을 높여 나가면 됩니다.



교재 선택을 위해서는 온라인 서점에서 가장 인기 있는 서적을 선정 하는 것도 좋고 이미 스터디를 해 본 분들의 이야기를 듣고 결정하는 것도 좋습니다. 하지만, 한 가지 방법에 의해서 선택하지 마시고 여러 가지 종합적으로 평가하고 논의해서 결정하는 것이 좋습니다. 일단 교재를 선택하면 그 교재와 그 교재의 저자를 믿고 존중하는 자세가 필요합니다. 교재와 저자를 존중하지 않고 공부하는 것과 교재와 저자를 존중하면서 공부하는 경우하고는 엄청난 차이가 있습니다. 이것은 독자 제현님들도 거의 다 아시는 이야기라 생각합니다. 물론 프로그래밍 서적 내용에 버그나 오류가 있을 지라도 무조건 믿으라는 것이 아니라 문제의 부분에 대해서 진지한 사색과 토론 그리고 프로그래밍 실습을 통해서 틀린 부분은 수정하시면 됩니다. 책이나 저자를 존중하게 되면 자신의 마음을 겸허하게 하여 배울 수 있는 자세를 갖추게 됩니다.



교재가 선정되었다면 이제는 교재를 함께 논의하고 학습하는 것이 필요한데, 자신의 실력이 출중하지 않다면 다른 사람들이 발표하는 내용에 대해서도 미리 공부해 올 필요가 있습니다. 즉, 일주일이나 이 주일에 한 번 스터디 모임을 하게 되면 자신이 발표할 때가 있고 발표하지 않을 때가 있을 것입니다. 비록 자신이 발표하지 않더라도 남이 발표할 내용을 미리 공부해 올 필요가 있습니다. 그래야, 서로 토론할 때 정확하게 무엇을 이야기하고 있고 무엇이 중요한지 쉽게 알 수 있습니다. 그리고 많이 공부해 올수록 서로의 의견을 잘 파악할 수 있고 서로의 주장을 잘 이해할 수 있습니다. 그리고 자신이 발표하게 될 차례가 됐다면, 밤을 새면서까지 완벽하게 내용을 이해하도록 노력해야 합니다. 즉, 자신이 이해하지 못한 상태에서 남에게 발표하는 것은 바람직하지 않다는 것이죠. 모르는 것이 있으면 연구하고 궁리해 볼 필요가 있습니다. 그리고 자신이 발표하기 전까지 일주일 정도의 기간이 있으므로 하루하루 천천히 여러 번 반복해서 발표할 내용을 읽어보도록 하십시오. 한 번 읽을 때와 두 번 읽을 때 그 차이가 현격하게 나타납니다. 그리고 하루가 지날 때마다 느낌이 달라지고 내용에 대한 자신의 사유폭이 한층 증대됩니다. 스터디 모임의 의의는 발표를 준비하는 사람이 발표를 준비하는 동안에 많은 것을 얻을 수 있다는 것입니다. 다시 말해서, 책임의식이 강할수록 배우는 것이 많습니다. 그리고 자신이 확실하게 내용을 이해한 후에 발표를 하게 되면 자신감도 붙고 실제로 자신이 어렴풋하게 알고 있었던 내용에 대해서도 자신이 아는 한도 내에서 허심탄회하게 이야기하고 토론할 수 있으므로 스터디 모임이 원활하게 유지될 수 있습니다. 즉, 연구한 후 모르는 부분에 대해서는 진솔하게 모른다고 이야기하고 자신이 아는 한도 내에서 연구하고 궁리한 내용을 잘 풀어서 설명하는 자세가 요구됩니다. 만약 그렇지 못하고 자신이 발표준비를 제대로 해오지 않는다면 정확하게 무엇을 발표해야 하고 무엇이 중요한지 모릅니다. 그러면, 오히려 발표자로서 미안하게 되고 스터디 모임 참가자들이 스터디에 대해서 흥미를 잃게 됩니다. 즉, 발표자가 되었다면 성실하고 충실하게 발표준비를 해야 할 것입니다. 일단 발표를 제대로 준비했다면 최종적으로 스터디 모임을 갖기 전에 한 번쯤 모의로 집이나 한적한 공간에서 혼자 소리를 내어 발표를 해보십시오. 이것은 저에게 굉장히 도움이 되었습니다. 즉, 자신이 말로 소리를 내어 발표해 봄으로써 표현력과 발표력을 높일 수 있으며, 자신이 무엇을 잘 파악하고 있는지 또는 그렇지 못한지, 무엇에 대해서 이해도가 낮은지 등등을 확실하게 알 수 있습니다. 그리고 말로 표현하면서 스터디 교재의 내용을 읽어 가면 공부한 내용이 확실하게 정리가 됩니다. 그리고 음성으로 발표할 때 어떤 부분에 대해서 참가자들이 어떤 의문을 제기할지 예측해 가면서 발표 내용을 정리해 볼 필요도 있습니다. 즉, 가능한 한 책임감을 갖고 완벽하게 발표 준비를 하는 것이 중요합니다. 한 사람 한 사람이 성실하고 충실하게 발표 준비를 할 때 스터디 모임은 더욱 원활해지고 활기를 띨 수 있습니다.



물론, 이러한 책임감이 지나친 자기표현과 과시로 이어져서는 안 됩니다.  발표자는 자신이 많은 것을 알고 있으므로 그것을 남에게 강요하듯이 제공하기보다는 자신이 이해한 수준에서 그냥 부드러운 어조로 발표하면 됩니다. 즉, 자신이 무엇을 많이 알고 있다는 태도 등은 지양해야 합니다. 오히려, 발표자는 자신이 발표하는 내용에 대해서 잘못된 내용이 있는지를 청중들로부터 겸손하게 듣고 배울 수 있는 자세를 가져야 합니다. 일반적으로 발표자는 남에게 지적을 당하는 것이 두려워 자신이 모르는 내용은 그냥 지나치고 넘어가는데 그렇게 되면 자신의 발전에 저해가 됩니다. 즉, 모르는 내용이 있으면 허심탄회하게 이 부분에 대해서는 이렇게 생각하고 있지만 확실하게 모르겠다고 말하고 정직하게 다른 이의 의견을 경청하는 것이 중요합니다. 물론, 모르는 것이 다반사가 되어 발표자가 발표라기보다는 그냥 책 내용 전체에 대해서 청중들에게 물어보는 것도 실례겠지요.



자, 그렇다면 듣는 사람은 어떻게 해야 하는지 알아봅시다. 듣는 사람은 발표자가 모르는 내용을 지적할 수도 있고, 자신이 생각하는 다른 의견을 제시할 수도 있습니다. 하지만 지나치게 발표자의 비위를 거스르면서 냉혹하게 비판하는 것은 삼가야 합니다. 언제나 발표자나 자신이나 모두가 함께 공동으로 배움의 장에 참여하고 있다는 자세에서 서로를 위하고 아껴주는 마음이 필요합니다. 따라서 발표자와 다른 의견을 가지고 있더라도 부드러운 어조로 자신의 의견을 제시해야 할 것입니다. 그리고 의견을 고집하기보다는 항상 유연한 자세를 갖는 것이 필요합니다. 그리고 항상 옳고 그름을 떠나서 옮고 그름을 하나로 아우르는 새롭고 참신한 아이디어와 지식 창출에 노력할 필요가 있습니다. 참가자는 발표자의 의견을 비판하고 자신의 의견을 과시하기 위해서 토론을 하는 것을 삼가 해야 하며, 항상 토론과 대화가 새로운 지식과 새로운 지혜를 얻는데 초점이 맞추어져 발표자를 도와주어야 합니다. 즉, 발표자의 지식에 자신의 지식을 더하거나 발표자의 지식의 문제점을 시정해 주거나 또는 내면적으로 자신이 알고 있는 지식의 문제점을 수정해 나가는 것이 필요합니다. 항상 참가자가 발표자의 의견에 상반되는 의견을 제시할 때는 여러 번 생각해 보고 고심한 후에 의견을 제시하는 것이 좋으며 토론 분위기에 도움을 주는 방향으로 이끌도록 노력하는 자세가 중요합니다.



이제, 구체적으로 발표자가 어떻게 내용을 발표해야 되는지를 알아봅시다. 발표자의 취향과 성격에 따라 여러 가지 형태로 발표 내용을 발표할 수 있는데, 무엇보다도 어떤 형태의 발표를 하든 가장 기본적인 것은 개념 설명부터 잘 해야 한다는 것입니다. 개념이 잘 설명되지 않고서는 스터디의 근본 취지가 흔들릴 수 있습니다. 개념이라는 것은 스터디 모임 참가자들에게 있어서 토론의 중심 주제이고 가장 기본적인 내용이거든요. 예를 들어, Java 언어를 스터디 한다고 했을 때 Java가 객체지향을 지원하지만 다중상속을 지원하지 않는다는 사실에 대해서 왜 다중상속을 지원하지 않는지 그 이유를 명확히 설명할 수 있어야 합니다. 이에 대해서는 인터페이스 상속과 구현 상속이라는 두 가지 개념을 잘 알고 있어야 합니다. Java는 완벽한 다중상속을 지원하지 않지만 간접적으로 지원한다는 점을 알 필요가 있습니다. 이와 같이 인터페이스 상속이라는 개념과 구현 상속이라는 개념을 알지 못하고서는 Java의 다중상속 개념을 이해하기도 힘들고 스터디가 어려워집니다. 필자가 알기에 논쟁으로 비화되는 경우가 발생하는 대부분은 기본적인 개념에 대한 서로간의 오해에서 시작합니다. 그것은 또한 서로 간의 개념이해와 언어사용의 차이에도 발견할 수 있습니다. Thinking In Java와 Thinking In C++ 서적에서 브루스 에켈이 언급한 것처럼 자신이 학생들에게 강의할 때는 많은 개념들이 섞여 있는 상태로부터 하나의 개념만을 분리해서 한 번에 하나의 개념만을 설명한다고 말합니다. 이 방식은 매우 의미 있고 유용한 방법이라고 필자도 생각합니다. 따라서 여러분들께서도 스터디를 할 때 한 번에 하나의 개념에 대해서만 충실하게 토론하는 것이 중요합니다. 즉, 여러 개념이 합쳐져 있는 경우에는 하나하나 분리해서 하나하나 차근차근 논의를 해 가면서 최종적으로 그러한 개념들을 하나로 합쳐서 이해할 필요가 있습니다. 소프트웨어라는 것이 개념들에 의해서 창출된 실체이므로 이러한 실체에 기반이 되는 여러 가지 개념적인 내용을 모두 일거에 토론하는 것은 무리입니다. 즉, 실체의 일면을 하나하나 관찰해 가면서 개념을 하나하나 분리해서 설명할 필요가 있습니다. 이런 식으로 공부하다보면 하나의 개념에 대해서 다차원적인 해석이 가능합니다. 즉, 스터디 모임에 참여한 구성원들의 다양한 의견을 통해서 서로 최대한의 다양성을 이끌어 낼 수 있습니다. 정리하자면 토론을 위해서는 먼저 분명하게 하나의 주제나 개념만을 토론해야 하며, 주제나 개념이 복합주제이거나 복합개념이라면 반드시 분리해서 차근차근 단계적으로 하나씩 해소시켜 나가도록 해야 합니다. 그 이유는 전술했다시피, 하나의 개념에 대해서도 스터디 모임 참가자들이 다양한 의견과 생각을 창출해 낼 수 있기 때문입니다.



그리고 발표자는 중요한 어휘나 전문 용어에 대해서 확실하게 설명하고 넘어갈 필요가 있습니다. 예를 들어, 익스트림 프로그래밍에서 언급되는 Frequent Refactoring란 용어가 있을 때 이 용어가 무엇을 의미하는지 확실하게 알 필요가 있습니다. 그리고 Simple Design이란 용어가 있다고 할 때 이 용어가 무엇을 의미하는지 확실하게 이해할 필요가 있습니다. C++의 경우에는 Operator Overloading의 목적과 의의 그리고 Function Overloading의 목적과 의의 등 각 종 전공용어와 어휘에 대해서 상세하게 설명할 필요가 있습니다. 기본적으로 개념의 표상은 어휘이기 때문입니다. 어휘를 제대로 이해하지 않고서는 올바른 개념을 얻기 힘듭니다. 더 나아가서, 발표자나 참가자들은 모두가 책의 내용에서 중요한 문장을 서로 지적하고 논의할 필요가 있습니다. Agile 소프트웨어 개발의 경우 "테스트코드와 제품 코드 간에 동기화를 유지해야 한다"고 했는데, 과연 이게 무슨 뜻인지 잘 이해하고 넘어갈 필요가 있습니다. 즉, 하나의 어휘에서부터 한 문장 한 문장 깊이 있게 궁리하고 연구하는 자세가 필요합니다. 그냥 맹목적으로 인식하고 넘어가게 되면 스터디의 의의가 퇴색됩니다. 그리고 별로 의미 없어 보이던 문장이나 어휘 그리고 개념에 대해서도 색다르고 독특한 해석이 가능해 지고 서로 알지 못했던 새로운 사실을 얻기도 합니다. 이것이 바로 창발성입니다. 자신도 모르고 남도 모르던 교훈이나 지식을 얻게 되는 것이지요. 스터디의 가장 큰 목적은 공동의 정신창조이지만 이러한 대목표에 부가적으로 참신한 아이디어와 지식을 스터디 모임을 통해서 창출해 낼 수 있고 서로 얻어갈 수 있다는 장점이 있습니다. 하나의 전공용어와 개념을 놓고 이런 생각, 저런 생각을 하다 보면, 전공용어의 유효성과 장단점 그리고 구현의 의미 등을 포함하여 그 개념을 포괄적이고 전체적이고 종합적으로 이해할 수 있습니다. 이러한 이해가 가능하기 위해서는 스터디 모임의 참여자들이 자신의 지성을 고도로 가동시켜야 하며 이로 인해 참여자들은 분석력, 직관력, 추리력, 논리력, 판별력, 식별력, 통찰력 등을 현저하게 증대시킬 수 있습니다.



그리고 이러한 개념적인 차원에 대한 이해에 바탕을 두고 코드를 중심으로 스터디 하게 되면 구체적인 사실들을 열거하고 동시에 이들을 함께 조립하고 합성시켜 감으로써 이를 통해서 고도의 추상적인 개념을 보다 공고히 정립할 수도 있습니다. 실제로 코드는 구현을 담당하지만 구현을 하나하나 철저하게 사색하고 뜯어보다 보면 그에 맞는 추상적 설계 개념을 파악할 수 있습니다. 그리고 코드를 분석함으로써 코드에 가미된 요소기술들을 배울 수 있습니다. 또한, 코드 자체를 변형시켜 보고 다시 실행시켜 봄으로써 다양한 지식을 얻을 수 있습니다. 바둑 해설가들의 이야기를 들어보면 바둑에서도 정석 다음으로 변화를 중시한다고 합니다. 마찬가지로 책에 실린 프로그램 코드를 공부할 때도 변화를 가미시켜 공부하는 것이 도움이 됩니다. 즉, 프로그래머에게 있어서도 기본 정석에 바탕을 두고 변화를 살려 코드 구조를 응용하는 것이 중요합니다. 실제로 스터디 모임 때 노트북 등을 이용해서 프로그램 코드를 돌려보고 제대로 동작하는지 확인해 본 다음, 시간이 허용한다면 가능한 한 새로운 방식으로 코드를 변형해서 실행시켜 보고 결과를 확인해 가면서 공부할 필요가 있습니다. 실험과 관찰을 통해서 코드 변화가 갖는 효과를 논의해 보는 것도 도움이 될 것입니다. 또한 지나치게 어떤 사고와 어떤 의견에 집착하거나 고수할 필요는 없습니다. 그렇다고 진리의 참과 거짓을 구분하지 말라는 것은 아닙니다. 논리나 지식의 참과 거짓을 구별하는 것은 중요하나 그것에 집착하게 되면 단순하게 무엇이 옳고 무엇이 그르다는 이분법적인 사유의 그물에 얽매이게 될 수 있습니다. 따라서 참의 이치가 가져다주는 효험과 거짓의 이치가 가져다주는 불편함과 문제점을 인식하는 자세가 중요합니다. 예를 들어, 스터디 모임 참가자들 중에서 어느 한 사람이 구현 상속이 인터페이스 상속보다 프로그램 이식성을 향상시킨다는 잘못된 의견을 제시했다고 합시다. 이에 대한 반증을 위해서는 실제로 이 의견이 가져다주는 문제점과 불편함을 직접 알려주는 것이 필요합니다. 즉, 구현 상속 시 코드의 구현부분이 상속됨으로써 이식성을 저해시킨다는 점을 알려주는 것이 필요합니다. 필자의 경험상 필자가 어리석어서 그런지 잘 모르는 내용에 대해서는 직접 프로그램 코드로 구현하고 실행하여 결과를 확인하지 않고서는 거짓으로부터 얻어지는 불편함과 문제점 그리고 옳음의 가치를 제대로 인식하기 어려운 적이 많았습니다.



스터디 모임의 이점을 얻기 위해서는 누누이 강조하지만 무엇보다도 스터디 모임에 참석하시는 분들 개개인의 마음가짐이 중요합니다. 즉, 서로에게 피해를 주지 않고 지나치게 자신의 의견과 견해에 집착하지 않도록 하는 것이 중요합니다. 물론, 때로는 자신의 의견을 정확하게 피력하고 관철시키는 것이 중요하지만 그것이 전체 스터디 모임에 지나치게 차가운 냉기를 가져다준다면 즉시 그 자세로부터 물러서야 합니다. 스터디 모임은 언제나 활기차고 따뜻한 그러면서 진지한 분위기 속에서 이루어져야 하기 때문입니다. 이러한 기본적인 원칙을 제대로 지킨다면 스터디 모임은 즐거운 시간이 될 것입니다. 즉, 인간관계의 기술은 스터디 모임의 중요한 요소입니다. 서로가 서로를 존중하고 신뢰할 때 스터디 모임과 팀웍은 영속성을 지니며 그 효과가 엄청나게 증대됩니다. 물론, 싸우지 않고 토론을 하는 것이 요즘의 스터디 모임의 추세이므로 가급적 언쟁하지 않고 스터디를 하시는 것이 좋을 것입니다. 다음은 사색과 토론 방법에 대한 글입니다. 이 글을 통해서 언쟁을 뛰어넘어 사색하고 토론하는 방법을 얻는데 조금이나마 도움이 되셨으면 합니다.



필자는 대학 때 스터디 모임을 통해서 문제의식을 갖고 특정 주제에 대해서 심도 있게 탐구하는 것을 한 선배로부터 배웠고, 그 후 수많은 선지식(善知識)분들을 통해서 이를 나름대로 체득하게 되었습니다. 그 선배는 스터디 모임 참가자들과 끊임없는 대화와 사색 그리고 성찰을 통해서 책의 내용이 담고 있는 바의 이면적 의미를 터득하려고 하였으며, 항상 대화를 보다 고차원적인 수준으로 이끌어갔습니다. 즉, “과연 이 내용이 단지 이런 의미만을 담고 있을까?”라는 회의를 모든 참가자들에게 전달해 주었습니다. 즉, 이 선배로부터 필자는 한 가지 내용과 주제에 대해서 매우 포괄적이고 심도 있게 사색하는 방법을 배웠습니다. 이러한 포괄적인 사색과 심도 있는 사색을 통해서 여러 가지 의견이 오고 가게 되는데 이는 궁극적으로 문제의식에 대한 거의 하나의 거대한 진리내지 이법(理法)으로 수렴하게 됩니다. 그리고 그 이법은 말로 표현할 수 있기보다는 표현하기 어려우며 스터디 모임 참가자 각각이 마음으로 이해하고 깨달을 수밖에 없었습니다. 물론, 모든 스터디 모임 참가자들이 특정 내용이 함유하고 있는 이법에 도달하는 것은 아닙니다. 많은 시간과 많은 대화와 많은 노력과 성찰이 필요합니다. 언젠가 하루는 이 선배가 자신의 논리와 주장으로 어떤 내용에 대해서 스터디 모임 참가자들의 의견들을 잘 다듬고 정리하면서 결론에 도달하도록 이끌었습니다. 그런데 이 선배는 토론이 종막을 고한 후에도 한 손을 머리에 대고 자신의 한계를 인식하고 푸념하듯 혼잣말로 조용히 이렇게 말하기도 했습니다. “도저히 모르겠다.” 필자는 이를 듣고 이렇게 생각했습니다. “그렇다면 지금까지 이 선배가 주장하고 이 선배와 스터디 모임 참가자들이 대화를 나누었던 그 모든 이야기들이 무엇을 의미한단 말인가?”물론 그 당시는 그 선배의 혼잣말을 제대로 이해하지 못했습니다.



필자는 지금에서야 그 선배가 모든 문제의식을 마치 화두를 드는 것처럼 심오하게 참구해나갔다는 것을 깨달았습니다. 예를 들어, 객체지향 프로그래밍에서 상속이 좋은가 나쁜가에 대해서 문제의식을 갖고 탐구해 들어간다고 합시다. 과연 이에 대한 정답이 있을까요? 참가자들에 따라 여러 가지 경험을 통해서 다양한 의견과 주장이 제시될 것입니다. 하지만, 좋다와 나쁘다 식의 어느 한쪽으로 상속 개념이 기울지는 못할 것입니다. 상속과 관련하여 오버라이딩(Overriding)과 오버로딩(Overloading)의 개념도 이해해야 합니다. 그 밖에 여러 가지 개념들도 이해하게 되고 여러 가지 개념들 속에서 상속 개념이 지니는 위상을 가늠할 수 있으며 객체지향 프로그래밍에서의 상속 개념에 대한 전체상을 이해하게 될 것입니다. 문제의 본질은 개념 자체를 투철하게 파악하는데 있지만 그 의미는 전체적인 관계상(또는 관계성) 속에서 얻어집니다. 중요한 것은 관계상의 본질은 개념 자체의 내적 의미에 함유되어 있다는 것이지요. 즉, 상속 개념 자체에 대해서 철두철미하게 파악하는 것이 객체지향 프로그래밍의 전체상을 통해서 상속 개념을 이해하는데 도움이 됩니다. 상속 개념 자체라면 부모 클래스에서 특정 기능을 자식 클래스에서 받아오는 것입니다. 이 개념 자체만을 놓고 볼 때 재사용성을 얻습니다. 이 재사용성의 본질을 이해하는 것이 중요합니다. 과연 이 재사용성이 객체지향 프로그래밍에 도움이 되는가? 도움이 된다면 어떻게 도움이 되며 어떨 때 도움이 안 되는가? 이와 같이 심도 있게 궁구해 들어가면 상속 개념 자체가 지닌 특성들을 하나하나 이해하게 됩니다. 자세한 것은 Scott Meyers의 Effective C++를 참고하시거나 기타 설명이 잘 되어 있는 객체지향 프로그래밍 서적을 참고하시기 바랍니다. 참고로, Scott Meyers의 Effective C++는 C++의 특정 주제를 아이템별로 분류하여 설명하고 있어 저자의 참신한 사유 알고리즘을 얻는데 도움이 됩니다. 쉽게 설명해서, 한 가지 예를 들면 함수를 이해하기 위해서는 함수의 기능과 구조를 먼저 이해한 후 그 함수를 호출하고 그 함수와 연계된 다른 함수들이나 루틴들의 관계상을 이해할 필요가 있다는 것이지요. 함수의 기능과 구조 자체 내에 다른 함수와 루틴들과의 관계상이 결정된다고 할 수 있으니까요. 물론, 이것은 필자의 경험적 이성에 의한 생각입니다. 문제의식이 주어지면 그 문제의식을 형성하는 제반사항을 개념과 코드를 통해서 개념의 본질과 코드의 구조를 파악해야 하고 더 나아가 개념의 본질과 연계된 다른 개념들의 관계상을 이해해야 하며 코드 구조의 경우는 그 코드 구조와 연계된 다른 코드 구조들과의 관계상을 이해해야 합니다. 중요한 것은 특정 개념 자체의 순수성을 깨닫는 것이며 개념들의 관계상 속에서 이 특정 개념의 의미를 이해하는 것입니다. 이것은 마치 특정 코드를 코드 전체 구조에서 아무 문제없이 뽑아내고 다시 특정 코드를 코드 전체 구조에 아무 문제없이 추가하는 것과 같은 노련한 기술이 필요합니다. 다른 개념들과 독립적인 개념 자체의 순수성(또는 본질)과 개념들 간의 관계상을 철저히 꿰뚫어 알 수 있는 지혜의 안목이 필요합니다. 여하튼, 스터디 참가자들은 문제의식을 투철하게 파악하고 이를 완전히 해소시켜 나가도록 노력해야 합니다. 문제의 본질을 이해하고 문제가 지닌 관계상을 파악하는 것이 스터디 모임의 주요 과제라고 생각합니다. 필자의 경험상 이것이 바로 스터디 모임 참가자들이 숙지해야 할 사항입니다. 스터디 모임 참가자들은 서로 문제의식을 풀어가면서 연속성에 근거하여 다시 새로운 문제의식을 만들어 내고 개념 구조를 생성시키고 이러한 개념 구조를 바탕으로 코드 구조들의 다양성과 개연성을 철저히 분석해 나가야 할 것입니다. 문제의식에 집중해 들어가면 문제의식 자체가 새로운 아류 문제의식을 창출시킵니다. 너무 어렵게 이해한 듯한데, 정확하지는 않으나 쉽게 설명 드리면 하나의 생각이 또 다른 생각을 낳는다고 생각하시면 됩니다. 물론, 문제의식이라는 것은 단순히 하나의 생각이 아닙니다. 문제의식이란 미지의 생각들의 덩어리(Lump of Thoughts)라는 것이죠. 즉, 문제가 내포 및 함유하고 있는 모든 사실과 논리 그리고 이치들이라 할 수 있습니다. 문제의식의 해소를 통해서 알고 있던 지식들이 새롭게 정립되고 미처 알지 못한 사실과 논리 그리고 이치를 얻게 되지요. 이러한 사실과 논리 그리고 이치는 해법을 형성하게 됩니다. 예를 들어, C 언어를 사용해서 Sort()라는 함수를 구현한다고 합시다. Sort()는 정수형 배열을 받아들여 그 배열에서 가장 큰 숫자 순으로 정렬하는 함수입니다. 여기서 바로 이러한 Sort() 함수를 구현해야 한다는 것이 프로그래머에게는 하나의 문제가 됩니다. 그리고 이러한 문제를 풀기위해서 총동원되는 프로그래머의 사유가 문제의식을 형성하게 됩니다. “이 Sort()를 어떻게 해결해야할까?”라는 문제의식에는 여러 가지 생각들이 존재합니다. 즉, 매개변수는 어떻게 구성하고, 반환형을 어떻게 결정하고, 함수의 내부 로직은 어떻게 작성해야 하는지를 궁리하게 됩니다. 이러한 전체적인 사유가 바로 하나의 문제의식으로부터 현현한 것입니다. 또한, 문제의식이 새로운 문제의식을 산출한다는 것은 다양한 문제의식들 간의 의존성을 찾아나가는 것이죠. 아류 문제의식이란 한 가지 문제의식을 해소시키기 위해서 필요한 부가적이고 종속적인 새로운 문제의식이라고 할 수 있으며, 또는 제 1 문제의식이 해소되어 제 2 문제의식으로 변형된 것을 의미하기도 합니다. 이 부분에 대한 자세한 설명은 좀 뒤에서 설명하겠습니다.



지금 제가 이야기하는 것은 스터디 모임 참가자님들이 발표자가 발표를 하거나 토론을 하는 동안 자신 나름대로 사유를 가동시키라는 것입니다. 그리고 적절한 사유의 가동을 위해서는 문제의식에 기반을 두어야 합니다. 문제의식이 없는 사유는 길을 잃기 쉽습니다. 그리고 만약 Sort() 함수에 대한 문제의식을 스터디 모임 참가자들이 모두 공유한다면, 한 사람은 매개변수는 어떻게 구성 하는 게 좋겠다고 이야기할 수 있으며, 또 한 사람은 반환형은 어떻게 결정하면 좋겠다고 이야기할 수 있으며, 다른 사람들은 내부 알고리즘을 구현하는 방법에 대해서 이야기할 수 있습니다. 물론, 이는 구체적으로 하나의 Sort()라는 함수를 구현한다는 전제로 이루어지는 토론 과정이 될 것입니다. 마치, 병렬컴퓨터를 사용해서 단순한 하나의 알고리즘을 실행시키는 것과 같습니다. 스터디 모임은 병렬컴퓨터와 마찬가지로 참여자들의 의식들을 고도로 합일시켜 좀 더 복잡하고 좀 더 어려운 문제를 풀어야 능률적이라고 할 수 있습니다. 지금까지 제가 문제의식을 거론한 것은 개체적 의식으로서의 사유 행위를 설명하기 위해서가 아니라, 스터디 모임이라는 공동체 의식으로서의 사유 행위를 설명하기 위함입니다. 즉, 문제의식에 대해서 대강 이해하셨으니 문제의식을 갖는 것이 스터디 모임에 얼마나 중요한 것인지 이해하셨을 것입니다. 문제의식의 중요성은 단순히 필자가 주장하는 이야기가 아닙니다. 많은 학인들이 중시하는 것이지요. 여하튼, Sort() 함수를 구현하는 문제와 같은 보다 쉬운 문제는 혼자의 개체적 의식으로 해결할 필요가 있으며, 보다 복합적이고 난해한 문제에 대해서는 스터디 모임을 통해서 참가자들의 다중의식으로 해결하는 것이 필요합니다. 단순히 Sort()라는 함수를 구현한다는 것을 놓고 스터디 모임을 하는 것은 매우 비능률적입니다.



자, 그렇다면, 문제의식을 개체적 의식으로 형성 또는 구성하는 것과 문제의식을 다중의식으로 형성 또는 구성하는 것의 차이를 알아둘 필요가 있습니다. 일반적으로 프로그래밍을 포함해서 모든 공부는 문제의식을 구성하고 이 구성된 문제의식을 완전히 해소시켜 나가는 방법을 최적화시키는 데 목표를 둡니다. 필자가 알기에 가능한 한 완전하게 빠른 시간 내에 문제를 완벽하게 해결하는 것이 중요합니다. 공부를 잘 못하는 학생들에게 문제의식을 어떻게 구성하고 이를 어떻게 해소시키는지를 알려주면 이를 통해서 조금씩 사유체계를 내면에 구축해 나갑니다. 그리고 엉성하게 공부를 잘하는 학생보다 빠르게 실력이 높아질 수 있습니다. 왜냐하면, 진정한 실력은 단순히 지식을 많이 쌓아올리는데 있지 않습니다. 아무렇게 마구 공부하여 엉성하게 지식체계를 쌓아올려 불균형적이고 비질서적이며 부조화로운 사유체계를 이룬 사람보다는 비록 쌓아올린 지식의 층은 낮지만 체계적이고 철저하게 질서적이고 조화로운 사유체계를 구축한 사람에게 나중에 뒤쳐지게 됩니다. 지식체계라는 것도 결국 건물처럼 처음부터 잘 쌓아 올리는 것이 필요합니다. 혼자서 문제의식을 제대로 해소시키는 방법을 아는 것도 쉽지는 않지만 스터디 모임을 통해서 문제의식을 공동으로 효과적으로 해소시키는 방법은 더욱 어렵습니다. 스터디 모임 참가자들이 공동으로 문제의식을 해소시켜 나가려면 모두 각자의 마음으로 문제의식의 흐름을 관찰할 수 있어야 합니다.



너무 사변적으로 설명하면 이해하기 어려우므로 앞에서 예를 든 객체지향 프로그래밍에서의 상속의 효용성에 대한 문제의식에 대해서 좀 더 알아봅시다. 객체지향 프로그래밍에 대해서 상속의 좋은 점과 좋지 못한 점에 대해서 논의한다고 합시다. 만약 어떤 사람이 재사용성이 가능하기 때문에 좋다고 의견을 제시했다고 합시다. 그러면, 재사용성이 과연 무엇인가라는 새로운 문제의식이 대두됩니다. 이것이 바로 아류 문제의식이라고 하는 것입니다. 즉, 2차 문제의식이라고 할 수 있죠. 물론, 1차 문제의식은 객체지향 프로그래밍에서  상속의 효용성은 무엇인가라고 할 수 있죠. 일반적으로 문제의식은 사실, 논리, 이치를 함유하는데 여기서 논리란 사유 알고리즘을 의미하는 반면 이치에는 개념이 포함됩니다. 물론, 이러한 문제의식의 근원에는 지혜가 자리하고 있다고 말할 수 있습니다. 지혜가 없이는 지식으로서의 사실과 이성으로서의 논리 그리고 개념을 포함한 이치를 조작하거나 처리 또는 구성 및 연결 그리고 해석과 이해를 할 수 없는 것이지요. 또한 지혜는 사실, 논리, 이치를 모두 포함합니다. 문제의식의 실체는 지혜에 바탕을 두고 있으며 지혜로서 만이 해결될 수 있는 것이지요. 지혜는 단순히 지능을 넘어서는 것으로 인간이 지닌 총체적이고 정신적인 힘이라고 할 수 있습니다. 여하튼, 1차 문제의식이 2차 문제의식을 생성시킨다는 것을 알 수 있습니다. 이것은 매우 일반적인 경우인데, 마치 나무가 가지를 펴면서 자라나는 것과 같습니다. 이렇게 아류 문제의식들을 해소시켜나감으로써 의식은 확장되며 사유체계의 폭은 넓어지게 되는 것이지요. 또한, 만약 누군가 재사용성은 생산성을 높인다고 하는 의견이 제시되었다면 과연 재사용성은 생산성을 높이는가라는 새로운 문제의식이 생성됩니다. 재사용성이 생산성을 높인다는 것은 많이 인정되고 있지만 유지보수와 관련해서는 그렇지 않다는 의견도 제시되므로 여러 가지 의견이 제시될 수 있습니다. 이와 같이 어떤 사실이건, 논리이건, 개념이건 모든 의문들이 하나의 문제의식을 구성하게 된다는 것이지요. 재사용성은 상속만이 아니라 함수를 통해서도 얻을 수 있습니다. 하나의 함수를 정의한 후 여러 번 호출해서 사용할 수 있으므로 이 또한 거시적인 관점에서는 재사용성을 향상시킨다고 할 수 있지요. 또한 함수들의 견지에서는 함수를 지나치게 잘게 쪼개서 많이 작성해 두면 오히려 프로그램 수정하고 유지보수하기 어려우므로 생산성을 저하시킬 수 있다는 의견이 제시될 수 있습니다. 스터디 모임을 하게 되면 정말 별난 발상들이 많이 오가게 됩니다. 전혀 생각지도 않은 아이디어가 나오거나 사유 방식이 나오기도 합니다. 물론, 지나치게 주제와 벗어난 방향으로 이야기가 진행되면 안 되나 가급적 폭 넓은 사유를 통해서 주제에 대해서 깊이 있게 사색하는 것은 요긴합니다. 중요한 것은 문제의식이 문제의식을 파생시키며 그 파생된 문제의식에서 다시 새로운 문제의식이 파생된다는 것이죠. 이와 같이 연속적으로 파생되는 문제의식들을 꿰뚫어 보는 시야를 얻는 것이 중요합니다. 마치, 책 한 권을 처음부터 끝까지 훤하게 꿰뚫어 아는 것이 중요한 것처럼 말입니다. 사실, 책이라는 것도 하나의 거대한 주제를 중심으로 여러 가지 문제의식들을 연이어서 풀어놓은 것이라 말 할 수 있거든요. 좀 더 확실히 이해하기 위해서 또 다른 문제의식을 예를 들어봅시다. 예를 들어, 키보드로 A를 입력할 때 A가 PC에 들어가서 화면에 나오기까지의 과정이 어떻게 되는가라는 문제를 놓고 궁리한다고 합시다. 즉, 문제의식은 “과연 키보드로 A를 입력할 때 A가 PC에 들어가서 화면에 나오기까지의 과정이 어떻게 되는가?”에 대한 사유라고 할 수 있습니다. 이 문제의식을 해소시키기 위해서는 키보드의 작동원리에서부터 컴퓨터 메인보드의 버스 메커니즘 그리고 ROM 바이오스, 인터럽트 체제, 디바이스 드라이버, DOS 및 윈도우 운영체제 그리고 비디오 카드 등에 이르기까지 다양한 지식을 알고 있어야 합니다. 따라서 이 문제의식은 다시 여러 개의 아류 문제의식으로 분할 되게 됩니다. 그리고 이러한 문제의식들이 모두 해소됨으로써 자연스럽게 전체 문제의식이 해소가 되는 것이지요. 물론, 아류 문제의식들을 종합하는 능력이 필요하죠. 그리고 지금까지의 글을 통해서 문제의식들 간의 의존성 문제도 이해가 가셨으리라 생각합니다.



공자님의 유가(儒家)에서는 신종추원(愼終追遠)이라는 말이 있습니다. 이 말의 의미를 글자 그대로만 해석한다면 “무슨 일이든 끝을 내는 것을 삼가고 멀리 추구하라”는 가르침입니다. 이는 서양철학자 베르그송이 말한 연속성 또는 지속성의 개념과 비슷합니다. 실존은 정적이기 보다는 동적이라는 점을 시사합니다. 아마도 이는 끊임없이 움직이는 연속성으로 삶을 이해해야 한다는 것이겠지요. 붓다(Buddha, 석가모니 부처님)의 가르침에도 붓다께서 열반하실 때 마지막 말씀들 중의 하나가 성인(聖人)의 경지에 도달할 때까지 끝임 없이 노력하라는 가르침이었습니다. 필자의 대학 선배가 스터디 모임에서 “도저히 모르겠다”라고 한 것은 바로 모든 문제의식이 해소가 되도 아직 해소되지 않은 무엇인가가 남아있다는 것이지요. 필자도 항상 무슨 문제가 해결되었더라도 만족하지 않고 또 다른 문제를 찾아 나서려고 노력합니다. 마찬가지로, 스터디 모임에서 생성되는 모든 문제의식들은 단편적이기 보다는 또 다른 문제의식들을 위한 초석이 됩니다. 우리들은 프로그래밍의 삶에서 시선을 돌려 조금만 우리 자신을 성찰한다면 삶을 통해서 끊임없는 문제의식들 속에서 살아감을 체인하게 될 것입니다. 스터디 모임 참가자들은 문제의식들을 해소시키는 법을 배우고 동시에 그러한 지혜를 연마하여 삶 속에서라도 조금이라도 도움이 된다면 정말 가치 있을 것입니다.



한편, 스터디 모임 참가자들은 서로 다양성 속에서 통일성을 추구해야 하며, 즉, 다양성을 아우르는 공통된 기반 철학을 이해해야 하며, 항상 문제의식을 해소시키는 방향으로 의견을 제시해야 합니다. 비약이 심해도 안 되고 거리가 먼 이야기를 해도 안 됩니다. 이것은 서로의 사유 알고리즘을 고도로 정립시키는 과정이 될 수 있으며 상당히 노련한 인식 구조와 이해 구조를 얻게 됩니다. 모임 리더는 항상 토론의 주제와 문제의식을 일관성 있게 진행시켜 나가도록 해야 하며 지엽적인 영역으로 빠지는 것을 방지해야 합니다. 즉, 스터디 모임의 모든 이들은 항상 문제의식을 공유하며 이를 서로의 사유구조를 통해 병렬처리로 해소시켜 나가야 합니다. 서로에게는 동기화도 중요하며 호흡과 마음의 일치가 중요합니다. 토론에 진지하게 몰입하면 스터디 모임 참가자들은 문제의식의 흐름을 관(觀)하게 됩니다. 즉, 문제의식이 해소되어가는 전체적인 과정을 심상으로 그릴 수 있으며 어떻게 문제가 해결되어지며 문제가 함유하는 본질과 제반사항이 표출되는 것을 이해하게 됩니다. 지금까지의 이야기는 비교적 스터디 모임 참가자들의 토론과 사유를 사변적 이성으로 서술하였는데, 실제로 이와 같은 스터디 모임이 진행이 안 되더라도 여러분의 스터디 모임에서 이와 같은 방식을 참고하면 많은 도움이 될 것입니다. 필자가 여러 번의 스터디 모임을 통해서 배운 것은 바로 이와 같은 토론과 사유 방법입니다. 그리고 여러분 나름대로의 토론과 사유에 대한 훌륭한 방법론 창안해 내는 것도 중요합니다. 마치, 소프트웨어 개발 방법론을 창안해 내듯이 말입니다.



앞에서 말씀드린 바와 같이 스터디 모임이 어떤 불협화음 없이 강물이 흐르듯 유유하게 진행되면 얼마나 좋겠습니까? 하지만 그것이 실제로는 불가능한 경우가 많습니다. 그것은 스터디 모임 참가자들이 서로 다른 문제의식을 가지고 있으며 문제의식을 해소시키는 서로 다른 사유알고리즘을 가지고 있기 때문입니다. 또한 스터디 모임 참가자들 모두가 합일된 마음으로 능숙하게 문제의식을 해소시켜 나가는 방법에 대한 경험이 부족하기 때문이라고 생각합니다. 그리고 스터디 모임은 혼자서 문제를 해결하는 것이 아니라 공동으로 참가자들의 사유능력을 최대한 활용하여 병렬처리로 해결해야 합니다. 따라서 스터디 모임에서 조정자(Coordinator:의견들을 종합하는 사람)겸 중재자(Mediator:언쟁을 해소시키는 사람)는 매우 중요하다고 할 수 있습니다. 또한, 스터디 모임이 제대로 동작하기 위해서는 스터디 모임은 모든 참가자들의 의견들을 하나로 아우르는 정합적 구조를 창출해 내는데 주력해야 합니다. 즉, A1라는 의견이 있고 A2 라는 의견이 있을 때 이러한 의견들을 모두 하나로 아우르는 보다 큰 차원에서의 의견 수렴을 모색해야 합니다. 이것이 스터디 모임을 원활하게 이끌어 가는데 매우 큰 역할을 합니다. 실제로 스터디 모임 시 의견들이 분분해 지고 의견들이 갑자기 나타났다가 사라지는 경향이 많기 때문입니다. 될 수 있는 한 중도(中道)를 지키면서 스터디 모임의 리더가 분분해지는 의견들을 조율하고 원활히 모아서 하나로 아우를 수 있도록 할 필요가 있습니다. 물론, 다양성이 중요하므로 서로의 의견에 대해서 서로 존중하는 자세가 필수적입니다. 또한 상황에 따라 다양하게 해석하는 것도 필요합니다. 그러나 어느 상반되는 대립적 주장들에 대해서 한 가지 주장을 선택해야 할 때는 되도록  경험이 많은 분의 의견을 중시하되 이것이 불가능하면 많은 사람들의 의견을 수렴하는 것이 필요합니다. 이러한 민주주의적인 의견 수렴에도 팽팽히 의견이 맞서면 모임 리더의 리더십으로 통솔해야 합니다. 예를 들어, 객체지향 프로그래밍에서 Delegation 방식과 Inheritance 방식의 장단점에 대해서 어느 것이 좋다는 식으로 의견이 나뉘어졌을 경우, 상황별 장단점이 있지만 같은 상황에 대해서도 의견이 분분하게 나뉠 수 있습니다. 즉, 누군가 잘못 알 수도 있고 구현 환경과 실무 환경에 따라 차이가 발생할 수 있을지 모르며, 개인적인 취향에 따라 장단점이 다를 수 있습니다. 따라서 모임 리더가 이에 대해 의견을 전체적이고 거시적인 관점에서 잘 종합적으로 정리해야 합니다. 물론, 스터디 모임 참가자들이 모두 모임 리더에게만 의지할 것이 아니라 자신들도 적극 스터디 모임의 조정자와 중재자가 되도록 노력해야 할 것입니다. 그리고 모임 리더 또는 스터디 모임 참가자가 조정자와 중재자가 되기 위해서는 비교적 기술지식에 대해 다양한 경험이 있어야 합니다. 그리고 만약 모임 리더도 자신이 없을 경우에는 차후에 모임 조언자를 찾아뵙고 가르침을 구하거나 스터디 모임 참가자들이 모여서 서로 해결되지 않았던 사안에 대해서 직접 컴퓨터에 프로그래밍을 해가면서 테스팅 해 보는 것도 괜찮습니다. 소프트웨어 스터디는 진지한 사색인 동시에 실증적이어야 하기 때문에 반드시 프로그래밍 코드가 작동하는 것을 눈으로 보고 배우는 자세를 갖추는 것이 중요합니다. 스터디 모임을 통해서 함께 책을 공부하고 사색함으로써 실증적 경험에 대한 이론적 지식체계를 쌓고 잘 모르는 부분이나 불확실한 부분에 대해서는 다시 실증적 경험을 통해서 사색한 바를 검토해 볼 수 있습니다.


지금까지의 내용을 정리해 봅시다. 많은 분들이 아시겠지만 스터디 모임은 자신이 지식이 많다거나 자신이 훌륭하다는 것을 주장하기 위해서 모인 것이 아니라 서로에게서 무엇인가 배우려고 모였습니다. 따라서 주장을 내세워 자신의 주장을 반드시 다른 사람들에게 관철시키려고 하지 마시고 다양성과 개연성에 바탕을 둔 의식의 확장에 초점을 두어야 합니다. 자신에게 필요하다면 언제든지 남들의 사유구조를 바르게 이해하여 필요하다면 자신의 사유구조에 유연하게 적응시킬 수 있는 포용력이 필요합니다. 참고로, 포용력에 대해서 좀 더 말씀드리자면 필자가 대학교 때 필자의 대학 선배가 한 분 있었는데 이 분은 정말 제가 존경하는 선배님이었습니다. 자랑은 아니지만 저는 지금까지 존경하는 분들을 정말 많이 만났다고 생각합니다. 물론, 이 선배님과도 프로그램을 개발하는 프로젝트를 통해 스터디 모임을 갖기도 하였습니다. 이 선배는 프로그래밍 실력도 출중했지만 자신이 아는 것을 정말 자랑하지 않고 아낌없이 나누어 주었습니다. 이 선배가 학술지에 운영체제 기사를 집필하였을 때 운영체제의 포용력을 높이 평가하였습니다. 최대한 많고 다양한 프로그램들을 수용할 수 있는 포용력 있는 운영체제를 극찬한 것이라 생각합니다. 이 때 이 선배로부터 배운 것은 포용력의 중요성이었습니다. 이 선배는 이 포용력이라는 화두를 저에게 던져주고 떠났습니다. 그러니까 286 PC가 도입 된지 얼마 후인 1991년 당시 선배가 이러한 발상을 했다는 것은 저에게 많은 깨우침을 주었습니다. 그리고 세월이 지나면서 인생에 있어서의 실제적인 포용력은 학문과 기술을 초월하여 인생의 의미를 진지하게 성찰하면서 배울 수 있었습니다. 즉, 너그럽지 못하면 삶을 제대로 살아갈 수 없다는 것이지요. 물론, 스터디 모임의 참가자들 모두에게 있어서 서로를 이해하는 포용력은 더 말할 것도 없지요. 문제는 이에 대한 실천입니다. 과연 어떻게 포용력을 갖는 프로그래머가 될 수 있고 스터디 모임이나 팀에서 포용력 있는 참가자가 될 수 있을까요? 과연 포용력의 실체란 무엇일까요? 과연 무조건 남들의 잘못된 의견까지 다 포용하는 것이 포용력일까요? 물론, 그렇지는 않다고 생각합니다. 따라서 우리는 남들의 의견을 어디까지 포용해야 하고 자신의 의견을 어디까지 주장해야 하는지 알아야 합니다. 물론 이것은 프로그래머가 잘 하는 수학적인 논리에 의해서 결정되어질 문제는 아니라고 생각합니다. 즉, 이 문제는 부족하지만 필자의 경험상 조용하고 진지한 마음으로 그리고 보다 보편타당한 진리에 근거하여 많은 사람들의 의견을 아우르는 전체적인 관점에서 깨달아야 할 것입니다.



이제 여러분들께서는 스터디 모임이 어떤 의미가 있으며 어떻게 도움이 되는지 그리고 어떻게 하면 효과적인지 미약하나마 어렴풋이 라도 인식했을 것입니다. 물론 지금까지의 내용은 여러 번의 다양한 스터디 모임을 통해서 제가 보고 듣고 경험한 바탕으로 긍정적인 측면을 중심으로 정리해 본 것입니다. 따라서 스터디 모임의 부정적인 측면도 존재합니다. 즉, 한 가지 예로써 지나치게 스터디 모임에 집착하면 스스로 문제를 해결해 내려고 하는 의욕이 떨어 질 수 있습니다. 또 한 가지는 스터디 모임이 가져다주는 자유정신에 푹 빠져 직장생활에서의 팀웍이 과거의 스터디 모임 경험보다 부족하다고 느껴 질 때 직장생활에서의 팀웍에 회의감을 줄 수도 있다는 점입니다. 일반적인 회사에서의 팀웍을 통해서 자유정신을 실현하는 것은 어렵습니다. 남다른 노력이 필요하죠. 스터디 모임도 효과적이 되려면 참가자들이 많은 경험이 필요한 것처럼 직장생활에서의 팀웍도 보다 효과적이 되려면 노력과 어느 정도의 시간이 지나야 합니다. 한편, 필자와 다른 방식에 의해 스터디 모임을 하시는 분들도 계실 것입니다. 따라서 필자의 글에 너무 집착하실 필요는 없습니다. 필자는 지금까지 학문이나 프로그래밍 기술을 초월하여 인생의 선지식들을 많이 만났습니다. 특히, 거의 모든 선지식들은 스터디 모임을 통해서 만났습니다. 참으로 기연(奇緣)이 아닐 수 없습니다. 스터디 모임은 필자의 삶을 완전히 변화시켜 주었고 그것도 한 번이 아니라 여러 번 긍정적으로 변화시켜 주었습니다. 필자는 나름대로 스터디 모임을 통해서 많은 것을 배웠기 때문에 독자 제현님들게도 도움이 될까 하여 필자의 부족한 경험이지만 글로 정리해 보았습니다. 스터디 모임의 실제적인 효과는 독자 제현님들이 스터디 모임을 내 몸처럼 아끼며 깊은 마음을 쏟을 때 그리고 스터디 모임에 자부심과 긍지를 갖고 올바른 명예로움을 간직하면서 적극적으로 스터디에 참여할 때 직접 체득할 수 있는 것입니다. 그러므로 제가 아무리 많은 이야기를 해도 독자 제현님들이 직접 체득한 것만 같지 못할 것입니다. 이 점 당부 드리면서 저의  글이 조금이나마 독자 제현님들의 스터디에 도움이 된다면 필자에게 가르침을 주셨던 분들의 은혜를 조금이나마 갚았다고 생각합니다.

출처 : '웰빙족 고수 프로그래머의 길 [발췌]' - 네이버 지식iN
http://kin.naver.com/knowhow/entry.php?eid=6hqKnELwKio1ivXRGDxCo38A7aOH82ra