Hành trình tò mò của một nhà phát triển để tìm ra gói npm có số phiên bản lớn nhất đã khám phá ra những quy luật thú vị về cách các gói JavaScript được đánh phiên bản. Điều bắt đầu như một quan sát đơn giản về phiên bản 3.888.0 của AWS SDK đã trở thành một phân tích toàn diện hơn 2,1 triệu gói npm.
Quy mô phân tích:
- Tổng số gói npm được phân tích: 2,129,832
- Thời gian thu thập dữ liệu: ~12 giờ
- Số lượng yêu cầu API thực hiện: Vài triệu
- Kích thước batch sử dụng: 50 yêu cầu đồng thời
- Xem xét giới hạn tốc độ: Cho phép 5 triệu yêu cầu mỗi tháng
Người chiến thắng: Một công cụ WhatsApp với những con số đáng ngạc nhiên
Phân tích cho thấy một gói có tên wa-version từ wppconnect-team giữ kỷ lục với phiên bản 1.0.19494. Công cụ này là một phần của bộ công cụ được thiết kế để tương tác với API của WhatsApp, và số phiên bản cao của nó xuất phát từ một cuộc chiến kỹ thuật đang diễn ra. Gói này nhận được các cập nhật thường xuyên khi Meta liên tục sửa đổi WhatsApp để ngăn chặn truy cập API trái phép, dẫn đến một chu kỳ liên tục của các bản sửa lỗi và vá lỗi.
Lưu ý: wppconnect-team đề cập đến các nhà phát triển tạo ra công cụ để kết nối với WhatsApp theo cách lập trình
Top 5 số phiên bản cao nhất được tìm thấy:
- wa-version: 1.0.19494
- all-the-package-names: 2.0.18806
- carrot-scan: 0.0.27708 (trình quét lỗ hổng bảo mật)
- latentflip-test: 1.0.12345 (gói thử nghiệm)
- aws-sdk: 2.1692.0 (xếp hạng 46 tổng thể)
BigQuery cung cấp con đường đơn giản hơn
Cộng đồng nhanh chóng chỉ ra rằng quá trình tốn công sức này để thu thập dữ liệu từ API của npm có thể được tránh hoàn toàn. Dịch vụ BigQuery của Google cung cấp các bộ dữ liệu công khai cho cả npm và PyPI (kho lưu trữ gói của Python), làm cho việc phân tích như vậy trở nên đơn giản hơn nhiều. Một truy vấn tương tự trên dữ liệu PyPI cho thấy các gói Python thể hiện việc đánh phiên bản cực đoan hơn, với một số gói đạt đến những con số thiên văn thông qua các quy trình phát hành tự động.
So sánh với các Trình quản lý Gói khác:
- PyPI (Python): Người chiến thắng là " elvisgogo " với số phiên bản cực kỳ cao
- Julia General Registry: Cao nhất là DiffEqBase tại 6.189.1 (phiên bản thận trọng hơn)
- CPAN (Perl): Gói Acme-Boom đạt 3,735,928,560
- Tiêu chí lọc npm: Chỉ bao gồm các gói có phiên bản ngữ nghĩa (định dạng x.y.z)
Phương pháp luận đằng sau sự điên rồ
Nhà nghiên cứu đã dành khoảng 12 giờ để lấy dữ liệu từ registry của npm, xử lý các gói theo từng lô để tránh làm quá tải API. Phân tích tập trung cụ thể vào các gói tuân theo semantic versioning (định dạng chuẩn x.y.z) và loại trừ các gói dường như sử dụng ngày tháng hoặc các sơ đồ đánh phiên bản không chuẩn khác. Cách tiếp cận lọc này đảm bảo kết quả phản ánh sự tiến triển phiên bản thực sự thay vì việc đánh số tùy ý.
Tự động hóa thúc đẩy lạm phát phiên bản
Kết quả tiết lộ một xu hướng thú vị trong phát triển phần mềm hiện đại. Nhiều gói có phiên bản cao nhất không nhất thiết là những gói được phát triển tích cực nhất về mặt tính năng. Thay vào đó, chúng thường đại diện cho các hệ thống tự động đã trở nên điên cuồng - máy quét bảo mật cập nhật cơ sở dữ liệu lỗ hổng, bot phụ thuộc tạo ra các bản phát hành tự động, hoặc các công cụ phản ứng với những thay đổi API bên ngoài. Gói chia động từ tiếng Tây Ban Nha được đề cập trong các thảo luận cộng đồng minh họa điều này, đã xuất bản khoảng 240 bản phát hành hàng tháng do việc tự động tăng phiên bản.
Lưu ý: Semantic versioning sử dụng ba số (major.minor.patch) để chỉ ra các loại thay đổi khác nhau
Một cửa sổ nhìn vào sự hỗn loạn quản lý gói
Cuộc điều tra này làm nổi bật cả quy mô và những điều kỳ quặc của hệ sinh thái npm. Với hơn 2,1 triệu gói và hàng tỷ lượt tải xuống hàng tháng, npm đã trở thành một phần quan trọng của cơ sở hạ tầng phát triển web. Tuy nhiên, phân tích cũng tiết lộ những thực hành đáng lo ngại, chẳng hạn như các gói có tên giống hệt nhau chỉ khác nhau về viết hoa và các công cụ có thể vi phạm điều khoản dịch vụ của các nền tảng như WhatsApp.
Nghiên cứu cho thấy cách các quy trình tự động và hệ thống tích hợp liên tục có thể dẫn đến lạm phát số phiên bản không nhất thiết phản ánh sự phát triển phần mềm có ý nghĩa. Trong khi phiên bản 19.494 có thể nghe có vẻ ấn tượng, nó thường đại diện cho đầu ra cơ học của các script thay vì 19.494 cải tiến riêng biệt cho phần mềm.
Tham khảo: Which npm package has the largest version number?