- vụ việc left-pad là một ví dụ tiêu biểu cho thấy xung đột giữa quy tắc và giá trị trong cộng đồng mã nguồn mở, NPM và các doanh nghiệp
- Quyết định xóa gói không xuất phát từ lý trí, cơn giận hay lòng tham, mà là hành động bắt nguồn từ sự chân thành và các nguyên tắc nội tâm
- Trong bối cảnh NPM phá vỡ chính các quy tắc của mình khi nhượng bộ yêu cầu từ Kik Messenger, tác giả đã chọn xóa toàn bộ các gói của mình
- Sau sự việc, đam mê dành cho mã nguồn mở đã thay đổi, và sự quan tâm chuyển sang những lĩnh vực mới như kinh doanh, marketing và vận hành đội ngũ
- vụ việc left-pad trở thành dịp để các lập trình viên và giới startup suy ngẫm lại về bản chất của mã nguồn mở và tính phức tạp của việc ra quyết định
Bối cảnh sự việc và quyết định
- Ở thời điểm đã 8 năm trôi qua kể từ vụ việc left-pad, tác giả chia sẻ trải nghiệm và suy nghĩ cá nhân của mình
- Vào thời điểm đó, ông dành phần lớn thời gian giữa thiên nhiên, nơi không có sóng liên lạc để tự nhìn lại bản thân, và quyết định xóa gói cũng được đưa ra trong quá trình này
- Quyết định này không bắt nguồn từ phán đoán logic, cơn giận hay lòng tham, mà từ nguyên tắc bên trong của bản thân, tức niềm tin rằng: "Nếu NPM phá vỡ các quy tắc của chính họ, thì tất cả các gói của tôi cũng nên bị xóa"
- Thay vì là một người theo "chủ nghĩa quy tắc" cứng nhắc, đó là thái độ coi trọng tinh thần của quy tắc hơn bản thân quy tắc
- Trong tình huống các doanh nghiệp như Kik Messenger đe dọa cộng đồng mã nguồn mở và sử dụng quyền lực, NPM đã phớt lờ các quy tắc do chính mình đặt ra và ưu tiên lợi ích doanh nghiệp
Cấu trúc xung đột giữa NPM và cộng đồng
- Tác giả không sợ những lời đe dọa từ Kik, nhưng NPM lại sợ mất Kik
- Việc diễn giải sự việc một cách đơn giản là "một người đàn ông tức giận chống lại tập đoàn lớn" là cái nhìn giản lược, bỏ qua bối cảnh, diễn tiến theo thời gian và sức nặng của quyết định
- Phía NPM, dù đây không phải chuyện đột ngột hay ngoài dự đoán, vẫn nhìn chung thể hiện thái độ trịch thượng với lập trình viên, đồng thời đẩy toàn bộ trách nhiệm sang tác giả thông qua một loạt quyết định thiếu nhất quán
Cấu trúc gói và tác động
- Công việc mã nguồn mở của tác giả chủ yếu được chia thành những vai trò nhỏ theo triết lý Unix, nên được cấu thành từ hơn 350 gói
- Bề ngoài hầu như không có nhiều dấu vết sử dụng, nhưng vì NPM không công khai thống kê sử dụng, nên không thể xác định phạm vi ảnh hưởng
- Người dùng không có cách nào biết tác động lan tỏa thực sự của việc xóa gói, và bản thân NPM cũng không nỗ lực điều tra mức độ ảnh hưởng hay ngăn chặn các vấn đề do việc xóa bừa bãi gây ra
Thay đổi và trưởng thành sau 8 năm
- Vài tháng sau vụ việc left-pad, tác giả nghỉ công việc chính, rời Mỹ và bắt đầu tìm con đường của riêng mình trong những môi trường mới như Morocco, Jordan, Türkiye và Indonesia
- Ông trải qua khoảnh khắc như cái chết khi đam mê dành cho mã nguồn mở bị đứt gãy, rồi lại được tái sinh thành những mối quan tâm mới
- Hiện tại, ông dành cho kinh doanh, marketing, vận hành công ty và đội ngũ cùng nhiều lĩnh vực khác niềm đam mê tương đương với lập trình
- Gửi gắm thông điệp rằng cuộc sống vẫn tiếp diễn, tác giả xem vụ việc left-pad là dịp để nhìn lại những quyết định tự do, các giá trị của cộng đồng và tính phức tạp của quá trình ra quyết định
2 bình luận
Đây là một sự kiện có ảnh hưởng rất lớn, nhưng ngay cả khi không đọc bài viết của tác giả gói đó, tôi vẫn nghĩ lỗi nằm ở các công ty và hệ thống liên quan nhiều hơn là ở bản thân anh ấy.
Ý kiến trên Hacker News
Nói thật thì tôi có cảm giác không hiểu rõ một nửa bài blog này đang nói gì, như thể đã bỏ lỡ mất ngữ cảnh nào đó, nhưng tôi thích điểm là "left pad guy" tự mình sắp xếp lại toàn bộ sự việc
Tuy nhiên, những tuyên bố như sau lại có vẻ hơi kỳ lạ
Sau vụ left-pad thì tôi đã hiểu rất rõ vì sao lại như vậy
Một chuyện nhỏ thôi nhưng
libctôi đang dùng trên điện thoại hiện nay có kích thước 1MiB, tức lớn gấp 16 lần Unix truyền thốngKết luận là ít nhất 90% của
libcđi ngược triết lý UnixSau khi đọc Lions Book hay APUE rồi xem manual của pthreads hoặc đặc tả ANSI C của
setlocale(), bạn sẽ thấy đó là những triết lý hoàn toàn khác nhauNếu coi chúng là một, thì đó là bằng chứng rằng bạn không thực sự đồng cảm nghiêm túc với bất kỳ triết lý nào trong hai bên
Vì ý nghĩa của 'one thing' không rõ ràng nên trên thực tế nó chẳng giúp ích gì, chỉ gây tranh cãi
Eclipse cũng có thể bị xem là chỉ làm 'một việc là IDE', nhưng rõ ràng đó không phải điều các nhà phát triển Unix muốn nói tới
Nó cũng không có nghĩa là hãy tạo ra thư viện chỉ có các hàm dài 11 dòng
Lời khuyên thực sự nên là: "đừng để chương trình hay thư viện làm quá nhiều nhưng cũng đừng quá ít"
Còn thế nào là nhiều, thế nào là ít thì rốt cuộc vẫn là vấn đề của kinh nghiệm và cảm giác
Cảm ơn akoculu đã viết bài này
Tôi nghĩ đây là một ví dụ rất rõ ràng cho cộng đồng JavaScript, tức một hệ sinh thái phụ thuộc quá nhiều vào dependency
Tôi không hiểu vì sao nhiều người lại đổ lỗi cho bạn đến vậy
Bạn chỉ unpublish một package có 11 dòng code, và có lẽ cũng không thể lường hết toàn bộ tác dụng phụ của việc đó
Chính tác giả cũng nói rõ trong bài
Lịch sử version của package kik trông rất kỳ lạ
Nó đã bị thay bằng một package giữ chỗ bảo mật từ 9 năm trước
Lịch sử version của package kik
Sự mỉa mai lớn nhất của vụ này chính là package kik
Package kik mà phía kik cố giành cho bằng được rốt cuộc lại chẳng có ích gì
Và công ty Kik cũng lộ ra là một nơi cẩu thả và đầy vấn đề
Từng có tranh cãi liên quan đến crypto, và còn bị nhắc đến âm thầm như một nền tảng phát tán nội dung như ấu dâm
Tham khảo: Darknet Diaries tập 93
Vì vậy việc Azer Koçulu cứng rắn từ chối Kik lại khiến tôi thấy khá hả dạ
Vậy rốt cuộc toàn bộ chuyện này... cuối cùng lại chẳng có ý nghĩa gì sao?
Việc
left-padtồn tại dưới dạng một package tự nó đã khá buồn cườiChỉ vì một hàm padding chuỗi mà phải có một lượng byte khổng lồ di chuyển qua CDN, proxy, build pipeline v.v.
Tôi đồng ý với chuyện tận dụng tốt các giải pháp sẵn có, nhưng thật khó hiểu khi người ta lại nghĩ "chắc sẽ có package cho việc này" chỉ để điền thêm vào đầu chuỗi
Một phần tranh luận hồi đó đã trở thành lời cảnh tỉnh trước sự ám ảnh mù quáng của dân web với các micro-package
Cũng từng có văn hóa phát hành package để lấy độ nổi tiếng, lấy GitHub star
Mặt khác, cũng có một văn hóa rất mạnh là hễ thứ gì cài được qua npm thì bất kỳ hàm nào cũng không muốn tự triển khai nữa
Nhiều lập trình viên hiện đang làm việc với tôi đến giờ vẫn thích cả những package rất đơn giản
Lý lẽ của họ là "giảm gánh nặng bảo trì"
Một thực tế thật mỉa mai
Có vẻ như ngay cả implementation gốc của package này cũng gây ra thao tác kém hiệu quả
O(n^2)chứ không phảiO(n)Xem thêm trên wiki
Liệu có khác biệt lớn về chất lượng giữa việc tham khảo một hàm tiện ích trong project của người khác và việc dùng một package đã lan rộng khắp hệ sinh thái không?
Chúng không giống hệt nhau, nhưng trong một môi trường có tooling đủ trưởng thành, tôi nghĩ hai cách tiếp cận này trên thực tế không cách nhau xa lắm
Hiện tượng cố tái sử dụng code tối đa, như thể copy-paste là phương pháp đã lỗi thời
Chẳng phải chuyện này hơi giống AI sao?
Những việc chỉ cần search đơn giản cũng lại mang đi hỏi AI với vô số prompt
Một cấu trúc chỉ là chồng thêm một bước không cần thiết lên C&P
Triết lý Unix là "làm tốt một việc"
left-padđã bỏ lỡ điều kiện thứ hai (làm cho tốt)Tôi ngạc nhiên khi nhiều project đến vậy lại dùng nguyên một implementation ngây thơ như thế
Một implementation tối ưu hơn có thể vừa nhanh hơn vừa nhỏ hơn
Tôi không hiểu rõ văn hóa JavaScript lắm, nhưng tôi nhớ từng tồn tại xu hướng cạnh tranh tăng số lượt tải npm
left-padcó 1,4 triệu lượt tải mỗi tuần, cònis-evenlà 160 nghìnCó người thêm micro-package vào dependency để đùa vui, có người làm vậy để nâng chỉ số phổ biến của thư viện
Cũng từng có ý kiến phản đối việc nhét các package như
is-evenvào bên trong những thư viện nổi tiếng dùng ReactVì tồn tại kiểu nguyên tắc cứng nhắc rằng "code tự viết được thì cũng cứ kéo về dùng"
Câu chuyện liên quan: vì sao package is-odd được cài gần 3 triệu lần trong một tuần
Tôi tò mò về ví dụ của 'implementation không ngây thơ'
Tôi là maintainer của một package npm phổ biến
Tôi thực sự đồng cảm
Từ một thời điểm nào đó, npm bắt đầu rời xa sự cộng tác của cộng đồng
Sau khi được Microsoft mua lại thì điều đó càng trở nên cố định hơn, nhưng ngay trước đó cũng đã có nhiều dấu hiệu
Nhiều cách vận hành của npm, thái độ thiếu hợp tác với cộng đồng/đội Node, sự tập trung quá mức vào thương mại hóa, danh tiếng của một số thành viên, v.v. đều khiến người ta khó chịu theo nhiều cách
Tôi nhớ có lần ghé văn phòng ở Oakland, và vì trải nghiệm tương tác hôm đó không mấy tích cực nên tôi sẽ không kể chi tiết
Lỗ hổng unpublish là vấn đề mà ai khi đó cũng biết
Mọi người đều đổ hết cho tác giả theo kiểu 'left-pad đã phá hỏng internet', nhưng thực ra tôi nghĩ vấn đề lớn hơn nằm ở việc npm vận hành tệ
Nếu tôi nhớ không nhầm, package đã bị khôi phục cưỡng ép trái với ý muốn của chính maintainer, và đó là một động thái hoàn toàn tách rời khỏi mức độ cộng đồng mà npm tự nhận là đại diện (ít nhất xét về mặt pháp lý cũng khá kỳ quặc)
Sau đó npm gần như không còn quan tâm đến việc quản lý abuse, spam, v.v. nữa (như quảng cáo spam của core.js), và cũng hầu như không tham gia thảo luận với cộng đồng về chuẩn hay khả năng tương thích
Việc phát hành npm@5 cũng là một thất bại lớn, và chuyện đưa lockfile vào package cũng đầy hỗn loạn
(Tôi thậm chí còn cho rằng đội Node đã đúng khi không chờ npm sẵn sàng rồi mới phát hành)
Giao tiếp với cộng đồng vào thời điểm đó là một mớ hỗn độn với bug lớn, đổ lỗi cho cộng đồng, và thái độ bề trên
Đó là bằng chứng cho thấy npm không còn là đại diện của tinh thần mã nguồn mở nữa
Tôi không nhớ rõ left-pad xảy ra trước hay sau giai đoạn đó, nhưng khi ấy toàn bộ hệ sinh thái đang ở trong thời kỳ trì trệ và hỗn loạn kéo dài
Package npm thường bị coi như những package độc lập cho các hàm vặt vãnh, gần như thành meme, nhưng nếu nhìn lại bối cảnh thì npm là package manager đầu tiên dễ tiếp cận dành cho một công nghệ đang nổi lên, được vận hành theo kiểu cộng đồng, và còn tích hợp hữu cơ với GitHub
Đó là giai đoạn đầu của Node, khi còn chưa có ES5 và vẫn dùng
var,prototype, thậm chí trước cả lúc Joyent giao Node.js cho cộng đồng, trước cả đợt fork Io.js và thời kỳ Node 0.10/0.12 đình trệ quá lâuKhi ấy không ai thực sự biết best practice nên là gì
Tôi thật sự đồng cảm với góc nhìn của tác giả
Nếu nhìn từ góc độ bảo mật, vụ left-pad là một cú thức tỉnh lớn về thực tế rằng các doanh nghiệp/cộng đồng trong hệ sinh thái bị tách rời nhau ngoài ý muốn, cũng như về bảo mật chuỗi cung ứng
Nó đã khơi mào cho những cuộc thảo luận quan trọng về tăng cường tính dư thừa và an ninh
Tôi nghĩ xét cho cùng đó là một bước ngoặt giúp ngành đi lên theo hướng tốt hơn
Đọc lại sau thời gian dài vẫn thấy thú vị
npm không phải package manager đầu tiên của bất kỳ ngôn ngữ nào, và cũng đã có nhiều người cảnh báo về việc tồn tại quá nhiều package nhỏ kiểu này
Tôi nghĩ npm và toàn bộ hệ sinh thái JS nói chung là nạn nhân của xu hướng nhất thời
Các thảo luận liên quan vào thời điểm left-pad
Thảo luận trên Hacker News
Vì sao Java có các thư viện tiện ích đáng tin cậy như Apache Commons, Google Guava mà JS lại không có?
JavaScript cũng có các thư viện tiện ích đáng tin như Lodash. So với trước đây thì phần lớn chức năng giờ đã có trong thư viện chuẩn
Thực tế Lodash đã cung cấp
pad/padStart/padEndtừ 3 tháng trước khi vụ left-pad xảy raTài liệu Lodash pad
Tôi nghĩ nguyên nhân quan trọng nhất lần lượt là văn hóa, rồi đến một thư viện chuẩn được thiết kế tốt, rồi đến việc có hay không có công cụ ngăn người ta nhét hơn 300 package vô dụng vào dependency
Maven thực sự là một công cụ được thiết kế rất tốt (một cách mỉa mai là lúc nào cũng bị chửi), và là một trong những bí quyết thành công của Java
Lý do Java không phải chấp nhận những thỏa hiệp thương mại kiểu npm là vì họ có Apache Foundation, một tổ chức phi lợi nhuận dựa trên cộng đồng được hỗ trợ rất tốt (kiểu cấu trúc này cực kỳ hiếm, và là kết quả may mắn nhờ lịch sử pháp lý phức tạp của Java)
(JS cũng có nhiều thư viện tuyệt vời. Vấn đề là việc quản lý package bị tập trung hóa quá mức và quản trị lại kém)
Google Guava gần với lodash hơn, chứ không giống left-pad
Ngày trước các thư viện như Jquery, Underscore từng đảm nhiệm vai trò đó
Tôi thật sự thấy khó hiểu khi có quá nhiều công ty không mirror toàn bộ dependency cần cho build trong nội bộ
Toàn bộ quá trình build đáng lẽ phải có thể clean build trong môi trường offline, còn chỉ dựa vào download cache thì chẳng khác nào phó mặc cho may rủi
Trong project của tôi, tôi luôn vendor các dependency vào nội bộ
Như vậy sẽ dự đoán được, build được cả khi offline, mà chi phí lưu trữ cũng rẻ