Post

42Seoul 회고

안녕하세요, 남파카입니다.

드디어 오늘, 1년 6개월 동안의 42Seoul 여정을 마무리 했습니다.
이 기간 동안 대부분의 시간을 42Seoul에서 보냈고, 정말 많은 걸 배울 수 있었어요.

지금 기분이 마치 군대 전역 후 사회 생활 시작하는 것과 같아요.
프로그래밍 튜토리얼이 끝나고 이제 정말 프로그래밍 여정을 시작하는 느낌이에요.

오늘은 42Seoul에 대한 회고를 해보도록 하겠습니다!


42Seoul 지원

저는 처음부터 프로그래밍을 배우기 위한 이유가 확실하게 있었어요.
게임을 만들고 싶었거든요.
물론, 지금도 변하지 않았습니다.
최대한 많은 사람들에게 잊지 못할 게임을 만드는 것이 저의 목표이자 꿈이에요.

처음에 게임 프로그래밍을 위해 C언어 공부를 하다가, 42Seoul을 처음 알게 되었어요.
컴퓨터 공학 지식을 자기주도방식의 PBL(Project Based Learning)로 학습한다는 42의 학습 방식이 맘에 들어서 지원을 하게 되었습니다.

42Seoul은 프랑스에 있는 Ecole 42의 과정을 그대로 가져온, Ecole 42의 한국 캠퍼스라고도 볼 수 있어요.
Ecole 42는 2022년 기준으로 세계 혁신 대학 순위 8위로 인정받은 곳이기도 해서, 더더욱 가고 싶었어요.

또한, 42는 동료 학습(Peer-To-Peer Learning)을 강조했기 때문에, 좋은 동료를 만날 수 있을 것이라는 기대도 있었습니다.
지금까지 학교나 회사에서 같은 목표를 가지고 같이 성장해나가는 Win-Win 관계의 동료를 한 번도 만난 적이 없었습니다.
대부분 말만 하고 실천을 하지 않거나, 취업 자체가 목표였거나, 현재 상황에 안주하는 사람들 밖에 없었어요.

그래서 42에는 제가 원하는 동료가 있을까 하는 기대심도 가지고 지원을 하게 되었어요.


라피신 과정

42Seoul 합격을 위해 한 달 동안 라피신이라는 과정을 거쳐야 했습니다.

라피신은 프로그래밍이 처음이라면 꽤 어려운 과제들을 최대한 많이 풀어냈어야 했습니다.
한 달 동안 자신이 풀 수 있는 만큼 최대한 많이 과제들을 풀어야 했어요.
과제는 무조건 다른 동료에게 평가를 받아서 통과를 할 수 있었어요.
42에서 강조하는 동료 학습 방식이었습니다.

동료 학습을 진행하면, 평가를 하러 온 동료에게 제가 완료한 과제에 대해 모든 것을 이해할 수 있도록 설명해야 했어요.
저는 이 과정이 정말 좋다고 느꼈는데, 제가 설명을 올바르게 하려면 과제를 완전하게 이해를 하고 있어야 했기 때문에, 학습을 하는데 엄청 도움이 되었어요.
그리고 평가자에게 이해할 수 있도록 설명을 해야해서, 설명과 함께 제 자신도 복습이 같이 되었어요.
다른 사람에게 설명을 하면서 장기 기억에도 더 잘 남더라구요.

그리고 일주일마다 팀 과제가 있었어요.
저는 개인 과제도 정말 벅찼는데, 팀 과제까지 해야되니까 더 막막했었어요.
혹시 팀에 민폐끼치는게 아닐까 싶었거든요.
그래도 팀 과제를 하면서 다른 팀원들의 코딩 스타일과 노하우를 알 수 있었고, 그것들이 오히려 더 도움이 되었습니다.
또한, 팀 과제는 이미 42Seoul에 합격한 분들이 평가를 해주셨기 때문에, 동료 평가를 받으면서 고수 분들의 조언도 얻을 수 있었어요.

빡세게 라피신을 했더니 이게 웬걸! 10kg이 빠져있었습니다! (85kg -> 75kg)
이전 회사에서 회식으로 찌운 살들이 다 빠져서 너무 좋았습니다!!

결과적으로 라피신을 통해 얻은 점들을 나열해보자면

