티스토리 뷰

에세이

From Papercut to Sharp Edges

June 2018. 8. 26. 03:24

I don't know what stressed me first or how the pressure was fed.


난 뭐가 나를 스트레스받게 만들기 시작했는지도, 이 압박감이 어디에서 오는지도 잘 모르겠어.


2017년 4월 9일 23시 20분


가방검사를 마치고 보안직원과 마음속으로 인사를 나눈 뒤 회사 건물 밖으로 나섰다. 해는 3시간 53분 전에 사라졌고 달빛이나 별빛이 잠실 하늘을 비춰주지는 않으니, 나는 온전히 가로등 불빛과 가끔 지나다니는 차들의 헤드라이트에 의지해서 지하철역으로 향했다. 잠실역의 2호선 막차 시간은 24시 21분이니까 삼보일배를 하면서 가도 늦지는 않겠구나 라는 생각이 들었다. 막차가 끊겨서 택시를 타고 퇴근하는 그런 불행한 일은 원치 않았다.


건물 밖을 나서서 몇 걸음을 걸었을 때 아주 작은 물방울 하나가 얼굴을 스치는 것을 느꼈다. 그런 일을 당했을 때 대부분 사람이 그렇듯이 몇 걸음 걸어가면서 두 번째 물방울을 기다렸다. 방금 떨어진 것이 그냥 착각인지, 누가 저 위에서 생각 없이 뿌린 물인지, 에어컨 실외기에서 떨어진 물인지, 아니면 비가 내리기 시작한 것인지 알아보기 위해서. 잠시 뒤 두 번째, 세 번째 물방울을 느낄 수 있었고 나는 어쩔 수 없이 그 물방울들에 빗방울의 지위를 부여할 수 밖에 없었다.


낭패였다. 우산이 없었다. 지금 내리는 가느다란 빗줄기는 어떻게 봐도 10분 내에 굵어질 것 같지는 않았고, 직원들의 복지를 위해서였는지 투자목적이었는지는 모르겠지만 역에서 가까운 건물을 매입한 회사의 위대한 결정 덕분에 회사 앞에서 지하철역까지는 느긋하게 걸어도 7분밖에 걸리지 않았다. 문제는 신도림역이었다. 우리 집은 영등포역에서 가까웠지만, 신도림역에서 영등포역으로 가는 1호선 열차는 24시 이전에 다 끊기기 때문에 탈 수 없었다. 최근 몇 주 동안 24시 이전에 신도림역에서 내린 기억이 별로 없었던 나는 그래서 그냥 신도림역에서 집까지 걸어가는 것에 익숙해지기로 마음먹었었다. 더군다나 이런 봄 날씨에 1.5km 정도 걸어가는 것은 시간대가 조금 이상하기는 했지만 산책하는 기분으로 할 수 있는 일이었다. 하지만 비가 내린다면 이야기가 완전히 달라진다.


몇 방울의 비를 더 맞으며 다시 사무실에 올라가서 우산을 가져올까 고민했다. 이럴 때를 대비해서 사무실에 항상 우산을 비치해두고 있었고, 막차 시간까지는 한참이 남았으니 사무실에 올라가서 우산을 가져오는 계획에는 아무런 문제가 없었다. 그런데 그러기 싫었다. 사무실에 올라가려면 1분 전에 마음속으로 고생하셨다고 고생하시라고 인사를 주고받은 보안직원과 다시 마주쳐야 했고, 3분 뒤에 그 직원이 우산을 잘 볼 수 있도록 오른손에 잡고 '저는 이 물건 때문에 다시 올라갔다 내려왔답니다. 당신은 바깥을 볼 수 있으니 비가 내리기 시작했다는 것을 잘 알고 계셨겠지만 저는 오늘 13시간 동안 모니터만 보고 있었거든요. 그러니까 제가 우산을 안 가지고 내려와서 다시 올라갔다 내려온 것은 그렇게 바보 같은 짓이 아니랍니다. 고생하세요.' 라는 인사를 또 마음속으로 건네야 했다. 그리고 예외 없이 가방검사를 다시 받아야 했다.


