티스토리 뷰

에세이

한겨울 밤의 컴파일

June 2018. 7. 23. 03:20

짧은 벨소리와 함께 안전벨트 표시등의 불이 꺼졌다. 비행기가 순항고도에 올라섰다는 신호였다. 사람들이 분주하게 안전벨트를 풀고 기지개를 켜거나 화장실을 가거나 할 때, 나는 가방에서 노트북을 꺼내서 트레이에 올려놨다. 착륙하기 전까지 만들어야 될 것이 있었다.


지난주에 숙제를 하다가 중대한 문제를 발견한 적이 있었다. 프로그램을 잘 만들어서 테스트까지 했었는데 막상 결과를 확인하기 위해서 대량의 연산을 돌리니까 프로그램이 제멋대로 죽어버리기 시작했다. 한 번 돌리면 결과 나올 때까지 몇 시간은 걸리기 때문에 돌려놓고 잠들었다가 아침에 결과를 확인하려고 했는데, 아침마다 확인하는 것은 비정상 종료 메시지뿐이었다.


아무래도 처음부터 다시 해야 할 것 같다는 생각이 들었다. 대량의 작업을 추가하기 위한 대기열 큐와 스케줄러, 그리고 통계를 내기 위한 모듈이 필요했다. 간단한 숙제라고 생각해서 모두 생략했던 것이 화근이었다. 프로그램에 큐, 스케줄러, 통계 모듈을 추가하는 작업은 어려운 작업은 아니었지만 귀찮은 작업이었다. 그래서 자꾸 미루다가 더 미루면 안 되는 시점, 그러니까 마감이 코앞으로 다가왔다.


왜 하필이면 여행 날짜를 지금으로 잡았을까. 왜 진작에 미리미리 해두지 않았을까. 두 가지 후회와 함께 짐을 쌀 때 노트북을 같이 챙겼다. 숙소에서까지 숙제하기는 싫었기 때문에 왕복 4시간 남짓한 짧은 비행시간 동안 저 3가지 작업을 다 해버릴 생각이었다. 인터넷이 안 되는 환경에서 코드를 작성하기 위해 노트북에 미리 이런저런 모듈들을 미리 다운로드 받아두고 있으려니 다른 짐을 챙길 때보다도 더 설레는 기분이었다. 공중에서 코드를 짜는 기분은 어떤 기분일까.


노트북을 펼치고 IDE를 켰을 때 뭔가 불안한 예감이 스쳐 지나갔다. 뭔가 빠뜨린 것 같았다. IDE가 켜지고, 자동으로 빌드가 돌아가고, 곧이어 빌드 성공 메시지가 나오자 불안감이 다시 설렘으로 바뀌었다. 미리 내려받았던 서버 모듈 몇 개를 기동시키고 다시 IDE로 돌아와서 코드를 작성하려고 했다. 인터넷은 참조할 수 없지만, 그동안의 경험과 코드 자동완성 기능이면 인터넷 없이도 원하는 코드를 만들 수 있을 것 같았다. 그래서 코드 자동완성이 제대로 동작하지 않았을 때 약간 당황했다. 설마 자동완성 기능이 인터넷에서 검색하는 거였나? 그럴 리가 없었다. 아마도 라이브러리가 추가되지 않았겠지 하면서 빌드 스크립트를 열어봤다.


그리고 내가 무엇을 빠뜨렸는지 알아차렸다. 서버 모듈은 다 받아왔으면서 클라이언트 모듈을 깜빡했다. 인터넷이 안되니까 이제 와서 받을 방법도 없었다. 그 라이브러리 API가 어떻게 되더라? 이걸 생성을 여기서 하고 호출할 때 무슨 코드를 쓰더라? 대충 기억이 나는 것 같아서 코드를 작성해봤지만 확신이 서지 않았다. 테스트를 해보고 싶었지만 컴파일도 되지 않는 코드를 테스트할 수는 없었다. 비행기 안이 살짝 서늘하다는 생각이 들었다. 그리고 문득 이 상황이 익숙하게 느껴졌다.


2011년 겨울은 서늘하다는 표현이 뜨겁게 느껴질 정도의 혹한이었다. 실제로 그해 겨울이 다른 겨울보다 기온이 낮았는지는 잘 모르겠지만 그냥 내 기분이 그랬다. 2011년 내내 수행했던 프로젝트와 안 좋게 헤어지고 난 후 부서로부터 지방 프로젝트 파견 지시를 받았다. 급한 일이 있으니 12월 한 달만 지원하고 올라오라는 지시였다. 짐을 챙길 틈도 없이 대충 옷 몇 벌만 챙겨서 황망히 내려가자 전쟁터 같은 프로젝트 현장을 목격할 수 있었다.


