

길고 긴 PintOS 프로젝트가 끝났다.
그렇게 오래한것 같지도 않은데 생각을 더듬어보면 뭔가 엄청나게 많은것들이 기억나기도 하고 정신이 혼란스럽다. 그만큼 힘들게 프로젝트를 진행했던거 같다.
이 글을 적음으로써 PintOS 기간중에 내가 무엇을 했고, 어떤 감정을 느꼈고, 어떤 어려움이 있었는지에 대해 까먹지 않게 남기려고 한다. 내가 이 개고생을 5주간 했는데 시간이 지나면 사라진다니 납득할 수 없다.
PintOS를 시작하기 전에는 그저 몇천줄짜리, 그리고 파일도 몇십개 선에서 끝나는 작은 코드들만 봤었다. 코치님께서 말씀하신 '코드에서 길 잃어버리지 않게 조심하세요' 라는 말을 아직도 기억하는데 길어봤자 얼마나 길겠냐고 코드 까보는순간 어이가 없어서 헛웃음이 나왔던걸로 기억한다.

대충 저정도의 코드가 눈앞에 펼쳐지는데, 폴더로 접혀서 그렇지 파일이 수천개가 넘고 코드가 다합해서 몇만줄은 된다고 한다. 근데 단순하게 나열된 코드가 아닌 현대 Operating System으로써 재대로 기능을 하는 '프로그램'의 교육용 버전인 것이다.
위의 os는 학생들이 좀 손보면 작동을 하는 코드이다. windows 처럼 실제로 youtube를 튼다거나, 게임을 돌린다거나 하는 독자적인 os로써 활동하기에는 많이 부족하지만, 틀림없이 Vertual Machine 위에서 작동하는 os인것은 틀림이 없다.
끝났으니 쓰는 말이긴 하지만 이제는 왠만한 몇천줄 짜리 코드들은 별로 커 보이지도 않고, 눈이 넓어진 느낌이 든다. 정말 감당안되게 많아보였던 RB트리의 코드들도 오늘 repository를 정리하다가 봤을때 코드가 누락된줄 알고 잠깐 놀랐었다.

그냥 소년가장이었다. 물론 우리팀들도 모두 좌절하며 정말 밤낮을 프로젝트에 매달렸었다. 프로젝트를 처음 시작하고 한 3일정도는 코드를 보며 공부를 하는데 단 한줄도 못썼던거 같다.
그래도 코드들의 구조가 어떻게 돌아가는지, 어떤 부분이 비어있는지 등을 중심으로 계속 방법을 바꿨다. 일명 박치기 공룡이라고 하는데, 될때까지 그냥 계속 시도해보고 안되면 다시 시도해보는 방식으로 했었다.
그러다가 구조체가 눈에 띄고, thread가 어떤방식으로 작동이 되고, os의 코드들이 프로세스 단위로 작동한다는 것을 알게 되니 조금씩 코드가 보이기 시작하면서 코드를 적을 수 있게 되었다.
우선 자료에서만 보던 구조들을 코드에 녹여내는것이 제일 힘들었다. thread마다 priority가 있는것도 알겠고 여러개의 thread를 사용하는것도 알겠는데, 이 thread들을 어떻게 연결하지? 라는 생각을 정말 많이 했었다.
하지만 결국 process와 thread조차도 사람들이 만들어낸 추상화의 결과일 뿐이고, thread의 데이터를 가지고 다른 thread에 기록하는 등의 방법을 써서 조금 더 'DYNAMIC' 하게 프로그램이 돌아가는 경험을 할 수 있었다. 이러한 과정 덕분에 추상화에 대한 개념이 조금 익숙해졌던것 같다.
그리고 처음 말했던 소년가장에 대한 말을 적어보자면
우리팀의 맴버는 나를 포함해서 총 3명이 있었다.
한분은 잘 하시는 분이지만 기본 세팅을 하는데 시간이 걸렸고(디버깅 환경 설치 등등), 전체적인 구조를 먼저 파악을 하고 난 후에 코딩을 하는 스타일이셔서 시동을 거는데 시간이 좀 많이 걸렸다. 다른분은 반전공자였다. 꼼꼼하신 분이었는데 오히려 이번 프로젝트에서는 그러한 꼼꼼함이 발목을 잡은 케이스였다. 결국 이 두분 모두 첫번째 프로젝트에서는 재대로된 코드를 거의 작성하지 못했고, 나 혼자서 거의 모든 코드를 작성했었다. 하지만 코드를 나 중심으로 짰어도 도움을 많이 받았던게 뭐냐면 첫번째 팀원분에게는 VisualCode에서 C언어를 디버깅하는방법(python과 다르게 디버깅 툴이 작동하지 않았음..)과 포인터 사용법을 자세히 배울 수 있었고, 두번째 팀원분은 특유의 꼼꼼함을 바탕으로 우리가 사용하는 코드 안에 있는 주석부분을 싹다 한글번역을 하셨다.(말이 한줄이지 장난아닌 노가다이다.) 첫번째 프로젝트를 소년가장이라고 비유를 했지만 팀원들의 도움이 없었다면 혼자서 코딩을 하는 상황 자체가 힘들었다고 본다.
첫번째 프로젝트의 요약을 하자면
스레드란 무엇인가, 그리고 os에서 스레드 스캐쥴링을 어떻게 하는가, 그리고 스레드는 어떤 구조를 가지고 있는가를 알게 되었다.

