2023 회고록 - 프로카데미 반을 지나며

Kim Ju Young·2024년 1월 14일
0

회고록

목록 보기
13/13
post-thumbnail

시작하며

2023년은 나에게 어떤 의미를 가진 해였을까? 직장에서 1년 반을 훌쩍 지나버린 지금, 다니던 학원도 절반이 지나갔다. 그동안 C++로 이루어진 멀티스레드 서버를 잘 이해하기 위해 인터넷 강의도 들어보았다. 그리고 알고리즘이나 CS 관련 지식도 늘리기 위해 책이나 인터넷도 훑어보면서 실력을 늘리기 위해 살았다. 하지만 이렇게 조금이라도 배우고 나니 배워야 할 것들이 태산처럼 보이기 시작했다. 그래도 조금이라도 효율적인 서버를 만들기 위해 필요한 배움들이니 지식의 산을 차근차근 등정하고 있다.

  • 알고리즘
    DP는 아무리 풀어도 볼 때마다 새롭고 A* 알고리즘, 컨테이너등을 떼고 나니 다행히 DFS/BFS 등은 풀기 쉬워졌다.

  • 네트워크
    1% 네트워크 책과 소켓 책을 통해 TCP/UDP 소켓의 전반적인 내용은 대부분 파악할 수 있었다.

  • OS
    공룡책을 읽으며 내용들을 정리하고 있다.

어느새 신년 1월달이 되었으니 여유로운 주말에 작년 일들과 지금의 나를 다시금 생각한다.

게임 서버 일을 수행한 프로그래머

2023년 1월, 다니던 회사에서 게임 서버 컨텐츠 작업을 처음으로 시작했었다. 이 당시엔 우리 서버가 C++ 로 구현된 서버인지만 알았지 RPC (Remote Procedure Call)로 이루어진 서버인지도 몰랐다. 그 당시 C++도 C에 대한 기본 지식(Ex. 포인터, 구조체 등)과 객체 지향만 잘 알고 있었지만 Modern C++ 등을 Inflearn - Rookiss, Codenuri - C++ 20 등의 인터넷 강의라도 들으며 급하게 학습하고 있었다.

Github에 여러 흔적(첫번째, 두번째, 세번째)을 남기며 공부했지만 분명 부족한 면이 있었다고 생각한다. 지금 회사엔 서버 개발자로 취업했지만 C#등의 웹 운영툴이나 통계툴을 주로 맡겼었는데 컨텐츠 작업을 하게 되었던 건 이유는 회사 사정 때문이었다.

2022년 7월에 게임을 오픈하기로 했었지만 2023년 4월 출시 예정으로 밀리면서 늦춰진만큼 손님 맞이를 위한 컨텐츠 작업이 추가되어야 했다. 그런데 원래 평소에 컨텐츠 작업을 맡던 시니어 분이 모두 맡기엔 너무 많은 양이었다. 그래서 해당 서버 일을 나누게 되었고 내게 컨텐츠 작업 일부가 맡겨졌다.

좋은 기회라고 생각하고 열심히 하였다. 클라-서버 사이 패킷이라던가 DB에 영향을 끼치는 프로시저를 만드는 부분은 생각보다 자동화가 잘 되어 있었고 툴을 통해 작업하니 노가다 작업은 적었다. 그러다보니 컨텐츠 로직에 좀 더 집중했고 강의에서 배운 컨테이너라던지 auto, move 등을 사용하고 기존 소스를 보며 개발하였다.

만드는 과정 속 실수도 있었지만 결국 컨텐츠가 잘 돌아갈 때 느낀 성취감이 꽤 컸었다. 자동화 쪽은 배치 파일이라던지 액셀을 통해 관리하고 있었는데 이런 자동화는 예전 회사보다도 훨씬 잘 되어 있어서 편했다. CI/CD 나 개발 환경도 Jenkins, T-SQL등을 사용하면 빌드 및 로컬 DB셋팅은 매우 빠르게 가능했다.

그런 면을 내가 직접 만들어보려는 노력도 했었고 이는 당연 Github에 있다. 또 이런 경험은 나중에 자체적으로 로그에서 통계를 뽑아낼 때 일일마다 자동화하는데 도움이 되었다.

강의를 들었지만 부족한 면을 느끼다

앞에서 말한 C++ 강의를 듣다가 뽕에 찼었던 기억이 난다. Modern C++ 이 얼마나 대단한가. auto, 람다, move symantics, 매개 변수 template 은 C++ 이라면 포인터만 알면 되는거 아닌가라고 생각한 내게 매우 신비한 지식이었다. 이 때는 남들은 모르는 지식을 배운듯한 느낌을 받았다. 햇병아리였지만 블로그를 보면 그 때 놀라운 지식을 배운마냥 글을 쓰던 흔적도 있다.

아래는 같이 컴퓨터공학 배웠던 친구에게 카톡으로도 보낸 내용.

