나를 만든 언어 |
 |


김창준 juneaftn@hanmail.net
현재 애자일컨설팅 대표로 있으며 주로 소프트웨어 개발 조직의 생산성과 인간성 모두를 증진하기 위해 컨설팅, 코칭, 교육 등을 하고 있다. 애자일이야기라는 블로그를 운영중이다.
2008년 8월 19일 |
|
 |
|
나는 노스모크에 "나를만든책"이라는 페이지를 만든 적이 있다. 위키 놀이의 즐거움을 배가해준 페이지였고, 작은 씨앗 하나가 순식간에 정글로 자라난 경우다. 그 ‘나를 만든 책’이란 오늘날의 나를 있게 한, 나를 키운 책을 뜻한다. 머리 속에 떠올리기만 해도 가슴이 훈훈해지고 몸에 힘이 생기는 그런 책 말이다. 그런데 프로그래머라면 나를 만든 책만큼이나 중요한 것이 있다. 바로 나를 만든 언어다.
감사 표현하기
프로젝트 회고(Project Retrospectives)라는 책을 보면 감사 표현하기라는 기법이 있다. 애자일 회고라는 책에도 간략하게 나온다. 이 방법은 한 마디로 다른 사람에게 감사를 표현하되, 뭔가 일정한 구조와 규칙을 써서 표현하는 것이다.
이것이 핵심이다. 사람들에게 그냥 고마움을 표현하라고 하면 쑥스러워 하고 3인칭으로 표현한다. ‘나’라는 주어가 빠지기 쉽다. 예컨대, 술퍼맨이 홍춘이에게 감사를 표현하고 싶은데, 술퍼맨은 정면에 앉은 다른 사람들을 보면서(홍춘이는 저 멀리 탁자 구석에 앉아 있다고 치자), "지난 달에 홍춘 씨가 어쩌구 저쩌구 해줬는데 수고하신 것 같아요"라고 객관적으로, 또 밋밋하게 말을 던진다. 도대체 누구에게 하는 말인가? 팀 전원에게?
감사 표현하기 규칙을 따르려면 다음과 같이 해야 한다. 술퍼맨은 우선 홍춘이를 똑바로 바라본다. 그러면서 말한다. "홍춘 씨, 고맙습니다. (잠시 쉬고) 지난 달에 어쩌구 저쩌구 해주셔서 저는 이렇게 이렇게 느꼈어요. 그래서 참 고마웠어요." 이 말은 분명 술퍼맨이 홍춘이에게 직접 하는 말이다. 우리 사람들 문화에 이런 쑥스러운 행동하기가 익숙하지 않다. 서양도 아주 다른 것 같지는 않다.
그런데 이 방식의 힘이 강력하다. 직접 해보면 느끼겠지만 감사를 표현하는 사람이나, 감사를 받는 사람이나 이제까지 대화와는 전혀 다른 느낌을 받는다. 감사를 표현하는 사람 입장에서는 정말 감사하다는 느낌이 들고, 감사를 받는 사람은 이 사람이 내게 정말 고마워하는구나 하는 것이 느껴진다. 살아있다는 느낌 같은 거라고 표현하면 비슷할지 모르겠다.
2003년이었나, 노만 커쓰(Norman L. Kerth)의 프로젝트 회고란 책을 보고 얼마 안 되어 어떤 팀의 회고를 진행하게 되었다. 회고를 대략 마무리하고 그냥 마치기 뭐하니까 감사 표현하기를 해보았다. 사람들이 눈이 벌개져서 울었다. 정말 울었다. 기뻐서인지, 슬퍼서인지, 고마워서인지, 아니면 함께 힘들었던 기억이 나서였는지는 잘 모르겠다. 하지만 뭔가 시원하게 통하면서 막힌 눈물이 흘러나왔던 것 같다. 나는 무척 당황했다. 대화 방법을 바꾸는 것이 이렇게 강력한 것인가.
언어 의인화
나를 만든 언어들이 나는 참 고맙다. 그래서 이 감사 표현하기 기법을 사용해 보고 싶다. 사람이 아닌 대상에게 이 방법을 쓰는 것은 처음인 것 같다. 그래서 언어를 의인화해 표현해 보려고 한다. 좀 어색할지도 모르겠다.
먼저 나를 만든 언어들을 나열해 보자.
애플 베이식: 어릴 적 옆집 죽마고우. 세련된 맛도 없고 표현력도 부족하다. 하지만 그냥 편안하고, 이 친구를 만나기 전에 잘난 척 하기 위해 뭔가 많이 알아야 할 필요도 없다.
파이썬: 우리 동네 해결사 아저씨. 어렸을 때 누구나 뭐든지 척척 해결하는 맥가이버 같은 아저씨 한 둘은 근처에 있기 마련이다. 자전거 고장나면 고쳐주고, 시청에 가려면 몇 번 버스를 타야 하는지도 알고, 가끔은 숙제도 도와준다. 그렇다고 아주 똑똑하거나 영리한 것은 아니지만 함께 있으면 왠지 든든하고 걱정이 없다. 또 이 아저씨를 아는 사람들끼리는 좋은 인맥을 형성하고 있다.
Io: 흠모하는 대학 선배. 변화무쌍하다. 굉장히 단순한 삶을 살고 뭔가 초연해 보인다. 자신의 철학을 갖고 있지만 물 흐르듯 다른 사상을 잘 흡수하고 또 잘 섞인다. 도 닦는 사람 같다. 이 선배를 보면서 내 생각을 깨트릴 수 있다. 학창 시절의 정신적 지주.
J: 수학과 천재 노교수. 말은 별로 없지만, 한 마디 한 마디가 심오하다. 처음 보기에는 말도 잘 안 통할 것 같고 차가운 사람 같지만 조금만 같이 지내 보면 그게 사실이 아니라는 걸 알 수 있다.
이제부터는 한 언어씩 나와의 역사를 더듬어 보고, 감사 표현하기를 해보겠다.
애플 베이식: 옆집 죽마고우
내가 애플 베이식(정확히는 애플소프트 베이식)을 처음 만난 것은 1982년쯤 되는 것 같다. 내가 만난 최초의 프로그래밍 언어였다. 프로그래밍할 수 있다는 자체가 너무 좋았다.
처음 만든 (쓸모 있는, 그러나 실제로 사용은 안 했다) 프로그램은 만인의 연인, 전화번호 관리 프로그램. 애플 베이식으로 만들었다. 데이터는 프로그램화되어 저장되었다(프로그램 소스가 저장되는 영역에 자료가 겹쳐서 저장되도록 해서 프로그램을 SAVE하면 카세트에 소스와 함께 데이터가 저장되도록 했다). 그 때의 기쁨을 어찌 잊으리오. 난 집안을 뛰어다니며 가족들에게 자랑했다. "프로그램을 만들었다!"
베이식은 내게 옛날 동네 친구 같다. 이제는 그 친구와의 관계가 좀 서먹서먹하다. 그 관계를 졸업했다고 할까? 하지만 예전의 고마움은 여전하다.
"베이식아, 정말 고마워. 네 덕분에 프로그래밍의 재미를 알 수 있었어."
파이썬: 우리 동네 맥가이버 아저씨
파이썬을 알게 된 것은 참 우연이다. 2000년에 생물정보학 코스를 듣게 되었다(당시로서는 꽤나 선도적이었다). 거기에서 선생님이 하시는 말씀이 생물정보학을 하려면 프로그래밍 언어를 할 수 있어야 하는데, 펄과 파이썬이 있고, 파이썬이 가독성이 더 뛰어나서 우리는 파이썬을 택하겠다는 것이었다. 그래서 파이썬을 공부해 봤는데, 이런! 저런! 아싸! 공부를 시작한 지 하루도 안 되어 내가 원하는 프로그램을 만들 수 있었다.
이게 계기가 되어 파이썬 모임에도 나가게 되었고, 거기서 알게 된 친구들 중 상당수를 요즘도 만난다. 덕분에 좋은 인연을 많이 만들 수 있었다.
나를 위시해 주변에 파이썬 덕을 본 사람이 얼마나 많은가. 내 생각에 파이썬의 위력은 "쉬워 보이는 것"이다. 그 덕분에 파이썬을 갖고 뭔가 만들어보거나 이미 있던 것을 수정해 보거나 하려는 사람이 많다. 그래서 각종 라이브러리가 많이 있고 관련 문서도 꽤 있고 비슷한 경험을 해본 사람들을 찾기 쉽다.
언어적인 면에 있어서 파이썬은 그리 쌈빡한 언어가 아닐지도 모르겠다. 하지만 "일을 해낸다"는 면에 있어서, 실용적인 면에 있어서는 탁월하다. 내가 아는 언어 중에서 최고 수준이다. 무엇이건 슥슥 해낸다. 이것은 오로지 언어 하나만을 두고 하는 말이 아니다. 파이썬과 라이브러리를 합해서 볼 때 그렇다는 말이다. 비유하자면, 자기가 못하는 일일 경우 다른 사람과 협력해서 일을 완수하는 능력도 출중하다.
나는 파이썬을 통해 여러 가지 중요한 아이디어를 쉽게 배울 수 있었다. 디자인 패턴도 파이썬으로 공부를 했더니 훨씬 쉽게 이해가 되었고, 알고리즘도 파이썬의 도움으로 더 쉽게 익힐 수 있었다.
파이썬이 내게 준 도움은 이루 말할 수가 없다. 단검을 들고 싸우는 세계에서 장검을 얻은 것과 같았다. 요즘도 파이썬을 써서 10분 걸릴 일을 1분으로 줄이고, 1주일 걸릴 일을 하루로 줄이고 있다. 인생의 은인으로 생각하고 있다.
"파이썬 아저씨, 정말 고맙습니다. 아저씨 덕분에 남들보다 빨리 배우고 빨리 문제를 해결할 수 있었어요. 아저씨랑 함께라면 두렵지 않아요."
Io: 철학적인 대학 선배
파이썬 아저씨는 실용적인 면에서 최고를 달리지만 유연성이 아주 뛰어난 것은 아니었다. 하지만 Io는 반대다. 실용적인 면에서는 큰 가치가 없지만 유연성을 통해 내 생각을 뒤집게 해주었다.
2004년 정도 되었던 것 같다. Io를 우연히 알게 되었다. 처음에는 Io가 싫었다. 나는 괄호 혐오증이 있었는데(특히 파이썬을 쓰면서 더 강해졌다) Io는 리스프(Lisp)처럼 괄호를 많이 썼기 때문이다. 하지만 Io는 내게 새로운 세상을 열어주었다.
내가 보기에 Io로부터 경험할 수 있는 귀중한 패러다임은 최소 세 가지다. 하나는 프로토타입 기반, 두 번째는 액터 모델(Actor Model), 마지막으로 메타 프로그래밍이다. 세 가지 모두 컴퓨터 언어사에 있어 중요한 궤적을 남긴 개념들이다.
특히 프로토타입 기반 프로그래밍을 깊이 체험하면서 내가 가진 OOP에 대한 생각들이 훨씬 성숙하고 발전할 수 있었다. 프로토타입 기반 언어의 개념은 오래전부터 알고 있었다. 하지만 아는 것과 "갖고 노는 것"은 다르다. Io랑 놀면서 기존 OOP 언어(스몰토크와 그 자손들)의 한계를 벗어나면서도 더 OO라 할만한 자유로운 생각을 배웠다. 옛날에는 코딩할 때 클래스를 객체처럼 다루는 개념적 확장을 하고는 한계단 올라섰다고 생각했는데 Io를 배우고 나서는 객체를 클래스처럼 다루는 개념적 확장을 하게 되어 클래스와 객체의 구분이 없어지는 경지(?)에 이르게 되었다. 그 경험 이후에는 자바로 프로그래밍을 해도 전혀 다른 느낌이 들게 되었다.
주변에서 OOP를 하는 사람들을 보면, 어떤 문제가 주어졌을 때 자신이 그 문제에서 가장 중요하게 혹은 가장 복잡하게 생각하는 개념을 일단 클래스로 만들어 놓고 시작하는 경우가 많다. 그렇게 하도록 배웠기 때문이다. 하지만 그것은 개선의 여지가 있다. 클래스는 OOP 개념에서 너무 정적이다. 처음부터 자신이 앞으로 겪을 미래를 고정하고 올가미를 씌우는 셈이다. 내가 뭔가를 클래스로 만들려고 한다면 그게 만약 오브젝트라면 어떨까를 생각해 보아야 한다.
또 Io는 키워드가 없고, 정말 모든 것이 객체다(심지어는 자바나 스몰토크도 그렇지 못하다). 대단히 간단한 규칙에 기반을 두고 아름다운 세계를 만들어내는 Io는 현대화된 리스프라 부를 만하다.
Io 자체의 실용적 가치는 크지 않다(확장 라이브러리가 그리 많지 못하다). 원래가 임베디드 언어를 목적으로 만들었기 때문이다. 하지만 내 프로그래밍 철학에 큰 영향을 주었고, 지금도 나는 Io에서 배운 것들을 써먹고 있다.
"Io 선배, 정말 고마워요. 선배 덕분에 OOP에서 제가 믿고 있던 것들을 뒤집어 볼 수 있었어요. 덕분에 한 계단 올라갈 수 있었어요."
J: 수학과 천재 노교수
나는 내가 J를 공부했다는 사실이 믿기지 않는다. 그 정도로 나와 J는 잘 맞지 않는 언어였다. 그런데도 나는 몇 년째 J를 공부하고 사용해 오고 있다. 그러면서 내 선호도 바뀌고 있다. 참 신기하다.
J는 2005년부터 공부했던 것 같다. Io와 비슷하게 깨달음을 많이 받았다. 한 관문을 통과했다고 느낄 만한 시점이 여러 번 있었다. 그 때마다 세상이 달리 보였다.
J는 내가 이제까지 봐 온 언어 중 천재성이 가장 많이 발현된 언어 중 하나다. 워드 커닝햄은 이 언어에 대해, "Anyone interested in patterns should learn this language. It will take a week of evenings to grok. Then study the included phrase book and try to imagine what the same would look like in smalltalk, c++ or vb."라고 말한 바 있다.
J를 통해서는 존 바쿠스(John Backus)의 함수 수준 프로그래밍(function-level programming)을 배울 수 있었고, 표기법과 언어적 표현의 중요함을 느낄 수 있었다. 그리고 J를 배우면서 내 머리가 똑똑해지는 경험도 했다. 전에는 지하철을 타고 가면서 머리 속에서 프로그래밍을 하곤 했다(물론 TDD로!). 한 번에 다룰 수 있는 코드의 줄 수가 제한이 있었다. 하지만 J로 머리 속 코딩을 하면서는 한번에 다루어야 할 정보가 몇 글자 수준으로 단위가 바뀌어 버렸다. 훨씬 머리에 여유를 갖고 코딩을 할 수 있었다. 또 워킹 메모리가 넓어지는 경험도 하게 되었다.
"J 교수님, 정말 고맙습니다. 교수님 덕분에 제 정신을 좀 더 훈련할 수 있었고, 더 똑똑해진 것 같아요."
니체 가라사대
이 언어들 외에도 고마운 언어가 참 많다. 하지만 대표로 네 개의 언어만 뽑았다. 다른 언어들이 서운해 하지 않았으면 좋겠다. 그런데 이 넷 중에서도 특히 Io와 J에 대해서는 좀 감정이 유다르다. 우선 두 언어를 비교해 보자.
2005년 한해는 Io와 J에서 많은 계발을 받았다. 아마 내 프로그래밍 역사에 있어 기억에 남는 해가 되지 않을까 싶다. Io와 J 모두 훌륭한 언어라고 생각하는데 그 스타일을 놓고 보면 완전히 극단적인 반대라고 볼 수도 있다.
Io는 찰흙이고 J는 수정(crystal)이다.
Io에서는 자기가 원하는 환경을 새롭게 만들어 내고 다시 그 위에서 내게 편리한 환경을 쌓아 올릴 수 있다. 내가 원하는 세상을 만들 수 있다. 거의 아무런 제약이 없다. 내 머리에 맞게 언어를 꾸밀 수 있다(이렇게 한 언어의 기능을 이용해 그 위에 새로운 언어를 만들어 내는 것을 "내장 도메인 특정 언어"라고 한다).
반면 J에서 그것은 쉽지 않지만, 이미 만들어져 있는 환경이 너무 완벽하다. 바흐의 음악을 들으면 필연성(이 음 다음에는 저 음이 나와야 한다는 우주적, 수학적 필연성)이 느껴진다는 사람이 있는데, J가 그렇다. 수십 가지 연산자가 굉장히 절묘하게 구성되어 있다. 누가 자칫 손을 잘못 댔다가는 그 아름다운 수정이 부서질지도 모르겠다. 내 머리가 그 언어적 사고 방식을 배워야 한다.
Io는 "머리에 맞추고", J는 "머리를 맞춘다".
하지만 Io와 J 모두 내게는 공통점이 있었다. 이 두 언어 모두 이전의 내가 한 눈에 고개를 가로저을, 싫어하는 언어의 분류에 속했다. 하지만 그 혐오감을 무릅쓰고 외피를 조금 벗겨내 속으로 들어가자 황홀경이 펼쳐졌다. 그러자 표면적인 거부감도 더 이상 문제가 되지 않았다.
이를 통해 나는 참으로 귀중한 교훈을 얻었다. 내가 쉽게 부정하거나 거부하는 것 중에는 그 속에 보물이 숨겨진 경우가 있다. 그리고 그 보물을 경험하게 되면 내가 좋아하는 것의 폭이 넓어질 수 있고, 무엇이 좋고 나쁜지에 대한 감수성이 더 예리해지고 그 통찰력이 깊어진다. 중요한 부분은 이것이다. 감수성이 더 예리해진다. 싫어하는 것도 좋아할 수 있게 되면 단순히 이것도 좋고 저것도 좋다가 되는 게 아니다.
|
나를 죽이지 않는 것은 나를 더 강하게 만든다. (Was mich nicht umbringt, macht mich stärker.) -- 니체
|
교훈 몇 가지
마지막으로 내가 이 언어들을 접하면서 얻은 언어 학습에 대한 교훈 몇 가지를 정리해 볼까 한다. 내가 얻은 교훈이므로 다른 사람과는 의견이 다를 수 있다.
- 이미 언급했지만, 처음 봐서 싫어하는 언어 중에 내게 학습 가치가 큰 것들이 꽤 있다.
- 금방 배울 수 있는 언어가 있고 오래 걸리는 언어가 있다. 전자는 직접적 가치가 큰 것이고 후자는 간접적 가치가 큰 것이다. 보통 전자에만 투자를 하는데 이것은 좋은 전략이 아니다.
- 한 언어를 적어도 1년 이상은 꾸준히 공부하고 써봐야 그 철학을 자기화할 수 있다.
- 최소 하나 이상의 언어에 대해서는 전문가 수준이 되어야 한다. 전문가란 지속적으로 높은 퍼포먼스를 내는 사람을 말한다. 그러려면 변동이 적어야 한다. 한 시간 걸릴 줄 알았는데 열 시간, 일주일 걸리면 전문가가 아니다. 어떤 문제가 일어났을 때 그 원인을 예상하는 시간 내에 파악하고 해결할 수 있어야 한다. 그러려면 그 언어와 구현, 표준 라이브러리들을(때로는 플랫폼까지도) 깊이 알고 있어야 한다.
- 우선은 (잘난 척 하지 말고) 그 언어의 결에 맞게 프로그래밍하도록 노력한다. 나무를 결을 따라 자르면 쉽지만 그렇지 않으면 힘도 더 들고 칼날만 상한다. 이를 위해서는 그 언어의 표준 라이브러리 소스를 읽어보는 것이 도움이 된다.
여러분도 자신에게 고마웠던 언어들에게 감사 표현하기를 해보면 어떨까? 그 언어들이 좀 더 친숙하게 다가오고, 또 더 많은 애착을 느끼게 될 것이다. 단, 혹시 서로 눈물을 흘릴지도 모르니 화장지를 옆에 준비하길 바란다.
이 문서 북마킹 하기
[지난 developerWorks Column 보기]
|