두번째 프로젝트이다.
첫번째 프로젝트에서 그냥 패닉에 빠졌다고 위에 적어놨었는데, 한번 더 패닉이 왔다.
이전 과제를 하면서 코드의 크기에는 어느정도 익숙해졌고, 어떻게 코드를 보면 되는지도 대충 감을 잡았다고 생각했지만 단위가 스레드가 아닌 프로세스로 변하면서 데이터가 어디에서 들어오고 어떻게 처리가 되는지를 알아야 했다. 그래서 첫번째 과제인 파싱 부분은 도저히 안되서 인터넷의 선배 기수의 자료를 읽었다. 정말 감당이 안되는 상황이었다. 하지만 이 고비를 건너고 나서는 systemcall을 처리하게 되었는데, 이 과정은 생각보다 재밌게 했었던거 같다. 좀 정신이 차려지니 코드의 내용들이 이전의 csapp 책의 8장에 나오는 내용이라는 것을 알게 되었고다. 특히 Fork 과정을 코딩하면서 컴퓨터 성능에 따른 실행 속도의 차이 때문에 Lock을 활용한 속도 맞추기를 해야 된다는 것을 알게 되었을때, 정말 큰 충격을 받았던걸로 기억한다. 단순히 코드를 읽기만 하는 것인 줄 알았는데, 여러개의 함수들이 각각의 Process로써 활동하며 각각이 병렬적으로 실행된다는 것이었다. 이러한 신선한 충격을 받으면서 코딩은 생각보다 재미있었다.
여기서 팀 맴버에 대해서 다시한번 말해보자면
팀 맴버는 이전 Project1과 동일하다.(이후 Project3에서는 바뀜) 하지만 첫번째 팀원분이 각성을 하더니 갑자기 혼자서 디버깅을 하고 코드를 미친듯이 짜기 시작했다. 옆에서 두번째 팀원분이랑 같이 경악했던 상황이 있는데, 이 첫번째 팀원분이 거의 1주일동안 숙소에는 잠시 씻으러가고 강의실에서 살다시피 했던 것이다.(강의실에 수면용 의자를 하나 놔뒀음). 이분이 원래 숙소에 잘 안가는 분이기는 한데 프로젝트한다고 반쯤 격앙된 상태로 코드가 안써지니 키보드랑 씨름을 하고 있는 그 모습은 지금생각해도 좀 무섭다. 그런상태로 1주일쯤 있으니 대부분의 테케를 통과해버렸다..
두번째 프로젝트를 요약하자면
프로세스란 무엇인가, 여러 프로세스는 병렬적으로 실행된다, 프로세스끼리의 연산 속도에는 차이가 있다 등등이 되겠다.

