의도적 수련 1 – 고수, 무술과 프로그래밍에 대한 소고

<월간 마이크로소프트웨어> 2005년 4월호와 6월호에 실린 《함께 자라기》 김창준 저자님의 글입니다. 개발자들이 의도적 수련을 늘릴 수 있는 방법을 엿볼 수 있습니다.

‘의도적 수련 2 – 프로그래머에게 적합한 의도적 수련’ 보러 가기

——————————————————————————————————-

이 글은 최근 있었던 제6회 자바 개발자 컨퍼런스에서 필자가 발표했던 ‘테스트 주도 개발 수련법’의 내용 중 몇 가지에 대해 상술하고 추가한 것이다. 총 2회에 걸쳐 연재될 예정인데, 첫 번째의 무게 중심이 무술 쪽에 가깝다면 두 번째는 프로그래밍 쪽에 가깝다고 할 수 있다. 그리고 무술과 프로그래밍의 관계를 설명함에 있어 필자가 수련하는 기천이라는 무술에 대한 언급이 몇 번 있는데, 이는 특정 무술을 선전하거나 혹은 그 무술이 다른 무술에 비해 월등하다는 주장을 하거나 신비화하려는 의도는 전혀 없음을 미리 밝혀둔다. 특정 무술에 대한 언급이 약간 눈에 거슬리더라도 마소는 무술 잡지가 아니라 프로그래밍 잡지라는 맥락을 상기하고 가볍게 읽어 주길 바란다.

 

 

고수, 무술과 프로그래밍에 대한 소고

필자는 무술을 수련해 오고 있다. 처음 무술의 ‘武’자를 몸으로 접한 것은 초등학교 입학 전후로 기억하는데, 당시 대한민국 남아의 필수 교양 스쿨이었던 태권도 도장을 통해서였다. 고등학교는 태권도 수업 시간이 있는 좀 독특한 학교였는데, 그 때 단증과 함께 명예의 검은 띠를 얻었다. 대학에 들어와서는 손이 그리는 태극 모양에 매료되어 기천이라는 전통무예를 배우기 시작했다. 군대에서는 고참의 눈을 피해 날마다 저녁 자유시간에 창고에서 몰래 수련을 하기도 했다. 현재까지 계속하고 있는 이 기천이라는 무술은 시작한지 벌써 10년이 넘었다.

프로그래머로서 무술을 한다는 것이 무슨 상관이 있냐고 혹자는 반문할지도 모르겠지만, 경험에 의하면 무술은 음으로 양으로 프로그래밍에 도움을 주고 있다. 먼저 간접적으로 얻는 깨달음에 대해 이야기해보자.

 

무술에서 얻는 영감

무술에서 얻는 부차적인 이득이 하나 있다. 필자는 마소 2003년 1월호에서 개발자에게『훈민정음 해례본』을 추천한 바 있다. 당시 기사의 일부분을 인용해본다.

한글은 하나의 시스템이다. 기능과 모양새가 한 박자에 맞춰간다. 다양한 상징과 은유가 일관된 체계를 구축하며 들어 있다. 필자는 이제까지 한글처럼 완벽한 시스템을 본 적이 없다. 디자인을 하는 사람이나 어떤 시스템을 만들려는 사람에게 이 책이 큰 계발이 되리라 생각한다. 무형의 것을 어떻게 자연스럽게 유형화해서 표현할 것인가, 추상적인 개념들을 어떻게 규칙적으로 체계화할 것인가 하는 데에 큰 공부가 된다.

당시 담당 기자로부터 몇 번 확인을 받아야 했다. 정말 이 책을 추천하는 게 맞느냐. 다른 책으로 바꿔줄 수는 없겠냐. 하지만 필자는 무술을 하면서 훈민정음 해례본에서 느꼈던 치밀함을 다시 맛볼 수 있었다. 다음은 공부론에 대해 도올고신에 연재를 했던, 필자의선배 윤종권 씨의 글이다. 윤종권 씨는 무술과 음악에 대해 퍽이나 깊은 수준을 갖고 있다.

여기서 우리가 의외로 명확하게 인식하지 못하는 인체의 상식 하나를 소개하고자 한다. 그것은 우리가 사지를 몸통에서 멀리 뻗을 때(伸)는 숨을 내쉬고(呼息), 몸 쪽으로 당기거나 굽히는(屈) 동작을 수행할 때에는 숨을 들이쉰다(吸息)는 사실이다. 이는 다음과 같은 단순한 실험을 해보면 단번에 이해될 것이다. 두 사람이 서로 악수한 상태에서 손을 서로 잡아당길 때, 한쪽이 숨을 내쉬면 그는 곧 상대방 쪽으로 끌려가고 만다. 팔을 접으면서 잡아끄는 행위는 屈의 움직임이며, 이 때는 들숨이 필요하기 때문이다. 반대로 서로 손을 맞잡고 밀어내는 경우, 한쪽이 숨을 들이키면 그는 뒤로 밀리게 된다. 팔을 앞으로 내미는 신장(伸張) 동작은 날숨과 연동되어 있기 때문이다. 참고로 숨과 신근(伸筋)의 연동은, 권투에든 야구에든 첼로 연주자의 활 긋는 동작에든 모두 동일하게 적용된다.

조던은 결국 다음과 같은 이유에서 혀를 내미는 것이다: 그는 돌파시에 혀를 내밀고 달림으로 인해서 “날숨”의 상태(정확하게는 숨을 내쉰 직후의 호흡정지 상태)를 인위적으로 지속시켜서, 伸筋(등 부분, 다리의 앞면, 팔의 뒷면 등의 근육)의 퍼포먼스를 최대한으로 높인다. 이 시점에서 주력(走力)이 향상된다. 점프할 때 혀를 빼무는 것은, 전신의 脫力(불필요한 屈筋의)을 촉진하고 몸통 내부에 일정한 상태를 조성하여 — 이 부분은 구체적으로 기술할 수 없으나, 소위“浮身”이라고 불리우는 무술의 한 테크닉과 거의 일치한다 — 더 높고 멀리 점프할 수 있도록 도와준다.

윤종권, 마이클 조던이 혀를 내민 까닭은?, 도올고신 27신

윤종권 씨는 이 글에서 조던이 혀를 내미는 이유를 운동역학적인 면에서 분석하면서, 몸의 특성과 그것을 운용하는 방식 등을 하나의 디렉트 시스템으로 통합하여 보고 있다. 그런데 본인은 기천 운동을 하면서 기천의 수들이 이런 체계적이고 치밀한 시스템 원리를 따르고 있다는 것을 점점 더 절감하고 있다. 기천의 수는 일종의 부트스트랩핑과 비슷하다. 부트스트랩(bootstrap)은 신발 뒷축의 가죽 끈을 말하는데, 부트스트 랩핑은 스스로 자기의 신발끈을 당겨서 자신을 공중에 띄워야 하는 것과 같은 모순적 상황을 일컫는다.

기천은, 나아가서 모든 무술은 어떻게 하면 조직이 스스로를 개선할 수 있을까 하는 질문과 마찬가지로 어떻게 하면 자신의 몸으로 더 많은 힘을 낼까 하는 부트스트래핑적인 고민을 담고 있다. 기천의 수는 땅을 박차는 반작용의 힘을 많이 이용한다. 동시에 자신의 몸을 여러 개의 부분들이 연결된 것처럼 다루면서 회전력과 비트는 힘을 이용해서 힘을 배가시킨다. 마치 수영선수가 출발할 때 속도를 얻기 위해 벽면을 박찰 때에 벽면이라는 외부요소를 이용하듯이, 기천에서는 자신의 팔이나 다리, 허리 등을 일시적으로 마치 외부요소인 것처럼 이용해서 자신의 힘을 불리는 것이다. 그 치밀함은 정말 놀라울 정도이다. 그래서 기천 수를 연습하면서 많은 계발과 영감을 얻고 있다. 그런 영감의 몇 가지를 소개한다.

무술과 프로그래밍은 모두 시간의 예술이다. 무술에서 고정된 동작이란 그 자체로 의미가 없다. 주먹은 앞으로 나가야 타격을 할 수 있는 것이다. 프로그램 역시 시간의 흐름 속에서만 의미가 있다. 프로그램 실행이란 공간적 배치를 시간적 배치로 바꾸는 것이다.

한 동작을 거듭 수련하면 할수록 더 복잡해지는 것이 아니라 더 소박하고 단순해진다. 필요없는 잔 동작이 없어지고 핵심만 남는다. 전설의 검객 미야모토 무사시는 자신의 오륜서에서 “필요없는 것을 하지 마라”고 했다. 프로그램도 계속 다듬으면 오히려 단순해지는 것 같다.

