티스토리 뷰

에세이

Build, Pray, Run

June 2018. 8. 6. 00:56

슬쩍 본 밤하늘에는 별이 이중 포인터처럼 빛나고 있었습니다. 별을 향해 이번 빌드가 성공하게 해주세요 라고 빌고 싶었는데 문득 별의 깜빡임이 조금 인위적이라는 느낌을 받았습니다. 아마도 별이 아니라 우주정거장이나 비행기가 지나갔나 봅니다. 그래서 그냥 자리로 돌아가서 결과를 확인해봤습니다. 아마도 저에게 간절함이 부족했나 봅니다. 화면엔 몇 번이나 봤었던 실패 메시지가 떠 있었습니다. 또 실패했네요.


하지만 자존심이 바닥으로 떨어지거나 좌절하거나 하지는 않았습니다. 자존심은 실패가 3번쯤 되었을 때 떨어지기 시작해서 5번째쯤에 바닥을 쳤고, 좌절감은 8번째 실패에서 이미 느꼈거든요. 심지어 방금의 실패는 뭔가 고치거나 수정하지 않고 그냥 한 번 눌러본 빌드의 실패였습니다. 계속 실패한 빌드를 한 번 더 돌리면 당연히 실패하기 마련입니다. 이건 20면체 주사위를 던지거나 하는 그런 일이 아니거든요. 그런데 실패가 반복되어서 이성이 마비되기 시작하고, 아이디어가 바닥났을 때는 혹시 기적이 일어나지는 않을까 하는 마음으로 그냥 한 번 빌드를 눌러보기도 합니다. 그리고 빌드가 도는 몇 분의 짧은 시간 동안 간절히 기도합니다. 세상 어딘가에 개발자들의 신이 있다면 Mr. Jenkins의 얼굴로 현신하여 이 빌드를 성공시켜주시기를. 하지만 빌드는 여지없이 실패했습니다. 아마도 개발자의 신은 없거나, 사실은 있는데 이런 어이없는 기원은 들어주지 않거나, 그도 아니면 제 간절함이 부족했던 것이겠지요. 그래서 저는 제 간절함이 부족했던 것으로 생각하기로 했습니다. 살면서 개발자들의 신을 찾을 일이 몇 번은 더 있을 것 같았거든요.


일의 전말은 이렇습니다. 저에게 작은 미션이 하나 내려왔습니다. 다른 부서에서 만든 이런저런 소스 코드들을 받아와서 우리 서버에 올리라는 미션이었습니다. 저는 이런 식의 일을 별로 좋아하지 않는데, 다른 부서에서 만든 소스코드는 어항 속의 열대어처럼 환경이 바뀌면 뭔가 잘 돌아가지 않는 경우를 너무 많이 봤기 때문입니다. 뭔가 잘 안 될 때는 우리 환경의 문제인지, 받아온 소스 코드의 문제인지 파악하는 과정이 추가되어야 하고 경험상 이런 과정은 매우 지난한 일이 될 수밖에 없습니다. 물론 회사에서 업무를 받을 때 개인적인 호불호를 드러내는 것은 정치적으로 위험한 일이니 저는 이단 헌트의 심정으로 미션을 수락할 수밖에 없었습니다.


소스 코드를 돌아가는 프로그램으로 만드는 작업을 빌드라고 부르고, 이번 임무에서 제가 성공시켜야 하는 빌드는 10개 정도였습니다. 저에게 주어진 시간은 사흘 정도였고 저는 이틀째에 10개의 빌드를 모두 성공시킬 수 있었습니다. 사실 완성된 소스 코드를 받아서 한 작업이니 그리 대단한 일도 아니었습니다. 문제는 10개의 빌드를 성공시키는 것이 목표가 아니었다는 점입니다. 10개의 빌드는 사실 2개의 프로그램을 만들기 위한 준비작업이었고, 10개의 빌드 중 각각 7개, 5개의 빌드가 모여서 다시 2개의 프로그램이 되었습니다. 왜 10개가 7개와 5개로 나뉘냐고요? 그 중 2개의 빌드는 또 각 프로그램이 서로 공유하는 빌드였거든요. 정말 열구자탕을 만드는 것만큼이나 복잡한 작업이었습니다.


