Skip to content

2024.05-07 나름 알찬 말년의 학교생활

3학년 1학기가 끝나고 현장실습을 앞두고 있다. 공부도 하고, 책도 마음껏 읽고, 학교에서 이런저런 일들을 겪다보니 시간이 빠르게 지나갔다. 엄청나게 알찬 시간이었다고 할 수는 없지만 나름 여러 활동을 하며 만족스럽게 지냈다. 이제 학교에서 생활할 일이 거의 없을거라는 사실이 아쉽다.

이번 회고에선 지난 기간에 했던 활동들을 돌아보도록 하겠다.

eBPF

Pyroscope Agent의 eBPF 기능을 rust로 옮겨 개발하는 프로젝트를 3월에 시작해서 5월 말에 마무리했다. perf map에서 symbol을 가져오는 기능도 완벽하게 동작하지는 않지만 jvm에서 일부 함수 심볼의 flameGraph를 만드는 테스트도 해봤다. 이 때 구현하면서 공부, 분석했던 원리들은 eBPF로 서버 성능 Profiling하는 법 글에 따로 정리해놨다.

원래는 단순히 Pyroscope의 기능을 따라 구현하는 게 아니라, 좀 더 높은 계층의 정보까지 엮어서 볼 수 있게 하고 싶다는 꿈이 있었는데 조사할 수록 그게 쉽지 않은 일이라는 걸 알게됐다. 기능을 구현하고도 이후 한 달은 관련 개념을 계속 보며 공부해봤는데, eBPF 레퍼런스에서 추구하는 바는 내가 상상했던 것과 다르다는 것을 느껴서 이 정도에서 마무리하기로 했다.

공부하면서 다양한 linux 시스템 콜(perf, epoll, bpf)과 개념(stack frame, kallsyms, elf, vlinux)을 익힐 수 있었다는 점은 좋았다. Cilium, Grafana의 Slack 커뮤니티에 헷갈리는 부분들을 질문하면서 공부하기 위한 힌트를 얻기도 했다. 너무 친절하게 답변해주셔서 감사할 따름이다.. 좀 더 적극적으로 대화나누려 했다면 좋았을 것 같다는 생각도 들었다.

긴 시간을 들여서 열심히 공부하긴 했지만 그럴듯한 엄청난 성과는 없었던 것 같아서 아쉽다. 좀 더 쓸만한 새로운 툴을 만들고 싶었는데 내 추진력과 능력이 거기까지 닿지 못했다. 다음에 시간을 들여서 새로운 공부, 프로젝트를 한다면 이번 경험에서의 아쉬운 점을 극복해봐야겠다.

알고리즘

eBPF 프로젝트를 마무리하고 6월에는 알고리즘을 열심히 풀었다. 전에도 언젠간 알고리즘을 다시 풀거라 다짐했었는데, 알고리즘을 푸는 친구들을 구경하다보니 나도 풀고싶다는 자극을 받아서 시작했다.

이왕 시작한김에 티어도 올려보자는 생각을 가지고 주로 플레 이상의 문제를 공략했다. 티어대가 높은 알고리즘인 세그트리(Lazy 세그), 오일러 경로 테크닉, 스위핑, 볼록껍질, 회전 캘리퍼스, 반평면 교집합, 최소외접원을 공부해서, 해당하는 문제만 주구장창 풀었다.

원리가 되는 알고리즘은 어렵지만 해당 알고리즘 이론만 이해하고 있으면 약간의 응용만으로도 풀 수 있는 문제가 많았다. 세그면 세그, Convex Hull이면 Convex Hull에 해당하는 구현을 함수로 감싸놓고 그걸 조금씩 바꾸며 풀면 많은 문제들을 비교적 금방 풀 수 있었다. 코테나 대회처럼 이전에 짰던 코드를 활용할 수 없는 조건이라면 이런 문제를 풀 수 없을 것 같다. 이렇게 푸는 방식이 나의 알고리즘 능력에 얼마나 도움이 될지 모르겠지만 그냥 스트레스도 풀 겸 열심히 했다.