무술은 허실, 음양의 양태의 조합과 반복이다. 주먹을 뻗으면 실을 만들면서 나의 허리 쪽에는 허가 생긴다. 오른손이 올라가면 왼손이 내려간다. 왼손이 올라가면 왼발은 뒤로 간다. 왼발이 뒤로 가면 오른발은 앞으로 간다. 컴퓨터 시스템에도 이런 허실과 음양의 관계 양상이 존재한다. 전체 시스템에서 특정 컴포넌트가 실하다면 나머지 부분 중 허한 부분이 생기게 되고 그 부분을 보충해줘야 한다. 공수가 어울려야 한다.

범사(기천에서는 사범 대신 범사라고 호칭한다)가 시범을 보이면 그걸 따라한다. 하지만 뭔가 다르다. 양념이 빠진 느낌이랄까, 2% 부족한 느낌이다. 그러다가 문득 깨달은 것이 있다. 범사의 동작에는 흥과 리듬감이 있었다. 기천의 동작(특히 동공)은 ‘흥’이 나야 한다. 이것을 알고 나서 하는 동작은 훨씬 더 자연스럽고 쉬우면서도 힘이 난다. 흥이 나려면 리듬을 타야 한다. 흥을 내다보면 탈춤을 하는 느낌이 들기도 한다. 생명의 느낌에는 리듬이 있다. 이처럼 뛰어난 프로그래머를 관찰하면 흥이 난다. 리듬감이 있다. 옆에서“얼쑤!”라고 추임새를 해주고 싶을 때도 있다. 필자도 프로그래밍이 잘 될 때에는 박자가 잘 맞고 흥이 난다. 하지만 그렇지 않을 때에는 박자가 어긋나고 흥이 없고 살아 있는 느낌이 나질 않는다.

 

프로그래머의 스트레스

이번에는 무술에서 얻는 직접적인 효과에 대해 이야기해보자. 지식 노동자들은 스트레스가 많다. 특히 프로그래머라는 직업은 나날이 늘어가는 신기술의 홍수 속에서 가만히 있으면 뒤쳐지는 붉은 여왕의 스트레스(루이스 캐럴의『이상한 나라의 앨리스』에 등장하는 붉은 여왕에서 유래. 그 나라에서는 있는 힘을 다해 달려야만 제 자리에 머물 수 있다)가 이만저만이 아니다. 어디에선가 프로그래머는 5년에 한 번씩 자기가 아는 지식의 절반을 완전히 갈아엎어야 한다는 이야기를 본 것 같다. 그래서 이런 스트레스를 해소하는 방법은 꼭 필요하다.

필자는 몸으로 하는 무언가가 좋은 처방이라고 생각한다. 본인은 그 중에서도 특히 무술을 통해 스트레스를 해소하고 있다. 운동을 한 날은 마치 정신의 샤워를 한 느낌이 든다. 가장 좋은 아이디어는 샤워를 할 때 떠오른다는 유명 프로그래머들이 꽤 있는데, 정신의 샤워 역시 비슷한, 혹은 더 높은 효과가 있다.

세상에는 인과관계가 역으로도 성립하는 듯 보이는 경우가 종종 있다. 우리는 기분이 좋으면 웃는다. 상식적 견지에서 보면, ‘기분이 좋다’가 원인이면 ‘웃는다’가 결과가 될 것이다. 하지만 최근의 연구에 따르면 웃는 표정을 지으면 기분도 좋아진다고 말한다. 우리는 기분이 좋으면 육체적 활동을 한다. 하지만 반대로 육체적 활동을 하면 기분이 좋아지기도 한다. 우울증 치료의 가장 효과적 처방 중 하나가 바로 운동이다. 매일 계속하는 운동은 우울증 예방과 치료에 큰 도움이 된다.

스트레스 해소라는 정신적 측면뿐만 아니라 육체적인 측면에서도 큰 도움이 된다. 하루 종일 의자에 앉아서 일해야 하는 직업의 특성상 허리, 눈, 다리, 팔, 손목 등에 병이 걸리기 쉽다. 꾸준히 하는 운동이 있으면 그런 병 걱정이 없다. 또 몸이 조금 피곤해도 쉽게 풀린다.

 

알파파와 집중력

며칠 전 필자를 지도해 주는 범사님과 함께 집중력 검사를 받았다. 필자의 지우 중에 지상은 박사라고 계신데, 한의사 출신으로 다양한 공부를 하신 분으로 지금은 서울 근방에서 학습 클리닉을 운영하고 있다. 일전에 지 박사와 함께 기천 수련과 관련해 심박 측정을 했었는데 이번에는 뇌파 측정을 해보기로 했다.

머리에 전극을 연결하고 뇌파를 측정해서 집중력을 검사(혹은 트레이닝)하는 것인데(소위 바이오피드백이라고 알려져 있다) 스트리트파이터 류의 게임을 머리로 했다. 상대는 컴퓨터가 조종한다. 좌뇌, 우뇌 활성화 여부(알파파와 베타, 쎄타파의 비율)에 따라 캐릭터가 움직이고 공격을 한다. 뇌에서 어떤 패턴으로 알파파가 얼마나 강하게 나오느냐에 따라 공격의 종류가 달라진다. 복잡한 공격 기술일수록 만들어 내기가 어렵다. 꽤나 힘들긴 했지만 컴퓨터 상대를 이길 수 있었다. 꼭 영화 ‘매트릭스’의 한 장면 같았다.

이 게임이 어려운 이유는 자연스러움을 거스르기 때문이다. 일반적으로 이러한 종류의 대전 격투 게임을 할 때에는 뇌에서 알파파가 나오는 차분하고 평정한 상태를 잃기 쉽다고 한다. 하지만 그런 흥분되는, 혹은 몽환적 상황에서도 차분하게 집중을 하고 있는(보통 알파파 상태를 영어로 calm and focused attention이라고 한다) 상태를 유지해야 하기 때문에 어떻게 보면 모순이다. 필자의 생각으로는 무술의 고수는 실제 겨루기를 할 때에도 알파파가 나오지 않을까 한다.

이 알파파라고 하는 것은 우리가 보통 공부를 할 때 필요한 집중력과 직접적 관련이 있다고 한다. 학습장애 클리닉에 집중력 장애를 가진 학생이 부모와 함께 왔을 경우, 부모는 대부분 부인한다. “우리 애가 집중력이 부족하다고요? 말도 안돼요. 게임할 때 보면 누가 업어가도 모를 정도로 얼마나 집중을 잘하는데요.”그래서 국내의 연구자가 프로 게이머 대상으로 실험을 했다. 게임을 할 때 어떤 뇌파가 많이 나오는가. 쎄타파였다. 쎄타파 상태는 깨어 있는 것과 잠든 것의 중간 상태와 비슷하다. 그런데 이 쎄타파는 공부할 때 필요한 알파파와는 전혀 차원이 다르기 때문에 아무 도움도 되지 않는다는 것이 그 연구자의 말이다.

지 박사는 이런 몇 가지 실험 후, 필자와 범사님 두 사람 모두 상당한 집중 능력을 보여줬다고 말했다. 이는 기천 수련의 영향이라고 생각한다. 집중력이 높다는 것은 원하는 시점에, 심지어 주변에 방해요소(앞선 실험에서는 화면에서 번쩍이는 현란한 그래픽과 폭력성)가 있어도 알파파를 내도록 스스로 조절할 수 있다는 이야기이다. 프로그래밍에 몰입한 때에도 알파파가 나온다고 생각하는데, 그렇다면 당연히 이런 능력이 프로그래밍을 비롯한 대다수의 지적 활동에 많은 도움이 될 것이다.

 

건강과 프로그래밍

정신 건강이나 육체 건강이 프로그래밍과 얼마나 관련이 있을까? 필자는 그 관계가 무척 깊다고 생각한다. 예컨대 동일한 사람을 극심한 스트레스 아래에 놓고 일을 시킬 때와 그렇지 않을 때를 비교하면 그 사람의 퍼포먼스는 많은 차이가 난다. 본인이 주변을 관찰한 바로는 몸 상태에 따라 한 프로그래머의 성과가 서너 배 이상 차이가 났다. 주지해야 할 것은, 이런 효과가 개인이 아니고 조직에 영향을 끼치게 되면 파급효과는 제곱수가 된다는 것이다. 짜증이 극도에 이른 개발자나 몸살로 헤롱거리는 개발자와 함께 일해 본 경험이 있는 사람이라면 쉽게 고개를 끄덕일 수 있을 것이다.

궁금한 독자는 다음 실험을 해보시라. 주변 동료에게 간단한 프로그래밍 문제를 풀게 한다. 같은 시간을 주되, 한 번은 일요일 오후 편안한 시간에 풀게 하고 다른 한 번은 업무를 마치고 스트레스가 높고 피곤한 상태에서 풀도록 한다. 양자의 결과는 놀라우리만큼 차이가 크다. 후자의 경우, 프로그래머는 실수를 자주 하게 되며 그 실수가 되먹임되어 더 큰 실수가 생기고, 더군다나 아주 어처구니없는 실수를 잡아내지 못해 고생을 하고, 그래서 시간은 부족하고 스트레스는 더 늘어나며 그로 인해 다시 실수를 하는 악순환에 빠지게 된다. 세미콜론 하나를 빠트려서 두 시간 삽질해 본 경험을 한번쯤은 해보지 않는가. 길을 걷다가 발을 헛디디는 순간 우리는 숨을 들어 마시게 되고 몸의 균형이 깨어진다. 이 때 누군가가 그 사람을 타격하면 이건 정말 치명타가 될 수 있다. 기의 균형이 깨어진 상태, 정말 무방비의 시점이다. 한 번 발을 헛디뎌 헉하는 순간 주먹을 맞으면 그냥 KO당하는 수가 있다. 그렇게 센 주먹일 필요도 없다. 정신 활동도 이와 비슷하다.

 

