Một lập trình viên trong cơn tức giận vừa "hủy diệt" Internet chỉ bằng 11 dòng code
Câu chuyện tưởng chừng như đùa này chỉ ra một thực trạng không mấy tốt đẹp của cộng động javascript:
Một lập trình viên trong cơn tức giận vừa 'hủy diệt' Internet chỉ bằng 11 dòng...
Đây là một câu chuyện hy hữu xoay quanh cơn giận dữ của một lập trình viên, các tranh chấp bản quyền và hé lộ cách hoạt động của nhiều ông lớn công nghệ.
Hai ngày gần đây sự kiện này khá là nổi trên reddit và hackernews, khi mà chỉ 1 module 11 dòng code lại có thể khiến nhiều framework/thư viện lớn như react hay babel “sập”.
module.exports = leftpad;
function leftpad (str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
NPM & left-pad: Have We Forgotten How To Program?
Intro Okay developers, time to have a serious talk. As you are probably already aware, this week React, Babel, and a bunch of other high-profile packages on NPM broke. The reason they broke is rather astounding: A simple NPM package called left-pad...
Và có người còn mỉa mai việc này bằng cách tạo hẳn một webservice cho leftpad http://left-pad.io/ ( https://news.ycombinator.com/item?id=11350651)
Lập trình viên hiện nay có vẻ đã quá phụ thuộc vào các thư viện, module có sẵn mà quên đi kỹ năng lập trình của mình.
Email qua lại giua Azer và Kik Interactive
A discussion about the breaking of the Internet – Mike Roberts – Medium
Hey everyone — I’m the head of messenger at Kik. I wish this didn’t have to be my first post on Medium, but open source is something that…
Reading time: 5 min read
Chà mới lên GitHub và Medium đọc, rất hay.
Thực ra bài báo GenK viết chả ra sao cả. Không có chuyện Dev quên cách code, chỉ là cái thư viện của Azer khá là thuận tiện, dễ xài, nên mọi người xài. Cứ tưởng tượng ai cũng dùng hàm
printf
, đùng một ngày hàm này bị hủy đi, thì tất cả các chương trình đang sử dụng hàmprintf
sẽ failed ngay trong lần build tiếp theo.Dĩ nhiên là chả có gì down hay “hủy diệt” internet như lều báo GenK viết cả. Chỉ là khi mình build lại software thì nó báo lỗi thiếu thư viện thôi. Và Azer cũng đưa ra giải pháp là chỉ cần point tới cái repo của ổng trên GitHub là được, thay vì trỏ tới NPM.
Lý do Azer gỡ hết các package của ổng ra khỏi NPM cũng hợp lý, NPM làm ăn như vậy thì thọt sớm.
Genk nó chỉ dịch lại một bài trên Business insider thôi anh, mà BI cũng dạng báo giật tít nên viết thế .
Thật ra bài của genk không quan trọng lắm mà bài này mới là bài chính http://www.haneycodes.net/npm-left-pad-have-we-forgotten-how-to-program/
Sau vụ này javascript mới bộc ra nhiều vấn đề, trước đó ai cũng biết nhưng giờ mới thấy ảnh hưởng của nó:
Gần đây cũng có khá nhiều bài nói về sự phức tạp về sự phụ thuộc lẫn nhau của của npm packages, gems ( https://news.ycombinator.com/item?id=11065769 - http://www.mikeperham.com/2016/02/09/kill-your-dependencies/) và qua lần này có thể thấy được nguy cơ tiềm ẩn của nó .
Đoạn này tóm tắt thế này là ổn =))
@Itachi_Citus Hay, thông tin hữu ích
Anh không biết những thông tin đấy, anh thấy cái tóm tắt của em thay cho bài viết của GenK thì hay hơn đấy. Ghét lều báo dã man
Không biết khi nào thì ông
isArray
nổi giận đâyCái thư viện is-positive-integer cũng có nhiều lượt down, có mấy dòng code mà tới 3 dependencies
drastically simplified code
Mà code JS lạ ta, mấy cái này cũng install package à Chẳng trách sao thằng bạn …
Em thấy dưới cái bài của haneycodes có cái comment link github ama trả lời về vụ module 1 dòng cũng hay này
Issue: One-line node modules
Right!
Nếu đã từng đọc Code Complete thì chuyện hàm một dòng đâu có vấn đề
Nếu dòng code nào được copy ở nhiều chỗ, có thể chỉ là hơn 2 chỗ, thì nó đáng có một hàm riêng rồi.
À ra là vậy . Nhưng mà vẫn có cảm giác gì đấy kỳ kỳ
À package chỉ chứa 1 hàm 1 dòng anh, mà dùng đến package thì phải khai báo dependency, mà khai báo dependency nghĩa là phụ thuộc vào bên ngoài, mà phụ thuộc bên ngoài thì… không biết nó còn phụ thuộc lung tung đi đâu nữa, 2 packages cùng sử dụng 1 package khác nhưng khác phiên bản cũng có thể gây xung đột, nhất là đối với front-end. Ở backend thì em chưa thử . Việc khai báo 1 package chỉ làm 1 công việc đơn giản là đánh đổi hơi lớn.
Nếu mà vì mấy cái module bé tí này mà để rủi ro xung đột thì mạo hiểm quá cơ mà nếu không để trên npm mà tự code thì cũng có nguy cơ xung đột tương tự thôi mà anh, chỉ khác cái mình để trong cái “database snippet siêu lớn của mình” thôi, còn code thì vẫn phải như vậy chứ. Chỉ hết nguy cơ xung đột khi nào mình tự code từ đầu, không dùng bất cứ một package nào thôi chứ nhỉ
Ví dụ: main thừa kế package_A và package_B và 2 cái này thừa kế chung 1 cái package_C và bị xung đột
thì nếu mình viết lại package_A và package_B thì vẫn phải thừa kế package_C thôi ạ => vẫn xung đột
Mà nói chung em vẫn không hiểu chính xác vụ này lắm cơ bản là chưa dùng npm bao giờ, không biết có giống pip bên python không nữa
Uhm xài packages ngoài là chắc chắn gặp nguy cơ xung đột rồi .
Pip, bundler, maven… về cơ bản nó cũng cùng mục đích giống npm, nhưng cộng đồng python, ruby, java tương đối “cứng” và trưởng thành hơn nhiều so với javascript nên cũng ít gặp chuyện, thư viện cũng được chuẩn hóa và ổn định.
Bên javascript gần đây còn có vụ DoughWilson - main contributor của expressjs tuyên bố không tiếp tục dự án nếu expressjs vẫn dưới sự quản lý của StrongLoop/IBM, trước đó Tj sau khi bán dự án cho Strongloop cũng dừng đóng góp tiếp cho expressjs. Express là 1 trong những nguyên nhân làm nên sự phổ biến của nodejs mà giờ 2 contributors chính bỏ dự án rồi, ko biết tình hình giờ thế nào. https://github.com/expressjs/express/graphs/contributors
Nhờ vụ left pad mà em học được về bit operator để dùng với Javascript
Muốn biết nó nhanh cỡ nào thì coi benchmark http://jsperf.com/join-vs-for-1/5
P/s: code này pass unit test của left-pad và còn cả bug compatiable
Cơ bản là JS dev quá lười :))
Add function vào thì phải có unit test cho nó. Lặp đi lặp lại function này cho nhiều project thì chán quá. Nên đóng gói thành 1 package cho tiện. Thích thì tải về thôi. Trước giờ em hay dùng package ngoài. Sau vụ này đang tự xây dựng 1 bộ package cho mình
Cái vụ này là do số lần copy tạo chuỗi mới ít hơn nên nó mới nhanh vậy chứ cũng không hẳn là chỉ do dịch bit đâu, mới đầu thấy gấp 500 lần hết cả hồn .
Hehe. Thuật toán khác mà.
Đóng nó thành package https://github.com/thangngoc89/left-pad (ko publish lên npm)
Github xanh lè, ngưỡng mộ quá
Mới đạt 38 days streak thôi anh. Có nhiều người 99 days streak
devDependencies khác dependencies nha bạn
“Tj sau khi bán dự án cho Strongloop cũng dừng đóng góp tiếp cho expressjs”
Theo mình biết thì Tj không bán bạn ạ.
Cũng không nhớ rõ. Nhưng mà tj bây giờ chuyển sang golang rồi. Chỉ maintain koajs thôi