공통 과정에서는 c/c++을 주로 배운다. 자료구조나 알고리즘, 운영체제와 관련된 내용들을 컴공에 준하게 배울 수 있다. 마지막 과제인 트렌센던스까지 하면 타입스크립트, 프레임워크, DB까지 사용한 멋진 프로젝트를 할 수 있다. 모든 과제에서 키워드만 던져주기 때문에 알아서 공부해야한다. 수단과 방법을 가리지 않고 공부하는 습관도 가질 수 있게 된다. 과제가 혼자 하기에는 영 어렵기 때문에 스터디나 인맥을 잘 관리해서 좋은 정보를 얻는것도 중요하다. 실패하는 것에 연연하지 않게 되고, 경쟁이 아닌 동료와의 끈끈한 협력을 배울 수 있다.
libc의 대표적인 함수들을 클론하여 나만의 라이브러리를 만든다. calloc, memmove, memcpy 와 같이 메모리를 만지는 함수나 strcpy, substr, split등의 문자열 관련 함수를 만들면서 자료형, 포인터, 메모리 관리를 이해할 수 있다.
file descriptor로부터 유닉스 개행문자(LF, '\n') 또는 EOF 기준으로 한 줄 씩 읽는 함수를 만든다. read, write 등의 파일 입출력 시스템콜, static 변수에 대해 공부한다. libft와 get_next_line 까지 하면 컴퓨터 메모리 구조에 대한 이해도가 높아진다.
printf 함수를 똑같이 구현한다. 과제에 어렵다고 적혀있고 어려웠다.🥺 가변인자를 이용해서 cspdiuxX% 에서 flag, precision, 각각의 우선 순위까지 고려해야 한다. f%인 보너스까지 하면 부동소수점에 대해 깊이 공부하는 시간이 될 것이다. 하지만 시간이 엄청 오래 걸리기 때문에 잘 선택 해야한다. 그리고 이때 부터는 관리하는 함수, 파일이 많고 디버깅도 필수라서 vim에서 vscode로 넘어가면 좋다..
1인칭 슈팅 게임엔진을 만든다. ray casting이라는 그래픽 알고리즘을 이용한다. 3차원이라 수학 공부도 많이 해야한다. 이 과제에서 메모리 할당 후에 해제하는 malloc free 에러로 고생했다. AddressSanitizer를 사용하면 좋다. 이번에 새로 생긴 so_long은 2차원 게임 만드걸 먼저 하던데 그정도가 적당한 것 같다. 2차원도 제대로 못하고 3차원을 한 느낌이다...🥺
미니 bash 쉘을 만드는 과제이다. echo, cd, pwd, export, unset, env, exit 명령어는 builtin으로 만들고 나머지 명령어는 PATH 환경 변수에서 실행 파일을 찾아 잘 실행시켜야 한다. fork, pipe, execve 등의 프로세스 생성과 제어, dup 등의 파일 디스크립터 관련 시스템 콜을 이해하고 활용한다.
"식사하는 철학자"에서 발생하는 deadlock 문제를 해결한다. 철학자를 프로세스 또는 스레드로, 포크를 공유자원으로 설정하여 mutex와 semaphore를 공부한다. 멀티 스레드, 멀티 프로세스 환경이다 보니 디버깅이 난감했지만 확실히 이해할 수 있었다.
docker container로 구성된 쿠버네티스 클러스터를 구축한다. kubectl ~ 온갖 옵션과 명령어로 pod에 들어갔다가 나왔다가 죽였다가 살렸다가 한다. 각 컨테이너들이 서로 잘 통신하도록 yaml 파일을 작성한다. 인프라 관련 과제인데 minishell에서 잘 공부해 놓으면 상당히 도움이 많이 된다. (포그라운드/백그라운드 프로세스, exit code 등등)
c++ 문법과 객체지향 개념을 익힐 수 있다. 과제에서 요구하는 키워드를 그때 그때 책을 찾아서 보다보면 웬만한 문법서 하나 다 읽는다. 객체지향 자체가 좀 어렵긴한데 확실히 코드로 짜면 이해하는데 수월하다.
c++ 컨테이너인 vector, list, stack, queue, map과 이터레이터를 구현하는 템플릿 프로그래밍을 하는데,,, 자료구조 공부를 많이 하게 된다. 이때 이진 탐색 트리에 대해 깊게 공부할 수 있었다. 그런데 c++를 배우는게 옳은건가 라는 생각을 많이 하게된다.
HTTP 1.1 프로토콜 기반으로 소켓 통신하는 웹서버를 만든다. nginx를 모델로 get, post, delete 요청을 처리 한다. c++배우길 잘했다는 느낌을 처음 받았다.😂 상속개념도 적극 활용해야 한다. 나는 workmap 웹 프로젝트를 한 뒤에 과제를 시작해서 그나마 이해하기 편했다. 다른 사람 코드도 좀 봤는데 확실히 잘 읽히는 코드랑 영 안 읽히는 코드가 있긴 하다.
팀프로젝트라 팀원에게 배우는 것도 정말 많다. 지금까지 한 과제중에 제일 재밌고 좀 더 깊게 잘 공부하면 포트폴리오로 쓸 만 할 것 같다.
대망의 마지막 과제였다. 웹 탁구 게임을 만드는데 관리자 기능이 있는 채팅도 가능해야 하고 친구 추가 나 차단 기능도 있어야 하고 요구사항이 많았다. 그런데 진짜 서비스를 하려면 이 정도 요구사항은 아주 최소한이라는 것을 알게 되었다. 인턴생활이랑 병행하다 보니 빡셌지만 팀원들이 다들 너무 좋은 분들이라 끝까지 할 수 있었다. 업무에 좀 익숙해지고 나면 이런 식으로 토이 프로젝트를 하면 좋을 것 같다. 이때 현직자 멘토링을 받으면서 지라, 컨플루언스 사용을 잠깐 했는데 역시 회사에서도 지라를 사용해서 도움이 많이 되었다.
깃허브 커밋 메세지를 한글로 잘 올렸으면 좋았을 텐데 그러지 못했다. 잘 하지도 못하는 영어로 아무도 안볼거라고 생각하고 그냥 적당히 적었다.
주말에는 토이 프로젝트를 하거나 이력서를 적극적으로 쓰고 코딩테스트도 보는게 좋을 것 같다.
멘토나 앞서가는(?) 주변 동료의 피드백을 적극 활용하자.