고수가 되는 것이란

앞서 살펴본 바와 같이 무술을 꾸준히 하면 육체와 정신에 여러모로 긍정적인 영향을 준다. 그렇다면 이런 무술의 고수는 어떤 사람들일까? 질문을 조금 일반화해 보자. 고수는 어떤 사람들일까? 현대 한국어에서 고수는 한 방면에 매우 뛰어난 사람을 일컫는 비유적 표현으로 많이 쓰이고 있다. 간단히 말하자면 전문가인 셈이다.

필자가 만든 말 중에 ‘메리 분석하기(AnalyzeMary)’라는 게 있다(메리에겐 뭔가 특별한 것이 있다라는 영화에서 따온 말이다). 우리 주변에는 메리처럼 뭔가 특별한 사람들이 있다. 남들과 비슷하게 일을 하는 듯하면서 늘 더 나은 성과를 보이는 사람들이다. 그런 사람을 볼 때 대다수의 사람들은 그 사람은 특별하다는 감탄사를 외치고 나는 왜 그들처럼 될 수 없을까 한탄하고, 곧 까맣게 잊는다. 다음은 필자가 노스모크에 썼던 글이다.

그들을 주의 깊게 관찰하고, 분석하라. 그리고 무엇이 그들을 그렇게 ‘특별하게’ 하는지 알아내고 그걸 배워라. 또 그들이 어떻게 그렇게 특별해질 수 있었는지 배워라. 조만간 당신도 그들이 하는 것을 할 수 있을 것이다.

……

나는 지하철에서 물건을 파는 사람들을 매일 본다. 그러나 부산에서 봤던 구두솔(구두약이 나오는) 파는 아저씨를 도무지 잊을 수가 없다.

그 아저씨는 내가 타고 있던 칸에서만 50개를 넘게 팔았다. 아주 경이로운 장면이었다(영화의 한 장면 같았다). 도대체 어떻게 하길래 저 사람은 물건을 이렇게 잘 파는 것일까. 내게는 그 사람이 세일즈의 달인으로 보였다. 나는 세일즈를 하는 사람이 아니다. 하지만 세일즈의 기본은 설득과 유혹이다. 설득과 유혹은 내가 나날이 사용하는 기본적인 삶의 도구들이다. 그래서 그 사람을 ‘Analyze Mary’해보았고 거기서 많은 통찰과 영감을 얻었다. 그 사람은 좌석에 앉은 사람들의 신발을 일일이 자신의 구두솔로 닦아주었다 — 한 사람도 빼놓지 않고(아 물론 운동화와 샌들은 빼고). 그걸 싫어하는 사람들이 대부분이지 않겠냐고 생각하겠지만 상황은 정반대였다. 저마다 반짝거리는 자신의 신발을 이리 저리 돌려 보면서 신기해했다. 그 사람이 신발을 닦아준 사람의 90%는 모두 구입을 했다. 상품과 세일즈 기술이 잘 결합된 좋은 예였다.

나는 여기 등장한 구두솔 아저씨를 고수로 생각한다. 그 아저씨의 고수됨은 이소룡의 고수됨과, 또 베토벤의 고수됨과, 다익스트라의 고수됨과 크게 다르지 않다.

 

공부와 쿵후

여기에서 잠깐 공부와 쿵후의 관계에 대해 짚고 넘어가도록 하자. 이에 관해서는 도올 김용옥의『태권도철학의 구성원리』라는 책이 무척 탁월하다. 그 책의 설명을 인용한다.

“To study”의 번역술어로서 우리 현대어에 자리잡은 이“공부”(工夫)라는 말의 원뜻은 “德의 得함을 지향하는 모든 디시플린(훈련)”을 의미하는 것으로 그 원의는 사실 중국말의 “쿵후”에 더 잘 보존되어 있다. 우리 말의 “工夫”의 중국 발음이 “kung-fu”이며 이것을 우리말로 簡化하여 표기한 것이 곧 “쿵후”다. (工夫=功夫=功夫). “ 쿵후”는 공부다. ……

중국말(혹은 우리 옛 한문)에 있어서 쿵후는 인간의 몸의 達人的 경지에 대하여 광범위하게 두루두루 쓰이는 표현으로서 우리가 지금 “쿵후”라고 부르는 무술의 한 형태는 쿵후라는 일반명사의 개념에 포섭되는 광범위한 개념 중의 한 하위개념일 뿐이다. 지게를 잘 지는 노인의 지팽이질도 쿵후요, 호리병에 한 방울도 흘리지 않고 기름을 떠넣는 기름장수의 손놀림도 쿵후다. …… 이러한 인간의 몸의 동작의 장난에 있어서 高手와 下手의 차이를“쿵후”라고 표현하며, 이 쿵후는 오랜 시간의 축적을 통하여 高手의 몸이 얻은(得) 德인 것이다.

관심있는 독자들은 꼭 일독하기를 권한다. 도올은 여기에서 우리가 일상어에서 공부라고 부르는 뇌의 기호 조작(symbol manipulation) 능력과 무술의 쿵후 능력, 더 나아가 빨래터의 아낙이 능숙하게 방망이질을 하는 것을 모두 몸(Mom)의 수련이 이룬 경지라는 동등한 차원에서 볼 수 있다고 하는 것이다.

 

수련의 필요성

고수가 되려면 어떻게 해야 하는가. 필자가 노스모크에 썼던 글을 인용하겠다.

고수가 하는 것을 배우거나 따라하려고 하지 말고, 그들이 어떻게 고수가 되었는지를 배우고 따라하라.

대부분의 사람들은 어떤 분야의 전문가가 되기 위해 현재의 전문가들이 하고 있는 행동을 따라하려고 한다. 우선은 따라하기가 힘들 뿐만 아니라, 설령 똑같이 따라하게 되더라도 그것은 전문가 흉내내기일 뿐 전혀 전문가적이지 못하다. 행동 하나하나의 맥락을 이해하지 못하기 때문이다.

문제의 해결법만 달달 외운 사람은 세상의 모든 문제가 그 해결법을 적용할 대상으로 보인다. 또 새로운 문제에 직면했을 때 창의적이고 상황에 맞는 전문가적 해결안을 제시하지 못한다. 컴퓨터 프로그래밍에서 좋은 해결안들만 사전처럼 모아둔 디자인 패턴을 공부하는 사람들의 병폐가 대부분 여기에서 온다.

인공지능에서 전문가 시스템(Expert System)이라는 것이 초기의 장밋빛 기대와는 달리 별 신통한 결과를 주지 못한 이유가 이것이기도 하다. 전문가 시스템 구축을 위해 특정 분야의 전문가 수백 명을 몇 년에 걸쳐 인터뷰와 관찰을 계속한다. 그 전문가들은 자신이 일을 하는 원칙과 법칙을 서술해야 한다.

즉, 영어 전문가라면 어떤 문장에서 어느 경우에 무관사인지, 정관사인지 부정관사인지 등을 법칙으로 설명해야 한다(우리는 이런 것들을 달달 외우려고 노력한다). 이미 많은 연구에서 밝혀졌지만 의외로 전문가들은 전혀 법칙에 의해 행동하지 않는다. 우리가 질문을 했을 때 전문가들은 법칙을 즉석에서 자신의 평소 상황에서 유추, 만들어내어 설명해주고 있다. 우리가 이 법칙을 모두 외운다고 해도 전문가의 행동을 할 리 만무하다. 전문가의 머리 속에는 그런 법칙들은 물론 이제까지 그가 축적해온 엄청난 영어 경험이 각 상황성과 함께 적절히 정리되어 있기 때문에 그들의 머리와 법칙만 외운 우리의 머리에는 큰 간극이 존재한다.

아마도 우리가 배워야 할 것은 그들이 전문가에 도달하기 위해 밟았던 과정일지도 모른다. 우리의 목표는 몇몇 특정 시점에서 전문가를 흉내내는 것이 아니고 스스로 전문가가 되는 것이기 때문에.

고수가 되려면 수련이 필요하다. 단순히 현재 고수가 하는 것을 따라하는 것으로는 부족하다. 사실 제대로 따라하기가 거의 불가능하다. 하지만 고수가 현재 무엇을 하는가에 대한 정보도 매우 귀중하다. 등대가 되어줄 것이기 때문이다.

