티스토리 뷰

산업기능요원 복무가 끝나가던 2018년 말 즈음부터 회고록을 써야겠다고 마음을 먹었지만, 막상 실행에 옮기기가 쉽지 않아 미루고 미루다 드디어 작성하게 되었다.

 

아, 그리고 제목에는 4년 차 게임 서버 프로그래머라고 되어있는데, 사실 그건 2019년 기준이고... 회고 대상인 2018년의 나는 3년 차였다. 사실 3년 차나 4년 차나 큰 의미는 없지만..

 

어쨌든, 이제부터 부끄러운 글솜씨로나마 회고를 시작해본다.

산업기능요원 복무의 끝자락

2018년은 내가 2015년 9월 1일부터 시작했던 산업기능요원의 복무 기간의 끝이 보여가는 해였다. 내가 비록 진짜 군인(?)은 아니었지만, 이제 말년인데 남은 1년은 편하게 일하다 복무를 끝낼 수 있지 않을까?라고 생각했던 건 내 인생 최고의 오산이었다.

 

살면서 한 번도 겪어보지 못했던 그런 한기가 엄습하던 1월, 나는 훈련소를 다녀오게 되었다. 날씨가 얼마나 추웠는지, 입소했을 때 얼어있던 얼음이 퇴소식을 할 때 까지도 녹지 않았다. 만년설  하지만, 그럼에도 불구하고 나에게는 희망이 있었다. 나에겐 행복한(?) 말년 생활이 주어질 거라고 믿었기 때문이었다.

 

마침내 퇴소식 날, 회사 분들에게 인사를 돌리기 위해 회사 메신저를 켜자마자 '찌릿' 하는 기분이 들었다. 전사 채팅방의 공기가 달라져 있었다. 참여 인원수도 너무 적어진 것 같고, 메시지도 비정상적으로 많이 와있고...

 

슬픈 예감은 왜 틀린 적이 없는 걸까? 인정하고 싶지 않을 뿐 사실 어느 정도 눈치를 채고 있었기 때문인가? 어쨌든, 우리 회사는 폴아웃을 방불케 하는 그런 디스토피아스러운 상황이 되어 있었다. 그런 상황의 여파에서 내가 속해있는 서버팀도 예외가 될 순 없었다.

 

결국 서버팀에는 나 혼자 남게 되었다. 타노스가 다녀간 흔적  와! 이제 내가 팀장이다!

 

그 후로는 하루하루가 지옥이었다. 처음으로 회사에 가기 무섭다는 생각을 해 본 시기였다. 정말 즐겁게 일하다가도, 쌓여있는 업무들을 보면 숨이 턱턱 막혀 쓰러질 것 같다는 생각도 들었다.

 

사랑하는 게임을 위한 노력이었나, 아니면 스톡홀름 증후군이었나

위에 서술한 일련의 상황이 오기 전까지, 나는 그냥 평범한 게임 서버 개발자였다. 기획서 리뷰를 받고, 새로운 슬롯머신의 로직을 짜고, 기존 코드에 리팩토링 해야 할 부분이 있는지 검토하고, 팀장님과 함께 수정해나가고.

 

하지만, 대거 퇴사 후 모든게 달라졌다. 우리 게임의 히스토리부터, 슬롯머신의 밸런싱, BI 등.. 서버팀에서 약간씩 다리를 걸치고 있었던 모든 업무에 적신호가 켜졌다. 고작 나 한 명이 나선다고 어떻게 될 상황이 아니었지만, 그렇다고 손가락 빨고 구경만 할 수는 없었던 터이다.

 

로그를 추적하든, 추측을 하든, 메일을 전부 뒤져서든 우리 게임의 히스토리를 파악하려고 노력했고, 어깨너머로만 배웠던 밸런싱에 대해 공부했다. 머신러닝을 공부해서 최상의 밸런싱을 찾기 위해 노력했고, 얄팍한 SQL 실력으로 BI를 추출하고 분석하여 활용했다. 낡은 것은 버리고 새롭게 개선했다. 당연히 내 본연의 업무였던 슬롯머신 서버도 계속 개발해야 했고, 인수인계 문서조차 없던 플랫폼 서버까지 담당했다. 문서가 없으니 모르는 건 그저 코드를 보고, 디버깅하고, 로깅하고, 실제로 구동하는 등의 방법밖에는 없었다.

 

