문과생의 서바이벌 프로그래밍
따로 코딩을 배워보지 않은 문과생이라도 사무일(paper work)을 한다면 엑셀을 통해서 자연스럽게 컴퓨터와 소통을 하게 된다. 나의 경우는 (아무런 체계도 잡혀 있지 않은) 미군부대 행정병으로 엑셀을 처음 만나게 되었다.
이등병이었던 나에게 엑셀은 그냥 표를 작성하는 프로그램에 불과하였고 사칙연산 이외의 함수가 존재하는 것도 몰랐다. 더욱이 타이핑도 제대로 못하는 미군들에게 행정업무를 배운다는 것은 정말 절망이다. 컴퓨터의 역할은 종이 대신에 모니터에 출력하는 것이 전부인 수준에서 엑셀에 있는 기초적인 함수 몇 개를 파악하고, 그것을 섞어서 원하는 기능을 만들어 낼 수 있다는 것을 발견하는 데까지만 몇 달이 걸렸다.
예를 들어 미군 이백여 명 휴가 일정이 있고 매주 누가 휴가를 가는지를 보고하는 일이 있다고 하자. 단순한 표 안에 수 백 명의 이름과 날짜가 정리되어있고 이를 일일이 눈으로 찾아야 했다. 기억력이 뛰어난 내 선임 카투사는 부대 모든 미군들의 이름, 소속, 계급, 심지어 휴가 일정과 목적까지 외우는 천재적인 업무력을 보였다. 하지만 나는 아침에 먹은 메뉴도 기억이 나질 않았다. 한참을 모자란 후임으로 고생하고 나서야 엑셀에 정렬(sorting) 기능이 있다는 걸 알았다. 정렬 버튼은 상단에 아주 잘 표시되어 있지만, 사람은 모르는 것이 절대 눈에 들어오지 않는다.
이후에는 휴가일로 순서(RANK)를 매긴 후, 조건에 맞는 데이터를 자동으로 출력하는 기능(VLOOKUP)을 스스로 알아내고 나서 뿌듯해했다. 매우 초보적인 수준임에도 굉장히 오랜 시간이 걸렸다. 지금 생각해보면 '신세계'가 존재한다는 것을 아는 것만으로도 이 시간을 크게 단축했을 것 같다. 구글링이나 네이버 지식인에 물어볼 생각조차 하지 못했으니까.
엑셀 함수와 논리적 사고의 기초를 닦으면서 금융 쪽의 일이 적성에 맞겠다는 느낌이 들었다. 운이 좋게도 학부 졸업 직전에 유럽계 모 투자은행에서 (노예)일을 구하게 되었다. 주식영업(Equity Sales)부서였는데, 마침 난 포지션은 감사를 위한 트레이더의 블룸버그 메시지 정리 작업이었다. 간단히 비유하자면 5명의 5년 치 카카오톡 채팅 내역에서 식사랑 디저트 약속을 잡은 기록을 정리하는 것과 상당히 유사한 일이었다. 텍스트 파일 수 십 기가바이트의 사이즈였고, 당연히 (노예)사람 몇 명의 열정으로 할 수 있는 작업은 아니었다.
엑셀의 함수를 적당히 이용하면 정해진 키워드가 있는 문장을 골라낼 수 있다. 위와 같은 조악한 수준의 필터를 응용했지만 99%의 데이터를 걸러낼 수 있었고, 1%만 눈으로 보고 정리하는 작업을 하였다. 그것조차도 3주가 넘게 걸렸던 것 같다. 돌이켜보면 이 정도 작업에서는 빨리 함수를 버리고 최소한 VBA(Visual Basic Application)로는 넘어가야만 하는 시점이었다.
조악한 실력이라도 쌓이면 엑셀 함수로 모든 걸 다 할 수 있을 것 같은 기분이 들다가, 아주 조금 더 알게 되면 엑셀로는 아무것도 할 수 없다는 걸 깨닫게 된다. 위 작업처럼 큰 사이즈인 경우에는 엑셀로 열리지도 않거나, 함수 특성상 cell(HDD/SSD)에서 계산되기 때문에 상당히 속도가 느려지거나 강제 종료되는 문제가 발생하게 된다. 속도의 문제를 차치하더라도 엑셀 함수의 한계는 너무나 명확하다. 한 cell에 IF함수 7개를 넘게 사용해서 arguments error가 나는 상황을 겪는다면 이미 함수를 벗어나야 할 시점이 지난 것이라고 보면 된다. 가독성이 전무해서 코드를 짠 직후의 본인조차도 수정할 수 없고 그냥 처음부터 만드는 게 더 쉬워진다.
채팅 내역을 정리하는 작업을 다 마치고 나서, 단순히 엑셀을 잘 한다는 이유로 주식파생부(Equity Derivatives)로 옮기게 되었다. 주식파생부의 J전무님은 '신세계'를 아시는 분이어서 무작정 계약서가 생성되는 프로그램을 짜보라는 미션을 주셨다. 주식파생부에서 사용하는 계약서는 워드로 작성된 PDF 파일인데, 금융상품의 구조에 따라 백 여 종류의 양식이 있고 시시콜콜한 날짜들을 복잡한 규칙으로 계산해서 정해진 위치에 넣어야 하는 문서였다. 당연히 함수로는 할 수가 없었다.
엑셀 [option] > [customize ribbon]에서 개발자 탭(developer tab)을 활성화하면 VBA를 사용할 수 있는데, 여기서부터 본격적인 코딩의 시작이다. VBA는 단순하고 호환성이 뛰어난 언어(Mac이 아닌 모든 사무용 컴퓨터에서 추가적인 설치 없이 편리하게 사용이 가능하다.)로서 office 프로그램들은 다 연동이 된다. 엑셀, 워드, 파워포인트, 아웃룩 익스프레스, 아크로뱃 정도는 어렵지 않게 연결할 수 있다. 엑셀에서 조건을 넣으면 해당하는 계약서가 만들어지도록 하는 작업은 초반에 방향만 잘 잡아 순서도만 그리면 난해한 작업은 아니었다. 수동으로는 계약서 당 15~20분 정도가 소요되었고, 매일 적게는 3~4건의 계약이 있었는데 자동화하는 데 성공하였다. 대부분의 사무업무 중에서 규칙이 있는 것은 거의 다 자동화할 수 있다는 걸 깨달았다.
이후로는 상품설계(structuring)에 필요한 ELS backtestor, 영업(sales)에 필요한 고객 교육용 simulation game 같은 걸 만들다 흥미(?)를 잃고 학교로 돌아왔다. 경제학과에서 금융공학을 공부하는 가난한 대학원생이 되자 주변에서 용역을 부탁해오는 일이 종종 생겼다. 좋은 회사에 간 친구들이 맡기는 경우도 재미있는 게 많았지만 정말 흥미로운 것은 학교의 행정일이었다.
BK21 플러스는 많은 학과들이 명운을 걸고 준비하는 숙원사업이다. 선정된다면 몇 년 간 상당한 금액의 연구비가 주어지기 때문에 학과 전체가 큰 공을 들여서 준비하게 된다. 예전에는 문서에 화려한 특수효과(?)를 넣어서 차별화하려는 노력이 많았다고 한다. 아마 더 이상 그런 것을 하지 말라는 의도로 입력창이 20세기의 인터넷 게시판처럼 생겨 문장을 입력받는데, 이곳에는 글자크기를 포함한 어떠한 편집도 불가능한 형태이다. 입력 후 PDF로 출력을 해보면 A4 용지에 상하좌우 여백 없이 빽빽이 텍스트 파일이 차게 된다.
우리가 원했던 format은 수 백 페이지 텍스트 파일에 수동으로 엔터와 스페이스를 넣어 margin, align을 만드는 작업이었다. 말로 형용하긴 좀 어렵고 다음의 이미지를 참고하자.
위 이미지에서는 쉽게 설명이 되어있지만 실제로는 생각보다 복잡한 예외들이 많았다. 특수문자 중에 1 바이트짜리와 2 바이트짜리를 나누는 문제, 단어/문장/단락을 구분하는 문제, 네모 외에도 동그라미/세모/dash/dot 등으로 시작하는 문장들이 hierarchy 별로 indentation이 다른 문제, 막상 짜다보면 스페이스 앞에서 105 바이트가 잘려 다음 문장이 스페이스로 시작하는 문제까지는 그래도 좀 쉬운 편. 극악의 난이도는 영문이다. 영어의 경우에는 단어 중간에서 잘리게 되면 음절(syllable) 단위로 자르고 하이픈(-)을 넣어야 하는데, 이건 내 능력으로는 불가능해서 영어 단어가 중간에 잘리면 단어를 통째로 다음 줄로 넘기도록 타협했다.
당시에는 정말이지 학과의 미래가 달린 심각한 일이었는데 돌이켜보면 웃음만 나오는 작업이다. 사실 수 백 페이지를 일일이 스페이스와 엔터로 나누는 일을 정말로 손으로 한다고 하면... 아아 생각만 해도 가슴이 답답해진다. 하지만 코드를 짜는 난이도도 나에게는 매우 높아서, 하루가 통째(20여 시간)로 걸렸는데도 마지막까지 성공을 확신하지 못하고 포기할 뻔했다. "이거 못 할 수도 있을 것 같아요."라는 말을 처음 해 본 프로젝트였다. 지금에서야 유쾌하게 이야기하지만 당시 분위기는 정말... 한글이나 워드프로세서는 굉장한 프로그램이구나. (브런치도!)
데이터를 본격적으로 다루는 연구를 하면서 자연히 Matlab으로 넘어가게 되었고 엑셀은 더 이상 관심에서 멀어지게 되었다. 분명히 전환 포인트가 많이 늦었다. 요즘은 8퍼센트에서 일하는 틈틈이 SQL, Python으로 프로그래밍을 처음부터 제대로 배워보면서 또 다른 신세계가 열리고 있다.
문과생의 서바이벌 프로그래밍, 갈 때까지 가보자!