특히 마지막 부분이 마음에 들지 않았다. 이미 한 번 검사를 마친 가방을 다시 검사한다고 해서 문제가 생길 일은 없겠지만 의심을 받는다는 것 자체가 기분 좋을 수는 없는 것이다. 가방이 엑스레이를 통과하는 그 짧은 시간의 어색함이 싫었다. 나는 아무 잘못을 하지 않았는데 그걸 굳이 다른 사람에게 확인받아야 하는 일이. 예쁜 마음을 가지고 있었다면 굳이 그렇게 싫지도 않았을 일이었지만 그러지 못했다. 그래서 회사 건물 앞에서의 짧은 고민을 마치고 그냥 비가 조금 내리다 그치겠지 라고 아무 근거 없이 믿으며 지하철역으로 향했다. 비관적인 마음이 긍정적인 결정을 내려버린 역설이 마음에 들지 않았다. 그리고 그런 역설을 만들어낸 내 마음 상태가 마음에 들지는 않았다.


2017년 4월 9일 10시


오늘은 꼭 문제를 해결하고 퇴근해야겠다고 생각했다. 그래서 오늘 퇴근하지 못할 수도 있겠다는 생각도 들었다. 이 문제를 해결하지 못했을 때 일정이 얼마나 꼬일지 생각해보니 마음이 무거워졌다. 도와줄 사람도 지켜보는 사람도 없으니 그 무거움은 온전히 내가 감당해야 할 중력으로 치환되었다.


지지난 주에 있었던 강원도 출장의 기억을 되살려봤다. 우리는 급하게 만든 시스템을 테스트해보기 위해서 강원도까지 찾아갔었고, 도착하자마자 이런저런 테스트를 해보며 우리 시스템이 정상적으로 잘 동작한다는 사실을 알게 되었다. 역시 아무리 말도 안 되는 일정이라도 주어지면 다 하기는 한다는 사실과 그걸 해내기 위해 소모했던 감정들을 생각해보니 살짝 우울해지는 것 같았다.


우울함을 횡성 한우로 달래고 몇 가지 코드를 수정한 뒤 다음날 본격적인 테스트를 수행했다. 보통 우리 개발자들이 생각하는 테스트는 유닛 테스트 코드를 열심히 짜고 실행을 눌러서 초록색 불이 뜨면 혼자 좋아하는 것이라든지, 회의실에 모여서 이것저것 눌러보면서 값이 제대로 나오는지 확인해보는 그런 정적인 작업이 대부분이었는데, 그 날의 테스트는 정말 내 개발자 커리어에 다시 있을까 싶을 정도로 대단했다. 통제된 환경이기는 했지만 제대로 테스트해 보기 위해서 불까지 질렀으니까.


그리고 거기에서 우리는 우리가 만든 시스템이 말도 안 되게 느리다는 사실을 알게 되었다. 어쨌든 화면에 값들이 나오기는 하니까 테스트 성공! 이라고 이야기하는 것은 주간보고에나 올라갈 뻔뻔함이었고 그 값들이 느리게 표시되니 테스트 실패! 라고 이야기하는 것은 온전히 개발자들의 책임이었다.


우리가 만든 것은 준실시간(Near realtime) 시스템이었지만 많은 사람들이 준실시간 시스템과 실시간 시스템의 차이를 몰라서 보통 그냥 실시간 시스템이라고 불렀다. 그래서 우리는 실시간 처럼 보이는 시스템을 만들려고 많이 노력했는데, 실제 테스트에서 데이터베이스에 몰린 어마어마한 부하는 우리 시스템을 준실시간 시스템도 아닌 배치(Batch) 시스템처럼 보이게 만들어줬다. '지금 보시는 데이터는 3분 전에 수집된 데이터 입니다. 7초 후에 2분 59초 전에 수집된 데이터를 보여드리겠습니다.'


서울로 돌아와서 문제의 원인을 분석하고, 대책을 수립했다. 문제의 원인 : 백엔드 서버를 내가 만들지 않았다. 대책 : 내가 서버를 다시 만든다. 부서는 군말 없이 내가 제시한 대안을 통과시켜줬고, 일부 업무 조정이 있고 난 뒤 나는 느리게 돌아갈 만한 코드를 전부 지우고 처음부터 서버를 다시 만드는 작업을 진행했다. 물론 서버를 다시 만드는 작업은 거기에 연결된 클라이언트를 다시 만드는 작업을 동반했고 해내야 하는 일은 매우 많았다.


