목록으로 돌아가기

GitHub 고스타 저장소의 3분의 1은 2년째 멈춰 있다

2분 소요데이터 분석유지보수

이 글은 기계 번역이며 원어민 검수를 거치지 않았습니다. 원문 보기 →

우리는 스타 1,000개 이상인 GitHub 저장소를 6만 7천 개 넘게 추적하며 상태를 매일 기록합니다. "마지막 push로부터 얼마나 지났는가"로 정렬하면 불편한 숫자가 나옵니다.

마지막 push저장소 수비중스타 중앙값1천 스타당 미해결 이슈
3개월 이내27,19242.9%2,42911.5
3~12개월9,22514.5%1,9839.1
1~2년6,57410.4%1,97510.1
2년 초과20,43832.2%1,7729.0
push 기록이 있는 저장소 63,429개.

약 3분의 1이 2년 넘게 단 한 번의 push도 받지 못했습니다. 최근 3개월 안에 손댄 것은 절반이 안 됩니다.

이 숫자에는 곧바로 두 가지 반박이 따라옵니다. 둘 다 타당합니다. 그러나 둘 다 데이터 앞에서 온전히 살아남지 못했습니다.

반박 1: "그건 다 awesome-list잖아"

직관은 이렇습니다. 큐레이션 목록, 도서 모음, 면접 대비 저장소는 커밋 없이도 스타를 쌓는다. 정체 구간을 부풀릴 뿐 소프트웨어에 대해서는 아무것도 말해주지 않는다.

실제로 존재하는 효과입니다. 프로그래밍 언어가 감지되지 않는 저장소는 활발히 유지보수되는 구간에서 5.0%, 2년 정체 구간에서 10.8%——정확히 두 배입니다. 문서형 언어(Markdown, HTML, TeX, Jupyter)를 더해도 패턴은 같아서 3.4% 대 6.0%입니다.

하지만 둘을 합쳐도 정체 구간의 약 6분의 1에 불과합니다. 나머지 6분의 5는 실제 프로그래밍 언어가 붙은 저장소입니다. 진짜 소프트웨어가 수천 개의 스타를 달고 2년째 방치돼 있다는 뜻입니다.

그중 규모가 큰 것들입니다:

  1. jlevy/the-art-of-command-line161.8k2.1년 침묵
  2. justjavac/free-programming-books-zh_CN117.7k2.0년 침묵
  3. nvbn/thefuck97.6k2.0년 침묵
  4. fighting41love/funNLP81.9k2.2년 침묵
  5. CompVis/stable-diffusion73.2k2.1년 침묵
  6. prakhar1989/awesome-courses69.9k3.2년 침묵
  7. resume/resume.github.com62.9k3.4년 침묵
  8. xingshaocheng/architect-awesome60.8k2.3년 침묵
  9. atom/atom60.8k3.5년 침묵
  10. angular/angular.js58.6k2.3년 침묵

일부는 분명 참고 자료입니다. 그러나 사람들이 지금도 설치해 쓰는 소프트웨어도 섞여 있습니다.

반박 2: "정체는 방치가 아니다. 좋은 소프트웨어는 완성된다"

이쪽이 더 강한 반박입니다. 문제를 제대로 해결한 작고 전문적인 라이브러리는 커밋이 필요 없습니다. 변경이 잦다고 건강한 것이 아니며, 조용한 저장소는 그저 다 만들어진 저장소일 수 있습니다.

다만 그게 전부라면 이슈 트래커에 흔적이 남아야 합니다. 실사용자가 있는 방치된 프로젝트는 아무도 처리하지 않는 이슈를 쌓고, 정말로 완성된 프로젝트는 애초에 이슈를 많이 끌어모으지 않습니다. 따라서 사용자 규모로 정규화한 적체량은 두 그룹에서 확연히 달라야 합니다.

그렇지 않았습니다. 위 표의 마지막 열을 보세요. 1천 스타당 미해결 이슈는 모든 구간에서 9에서 11.5 사이입니다. 활발히 유지보수되는 쪽이 2년 정체된 쪽보다 정규화 후 적체가 오히려 근소하게 많습니다.

이 결과는 예상 밖이었습니다. 두 그룹을 가르려고 넣은 열인데, 가르기를 거부했습니다.

이 평평한 선이 뜻할 수 있는 것

가장 그럴듯한 해석은 방치가 쌍방향이라는 것입니다. 사용자가 이슈를 계속 두드리는 와중에 프로젝트가 조용해지는 일은 드뭅니다. 관심은 양쪽에서 동시에 떠납니다. 메인테이너가 push를 멈출 무렵, 이슈를 냈을 사람들은 이미 다른 것으로 옮겨간 뒤입니다.

"방치된 수천 개 프로젝트와 분노한 사용자들"만큼 극적이지는 않습니다. 하지만 스타 수로 의존성을 고르는 사람에게는 오히려 나쁜 소식입니다. 저장소는 스타가 많고, 눈에 띄게 조용하며, 동시에 바깥에서 보면 고장 나 보이지 않는 상태일 수 있습니다. 불평했을 사람들이 아무 말 없이 떠났기 때문입니다.

이 추론은 조심해서 다뤄야 합니다. 우리가 보는 것은 미해결 이슈 수의 현재 스냅샷 하나이고, GitHub의 이 수치는 PR도 포함합니다. 이슈가 일괄 종료됐는지, 메인테이너가 트래커를 껐는지, 적체가 시간에 따라 어떻게 움직였는지는 알 수 없습니다. 평평한 선은 쌍방향 방치와 모순되지 않을 뿐, 그것을 증명하지는 않습니다.

실무적으로는

스타 수가 기록하는 것은 "한때 몇 명이 북마크할 가치가 있다고 여겼는가"입니다. 지금도 누가 유지보수하는지는 말해주지 않고——이슈 데이터로 보면——지금도 누가 쓰는지에 대해서도 그리 말해주지 않습니다.

스타가 많다는 이유로 의존성을 채택하기 전에 마지막 push 날짜를 보세요. 클릭 한 번이면 되고, 대략 세 번에 한 번은 스타 수와 어긋납니다.

이 데이터가 말할 수 없는 것

  • 표본은 이미 스타 1,000을 넘은 저장소이지 GitHub 전체가 아닙니다. 여기의 어떤 결론도 "전형적인 저장소"를 설명하지 않습니다.
  • pushedAt은 임의 브랜치로의 push를 셉니다. 자동 커밋도 포함되므로 생존 신호일 뿐 유의미한 작업량의 척도가 아닙니다.
  • 미해결 이슈 수에는 PR이 포함되며, 이력이 아니라 단일 현재 스냅샷입니다.
  • 언어 분류는 GitHub 자체 감지를 따르며, 파일 바이트 구성으로 정해지기에 예상 밖의 라벨이 붙을 수 있습니다.
  • 또한 4,123개는 사용 가능한 push 시각 기록이 없어 위 어떤 구간에도 들어가지 않습니다.

표는 매일의 크롤링과 함께 갱신됩니다. 같은 말뭉치를 랭킹에서 직접 정렬해 볼 수도 있습니다.

이 글의 모든 수치는 데이터베이스에서 실시간으로 읽어오며 매일 갱신됩니다.