본문 바로가기

일상기록장/크래프톤 정글 일지

Week 10~11. PintOS 프로젝트 회고

오늘로써 크래프톤 정글에서의 핀토스 과정이 마무리됐다. 👏👏

프로젝트 중에 VM이 가장 어렵다고 정평이 나있었는데, 역시나 가장 어려웠다.. ㅋㅋㅋ

개인적으로 코로나에 걸려 공백이 좀 있었고, 그 체력과 멘탈에서의 후유증이 3번째 프로젝트까지 넘어와 좀 힘들었던 것 같다. 마치 배터리가 금방 방전되는 것 같은 기분..? 그래도 막판에는 다시 몰입할 정도로 회복되어서 다행이었다. 

 

핀토스 과정에서 많은 것을 얻었다. 아쉬움이 일절 없다면 거짓말이지만, 그래도 이전의 나에 비하면 프로그램을 대하는 태도가 많이 달라졌다고 느낀다. 가장 큰 건 두려움이 한 층 걷힌 것 같다. 또한 주변에서 잘 해내는 친구들을 보면서 앞으로 나는 어떻게 프로그래밍을 해야 하는가에 대해서도 많이 생각해볼 수 있었다. 

 

이 기억과 감흥이 휘발되기 전에 5주간 느낀 점을 정리하고자 한다. 

 

[#1] 3만 라인의 거대한 프로그램 이해하기

 

손으로 직접 써보자

 

  • 처음 pintos-kaist 를 내려받고 코드를 열어보았을 때는 적잖이 당황했다. 수많은 폴더와 파일들, 그 안에 얽히고 설켜 서로를 참조하고 있는 함수들 .. 모든 함수의 모든 코드를 머릿속에 넣을 수는 없고, 또 참조에 참조를 타고 타고 가다보면 숲에서 길을 잃기 쉽상이다. 
  • 좋든 싫든 5주간 이 프로그램을 뜯어보고, 내 마음대로 바꿔보고 테스트를 돌려보면서 나름대로 대량의 코드에 친숙해질 수 있었던 것 같다. 물론 아직 전체 프로그램의 반의 반도 이해하고 있진 않지만, 코드의 100%를 머리에 넣는 게 중요한 게 아니라 코어한 flow를 이해하는 것이 유효한 방법이라고 생각하게 되었다. 
  • 그 과정에서 내가 애용했던 방법은, '손으로 적어보는 것'이었다.
    • 프로그램, 특정 기능 flow 상 거쳐가는 핵심 함수들을 손으로 적어보는 것이 큰 그림을 파악하는데 많은 도움이 됐다. 
    • 혹은 전체적인 구조도, 그림을 그려보는 것도 이해에 많은 도움이 됐다. 중요한 건 손으로 적는 것! 

대충 이런 느낌

 

 

 

[#2] 코드 잘 짜는 친구들의 공통점

 

1. 시간을 때려박는다. (뻘짓을 많이 한다)
2. 잠시 코드로부터 한 발 물러나서 생각할 수 있다.
3. 복잡한 대상을 이해하고 수정하는 자체에 재미를 느낀다. 

 

  • 핀토스를 거치면서 중간에 꺾인 사람들도 많았고, 열심히는 하지만 점점 뒤쳐지는 사람들도 있었다. 
  • 반면에 점차 두각을 나타내거나, 처음부터 잘했던 친구들도 있었다. 
  • 그 친구들은 어떤 생각으로 코드를 짜고 있는지 모르겠지만, 내가 느낀 그들의 공통점은 위와 같다. 

 

[#3] 설계를 위한 사고법

 

1. 목적 파악하기 (무엇을 위한 기능인가?)
2. 수단 설계하기 (Divide and Conquer와 Layers of abstraction)

 

프로그래밍 설계는 1) '유저의 요구가 무엇일까?', 2) '이를 위해 어떤 기능들이 필요할까?', 3) '그 기능은 어떻게 구현할까?'라는 질문의 반복인 것 같다. 

  • 핀토스를 하면서 느낀 점은, '이 수많은 테스트 케이스들이 결국 고객의 잠재적 요구들이고, 우리는 이를 충족해가는 과정을 겪고 있는 거구나.' 였다. OS의 발전 과정이 이랬을 것이다. 처음에는 기본적인 자원 관리 및 할당 기능만 가지고 있다가, 기존에 생각하지 못했던 사용자의 요구가 발생했고, 이를 커버하기 위해 새로운 기능이 얹히거나 구조가 바뀌는 방식으로 .. 
  • 카이스트 권영진 교수님의 특강에서, CS 전반에서 가장 중요한 키워드로 다음 두 가지를 말씀해주셨다.
    1. Divide and Conquer
    2. Layers of abstraction
  • 이는 OS나 유명 서비스들의 아키텍처 등 모든 성공적인 프로그램에 녹아있는 철학인 것 같다. 
  • 핀토스에서도 다음과 같은 사고 과정을 통한 접근을 할 수 있다. 이렇게 한 발 물러나서 생각해보는 게 위에서 말한 잘하는 친구들의 특징이다. 내 경우에도 이건 잘 해결했다 싶은 케이스들은 알게 모르게 이런 방식의 생각을 거쳤던 케이스들이었다. 
    1. OS는 본질적으로 어떤 역할을 수행해야 할까?
    2. 이 역할을 위해 어떤 기능들이 필요할까?
    3. 각 기능은 어떤 세부 기능들로 구성될까?

 


이어서, 이번주 목표 달성 여부 체크 !

 

1. 과제 완수율 90% 이상 달성하기 
2. 주 3회 이상 운동하기 🔺 (첫째주만 달성)
3. 공부 내용 기록하기 🔺
4. 주 3회 이상 알고리즘