1
2
3
1. 내가 프로그래밍을 정말 좋아하는지 알 수 있었다.  
2. 누군가에게 설명하는 것은 어렵지만 효과적인 학습 방식이라는 것을 알 수 있었다.  
3. 살이 빠졌다. (무려 10kg!)

본과정

저는 다른 동료들보다 성적이 낮은 편이었기 때문에, 합격을 예상하고 있지는 않았습니다. (첫 시험도 0점 받음..)
2022년 10월 어느 날, 라피신 때 알게된 스승님으로부터 42 합격 결과 이메일이 도착했다고 연락이 와서 확인했더니, 합격이 되었습니다!
운 좋게 42에 합격을 하고, 본과정을 진행하게 되었습니다.

사실, 저는 불합격을 염두해두고 있어서 이미 다른 공부를 진행하고 있었어요.
게임 프로그래밍 공부를 쭉 하고 있었는데, 42에 합격을 하게 되어서 두 과정을 병행하게 됐어요.
그런데, 두 과정을 병행하기에는 절대적인 시간이 모자랐고, 둘 중 하나는 포기해야 했습니다.

두 마리 토끼를 잡으려다 둘 다 놓친다.

라는 문구를 제가 직접 경험 중이었거든요.

위 문구는 원씽(The ONE Thing) 이라는 책을 펼쳤을 때, 맨 처음 나오는 문구입니다.
42 합격 전에 어떻게 공부를 해나갈지 고민하다가 읽게된 책이에요.
원씽을 요약하면, 현재 내가 해야할 가장 중요한 일 한가지에만 집중하라는 내용이에요.
저는 42가 현재 저에게 가장 중요한 일이라고 생각하고 선택하게 되었어요.

스터디 활동

42 첫 과제부터 스터디 모임을 만들어서 동료들과 같이 과제를 해결했어요.
저는 처음 만난 동료들과 계속 같이 하지 않고, 과제마다 새로운 사람들과 스터디 모임을 만들어서 진행을 했어요.
많은 사람들을 만나보고 싶었고, 경험해보고 싶었어요.

스터디에서도 중요한건 결국 제대로된 지식 교류였고, 동료 학습과 다르지 않다고 느꼈어요.

이때 만났던 분들과는 계속 좋은 관계를 유지하면서 지냈고, 몇몇 분과는 이후 팀 과제에서 같이 팀을 하기도 했어요.

진정한 동료를 만나다

2022년 12월 27일, 해가 저물어가는 시각 17:45분, 저는 어떤 분의 과제를 평가해주러 갔어요.
평가가 끝나고 대화를 나누는 중에, 이분께서도 게임 쪽을 목표로 하고 계시다는 얘기를 듣게 되었어요.
저와 같이 게임 프로그래밍을 목표로 하는 분을 처음 만나서, 이후 얘기를 더 하게 되었고, 친분을 쌓을 수 있었습니다.
이후 과제들을 진행할 때에도, J 님이 가끔 직접 오셔서 팁도 알려주시며 점점 더 친분을 쌓게 되었습니다.

이 인연을 통해 J 님을 만날 수 있게 되었고, J 님은 저와 같이 42 여정을 끝까지 함께하는 파트너가 됩니다.

첫 번째 벽

42에서의 첫 번째 벽은, 첫 번째 팀 과제였어요.
두 명이서 완료해야하는 bash 쉘을 만드는 과제였어요.
J 님과 같이 과제를 하게 되었고, 저희는 와인을 좋아해서 Whine 쉘 이라고 이름을 붙였습니다.

이 과제에서 벽이라고 느꼈던 곳은, 사용자가 입력한 Command Line을 파싱하는 부분이었어요.
컴파일러가 사용하는 방식 중 하나인 LL Parsing 기법을 사용하면 된다는 조언을 들었는데, 저에게는 너무 어려웠어요.
그래서 저는 bash 쉘의 공식 홈페이지를 참고해서, bash가 어떤 순서로 파싱하는지 파악 후 저만의 로직을 구현했습니다.

파싱 후 명령어 실행 부분은, 이전 과제에서 잘 만들어 뒀기 때문에 어렵지 않게 끝낼 수 있었어요.

우여곡절 끝에 저희 Whine 쉘을 완성할 수 있게 되었습니다.