사흘째 되는 날은 금요일이었습니다. 올드 스쿨 스타일의 부장님들도 일찍 퇴근한다는 금요일이었고, 애초에 설정한 기한의 마지막이기도 했습니다. 주어진 일은 금요일까지 끝내야 월요일에 '모든 것이 일정대로 진행되고 있습니다'라는 보고를 올릴 수 있었습니다. 일이 잘 안 풀려서 월요일에 '일정에 차질이 생겼습니다'라는 보고를 올리면 많은 높으신 분들의 관심과 사랑을 받을 위험이 있었고요. 예전 같았으면 주말을 포함한 장대한 계획을 세웠을지도 모르겠지만, 당시에 저는 주말에는 밀린 숙제를 하느라 정신이 없었습니다. 회사 업무의 지연과 숙제를 제때 제출하지 못하는 것을 놓고 저울질하는 상황은 가끔 꿈에만 나와도 저에게 극심한 스트레스를 줬기 때문에 저는 가급적이면 그 상황을 피하고 싶었습니다. 여러 상황을 고려했을 때 저는 금요일에 심리적, 정치적, 감성적인 마지노선을 그릴 수밖에 없었습니다.


이미 10개의 빌드는 모두 성공했습니다. 그런데 성공한 빌드를 조합해서 프로그램을 실행시키면 항상 실패했습니다. 그 사실에 실망하지는 않았습니다. 지위가 높아질수록 성공한 요소들을 무심하게 모아놓기만 해도 반드시 성공한다고 믿는 법이지만 제 지위는 높지 않았거든요. 저는 아키텍트이기 때문에 어떤 완성된 프로그램보다는 그것들의 연결에 더 집중하는 편인데, 코드 한 줄 들어가지 않는 이 연결이 생각보다 많은 문제를 일으킵니다. 그리고 다들 '내 컴퓨터에서는 잘되는데!'를 외치지요. 제가 받은 10개의 프로그램이 모두 훌륭하게 완성되었음을 의심할 필요는 없었지만, 저쪽 아키텍트들이 공들여서 연결한 시스템이 아닌 백지상태의 우리 시스템에 올리는 작업은 제 실력을 의심하게 만들어주었습니다. 되는 게 하나도 없었으니까요.


일이 잘 안 풀릴 때는 로그를 확인해봅니다. 인생이 잘 안 풀릴 때 자신을 돌아보는 것과 비슷한 흐름입니다. 확인해보니 애플리케이션에서 데이터베이스 연결이 제대로 되지 않고 있네요. 이 복잡한 시스템은 총 3개의 다른 데이터베이스를 쓰고 있는데 그중 하나의 연결에 문제가 있었던 것 같습니다. 문제는 그 데이터베이스는 또 2개의 최종빌드가 공유하고 있는 데이터베이스였다는 것이고, 그래서 되는게 하나도 없었다고 느꼈던 것 같습니다. 일단 이 문제만 해결하면 한 번에 2개의 최종빌드를 성공시킬 수 있을 것 같다는 예감에 얼굴에 잠시 미소가 할당되었다가 해제되었습니다. 그래서 분주하게 퇴근하는 사람들에게 안녕히 가세요 주말 잘 보내세요 류의 인사를 던지거나 저녁을 먹으러 가는 사람들에게 아 드시고 오세요 저는 이거만 금방 하고 퇴근하려구요 류의 자신감 넘치는 멘트를 던질 수 있는 여유가 생겼습니다.