(살려주세요...!)
정신 나가버리는줄 알았다.
개념은 이해가 되긴 하는데 코드를 어떻게 적어야 될지 감도 안잡히는 구간이었다.
이게 하루이틀이면 뭐 이해라도 하겠는데 10일의 프로젝트 기간 내내 내가 코드를 어떻게 써야되는지 적응이 안됐던 구간이다. 다행이도 팀원분이 정말 코딩을 잘하는 분이었는데, 2인팀이라서 잘하는사람이랑 묶어줬나? 싶기도 하다. 특히나 처음에 코딩테스트를 친다고 며칠 재정신이 아니었는데, 그 덕에 프로젝트를 하는 시간이 적었고, anonymous page에 대한 이해가 잘못박혀있어서 gitbook과 인터넷의 file-backed page에 대한 설명을 잘못 이해했던 것이 엄청 크다고 생각한다. project3 발표를 할때도 내가 했던 말이 있는데, '책 한권 읽은놈이 제일 무섭다'이다. 그렇게 중하지도 않은 개념 하나를 잘못 이해하고 있으니, 코드를 봐도 이해가 되지 않고, 내가 어떤 방향성으로 코드를 짜야되는지에 대한 계획 조차도 기반이 뒤틀려버리니 코드가 쓰이질 않았던 것이다. 결국 종합해보면 이번 프로젝트는 나에게 겸손함을 때려박았던것 같다. 내가 잘 알고 있다고 생각하는것, 내가 잘한다고 생각하는것, 내가 잘할수 있다고 생각하는것 모두가 부정당하고 10일동안 고문 아닌 쌩고문을 당했었는데 프로젝트가 끝난 지금에서야 정말 좋은 경험이었다고 말 할 수 있다.
팀원분에 대해서는 짧게 정리할 수 있다.
그냥 완벽하다.
이전 부트캠프 경력을 통해서 코딩도 잘했고 코드 이해도도 높았고 전공자라서 cs기반지식도 있고 tool도 자유롭게 쓰고 fault가 나면 잠을 못자는 전형적인 개발자 스타일이었다. 그저 옆에서 그런 모습을 보며 난 저정도까지 할수 있을까? 라는 생각이 들 정도였으니 말이다.
그래도 그분을 보면서 자극도 많이 받았던거 같다.
정글 처음 들어올때 보이지않는 1000만원 이야기가 있었는데, 다른 사람이 잘하는거는 우리가 알지 못하는 수많은 노력이 있기에 가능하다는 것이다.
물론 나 자신도 남들에 비해 4년간 수학으로 고문을 당했던(본전공 기계과) 경력이 있기 때문에 알고리즘에서 전공자들보다 객관적으로는 잘했었으니 말이다.

인생은 캡틴 아메리카 처럼 살아야 한다. 남들보다 뛰어난 기술이 없어도, 남들보다 뛰어난 재능이 없어도 자신의 한계를 인정하고 최선을 다하며 발전시킬 수 있어야 한다는 것을 뼈저리게 느끼게 되었다. 그리고 아무리 어려운 문제들이라도 계속해서 노력하다보면, 실마리가 잡히지 않던 문제들에도 금이 가기 마련이고 이러한 노력이 계속되면 언젠가는 해결 할 수 있다는 것을 배웠다.
물론 이거는 초등학생도 대부분 알고있겠지만, 이렇게 5주간 사람 20명가까이 모아놓고 합숙시키는 곳에서 잠도 잘 못자면서 프로젝트를 하며 몸으로 얻은 경험은 머리로만 아는 경험과는 다르게 오래 기억될 것 같다.
결국 안된다고 생각할때, 도저히 힘들어서 안될때도 한번더 코드를 치고 조금더 공부를 해서 자신을 바꾸려는 노력을 기울여야 한다. PintOS는 os의 운영구조 뿐만 아니라 이러한 경험과 태도를 얻게 해준 프로젝트라고 생각한다.