오늘은 꼭 문제를 해결하고 퇴근해야 하는 날이었다. 끝이 보이지 않을 만큼 많이 쌓인 문제들과 달리 프로젝트의 일정과 보고는 정상적으로 진행되었고, 회사는 '잘 돌아가는 시스템'을 미국에서 시연할 그럴듯한 계획을 가지고 있었다. 그러기 위해서는 미국행 비행기에 '잘 돌아가는 앱'이 실려야 했고, 미국에 미리 마련해둔 서버들에 '잘 돌아가는 서버 프로그램'을 설치해야 했다. 서버 설치 작업이야 빛의 속도로 이루어지니까 별문제는 아니었지만 '잘 돌아가는' 것들을 준비해두려면 어쨌든 오늘까지는 결판이 나야 했다. 안 그러면 나 때문에 많은 사람이 피해를 보고 고생하게 되니까.


그렇다면 내가 가지고 있는 피해와 고생의 근원은 무엇일까 고민하다가 그냥 고민을 멈췄다. 다 지우고 새로 만들기로 결심한 이상 과거에 대한 회고는 별로 도움이 되지 않았고, 지금의 상황에 집중하는 것이 현실적인 선택이었다. 어쨌든 프로젝트 일정의 속도는 이미 V1을 넘겼고, 중도 취소라는 것은 선택 가능한 옵션이 아니었다. 설령 추락하는 한이 있더라도 오늘은 뭐라도 띄워봐야 했다.


2017년 4월 9일 15시


점심을 걸러서였는지 한결 가벼운 동작으로 서버를 띄우는 데 성공했다. 사실 서버는 느리게 돌 때도 뜨기는 떴으니까 뭔가 진전이 있었다고 보기는 어려웠다. 다만 일요일이었기 때문에 아무도 도와주는 사람이 없는 상황에서 서버를 자력으로 띄웠다는 사실에 만족하기로 했다. 나는 이 프로젝트의 웨어러블 앱 개발자이자 연계 시스템 담당자였으며, 현장 테스트 한정으로 영상 촬영 담당 및 서버 모니터링 담당자를 겸임했었고 돌아와서는 모바일 앱 개발자이자 백엔드 개발자였는데, 이제 거기에 서버 관리자의 직함을 더해도 괜찮을 것 같다는 생각이 들었다.


이제 웨어러블 장비를 기동시켜서 데이터 수집을 시작하고, 동시에 모바일 장비들을 기동시켜서 데이터가 빠르게 나타나는지 확인하는 작업만 남았다. 강원도에서의 테스트가 실패한 가장 큰 이유는 개발단계에서 한두 개의 장비만 연결해서 테스트해 봤던 '실험실 환경'의 문제가 가장 컸기 때문에 나는 출근하지 않은 사람들의 장비를 모두 내 자리에 가져다 놓고 강원도 테스트와 동일한 숫자의 디바이스들을 동시에 기동시켜서 확인할 준비를 했다. 내가 짠 코드와 미리 해본 계산이 정확하다면 모든 장비에 데이터는 0.1초 미만의 지연으로 표시될 것이고, 우리 영업사원들은 조금 더 자신감을 가지고 이 시스템을 시연할 수 있겠다는 생각을 했다.


서버가 기동 되었다는 로그를 확인하고, 장비들에서 앱을 하나씩 실행했다. 데이터가 정상적으로 수집된다는 로그를 확인하고, 그 데이터들이 새로 추가한 캐시 영역에 제대로 들어가는 것을 확인했다. 일단 절반은 성공했다. 크게 심호흡을 하고 모바일 장비들에서 앱을 하나씩 켜면서 데이터가 정상적으로, 그리고 빠르게 표시되는지 확인해봤다. 이 조건만 맞으면 일찍 집에 갈 수도 있었다.


모바일 앱의 화면을 보면서 문득 10년 전, 학교에서 프로그래밍 언어론(Programming Language) 수업을 들었을 때가 떠올랐다. 아아 교수님, 이것이 그때 설명해주신 단락 회로 평가(Short circuit evaluation) 이군요. A AND B가 참이어야 될 때, 컴퓨터가 계산량을 하나라도 줄이기 위해서 A가 거짓이면 B에 대한 검증을 생략해버리는 그것. 모바일 장비의 화면에는 아무런 데이터도 표시되지 않았고, 그래서 나는 데이터가 빠르게 표시되는지 확인해볼 필요도 없었다. 물론 결과가 거짓으로 나왔기에 일찍 집에 갈 수도 없었다.


