현대 포지의 문제점과, 더 작은 단위의 호스팅·유연한 코드 리뷰·오프라인 친화적 워크플로를 갖춘 이상적인 새 포지에 대한 구상.
내 친구와 나는 우리가 부자라면 뭘 할지 이야기하는 게임을 한다. ‘주택담보대출을 다 갚은’ 정도의 부자가 아니다. 한 번도 안에 들어가 본 적 없는 잠수함을 소유한 남자 같은 부자다. 세 번째 아내가 스킨케어 브랜드를 갖고 있는 남자 같은 부자다. 기술 재벌급 부자 — 와이오밍에 대저택을 사고 의회 청문회에 같은 회색 티셔츠를 입고 나갈 자신감까지 살 수 있는 종류의 돈 말이다.
내 경우, 오랫동안 그중 하나는 새로운 포지를 만드는 꿈이었다. Ghostty가 GitHub를 떠난다는 훌륭한 글을 읽고 이 글을 쓰게 되었지만, 사실 이건 몇 년 동안 내가 글로도 쓰고 말로도 해 왔던 주제다. GitHub가 자기 핵심 업무를 이렇게까지 못하게 된 상황을 생각하면, 내가 억만장자라면 벌일 포지판 허영이 어떤 모습일지 적어 보는 건 꽤 재미있는 기회처럼 보였다. 이 허영에는 나이 든 유명인들로 가득 찬 남근형 로켓은 좀 덜 들어갈 것이다.
GitHub, GitLab, Gitea(내가 가장 많이 써 본 세 가지)는 사실상 모두 같은 설계를 기반으로 하고 있다. 차이는 있지만, GitHub가 업계의 패턴을 정하고 그 기능들이 성공 정도만 다르게 나머지 둘로 이식된다는 건 분명히 보인다. 포지 안의 거의 모든 것은 git과 별 관계가 없어서, 클라이언트는 실제 사용 방식과 완전히 분리되어 버렸다.
Git은 자신이 설계된 일을 하는 데는 아주 훌륭하지만, 그 설계 목적이 대부분의 사람들이 사용하는 방식과는 다르다. Git은 커널 개발에는 완벽한 도구다. 이메일로 패치를 메인테이너에게 보내는 아이디어에 의존하는 탈중앙화된 분산 버전 관리 시스템이다. 당신은 그 메인테이너들이 자기 영역을 유지 하고, 말이 되는 것은 머지하고 그렇지 않은 것은 머지하지 않을 것이라고 신뢰한다. 이는 꽤 높은 신뢰를 전제로 하는 환경이며, 특정 기여자가 얼마나 자주 온라인인지, 어떤 시스템을 쓰는지에 대해 거의 제약을 두지 않는다. 2010년산 노트북을 쓰고 일주일에 한 번만 인터넷에 연결하더라도 이런 워크플로에서는 여전히 프로젝트에 의미 있게 기여할 수 있다.
하지만 대부분의 직장에서 git은 사실상 포지에 저장된 중앙 저장소에서 pull하고 push하는 방식일 뿐이다. 중요한 일은 모두 포지 안에서 벌어지고, 그중 내 클라이언트에서 일어나는 것은 거의 없다. Pull Request는 내가 4안 원칙을 강제하는 방식이고, GitHub Actions는 그 Pull Request들에서 테스트와 린팅을 실행해 그것들이 제대로 동작하고 조직의 요구사항을 충족하는지 확인하는 방식이다. 그 포지와의 관계 속에서 정의되는 사용자 신원은 내가 그들이 누구인지 검증하는 방식이다. 나는 코드 관련 이슈를 Issues로 추적하고, 사용자가 내려받을 수 있는 릴리스를 Releases로 만든다. 이 워크플로에는 git다운 부분이 별로 없다. 대부분이 git 위에 얹혀 있다.
그러니 우리가 클라이언트가 실제로 뭘 하는지 그다지 신경 쓰지 않는다면, git에 묶여 있을 이유도 없다. 사실상 그 제약에서 자유롭기 때문이다. 새 포지를 만든다면 나는 그것이 다음과 같은 일을 하길 원한다. 가능하다면 클라이언트와 함께 설계되어 이런 것들을 더 잘 드러내도록 말이다.
일이 잘못된 순서로 일어난다. 그 PR 알잖은가. 커밋 1: 'Feature.' 커밋 2: 'fix.' 커밋 3: 'fix.' 커밋 4: 'actually fix.' 커밋 5: 'please.' 그리고 목요일 밤 11시 47분에 만들어진 커밋 6: 'asdfasdf'. 이 사람에게는 가족이 있다. 이 사람에게는 취미가 있다. 이 사람은 지금 이 순간 울고 있다. 피드백 루프는 커밋 이후 가 아니라 그 이전 에 있어야 한다. 포지에서 원격으로 작업을 실행하고, 사용자가 push하기 전에 피드백을 제공하는 강제 pre-commit hook을 두게 해 달라.
PR 승인 방식이 지나치게 이진적이다. PR은 승인되거나 승인되지 않거나 둘 중 하나다. 진짜 코드 리뷰는, 진짜 삶처럼, 그 중간 지대에 산다. ‘그래, 뭐, 나중에 처리하자’는 정당한 인간적 반응이고, 정당한 버튼이어야 한다. Gerrit는 이 부분에서 더 나은 모델을 갖고 있다. 내가 메인테이너로서 뭔가를 약하게 승인했다면, 나중을 위해 플래그를 달 수 있게 해 달라.
PR은 지나치게 경직되어 있다. 모든 변경에 4안 검토가 필요한 건 아니다. 특히 LLM이 존재하는 세상에서는 더 그렇다. 시니어 엔지니어들이 네 줄짜리 PR을 바라보며 누군가 — 정말 아무나 — 'LGTM'이라고 입력해 주길 기다리느라 매년 잃는 전 세계 GDP는 달 탐사 계획 하나쯤은 충분히 댈 수 있을 것이다. 그것도 꽤 괜찮은 걸로. 다리 뻗을 공간까지 있는 걸로. 이걸 내가 더 쉽게 커스터마이즈하고 제어할 수 있게 해 달라. 그 사람이 메인테이너이고 LLM이 저위험/무위험이라고 하면 그냥 통과시키자.
Stacked PR이 그냥 더 낫다. 검토하기도 이해하기도 더 쉽다. 이건 VCS 외부 도구를 통한 덧붙임 기능이 아니라 일급 시민이어야 한다.
포지가 모든 걸 다 해서는 안 된다. 이슈 추적은 그렇다 치자. 칸반 보드는 아마 아닐 것이다. 위키? 글쎄다. 만능 도구는 결국 다 엉망이 된다. 기능을 추가하기 쉬울 때 기능을 추가하고, 그다음에는 채택률과 무관하게 그 기능들의 유지보수 비용을 영원히 지불하게 된다. 이제 어디선가 누군가가 그 기능을 쓰고 있고, 당신은 거기에 묶여 버리기 때문이다.
호스팅의 표준 단위가 너무 크다. GitHub Enterprise를 운영하는 건 큰일이다. GitLab을 돌리는 것도 역시 비교적 큰 부담이다. 이런 제품들은 복잡하고 움직이는 부품이 많다. 나는 더 작은 개별 호스팅 단위들을 원하고, 그것들을 연결해서 하나의 조직을 만들고 싶다. 전역적으로 연합되지 않아도 괜찮고, 조직마다 계정을 따로 만들어야 해도 괜찮다. 하지만 조직은 “이 라즈베리 파이 12대가 내 조직이다”라고 말할 수 있을 만큼은 유연해야 한다. 그것들이 어떻게 안전하게 통신하는지는 모르겠다. 그건 그 문제를 풀 사람을 고용하면 된다.
내 로컬 저장소 사본은 코드만이 아니라 전체 저장소를 표현해야 한다. 내가 코드를 체크인할 때 쓰는 같은 VCS로 PR도 승인할 수 있어야 한다. 로컬 파일을 훑어보며 이슈도 살펴볼 수 있어야 한다.
반대로, 팀과 제대로 일하려면 어차피 늘 온라인이어야 하니 저장소 비용까지 늘 내게 떠넘기지 말라. 나는 VCS와 포지가 함께 동작하길 원한다. 저장소를 clone하면, 그 시점에서는 꽤 제한된 히스토리만 받고 싶다. 그리고 내가 시간을 거슬러 올라가기 시작하면, 그때 필요할 때 VCS에서 그 내용을 가져오는 워커를 띄우면 된다. 언젠가 전체 프로젝트의 전체 히스토리로 포지를 재구축해야 할지도 모른다는 가정 때문에, 거대한 clone 요청으로 포지를 계속 두들길 필요는 없다.
Actions는 서명 가능해야 하고, SHA가 있어야 하며, 오프라인에서도 쓸 수 있어야 한다. 원한다면 모든 action의 tarball을 받아 저장소에 넣고, 시스템에 “checkout action 찾으러 어디 가지 마, 여기 있잖아”라고 말할 수 있어야 한다. 내가 latest라고 말하면, 지금 Dependabot이 하듯 최신 tarball을 저장소에 넣는 PR을 열어 주는 식으로 동작해야 한다. Actions는 중요하고, 원한다면 같은 VCS를 통해 내 로컬 머신에서도 실행 가능해야 한다.
물론이다. 이런 것들의 일부를 해 주는 도구는 많다. 나는 누군가가 그것들을 가져다가, 전부 합치고, 제대로 맞춰 끼워 주길 원한다. 나는 VCS로 JJ를 원하고, 포지로는 이런 것을 원하며, 사용자로서 내가 라즈베리 파이를 포지로 두고도 오랫동안 행복하게 살 수 있으리라는 기대를 원한다. 그리고 그런 포지들이 객체 스토리지, 얕은 clone, LLM 봇들의 끊임없는 두들김 같은 현대적 개념을 중심으로 설계되길 원한다.
이제 GitHub가 일을 잘하고 있는 세계였다면, 나는 이걸 굳이 써 보지도 않았을 것이다. GitHub는 기본값이고, 사람들에게 기본값을 극복하자고 이야기하는 건 대개 시간 낭비다. Heinz는 기본 케첩이고, 내가 Coke를 주문했을 때 Pepsi는 원하지 않으며, 2026년까지 포지를 써야 한다면 모두가 쓰는 것을 고르지 않을 엄청난 이유가 있어야 한다. 최근까지만 해도 다른 포지들은 고구마 프렌치프라이 같았는데, 다시 말해 실제로 원하는 바로 그건 아니었다.
하지만 우리는 거대한 단일 포지가 무너지고 있는데도 아무도 그 대체물을 만들지 않은 세계에 살고 있다. 돈 있는 사람들은 로켓에 바쁘다. 취향 있는 사람들은 본업에 바쁘다. 그리고 나머지 우리는 한밤중에 'asdfasdf'라는 제목의 PR을 열고, 로봇이 그걸 검사해 주길 기다리며, 우리 노동 인생 대부분을 보내는 그 도구가 도대체 언제부터 우리를 위해 만들어지지 않게 되었는지 궁금해하고 있다.
언젠가 내가 잠수함 살 돈이 생기면, 알려 주겠다.