Rust 재단의 Maintainer Fund 논의를 계기로, Rust 프로젝트에서 ‘유지보수’와 ‘유지보수자(maintainer)’가 무엇을 의미하는지 살펴본다.
최근 Rust 재단은 Rust 프로젝트 유지보수자를 지원하는 것을 목표로 하는 Rust Foundation Maintainer Fund를 발표했습니다. 우리는 현재 재단과 협력하여 이 기금의 가이드라인—예를 들어 어떤 종류의 일을 지원할지, 어떤 방식으로 지원 대상을 선정할지 등—을 정의하고 있습니다. 이 과정에서 반복해서 등장하는 질문이 하나 있습니다. 정확히 누가 유지보수자이며, 어떤 작업이 유지보수로 간주될 수 있을까? 이 글은 그 질문에 답하는 데 도움이 될 만한 몇 가지 관찰을 제시합니다.
위키피디아는 소프트웨어 유지보수를 “배포 이후의 소프트웨어 수정(modification of software after delivery)”으로 정의하지만, 이는 오픈소스나 Rust에서의 유지보수 방식과는 잘 맞지 않습니다. Rust는 한 번 배포한 뒤 ‘유지보수 모드’로 전환되는 단일 시점이 없습니다. 우리는 매일 새로운 Rust nightly 버전을 내고, 6주마다 새로운 stable 버전을 배포합니다. 또한 누군가 컴파일러에 풀 리퀘스트를 올리면 분명 코드를 ‘수정’하는 것이지만, Rust에 대한 기여를 얼마나 소중히 여기든 그것만으로 그 사람이 곧바로 유지보수자가 되는 것은 아닙니다. 대신, Rust 프로젝트에서 우리가 이해하는 유지보수가 무엇인지 설명해 봅시다.
“maintain(유지하다)”라는 단어를 문자 그대로, 즉 어떤 것을 긴 시간 동안 특정한(바라건대 제대로 동작하는) 상태로 유지하는 것으로 해석할 수 있습니다. 그리고 이것은 실제로 유지보수자가 하는 일의 큰 부분입니다. 그들은 오늘 잘 동작하는 것들이 내일도 계속 잘 동작하도록 보장합니다. 소프트웨어 프로젝트가 제대로 동작하지 않게 되는 방식은 매우 많기 때문에, 이 작업은 자연스럽게 매우 다양합니다. 여기에는 이슈 트리아지(issue triage), 버그 조사 및 수정, CI 실패 대응, 보안 사고 대응, 성능 회귀(regression) 해결, 의존성 업데이트, 문서 최신화 확인 등 수많은 활동이 포함됩니다.
이런 종류의 ‘청소부(janitorial)’ 작업은 여러 이유로 상당히 어렵습니다.
위에서 설명한 유지보수 활동은 소프트웨어 프로젝트가 계속 동작하게 만들기 위해 필요합니다. 하지만 보통 우리가 필요한 것은 그것이 전부 가 아닙니다. 대부분의 소프트웨어 프로젝트는 시간이 지남에 따라 진화 해야 하며, Rust도 예외가 아닙니다. 이는 보통 새로운 기능을 추가하고 개선을 이루는 것을 의미합니다. 언어, 컴파일러, 표준 라이브러리, 툴링 등을 개선하면 일부 Rust 사용자에게 막혀 있던 문제가 풀릴 수 있고, 이는 훌륭한 일입니다. 하지만 덜 분명한 점은, 이러한 새 기능을 구현하는 기여자들부터 먼저 막힌 것을 풀어줘야 하는 경우가 많다는 사실입니다!
누군가 새 기능 구현을 시작하기도 전에, 해당 코드베이스 영역에 정통한 사람에게 ‘분위기 체크(vibe check)’를 받거나, 구현 접근 방식에 대한 조언을 구하고 싶어 하는 경우가 많습니다. 또한 어떤 기능은 구현 전에 복잡한 리팩터링이 선행되어야 합니다. 그리고 새 기능을 담은 풀 리퀘스트가 제출되면, 누군가는 이를 리뷰해야 합니다. 심지어 풀 리퀘스트가 머지된 이후에도, 새로운 기술 부채(technical debt)를 만들어낼 수 있으며, 이는 언젠가 정리해야 합니다.
하지만 다양한 개선의 진척을 돕는 것은 리팩터링과 코드 리뷰만이 아닙니다. 새 기능 자체를 구현하는 일도, 그 기능에 의존하는 다른 기능을 추가하려는 많은 기여자들의 길을 열어 줄 수 있습니다.
이 모든 것 역시 유지보수자가 하는 일의 또 다른 부분입니다. 그들은 새 변경을 더 쉽게 반영할 수 있도록 코드베이스를 지속적으로 개선하고, 풀 리퀘스트를 리뷰하며, 다른 기여자들과 소통하고 멘토링합니다. 이 작업은 끊임없이 진화하는 코드베이스의 장기적 건강을 보장하는 데 매우 중요합니다. 또한 이는 강력한 2차 효과(second-order effect)를 가집니다. 다른 Rust 기여자들의 막힌 부분을 풀어 주면, 새로운 기능과 개선이 더 빠르고 더 자주 반영될 수 있고, 이는 다시 Rust 사용자의 삶을 개선하고 막힘을 풀어 주며, 긍정적인 피드백 사이클로 이어집니다. 이는 모두에게 강한 이점을 주는 ‘곱셈 효과(multiplicative effect)’입니다!
이러한 enablement 작업은 물론 코드베이스에 대한 깊은 지식이 필요하지만, 복잡한 리팩터링을 수행하기 위한 장기적인 집중력과 수많은 풀 리퀘스트를 꾸준히 리뷰할 수 있는 끈기도 요구합니다.
위의 관찰을 바탕으로, 유지보수자란 소프트웨어 프로젝트가 계속 동작하도록 지속적으로 보장하는 사람이면서, 다른 기여자들이 프로젝트를 진화시키고 개선할 수 있도록 돕는 어렵고(그리고 종종 보이지 않는) 작업을 많이 수행하는 사람이라고 말할 수 있을 것입니다.
이는 우리가 (제안된) Rust 재단 Maintainers’ Fund 같은 노력으로 추가적인 지원이 필요하다고 보는 작업의 몇 가지 예시입니다. 우리는 유지보수자의 일을 Rust 프로젝트에 ‘곱셈 효과’를 내는 일로 봅니다. 또한 비슷한 곱셈 효과를 내는 다른 종류의 작업을 지원하는 데에도 관심이 있습니다.
아마도 유지보수 작업이 쉽지 않다는 점은 이미 짐작하셨을 것이고, 어쩌면 그것이 ‘영구적인 불균형’이 존재하는 이유 중 하나일지도 모릅니다. 오픈소스에 기여하고 싶어 하는 사람은 종종 많습니다. 개선을 만들고 새 기능을 구현하는 일은 재미있게 느껴지는 경우가 많고, 새 기능 구현은 매우 눈에 띄는 성취이기도 하며, 누군가의 필요를 충족하거나 자랑할 만한 명확한 결과물을 제공하기도 합니다. 하지만 코드베이스를 지속적으로 유지보수하려는 사람은 훨씬 적습니다(특히 보수가 없다면!). 좋은 유지보수의 결과는 훨씬 입증하기 어렵고, ‘순수한 재미’라기보다 ‘일’에 더 가까워 보이는 경우가 많기 때문입니다.
유지보수자가 되는 것은 도전적이지만, 유지보수자가 되는 과정 은 더 어렵습니다. 코드베이스의 일부에 대한 깊은 전문성을 얻는 것뿐 아니라, 다른 유지보수자와 기여자들의 신뢰를 얻는 데도 시간이 필요하기 때문에, 하룻밤 사이에 유지보수자가 되는 것은 사실상 불가능합니다. 그 과정에서 많은 사람들이 별로 하고 싶어 하지 않는 일을 꾸준히 해내야 하기도 합니다.
우리는 Rust 프로젝트에 훌륭한 유지보수자들이 매우 많다는 사실이 정말 기쁩니다. 그들은 Rust가 매일 더 나아지도록 하기 위해 혼신을 다하고, 특정 Rust 프로젝트의 전문가가 되기 위해 막대한 시간을 투자함으로써 그것들을 효과적으로 유지보수할 수 있게 됩니다. 그러나 그 유지보수자들 중 많은 이들이 자원봉사자이며, 생계를 위해 다른 일을 해야 하는 사람에게 유지보수 부담이 과도하게 쏠리면 번아웃으로 이어질 수 있습니다. 우리는 이를 막고자 합니다.
오픈소스 유지보수를 하는 사람들은 그에 대한 지원과 보상을 받을 자격이 있으며, 바로 그 지점에서 유지보수자 펀딩이 중요해집니다. 우리는 다양한 Rust 프로젝트 코드베이스를 유지보수하는 사람들을 지원할 수 있는 메커니즘을 찾고 있으며, 그것이 안정성을 제공하고 그들이 가장 잘하는 일—Rust를 개선하는 일—에 집중할 수 있게 하기를 바랍니다. 또한 그들의 훌륭한 작업(그렇지 않으면 종종 거의 보이지 않는)을 널리 알리고자 합니다. 이는 그들에게 자부심을 줄 뿐 아니라, 이 중요한 작업에 대한 더 많은 지원과 자금을 끌어들이는 데도 도움이 됩니다. Rust Foundation Maintainer Fund 및 유사한 다른 이니셔티브와 함께, 우리는 Rust 유지보수의 장기적 지속 가능성을 개선하기를 바랍니다. 더 많은 업데이트를 기대해 주세요.