본문 바로가기
성장일기

42Seoul 마지막 공통과제를 앞두고 지난 1년간의 회고록

by egas 2021. 5. 14.

한 달간의 La Piscine을 통과하고 본과정의 inner circle을 진입한 지 어느덧 1년이 넘었다. 현재 inner circle의 마지막 프로젝트를 앞두고 있다. 작년에 42 Seoul를 알게 된 것처럼 개발 인생에서 중요한 분기점을 앞두고 그동안에 경험들을 정리하고자 회고록을 쓰려고 한다.

42 Seoul

42 Seoul에 오기 전 나는 자바스크립트에 관심이 많았다. 다양한 언어들의 장점들을 가져온 문법과 빠르게 발전하고 변화하는 생태계, 심지어는 VR에도 React가 쓰이는 것을 보며 발전하는 모든 언어 중 최전선에 있다고 생각했다. 이러한 생각들은 하나라도 신기술들을 많이 경험하는 것이 성장하는 길이라고 내 학습에 영향을 주었다. 그렇다 보니, 클론 코딩과 새로운 프레임워크, 라이브러리 사용 경험이 내 공부의 대부분을 차지했다.

 

하지만, 어느 순간 나는 성장에 대해 의문을 던지고 있었다. 무언가를 만들어도 새로운 것을 학습할 뿐이지 내가 성장한다는 느낌이 들지 않았다. 그때부터 미래에 존경받는 개발자 되려면 어떻게 돼야 할지 생각을 많이 하게 되었다. 자연스럽게 좋은 코드란 어떤 코드일까라는 생각을 항상 하게 되었다. 좋은 코드, 부끄럽지 않은 코드를 작성하기 위해 무엇을 해야 할지 막막했다. 어떤 키워드를 검색해야 할지도 떠오르지 않았다. 그런 시기에 42 Seoul을 접했고, 온라인 테스트, 체크인 미팅, 창의캠프를 걸쳐 La Piscine에 던져졌다.

La Piscine

한 달 동안 매일 하루 15시간 이상씩 밤을 새 가면서 La Piscine에 몰입했었다. 나에게 배움에 대한 태도, 문제를 생각하는 방식 등 많은 것들을 변화시킨 한 달이었다. 42는 친절하지 않았다. 첫날에는 들뜬 마음으로 클러스터에서 로그인을 했는데, 그다음에 무엇을 해야 하는지 알려주는 사람이 없어서 많이 당황스러웠다. 옆에 사람들 모두 모르는 상태였는데 나중에는 서로 물어보면서 알아갔었다. 또, 첫 시험에서 모니터 바탕화면만 안내를 받았는데 일정 시간 동안 시험을 시작하지 못한 사람들에 대해 안내방송으로 자리에서 일어나라고 했는데 나중에 모두 집에 갔다는 사실을 알게 되었다. 가장 충격적이었던 것은 시험을 보러 자리에 앉았는데 마우스가 안되면 시험을 못 보더라도 그것은 개인 운이라는 말을 듣고 적지 않게 많은 충격을 받았다. 주어지는 문제조차 어떻게 해야 할지 친절하지 않았고, 회신받는 오류 로그조차 불친절해서 무엇이 틀렸는지 명확하지 않을 때도 있었다. 하지만, 점차 시간이 지나갈수록 42에 융화되어가는 나 자신을 볼 수 있었다.

 

이러한 42 정신은 해결 방법을 스스로 선택하고 스스로 기회를 만들어 나갈 수 있게 만들어 주었다. 모르는 게 있으면 동료들에게 물어볼 수 있는 어색하지 않는 환경이 자연스럽게 형성되었다. 모르는게 있다면 처음 본 동료더라도 먼저 다가가서 물어볼 용기를 주었고, 모르는 동료가 와서 물어봐도 기꺼이 대답하는 열린 마음을 갖게 되었다. 명확하지 않은 기준들은 나에게 항상 실패할 수 있고, 자연스럽게 동료들과 의견을 나눠야 한다는 생각을 갖게 해 주었다. 내가 갖고 있는 지식이 항상 옳다고 장담할 수 없고, 상대방을 설득하지 못한다면 그 지식은 알고 있는 지식이 아니라는 사실을 깨닫게 될 때까지는 많은 시간이 걸리지 않았다. 상대방을 설득하면서 내 주장들의 기준을 정할 필요성이 있었는데, man 페이지를 기준으로 세우면서 그동안 무시해왔던 man 페이지를 제일 많이 본 기간이기도 하다. man 페이지에는 생각보다 많은 정확한 기준들을 선정하기에 적합한 정보들이 담겨있었다.

 