무술처럼 프로그래밍에도 수련이 필요하다. 이 생각을 갖게 된 계기는 무술을 수련하면서, 그리고 인지심리학을 공부하면서였다. 인지심리학에서는 전문가에 대한 연구(전문성, expertise에 대한 연구라고 한다)를 몇십 년 전부터 해오고 있다. 이 때 연구 대상은 주로 전문직이라고 할 수 있는 음악 연주자, 의사, 판사, 운동선수, 체스선수, 프로그래머 등에 해당한다. 그렇다. 프로그래머! 인지심리학 분야에서는 꽤 오래전부터 고수 프로그래머에 대해 연구해 오고 있다.

이런 전문성 연구의 목표는 크게 잡아 두 가지이다. 전문가와 비전문가가 그 사고 과정과 문제 해결, 행동 방식에 있어 어떻게 다른가. 어떻게 비전문가를 전문가로 만들 수 있을 것인가.

 

의도적 수련

필자는 전문성 연구 중에서 특히 앤더스 에릭슨(Anders Ericsson)이라는 사람의 연구결과에 주목한다. 그는 퍼포먼스와 수련 시간 간에 밀접한 관계가 있다고 말한다. 아니, 좀 더 극단적으로 한 영역에서의 경험은 일, 놀이, 수련 세 가지로 나눌 수 있는데, 이 중 수련에 투자된 시간만이 퍼포먼스 향상과 관련이 있다고 한다.

프로그래밍 쪽으로 말한다면, 회사에서 프로그래밍하는 시간이나 심심풀이로 프로그래밍하는 시간은 내가 고수가 되는 데에 직접적 공헌을 하지 못한다는 이야기가 된다(사실 일, 놀이, 수련의 구분은 엄격할 수 없고, 겹쳐진 영역이 존재할 수 있다). 특정 영역에서 개인이 다다를 수 있는 최고 수준의 퍼포먼스는 경험을 많이 한다고 자동으로 획득되지 않으며 심지어 많은 경험을 했던 사람일지라도 개선하려는 의도적인 노력의 결과로서 퍼포먼스 수준이 향상될 수 있다고 에릭슨은 말한다. 피터 드러커는 이노베이터의 조건에서 다음과 같이 말한다.

세상에 음계(etude-연습곡)를 연습하는 것보다 더 지루한 일은 없다. 그러나 위대한 연주자일수록 하루도 빠짐없이 성실하게 음계를 연습한다. 마찬가지로 유능한 외과 의사일수록 한층 더 성실하게 봉합술을 연마한다.

피아니스트는 연주 능력 향상에 크게 도움이 될 것 같지 않은 음계를 여러 달 동안 계속 연습하기도 한다. 그러나 그 연습이 피아니스트로 하여금 원하는 음악적 성취를 이룰 수 있도록 해준다. 외과 의사는 능숙한 수술 실력 향상에 크게 도움이 될 것 같지 않은 작은 손놀림을 익히기 위해 여러 달 동안 계속해서 봉합용 실과 씨름을 한다. 외과 의사는 그 꾸준한 연습 덕분에 수술을 빠르고 정확하게 하게 되고, 그 결과 소중한 인명을 구하기도 한다. 무언가를 성취하는 것은 반복적인 연습에 의해서만 가능하다.

하지만 단순한 음계 연습은 무엇도 이루어주지 않는다. 에릭슨은 바이올린 전문가들에 대해 막대한 조사를 해보았는데, 그들의 실력은 자신이 바이올린 연습에 투자한 시간과 거의 비례했다. 하지만 그는 여기에 전제를 단다. 단순한 반복 연습은 아무 도움이 안 된다고 강조한다. 자기 자신을 관찰하는 것, 그리고 피드백을 통해 재조정하는 것, 특별히 현재의 기량 증진을 위해 설계된 훈련 등이 중요하다. 에릭슨은 이런 수련을 특별히 의도적 수련(deliberate practice)이라고 부른다.

에릭슨의 연구에 따르면, 고수와 하수를 가르는 가장 효과적인 인자는 의도적 수련의 양이었다. 예컨대 IQ와는 별 상관이 없다. 실제로 프로그래머의 퍼포먼스에 대한 연구를 봐도 그 사람이 얼마나 일을 잘 하는가와 그 사람의 학력, 경력년수, IQ 간에는 별 관련이 없었다. 필자의 경험으로도 크게 틀리지 않는 것 같다. 경력이 많은 개발자가 꼭 경력이 짧은 개발자보다 능력이 더 뛰어나진 않았다. 설사 처음에는 큰 차이가 있더라도 금새 따라잡을 수 있었다.

에릭슨의 연구는 우리의 뒷통수를 칠만큼 허를 찌른다. 우리의 커리어 모델에 대한 심각한 재고가 요구된다. 전문성 연구에 따르면 한 분야의 세계적 수준의 고수가 되려면 10년의 수련, 혹은 도합 일만 시간 이상의 의도적 수련이 필요하다고 한다. 재즈 기타리스트에 대한 전문성 연구에 따르면, 실제 공연 시간은 전문가와 비전문가를 가리는 데에 별 도움이 되지 않았고 혼자서 연습한 시간이 더 의미가 있었는데, 전문가와 준전문가(semi-expert)의 경우 수련 시간이 일주일에 최소 두 배 이상(43시간 대 17시간)의 차이가 있었다. 나는 일주일에 몇 시간을 의도적 수련에 할애하는가? 이건 정말 무서운 질문이다.

무술 쪽에 이런 의도적 수련이 많이 개발되어 있는 것 같다. 실제로 무술인의 의도적 수련에 대한 연구도 있다. 본인은 의도적 수련을 다른 말로 ‘특수 훈련’이라고 옮기기도 한다. 세계적인 전문가와 비전문가 혹은 ‘나름대로 전문가’의 차이 중 하나는 자신의 기량을 향상시키기 위해 자신만의 특수 훈련을 직접 설계, 시행하느냐에 있다. 전문가가 되기 위해서는 많은 특수 훈련이 필요하다. 특수 훈련에는 여러 가지 종류가 있다. 그중에 스캐폴딩(scaffolding)이라는 방법이 있다. 우리말로는 지지대인데, 두발 자전거 뒷바퀴 양옆에 보조 바퀴를 달고 타다가 나중에 떼어 버리는 것과 유사하다.

수영선수들이 받는 특수 훈련 중에 이런 게 있다고 한다. 선수의 몸에 밧줄을 묶는다. 그리고 풀장 밖에서 트랙터를 이용 선수의 몸을 빠른 속도로 끌어당긴다. 그러면 선수는 평소 자신의 속도보다 훨씬 높은 속도로 물속을 가로지르게 된다. 이 때 그 선수는 빠르게 수영할 때의 느낌을 맛볼 수 있다. 물의 저항, 몸의 느낌 등. 이런 특수 훈련을 하고 나면 더 이상 트랙터로 당기지 않더라도 그 사람의 기량이 향상된다.

기천의 수중에 이런 것도 있다. 정면을 보고 선 자세에서 한 발자국(예컨대 오른발) 크게 내딛는다. 발 뒤꿈치가 닫는 순간 뒤꿈치를 축으로 몸을 반 시계 방향으로 비튼다. 주먹은 이 때 허리에 있다가 정면으로 내어지른다. 주먹이 완전히 나간 상태에서는 몸은 왼쪽을 바라보고 있고 주먹은 원래의 정면 쪽으로 나와 있는 상태이다. 그리고 다리는 기마자세이다.

처음 이 동작을 배우고 계속 연습을 했다. 그런데 범사님이 뭔가 제대로 되고 있지 않다고 말을 했다. 하지만 동작은 수정되지 않았다. 그러다가 다시 한 번 앞발을 내딛으려는 순간 뒤에서 범사님이 내 허리춤을 잡고 몸을 획 돌려버렸다. 마치 애들이 손바닥 사이에 끼고 막대기를 비비면 윗부분의 자그만 북에 실로 연결된 구슬이 북을 쳐서 소리를 내는 장난감처럼. 그러자 내 주먹이 마치 허리춤에서 총알 발사되듯이 앞으로 튕겨 나갔다. 바로 이 느낌이었다. 엄청난 파워. 그러나 힘은 들지 않았다. 이 경험을 한 번 했더니, 한 마디로 말해 ‘감이 왔다’. 당연히 기량에도 발전이 있었다.

왜 이런 훈련이 효과가 있을까? 몸이 기억하기 때문이다. 몸은 그 당시의 느낌을 기억한다. 그래서 그 이후 같은 수련을 해도 그 때의 그 완벽한 느낌에 가깝게 가기 위해 노력하고 몸을 컨트롤한다. 이번에는 그 느낌이랑 좀 비슷했네. 아니야, 이번에는 영 아니었어. 미감이 생기는 것과 비슷하다. 피드백이 더 구체적으로 어떤 방향을 제시해 주게 되는 것이다.