이렇게 몇달을 지내다 보니 내 몸과 정신도 망가지는 것 같았지만, 그보다는 우리 게임이 망가지는 모습을 보는 게 더 싫었다. 비록 내가 완성시킨 게임도 아니고, 한참 뒤늦게 합류했던 게임이지만, 그런 건 아무래도 중요치 않았다. 어쨌거나 지금 내가 개발하고 있는 게임의 유저들이 우리 게임을 재밌게 플레이해줬으면 하는 마음이었다.

 

정말 다행히 약간의 성과는 있었지만, 이 일을 했다고 해서 인정해주는 이도 없었고, 물질적인 보상이 있던 것도 아니었다. 커피 한 잔 얻어먹어본 기억이 없다. 아, 하나 있다. 점심에 비빔냉면 얻어먹었다

 

나는 내가 했던 이 일련의 행동들이 우리 게임에 대한 사랑에서 나온 것이었는지 아니면 단순한 스톡홀름 증후군이었는지 알지 못한다. 다만, 1여 년이 지난 아직까지 그때의 기억만큼은 생생하게 남아있다.

 

바퀴의 재발명

원래 TCP 프로토콜만 사용하던 우리 게임이, 2017년 경 웹소켓 프로토콜도 지원해야 하는 이슈가 생겼다. 당장 적용될 내용은 아니지만, 클라이언트 테스트는 필요했기에 당시 리드 프로그래머였던 팀장님께서 구현을 맡아주셨다. 라이브 서비스중인 게임 서버의 기존 통신 과정을 싹 뜯어 고칠 순 없었으므로, 기존 패킷에 웹소켓 프로토콜 프레임만 붙인 형태로. 여기까진 완벽했다. 그래서 나는 이것에 대해 크게 신경쓰지 않았다. 내가 인수인계 받은 것도, 우리 서버가 웹소켓 프로토콜을 지원하게 하려면 어떤 빌드 옵션을 줘야 하는지 정도가 전부였다. 

 

하지만 문제는 내 주위에 모두가 떠나간 다음 벌어졌다. 기존에 작업되어 있었던 건 데모 테스트에 가까운 버전이였기에, wss에 대한 고려가 되어있지 않았던 것이다.

 

이 때 만큼 멘붕이 심했던 적도 없었던 것 같다

새 프로젝트에 들어가면서 구현해야 할 서비스 컨텐츠는 10개가 넘어가고, 기존 프로젝트에 들어가야 할 슬롯머신을 계속 개발하고 있으며, BI까지 담당하고 있는 상태에 있던 나에게는 멘붕이 아닐 수 없었다.

어떻게든 해야했다. 서비스를 안 할순 없으므로. 하지만 정보가 거의 전무했다. (지금 생각해보면 키워드의 문제가 아니였을까 싶기도 한데) 그렇다고 기존 프레임워크의 소켓을 걷어내고, 새로운 웹소켓 라이브러리를 적용시킨 다는 것도 미친짓임이 자명했다. 2주도 주어지지 않은 개발 기간에, 라이브 서비스 중인 게임에 도박을 할 순 없었다. 

 

(체감상) 영겁의 시간을 검색과 테스트에 쏟아 붓지 않았나 싶다. 결국 몇몇 도움이 되는 정보를 찾을 수 있었고, openssl 라이브러리를 사용해 스트림을 직접 암/복호화 하는 방법을 사용해 해결했다. 당연하게도 흔한 example 중 하나인 SSL_write, SSL_read 함수를 이용한 통신은 당연히 사용할 수 없었다. 이 과정에서 끊임없는 삽질과 야근이 계속됐지만, 어쨌든 성공했다. 웹소켓 에코 테스터에서 내 서버로부터 응답이 제대로 들어왔다고 나왔을 때, 얼마나 기분이 좋았는지... 아직까지도 생생하다.

 

이 당시에 나는 웹소켓에 대한 이해가 거의 전무했었는데, 이 사건 이후로 정말 웹소켓만큼은 빠삭해지지 않았나 싶다.

 

혹시 저와 비슷한 삽질을 하게 되셨거나, 하고 계시는 분이 계시다면 댓글 남겨주세요. 최대한 도움을 드리겠습니다.

 

극한의 상황에서 느낀 더닝 크루거 효과

나는 항상 오만했다. '초등학생이 프로그래밍을 한다는 것', '컴퓨터를 굉장히 잘한다는 것' 지금 보면 별 것 아닌 이 두 가지만으로 나는 어딜 가나 컴퓨터 천재라는 소리를 들을 수 있었기 때문이다. 또래 친구들에게 선망의 눈빛을 받는다던가, 선생님들의 놀란 눈빛을 받는 것 역시 숨 쉬는 것만큼이나 쉬웠다. 고고하게 책상에 앉아 C언어 책 하나 펴고 공부하고 있으면 됐었으니까.

 