42에서 실패는 아무런 문제가 되지 않았다. 다음에 같은 실패를 반복하지 않기 위해 회고하고 행동하면 된다. 42는 이번에 실패하더라도 내가 부족한 지식, 모르고 있는 새로운 지식을 알려준 동료에게 고마운 마음을 갖게 만들어주었다. La Piscine 기간 동안에개발자로서의 태도, 스스로 새로운 지식들을 습득하는 방법, 상대방과 대화를 할 때의 말투, 태도, 생각하고 이야기하는 방법인 의사소통 능력을 배웠다. 

 

나는 웹 개발자가 되고 싶었고 당장에 부족한 Javascript 를 필수적으로 공부해야 했는데, 42 과정은 모든 언어가 C와 C++ 이였다. 하지만, 어떻게 보면 1 달이라는 짧은 La Piscine 기간을 보내면서 많은 것들을 배우고 경험했기 때문에 이다음 과정이 궁금했고, 42가 지향하는 이런 가치들이 미래의 나의 개발자 인생에서 필수 가치들이라고 생각했고, 굉장히 긍정적인 영향을 준다고 생각해서 조금 멀리 돌아가더라도 본과정에 꼭 가고 싶었다.

피시너 응원의글

42 born 2 code

무엇보다 학장님의 "차츰 같이 했던 우리 모두가 세상을 구하는 일에 발을 담그고 있다는 것을 알게 될 것입니다"라는 한 문장이 마음을 울렸다. 나도 그 일원으로 함께하고 싶었기에 너무 합격하고 싶었다. 그렇기에 합격을 했을 때 그 어느 때보다 가슴이 많이 벅차올랐다. 

 

합격했을 당시 4학년에 재학 중이었는데, 나중에 졸업에 문제가 없으려면 휴학을 하더라도 1학기를 남기고 휴학을 해야 할 것 같았다. 그래서 처음 6개월 동안은 4학년 1학기와 회사를 같이 병행했었는데 그러다 보니까 아무래도 42 본과정에 많이 소홀하게 되었다. 많은 고민 끝에 4학년 2학기를 남겨두고 휴학을 하고 다니던 회사도 그만두고 42 본과정에 올인했다.

 

42 born 2 code 과정을 진행하기에 앞서서 나는 몇 가지 목표를 정했다.

 

- 과정을 진행할 때 가장 최초로 만들어진 코드를 한 번 이상 보고 그렇게 작성된 이유와 그 코드의 장점들을 흡수하자.

- 다시 해당 분야에 대해 공부를 안 해도 될 정도로 제대로 알고 넘어가자.

- C와 C++을 시작하는 만큼 관련된 CS 분야 지식이 나오면 바닥부터 다시 공부하자.

 

아무래도 내 최종 언어의 종착지는 Javascript이기 때문에 세부 문법보다는 관련된 CS 지식, 파생된 근본 지식왜라는 질문을 던져가는데 집중해서 주어진 문제들을 해결해나갔다.

 

가장 나에게 생각의 변화를 준 과제를 뽑으라고 한다면 ft_printf 과제이다. 지금 와서 생각해보면 printf 과제는 가변 인자를 제외한다면 이전 과제와 비교해서 새로운 내용이 없다. 내가 세운 원칙대로 제일 먼저 man 페이지를 읽고 Apple의 printf 코드를 보았다. Apple의 코드는 여러 버전이 있었는데, 최신 코드에 가까워질수록 굉장히 이해하기 힘들었다. 여러 버전의 코드를 본 뒤 2000년도 코드의 아이디를 차용해서 코드를 작성하기로 했다. 코드 로직 자체가 너무 깔끔했기 때문에 나는 로직을 이해하고 내 걸로 만들었다는 사실만으로도 2000년대 Apple 직원이 작성한 코드를 따라잡았다 생각했다. 또한, 실제로 코드를 작성하면서 Apple 코드에서 발생할 수 있는 문제점들도 발견해가며 자만해있었다. 

 

나는 중요한 점을 놓치고 있었다. printf 과제 같은 경우 여러 테스터기들이 존재했다. 내 코드들은 존재하는 여러 테스터기들에게 박살이 나고 있었고 구멍 난 부분을 메우면서 내 깔끔했던 50줄 정도의 중요 로직은 어느덧 코드 중복과 오직 하나의 테스트 케이스를 위한 임시 변수들로 634줄이 되어있었다. 표를 그려 모든 경우의 수를 다 계산하고 자체 테스트 케이스를 만들어서 과제를 통과하는 데까지 두 달이 걸렸다.

 

