메아리 저널

왜 나는 이 짓을 하고 있는가​

석사 신환회 뒷풀이에서 왜 나한테 프로그래밍 언어에 관심을 가지게 되었는지 묻는 사람이 있었다.

그 때는 대답하기 그렇게 녹록치 않은 문제라 대답을 그냥 안 했는데, 지금 생각해 보니 내가 왜 이런 과정에 도달했는가를 써 놓는 것은 다른 사람에게도 영감을 줄 뿐만 아니라 나 자신에게도 지금의 길에 대한 생각을 다시금 할 수 있다는 점에서 나쁘지 않을 것 같다. 그래서 한 번 써 본다. 꼭 프로그래밍 언어 뿐만이 아니라, 어릴 적부터 내가 어떤 생각을 해 왔는지를 얘기할 것 같다.

컴퓨터

컴퓨터 얘기부터 먼저 하면, 난 1995년에 컴퓨터 학원에서 컴퓨터를 처음으로 접했다. 그 때만 해도 컴퓨터가 그렇게 대중화되진 않았고 컴퓨터를 배울 때는 먼저 타자연습, 그 다음에 도스 명령어, 그 다음에 GW-BASIC을 배우는 게 일상사였다. (윈도 95가 이 해에 발표되긴 했지만 내가 윈도만 쓰는 환경으로 전환한 건 그로부터 한참 뒤의 일이었다.) 왜 컴퓨터 학원에 들어 갔는진 모르겠다 — 아마도, 부모님이 그냥 피아노 학원 들러 보내는 것 마냥 생각하고 보낸 것일 게다.

그래도 당시에는 컴퓨터를 배운 사람의 수는 그렇게 많지가 않았고, 아마도 그 때 손을 든 죄(?)로 나는 초등학교 3학년 때1 한국 정보 올림피아드(이하 KOI)에 출전하게 되어 버렸다. 물론 시 대회에서 떨어졌지만. 그리고 그 다음 해에는 작년에 나갔던 사람이라는 이유로 출전했고, 그렇게 초등학교 네 번, 중학교 두 번, 고등학교 두 번에 걸쳐서 총 8회 KOI 출전이라는 쓸데 없는 기록을 세워 버렸다. 이 와중에 전국대회 은상을 타는 데 성공했기 때문에 입시에 굉장한 도움이 되었고, 정신을 차리고 보니 나쁘지 않은 대학교에 와 있더라… 이런 얘기가 되겠다.

KOI를 얘기하려면 학원을 하나 더 이야기해야 한다. 내가 처음 갔던 컴퓨터 학원에서 벗어나 새로 등록한 컴퓨터 학원의 원장은 델파이 프로그래머였는데 그 때문인지 다른 학원들에 비해 프로그래밍을 가르치는 비율도 꽤 되었다. 이 즈음에서는 윈도가 보편화되고 프로그래밍보다는 사무 자동화를 가르치는 게 일반적이었기 때문에 좀 특이한 학원이라 할 수 있었다. 학원에는 나와 함께 KOI에 나가던 동기가 두 명 있었는데, 우리를 지도하던 원장의 교육 스타일은 뭔가를 가르치는 대신에 그냥 내버려 둔 채 공부하라고 하고 종종 심심하면 옛날 이야기나 하고 그러는 것이었다. 교수법 말고도 원장이 학생들에게 아주 좋은 평판을 받은 건 아니라서, 내 지인 중 한 사람이 짜증나서 그만 뒀다고 했을 정도이다. 뭐, 그의 교수법이나 성격이 어떻든 결과는 나쁘지 않았으니, 셋 모두 중학교를 졸업하기 전에 전국대회 입상에 성공했다. 따지고 보면 인사라도 한 번 하러 가야 하는데, 안타깝게도 나는 더 이상 그의 근황을 알지 못 한다.

프로그래밍

KOI에 계속 출전하다 보면 “도대체 이걸 배워서 어디 쓰냐?”라는 의문이 들게 된다. 프로그래밍에 대한 이해가 깊지 않아서 생기는 딜레마인데, 나 역시 중학교 2학년 때 전국대회 은상을 받은 직후 저 의문이 굉장히 크게 다가 왔었다. 그래서 그 해의 여름 계절학교 때 각종 만행2을 저지르면서 통신 교육 받기도 전에 짤리는 전무 후무한 기록을 세웠고, 3학년 땐 애플리케이션 프로그래밍을 하겠다며 공모부에 도전했다가 날짜에 못 맞춰서 말아 먹었다. 뭐 그래도 그 때는 입시라는 게 실감이 잘 안 날 때였고, 앞으로 뭘 해야 할지에 대한 고민이 적던 때였으니까 그러려니 한다.