과제를 마치고, J 님과 함께 뒷풀이로 와인과 고기를 먹은게 아직도 기억에 남아요.
2차로 LP바에 가서 갓파더라는 칵테일도 먹어봤는데, 제 스타일이었어요.
LP바에서 신청곡을 고를 때도 음악 취향이 맞아서 신기했고, 신청곡 중 하나였던 Led zeppelin - Stairway to heaven이 너무 기억에 남아서, 집에가서 기타로 친 기억이 납니다.

이렇게 첫 번째 벽을 기분좋게 뚫었고, 뭐든 만들 수 있다는 자신감을 얻게 되었어요.

Whine Shell 시연 동영상

두 번째 벽

두 번째 벽은, Ray Tracing을 C언어로 만드는 팀 과제였어요.
이 과제는 J 님이 아닌, 이전 스터디에서 알게된 G 님과 같이 하게 되었습니다.

Ray Tracing 공부를 위해, Ray Tracing in one weekend를 보면서 공부를 하는데..
벡터, 삼각함수와 같은 수학 지식이 없었고, 영어를 잘 못했었던 저는 엄청난 벽을 만나게 됩니다.

그래도 포기하지 않고 차근차근 하나씩 이해하면서 공부를 했고, Ray Tracing in one weekend를 다 끝내고보니 한 달이 지났더라구요..
제목은 주말에 끝내는 Ray Tracing 이라고 되어있는데, 저에게는 한 달이 필요했던거죠..
그만큼 기초 지식이 중요하다는 것을 깨닫게 되었습니다.

그 후, 코드로 구현하는데에 한 달이 또 걸렸습니다.
뿐만 아니라, 원기둥, 평면, 원뿔과 같은 오브젝트들도 과제의 요구사항이었기 때문에, 해당 오브젝트들의 방정식에 대한 계산을 알아내야 했어서 시간이 꽤 걸렸습니다.

수학 공식이나 계산식을 코드로 옮기는 과정은 생각보다 어렵지 않았습니다.
일반적인 프로그래머라면 주어지는 수학 계산식을 코드로 옮기기만 하면 되겠지만, 뛰어난 프로그래머는 수학 계산식을 직접 구하고 이해한 뒤 코드로 옮기지 않을까? 하는 생각도 들었습니다.
문제가 생겼을 때, 이해를 하고 있어야 고칠 수 있다고 생각하거든요.
실제로 G 님과 디버깅할 때, 코드보다는 수학적인 계산이 맞는지를 더 많이 확인했었어요.

과제에서 요구하는 조명 계산 방식은 Phong Reflection 방식이어서, Ray Tracing in one weekend에서 소개하는 조명 계산 방식과는 달랐지만, 저희 팀은 추가 기능으로 두 조명 방식을 선택할 수 있도록 만들었습니다.
또한, CPU를 사용해서 렌더링 시간이 너무 느렸기 때문에, 멀티스레딩도 추가했습니다.
openCL을 사용해서 GPU를 사용하려고 했는데, 코드 구조를 openCL에 맞게 완전 바꿔야 해서 진행하지는 않았어요.

저에겐 두 번째 벽이 정말 높은 벽이었고, 그 만큼 벽을 깰 때 성취감이 가장 컸던 벽이었습니다.
두 번째 벽을 깨면서 그래픽스 쪽에 흥미가 더 생기게 되었고, 42가 끝나면 꼭 제대로 그래픽스를 공부해서 GPU를 사용하는 Ray Tracing 프로그램을 다시 만들고 싶다는 목표가 생겼어요.

같은 팀이었던 G 님께서는, 이 과제를 마치시고 그래픽스와 AI를 접목한 기술을 연구하는 대학원으로 진학을 하셨어요.
대학원 면접에서 이 과제를 좋게 봐주셨다고 해요.
역시 노력한만큼 보상을 받는다는 것을 느낄 수 있었습니다.

Ray Tracing 시연 동영상


마무리

높았던 벽들을 무너뜨리고, 마지막 과제를 완료하면서 42 여정을 끝내게 되었어요.
마지막으로 42에서 깨달은 점과 앞으로의 계획을 말씀드리고 마무리 하겠습니다.

스터디 모임은 필요한가