만약, 최소 72가지 경우를 먼저 분류해놓고 문제에 접근했다면.. man 페이지를 조금 더 자세히 읽고 *인 경우를 생각을 하고 로직을 작성했었다면... 조금 더 빨리 문제를 해결하지 않았을까 큰 아쉬움이 남았다. 이후, 어떤 문제가 주어지면 바로 코딩보다는 우선 생각을 먼저 하는 습관을 형성하려고 노력하는 계기가 되었고, 항상 다짐했다. 이 과제의 권장 기간은 7일이다. 그렇기에 내가 평가를 받을 때에는 printf를 끝낸 동료들이 꽤 많아서 서로의 방식을 이야기할 수 있어서 좋았다. 

애플 공식문서에 써져있는 코드를 이해하는 것도 많은 노력과 이해심을 바탕으로 하는데, 이를 완벽하게 이해하시고 이용하셨고, 전체적인 그림에 대해서 잘 설명해주셔서 제가 풀던 방식과는 완전히 상이한 방식으로 프린트 에프를 풀 수 있다는 것을 새로 알게 되었습니다. 테스트도 2개 다 통과하셨고, 뮬리 넷도 통과했기 때문에 잘 통과될 것 같습니다. 수고하셨습니다.
보통 코드를 보고했다고 하면 깃허브에서 봤을 거라고 생각하는데 호리님은 apple 공식 printf를 보고 하셨네요! 그 긴 코드를 보고 해석하고 만들었다는 거에 정말 감탄하고 갑니다. 다만 겹쳐지는 부분에 대해서 복사 붙여 넣기가 너무 많아 보이네요ㅋㅋㅋ 나중에 리팩터링 해보는 것도 나쁘지 않아 보입니다!! 고생 많이 하셨어요 :)

 

한 단계, 한 단계를 경험할 때마다 42 과정이 체계적이라고 느꼈다. 해당 subject에 대한 문제를 풀고 평가를 받을 때마다 설명을 하기 위해 가장 기초 지식부터 다시 공부했다. 예를 들어서, philosophers를 진행할 때, 나는 프로세스가 무엇인지 선뜻 대답을 하지 못했다. 내가 안다고 생각했던 지식도 몰랐던 것이다. "Process is a program in execution". 기초적인 단어들의 정의부터 하나씩 해나갔다. 또, 철학자 수가 적을 때는 잘 동작했는데 100명만 돼도 이론적으로는 완벽한데 동작하지 않았다. 그 원인 중에 하나인 철학자의 점유시간과 유휴시간을 보장하기 위한 usleep의 지연이라는 개념과 필연적으로 context switch를 설명해야 했다. 그러다 보니 subject와는 별도로 이 기간에 운영체제 책을 완독 하게 되었다.

 

webserv는 socket과 select를 사용하여 Nginx를 구현하는 프로젝트이다. HTTP/1.1와 관련된 RFC를 달달 읽고 문제도 만들면서 공부했다. 다른 프로젝트들과 비교해서 가장 힘들었지만 좋은 팀원들을 만나 견뎌낼 수 있었던 것 같다. 아무래도 제일 신경 쓴 부분은 전체 진행 과정을 효율적으로 만들기 위해 Draw.io와 Github의 칸반 보드와 이슈 등을 잘 사용하려고 했고, 코딩 컨벤션도 정했다. Pull Request의 경우 최대한 단위를 작게 기능별로 취합하려고 노력했는데 나름 성공적이었다고 생각한다. 프로젝트는 937 commits, 108 issue, 215 pull request로 마무리되었다.

 

가장 어려웠던 점은 속도 최적화였다. 그동안의 좋은 코드를 작성해야 한다는 생각만 했지, 어떤 코드가 좋은 코드인지 정략적 지표를 갖지 못하고 있었다. 테스터기에 3시간 30분 걸리는 것을 11분 30초로 줄이면서 가독성 좋은 코드는 무엇인지, 시간 복잡도를 고려했는지, 사용한 자료구조는 적절했는지, 메서드나 연산의 내부 동작은 어떠 한지등 등 많은 생각을 한 시간이었다. 그리고 끊임없이 오늘의 실패 이유와 다짐을 했다. 어떤 날에는 오류가 발생했는데 그에 대한 해결 방법을 생각하고 무작정 코딩을 같이 했는데, 발생한 오류의 원인을 잘못 정의해서 하루를 날린 적이 있었다. 이후로는 문제가 발생하면 어떤 이유로 발생하는 문제인지 검증부터 진행했었는데, 정말 지식 외적으로도 문제대 해 접근할 때 태도를 많이 바꾸게 된 프로젝트였다.

 

가장 최근에 경험한 ft_containers의 경우 STL 표준 라이브러리 코드의 template method design을 보며, Design Pattern의 중요성을 느꼈다. Design Pattern은 미리 유형별로 문제를 해결하는 방법들이 기술된 답지라 생각한다. 그 외에도 자료구조에 대해 공부했지만 subject 이야기는 다음으로 미루려고 한다. 너무 길어지니까!

 