고등학교는 아니었다. 중학교 때 성적은 나쁜 편은 아니었지만 그렇게 특출난 편도 아닌지라, 특기자 전형이라는 사기 스킬로 과학고등학교에 입학한 뒤 한동안 적응을 못 해서 많이 고생했다. 과학고에서 유일하게 문제 없이 따라갈 수 있던 과목은 수학 뿐이었고, 나머지 과목들은 열심히 공부는 했지만 성적은 그야말로 개판 오분 전이었다. 설상 가상으로 고등학교 때 KOI에 출전은 하기는 했지만 중학교 3학년 때 빠진 게 컸던지라 그다지 좋은 결과는 거두지 못 했다. 사정이 이러하니 “될 대로 되라”라는 식으로 하고는 있었지만 미래에 대한 불안감이 사라지는 건 아니었다.

그 때 나는 내가 프로그래밍을 재밌어 한다는 점을 발견했다. 중학교 때까지만 해도 프로그램을 종종 만들기는 했지만 프로그래밍을 본격적으로 하기보다는 KOI 준비 같은 데 치중했던 것이다. 그래서 자습 시간에 자습은 안 하고 복사실에서 노트북3을 들고 프로그래밍을 하고, 이것 저것 정보도 찾아 다니고 그랬다. 처음에는 PHP 웹 프로그래밍으로 시작했지만 (이거야 이미 중학교 쯤에 하던 거긴 했으니까) C와 C++를 다시 공부하고, 나중에는 네트워크 프로그래밍과 리버스 엔지니어링까지 별 걸 다 시도했다. 지금은 눈 감고도 코딩하는 파이썬을 접한 것도 이 근방이었고 리눅스와 같은 비 윈도 운영체제를 인식하거나, 오픈 소스 소프트웨어에 눈을 뜬 것도 이 즈음이었으니, “놀았다”라고 말하기에는 다소 어폐가 있다. “열정을 다른 곳에 쏟아 부었다”라는 표현이 더 맞겠다.

물론 그렇다고 내 천성이 달라지는 건 아닌지라, 컴퓨터 동아리 발표에서는 프로그램을 짜다가 기한에 못 맞춰서 그럴듯한 GUI를 달아서 가짜-_- 시연을 했고, 고등학교 졸업 즈음에 맡은 학교 홈페이지 개편 작업 역시 말아 먹었다. 하지만 적어도 프로그래밍이 내가 적절한 동기만 부여되면 꾸준히 할 수 있는 일이라는 확신이 생겼고 저절로 전공도 이 쪽을 살릴 수 있는 걸로 해야 겠다는 생각이 들었다. 천만 다행히도, 내가 고등학교 때 심각하게 딴 짓을 하긴 했지만 아슬아슬하게 대학교 진학이 가능한 성적은 유지하고 있었기에 (대략 학년 전체에서 상위 60% 근방) 모두 안 될 거라는 예상을 깨고 조기 졸업이 가능했다. 사실 그 해에 특히 조기 진학한 사람이 많았던 것도 그렇고 내가 면접을 볼 때 세 문제를 모두 순서대로 틀린 뒤 역순으로 다시 풀어서 모두 맞추는 뻘짓(…)을 한 것도 있고 해서 나는 이걸 거의 운이라고 생각하는데, 이렇게 말하면 화내는 사람들이 종종 있더라.

고등학교 때 프로그래밍에 대한 자신감이 어느 정도 확보되었다면, PL 분야에서는 난해한 프로그래밍 언어를 처음으로 접한 때이기도 하다. 지금에서야 고백한다. 내가 PL에 관심을 가지게 된 것은 처음에는 저것 때문이었다. 지금이야 저런 류의 프로그래밍 유희는 간간이 할 뿐이지만 그 때는 뭔가를 한 번 잡으면 놓질 못 하는 시기였던지라, 굉장히 뇌리에 박혔던 듯 하다. 한편으로는 고등학교 시절 때 형성된 가치관도 여럿 있는데, 이를테면 내가 사교육을 굉장히 싫어하는 이유 중 하나는 고등학교 때 토요일에 자기네 학원 학생들을 모조리 버스에 태워서 데리고 갔다가 일요일에 다시 돌아 오는 ㄱㅁ학원 같은 곳들을 목격했기 때문이다. 당시 그런 류의 학원에 다니고 있지 않은 사람은 나를 포함해 극소수에 불과했다.

