"여러 언어/분야들을 많이 파보는게 좋을까요, 하나를 깊히 파보는게 좋을까요?" 와 같은 질문을 많이 받습니다.
사실 두 경우 다 잘하는 사람을 봤고, 사람들은 다양한 종류로 잘하기 때문에 여기에 답은 없습니다. 다만 하나 확실한 것은, 겁나 많이 해야 한다는 것입니다. 제 사례를 공유합니다.
===
참고로 제 시대에는 게임 프로그래머가 제일 잘나갔습니다. 주로 쓰는 언어는 C++이었습니다.
1.
저는 무식하게 C언어 책을 7번 봤습니다. 중학교 3학년 때 였는데, 그냥 거기 있는 코드를 7번 정도 다 따라쳤습니다. 이러고 나니 프로그래밍 언어 책을 보는게 무섭지 않고, IDE를 얼추 잘 쓰게 되었습니다.
2.
고등학교에 입학했습니다. 게임을 만들려면 C++을 해야 한답니다. 그래서 C++ 책을 보고 역시 또 겁나 따라 쳤습니다. (정리해 놓은 것을 보니 C++ 책만 30권은 봤더군요) 하지만 이렇게만 하면 재미도 없고, C++도 너무 방대하다 보니, 게임을 만들기 위해 DirectX (그래픽 카드 드라이버 API) 를 공부했습니다.
솔직히, 그 시점에는 이론에 대해 전혀 이해 못했습니다. 그냥 DirectX에 있는 코드를 그대로 따라 치는걸 많이 했고, 손에 익었습니다. 그냥 IDE에서 빈 프로젝트 만들고, main.cpp 라는 빈 파일을 만든 후에 어떤 자료에도 의지하지 않고 int main() 부터 시작해서 윈도우 창을 띄우고, DirectX context를 만든 뒤, RGB 그라데이션이 되는 삼각형을 띄울 수 있었습니다.
느끼시겠지만, 비효율의 극치입니다. 구글링도 안하고, 이해도 안하고, 그냥 예제랑 책만 따라쳐서 외워버린거니까요. 하지만 전 이 과정에서 배운게 너무나 많습니다.
1) 코딩이라는 행위에 너무나 익숙해 졌습니다. 대부분 공부를 할 때 완벽히 이해하는 것을 처음에 목표로 하는데, 프로그래밍은 그냥 생활이 되고 익숙해 져야 잘합니다. 다른 방법이 없습니다.
2) 템플릿에 의존하지 않다보니, 코드 한줄 한줄에 의문을 품으며 코딩을 했습니다. 한줄이 빠지면 화면이 검은색으로 나오거나 segmentation fault 를 일으키며 프로그램이 터지는데, 다시 책을 읽고, 코드 한줄의 의미를 최대한 이해해 보려 노력했습니다. 이때 제대로 공부하는 방법을 배울 수 있었던 것 같습니다.
이때 궁금한게 많이 생겼습니다. 왜 Texture (쉽게 말하면 이미지 파일) 를 GPU에 보내려면 Lock을 걸어야 하는지, 왜 DirectX context는 delete 문법이 아니라 해당 객체의 Release() method를 통해 메모리를 해제 해야 하는지 등등…
이 중에는 그 시점에 해결 된 것도 있고, 나중에서야 당연하게 받아들이게 된 것도 있었습니다. 포인트는, 외울 정도로 코딩을 많이 하고 책을 많이 봤다는 겁니다.
3. 이제 게임을 만들어야 합니다. 그냥 DirectX로 게임을 만들었습니다. (사실 저만 그런게 아니라 선배들이 다 그렇게 했습니다)
정말 참고할게 없어서, 어렵게 구한 오픈소스 게임 엔진을 컴파일 하고, 거기에 있는 코드들을 분석했습니다.
처음 보는 게임 엔진의 소스코드는, 내가 알던 C++이 아니었습니다. 너무 복잡하고, 상속 관계를 왜 이렇게 했는지도 모르겠고, 어떻게 Interface와 구현체를 분리하는지도 모르겠고…
그래서 그때도 무식하고 소스코드를 분석하고, 다른 한편에서는 제 게임 엔진을 DirectX를 갖고 해당 게임 엔진을 모방해서 만들어 보았습니다.
아주 간단한 기능도 만들기 힘들었지만, 얼추 기대한 틀이 나오자 OOP에 대해서 아주 잘 이해하게 됐습니다. 어떤 때 추상화를 해야하고, 다형성이 왜 좋고, loose coupling 을 하면 새로 코드 추가할 때 고려해야 하는 사항이 적어지는지… 이론으로 배우면 그냥 좋은 말 좋은 말이었지만, 실제로 겪으면 크게 와닿았습니다.
4. 게임엔진을 만들고, 친구들과 협업해서 게임을 만들었습니다.
재밌기도 하고, 정말 많이 성장했습니다. 엔진에서 의도한 것이 오버엔지니어링이라 오히려 코드가 복잡해지고, 알 수 없는 버그들이 많이 터졌습니다. 버그를 잡으면서 제 엔진을 고치고, 가끔은 귀찮으니까 대충 땜질만 하고…
결국 완성을 해서 공모전에 냈습니다. 이렇게 해본 경험이 저에게는 큰 자산이 되었습니다.
5. 대학에 입학했습니다.
저는 대학에서 배울게 없을 줄 알았습니다. 웬걸, 대학 들어오기 전에 프로그래밍을 4년을 열심히 했는데, 대학에서 제가 잘하는 과목은 총 140학점 중에 6-9학점 정도였습니다. 모르는게 너무 많더군요.
특히 프로그래밍을 배운 상태에서 듣는 C언어 수업은 쇼킹 했습니다. (그 전까지 배워 본 적이 없으니…) int 형을 표현하기 위해 내부에서는 MSB를 sign bit로, 그 외를 이진수로 담는구나, float 형은 sign, exponent, mantissa로 분리되어서 표현되는구나, 그래서 int가 float보다 처리하기 더 쉽겠다, 등등…
그때 제가 느낀건, 프로그래밍을 겁나 해보지 않은 사람이 대학 수업을 들으면 이해가 하나도 안갈 것 같다는 생각이었습니다. 실제로 많은 친구들이 프로그래밍을 포기하거나 전과를 했고 (그땐 컴공이 비인기 학과였습니다) 남은 친구들도 학점을 잘 받는 것에 바쁘지 프로그래밍 그 자첸는 많이 안했던 것 같습니다.
저는 학점은 좋지 않았지만, 대학 수업을 너무 재밌게 들었습니다. 운영체제와 컴퓨터구조를 들으면서 엔진을 만들면서 궁금했던 것들이 많이 풀렸고, 컴퓨터 그래픽스를 들으면서 이해를 못하고 쓰던 DirectX를 이해하게 됐습니다. 수학 과목들을 들으면서 저거 게임 만들 때는 이렇게 쓰던건데, 하던 생각이 들기도 하구요.
6. 하고 싶은 말
제 얘길 하다보니 두서가 없었지만, 결론은 명확합니다. “겁나 코딩을 많이 하셔야” 기술력을 쌓을 수 있습니다. 저는 머리가 좋은 편도 아니고, 이해가 빠른 것도 아니지만, 진짜 많이 했기 때문에 CS 과목들을 들으면서 이해가 쉽고 공감이 갔던 부분이 많았습니다.
그리고 꼭 저수준의 프로그래밍을 해보셔야 합니다. 예를 들어, Java & Spring을 하고 계시다면 Java만 가지고 HTTP 서버를 짜보고, DB 대신에 간단한 key-value store를 짜본 후 게시판 CRUD를 하기 위한 서버를 만들어 보세요. 웹 프론트엔드를 지향하신다면 React.js 를 쓰지 말고 바닐라 js 를 갖고 React.js 처럼 동작할 수 있게 짜보세요.
모든 공학이 그렇지만 이론은 쉽고 실제는 겁나 어렵습니다. 특히 CS는 추상화의 학문이기 때문에, 윗단에서만 코딩을 하다보면 무조건 한계가 올 뿐더러 공부해야 하는 양이 너무 많습니다. 아랫단을 잘 이해하고 있으면 윗단에 추가되는 것이 왜 추가 되는 것인지를 더 잘 이해하게 되실 것이라 확신합니다.
잔소리가 길었네요. 도움이 되길 바랍니다.