VietTechiesHIỂU CÔNG NGHỆ. MỞ GÓC NHÌN.
☰ Chuyên mục

left-pad không thực sự là chuyện về 11 dòng code. Mọi thứ bắt đầu từ cái tên của một app chat.

10/10/2026 · VietTechies · Biên tập

Ảnh chụp màn hình nội dung package left-pad 0.0.3 trên nền cover tối, bên cạnh hai chữ left-pad và kik.


Có thể bạn đã nghe chuyện này ở một hội nghị, hoặc đọc được đâu đó trên mạng: một lập trình viên JavaScript nổi giận, xóa 11 dòng code và làm sập cả internet. Đoạn code ấy chỉ làm mỗi một việc là chèn thêm khoảng trắng vào bên trái một chuỗi ký tự. Từ kỹ sư lo hệ thống build cho tới người viết blog, ai cũng kể lại chuyện này như một dụ ngôn về sự mong manh của các thư viện phụ thuộc (dependency).

Dụ ngôn ấy có giá trị. Chỉ có điều, nó kể sai nguyên nhân, mà nguyên nhân mới là phần đáng chú ý hơn cả.

Giai thoại: một dev, một package, một cơn giận

Theo phiên bản phổ biến, chỉ có một gói thư viện (package) tên là left-pad, và một lập trình viên đã gỡ nó xuống trong lúc bực tức. Con số 11 dòng là kích thước thường được nhắc tới của phiên bản cuối cùng, còn một số tiêu đề báo thời đó lại ghi 17 dòng, nên đừng quá bám vào con số chính xác. Package này đúng là rất nhỏ. Câu chuyện chỉ bắt đầu lệch đi ở chỗ coi mọi thứ là một cơn nổi nóng.

Vết nứt: 273 package chứ không phải một

Theo chính tường thuật của npm, vào thứ Ba, ngày 22 tháng 3 năm 2016, Azer Koçulu đã gỡ package kik của mình “cùng 272 package khác”. Tức là tổng cộng 273 package, và left-pad chỉ là một trong số đó. Lỗi bắt đầu xuất hiện không lâu sau 2:30 chiều theo giờ Thái Bình Dương. Lập trình viên nào dính sự cố cũng gặp cùng một thông báo: “npm ERR! 404 ‘left-pad’ is not in the npm registry.”

Vậy vì sao lại là kik? Kik cũng là tên một công ty làm ứng dụng nhắn tin. Theo npm, công ty này muốn có cái tên package ấy, Koçulu và Kik không thỏa thuận được với nhau, nên npm áp dụng chính sách xử lý tranh chấp của mình. Bài đăng của npm viết: “Hoàn toàn dựa trên cơ sở này, chúng tôi kết luận rằng tên package ‘kik’ nên do Kik quản lý, và đã thông báo cho cả hai bên.” npm cũng nói rõ nhãn hiệu của Kik “không liên quan” đến quyết định đó.

Theo The Register, Koçulu phản ứng rằng npm là “mảnh đất riêng của ai đó, nơi doanh nghiệp có quyền lực lớn hơn con người”. Để phản đối, anh gỡ toàn bộ package của mình. Đây là cuộc phản đối về chuyện ai được quyền giữ một cái tên, chứ không phải hành động bột phát.

Ghi chép cho thấy gì về sự cố

Thiệt hại là có thật, nhưng hẹp hơn so với cụm từ “cả internet”. Thứ bị hỏng là những lần cài đặt và build có dùng left-pad, trực tiếp hoặc thông qua package khác. The Register đưa tin package này đã được tải 2.486.696 lần trong tháng trước đó, nên rất nhiều dự án có nguy cơ bị ảnh hưởng. npm cho biết sự gián đoạn kéo dài 2,5 giờ, còn Quartz ước tính khoảng hai giờ. Các nguồn không thống nhất về việc dự án lớn nào bị ảnh hưởng, nên hãy dè dặt với mọi danh sách cụ thể. Chính npm nêu tên Babel và Atom là hai dự án bị ảnh hưởng, thông qua một package có ghim (pin) phiên bản, tức là khóa chặt vào đúng một phiên bản nhất định.

Ít ai nhớ rằng bản vá đầu tiên đến nhanh thế nào. Chỉ trong khoảng 10 phút, một lập trình viên khác là Cameron Westland đã đăng một bản left-pad thay thế, mang số phiên bản 1.0.0. Bản thay thế này không chấm dứt được lỗi, vì một số chuỗi thư viện phụ thuộc ghim chính xác phiên bản 0.0.3. Khi một thư viện đòi đúng bản cũ, bản mới hơn không thể thế chỗ.

Thứ thực sự chấm dứt sự cố là một quyết định mà npm gọi là chưa từng có tiền lệ. Lúc 4:05 chiều, npm thông báo sẽ khôi phục bản 0.0.3 gốc từ bản sao lưu, và hoàn tất lúc 4:55 chiều. Theo Quartz, CTO của npm là Laurie Voss gọi việc này là “un-un-publishing”, tạm hiểu là “gỡ việc gỡ”.

Vì sao bản kể giản lược lại thắng thế

Giai thoại này có đủ mọi thứ mà một câu chuyện truyền miệng cần: một kẻ phản diện hoặc một người hùng, tùy bạn đứng về phía nào; một thứ nhỏ bé, dễ hình dung; và một con số gây ấn tượng. “Một dev xóa 11 dòng code” gói gọn vừa một tweet. “Một vụ tranh chấp tên gọi leo thang thành cuộc phản đối trên toàn bộ kho package” thì không.

Giai thoại này còn giúp người đọc khỏi phải nhìn lại chính mình. Nếu mọi chuyện chỉ do ý thích nhất thời của một người, cách sửa đơn giản là đừng phụ thuộc vào người đó. Các ghi chép lại chỉ ra một hướng khác.

Câu chuyện thật dạy ta điều gì

Chính npm đã rút ra kết luận: “Việc gỡ package không hạn chế đã gây ra rất nhiều rắc rối.” Ngày 29 tháng 3 năm 2016, npm đổi quy định. Theo quy định mới, tác giả chỉ được tự gỡ một phiên bản package trong vòng 24 giờ sau khi đăng. Quá thời hạn đó, bộ phận hỗ trợ của npm sẽ kiểm tra xem có package nào đang phụ thuộc vào phiên bản ấy không, và giữ phiên bản lại nếu việc gỡ sẽ làm hỏng các lần cài đặt. Nếu một tên package bị gỡ hoàn toàn, npm sẽ đặt vào đó một gói giữ chỗ (placeholder) vì lý do bảo mật.

Lỗi thiết kế không nằm ở 11 dòng code. Lỗi nằm ở cách vận hành registry, tức kho đăng ký package của npm. Ở đó, chỉ một quyết định của một tác giả, đưa ra giữa lúc tranh chấp về một cái tên, cũng đủ làm biến mất đoạn code mà rất nhiều bản build vẫn ngầm mặc định sẽ luôn có mặt.

Nếu phải kể lại bằng một câu: left-pad chưa bao giờ là chuyện về một hàm nhỏ xíu, mà là chuyện về một vụ tranh chấp tên gọi và một registry cho phép chỉ một tài khoản rút tấm thảm dưới chân mọi người. Trong các thư viện phụ thuộc của chính bạn, thư viện nào có thể biến mất vào ngày mai, và hệ thống build của bạn có phát hiện ra trước khách hàng không?

Bài liên quan

Đọc bằng ngôn ngữ khác: English

Nguồn