2017년 4월 9일 23시 30분


지난 몇 시간 동안 정말 별것도 아닌 문제 때문에 한참 고생했다. 조금만 차분하게 생각했으면 10분 만에도 해결할 수 있었을 문제였다. 뭔가를 만드는 과정에 비해서 문제를 해결하는 과정은 진척이 눈에 보이지 않기 때문에 매우 힘이 빠지는 작업이었는데, 8시간을 넘게 하나의 문제에 매달리고 있었으니 마음이 정상적일 리가 없었다.


늦은 저녁 시간대의 잠실역 내선순환 플랫폼은 매우 한산했다. 오늘도 편하게 앉아서 갈 수 있겠다는 생각과 함께 무슨 영화를 보면서 집에 갈까 고민했다. 사실 지난 몇 주간 매일 했던 고민이었다. 지하철에 타기 전에 혹시 새로 등록된 영화가 있는지 검색을 한 번 해봐야겠다는 생각을 하다가 문득 행선표시기를 쳐다봤는데, 다음 열차가 서울대입구 까지만 간다는 안내를 보게 되었다. 비가 안 내리더라도 서울대입구역에서 집까지 걸어가는 것은 조금 무리가 아닐까 고민하다가 내가 원래 서울대입구행 막차 표시를 보면 안 된다는 사실이 퍼뜩 떠올랐다.


서울대입구역에는 차량기지가 없다. 그래서 서울대입구행 지하철은 그냥 서울대입구역에 멈춰선다. 다음 날 아침에 모든 열차가 신도림과 성수에서 출발하면 첫차 시간이 매우 늦어지는 역들이 많아지기 때문에 2호선 막차들은 그런 식으로 서울대입구역, 삼성역, 홍대입구역, 을지로입구역의 주박선에 서 있다가 다음 날 아침에 첫차 역할을 수행하기 위해 출발한다. 바꿔말하면 서울대입구역까지 가는 지하철이 온다는 소리는 그다음 열차는 어떻게도 서울대입구역을 넘어설 수 없다는 소리가 된다.


신도림역은 물론 서울대입구역 너머에 있었다. 아니 요새 그렇게 많은 막차를 탔는데 왜 내가 막차 시간을 놓쳤지? 라고 고민하다가 그제야 오늘이 일요일이라는 사실을 깨달았다. 아, 일요일은 막차가 한 시간 일찍 끊기지. 어쩐지 거리도 한산하고 사람도 별로 없더라. 플랫폼에도 사람이 거의 없는 이유가 있었네.


어차피 망한 퇴근길 굳이 서두를 필요가 없다고 생각해서 터덜터덜 지하철역을 나와서 다시 회사로 향했다. 빗줄기는 제법 굵어져서 우산이 있었다면 펼까 말까 고민할 정도가 되었다. 우산이 있었다면 고민을 했을 테니까 우산이 없는 나는 그걸 가지고 고민을 하지는 않았다. 대신 다른 고민을 했다.