이전 티어가 플레3이었는데, 한 달동안 달려서 다이아 5가 되었다. 정올을 준비했던 4년 전의 나에 비해 생각하는 능력이 훨씬 발전했음을 느꼈다. 하지만 더 어려운 알고리즘을 계속 공략하는 건 무리기도 하고 계속 풀다간 멈출 수 없을 것 같아서 끊었다. 다음에 심심하면 가볍게 몇 문제 풀어볼 의향은 있지만, 이번에 너무 많이 풀어서 한동안은 생각나지 않을 것 같다.

독서

남는 시간에는 책을 열심히 읽었다. 이문열 삼국지 10권을 다 읽는다는 목표도 달성했다. 읽기만 하면 금방 잊혀질 것 같아서 독후감도 같이 작성했다.

시간과 여유가 많다보니 책이 표현하는 세계에 온전히 집중해서 읽을 수 있었다. 공부하느라 바쁠 때는 소설이나 문학을 거의 못 읽었는데, 오랜만에 책에 몰입한 감정을 그대로 즐길 수 있어 행복했다. 가장 포만감이 컸던 책은 황야의 이리, 시지프 신화, 니콜라 테슬라 평전이었다. 각 책을 읽고 느낀 점은 독후감에 써놓았다. 앞으로 회사에 가더라도 책은 틈틈이 읽어봐야겠다.

이상하게 전공 관련 지식은 책보다 인터넷 조사가 더 머리에 잘 들어오는 경향이 있어서 전공책은 많이 읽지 않았다. 위 목록에는 적지 않았지만, 최근에 커널연구회의 리눅스 커널 소스 분석-스케줄러편과 데브옵스 엔지니어를 위한 실전 관찰가능성 엔지니어링이라는 책도 읽었다. 읽었던 책들이 도움이 되는 날이 오면 좋겠다.

멘토링

유성구청 프로젝트를 진행하는 1학년 친구들을 대상으로 멘토링을 계속 진행했다. 백엔드, 프론트 개발을 공부하는 친구들이 각각 있어서 분야에 한정된 지식을 알려주기엔 애매했다. 그래서 공통되는 기본 지식인 스위치, 라우터 등 네트워크 계층 및 개념, 프로세스와 스레드, RDBMS 용어와 정규화, TLS 개념들을 설명했다. 다른 백엔드 친구들한테는 IoC, 의존성 주입 방식, 스프링 컨테이너 개념도 설명했었다.

전공에 대한 열정이 있는 친구들이라 설명해주는 게 너무 재밌었다. 그 친구들은 앞으로 어떻게 성장할지 궁금하다. 내가 열심히 알려줘서 재밌게 들은 부분도 있겠지만, 정규화 개념을 알려주기 전부터 대략적인 개념을 아는 친구들이 많았고, 스레드와 동기·비동기를 설명해줬을 때 자바로 스레드풀을 구현해온 친구도 있었다.

동아리 선생님께서도 응용 프로그래밍을 먼저 배우는 것 보다 기초가 중요하다고 생각하셔서, 전공동아리 시간에 CS에 대해 멘토링하는 걸 긍정적으로 생각해주셨다. 1학년 친구들은 다른 친구들보다 기초 지식을 공부하는데 시간을 더 쓰다보니 FE, BE 개발하는 부분에서 뒤쳐지는 것 같다는 고민도 하는 것 같았다.

나는 처음에 백엔드 코드 짜는 걸 먼저 배웠고 공부하는 과정에서 CS의 중요성을 느꼈다. 그래서 CS 개념의 활용 범위를 탑다운으로 빠르게 이해할 수 있다는 장점이 있었지만, 미리 알고 시작했다면 좀 더 넓은 시각으로 기술을 바라볼 수 있지 않았을까 하는 아쉬움도 느꼈다. 그래서 이 친구들한테도 기본적인 개념들을 먼저 알려주고 싶었고 잘 따라와줘서 고마웠다. 이 친구들이 지금은 FE, BE 개발을 배우는데 느린 것 같다 느끼더라도 지금처럼 공부한다면 결국은 잘 하게 될 것 같아서 걱정이 별로 없다. 내가 그 과정에서 조금이라도 도움이 될 수 있었다면 그걸로 만족한다.

멘토링 사진