비품 창고를 개조했는지 제대로 된 난방시설도 없던 사무실은 그 많은 컴퓨터들이 내뿜는 열기에도 불구하고 무척이나 추웠다. 이미 지난 몇 개월동안의 싸움에 지친 개발자들은 '내년 1월 1일에 오픈하고 나면 이 고생도 끝이겠지'라는 희망 하나만 가지고 추위와 싸우고 있었다. 짐을 풀고 무슨 일을 해야 되냐고 물어보자, 지금 바쁘니까 잠깐 기다리고 있으면 알려주겠다는 소리를 들었고, 1주일을 그렇게 기다리자 업무를 받을 수 있었다.


내년부터는 FTA 규정이 발효되어서 프로그램이 많이 바뀌어야 된다고 그랬다. 그리고 내가 그걸 좀 바꿔줬으면 한다고 했다. 이 프로젝트는 기존 프로그램을 모두 새로 만드는 차세대 프로젝트였고, 내년 1월 1일 오픈을 목표로 하는 프로젝트였던 만큼 바뀐 규정은 이미 만들고 있는 코드에 모두 반영되었다. 그러면 저는 무엇을 바꿔야 하나요? 라고 물어보니 새로 만드는 프로그램이 아닌 기존 프로그램을 수정하라고 그랬다.


내년 1월 1일이면 폐기될 프로그램을 내년도 규정에 맞추어서 바꾸는 일은 생선 가시를 먹기 좋게 자르는 일처럼 느껴졌다. 그래서 그걸 왜 바꿔야 하나요? 라고 물어보니까 혹시나 1월 1일에 오픈을 못 하게 될 경우 기존 프로그램을 며칠간 더 사용해야 하니 그걸 대비해서 바꾸는 거라고 했다. 여기 이렇게 많은 사람이 오픈을 기다리고 있는데 연기 소식이 들리면 슬퍼할 사람이 많겠다는 생각이 들었다. 그래서 오픈이 연기될 가능성이 높나요? 라고 물어보자 오픈이 연기되면 보상금이 하루에 얼만데 연기를 하겠냐 어떻게든 1월 1일에 오픈 할꺼다 라는 대답을 들었다.


그러니까 나는 일어날 가능성이 희박한 일에 대한 보험으로 사용될 코드를 만드는 것이었다. 실제로 한 번도 돌아가지 않을 코드를 만드는 것은 슬픈 일이었지만, 한편으로는 마음이 편해지기도 했다. 수정해야 할 코드가 이렇게 많고 시간은 보름 남짓 남았으니 제대로 된 코드를 짜고 테스트할 시간은 턱없이 부족했는데, 실제로 사용될 코드가 아니라면 제대로 된 코드를 짜거나 테스트를 열심히 할 필요가 없는 거니까.


그래도 일단 할 수 있는 건 다 해봐야지 생각하고, 구 프로그램의 코드를 내려받은 뒤 IDE에서 열어봤다. 그리고 수없이 나타나는 빨간 줄을 보면서 역시 쉽지 않겠다는 생각을 했다. 프로젝트에서 개발하는 차세대 프로그램도 아닌 구형 프로그램에 대한 제대로 된 개발 환경 같은 것이 있었을 리가 만무했기 때문에 일단 라이브러리들만 어떻게든 구해서 컴파일되게 만든 다음에 코드를 수정하려고 했다. 그래서 업무리더를 찾아가서 라이브러리를 달라고 요청했더니 서버 여기저기에 너무 흩어져있어서 그걸 다 줄 수 없다고 했다. 필요한 라이브러리가 없으면 기존 소스를 어떻게 컴파일하고, 어떻게 고치냐고 물어보니까 그렇지 않아도 바쁜데 너 한 명을 위해서 그걸 다 받아줘야 하냐고 그랬다. 그리고 어차피 안 쓸 프로그램이니까 대충 고치라는 소리도 들었다.