오늘 아무것도 못 먹었는데 편의점에서 우유라도 하나 사갈까. 택시를 잡으려면 큰길 보다는 회사 앞에서 잡는게 낫겠지. 횡단보도 건너편에 2~3대씩 항상 서 있었으니까. 이번 택시기사 아저씨는 영등포 로터리에서 욕 안 했으면 좋겠다. 비가 애매하게 내리는데 택시가 과속 안 했으면 좋겠다. 안전벨트 꼭 매고 가야지. 내가 소스코드를 올려놓고 나왔나? 에이, 별일 없겠지. 캐시 영역에 심전도 데이터 통째로 올려도 메모리 부족하지 않을까. 안 쓰는 데이터는 데이터베이스에서 읽어오게 바꿔야 할까. 그럼 또 느려질 텐데. 랜덤 엑세스 기능 빼달라고 말하면 들어줄까? 화면에서 데이터 갱신할 때 애니메이션 넣을 수 있을까. 역시 위도랑 경도는 따로 저장할 게 아니라 시간이 조금 걸리더라도 지오해시를 쓰는 게 맞았을까. 나도 미국 출장 가고 싶다. 오늘 고친 코드 다른 사람한테 설명할 수 있을까. 속도 올린다고 엄청 복잡해졌는데. 그냥 끝까지 내가 들고 가야 될까. 왜 항상 힘들고 지칠까. 내가 힘든 일을 많이 받아서 그런 걸까, 아니면 내가 잘하지 못해서 그런 걸까. 왜 못하겠다는 소리를 못하는 걸까? 어째서 항상 혼자 일하는 기분이 들지? 나를 도와줄 수 있는 사람은 없는 걸까? 왜 내가 부담해야 하는 책임감은 계속 늘어나는데 나에 대한 평가는 계속 떨어질까? 내 인생의 가장 찬란한 시절은 이미 지나간 걸까, 아니면 아직 오지 않은 것일까. 이 상황이 내가 원하던 상황일까. 지금 이건 다 내가 하고 싶어서 하는 일이 맞나? 사실 나는 하기 싫은 일을 하면서도 착한 개발자의 모습을 연기하기 위해 나 자신을 소모하고 있는 것이 아닐까? 내가 그동안 포기하고, 버린 것들은 무엇이고 그래서 얻은 것은 무엇일까?


나는 그냥 앞으로도 계속 이렇게 사는 걸까?


복잡한 마음으로 바라본 횡단보도 건너편에는 어김없이 택시가 기다리고 있었다. 내 인생에서 항상 기대를 저버리지 않는 몇 안 되는 소중한 것 중 하나였다. 신호가 바뀌기를 기다리고 있는데 빗줄기가 생각보다 굵어졌다. 밸런스드 아마추어 이어폰은 습기에 엄청 취약한데 오늘은 다이나믹 드라이버 이어폰을 끼고 있어서 다행이라고 생각했다. 그래서 이어폰을 가방에 집어넣는 대신 바뀐 신호에 맞추어 길을 건너며 흘러나오는 음악 소리에 집중했다.


Why is everything so heavy?


왜 모든 것이 이렇게 무겁게 느껴질까?


2017년 7월 21일 10시


그 프로젝트는 미국에서의 시연을 성공적으로 마치고 긍정적인 피드백과 함께 폭파되었다. 한두 번 있는 일도 아니어서 표정 변화 없이 그 사실을 받아들이고 다음 프로젝트로 향했다. 새로운 프로젝트 환경에 적응하기에 바빴던 그때 출근길 지하철에서 체스터 베닝턴의 자살 소식을 접했다.


하고 싶은 공부를 하려면 하기 싫은 공부를 해야 된다는 사실에 힘들어 하며 내키지 않는 발걸음으로 독서실로 향할 때 CDP에서 흘러나오던 첫 번째 앨범의 첫 번째 트랙 Papercut부터, 내가 하고 싶은 일을 하러 가는 것인지 의심이 들기 시작한 출근길에서 스마트폰의 스트리밍으로 듣던 마지막 앨범의 마지막 트랙 Sharp Edges에 이르기까지 18년의 시간과 단절되는 듯한 기분이 들었다.


전곡 랜덤 재생 모드로 재생되고 있던 음악 앱을 잠시 멈췄다. 그리고 아티스트 재생 모드로 바꿀까 잠시 고민하다가 지나치게 청승맞다는 생각이 들어서 결국 아무 음악도 틀지 못했다. 대신 내가 의지할 수 있는 것들이 하나둘씩 사라져가는 이 세상에서 나는 이제 어떻게 살아야 할지에 대해서 깊이 고민하기 시작했다.


We all fall down, We live somehow, We learn what doesn't kill us makes us stronger.


우리는 모두 무너지지만, 어떻게든 살아가고, 무엇이 우리를 죽이지 않고 강하게 만들어주는지 배워가.


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

Semi-Automatic  (0) 2018.09.10
Little Big Adventure  (2) 2018.09.07
죄송하지만 서버는 하나가 아닙니다  (0) 2018.08.17
2012  (0) 2018.08.12
Build, Pray, Run  (0) 2018.08.06
댓글