본문 바로가기

Linux Kernel

리눅스와 오픈소스에 관한 생각

반응형

리눅스와 오픈소스 공부를 시작한 계기

처음 운영체제, 리눅스 커널을 접한건 중학교 쯤이다. 당시에는 나만의 운영체제를 하나 만들어보고 싶었고 (물론 성공적이진 않았지만), 당시엔 해커에 관한 환상이 있었기 때문에 (중2병인지 -_-) 리눅스를 해킹하면 멋있겠다고 생각해서 운영체제 책이랑 리눅스 커널 책 몇권을 읽었다. 물론 지금 생각하면 책의 30%도 이해를 못하긴 했다. 그때는 지금보다 컴퓨터 공학을 잘 몰랐다.

그러다가 학교 도서관에서 한국 오픈소스 개발자들을 소개하는 꾸준히, 자유롭게, 즐겁게라는 책을 우연히 접했다. 책에선 허태준 개발자님을 소개하는데, 2000년대부터 꾸준히 개발에 참여해서 주요 서브시스템을 관리하시는 한국에 몇 안되는 분이다. 멋있기도 했고, 이렇게 먹고 사는 개발자도 있다는게 신기했다.

그렇게 한동안 커널 공부를 안하다가 올해 초쯤에 locking primitive 쪽에 관심이 생겨서 커널 책을 다시 들여다보게 됐고, 그렇게 시작해서 지금까지 공부를 계속하고 있다.

오픈소스에서 생각보다 배울게 많다

나는 학부생 나부랭이지만 오픈소스에서 주로 활동하는 사람들은 보통 수년, 또는 십수년 이상 이 분야에서 일해온 사람들이기 때문에 정말 배울게 많다. 요즘 메일링 리스트에 질문하거나 코드를 보내면 SUSE, Facebook, Huawei, Oracle에서 일하는 사람들이 피드백을 준다. 사람들이 오랜 경험이 있는 만큼 정말 깊이 있는 리뷰를 받을 수 있다.

리뷰에 답변을 하다보면 이 사람들이 내 코드에 대해 질문을 하면 답변을 해야하는데 아직 내가 모르는 게 많기 때문에 질문을 이해하는 것부터가 공부를 많이 해야한다. 그리고 그만큼 배우는게 많다. 오픈소스가 아니면 나 같은 학부생이 언제 이런 사람들과 일을 해볼 수 있을까?

오픈소스의 좋은 점은 누구나 참여할 수 있다는 점이다. 내가 갑자기 카카오에 가서 "나도 프로젝트좀 끼워주시오"라고 하면 미친 사람 취급을 받겠지만 오픈소스는 누구에게나 문을 열어놓는다. 단, 기술적으로 의미있는 일을 해야한다. 사실 그게 좀 어렵다. 의미가 있으려면 새로운 기능을 구현하거나, 버그를 고치거나, 코드 유지보수 등등을 해야한다.

코드보다 설계를 이해하는 게 더 중요하다

처음 코드 분석을 시작했을땐 말 그대로 맨땅에 헤딩을 했기때문에 좌절을 많이 했다. 나는 무작정 코드를 읽다보면 눈에 뭐가 들어올줄 알았다. (정말이다. 그땐 그랬다.) 그렇게 수차례 좌절을 하다가 아니다 싶어서 리눅스 책들은 구석에 박아놓았다.

그러다 대학교에 들어오고, 2년동안 컴퓨터공학을 배우면서 기초를 나름(?) 쌓았고, 42 서울에서 맨땅에 헤딩을 더 능숙하게 하는 법을 배웠다. 그러고 나서 올해 초부터 몇달간 삽질하면서 공부한 결과, '이걸 왜 이렇게 설계했지?'를 이해하지 못하면 아무리 코드를 읽어도 소용이 없다. 따라서 코드가 이해가 안되면 코드를 더 봐야할 게 아니라 코드의 설계와 의도 자체를 이해해야 한다. 코드의 설계와 의도를 이해하려면 다양한 문서를 읽어야 한다.

첫번째로 개발자들이 당연하다고 생각해서 따로 언급하지 않는 내용은 보통 교과서, 시중에 있는 책, 논문 안에 있다. 나 같은 경우에는 지금 슬랩 할당자(메모리 할당자)를 분석, 수정하고 있는데 관련된 논문을 이해하고 나니까 코드 분석이 훨씬 수월해졌다. 주제와 관련된 유명한 논문이 있다면 코드가 어느 정도는 논문에 맞춰서 된다.

두 번째로는 표준 문서가 있다. 종종 해당 분야에 표준이 존재하는 경우가 있다. 내가 만약 슬랩 할당자가 아니라 디바이스 드라이버를 개발하기로 했다면? 예를 들어 요즘 고성능 SSD에서 쓰이는 NVMe 드라이버를 개발하려 했다면 NVMe의 하드웨어/소프트웨어 스펙을 나타낸 표준 문서를 찾아서 읽었을 것이다. (물론 NVMe는 블록 레이어와 밀접하기 때문에  블록 레이어쪽 코드도 읽었을 것이다.)

세 번째로 주석이나 문서(개발자가 코드를 문서로 만든 것)를 들 수 있다. 코드를 작성한 개발자는 직관적으로 와닿지 않는 내용은 주석으로 남긴다. (일반적으로 그래야 한다)

네 번째로 사람들이 이 코드를 작성할 때 무슨 대화를 주고 받았는지를 살펴봐야 한다. 리눅스 같은 경우에는 lkml.org나 lore.kernel.org에서 메일링 리스트를 검색하면, 코드를 제안할 당시에 어떤 대화를 했는지 살펴볼 수 있다.

 

오픈소스에 가치를 더하기

코드를 이해하는 것보다 중요한 건 개발에 참여하는 것이다. 이해만 하고 개선을 안 하면 오픈소스를 할 이유가 없다. 요즘 내 최대 고민은 어떻게 오픈소스에 가치를 더하는가이다.

 

가치를 더하려면 새로운 아이디어를 생각해야한다. 나는 최근 한 달동안 이런저런 아이디어가 생겼는데 (물론 유용한 아이디어보다 버리는 게 더 많다) 주로 코드를 이해하면서 생기는 질문과 (이게 꼭 필요한가? 이 코드는 왜 이렇게 짰지?) 다른 사람이 현재 어떤 작업을 하는가, 예전에는 어떤 시도가 있었는가를 생각하다보면 많이 생기는듯 하다. 결국 처음에는 책, 코드, 논문, 메일링 리스트 할것 없이 끊임없이 읽고 질문을 던져야 한다.

 

오픈소스를 계속 하는 이유

가장 큰 이유는 재미있기 때문이다. 왜 이렇게 설계했는지 보다보면 재미있다. 그리고 기여를 시작하다 보면 내가 이 프로젝트에 영향을 줌과 동시에, 이 커뮤니티에 소속되었다는 느낌도 받는다. 이게 그냥 즐겁다.

아직 현실적으로 내가 이 분야와 관련된 직업을 갖게 될지는 모르겠다. 경험과 전문성을 쌓으면 직업이 될 수 있지 않을까?