이런 이야기를 ‘테스트 주도 개발 수련’에 적용하면 어떨까? 나는 애자일 언어(파이썬, 루비 등 동적인 성질이 강한 언어)로 TDD를 하는 것이 이런 특수 훈련의 효과를 낼 수 있다고 본다. 그러고 나서 비-애자일 언어로 돌아가는 것이, 차라리 처음부터 비-애자일 언어와 씨름하는 것보다 빠른 기량 향상을 가능하게 할 것이다.

이런 자기보다 한 단계 높은 경험을 하는 특수 훈련도 있는가 하면 발목에 모래주머니를 차고 다니는 한 단계 낮은 경험을 하는 특수 훈련도 가능하다. 프로그래머를 위한 다양한 특수 훈련의 소개는 다음 연재를 기대하시라. 다음 연재에서는 구체적으로 프로그래밍의 고수와 하수의 차이점, 프로그래밍의 고수가 되기 위해 어떤 수련이 필요한지 등에 대해 살펴보겠다.

 

인터뷰

필자는 자바 개발자 컨퍼런스의 TDD 수련 비결 강의를 준비하면서 나름대로 TDD에서 한 수준에 올랐다고 생각되는 사람들과 인터뷰를 했다. 그들 모두 공통점이 있었는데 의도적 수련을 통해 한 계단 오르는 경험이 있었다는 점이다. 인터뷰에서 박응주씨는 다음과 같이 말했다.

저는 아주 쉬운 문제들을 주로 TDD 했습니다. 제가 2003년에 복학을 했었는데 복학 첫 학기 실험 수업으로 자바를 배우게 됐습니다. 회사 다니면서 2년 넘게 자바를 썼었는데 말이죠. 그냥 실험하고 과제를 하면 저에게는 시간을 버리는 것이나 마찬가지였기 때문에 실험과 과제를 TDD로 만들었습니다. 대부분 아주 쉬운 문제들입니다. 그런데 이런 문제를 풀면서도 제 생각보다 훨씬 빨리 끝냈다든지, 혹은 나온 코드가 너무 예쁘다든지 해서 놀란 적이 있습니다. 그 후로도 알고리즘 수업 등의 과제를 대상으로 계속 TDD를 해서 재미를 느낀 적이 많습니다.

저는 좀 여유를 가지라고 말하고 싶습니다. TDD를 배워야겠다고 생각을 하는 동시에 이걸 빨리 배워서 빨리 효과를 봐야겠다고 생각을 하게 됩니다. 이렇게 되면 재료로 가장 먼저 택하게 되는 것이 자신이 항상 접하게 되는 분야입니다. 저도 그래서 처음부터 제가 업무로 하던 분야인 웹 애플리케이션을 TDD하려고 많이 시도 했습니다. 그런데 처음부터 이런 어려운 것을 대상으로 하다 보니 중간에 그만 두게 되는 경우도 많고, 한 후에도 결과가 만족스럽지 않았습니다. 그래서 재미가 없었습니다.

너무 급하게 효과를 봐야겠다는 생각보다는 좀 여유를 가지시고 아주 만만해 보이는 것부터 하나씩 하나씩 연습을 해서 힘을 조금씩 기르면서 실무에서도 가장 쉬울 것 같은 부분부터 조금씩 적용해보는 것이 도움이 될 것입니다.

 

‘의도적 수련 2 – 프로그래머에게 적합한 의도적 수련’ 보러 가기

 

 

《함께 자라기》는 다음 서점에서 구입하실 수 있습니다.

Yes24 | 교보문고 | 알라딘 | 인터파크

 

 

 

의도적 수련 2 – 프로그래머에게 적합한 의도적 수련

<월간 마이크로소프트웨어> 2005년 4월호와 6월호에 실린 《함께 자라기》 김창준 저자님의 글입니다. 개발자들이 의도적 수련을 늘릴 수 있는 방법을 엿볼 수 있습니다.

‘의도전 수련1 – 고수, 무술과 프로그래밍에 대한 소고’ 보러 가기

——————————————————————————————————-

지난 기사에서 우리는 수련, 특히 의도적 수련이 무술의 고수가 되거나 혹은 프로그래밍의 고수, 나아가 거의 모든 것의 고수가 되는 비결임을 살펴보았다. 이번에는 약속한대로 프로그래머에게 적합한 의도적 수련에는 어떤 것이 있는지 알아본다.

 

 

프로그래머에게 적합한 의도적 수련

 

지난 기사에서는 의도적 수련에 대한 이야기로 끝을 맺었다. 기억을 되살리는 의미에서 다시 한 번 생각해 보고 넘어가자. 에릭슨은 훈련에 의해 기억력이 어느 정도 향상될 수 있을지를 실험했다. 일반적으로 기억력 실험에 많이 사용되는 것 중 하나로 숫자 범위(digit span)라는 게 있다. 일초에 한 자리씩 숫자를 줄 때 몇 개의 숫자를 올바른 순서로 기억할 수 있는가 하는 것이다. 통상 인간의 단기 기억에는 7자리 정도의 숫자가 들어갈 수 있다고 한다(전화번호의 자리수가 7자리인 이유이기도 하다). 8자리나 9자리만 되어도 사람들은 숫자를 기억하는 데에 큰 어려움을 겪는다. 직관적으로 생각하기에는 인간의 기억용량이라는 것은 정해진 한계가 있는 듯하다.

하지만 에릭슨에 따르면, 훈련을 하면 100자리 이상을 외울 수 있다고 한다. 처음 실험을 시작할 때, 피실험자 두 사람은 일반적인 숫자 범위를 갖고 있었다. 하지만 그 사람의 숫자 범위는 2시간 훈련에 한 자리씩 늘어났다. 주목할 만한 것은 그 두 사람은 특별한 기억법을 배운 적도 없고, 실험 중 어떤 식으로 기억을 하라고 가이드를 해주지도 않았으며, 그들이 그렇다고 뛰어난 지능의 소유자도 아니었다는 점이다. 도대체 뭐가 비결이었을까? 그 두 사람은 장거리 달리기 선수였는데, 달리기 기록을 많이 알고 있었다고 한다. 예컨대 3492라는 숫자 연속은 3분 49.2초의 기록과 연관해 기억했던 것이다.

좀 극단적인 예일지 모르겠으나 라잔 마하데반(Rajan Mahadevan)이라는 인도인은 1981년도에 기네스북에 도전하면서 파이(pi)를 31,811자리까지 외웠다고 한다. 이런 놀라운 사실을 그 사람의 타고난 재능만으로 돌리기는 어렵다는 것을 최근 연구 성과들이 보여주고 있다. 20세기 최고의 골프선수로 꼽히는 잭니클라우스는 다음과 같이 말한다. “아무도, 정말 아무도, 머리로 많이 생각하고 수많은 샷을 쳐보는 수련 없이 골프를 진정 잘하게 된 경우는 없습니다.” 또 반대로, 단순히 오랜 동안 경험을 했다고 해서 무조건 타고난 퍼포먼스를 갖게 되는 것은 아니라는 것 역시 최근 연구를 통해 드러나고 있다.

지인에게서 이런 이야기를 들은 적이 있다. 역사가 10년이 넘은 회사에 입사를 했다. 10년 이상 경험과 기술의 축적을 배우리라고 잔뜩 기대를 하고 들어왔지만, 곧 실망을 하게 되었다. 그가 느끼기에는 1년 경험이 열 번 반복된 것 같았기 때문이다. 필자가 보기에 자신의 경력이 N년이라고 했을 때 “당신은 N년 경험을 한 번 했습니까, 아니면 1년 경험을 N번 했습니까”만큼 무서운 질문이 없는 것 같다. 예를 들어 자바를 5년째 사용해 오고 있다면, 나는 자바 1년 경력을 5번 반복해 오고 있는 것은 아닌지 자문해 보자.

그렇다면 10년 경력을 정말 10년 경력의 가치가 있게 만들려면 어떻게 해야 하나? 니클라우스가 말하듯이 수련을 해야 한다. 얼마나 해야 하나? 많으면 많을수록 좋다(하지만 연구에 따르면 전문가들은 하루 4~5시간 이상을 수련에 투입하는 경우는 거의 없고, 수련 시간이 많아질수록 쉬는 시간과 자는 시간이 늘어났다. 그만큼 수련은 에너지 소모량이 크다).

에릭슨은 베를린에서 젊은 바이올리니스트와 피아니스트를 연구했다. 교수들에게 세계적 수준으로 될 학생들, 그리고 그렇게 대단하지는 않지만 전문가 수준으로 성장할 학생, 그리고 음악 선생이 될 학생 등으로 학생을 분류하도록 했다. 그 학생들을 조사한 결과, 최고 수준의 연주자들은 20살까지 1만 시간 이상의 수련을 했다. 이에 비해 세번째 그룹의 학생들은 5000시간에 그쳤고, 같은 나이의 아마추어 피아니스트들은 2000시간 정도에 달했다. 흥미로운 점은, 이 1만 시간이라는 양이 운동선수, 작가, 과학자 등의 다른 분야에서도 발견된다는 것이다.

