3부. 높을수록 얇은 공기
이 사고는 밈이 됐다.
하지만 그날 밤 이불을 뒤집어쓰고 울었던 건, 아무도 모른다.
리만 브라더스가 무너지던 그해, 내가 친 첫 번째 실수는 숫자 하나였다.
나는 글로벌 게임사에서 신입 웹 개발자로 첫 발을 내디뎠다.
개발팀은 '스튜디오'라는 이름의 분리되어 운영되었고, 나는 그 안에서 웹 개발을 담당하는 공용 조직에 배치됐다.
"야, 신입. 온보딩 끝났으면 바로 실무 투입이야. 이건 프로모션 페이지니까 오늘 중으로 배포해."
시니어 개발자 멘토, 박 선배가 툭 던지듯 일을 줬다.
박 선배는 입만 열면 육두문자가 튀어나오는, 전형적인 '쎈누나' 캐릭터였다.
하지만 새벽 점검이 있는 날이면 누가 시키지도 않았는데 편의점 커피 두 잔을 들고 나타나 하나를 툭 내밀곤 했다.
욕은 입에 달고 살았지만, 사람을 내치지는 않는 사람이었다.
그런데 나를 더 놀라게 한 건 그의 입담보다도, 내가 들어온 조직의 운영 방식이었다.
돌이켜보면 조짐은 면접 때부터 있었다.
팀 면접에서 나는 조심스럽게 물었다.
"형상관리는 어떤 방식으로 하시나요?"
면접관은 잠깐 표정을 굳히더니,
"그건 기밀이라 자세히 말씀드리기 어렵습니다."
라고 답했다.
그때는 그 말이 그저 보안이 엄격한 회사쯤으로 들렸다.
입사하고 나서 보니 웹개발 쪽 체계가 거의 없었다.
개발 서버와 운영 서버의 경계조차 흐릿했다.
소스 코드를 고치려면 FTP로 운영 서버에 직접 접속해 파일을 덮어씌우는 식이었다.
겉으로는 큰 회사였지만, 웹개발의 운영 방식은 생각보다 거칠었다.
사건은 입사 후 첫 수습 기간, 새벽 점검 때 터졌다.
원래라면 '오전 7시부터 점검입니다(총 2시간)' 같은 안내 페이지가 떠야 했다.
하지만 점검 시스템이 따로 있는 게 아니라, 안내 문구를 직접 고치고 인덱스 파일의 리다이렉트 경로를 수동으로 바꿔야 하는 원시적인 방식이었다.
손등에 식은 공기가 먼저 닿았다.
눈앞에 뜬 안내 창을 똑바로 보려고 눈을 몇 번이나 비볐다.
그런데 눈꺼풀은 자꾸만 '딱' 하고 붙었다.
'두 시간'.
그 숫자 하나를 잘못 치면, 내 인생이 두 동강 날지도 모른다는 생각이 스쳤다.
[안내] 금일은 오전 7시부터 점검입니다 (총 72시간)
단순한 오타였다.
'2시간'을 쓰려던 문장이 화면에는 '72시간'으로 박제되어 있었다.
아침에 눈을 뜬 유저들은 경악했고, 커뮤니티는 순식간에 성지순례가 되었다.
"와, 드디어 유저들한테 3일 휴가 주네. 갓-회사 인정합니다."
"개발자님, 2랑 7은 키보드 거리가 좀 먼데... 혹시 졸면서 머리 박으셨나요?"
"72시간 점검 실화냐? 이 정도면 게임 새로 만드는 거 아님?"
유저들은 이게 실수라는 걸 알면서도, 그 실수를 밈으로 만들었다.
나는 새로고침을 누를 때마다 댓글이 하나씩 늘어나는 걸, 아무 말도 하지 못하고 바라봤다.
사무실 안의 공기는 전혀 유쾌하지 않았다.
로컬에서는 멀쩡하던 리다이렉트가 서버 환경의 시각 설정 차이로 엉뚱한 타이밍에 꺼지는 사고까지 겹치자, 사무실엔 폭풍이 몰아쳤다.
"야! 너 미쳤어? 72시간? 너 지금 우리 게임 제사 지내냐! 이 새끼 이거 순 꼴통 아냐? 면접 때 뭘 본 거야!"
박 선배의 고함과 욕설이 사무실을 울렸다.
집으로 돌아오는 대중교통 안, 이어폰도 꼽지 않은 채 창밖만 바라봤다.
유리에 비친 내 얼굴이 안내 문구의 숫자와 겹쳤다.
집에 돌아오면 방 안은 늘 너무 조용했다.
옷도 갈아입지 못한 채 이불을 뒤집어쓰면, 형광등 불빛이 천 사이로 누렇게 스며들었다.
눈을 감아도 안내 문구의 숫자가 떠 있었고, 욕설이 귀 안쪽에서 다시 울렸다.
숨을 죽여보려 해도 어깨가 들썩였다.
그렇게 소리도 못 내고 우는 밤이 늘어갔다.
박 선배는 쐐기를 박듯 한마디를 더 보탰다.
"너, 사실 직군 면접 결과 형편없었어. 내가 불쌍해서 뽑아달라고 한 거니까, 수습 잘리고 싶지 않으면 똑바로 해. 알았어?"
아침마다 한숨이 늘었고, 출근길에 발걸음이 무거웠다.
우여곡절 끝에 수습 기간이 끝났다.
'72시간'이라는 전설 같은 오타 사고를 내고도 잘리지 않은 건 천운이었다.
드디어 정직원이 되었다는 안도감에 젖어 있을 무렵, 박 선배가 나를 탕비실로 불러냈다.
탕비실은 늘 애매한 공간이었다.
누군가는 커피를 타러 들어오고, 누군가는 담배 냄새를 털어내러 들어왔다.
문이 열릴 때마다 복도의 소음이 한 번씩 들이치고, 문이 닫히면 다시 작은 방처럼 고요해졌다.
박 선배는 마치 다음 주 점심 메뉴를 고르듯, 아무렇지도 않게 말했다.
"나 다음 달에 다른 팀으로 옮긴다."
커피를 마시다 사레가 들릴 뻔했다.
이제 막 걸음마를 뗀 신입에게 유일한 보호자이자 감시자였던 사수가 사라진다는 소리였다.
"그럼 제 사수는요? 새로 오나요?"
"새로 오긴 뭘 와. 이제 네가 이 스튜디오 웹은 다 책임지는 거야. 나 가는 자리에 너 앉힌 거니까."
알고보니 나는 보충 인력이 아니라 박 선배의 '대체 인력'으로 뽑힌 것이었다.
스튜디오에 돌아가는 수많은 라이브 게임의 웹 서비스, 이벤트 프로모션, 사내 운영 툴까지.
그 거대한 시스템을 이제 갓 수습을 뗀 나 혼자 지켜야 한다는 사실에 눈앞이 캄캄해졌다.
가장 먼저 닥친 건 '여름 성수기 대규모 패치'였다.
게임 업데이트에 맞춰 웹사이트도 새 옷을 입어야 했고, 수많은 프로모션 페이지가 줄줄이 대기하고 있었다.
단순한 스킨 변경 작업이었지만, 나는 여기서 무모한 선택을 했다.
"다시는 72시간 점검 같은 실수는 안 한다. 시스템으로 막겠다."
나는 단순 수정을 거부하고 전체 코드의 대규모 리팩토링을 선언했다.
맨손으로 벽돌을 끼우던 시대를 내 손으로 끝내고 싶었다.
형상관리 도구를 도입하고, 로컬–테스트–운영으로 이어지는 배포 프로세스를 만들고, 디자인 스킨만 바꿔도 웹사이트 전체를 갈아 끼울 수 있는 구조를 설계했다.
다만 욕심이 과했다.
문제는 라이브 운영과 구조 개편을 동시에 끌고 가기엔 내 시간이 턱없이 부족했다는 점이었다.
라이브 서비스는 기다려주지 않았다.
일일 업무와 거대 프로젝트를 병행하다 보니 상반기 내내 내 삶은 야근으로 찌들었다.
매달 정기적으로 발생하는 프로모션 대응 시간을 계산에 넣지 않았던 것이다.
결국 다른 팀으로 옮겨갈 준비를 하던 박 선배의 도움을 받아 우선순위를 조정하며 겨우 일정을 맞췄다.
야심차게 리뉴얼된 웹사이트가 오픈된 직후, 대시보드 경고가 붉게 떠올랐다.
사이트가 먹통이 된 것이다.
"뭐야, 왜 안 떠?"
셔츠 등판이 등뼈에 달라붙는 게 느껴졌다.
박 선배가 급히 인프라 모니터링 툴을 띄웠다.
웹 서버의 CPU 점유율이 100%를 찍고 있었다.
'내가 만든 코드가 서비스를 멈추게 하고 있구나.'
나는 고개를 들지 못했다.
팀장님과 박 선배가 긴급하게 인프라를 증설하고 나서야 상황은 간신히 안정되었다.
그해 여름, 우리 게임의 업데이트는 초 대박이 터진 상태였다.
유명 아이돌을 내세운 마케팅과 경기 침체 속에 유저가 직전 성수기보다 몇 배는 더 몰린 것이었다.
내 코드에 약간의 비효율은 있었지만, 애초에 그 어떤 코드였어도 그 엄청난 트래픽 앞에서는 인프라 확장이 불가피한 상황이었다.
그날 처음, 회사 밖에서 밀려오는 트래픽의 높이가 실감났다.
여름이 끝난 어느 저녁, 박 선배와 나란히 자판기 커피를 마셨다.
캔 마개를 따는 소리가 유난히 크게 울렸다. 아무 말 없이 한 모금씩 마시다가, 박 선배가 먼저 웃었다.
"야, 그래도 안 죽었다."
박 선배는 말을 마치고 내 등을 한 번 툭 쳤다.
세게는 아니었지만, 그 손바닥의 온기가 오래 남았다.
나도 웃었다.
그 웃음이 입 밖으로 나오는 순간, 그 여름이 정말 끝났다는 걸 실감했다.
박 선배는 예정대로 다른 팀으로 이동했다.
이동 전 마지막 날, 박 선배가 자리를 비운 사이 나는 무심코 그의 빈 자리를 바라봤다.
화면보호기가 돌아가는 검은 화면 위로 회사 로고가 느리게 떠다니고 있었다.