그런데, 그게 다였다. 강의에서 배운 게임 서버 내용을 응용해서 만들려고 해도 만들어지지 않았다. 그 때 참담한 느낌을 받았다. 분명, 강의에서 배운 내용이나 지식들을 시간을 멈춰가며 세세하게 보았고 이해하려 시간을 많이 썼다. 그런데 지금 와서 생각해보면 그 동안 언어나 RPC, 웹은 좀 알았을지 몰라도 네트워크, 스레드도 정확히 잘 파악하지 못하고 강의를 통해 훑어만 봤었다. 그러면서 어떻게 짜려고 했었던 것일까. 강의자는 탄탄한 지식을 바탕으로 그 모든 것을 녹여내 강의 중 술술 만든 점이 중요한 점이었다. 초심자가 그런 것들을 응용해서 자신만의 것을 못 만드는 건 당연했다.

이미 대학마저 졸업해버린 지금 나는 어디가서 기초 지식을 배워야 했을까? 책도 다시 펼쳐보고 스스로 그 깨달음들을 배울 수도 있었을 것이다. 하지만, 대학에서도 주요 학과 수업 중 OS나 알고리즘을 잘 이해하지 못 했고 받아 적었던 기억이 났다. 노트 필기를 했는데도 잘 파악하지 못하던 과거의 내가 떠올랐다.

자신있게 책을 읽고 본인이 공부하면 된다. 다만, 조금 두려웠달까? 게임 업계로 올 때, 게임 서버로서 성장하며 일을 하려고 온건데 알아야할 지식을 위해 몇 년을 더 공부해야 할까? 본질은 모른 채 겉핥기만 하는 코더로 성장하는 것이 아닐까? 생각이 들었다.

그러던 중 취업하기 전인 2022년 일이 생각이 났다.

2022년 방황하던 날

그 때는 지금처럼 게임 쪽에 오기 전이었다. 제조업 회사의 웹서버로서 누구나가 배울 수 있는 지식을 배우는 게 아닌가 싶은 불안하던 느낌을 가지고 있었다. 이 때 불안하던 마음을 감추고자 숨고를 통해 연차가 많으신 개발자와 컨택이 되어 컨설팅을 받기도 했다. 컨설팅을 받고 스터디를 진행하던 중 그 분과 중견 게임사에서 근무하시는 분과 만남 가질 기회가 왔다. 그 분은 C++ 서버를 구하는 중이었다.

그 분은 내가 컨테이너나 웹서버쪽 구조를 잘 아실테니 게임서버 C++도 잘 맞으실 거라고 이야기 했다. 하지만 내 경력 자체는 C#과 자바쪽에 가까운 걸 확인하시곤 C++ 서버는 포인터나 템플릿등을 사용하다보니 어려우실 수도 있다 말씀하셨고 프로카데미라는 학원을 다녀보면 어떻겠냐고 제안하셨었다.

학원 자체는 1년 씩이나 되는 과정이었기 때문에 1년 농사와 가까웠다. 다행히(?) 그 당시 지원했던 회사 중 현재 다니는 회사를 들어가게 되어 프로카데미를 다니지 못했었다.

하지만 또 직장을 다니며 계속 인강을 듣던 중 인프런 강의자인 Rookiss도 프로카데미를 추천했다. 강의자 자신도 회사를 다니며 학원에 다녔었다고 했다. 그래도 계속 직장에 다니며 2022년 7월 달이 되었을 때, 1년 다녔으니 회사 일도 익숙해진 상태가 찾아왔다. 그 때 프로카데미를 다니고 싶다는 강렬한 열망이 다시금 찾아왔다.

작년 7월달부터 시작하는 과정이 12:30 ~ 14:30 이었는데 이 글에서 말했듯이 회사에서 허락해줘서 다닐 수 있게 되었었다.

프로카데미를 다니기 시작하다

2023년 7월, 프로카데미를 다닐 수 있는 기회를 얻었다. C++ MMORPG 서버를 전문으로 하는 학원이다. 학원은 난관으로 가득했다. 지금 생각해보면 포인터도 개념이 약하게 잡혀있었는데 원장 선생님의 날카로운 질문에 지식적으로 벌개벗고 다닌다는 느낌을 받았다. 학원은 3개월마다 테스트를 봤는데 언제든지 내쫓길 수 있다는 불안감과 함께 직장을 다니며 학원을 병행하는 건 쉬운 일이 아니었다.

학원은 3개월마다 코스라고 부르는데 1코스 당시 회사 게임이 오픈한지 좀 되어 유저들의 플레이타임이 쌓였다. 그러다보니 다양한 지표를 필요로 하고 있었다. 그 필요성에 맞추어 겜서버에서 남기는 로그를 정리하여 해당 지표를 추론해냈다. 그 후, 웹서버를 통해 비주얼적으로 보여주었다. 그래서 이 때 PD님과 자주 이야기를 하며 DAU, MAU, 조기 이탈 유저같은 사업 용어도 알게 되었다. 이런 지표들을 매일매일 CSV나 프로그램으로 표현해야하니 필수적으로 작업 스케줄러와 배치파일을 이용할 수 밖에 없었다. 윈도우에선 스케줄러를 통해 매일 자동으로 프로그램을 실행시킬 수 있다.