잠깐 한 번 계산을 해보자. 내가 컴퓨터를 시작한 게 언제부터인가? 일주일에 대충 몇 시간이나 프로그래밍 수련을 했나? 예를 들어 프로그래밍 경력 10년에, 그동안 늘 일주일에 10시간씩 수련해 온(이 정도면 대단하지 않나?) 사람이라고 치자. 계산하면 약 5,000시간이 나온다. 연주자와 비교하자면(꼭 정확한 비교는 아니지만) 전문가 수준에 속한다. 세계수준은 아닐지언정. 좀 더 정확히 말하자면, 전문가의 싹이 보이는 음악아카데미학생과 비견할 만하다. ‘ 에이 이거밖에안돼?’라고 생각할지도 모르겠지만, 1만 시간은 엄청난 양이다.

 

고수 프로그래머 vs. 하수 프로그래머

고수 프로그래머와 하수 프로그래머 간에는 어떤 차이점이 있을까? 통상적으로 사람들은 고수와 하수 사이에는 무언가를 얼마나 잘 하느냐, 무언가에 대해 얼마나 많이 아느냐는 표면적 차이만 있다고 생각하기 쉽다. 예를 들어 고수 프로그래머가 작성하는 시간당 라인수가 더 많다는 것, 그리고 알고 있는 프로그래밍 언어 숫자가 많다는 것 등이다. 하지만 이보다 더 중요한 것은 그들이 정보를 어떤 식으로 처리하는지 그 과정과 전략에 차이가 있다는 것이다.

고수와 하수 프로그래머의 차이에 대해서 밝혀진 여러 가지 사실 중 몇 가지만 알아보자. 고수 프로그래머는 문제 해결 시 너비 우선 탐색을 하고 하수 프로그래머는 깊이 우선 탐색을 한다고 한다. 고수는 다양한 대안을 고려하면서 탑다운에 가깝게 진행하는 반면, 하수는 한 가지 결정을 하고 그쪽으로만 계속 갈 때까지 가보는 스타일이다. 너비 우선 탐색을 하면 더 나은 대안을 빨리 찾기 쉽고 터널 비전의 함정에 빠지는 확률을 낮출 수 있다. 이 전략은 문제 자체가 잘 정의되지 않은 경우(ill-defined) 훨씬 더 유용하다.

그렇다고 해서 고수가 순수한 탑다운으로 생각하느냐면 그것도 아니다. 특히 설계에 대해서는. 실제 실험에 의하면, 엘리베이터 컨트롤 시스템을 설계하도록 요청받은 전문 설계자들은 추상과 구상을 자유로이 오갔다. 왔다갔다했다는 것이다. 오히려 이런 식으로 고수준의 설계와 구체적인 해 사이를 자주 오가는 것이 딱 정해지지 않은 문제의 경우 전문 설계자들이 취하는 좋은 전략이라는 것이 밝혀졌다.

이와는 달리 고수와 하수 상관없이 공통적인 것도 있다. 프로그래머들은 고수와 하수 모두 ‘거꾸로 생각하기’ 전략을 주로 사용한다. 과학자들의 경우 전문가에 가까울수록 순방향 사고를 하고 초보자는 역방향 사고를 한다. 역방향 사고란 문제의 답에서부터 거슬러 내려오는 것을 말하고, 순방향 사고는 주어진 기초적 정보에서 시작해서 연역적 사고를 통해 결론에 도달하는 것이다. 실제로 화학문제를 푸는 학생에게 순방향 사고를 강요한 경우 오류가 훨씬 줄었다고 한다. 그렇다고 역방향 사고가 무조건 나쁜 것만도 아니다. 전문가라고 할지라도 자신이 전에 경험해 보지 못한 생소한 문제 상황을 만나면 역방향 사고로 접근하게 되며 이것은 나름대로 유용한 전략이다. 하지만 앞에서 말했듯이 프로그래머의 경우 이런 차이가 존재하질 않았다.

기억력은 어떨까? 고수 프로그래머는 프로그램 소스코드를 더 잘 기억한다. 이는 체스판에 대한 전문가와 비전문가의 기억력 차이와 유사하다. 흥미롭게도 스파게티 코드에 가까울수록 고수와 하수의 기억력 차이는 줄어든다. 실험에 따르면 실제로 한 번 이상 본 코드를 기억해내는 능력은 고수가 월등하다는 것, 그리고 고수는 코드를 보는 순서가 다르다는 것 등이 밝혀졌다.

같은 시간(예컨대 10초)이 주어졌을 경우 고수 프로그래머는 하수 프로그래머와 서로 다른 것을 본다. 예를 들어 OOP의 고수는 같은 코드를 보아도 짧은 시간 내에 주로 클래스들의 관계, 책임 등을 읽어내는 반면, 하수는 주로 어떤 컨트롤 구조가 사용되었는지에 주목했다. OOP 세상에서는 아무래도 고수의 코드 이해 능력이 더 뛰어날 수밖에 없는 것 같다.

이런 업무와 직접적 관련된 차이 외에도 다른 점이 있다. 찰스 보스크(Charles Bosk)라는 사회학자는 훌륭한 외과의사와 그렇지 못한 외과의사를 구분하는 방법에 대해 연구를 해오고 있다. 그가 찾은 답은 아주 간단한 질문을 몇 가지하는 것이다. “실수를 한 번이라도 한 적이 있습니까?” “만약 그렇다면 당신이 저지른 최악의 실수는?” 여기에 대해, “별로 없는 것 같은데요”라든가, “그런 적이 있기는 한데 그건 내 잘못은 아니었고 어쩌구…”라는 답을 하면 모두 최악의 레지던트였다. 반대로, “ 저는 늘 실수를 저질러요. 어제 또 엄청난 실수를 했는데, 그게 뭐냐면…” 식의 답변이 나오면 그들은 그야말로 최고의 의사들이었다. 그들은 자신이 한 것을 다시 한 번 생각해보고, 다르게 한다면 어떻게 해볼지를 상상해본다. 프로그래머 쪽에서도 상황은 크게 다르지 않다.

자신의 실수에 대해 생각해 보고 어떻게 했더라면 실수가 발생하지 않았을지 생각해 보는 것이 중요하다는 이야기다. 여기에서 더 나아간다면, 그런 가설체계를 실험해 보는 것이다. 예를 들어 지난 달에 회사에서 개발한 코드가 있다면 그 코드에서 어떤 점이 마음에 안 드는지를 생각해 본다. 그리고 어떻게 했더라면 그런 문제를 미리 피할 수 있었을지 생각해 보고, 가능하다면 직접 실험(예컨대 그 시스템을 다시 간략히 만들어 보는 것)을 해본다.

 

프로그래머의 의도적 수련

그렇다면 이런 고수 프로그래머가 빨리 되는 방법은 없을까? 있다. 지난 회에 밝혔듯이 지속적인 의도적 수련을 통해 고수되기는 가능하다. 코드 시각화하기, 같은 코드를 정해진 시간(예컨대 한 시간)동안 할 수 있는 데까지 매일 리팩토링 해보기, 같은 장난감 문제를 여러 번 풀기, 새로운 언어 배우기 등이 그러한 방법이다.

코드 시각화하기에 대해서는 부연 설명이 필요하겠다. 필자는 고등학생일 때 월요일 아침 조례 시간이면 친구와 함께 머리 속으로 바둑 두기를 했다. 물론 바둑판과 바둑알은 없다. 바둑판의 x, y 좌표를 정하고, 서로 그 좌표를 불러가면서 머리 속에서 바둑판의 상황을 유지해 가며 바둑을 두는 것이다. 코드 시각화에는 이와 유사한 면이 있다.

코드 시각화는 말 그대로 코드를 머리 속에서 떠올려 눈으로 보듯 만드는 것이다. 여기에는 두 가지 종류가 있는데, 하나는 이미 본 코드를 머리 속에서 떠올려 보는 것이고, 다른 하나는 새 코드를 머리 속에서 만드는 것이다. 후자를 하다 보면 전자도 함께 하는 효과가 있다. 필자는 간단한 문제 하나를 기억해 두었다가 만원 지하철을 타거나 할 때에 그 문제를 머리 속으로 푸는 수련을 한다. 머리 속에서 코딩을 하는 것이다. 특히 테스트 주도 개발(<테스트 주도 개발> 켄트 벡 저, 도서출판 인사이트)을 이용해서 테스트와 코드를 오가며 코딩한다. 글의 문두에서 이야기한 것과 같이 한 번에 얼마만큼의 코드를 기억하고 머리 속에서 다룰 수 있는가 하는 것도 수련을 통해 증진이 가능하다. 동시에 자신의 코드 구조가 바뀌는 효과도 있다. 즉, 한 번에 머리 속에 담고 조작하기 쉬운 구조로 코딩하는 습관(예컨대 단계적 추상화 등)이 생기는 것이다.

같은 장난감 문제를 여러 번 풀기에 대해서도 조금 부연설명을 하겠다. 필자는 폰노이만 공항이라는 세계 대학생 프로그래밍 경진대회 문제를 몇 년째 거듭해 풀어오고 있다(이 문제를 테스트 주도 개발로 푸는 내용의 기사가 마소 2002년 11월호에 실린 적이 있다). 풀 때마다 조금씩 다른 코드가 나오고 매번 무언가 배우게 된다.