전공 공부를 하기 위해 이해해야하는 컴퓨터 구조, 네트워크의 내용을 설명하다보니, 기본적인건 글로 남겨서 공유하면 좋겠다 싶어서 학교 신입생 공부 가이드에도 관련 내용을 작성했다. 백엔드, 프론트, 앱 등 각 분야에 대한 가이드는 다른 친구들과 함께 작성했는데, 아직 완전히 다듬어진 상태는 아니고 다른 친구들의 의견을 모아 앞으로 계속 수정해나가야할 것 같다. 완전한 공부 가이드라는 건 없겠지만 공부하는데 조금이라도 감을 잡기 위한 기초 지식을 전달할 수 있으면 좋겠다.

Xquare 인프라

작년에 EKS 기반의 학교 공통 인프라를 만들고, 다른 학생들은 Github Actions 기반으로 배포 파이프라인을 사용할 수 있도록 하는 Xquare 인프라 프로젝트를 진행했었다. 신경쓸 것 없이 프로젝트를 빠르게 배포할 수 있다는 장점 덕분에 지금도 많은 친구들이 해당 인프라를 사용해주고 있다.

지금은 DevOps 유망주인 2학년 후배가 그 프로젝트를 이어받아서, 인프라 사용을 신청하고 관리하는 자체 웹을 구축하고 있다. 그리고 배포 파이프라인을 goCD로 바꿔서 사용자의 파이프라인 설정을 최소화하며 배포 속도를 개선하는 작업을 하고 있다. 나는 웹 서비스 아이디어 제공과 일부 디자인을 했고, prometheus와 loki에서 정보를 가져오는 브릿지 역할의 서버를 개발해서 넘겼다. 나머지 작업은 인계받은 친구가 주도적으로 잘 해주고 있다.

Xquare 인프라를 적극적으로 작업하지 않으니까 까먹는 부분이 있었는데, 이 친구가 인계받고 추가 구현하면서 계속 질문해주니까 기억을 되새길 수 있었다. 후배긴 하지만 나보다 잘 아는 부분도 있고, 문제 원인을 더 빠르게 찾을 때도 있었다. 계속 열심히 공부해야겠다는 자극을 받았다.

특히 후배가 오류가 생겼다며 같이 디버깅해달라 할 때 많은 생각이 들었다. 내가 겪어보지 않은 문제를 질문하면, 내가 어떤 식으로 문제를 찾을 것 같은지 조언해주는 데에서 그칠 수 밖에 없었기 때문이다. 심지어 문제에 대한 배경상황은 물어보는 그 친구가 더 잘 알고 있어서, 나보다 그 친구의 디버깅이 더 유효한 정보를 얻을 때가 있었다. 나는 그냥 내가 할 수 있는 한에서 추론하는 건데, 그게 그렇게 적절치 못한 조언일 때가 꽤 많았다.

그래서 아예 백엔드 친구들의 오류를 봐줄 때는 그냥 그 친구들이 어떻게 문제를 해결하는지 구경하면서 약간의 조언을 해주는 식으로 했다. 문제의 원인에 대한 확신이 없다면.. 오히려 너무 개입하려 하는 것보다 질문한 친구의 생각 흐름과 행동을 지켜보고 의견을 조금씩만 더하는 게 좋은 방향이지 않을까 하는 생각이 들었다.

어쨋든 더 많은 경험을 쌓으면서 컨텍스트와 배경 상황을 유추하는 능력을 더 키울 수 있으면 좋겠다.

마무리

이 외에도 학교 교육으로 정보기기운용기능사와 ISTQB 자격증을 취득하고, 학교 AWS 계정 관리나 교내 해커톤 준비 등 여러 활동에 참여했다. 그리고 TOPCIT 성적으로 고등부 대상을 받기도 했다. 재작년과 작년에 뜨문뜨문 쓰던 일기도 개학하고 나서부터 꾸준히 쓰기 시작했다.

여러 일들이 있었고, 인간적으로도 느끼는 게 많은 상반기였다. 현장실습으로 회사에 가서도 열심히 잘 하면서 알찬 기간을 보낼 수 있으면 좋겠다. 화이팅 :)