그리고 애플리케이션과 데이터베이스를 연결하고자 하는 시도는 모두 실패했고 실패 메시지도 쌓여갔습니다. 내가 아는 지식의 범위에서는 더 이상 할 수 있는 게 아무것도 없다는 좌절감이 키보드에서 손을 떨구게 만들었습니다. 정말 OSI 7계층을 다 돌아봤을 정도로 열심히 시도했으니까 최선을 다했다고 생각할 수도 있었지만 그런 생각으로는 위로가 되지 않았습니다. '최선을 다했지만 실패했습니다' 와 '아무것도 하지 않아서 실패했습니다'가 동치 관계를 이룰 정도로 과정보다는 결과를 중시하는 게 이 바닥의 일이라는 것을 잘 알고 있었으니까요.


그래서 될 대로 되라 혹시 아냐 저녁 8시 이전에는 데이터베이스를 찾지 못하는 버그 같은 것이 있었는데 지금은 8시 넘었으니까 돌아갈지도 라는 심정으로 빌드 버튼을 누르게 되었습니다. 그리고는 일어나서 뭔가 소원을 빌만한 유성 같은 것이 떨어지지 않을까 창밖을 확인했고, 다시 돌아온 자리에서 실패 메시지를 확인할 수 있었죠. 9번째 실패였습니다. 더 이상 확인할 로그도 없고 생각나는 아이디어라고는 초자연적인 힘을 기대해보자는 아이디어 정도 밖에 없는 데다가 심지어 그 아이디어도 실패했습니다. 당장 희망은커녕 언젠가 희망을 가질 수 있을 것이란 희망도 사라지는 것을 느낄 수 있었습니다. 주말에 출근해서 문제를 해결하면서도 숙제도 마무리 할 수 있는 복잡한 스케줄을 구상해보니 아무래도 밤샘이 동반되지 않으면 실현이 어렵겠다는 우울한 전망이 보였습니다. 그럴 거면 그냥 오늘 밤을 새워서라도 이걸 다 해결하고 주말에 숙제에 집중하는 게 낫지 않을까 고민하다가 그것도 어쨌든 밤샘을 동반한 해결이라는 생각이 들었습니다. 금요일 밤이나 토요일 밤이나 당면한 문제들에는 별 상관이 없었으니까요. 하지만 이왕이면 별이 많이 떠 있는 밤이었으면 좋겠다는 생각이 들었습니다.


잠시 시점을 전지적으로 옮겨보면, 저는 그날 11시를 훌쩍 넘긴 시점에 문제를 다 해결하고 퇴근할 수 있었습니다. 날짜가 토요일로 넘어가지도 않았고, 심지어 막차가 끊기기도 전이었으니까 무척이나 행복한 결말이었습니다. 금요일 저녁 11시 30분에 퇴근한 것이 무슨 행복한 결말이냐고 하실 분도 있으시겠지만, 행복은 상대적인 개념이니까요. 하지만 9번째 실패를 목격했을 당시의 제가 그런 미래를 알 수는 없었을 테니 그때 저는 무척이나 불행한 상태였습니다. 시간을 뛰어넘어서 정보를 전달할 수 있는 수단이 있다면 웃는 이모지 하나라도 보내줬을 텐데 말이죠. 그때나 지금이나 할 수 있는 건 아무것도 없었습니다.


당장 할 수 있는 게 아무것도 없어지면 생각이 많아집니다. 그 생각이 '문제를 어떻게 해결할까' 식의 발전적인 생각이면 좋겠지만 보통은 문제 해결에 전혀 도움이 안 되는 후회가 대부분입니다. 왜 저녁을 안 먹었을까부터 시작해서 뭔가 인생에서 인터럽트 없는 루프가 반복되는 것 같다는 생각까지.


문제를 해결하는 열쇠는 문제의 바로 옆에 있다고 했습니다. 그렇다면 내 인생의 문제는 나 자신에게 해결의 열쇠가 있을 겁니다. 그 열쇠를 찾으려면 나중에 여유가 좀 생겼을 때 인생의 로그를 다시 한번 확인해봐야겠다는 생각이 들었습니다. 지금은 여유가 없으니 일단 빌드 로그와 실행 로그를 다시 한번 면밀히 확인해보기로 마음먹었습니다. 물론 빌드 로그에서는 별다른 문제를 찾을 수 없었습니다. 프로그램의 실행 로그에서는 데이터베이스에 연결할 수 없다는 메시지만 계속 나왔습니다. 마음을 이렇게 먹어도 저렇게 먹어도 조금도 진전이 없었습니다.