예를 들어 마소 2003년 1월호 한국 정보 올림피아드 문제 분석에 실린 직사각형 4개의 합집합 면적 구하기 문제를 보자. 필자가 이 문제를 처음 풀었을 때는 4개뿐만 아니라 N개의 사각형, 나아가 다각형에 대해서도 재사용 가능한 코드가 나왔다. 그러고 나서 나중에 또 풀었을 때는 10줄 이내의 아주 간단한 답이 나왔다. 실행 시간에서도 별 문제가 되지 않는다. 기사에서 대략 4페이지에 걸쳐 복잡하게 문제를 풀어놓은 것과 대조적이다. 이 문제도 풀 때마다 뭔가 통찰을 얻는다.

이 외에도 정해진 시간 동안 X 만들기가 있다. 예를 들어 1시간만에 퐁이라는 게임을 개발하는 것을 며칠에 걸쳐 여러 번 반복해 본다든지 하는 것이다.

이런 의도적 수련의 공통점은 반복적이라는 것(전문가일수록 일주일 중 공휴일까지도 하루에 투입하는 의도적 수련의 양이 일정했다), 그리고 피드백을 거의 즉각적으로 받을 수 있다는 것, 나중에 오류 수정이 가능하다는 것, 실수에 대한 부담이 크지 않다는 것, 자신이 한 것에 대해 생각해볼 여유가 주어진다는 것 등이 있을 것이다. 필자 생각에는 전문가일수록 스스로 이런 의도적 수련을 계획, 설계해서 하는 것 같다. 자기만을 위한 특수훈련을 만들어 실험해 본다는 것은 참 즐거운 경험이 되기도 한다.

 

프로그래머의 직업적 특징

여기까지 읽었을 때 독자들의 반응은 다음 두 가지 사이의 스펙트럼에 위치하지 않을까 한다. “누가 수련이 좋은 줄 모르나? 시간이 나야 하지! 잘 시간도 부족한데 말이야”와 “그래 오늘부터 수련량을 늘려보자”. 전자의 반응에 가까운 독자들이 대다수이지 않을까 싶은데, 그 분들은 어떻게 하는 게 좋을까?

프로그래머는 음악연주가와 다른 점이 있다. 연주가는 평소 늘 수련을 하다가 일주일에 한 번, 혹은 한 달에 한 번 정도 공연을 한다. 하지만 (직업적) 프로그래머는 수련이라는 시간이 특별히 없고, 늘 공연을 하고 있는 셈이다. 그렇다면 우리가 물어야 할 질문은, 어떻게 일(work)을 하면서 동시에 수련(practice)할 수 있을까가 된다. 일도 되면서 수련도 되는, 생활수련의 방법은 없을까?

있다. 앞서 말했던 실험, 피드백, 실패 허용, 오류 수정 등이 핵심 키워드다. 뭔가 실험적인 것을 안심하고 시도해 볼 수 있어야 하며, 거기에서 의도적으로 피드백을 얻고, 그 피드백을 통해 자신의 오류를 수정해서 다음번에는 더 나은 시도를 할 수 있어야 한다.

워드 커닝엄이 웁슬라 2004에서 한 기조 연설이 우리에게 중대한 통찰을 던져줄 수 있다. 제목이 ‘발견 잘하기’(Receptive to Discovery) 정도 된다(워드 커닝엄은 필자가 마소 2003년 8월호에 인터뷰를 했는데, 이 인터뷰에서 워드 커닝엄은 고수가 되기 위한 훈련으로 ‘작지만 유용한 프로그램 매일 만들기’와 ‘큰 프로그램 읽기’ 등을 권했다).

감동적이다. 그의 수십년 경험을 관통하는 말들이다. 흥미로운 점은 다음의 과정은 그가 위키, CRC 카드, XP 등을 만든 과정이면서 동시에 그 대상을 사용하는 사람들이 겪는 과정이기도 하다는 것이다. 자기 생성적인 시스템이다. 각 단계에 나름대로 주석을 붙여 보았다.

◆ 알고 있는 것을 사용하라(Use what you know)

이미 갖고 있는 것에서 출발한다. 사실 우리는 이미 많은 것을 알고 있다.

◆ 작동하는 걸 느껴라(Feel it work)

‘Feel’이라는 단어를 쓴 것이 중요하다. 뭔가 시도했다면 그게 제대로 작동하는지 ‘느껴야’ 한다.

◆ 경험을 공유하라(Share the experience)

‘경험’을 공유하라. 일단 일차적 경험을 공유하는 것이 중요하다. 공유의 형태와 스케일은 여러 가지일 수 있다.

◆ 통찰을 기다려라(Wait for insight)

통찰을 얻게 되길 기다려라. 성급하게 재촉하거나 무심하게 내다 버리는 우를 범하지 말라.

◆ 리팩토링해서 포함시켜라(Refactor to include it)

통찰을 얻었다면 과거를 리팩토링해서 그 통찰을 포함시키도록 하라. “아, 그랬던 거군, 멋진걸!” 하는 통찰을 얻는 데에서 끝나는 경우가 많다. 귀중한 통찰을 얻었다면 그것을 다시 나의 과거에 투영, 리팩토링하라.

 

발견에 대해 수용적이 되는 다섯 단계는 하나하나가 생각해볼 여지가 있다. 이걸 잘하면 일하면서 수련하는 효과를 얻을 수 있을 것이다.

구체적인 예를 하나 들어보자. 뭔가를 하고 그것에 대한 피드백을 빨리 얻으려면 어떻게 하면 될까? 테스트를 자주 하면 어떨까? 아예 테스트를 5분 간격으로 하면? 그게 바로 테스트 주도 개발이다. 테스트 주도 개발을 하면 일하는 도중 수련을 하게 된다. 피드백뿐만이 아니다. 테스트가 있기 때문에 사람이 과감해진다. 여러 가지 실험을 해보게 된다. 뭔가 잘못 건드리면 테스트가 곧바로 알려줄 것이기 때문에 무서움이 없다. 테스트 주도 개발과 리팩토링을 짝을 이뤄 작업하다 보면 하루 중에 학습하는 것이 참 많다. 프로그래머가 나날이 퇴근을 하면서 “오늘은 또 이런 걸 깨달았군” 하면서 가슴 뿌듯하게 집으로 돌아가는 경우는 흔하지 않다. 하지만 이런 방법을 사용하면 매일 깨달음이 있고 매일 새롭다. 이것은 실제 경험이기도 하면서 주변 사람들을 관찰한 결과이기도 하다.

2주간 프로그래밍 교육을 한다. 처음 들어올 때에는 아예 코딩이 불가능하다. 2주 후에는 자신이 원하는 시뮬레이션 프로그램을 아주 훌륭한 OOP 모델로 작성한다. 이것은 실제로 필자가 진행하는 교육에서 종종 일어나는 일이다. 어떻게 이런 일이 가능할까? 의도적 수련을 압축적으로 경험하기 때문이다.

회사에서 이런 지원을 해주면 참으로 좋을 것 같다. 업무 중 의도적 수련의 효과도 함께 볼 수 있도록, 어느 정도 실패를 용인한다거나 과거 작업에 대해 반성할 시간을 준다거나 하는 것. 구글이나 3M처럼 업무 외 개인 프로젝트 시간을 20% 이상 주는 것도 한 가지 방법이 되겠다. 이 부분에 대해서는 필자도 할 말이 많다(관심있는 독자분은 스테판 톰크(Stephan Thomke)의 『Experimentation Matters』라는 책을 참고하시라). 학습하는 조직이 되기 위해서는 회사가 어떠해야 하는가. 이것은 또 다른 하나의 큰 주제로, 다음에 기회가 되면 이야기하도록 하겠다.

하지만 조직에서 수련의 여유를 주지 않는다고 조직 탓만 하다가는 그 피해가 고스란히 개인에게 돌아오게 된다. 자기의 발전은 일차적으로 개인이 책임져야 한다. 결국 자신의 게으름 때문에 조직 탓을 하는 자기 방어적 변명을 만들어 내지 말아야 한다.

 

수련의 의미