프로그래밍 언어

나는 2005년에 대학교에 입학했다. 그 해 첫 학기는 학부생이 필수로 들어야 하는 과목들로만 채워져 있었는데 (전공은 4학기 째에 정한다) 물론 기대를 저버리지 않고 최악의 평점을 받았다. 4.3 만점에 2.06. 웃긴 것은 장학금 커트라인은 2.0이었기 때문에 아슬아슬하게 장학금은 받을 수 있었다. 첫 학기에 내가 교양 과목에 연이 없다는 걸 일찌감치 깨닫고 아직 전공도 정해지지 않았는데 그 다음 학기부터 전공 과목을 듣기 시작했으며, 그 뒤에도 교양 과목은 졸업에 필요한 과목만 들었기 때문에 대부분의 전공 과목들을 원래 들어야 할 시점보다 대략 한 두 학기 앞서 듣게 되었다.4 따라서 장학금 커트라인은 그 뒤로 꾸준히 올라 갔지만 커트라인은 어떻게든 맞출 수 있었다. 하지만 첫 학기에 말아 먹은 전체 평점은 졸업할 때까지 큰 폭으로 회복할 수가 없었다.

대학교 시절에 한 삽질은 고등학교 때보다 시간이 많았으니만큼 훨씬 그 범위가 다양하고 양도 많다. 물론 내 천성은 여전해서 한 번 한 삽질이 끝이 나는 경우는 많지 않았는데, 그런 삽질들 중에 특히 오래 간 것이 theseit 프로젝트나루 프로그래밍 언어였다. 개인적으로 이들로부터 얻은 것이 많은데, 먼저 theseit의 경우 어떻게 협업 개발을 해야 하는지에 대한 감을 얻었으며 대규모 소프트웨어의 설계와 관리에 대한 통찰을 얻을 수 있었다. (애당초 대부분의 프로그래밍을 혼자 해 왔으니 이런 경험을 할 기회가 별로 없었다.) theseit 프로젝트의 실패(-_-;)는 내가 소프트웨어 설계에 대한 중요성을 깨달은 계기기도 하며, C++ 프로그래밍이 드럽게 귀찮다는 걸 몸소 체험하는 기회이기도 했다.

theseit는 물론 대형 프로젝트라고 하기에는 다소 무리가 있는 크기지만 (C++로 4만줄 정도) 그 뒤로도 어느 정도 규모가 있는 소프트웨어를 개발 및 유지보수할 일이 꽤 있었고, 산업기능요원으로 근무하던 회사에서는 2~300만줄 정도 되는 코드 베이스를 관리했던 것 같다. 이러면서 프로그래밍에서 프로그래밍 언어가 차지하는 비중이 생각 외로 크다는 것을 깨달았다. 흔히들 소프트웨어의 설계는 프로그래밍 언어와 무관하다고 생각하지만, 바로 그 이유 때문에 설계에서 생기는 버그와 그렇지 않은 버그는 처치 방법이 서로 구분되어야 한다. 설계야 사람 손이 들어 갈 수 밖에 없는 것이라 어쩔 수 없지만, 이를테면 버퍼 오버플로우 같은 버그들은 순전히 안 좋은 프로그래밍 언어를 써서 생기는 문제가 아닌가? 물론 이걸 해결하기 위한 정적 분석 도구도 존재하지만, 그 도구 역시 나는 프로그래밍 언어의 일부라고 본다.

사실 내가 관심을 가진 주제가 프로그래밍 언어 뿐만은 아니었다. 게임 개발 동아리에 들어 간 것만 봐도 알 수 있듯 나는 게임 프로그래밍, 특히 대규모 컴퓨터 그래픽스와 그로부터 파생되는 각종 컴퓨터 구조 및 운영체제에도 관심이 있고, 인간-컴퓨터 상호작용에도 관심이 있으며, 회사에서 그렇고 그런 일을 했으니만큼 암호학과 정보 보안에 대해서도 어느 정도 할 말은 있다. (사실 학부 때 잡다하게 많이 들은 이유도 이것 때문이다.) 하지만 이들의 뿌리를 잘 살펴 보면 프로그래밍 언어가 관여하는 부분이 굉장히 많다: 게임 프로그래밍에서는 컴퓨터 구조를 100% 활용할 수 있으면서 저수준을 건들지 않으려고 하는 경향이 있기에 좋은 프로그래밍 언어가 필요하고, 넓은 의미에서 프로그래밍 언어는 개발자와 컴퓨터가 소통하는 HCI의 문제에 가까우며, 정보 보안이 뚫리는 많은 원인이 잘 설계되지 못 한 프로그래밍 언어에서 발생한 인간의 오류 때문이다. 프로그래밍 언어는 전산학에서 아주 현실과도 멀지 않고 아주 이론과도 멀지 않은 적절한 위치에 있는 분야로, 내가 원하는 바에 잘 부합했다.