상대방의 태도가 너무 당당해서 내가 뭔가 무리한 요구를 하고 있다는 생각이 들어서 주눅이 잔뜩 든 상태로 자리에 돌아갔다. 서버를 뒤져서 라이브러리를 다 찾아볼까 고민했었는데, 이 시스템에 익숙한 사람들도 찾기 어려운 것을 내가 찾을 수 있을 리가 없겠다는 생각이 들었다. 빌드 스크립트 같은 것이 따로 있는 프로젝트도 아니어서 사실 무슨 라이브러리가 필요한지 식별하는 것도 어려웠다. 거기에 서버에 접속하기 위한 계정도 받지 못했다는 사실을 떠올리니 아무것도 할 수 없겠다는 무력감이 사무실의 냉기처럼 몸과 마음을 얼어붙게 만들었다.


그냥 일하는 척만 하고 있다가 오픈을 기다릴까. 여기 사람들은 다들 그렇게 일하는 게 아닐까 고민해봤지만 다들 그렇게 일한다고 해서 나까지 그렇게 일할 필요는 없었다. 설령 고쳐야 할 코드가 돌려볼 수도 알아볼 수도 없는 상태라고 해도 일단은 지금 할 수 있는 것들을 최대한 해보자고 생각했다.


그리고 수백 개의 클래스에 퍼져있는 로직들을 FTA 규정에 맞추어서 조금씩 수정했다. 사실 양은 많았지만 대부분 기계적인 작업이었다. 하나만 처리하던 것들을 반복문으로 여러 개를 처리하도록 수정하거나, 단위 코드 몇 개를 추가하고 해당 코드를 참조하는 부분을 일괄적으로 수정하거나, 메소드의 시그니처를 조금 변경하고 해당 메소드를 호출하는 부분을 같이 조금 수정하거나 하는 일들이었다.


자동완성은 커녕 메소드 사이의 참조 관계를 분석하는 것도 불가능했기에 텍스트 검색기능에만 의존해가면서 코드를 고쳤다. 월말이 다가오자 날씨는 점점 추워졌는데 고향에 올라갔다 올 시간이 단 하루도 나지 않아서 여전히 내 복장은 초겨울 복장 그대로였다. 그래도 프로젝트가 오픈만 하면 이 코드들 다 버리고 조금 상황이 나아지겠지라는 생각으로 추운 겨울날을 버텨나갔다. 그리고 결국 12월이 끝나기 전에 코드를 모두 수정할 수 있었다.


그리고 프로젝트에는 침통한 분위기로 '오픈 연기 - 1월 1일이 아니라 23일에 오픈합니다.'라는 공지가 내려왔다. 23일은 설날이었으니까 나름 길일이었다. 역학의 관점이 아니라 순수하게 공학적인 관점에서, 오픈을 시도하다가 뭔가 크게 틀어졌을 때 다시 되돌릴 날짜까지 확보할 수 있었으니까. 프로젝트의 개발자들도 뭔가 불안했던 부분들을 수정할 시간이 20일 정도는 주어졌다는 점에서, 그리고 너무 많이 연기되지는 않았다는 점에서 다들 우울하게 연기를 잘 받아들이는 것 같았다.


문제는 나였다. 오픈 연기가 결정되자, 내가 만든 코드들이 실제 시스템에 반영되어야 했다. 그것도 개발계나 검증계를 거칠 시간도 없이 바로 운영계에 말이다. 그리고 그 순간 어차피 안 돌려볼 코드니까 대충해라 라는 태도를 보이던 담당자들이 '수정된 코드는 문제없이 준비해놨겠지?'라는 태도로 바뀐 것이 나를 심란하게 만들었다.


언제나 그랬지만 시간이 많지 않았다. 주어진 시간 내에 목표를 달성하기 위해서는, 크리스마스 때 개발계에 코드들이 올라가야 됐고, 그 코드들이 잘 돌아가면 일주일 정도 업무 화면을 테스트해보고 올해 마지막 날에 그 코드를 운영계에 반영할 수 있었다. 그러니까 컴파일도 못 해보고 수정한 수백 개의 클래스가 서버에 반영했을 때 한 번에 잘 돌아가야 한다는 기적같은 전제조건이 이 시나리오의 핵심이었다. 내가 수백 개의 클래스를 수정하면서 단 하나의 오타도 내지 않았을 가능성이 얼마나 될까 생각해보다가 나 때문에 프로젝트가 망하는 시나리오가 떠올라서 심장이 얼어붙는 기분이 들었다.