심지어 결과도 나쁘지 않았다. 중학생 때 10개 가까이 되는 프로그래밍 관련 대회 수상 경력이 있었고, 정보 올림피아드 공무 부분에서도 수상 경력이 있었다. 입학하고자 하는 고등학교를 정할 땐, 내로라하는 IT 특성화 고등학교에서도 내게 관심을 보였다. 계속 내 자랑만 하니까 나르시시즘에 빠진 사람 같아 보일 수 있는데, 이때부터 2018년까지 나는 그저 주제를 모르고 오만함에 절어 방향성조차 제대로 잡지 못한 사람이었다.

 

반평생을 오만하게 살았던 나에게 산업기능요원 면접을 위해 본 몇 번의 코딩 테스트에서 모두 탈락한 건 그렇게 큰 충격을 주지 못했다. 그럴 수 있다고 생각했다. '포트폴리오나 수상경력에 비해 실력이 형편없다'던 면접관의 얘기에 내 언젠가 저 사람에게 증명하리라며 이를 갈긴 했지만, 내가 부족하다고 생각하지는 않았다.

 

그 오만함은 간신히 입사한 첫 회사에서도 계속됐다. 내 옛 사수님과 팀장님은 정말 어마어마한 실력자이셨는데, 당연히 혼나기도 많이 혼났지만, 어쩌다 격려차 '어이구 우리 꼬꼬마 잘한다 잘한다~' 소리를 들으면 내가 부족해서 혼났다는 사실을 금세 잊어버렸다.

 

서당개도 삼 년이면 풍월을 읊는다는 말이 사실이라는 걸 그때는 몰랐다. 나는 내가 정말 잘하고 있는 줄 알았다. 그렇게 여전히 오만한 삶을 살다가 팀에 혼자 남게 되고, 새로운 프로젝트를 시작할 때가 되니 깨달았다.

 

'아~ 나 진짜 아무것도 모르는구나.'

 

기본기를 외면한 채 당장 눈에 보이는 결과에만 목을 매고 있었던 우매함의 결과였다. 단편적으로 몇 가지를 꼽자면..

 

1. Sync/Async와 Blocking/Non-Blocking의 차이도 제대로 이해하지 못했으면서 소켓 프로그래밍을 하고 있었다

2. OSI 7 Layer는 커녕, TCP/UDP의 내부 동작조차 전혀 모른 채 게임 서버를 개발하고 있었다 (HTTP가 TCP보다 빠른 거 아니야? 실제로 한 말)

3. CPU 스케줄링이 뭔지도 제대로 모르면서 컨텍스트 스위칭이 어쩌고 저쩌고 하면서 떠들고 다녔다

4. I/O가 일어나는 상세한 과정조차 모르고 있었다

5. 여백이 부족하여 굳이 더 적지는 않겠다........

 

총체적 난국

나에게 이 시기는, 더닝 크루거 효과에서 말하는 절망의 계곡이었다. 내가 잘했던 게 아니고, 그냥 뭘 알아야 하는지 몰랐던 것이었다. 뭘 알아야 하는지 모르니 내가 다 알고 있다고 생각한 것이었다.

 

그러니까, 웹 브라우저를 열고 google.co.kr을 입력하면, 어떤 과정을 거쳐서 구글로 접속되는지 조차 알지 못하고 있었다.

 

나 자신이 너무 한심하다 못해 자괴감까지 느껴졌지만, 지금이라도 늦지 않았다는 생각으로 열심히 찾아보고 공부했었다. 어떻게 짜여있는지 볼 생각조차 하지 못했던 회사의 자체 서버 프레임워크도 뒤져보기 시작했다.

 

자신감 높은 것 좀 보소

결론적으로, 절망의 계곡에 빠진 것이 내 프로그래머 인생에 정말 큰 도움이 된 것 같다. 깨달음의 비탈길을 오르는 건 매우 고된 일이지만, 모르고 있는 것보단 훨씬 낫지 않은가.

깨달음의 비틀길에서 무엇을 배웠나

가장 먼저, 대학교 컴공과의 보편적인 커리큘럼을 뒤져보면서 내가 가장 부족하다고 생각되는 부분들을 우선적으로 공부하는 방향으로 결정했고, 그중에서 네트워크 공부를 먼저 시작하기로 했다. 이해하기 어려운 부분도 많았고, 아직까지도 헷갈리는 탓에 계속 복습하는 부분도 많지만 공부 자체는 굉장히 재미있었다.

 