그래서 시간이 지나면서 프로그래밍 언어를 전공하려는 생각은 강해졌다. 마침 주변에 프로그래밍 언어의 개발과 구현에 관심 있는 사람들이 모인 포럼이 생기길래 거기에 터줏대감으로 자리잡기도 하고, 좀 더 넓은 프로그래밍 패러다임에 익숙해지기 위해 이것 저것 다른 언어도 접해 보고 프로그래밍도 해 봤다. 정작 대학원 입학 서류에는 프로그래밍 언어에 관심만 있다고 써 놓긴 했지만 대략 2008년 이후로 방향이 잡혔다고 봐도 무리는 없을 것 같다.

비젼

2010년 2월, 나는 학부를 졸업하고 대학원에서 석사 과정을 밟게 되었다. (도무지 이해할 수 없는 총장의 정책 덕분에 학부 졸업이 석사 입학보다 뒤라는 건 뭐 넘어 가자.) 앞으로 아주 큰 문제가 없다면 나는 프로그래밍 언어를 연구하는 연구실에서 랩 생활을 하게 될 것이다. 물론 재수 없게 엉뚱한 연구실이 걸린다면 그 때부터는 좀 심각한 고민을 해 봐야 겠지만 (…).

내가 만들고 싶은 프로그래밍 언어는 무엇인가? 내가 나루를 기술할 때 자주 사용하는 한 마디는 “정적인 언어와 동적인 언어의 교점”인데, 이는 동적인 프로그래밍 언어의 장점인 빠른 개발 및 친숙감과, 정적인 프로그래밍 언어의 장점인 속도 및 정확성(correctness)을 모두 수용할 수 있는 언어라는 말로 풀이된다. 2005년 나루 개발을 시작한 이래 지금까지 이 문제로 굉장히 골치를 앓았는데 아직 딱히 결론에 도달한 건 없고 오히려 혼란만 가중되는 느낌이다. 하나 분명한 것은, 정적인 언어와 동적인 언어가 분리되는 건 좋지 않다 — 이를테면 파이썬의 “속도가 필요한 부분만 C로 짜자”라는 태도는 일반적인 해결책이 될 수 없다는 얘기다.5 그 밖에 프로그래밍 언어의 점진적인 진화가 가능하도록 일반적으로 확장 가능한 언어가 되어야 하고6 언어의 문법과 의미론이 사용성을 고려하여 (가능하다면 실험을 통해) 설계되었으면 좋겠다. 써 놓고 나니까 무슨 괴물을 만드려는 것 같아 보이긴 하다만.

그래서 프로그래밍 언어가 좋아지면 다른 게 좋아질까? 나는 그렇다고 믿는다. 현대 기술의 대부분은 프로그래밍에 절대적으로 의지하며 잘 돌아 가고(= 그 목적을 충실히 달성하고) 좋은(= 사용자에게 가치를 전달하는) 소프트웨어의 필요성은 나날이 높아져 가고 있다. 그런데 잘 돌아 가는 소프트웨어와 좋은 소프트웨어를 만들 수 있는 사람들은 서로 구분되어 있다. 소프트웨어를 정말 잘 돌게 만들려면 강건한 설계와 프로그래밍 및 테스팅, 그리고 이를 뒷받침할 관리 체계가 있어야 하는데, 좋은 소프트웨어는 이런 사무적 환경에서 오히려 잘 안 만들어지는 경향이 있다. (쉬운 예로 알집은…) 정적인 언어와 동적인 언어 사이의 갈등과 비슷한데, 기업용 소프트웨어에서 정적인 언어가 많이 쓰이고 비기업용 (이를테면 웹) 소프트웨어에서 동적인 언어가 상대적으로 더 쓰이는 것도 이와 무관하지 않으리라 본다.