이럴 줄 알았으면 진작에 개발계 계정이라도 저한테 주셨으면 미리미리 테스트 해봤을 텐데요 라고 항의를 해봤는데 구 시스템은 우리 회사가 관리하는 게 아니라서 달라고 하기가 어려웠다고 그랬다. 지금 우리가 처한 상황보다 어려웠냐고 되묻고 싶었지만 그래 봐야 상황이 달라질 것은 없었기 때문에 어렵게 얻어온 개발계 계정을 이용해서 서버에 접속했다. 그리고 수정한 코드들을 서버에 업로드 했다.


사실 수정한 코드를 반영하는 과정은 그렇게 거창하지 않았다. 라이브러리가 서버에만 있는 상황이었으니 서버에서 수정한 코드들을 컴파일해서 기존 시스템이 있던 위치에 복사한 뒤, 프로그램을 재기동 시키면 되는 일이었다. 무난하게 흘러간다면 10분도 걸리지 않을 일이었다. 소스코드를 컴파일하는 명령어를 입력하면서 기적같이 컴파일이 정상적으로 끝나는 상황을 계속 상상했다가, 욕심이 지나치다는 생각이 들어서 그래도 컴파일 오류가 10개 미만으로만 나면 좋겠다는 생각을 했다. 그러면 조금만 수정해서 다시 올리면 되니까. 솔직히 20개 정도만 나도 크리스마스 아침이 밝아오기 전까지 퇴근할 수 있지 않을까 생각하며 엔터를 눌렀다.


그리고 화면에 나타난 99개의 컴파일 오류는 크리스마스의 악몽이 되었다. 그래도 세자릿수는 아니네...라고 생각했는데 업무리더의 표정이 심상치 않았다. 이게 무슨 상황이냐고 물어봤는데 솔직히 내가 묻고 싶었다. 아무리 블라인드로 코딩을 했다고 해도 이렇게 오류가 많이 나는 게 말이 되나? 새로 짠 코드도 아니고 기존 코드를 수정한 건데 내가 자바를 잘못 배웠나?


황망한 기분으로 오류 메시지를 살펴봤는데 대부분 같은 메시지였다. 그리고 한 번도 본 적이 없는 메시지였다. 내가 짠 코드의 문법이 틀렸다고 지적하는데 아무리 봐도 틀린 문법이 아니었다. 내가 설마 for each 문의 문법을 틀렸을까, 그래도 몇 년을 썼던 코드인데...라고 생각하는 순간 뭔가 스쳐 지나가는 것이 있었다. 혹시 여기 자바 버전이 몇인가요? 아니, 제가 한 번 확인해보겠습니다. 그리고 버전 명령어를 입력하자 서버는 자신이 자바 1.4를 돌리고 있음을 당당하게 표시해줬다. for each 문은 자바 1.5에 추가된 것이니 컴파일 오류가 발생하는 것은 당연한 일이었다. 자바 1.5는 2004년에 나왔지만, 이 시스템은 지난 세기에 만들어진 것이니 자바 1.4를 쓰는 것도 개연성은 있었다.


이걸 미리 확인 못 한 내가 잘못이지 라고 생각하며 코드를 수정하기 시작했다. for each 문을 사용한 코드를 수정하다 보니 제네릭을 사용한 코드가 보이기 시작했다. 저것도 다 고쳐야 한다는 생각을 하니 한없이 우울해졌지만, 되도록 한 번에 코드를 수정해야 시간을 절약할 수 있었다.


그리고 수정한 코드를 서버에 올리고 다시 컴파일을 돌리자 다시 컴파일 오류가 수십 개 등장했다. 그 때야 처음으로 자바는 한 번에 모든 오류를 다 보여주지는 않는다는 사실을 알게 되었다. 그래서 황망히 코드를 수정하고 다시 업로드 하고 컴파일을 다시 해보고 또 나온 오류를 다시 수정하고 하는 작업을 반복했다. 그 사이 사이에 버전 문제가 아닌 진짜 오타로 인한 컴파일 오류가 몇 개 보여서 주위 공기가 한없이 차가워지는 기분이 들었다.


이번이 마지막 컴파일이었으면 하는 마음으로 컴파일 명령을 입력하고 오류를 발견하고 다시 수정하고를 반복하고 있으려니 이미 시간은 새벽 3시가 지났다. 그걸 보고 있던 업무 리더가 와서 한마디 했다. 너는 프로그램을 왜 이렇게 못 짜냐고. 순간 손가락이 얼어붙는 듯한 기분이 들었다. 죄송합니다 라고 대답하고 코드를 마저 수정하려고 하는데 손이 추워서 떨리는 것인지 분해서 떨리는 것인지 구분할 수가 없었다.