아무것도 한 것이 없지만 조금 쉬어야겠다는 생각이 들었습니다. 이럴 때는 어딘가 한 바퀴 돌고 오는 것이 적당한데 금요일 저녁에 회사 주변을 한 바퀴 돌고 싶은 생각은 별로 들지 않았습니다. 문득 아까 본 것이 진짜 별이었는지 아니면 인공적인 비행체였는지 궁금해져서 자리에서 일어나서 창문 쪽으로 가봤습니다. 그러나 밤하늘에는 별이나 그와 비슷한 무엇도 찾을 수 없었습니다. 아마도 아까 본 것은 별이 아니었나 봅니다.


간절히 원하면 그것을 이루어지게 하는 어떤 힘이 세상에 있을까요? 만약 그런 힘이 실존한다면 그것은 정말로 초자연적인 힘일 수도 있고, 우연과 확률의 소산일 수도 있고, 그 간절함을 가진 자기 자신의 힘일 수도 있을 겁니다. 그렇다면 빌드 버튼을 누르고 진심을 다해서 기원하면 그 실행 결과가 성공으로 나올 수도 있을까요? 그렇게 생각하기는 쉽지 않았습니다. 공학적인 관점에서 프로그램의 실행 결과는 빌드 버튼을 누르기 전부터 결정되어 있거든요. 다만 저희는 빌드 버튼을 누르고 실행 결과를 확인해야만 그 결과를 관측할 수 있는 것입니다. 개발자들의 신은 주사위 놀이를 하지 않을 테니, 빌드와 실행의 결과는 절대 불확정적이지 않습니다. 그저 열심히 한 만큼 좋은 결과를 받는 매우 정직한 노동이지요. 세상에 그런 종류의 일이 의외로 많지 않다는 것을 생각하면 저희는 어쨌든 열심히 할 이유를 언제나 가지고 있는 것이지요.


자리로 돌아와 앉았습니다. 아무래도 소스 코드의 가능한 모든 부분에 로그를 남겨서 한 줄 한 줄 확인해가면서 문제를 찾아봐야겠다는 생각이 들었습니다. 그리고 다시 한번 실패를 발생시켜서 문제가 어디에 있는지, 혹은 어디에는 문제가 없는지를 하나씩 확인하면서 범위를 좁혀나가야겠다고 마음먹었습니다. 분명 오래 걸릴 것이고 쉽지 않은 추적이겠지만, 천재적인 문제 해결 능력을 갖추지 못해서 여기까지 왔다면 인내심이라도 있어야겠지요.


빌드 버튼을 누르고 실행 결과를 확인하기까지의 짧은 시간 동안, 이번 빌드에서 성공이 뜨면 앞으로 참 착하게 살 수 있을 것 같다는 생각이 들었습니다. 누가 보면 별것도 아닌 것에 인생의 가치관을 건다고 생각할지 모르겠지만, 원래 간절함이라는 것은 로컬 변수만큼이나 근시안적인 성질을 가지고 있으니까요. 몇 번의 빌드와 몇 번의 실패 끝에 원하는 것을 이룰 수 있을지는 알 수 없었습니다. 그 과정에서 힘이 얼마나 더 빠질지도 알 수 없었고요. 다만 이 일이 잘되었으면 좋겠다는 그 마음이 사라지지만 않는다면 앞으로도 계속 빌드 버튼을 누르고 계속 결과를 확인할 수 있을 것 같다는 생각을 하면서 실행 결과를 확인했습니다. 또 실패했네요.

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

죄송하지만 서버는 하나가 아닙니다  (0) 2018.08.17
2012  (0) 2018.08.12
스윙바이  (1) 2018.07.28
가짜 심장의 진심  (1) 2018.07.27
참는 것과 남는 것  (0) 2018.07.27
댓글