나는 기업적인 정서7를 애초에 좋아하지 않는 사람이며, 좋은 소프트웨어를 만드려는 사람이 더 인간적8이라고 본다 — 따라서 나는 인간적인 사람이 잘 돌아 가는 소프트웨어도 잘 만들 수 있는 환경을 만들고 싶다. 앞으로 정확히 무슨 일을 하게 될지는 두고 볼 일이지만, 이 목표를 잊지는 않으리라.


  1. 아는 사람은 알지만, 이 해가 바로 현재의 KOI 경시부의 형식이 갖춰진 해이다. (그 이전에는 전국 PC 경진대회인가 뭔가가…) 첫 해였던 지라 원래는 초등학교 4학년부터 출전 가능함에도 불구하고 시행에 좀 착오가 있었던 모양이다. 

  2. 연습 시간에 컴퓨터실에서 랜선을 일부러 꽂아서 놀고, 지뢰찾기만 줄창 한다거나 하는 짓을 했다. 심지어 기숙사에 자러 가서는 맨날 밤새도록 놀아 댔으니 지도하는 사람 입장에서는 미운 털이 안 박힐 수가 없다. 나중에 들어 보니, 당시의 내 만행은 거의 전설화 되어서 입으로 전해 내려 오고 있더라… 

  3. 고등학교 1학년 때는 모 선생님의 노트북을 빌려서 쓰다가 너무 많이 쓴 나머지 발열 때문에 전원부를 녹여 버리는 사고가 있었다. 결국 2학년 이후로는 부모님께 부탁해서 노트북을 새로 샀는데, 이걸 대학교 3학년 때까지 계속 썼기 때문에 표면이 모조리 긁혀서 “썰매 노트북”이라는 별명이 붙게 된다. 지금 이 노트북은 액정이 나간 뒤 분해된 채로 집에 잘 모셔져 있다. 

  4. 어떤 학기에는 전공 과목만 여섯 개(18학점) 듣는 뻘짓을 한 적이 있다. 체력에 다소 무리가 왔지만 어떻게든 버틸 수 있었는데, 졸업 직전 학기에 비슷한 짓을 했더니 깔끔하게 망한 걸로 봐서 역시 이런 뻘짓은 빨리 할 수록 좋은 것 같다. 

  5. 정적인 언어와 동적인 언어가 모두 필요한 상황에 대해서는 모두 동의하리라 믿고 이 문제를 설명하자면, 정적 언어와 동적 언어가 결합하는 부분에서 비직관적인 인터페이스가 생기거나 (이를테면 Boost.Python) 정적 언어에서 버그가 생기는 등의 가능성이 상존한다. 또한 동적 언어를 지원하기 위해서 정적 언어에 가해지는 제한(파이썬의 경우 GIL이라거나 이런 것들)이 많기 때문에 자칫 실수하면 둘 다 말아 먹기 좋다. 사실 흔히 말하는 임피던스 불일치 문제는 비단 SQL과 객체지향 언어 사이에서만 발생하는 게 아니라 다른 개념을 가진 서로 다른 언어를 묶으려 할 때 생기는 일반적인 문제이다. 

  6. 연산자 오버로딩 수준의 단순한 확장은 안 된다. 이를테면 내 생각 중 하나는 메모리 할당 모델, 특히 가비지 컬렉션(GC)을 언어 확장만으로 구현할 수 있어야 한다는 것이다. 이게 된다면 정적인 언어 위에 GC를 얹어서 “사실상” 동적인 언어로 쓰이게 하는 것도 가능할 것이다. 

  7. 영어로 쓴다면 “enterprise-y”한 것들. 대표적인 예로 자바(…) 

  8. 지금껏 내 글을 유심히 봐 왔다면 내가 “사람”과 “인간”이라는 말을 구분하는 경향이 있다는 걸 눈치챘을 지도 모른다. (힌트를 주자면 나는 “사람”을 “인간”보다 더 좋은 의미로 쓴다.) 하지만 이 문맥에서는 “비인간적”이지 않음을 강조하려 했기 때문에 그냥 “인간적”이라고 썼다. 인간적인 것보다 더 좋은 것이라면 사람스러운 거겠지만, 그래도 어느 쪽이든 비인간적인 것보다는 훨씬 나으니까. 


노트들

  1. arachneng posted this
텀블러를 씁니다.