그다음은 공룡 책🦕과 함께 OS 공부를 시작했다. 역시 악명이 높은 만큼 책을 한 장 한 장 넘기기도 힘들었다. 유일하게 술술술~ 넘겼던 챕터가 동기화 객체와 스레드.. 다른 챕터들은 '내가 머리가 나빠서 이해를 못하나?'라는 생각을 많이 했었는데, 공룡 책을 처음 본 대부분의 사람들이 멘붕에 빠진다기에 동질감을 느끼며 포기하지 않고 계속 읽어나갔다.

 

그리고 내가 알고 있던 지식들을 다시 한번 체크했다. 예를 하나 들면, IOCP를 완벽하게 이해하려면 OS를 이해하고 있어야 한다. 그런데 정작 OS는 하나도 모르면서 IOCP를 이해하고 있다고 생각하고 있었으니.. 이런 식으로 하나하나 체크하다 보니, 잘못 알고 있던 부분들이나, 자세히 알지 못하고 있던 부분들이 보였다.

 

그다음은 멀티 플레이 게임 서버들에 대한 전체적인 이해와 공부였다. 나는 쭉 소셜 카지노 서버만 개발해 왔기에, RPG, FPS, RTS 같은 실시간 게임 서버는 접해보기가 어려웠다. 따라서 다른 멀티플레이 게임들에선 필연적이라고 볼 수 있는 레이턴시를 어떻게 감추는지, 논타겟팅 오픈월드 RPG에서는 서버의 부하를 어떤 식으로 감당하는지 등을 공부하고자 했고, 이를 공부할 때 슬라이드 쉐어에 공유되어 있는 많은 발표 자료들이 큰 도움이 됐다. (사랑해요 NDC!)

 

퇴사를 확정하며

내가 산업기능요원 복무 후 퇴사를 할 거라는 건 공공연한 비밀이었다. 나는 퇴사할 거라고 공공연하게 말하고 다닌 적이 단 한 번도 없는데... 아마 점심 먹으러 갈 때 자주 마주치던 길냥이 가족들도 알고 있었을 것 같다.

 

퇴사의 이유는 명확했다. 회사도 그걸 알고 있었기에, 나를 잡고자 하는 강한 의지도 없었다. 나는 더 이상 회사에서 배울 수 있는 것이 없었고, 더이상 산업기능요원 신분이 아니기에 그런 처우를 받고 싶지 않았고, 더 이상은 혼자 일하고 싶지 않았다.

 

그리고 퇴사 결정을 앞당기게 된 계기가 하나 더 있는데, 정말 감사하게도 이전에 같이 일했던 몇몇 분들이 오퍼를 주셔서, 복무가 끝나기도 전에 본의 아니게 이직 선택권(?)이 생겼다. 오퍼가 온 회사 중 두 곳은 스타트업이었고, 한 곳은 소위 말하는 3N 중 하나였다.

 

생각지도 못한 오퍼에 잠깐 놀라긴 했지만, 이내 결정을 내렸다. 스타트업에 가기로. 아직 대기업보단 스타트업에서 험하게 구르며, 더 많은 중책과 함께  많이 성장하고 싶다는 마음이 컸었다

 

 

지속 가능성의 고원을 향해

절망의 계곡을 통해 경력이 부끄럽지 않을 정도의 배움은 실천한 것 같지만, 아직 배우고 싶은것이 많이 남아있다. 부끄럽지 않을 정도로는 부족하다고 생각이 들었다.

 

우선 어셈블리 코딩과 컴파일러 구조를 제대로 공부하고 싶고, 시간이 허락한다면 OS를 실제로 개발해보고 싶다. 최소한 OS 개발 과정이라도 눈에 익히던지. 또한, 네트워크와 OS에 대해 조금 더 자세히 공부하려고 한다. 확실히 네트워크와 OS는 깊이가 매우 깊기 때문에, 책 몇 번 읽는 것으로는 온전히 내 것으로 만들기는 힘든 것 같다.

 

새로운 언어로는 node.js를 공부하고 싶다. 이유는 언어 내부의 흥미로운 아키텍처 때문이다. node.js를 맨 처음 접했을 때는, 싱글 스레드 환경에서 동기화에 대한 아무런 걱정 없이도 높은 퍼포먼스를 뽑아낼 수 있다는 것이 매우 놀라웠었다. 이런 언어들을 보고 있으면, '언어는 도구다'라는 말은 반은 맞지만 반은 틀린게 아닌가 싶다. 이런 흥미로운 아키텍처를 가진 언어들을 단순히 도구로 생각하며 사용한다면, 그 언어들의 잠재력을 100% 이끌어 낼 수 있을까?

 

