Daybreakin Things
내가 전산과에 들어가서 알게 된 것 중 하나는 전산과 학생들이 누구나 다 프로그래밍을 잘 하는 건 아니라는 사실이다. 그것도 국내에서 나름 가장 수준높은 학생들을 모아놓은 카이스트임에도 말이다. (사실 나는 전부 다 괴짜에 전부 다 초천재적으로 엄청난 알고리즘들을 쏟아내며 코딩하는 줄 알았다.) 대개 프로그래밍을 어렸을 때부터 해왔던 아이들이 잘 하는데, 자세히 보면 뭔가 스스로 삽질을 많이 해본 아이들이 습득 속도도 빠르고 응용력도 더 높은 걸 볼 수 있었다. (가장 대표적인 예는 토끼군. ㅋㅋ)
나는 프로그래밍을 초등학교 5학년 때 처음 접했는데, 당시 시작한 것이 Q-BASIC이었다. 집에 있던 시리즈 과학책 중에 GW-BASIC으로 프로그래밍하는 것을 예제 중심으로 다룬 책이 있었는데, 그걸 보고 혼자 따라하다가 곧 내가 만들어보고 싶은 프로그램을 만드는 것으로 바뀌기 시작했다. 6학년 때 Visual Basic을 접했고 이때부터 본격적인 삽질의 나날이 시작되었다. 프로그래밍을 접하기 전에 내가 가장 관심있었던 것 중 하나는 각종 전략시뮬레이션 게임(스타나 커맨드앤컨커 같은)들의 맵에디터를 빠삭하게 꿰차는 것이었다. 과연 이 게임들은 내부가 어떻게 돌아가는 걸까에서 출발한 호기심이 결국 지금의 나를 만들었다고 하겠다.1
당시 만든 것 중 지금까지도 기억에 남는 프로그램들이 몇 가지 있는데, 당시 유행하던 레드얼럿의 커스텀 미션을 만들 수 있도록 해주는 레드얼럿 미션에디터와 탭브라우징이란 개념이 널리 퍼지기 이전에 한 창에 여러 웹페이지를 보여줄 수 있는 방법이 없을까 고민하다가 만든 MDI 형식의 웹브라우저가 있다. (물론 HTML 해석기를 구현한 건 아니고 IE 컴포넌트를 쓴 거였지만. 뭐, XML/HTML 파서를 만들려고 시도해본 적은 있다.)
중학교 1학년이 지나면서부터는 비주얼 베이직에서 제공하는 모든 기본 기능과 라이브러리들에 대해 익힐 수 있었고, 미약하게나마 객체지향을 터득하면서 인터페이스 개념을 알게 되었다. (비주얼 베이직은 상속이 안 되지만 나름대로 객체지향적 특징을 가지고 있었다.) 중학교 2학년 때가 가장 절정을 이루었는데 비주얼 베이직의 끝을 본 건 분명 언어는 비주얼 베이직이지만 비주얼 베이직 런타임에 의존하지 않고 순수 윈도 API만으로 윈도 어플리케이션 만드는 방법을 완전히 이해했고--물론 실제 구현하려면 수많은 삽질이 필요하겠지만 어쨌든 원리는 이해했다--인터넷에 올라온 글을 보고 알게 된 것이긴 하나 비주얼 베이직의 특정 함수를 어셈블리 코드로 대치해서 실행한다든지, 또 정식으로 공부한 건 아니지만 재귀를 어떻게 루프만으로 구현할 것인지 등에 대한 어렴풋한 이해를 가지기 시작했다. 이와 함께 어지간한 프로그램을 보면 내가 아직은 잘 모르는 C/C++ 언어로 만들었겠지만 대충 이러이러하게 구현했겠구나라는 정도의 감각이 생겼다.
당시 SQL이나 DBMS에 대한 개념이 없었기 때문에 ADO 관련된 컴포넌트만 안 써봤고, 그 외에는 비주얼 베이직을 거의 극한까지 다루어봤다고 할 수 있겠다. 이 정도 단계에 다다르면 어떤 의문점이 생겼을 때 레퍼런스를 잘 찾아보든지 스스로 설계를 얼마나 더 잘하느냐가 해결의 성패를 좌우하게 되는 것 같다. (물론 고등학교 때 친구 토끼군인 비주얼 베이직으로 즉석에서 디자인한 스크립트 언어의 인터프리터를 구현해내는 걸 보고 또 다른 차원이 있다는 걸 깨닫게 되었지만, 지금은 그에 필요한 이론 지식들을 어느 정도 알고 있으므로 다시 내가 한다면 가능할 것 같다.)
중학교 3학년때와 고등학교 때는 학업 때문에 프로그래밍을 깊게 팔 기회가 없었고, 고등학교 때 수박 겉핥기 식으로 C++의 아주 극히 일부만 조금 배웠다. 대학에 와서는 학교 커리큘럼을 따라 Java를 익히기 시작했는데 사실 처음으로 다뤄본 완성도 있는 객체지향 언어였음에도 처음 프로그래밍을 접하던 친구들에 비해 훨씬 빠르게 익힐 수 있었으며 2, 3학년을 거치면서 PHP, Python, Javascript 등 다른 언어들도 상대적으로 손쉽게 두려움 없이 접근·터득할 수 있게 되었다.
특히 중학교 시절 쌓은 수많은 삽질 경험은 전산과 최고의 로드를 자랑하는 시스템 프로그래밍과 운영체제 과목에서 진가를 발휘했다. 매뉴얼(MSDN)을 보고 이 함수가, 이 컴포넌트가 어떤 방식으로 동작하는지 이해하고 실제로 사용해보고, 또 내가 그걸 이용해서 뭔가 만들어볼 수 있지 않을까 하면서 머리 굴려가며 시도해본 온갖 잡다한 미니프로젝트들은 결과적으로 거대한 시스템의 내부를 들여다보고 남들보다 빠르게 이해하는 능력을 키워준 것 같다.
시스템 프로그래밍 과목은 1번 프로젝트부터 5번 프로젝트까지 계속 기존 코드에 기능을 덧입히는 식으로 진행되었는데, 상당수의 학생들이 초기 명세에만 대응된 설계를 했다가 갈아엎는 일이 많았지만 나는 한 번도 갈아엎지 않고 꽤 깔끔하게 마지막 프로젝트까지 커버할 수 있었다. 이런 건 누가 가르쳐준 것도 아니고 누군가의 도움을 받은 것도 아니지만, 스스로 크고 작은 규모의 프로그램을 만들면서 왜 이렇게 설계하면 안 좋은지 좋은지를 깨달았기 때문이라고 할 수 있겠다. (이에 대한 보다 구체적인 지식은 소프트웨어 공학을 접하면서 배우게 되었지만, 나름의 내재된 감각이 생겼던 것이다.)
사실, 아직은 나 자신이 정말 프로페셔널한 '업계'에서 일해본 경험이 없어서 겐도님처럼 자신있게 "한 달의 기간이 있으면 아키텍처 설계를 포함해 그 언어를 습득·활용할 수 있고 1년이 지나면 전문가라고 말할 수 있다" 정도의 수준인지 아닌지는 나도 잘 모르겠다. 스스로 검증해본 적이 없기 때문이다. 학교 프로젝트를 통해 언어나 개발 환경을 접하게 되면 딱 그 프로젝트를 해결하기 위한 내용만을 익히게 되는 경우가 많고--더군다나 언어는 가르치지 않는다는 카이스트의 풍토 덕분에--실제 회사에서 풀타임으로 일하면서 온 신경을 그것에만 집중하며 배울 때와는 많이 다르기 때문인 것도 있다. 아직 회사에서 일해보질 않았으니까. 게다가 나는 전문 학원을 다니면서 프로그래밍을 배운 것도 아니요, 알고리즘 문제 해결을 위한 공부를 별도로 진행했던 것도 아니라 순수하게 내 호기심과 내 필요를 충족시키기 위해 프로그래밍을 배워왔기 때문에 정말 내가 전문가의 수준에 도달했는지 안 했는지 객관적으로 판단할 근거가 없어 자신없는 부분도 있다. 학부 전공을 하면서 보다 체계적으로 배우면서 단순 호기심과 필요만으로는 채워지지 않은 빈구멍들을 많이 메꿀 수 있었지만 이게 충분한지는 실무에 부딪혀보기 전에는 모를 것 같다.
어쨌든 나한테는 새로운 언어와 개발환경을 익히는 것이 더이상 두렵지 않다. 내가 새로운 환경을 접할 때 더 많이 고려하는 것은 이것이 과연 나의 삽질을 줄여줄 수 있는가, 그리고 오랫동안 지속 가능한 티핑 포인트를 넘었는가, 설계가 개발자의 가능성과 역량을 제한하는 부분은 없는가 등이다. 물론 대부분 일장일단이 있기 때문에 단순 가치 비교는 힘들지만, 어쨌든 필요하다면 배워서 쓸 수는 있다는 것이다.
비주얼 베이직 하나를 깊게 팜으로써 결국 다른 객체지향 언어들을 보다 쉽게 익힐 수 있었고, 하나를 익힐 때마다 그 다음 것을 익히는 데에 걸리는 시간은 점점 줄어들었다. 마치 기존의 지식과 새 체계를 diff 뜨듯 학습한다고나 할까. 물론 단순 diff는 곤란하고 그 안에 내재된 본질을 알고 있어야만 진정 효과가 있을 것이겠지만.
이런 접근 방식은 프로그래밍 말고 중고등학교 시절의 학업에도 큰 영향을 끼쳐, 게임 중독에 가까울 만큼 판판이 놀아가며 학원이나 과외도 받아보지 않고 참고서도 본 경험이 없는 채로 초등학교를 졸업한 후 단 한 학기만에 공부 요령을 터득함으로써 학년이 오를수록 더 적은 시간과 노력을 투자하여 비슷하거나 더 나은 성적을 거두는 결과를 얻기도 하였다. (1학년 1학기 중간고사는 한달을 공부했지만, 3학년 2학기 기말고사는 딱 4일 공부했다. 하지만 결과는 동일하게 전교 10등이었다.)
자기만의 지식 재조직화 과정을 통해 본질을 이해한다면 그 어떤 종류의 학문이라도 초기 문턱만 넘는다면 훨씬 능률적으로 일할 수 있을 것이라 생각한다. 다만 개인적으로 한 가지 아쉬운 점은, 현재의 한국 공교육·사교육을 통틀어 이러한 지식 재조직화 능력을 길러주는 곳이 거의 없다는 것이다. 대학에서 프로그래밍을 처음 접하는 많은 학생들이 어려움을 겪는 이유도 이런 곳에 있는 것이 아닐까?
Total Annihilation과 Supreme Commander는 이런 점에서 보았을 때 나에게는 아주 훌륭한 해킹 대상이었다. 게임 내부 데이터를 열어보고 다룰 수 있는 도구를 구할 수 있었기 때문이다. 중학생 때 유닛 타입과 가중치 숫자들이 나열된 AI 정의 파일을 보고 어렴풋하게나마 확률의 개념을 생각했었고, 이러한 경험은 나에게 큰 즐거움이었다. ↩