이처럼 나는 최대한 subject가 추구하는 내용왜라는 질문에 답하기 위해 바닥부터 지식을 쌓아나갈 필요가 있었다. 아래에 과제가 가지고 있는 핵심 분야를 나눠보았다.

 

Operating System (get_next_line, minishell, philosophers)

Computer Architecture (libasm)

Data Communication (netwhat, webserv)

Data Structure (ft_containers)

Object Oriented Programming (cpp 00 ~ cpp 08)

Container (ft_server, ft_services)

Raycasting (cub3 d)

 

42 과정은 상당히 체계적이다. 하지만, 아무도 무엇을 해야 하는지 알려주지 않는다. 만약 무언가 정해져 있었다면 그 기준만 통과하기 위한 공부를 했을 텐데, 자율성이 나에게 스스로의 기준을 정하고 스스로 가치를 만들어나가도록 만들어 준 것 같다. 

42 holly graph

동아리 / 공모전

42 본과정 이외에도 우연히 좋은 기회로 제3회 정부혁신제안 끝장 개발대회 메이커톤에 참여할 수 있게 되었는데 결론적으로는 입상을 했다. 하면서 가장 계속 느꼈던 점은 이전에 Javascript도 지금 본과정처럼 공부했다면 조금 더 많은 것을 알 수 있지 않았을까 후회가 많이 됐다. 이전에 간단하다고 생각한 ajax도 간단하지 않게 느껴졌다. 빨리 서클을 빠져나가 Javascript를 공부하자는 다짐을 하게 되는 계기가 되었다.

woori42

42에는 또한 많은 동아리가 활성화되어 있다. 누구나 자유롭게 활동을 할 수 있으며, 직접 개설할 수도 있다. 나는 42 Seoul Club Translation42JS에서 활동을 하고 있다. 

 

42 Seoul Club Translation에 들어오기 전에 여러 브랜치로 번역들이 나뉘어 있었고, 접근성이 떨어져서 버려져가고 있었다. 수많은 사람들의 노력이 너무 아까워서 레파지토리를 개선하고자 42 Seoul Club Translation에 들어갔다. 여러 PR을 정리하고 브랜치를 취합하여 하나로 만들고 @wpark 님께 rebase도 배워가며 레파지토리를 개편했다. (새벽이었는데도 알려주셔서 너무 감사했다.) 현재 많은 사람들이 이용해줘서 뿌듯하다.

42Seoul translation repo

42JS 은 앞에서 느낀 아쉬웠던 점들과 그래도 손에서 Javascript를 잡고 있기 위해 활동했다. you dont know JS 책을 같이 읽고 퀴즈도 내며 일주일에 한 번씩 스터디를 진행해서 6개월 만에 완독을 했다. Scope, Closure,  Behavior Delegation 등 하나하나 개념을 적립해 나가서 배우는 게 많았다. 스터디와는 별도로 js_piscine도 올해 안에 다시 만들 예정이다.

끝으로

학교를 휴학하고 42 Seoul을 선택한 것에 대해 후회는 없다. 오히려 처음의 걱정과는 달리 좋은 추억과 가르침을 얻게 되어서 모든 시간이 좋았다. 또 무엇보다 공통된 관심사를 가지고 있는 든든한 동료들을 얻게 되어서 좋았다. 같이 나아갈 동료와 함께 나아가는 일은 즐겁고 값진 일이기 때문이다.

 

나는 1년 동안 많은 실수와 후회/다짐을 했고, 반복하지 않기 위해 계획을 세우고 행동했다. 아마 42가 아니었으면 나는 더 먼 길을 돌아갔을 수도 있다고 생각한다.

 

마지막으로 ft_transcendence을 남겨두고 있다. 정말 운 좋게도 원래는 backbone과 ruby on rails로 서비스를 구현해야 하는데, 최근에 Typescript로 풀 스택을 구현하도록 개정된다고 한다. 많은 것을 돌아서 운도 따라주어서 결국 Javascript에 도달했다. 이번에는 과거의 실수들을 반복하지 않기 위해 노력할 것이다. ft_transcendence 시작 부분에는 다음과 같이 적혀있다.

To do something that you’ve never done before. Remind yourself of the beginning of your journey in computer science. Now look where you are standing. Time to shine.

 

이제 빛날 시간이다.

 

길지만 끝까지 읽어주셔서 감사합니다! 좋은 하루 보내세요 :)

 

 

hochan222 - Overview

"Done is better than perfect". hochan222 has 69 repositories available. Follow their code on GitHub.

github.com

 

728x90

'성장일기' 카테고리의 다른 글

smartphone emulation  (0) 2021.08.22

댓글