더 깊게 파고 싶은 언어는 golang이다. 이직한 회사에서 사용하고 있는 언어이기에 업무의 효율성을 늘리고 싶다는 이유가 가장 크지만, go가 추구하는 스타일의 코드를 짜고싶다 라는 생각 역시 큰 이유 중 하나이다. 가끔 몇몇 패키지들(특히 io 패키지)의 소스 코드를 보고 있으면 아름답다는 생각이 절로 들면서, 나도 이런 코드를 작성해야겠다 라는 마음도 동시에 들더라.

 

그 외에는 알고리즘을 공부하고 있다. 실무를 하다보면 자연스럽게 알고리즘 실력도 늘 거라고 생각했었는데, 전혀 그렇지 않았다. 알고리즘 실력을 키우려면 알고리즘을 공부해야지, 다른 요행은 통하지 않았다. 시간이 많지 않은 터라, 주말마다 leetcode에서 easy, medium 난이도의 문제를 1~2개씩 풀어보고 있다. medium 난이도의 모든 문제를 30분 이내에 풀면 대한민국 IT 회사의 모든 코딩테스트를 통과할 수 있다고 하는데.... (왈칵)

2019 회고에는 꼭 leetcode medium 난이도의 문제를 30분 내에 풀 수 있게 되었다고 쓸 수 있기를. 

 

 

마무리

많은 일들을 겪은 만큼, 내게도 많은 변화가 있었다. 원론적인 내용에 집중하게 된 것이다. 사실 나는 뭔가를 개발할 때, 그것의 원론적인 부분까지 깊게 생각해 본 적이 없다. 위에 한 번 예를 들었던 IOCP도 비슷한 맥락이고, python의 aiohttp를 사용할 때도 비슷했다.

 

하지만 지금은 달라졌다. 무언가를 사용할 때, 원론적인 부분부터 찾아보고 완벽히 이해한 뒤에 사용한다. 자바스크립트가 싱글 스레드로 어떻게 동시성을 구현했는지, golang의 goroutine은 어떻게 c10k 문제를 쉽게 해결할 수 있었는지, 프로세스는 어떻게 독립적인 메모리 공간을 가지고 있는지, 컴파일러의 동작 원리가 무엇인지 등... 

 

아주 예전에 자료구조를 공부하면서 이런 글을 본 적이 있다. 아마 자료구조를 왜 공부해야 하는지 모르겠어서 검색을 했던 것 같다.

어차피 라이브러리 갖다 쓰면 되는데, 굳이 자료구조를 왜 깊이 있게 공부해야 하는 건가요?

이런 질문에 남겨지는 답변은 99%의 확률로 아래와 같다.

 

'알고 쓰는 것과 모르고 쓰는 것은 천지차이입니다'

 

옛날의 나는 이 말을 이해할 수 없었지만, 산전수전을 다 겪어보니 이제야 이해가 간다. 프로그래머로 살다 보면 반드시 원론적인 내용을 알아야 할 때가 온다. 심지어, 원론적인 내용을 모르면 절대 해결할 수 없는 이슈들도 많이 있다. 예를 들면 이런 거?

 

저런 이슈가 생겼을 때 침착하게 찾아내고 해결할 수 있는게 정말 훌륭한 프로그래머가 아닐까 하는 생각이 든다.

 

나의 올해 목표는, 어쩌면 평생 프로그래머로서 이루고 싶은 목표는 하나다.

위대한 프로그래머가 될 순 없어도, 그들의 새로운 프로젝트에서 스타팅 멤버에 포함 될 만한 프로그래머가 되는 것

내가 프로그래밍에 재능이 없다는건 알고 있기에, 위대한 프로그래머가 되는게 어렵다는 건 이미 알고 있다. 그렇다고 해서 평생 그저 그런 프로그래머로 살 수는 없는 노릇이니, 2018년에 겪었던 많은 일들을 터닝포인트 삼아 옳은 방향으로 전진해보려고 한다.

 

언젠가 내가 이 회고를 보며 웃을 수 있는 날이 올 수 있다고 믿는다.

 

2018년도 회고록을 너무 늦게 작성한 감은 있지만, 어쨌든 이렇게 작성하고 나니 마음은 한결 편해졌다. 2019 회고록은 꼭 2019년이 가기 전에 작성할 수 있도록 해야겠다.

'Blog' 카테고리의 다른 글

게임 서버 프로그래머의 2022년 회고  (9) 2022.12.31
7년차 게임 서버 프로그래머의 2021년 회고  (13) 2022.01.29
블로그 시작  (0) 2018.04.23
댓글