에릭슨은 의도적 수련은 그 자체로 즐거운 것은 아니라고 했다. 하지만 그 이후의 여러 연구에서 밝혀진 바에 따르면 의외로 전문가들일수록 수련을 즐긴다. 굳이 그 수련이 자신의 능력을 향상시켜 주건 아니건 큰 상관없이, 필자는 수련을 꾸준히 계속한다. 수련 자체에 의미를 두기 때문이다. 필자가 무술 수련을 하러 가는 날이면 종종 몇 시간 전부터 ‘갈까 말까’ 하는 망설임과 게으름에 시달린다. 그 유혹을 이겨내지 못하고 수련을 빠진 날이면 괜히 찜찜하고 기분이 편안하지 못하다. 하지만 용기를 내어 수련을 하러 간 날이면 꼭 “그래 역시 수련하러 오길 잘했어” 하는 만족감을 느끼게 된다. 특히 수련을 마치고 집으로 돌아올 때의 높은 충만감은 다른 활동에서 얻기가 힘들다. 필자는 무술 수련을 통해 얻는 신체의 건강이나 자기보호 기술같은 것보다 수련 자체에서 느끼는 안정감과 만족감을 더 중요하게 생각하고 있다. 전문가들일수록 일정 수준에 오른 이후에도 꾸준히 수련을 계속하며, 그 활동 자체에서 큰 즐거움을 얻는 것으로 알려져 있다. 고수가 되는 길은 오히려 ‘고수’보다 ‘길’에 대한 집착에서 나오는 것일지도 모르겠다.

우리가 평소 쓰는 말에 일신우일신이라는 말이 있다. 정확하게는 일일신우일신인데 원문을 인용하면 다음과 같다.

湯之盤銘 曰 苟日新 日日新 又日新

대학(『大學』)에 나오는 말이다. 『원본비지 대학집주』에서는 “탕의 반명에 갈오되 진실로 나래 새롭거든 나날 새로이 하고 또 날로 새로이 하라하며”라고 번역하고 있다. 가장 권위적인 영어 번역인 레게 번역에서는 다음과 같이 번역한다.

On the bathing tub of T’ang, the following words were engraved: “If you can one day renovate yourself, do so from day to day. Yea, let there be daily renovation.”

일일신 우일신은 수학적 귀납법을 생각나게 한다. 하루만 새로운 것을 갖고는 진실로 새롭다고 할 수 없다. 하루가 새롭고 또 다시 새로워야 진실로 하루가 새롭다고 할 수 있다.

마우스와 기타 컴퓨터 산업의 거의 대부분의 시조로 불리우는 더글라스 엥겔바트(Douglas Engelbart)는 일을 세 종류로 나눈다. A 클래스, B 클래스, C 클래스. A는 주어진 일을 잘 하는 것이다. B는 A를 개선하는 것이다. C는 B를 개선하는 것이다. C는 그야말로 ‘개선을 개선하는 것’이다. 필자는 사회의 성숙도를 볼 때 B와 C가 얼마나 존재하는가를 본다(개인도 ‘정신의 사회’라는 측면에서 역시 하나의 사회로 볼 수 있는데 마빈민스키가 쓴 동명의 책도 있다).

수련으로 치자면, 지금 주어진 업무를 잘하는 것이 A, 의도적 수련을 하는 것이 B, 그 의도적 수련에 대해 고민하고 수련 자체를 개선하는 것이 C가 되겠다. 일일신우일신은 B와 C를 말하고 있다. 우리는 종종 A를 잘하는 프로세스를 말한다. 하지만 진정 자문해야 할 것은 나의 프로세스 속에 B와 C가 내재되어 있는가 하는 점이다. 그것이 고수가 되는 유일한 길이다.

 

 

커피의 고수

다음 내용은 필자의 지우인 김승범 씨에게 부탁해서 얻은 글이다. 김승범씨는 프로그래머로 일하다가 지금은 대학에서 공부를 계속하고 있다. 그는 요즘 커피에 심취해 살고 있다고 하는데 요즘 커피 고수에게 무공을 전수받고 있다고 한다. 그 세계는 어떤지 궁금하지 않은가?

우리나라 커피계에는 세 분의 ‘고수’가 있다. 그 중 한 분은 80년대에 K대의 어느 골목에 B커피숍을 차렸다. 직접 로스팅하고 내린 커피로 강렬한 맛과 향을 전도하던 그는 현재 같은 이름으로 강릉에 커피숍을 차리고, 동시에 후학을 양성하고 있다. 지금의 K대 옆 B커피숍은 그 분의 제자인 C선생님이 점장으로 있다. 자칭 커피 매니아였던 P군은 B커피숍에서 진정한 커피의 세계를 접한 이후 매주 일요일마다 C점장님의 커피 강의를 통해 ‘드립 커피’를 배우고 있다.

 

<그림 1> 종이 필터를 사용한 드립 커피

 

가장 기본이 되는, 종이 필터를 사용한 드립 커피의 순서는 간단하다. 종이 필터를 잘 접은 후 깔때기처럼 생긴 드리퍼에 올리고, 커피를 받을 드립 서버 위에 드리퍼를 올린다. 알맞게 갈은 신선한 커피를 종이 필터에 담고 주둥이가 가늘고 긴 드립 주전자로 커피에 물을 흘려주면 된다. 물을 내려줄 때에는 처음에 뜸들이기라 해서 물을 점찍듯이 커피를 적셔주고, 뜸들인 이후에는 가늘고 고른 물줄기로 나선형이나, 스프링형 등 다양한 방법으로 물을 내려 커피를 추출한다.

P군은 C점장님의 말 한마디, 동작 하나를 주의깊게 듣고 관찰하면서 드립 커피를 위한 기본적인 순서와 규칙들을 익히는데 집중했다. 뜸들이기는 얼마 동안 어떤 방식으로 하는지, 물을 내릴 때에는 어떤 모양으로 얼마 간 내리는지를 항상 염두에 두며 커피 내리기를 시도해봤다. 커피를 내리는 동안에는 세세한 규칙들에 집착하면서 혹시 실수는 하지 않았는지, 물줄기는 계속 가늘고 고른지 항시 긴장을 늦추지 않았다. 대충 비슷하게 커피를 내렸다지만 점장님이 추출한 커피와 맛이 같을리 없었다.

간단하게만 보이는 드립 커피의 과정을 단순히 눈과 귀로 보고 들은 후에 직접 따라 해보면 결코 만만치 않은 것임을 알 수 있다. 물 내리기를 똑같이 따라 하기도 힘들뿐만 아니라 결과적으로 커피의 맛과 향에서 차이가 난다. 순서와 동작은 비슷하더라도 결국 초보자의 커피에는 깊고 매력적인 향은 사라지고 잡스런 맛이 남게 된다.

 

<그림 2> 여유와 리듬감이 실린 고수의 드립 커피

 

고수이신 C점장님의 드립 커피 과정에는 여유와 리듬감이 있다. 경쾌한 음악에 박자를 맞추듯 주전자와 팔은 움직이지만, 주전자의 주둥이에서 내려오는 가는 물 줄기는 얼어버린 고드름처럼 일정하고 고르다. 그 물이 커피의 입자에 닿으면 커피는 살아 숨쉬듯이 부풀어 오른다. 때로는 거칠게 반응하는 커피 입자들을 고른 물줄기로 바른 물길을 내어 절도있게 잠재우고, 시들한 커피 입자들에겐 다시 생명력을 불어 넣는다. P군이 과정에 얽매여 커피에 끌려간다면, C점장님은 커피를 자유자재로 부리는 것이다.

뜸들이기와 물 내리기를 얼마나 해야 할지 감을 못 잡은 P군에게 C점장님은 2분짜리 모래시계를 주면서, 처음에는 2분 30초에서 3분 사이 정도로 커피 추출을 해보라고 했다. 처음엔 2분 30초 정도의 시간이 맛있는 커피를 위한 최적의 시간인줄로 알았지만, 점장님은 그날의 커피에 따라서 뜸들이는 시간도 달라지고, 물을 내리는 방법과 과정도 처음에 가르쳐준 기본적인 규칙과 달리했다. P군이 대체 얼마나 해야 그 정도로 잘 할 수 있느냐고 묻자, C점장님은 오히려 초보자의 사심 없는 애정이 담긴 드립 커피가 더 맛있을 수 있다고 말했다. 어떤 과정이나 규칙에 너무 얽매이지 말고, 사람마다 좋아하는 커피가 다르기 때문에 자신의 맛과 향을 찾아가라고.

P군은 주변에서 가끔씩 “프로그래밍을 잘 하려면 무엇부터 공부해야 하나요?”,  “이것을 마스터하려면 이 책이 좋겠죠?” 등의 질문을 하는 후배들을 본다. 그럴 때면 P군은 비슷한 질문을 하던 몇 년 전의 자신의 모습을 회상한다. 정확한 정답을 가르쳐 주는 사람은 없었다. 다행히도 P군의 주변에는 정답은 아닐지라도 노력하는 방법을 가르쳐 주는 지인들이 많았다. 그리고 그 방법이란 구체적인 몇 가지 규칙이라기보다는 현재 자신의 상태에서 관심과 애정을 가지고 노력하는 습관 같은 것이었다. P군은 몇 년에 걸쳐 느끼고 경험했던 과정들을 커피를 통해 다시 체험하고 있다. 오늘도 B커피숍에서 깊고 진한 ‘지적 윤활유’를 마신다.

 

‘의도전 수련1 – 고수, 무술과 프로그래밍에 대한 소고’ 보러 가기

 

《함께 자라기》는 다음 서점에서 구입하실 수 있습니다.

Yes24 | 교보문고 | 알라딘 | 인터파크