이 시기 학원에선 어셈블리를 볼 수 있는 Visual Studio 기능을 활용하여 esp, ebp등 범용 레지스터들이 활용이 어떻게 되는지 배우고 있었고 VirtualAlloc 을 통한 메모리 속성이 지정되는 지식까지 배우고 있었다.


마침 우리가 배운 교재인 윈도우 시스템 프로그래밍 책에서 발췌한 이미지가 있어 가져왔다.

malloc 도 잘 안 쓰는 지금 무슨 뚱딴지같은 지식을 배우나 심드렁한 상태였지만 꾸역꾸역 배워뒀다. 바쁜 틈에도 다른 학원생은 어떨까 확인도 할 겸 약속도 잡고 만나 이야기를 나누자 학원생들은 주말에도 공부하러 나간다고 하였다. 그 말에 자극받아 학원에서 만들라는 프로그램을 주말에도 학원에 나가 더 열심히 만들기 시작했다.

그렇게 3개월이 지나 1코스가 끝났을 즈음, 겨우 테스트를 통과하였고 네트워크를 배우기 시작했다. 배우다보니 느낀 건 TCP, UDP 차이같은 건 좀 안다고 생각했지만 소켓을 들어가는 순간 내가 배운 것들이 새하얘지는 느낌이었다. 그저 대학교 실습 시간에 잠깐 실습해본 도화지같은 나에게 원장님의 가르침과 1% 네트워크 원리 책은 내게 큰 도움이 되었다.

그리고 꽤 충격을 받은 일이 있었는데 이진 트리를 통해 구현 중 삽입은 정상적으로 O(logn)이 나올 수 있도록 구현하였지만, 삭제, 찾기 구현 중 지금까지 내가 중위 순회로 구현을 했었다(...) 말도 안되는 내용이 맞다. 하지만, 실습을 별로 안하니까 이걸 발견할 일도 없는게 소름이 돋았다. 이 이후로 정말 왠만한 지식으로만 가지고 있던 자료구조나 알고리즘들을 직접 구현하고 정말 시간복잡도 대로 나오는지 검증하기 위해 노력했었다.

L7 버퍼로 쓸 원형큐, 연습 차원에서 한 레드-블랙 트리까지 구현하고 나니 트리에 대해서도 꽤 자신감을 얻을 수 있었다.

길찾기 알고리즘도 배우다보니 A* 알고리즘같은 기본에서부터 JPS 등 최신 알고리즘도 알 수 있어 WIN API 로 비주얼적으로 구현해보기도 했다.

내가 쓴 해당 링크

앞으로도 실습으로 꽤 많은 양의 네트워크 부담을 질 예정인데 얼마나 잘 터질지 기대가 된다.

언어 기본, 자료구조, OS를 이렇게 몰랐었나?

최근 들어 대학 3학년 때 이후로 먼지만 쌓여있던 공룡책을 다시 꺼냈다. 그 이유는 CPU 페이지 폴트나 인터럽트를 배웠는데 더 잘 이해를 하고 싶었다.

그랬더니 공룡책을 펼치자마자 인터럽트에 대한 설명이 주욱 나와있었다. 새삼 원장 선생님이 공룡책도 많이 읽으셨는지 인용구도 꽤 발견할 수 있었다. 스레드도 배우는데 OS가 필수적이고 네트워크는 랜 어댑터를 사용하다보니 드라이버가 사용하는 인터럽트 구조에 대해서도 이해하는 것이 문제 해결 능력에 꽤 도움을 줄 수 있다고 느껴졌다.

ROTC 를 하며 학과 수업을 좀 몇 개 빼먹은 탓일까 재직자인데도 불구하고 지식이 없다보니 학원에서 지식적으로 얻어맞아 많이 힘든 적이 있었다. 게임 기획자같다는 말을 들어가며 열심히 하고 있다는 말이 목구멍까지 올라온 적도 있었지만 원장 선생님의 실력이 뛰어나다보니 하고 싶은 말을 삼켜가며 열심히 배웠다.

CS를 배우고 배우다보면 CS지식이 새삼 얼마나 중요한지 느끼게 된다. 모른채 프로그래밍을 한 내 자신이 바보같이 느껴질 때도 있지만 누구나가 그런 경험을 할 것이고 앞으로도 얼마나 그런 감정을 느낄지 잘 모르겠다. 이제는 3코스에 진입하였는데 3개월간 스레드를 꾸준히 배울 예정이다. 마지막까지 깔끔하게 마치고 나만의 게임서버를 작성할 예정이다.

마치며

결혼 생활의 경우 서로를 좀 더 잘 알게 되는 기회가 많아진다 하더라도 서로에 익숙해지고 난 뒤에 오히려 경멸감이 늘지도 모르는 일이다.

세익스피어가 한 말이라고 한다. 컴퓨터와 더욱 더 친해지게 된 한 해였지만 실력적으로 많이 늘었는지는 금년에 결정이 될 듯 하다. 컴퓨터가 내게 경멸감을 느끼지 않게, 한 치 후회도 없게 앞으로도 공부할 생각이다.

profile
호호선생

4개의 댓글

comment-user-thumbnail
7일 전

혹시 프로카데미 코스 테스트는 어떤 테스트를 보나요?

1개의 답글