블로그를 열심히 작성하겠다는 2024년 다짐과 달리 블로그를 단 세 건밖에 작성하지 못했습니다. 2024년 회고를 2025년 신년을 맞이하고 거의 열흘을 넘기고야 작성하고 있을 정도로 블로그가 황량해졌으나, 올해는 조금 더 활동적으로 운영하고 싶습니다.
2024년에 다짐했던 내용
23년도 말에 24년도에 배우고자 했던 내용을 정리했었습니다. 크게 (Neo)Vim, C++, 개발 서적, 운영체제, 통신 기술 개론, 기타 요소가 있었습니다. 성장한 부분도 잘 챙기지 못한 부분도 많은 한 해였습니다.
(Neo)Vim
올해 들어 가장 많이 배운 요소는 역시 Vim입니다. 원래 회사에서는 C++ 개발 시 CLion을 주로 사용했고 다른 부서원도 대부분 CLion을 사용합니다. 훌륭한 IDE지만 너무 무거웠으며 종종 치명적인 버그도 있었습니다. VimEnter 2023을 참석한 이후로 Neovim을 적극적으로 쓰려고 노력했으며, 24년도 초반에 Python이나 Bashscript 코드를 작성하며 머슬 메모리를 키웠습니다.
CLion에서는 IdeaVim 플러그인을 사용했고 기본적인 기능은 충실했지만,-(Neo)vim에 비해 너무 미진한 기능이 견디기 힘들었습니다. 특히 24년 6월쯤 하루 정도 build preset이 전혀 로딩되지 않는 치명적인 버그를 한 번 겪고 IdeaVim에서 Neovim으로 이사했습니다.
C++은 g++
에 100% 호환되는 LSP가 없기 때문에 대체제로 clangd
가 주로 쓰이며, 때문에 LSP의 정확도가 C++ IDE에 비해 모자라는 현실입니다. Telescope lsp_reference
가 잘 잡히지 않는 경우도 많고 컴파일 에러 탐지가 잘못 뜨는 경우가 종종 있습니다. 그럼에도 GUI에 비해 압도적으로 쾌적한 속도를 자랑하며, 파일 구조가 익숙한 프로젝트를 대상으로 사용하기 때문에 감안할 수 있는 단점이었습니다. cmake-tools.nvim
을 이용해 CMake 빌드 환경을 구축한 이후로 6개월째 큰 불편 없이 잘 사용하고 있습니다.
Vim의 기본적인 사용법은 익숙해졌지만 아직 중수 수준까지는 아니라고 생각이 됩니다. LazyVim으로 입문한 이후로 kickstart.nvim
으로 넘어가야지 생각만 하고 아직 넘어가진 못했습니다. 2025년에는 조금 더 다채롭게 vim을 써보고 싶습니다.
C++
올해는 C++을 폭넓게 배웠습니다. 어디 가서 C++ 숙련자라고 말하기는 부족하지만 그래도 초보자는 진작에 졸업했다고 생각합니다. 2024년에는 Rust도 공부해보려고 했는데, Rust Book 1시간 정도 읽고 조금 검색해보는 정도게 그치고 말았습니다. 그럼에도 C++의 가려운 부분을 정말 많이 긁어주고 있어 배울 점이 많았습니다.
- Effective C++의 기본적인 내용들
- move semantics와 r-value reference
- 레퍼런스는 non-owning view라는 짧고 명백하나 중요한 사실
constexpr
의 (오)남용- C++20부터 지원되는 수많은
constexpr
의 확장 (STL container 및 알고리즘의 constexpr화 등등) - constexpr function은 암시적으로 inline이 되기 때문에 헤더에 정의되어야 한다는 사실
- if constexpr의 효과
- C++20부터 지원되는 수많은
- template 마개조와 C++20
concepts
- C++은 여러 언어의 묶음이라는 EC++ 1절의 격언처럼 정말 뭐가 너무 많은 언어입니다.
- parameter unpacking과
template <typename... Args>
,Args&&... args
- 아직
std::integer_sequence
를 함수 인자로 넘겨 parameter unpacking을 하는 기능은 완전히 이해하지 못했습니다.
__VA_OPT__
와 매크로 마개조- 매크로 가변 인자에 mapping을 해 각 원소별로 함수를 적용하는 방법 #참고
- local static variable은 MT-safe 초기화가 된다는 사실 (C++11부터)
- lockless programming은 해야만 하는 상황이 아니라면 절대 하지 말라고는 isocpp의 권고
std::optional
- Rust
Option
의 lifetime 확인이 부러웠습니다.
- Rust
std::variant
와std::visit
- Rust의
match
가 부러웠습니다. C++로는 variant type을 전부 확인할 수 있도록 확장성 있게 구현하기가 조금 번거로웠습니다.
- Rust의
- 익명 함수는
operator()() const
가 정의된 callable class (mutable에서는 const가 drop됨) - CRTP와 mixin
- Rust
trait
가 제공하는 유연성이 부러웠습니다.
- Rust
- 이런저런 C++ 잡지식
- ref-qualifier
- 적절한 C++ 상속
- 올해 개발은 utility 측면에서 많이 진행되어 상속을 사용할 기회가 많았습니다.
magic_enum
- 처음으로 도입해본 라이브러리인데 정말 유용하게 사용했고 코드를 조금 훑어보면서 많은 점을 배웠습니다.
- 다양한 상황에서의 C++ 디버깅
- gtest 분석, 레거시 코드 분석, multicore에서만 발생하는 버그 분석, 아주 조그마한 실수오차를 야기하는 버그 분석 등
- Doxygen 작성
- 프로젝트에 미비했던 주석을 제가 작성한 코드에라도 달아야지 싶어서 채워놓으려고 노력했으나 아직 배울 점이 많다고 생각됩니다.
- C++ 가르쳐주기
- 다른 파트원분들께 알짜배기 C++ 지식을 많이 알려드렸습니다.
업무 특성상 어떤 내용을 개발했는지는 밝히기가 어렵지만 올해 C++ 개발은 저의 현재 수준에서 최선을 다해 진행했습니다. 그럼에도 1년간 C++ 프로그램의 다양한 컴파일 오류와 런타임 오류를 겪으면서, 그리고 미묘하게 복잡한 용례를 배울수록 미국 정부의 C/C++ 사용 지양 권고가 충분히 납득이 되었습니다. 1시간밖에 Rust를 배우지 못했음에도 C++과 비교해봤을 때 Rust는 앞으로도 더욱 세를 넓힐 언어라고 생각합니다. 하지만 현재 제 1회 vim-kr 스프린트 모임에서 오신 Rust 개발자분의 의견을 들어보니 Rust를 제일 좋아하는 개발자도 돈을 버는 프로그래밍 언어는 따로 있다고 하여 세상의 쓴맛을 느꼈습니다.
기타 요소
새롭게 배운 요소와 배우지 못한 요소가 많습니다.
Git
회사의 VCS는 Perforce지만 C++ 개발에서도 Neovim을 사용하기 시작한 이래로 git p4
와 lazygit
을 조합하여 보다 효율적인 개발을 진행했습니다. 종종 파일 작성 권한이 계속 읽기 전용으로 바뀌기는 하지만 p4의 shelve보다 훨씬 편하게 다양한 구현 사항을 git branch로 관리할 수 있어 생산성이 향상되었음을 느꼈습니다. 다만 아직 git의 기초는 제대로 배우지 못하고 적당히 조금씩 찾아가며 활용하고 있습니다. Pro Git도 올해 읽어봐야겠습니다.
Shell script
개발 시 실수하기 너무 쉬운 shell script이지만 shellcheck
과 mug896님의 훌륭한 Bash shell 소개글의 도움을 받아 다양한 상황에서 작성해봤습니다. 24년도 초반에는 Python script랑 결합해 지금까지도 유용하게 사용하고 있는 서버 접속 자동화 스크립트를 제작했습니다. 24월 후반기에는 약 3주 정도 소요되는 테스트를 효율적으로 진행하기 위해 약 6TB 정도의 입력 파일을 병렬화해서 추출 및 remote 서버에 전송한 다음 필요에 따라 복사해서 사용하는 방식을 도입했습니다. 테스트 입력 파일 생성이 생각보다도 오래 걸렸지만 테스트 수행 시간 자체를 약 5배 정도 빠르게 만들었습니다. 이를 수행하기 위해 파일을 인터페이스로 정의한 다음 GNU Parallel, taskset
, at
등을 활용한 스크립트를 여러 개 제작했고, 큰 문제 없이 정상 수행되었습니다. 그 외에도 조그마하지만 도움이 되는 one-liner 코드를 다양하게 활용했습니다.
생산성
VimEnter 2023에서 재열님의 명강연을 들은 후 WezTerm와 tmuxinator에 그대로 입문했습니다. 지금은 WezTerm의 pane은 서버별로, tmuxinator의 window는 작업별로 할당해 관리하고 있습니다. 앞서 언급한 자동화 스크립트에도 tmuxinator를 이용해 세션을 편히 관리할 수 있었습니다.
소프트웨어 공학
약 5주간 소프트웨어 공학 및 거시적 수준에서의 설계에 대한 강도 높은 교육을 받았습니다. 인간은 이렇게까지 집중을 못 할 수 있구나와 인간은 이렇게까지 집중을 잘 할 수 있구나를 깨달은 놀라운 시간이었습니다. ISO/IEC 25010에 기반해 요구사항과 품질 속성을 고려한 아키텍쳐 설계를 수행했습니다. 품질 속성을 요구사항에 부합하는 수준으로 끌어올리기 위해 필요한 설계 결정(decision)이 정말 쉽지 않고 주로 trade-off임을 깨달았습니다.
챙기지 못한 기타 요소
- 개발 서적: CS:APP나 OSTEP 등의 서적을 읽어보려고 했으나 2024년 초의 의욕과는 달리 거의 읽지 못했습니다. 오히려 C++ Reference과 Intel Intrinsic Guide만 잔뜩 읽었습니다.
- 운영체제: OS의 기초도 많이 복습하지는 못했습니다.
- 통신 기술: 업무랑 깊게 관련되어 있는 분야지만 체계적으로 배우기보다는 필요한 지식을 조금씩 더 습득했습니다.
느낀 점
올해는 좋은 일도 있었지만, 회사와 제 파트가 정말 어려운 한 해를 겪었기 때문에 씁쓸한 감정과 깨달음이 계속 머릿속에서 맴돌고 있습니다. 업무 관리와 동기 부여, 그리고 기술적 리딩이 아쉬운 한 해였습니다. 그럼에도 성과가 없는 해는 아니었습니다. 복직 후 부서 적응을 성공적으로 마쳤고, 실질 근무년수로 2년차였음에도 불구하고 많은 부서원을 기술적으로 이끌고 협업하며 업무를 진행할 수 있었습니다. 몰아치는 일을 그나마 효율적으로 하기 위해 반복적인 일을 인식하고 자동화를 위한 스크립트를 생각보다도 많이 만들었습니다. 모두의 일은 아무의 일도 아니라는 말처럼 모두의 우선순위에서 밀리거나 필요성을 인지하지 못하는 일이 종종 생기는데, 여유가 될 때는 테스트 코드 리팩토링, line coverage 증가, C++ code smell 제거 등 조금씩 프로젝트 퀄리티를 보완하려고 했던 기억이 수두룩합니다.
개인 블로그가 저만의 공간이기는 하지만, 이렇게 쓰니 제가 너무 제 자랑만 나열한 느낌입니다. 제가 아직 의사소통, 거시적 그림을 바라보는 능력, 상대가 원하는 내용을 알아채는 능력은 보다 갈고닦을 필요성을 종종 깨달았습니다. 제가 의식적으로 신경쓰면 시간과 경험이 이를 해결해주지 않을까 싶습니다.
2025년의 목표
올해는 목표를 조금 더 유하게 잡아보려고 합니다.
- 한 달에 한 권씩 책 읽기
- 블로그 포스팅 매주 하기
- 생각보다 일을 할 때나 인터넷을 통해 다시 한 번 배워보려는 글이 많이 있어서, 짧게라도 정리할 목적으로 블로그를 활용해보려고 합니다. 이번에는 작심삼일이 되지 않기를 바라면서…
- 아직까지도 배울 때마다 재밌어서 다행입니다.
- 성숙한 사람이 되기
- 부모님께서 어른은 평생 어른이 아니라고 말씀하셨는데 계속 곱씹게 됩니다. 그럼에도 어른이 되려는 자세를 잃어서는 안 되겠습니다.
- 운동 규칙적으로 하기
- 업무도 중요하지만 제 삶이 더욱 중요하다는 지극히 당연한 사실이 때로는 생각이 나지 않습니다. 건강을 챙기기 위해 근력 운동과 유산소를 규칙적으로 하고 있습니다.
- 학문적인 공부 조금 더 하기
- 올해는 Neovim (+ Lua)과 Rust, 그리고 전반적인 소프트웨어 개발자 커리어를 학습해보고자 합니다. 제가 아직도 어떤 개발을 하고 싶은지, 어떤 개발을 할 때 재미를 느끼는지 잘 모르겠습니다.
- 본식 잘 마무리하기
- 2024년부터 결혼을 준비하기 시작했으며, 이제 본식이 몇 달 정도 남았습니다. 힘든 순간이 많았고 앞으로도 (특히 본식 날에) 많겠지만 잘 이겨내야겠습니다.
마치며
올해는 조금 더 모두가 모두를 돌아볼 수 있는 한 해가 되었으면 좋겠습니다. 새해 복 많이 받으세요.