지금까지의 상황을 객관적으로 바라보았을 때, 화를 내도 되는 상황이 아니었을까 고민을 조금 했었는데, 회사에 들어오면서 일 년에 화를 한 번만 내기로 다짐했었고 2011년의 화는 이미 전 프로젝트에서 내버렸기 때문에 지금은 화를 낼 때가 아니라는 생각을 하며 마음을 다잡았다. 그리고 결국 컴파일 성공 메시지를 볼 수 있었다.


물론 컴파일 성공이 업무 종료를 의미하는 것은 아니었다. 컴파일에 성공했다는 말은 이제 서버에 반영할 수 있다는 말이었고, 그 말은 드디어 테스트를 할 수 있다는 말이었다. 상상으로 수정한 코드가 실제로도 동작하는지 확인할 때가 온 것이었다. 정말로 변경된 규정에 맞추어서 프로그램이 동작하는지, 그 과정에서 다른 부분을 건드려서 오류가 발생하지는 않는지 확인할 시간이었다.


물론 수정한 코드는 한 번에 테스트를 통과하지 못했다. 다시 수정과 업로드, 컴파일을 반복하면서 논리적인 오류를 수정해나갔다. 왜 이걸 자꾸 틀리냐는 면박에 '그래도 주어진 상황에선 나는 나름대로 일을 잘 한거야'라고 스스로 위로해가며 버텼고, 결국 아침이 밝고 나서야 모든 수정사항을 확인하고 퇴근할 수 있었다.


퇴근길과 길거리 여기저기 놓여있던 크리스마스 장식들에는 밤새 내린 눈이 쌓여있었다. 다행히도 아침에는 눈이 그쳤기 때문에 돌아가는 길이 불편하지는 않았다. 그리고 별로 춥지도 않았다. 아무래도 지난 밤에 엄청 춥다고 느꼈던 것은 기분탓이었나 라는 생각이 들었다. 다음 주에는 이걸 다 운영계에 반영해야 되는데 그건 또 어떻게 감당할까 생각하니 살짝 추워졌다. 오늘이 크리스마스이니 다음 주는 새해 연휴일테고, 그때도 쉽게 퇴근하지 못하겠구나 라는 생각이 들었다. 아무래도 이십 대의 마지막 순간과 서른 살의 시작은 사무실에서 맞이할 것 같다는 생각도. 그 때는 조금 덜 혼났으면 좋겠다는 생각이 들었다.


입사하기 전에 상상했던 IT 회사는 열악한 환경 속에서도 다들 같은 목표를 가지고 그것을 달성하고자 열심히 노력하는 그런 이미지가 있었다. 그런데 막상 일을 해보니 모두가 같은 꿈을 가지고 있는 것은 아니었다. 누군가에게는 그저 월급날까지 잘 버티는 것이 목표였고, 누군가는 다른 사람을 죽여가며 자신의 출세를 꿈꾸고 있었다. 그런 사람들 사이에서 내가 원하는 것을 찾아내고 이룰 수 있을까 고민해봤는데, 컴파일도 안 되는 환경에서 개발하는 것만큼이나 쉽지 않겠다는 생각이 들었다.


다시 한번 짧은 벨소리가 울리고 안전벨트 표시등의 불이 켜졌다. 벌써 착륙할 때가 된 것은 아닐 테니, 아마도 난기류를 만난 것 같았다. 머릿속으로 충격방지자세를 되새기면서 트레이를 닫고 노트북을 다시 덮어서 가방에 넣었다. 그냥 숙제 생각은 여행 끝날 때까지 잊어버리자고 다짐했다. 어떻게 생각해봐도 컴파일이 제대로 되지 않는 상황에서 뭔가 만든다는 것은 무리였다. 내가 이 바닥에서 이루고자 하는 것이 무엇인지는 아직도 잘 모르겠지만, 적어도 그렇게 무리해서까지 이루어야 하는 것은 아닐테니까.

'에세이' 카테고리의 다른 글

참는 것과 남는 것  (0) 2018.07.27
올림, 내림, 반올림  (0) 2018.07.26
동화 속의 개발자들  (0) 2018.07.08
안녕하세요. 감사합니다.  (1) 2018.06.15
2002  (0) 2018.05.16
댓글