Deforking the World of Code: A Project-Provenance Map that Recovers Cross-Forge Fork Families that Platform Graphs Cannot See
이 논문은 공유된 git 히스토리를 통합된 클러스터로 붕괴시킴으로써 교차 포크 프로젝트 패밀리를 재구성하는, 월드 오브 코드(World of Code)를 위한 큐레이션된 "디포킹(deforking)" 지도를 소개하며, 이를 통해 인기 인플레이션을 바로잡고 플랫폼 특정적 그래프에는 보이지 않는 멀티 포크 패밀리와 비-GitHub 루트를 포함한 수천 개의 포크 관계를 드러낸다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
소프트웨어 개발의 전체 역사를 거대하고 혼란스러운 도서관이라고 상상해 보십시오. 이 도서관에는 수백만 권의 책(저장소)이 있습니다. 하지만 여기에는 함정이 있습니다. 많은 책이 동일한 원래 이야기를 복사한 복사본이라는 점입니다.
코딩의 세계에서 이것을 **포크(forking)**라고 부릅니다. 개발자가 기존 프로젝트를 가져와 복사한 뒤 자신만의 버전을 시작하는 것입니다. 그들은 코드를 몇 줄 수정할 수도 있지만, 핵심 역사는 동일합니다.
이 논문이 다루는 문제는, 만약 도서관에 있는 모든 책을 세어서 특정 코드의 "인기"를 측정하려 한다면, 숫자가 터무니없이 부풀려진다는 것입니다. 만약 하나의 인기 있는 이야기가 10,000번 복사되었다면, 실제로는 하나의 이야기가 10,000개의 서로 다른 장소에서 읽히고 있는 것임에도 불구하고, 마치 10,000개의 서로 다른 이야기가 읽히고 있는 것처럼 보이게 됩니다.
이 논문은 이 도서관을 정리해 주는 새로운 지도(map)(도구)를 소개합니다. 이 지도는 모든 복사본을 원래의 소스와 다시 하나로 묶어줌으로써, 연구자들이 복사본이라는 노이즈가 아닌 실제 이야기를 볼 수 있게 해줍니다.
그들이 이 작업을 수행한 방법은 다음과 같습니다. 쉬운 비유를 사용하겠습니다.
1. "공유 페이지" 탐정
저자들은 디지털 세계에서는 역사를 쉽게 조작할 수 없다는 점을 깨달았습니다. 만약 두 권의 책이 정확히 같은 페이지(특정 "커밋" 또는 코드의 변경 사항)를 공유한다면, 그 책들은 반드시 서로 연관되어 있습니다.
- 과거의 방식: 그들은 공유된 페이지가 있는 모든 책을 연결하려고 시도했습니다. 하지만 이것은 "두 권의 책에 모두 'Copyright 2024'라는 페이지가 있다면, 그것은 같은 이야기다"라고 말하는 것과 같았습니다. 이는 틀린 방식입니다! 서로 관련 없는 많은 책이 동일한 저작권 페이지를 가질 수 있기 때문입니다. 이 방식은 서로 관련 없는 완전히 다른 이야기들을 하나의 거대하고 엉망인 덩어리로 뭉쳐버리는 문제를 일으켰습니다.
- 새로운 방식: 그들은 더 똑똑한 지도를 만들었습니다. 그들은 단 하나의 페이지가 아니라, 많은 공유 페이지를 찾았습니다. 만약 두 권의 책이 한 챕터 전체를 공유한다면, 그들은 확실히 연관되어 있습니다.
2. "크기 제한" 필터 (캡)
더 똑똑한 지도가 있더라도, 어떤 거대하고 지루한 페이지들(예: 표준 라이선스 계약이나 빈 스타터 템플릿)은 여전히 서로 관련 없는 이야기들을 연결하는 다리 역할을 했습니다.
- 해결책: 저자들은 이러한 다리에 크기 제한을 두었습니다. 만약 공유된 페이지가 250권 이상의 책에서 나타난다면, 그것은 일반적인 템플릿(예: 표준 이용 약관 페이지)이라고 가정하고 무시합니다.
- 결과: 이 작업은 거대하고 엉망인 덩어리들을 분리해 냈습니다. 갑자기 지도는 하나의 거대하고 혼란스러운 슈퍼 클러스터 대신, 뚜렷한 이야기의 가족들을 보여주었습니다. 이것은 실제 가족들을 해체한 것이 아니라, 서로 관련 없는 것들을 붙여놓았던 접착제를 제거한 것뿐이었습니다.
3. "실제 역사" 검증
저자들은 이 거대한 덩어리들을 잘라냄으로써, 자연스럽게 여러 부분으로 나뉘어 존재할 수 있는 실제의 복잡한 이야기(예: 하나의 이야기가 여러 언어로 번역된 후 다시 결합되는 경우)를 실수로 잘라버릴까 봐 걱정했습니다.
- 테스트: 그들은 지도에서 남은 가장 큰 그룹을 조사했습니다. 그 결과, 그것은 실수가 아니었습니다. 그것은 하나의 큰 프로젝트가 다른 유명한 프로젝트의 일부를 진정으로 흡수한, 실제의 복잡한 이야기였습니다(예: 주요 운영 체제가 웹 브라우저의 코드를 통합하는 경우).
- 결정: 이 "잔여(residual)" 그룹은 단순한 접착제가 아니라 실제의 깊은 역사를 담고 있었기에, 저자들은 이를 더 이상 자르지 않기로 결정했습니다. 그것은 소프트웨어 세계의 진정한, 복잡한 관계를 나타내므로 그대로 두기로 했습니다.
4. "공식 목록"과의 대조
지도의 정확성을 확인하기 위해, 그들은 GitHub의 공식 "포크 목록"(사용자가 수동으로 "Fork" 버튼을 클릭하여 만든 목록)과 비교했습니다.
- 일치도: 그들의 지도와 GitHub 목록에 모두 존재하는 프로젝트들을 확인했을 때, **99%**의 일치율을 보였습니다.
- 놀라운 발견: 그들의 지도는 GitHub 목록이 놓친 것들을 찾아냈습니다!
- 교차 포지 패밀리 (Cross-Forge Families): 그들은 GitHub에서 시작되었지만 GitLab, Bitbucket 및 다른 사이트로 복사된 프로젝트들의 가족을 찾아냈습니다. GitHub의 목록은 GitHub 측면만 보지만, 이 지도는 인터넷 전체의 전체 가계도를 봅니다.
- 분리된 포크 (Detached Forks): 그들은 복사본으로 시작했지만 이후 역사를 완전히 새로 써서 더 이상 원본과 연결되지 않은 프로젝트들을 찾아냈습니다. 지도는 이를 별개의 엔티티로 정확히 식별해 냈으며, 공식 목록은 여전히 연결되어 있다고 생각할 수 있는 부분입니다.
5. 이것이 왜 중요한가
이 지도 이전에는, 만약 어떤 프로그래머가 얼마나 많은 프로젝트에 참여했는지 알고 싶다면, 그가 인기 있는 프로젝트 하나에서 파생된 5,000개의 복사본 때문에 인해 "5,000개의 프로젝트"라는 가짜 숫자를 얻게 될 수도 있었습니다.
- 교정: 이 지도는 이를 해결합니다. 이 지도는 그 프로그래머가 5,000개의 프로젝트가 아니라 실제로 5개의 뚜렷한 프로젝트에서 일했다는 것을 알려줍니다.
- 결과: 이는 소프트웨어 세계에 대한 깨끗하고 정확한 관점을 제공하며, 원래의 이야기와 복사본을 구분하고, 심지어 여러 웹사이트에 걸쳐 있는 이야기까지 포착해 냅니다.
요약하자면: 저자들은 복잡하게 얽힌 코드의 그물을 풀어내는 도구를 만들었습니다. 그들은 관련 없는 프로젝트들이 서로 붙어 있는 것을 막기 위해 "크기 제한"을 사용했고, 공식 기록과 대조하여 작업을 검증했으며, 소프트웨어 세계가 우리가 이전에 알았던 것보다 훨씬 더 다양한 웹사이트를 가로질러 서로 연결되어 있다는 사실을 발견했습니다. 그들은 이 지도를 누구나 사용할 수 있도록 공개하여, 향후 소프트웨어 역사를 연구할 때 엄청난 양의 복사본에 속지 않도록 보장했습니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.