대부분의 과제를 스터디 모임을 만들어, 스터디 장으로써 진행했어요.
많은 사람들을 겪어보면서 느낀 점들을 말씀드릴게요.

제가 생각하는 스터디 모임이란, 각자 공부한 내용이 객관적으로 올바른 내용인지 확인하는 수단 이라고 생각해요.
각자의 방식으로 이해한 내용들을 공유하면서, 무엇이 가장 이론적으로, 객관적으로 올바른 정보인지를 파악하는거죠.
공부는 어차피 각자 하는 것이기 때문에, 스터디 모임은 공부한 내용이 올바른지 확인하는 수단으로 충분하다고 생각해요.

그래서! 스터디 모임은 필요한가?에 대한 답을 하자면, 내가 공부한 내용이 올바른지 잘 확인할 수 있으면 그 사람에겐 필요가 없고, 반대라면 필요하다고 생각합니다.

후자의 사람들이 스터디를 잘 활용하면 전자의 사람으로 변하고, 결국 혼자서도 잘 하게 되더라구요.
동료 학습의 동료가 자기 자신이 되는거죠.

어떤 동료를 만나야 하는가

아까 진정한 동료라고 얘기했던 J 님을 예시로 들겠습니다.
J 님과 저는 뛰어난 게임 프로그래머라는 동일한 목표를 가지고 있어요.
목표가 같기 때문에, 하고 싶은 것잘 하고 싶은 것도 비슷하거나 동일할 수 밖에 없어요.
예를 들면

1
2
3
4
1. "C++" 고수가 되고 싶다.  
2. 3D 게임이 실제로 어떻게 그려지는건지 "컴퓨터 그래픽스"에 대해 배우고 싶다.  
3. 실제 코드가 하드웨어에서 어떻게 동작하는지 궁금해서 "어셈블리어"를 배우고 싶다.  
4. 게임은 성능이 중요하니까, "자료구조, 알고리즘"을 잘 알아두고 싶다.  

위와 같은 것들이 있겠네요.

목표와 관심사가 겹치고, 같이 공부하면서 성장할 수 있는 J 님과 같은 동료를 만나는 것이 가장 좋다고 생각해요.
핵심은 같이 성장할 수 있는 동료를 만나자!

42에서 얻은 가장 중요한 한 가지

42에서 강조하는 것 중에 Learn how to learn이 있어요.
42에서 배우는 법을 배운다는 것이죠.

저는 이게 42에서 얻은 가장 중요한 거라고 생각해요.
어떤 분야에서든 적용이 가능하거든요.

42에서 진행하는 학습 방법인 동료 학습, PBL 방식의 학습, 자기주도적인 학습이 여기에 속한다고 생각해요.
각각 어떤 점을 배웠는지 서술해보면

1
2
3
4
5
6
7
8
9
10
11
1. 동료 학습  
  - 자신의 주장을 동료에게 설득시키는 방법.  
  - 주장, 이유, 근거를 통해 논리적으로 설득하기.  
  - 모르는 부분에 대해 질문하는 요령.  
  - 올바른 정보 학습.  
2. PBL 방식의 학습  
  - 프로젝트 요구 사항 분석.  
  - 문제 해결에 필요한 지식 습득.  
  - 실무 환경의 프로젝트 진행 방식.  
3. 자기주도적인 학습  
  - 수동적이 아닌, 능동적으로 학습하는 능력.

위와 같은 것들이 있습니다.

앞으로의 계획

42가 끝나고, 저는 항상 의문이었던 CPU 동작 방식을 공부하고 있어요.
프로그래밍을 할 때 메모리와의 관계는 이해했는데, 실제로 CPU가 메모리와 어떻게 통신하고 연산을 수행 하는지는 모르거든요.
그래서 CPU 동작 방식을 공부하면서 어셈블리어까지 같이 배우고 있어요.

이후에는 자료구조/알고리즘, 그래픽스, 언리얼 엔진으로 게임 만들기 순서로 공부를 진행하려고 해요.

제가 세키로의 모든 업적을 달성할만큼 세키로를 좋아하기 때문에, 세키로 모작을 하나 만드는게 최종 목표입니다.

앞으로는 공부하면서 배운 것들도 주기적으로 포스팅 하도록 하겠습니다!

긴 글 읽어 주셔서 감사합니다!