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:

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;
}

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 :sweat_smile: 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.

15 Likes

:sweat_smile:

Email qua lại giua Azer và Kik Interactive

4 Likes

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àm printf 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.

8 Likes

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ế :sweat_smile:.

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ó:

  • Không có thư viện chuẩn -> sử dụng nhiều thư viện ngoài khác nhau, không ổn định.
  • Dependency quá nhiều và quá lung tung, gây phức tạp cho dự án và dẫn đến nguy cơ sụp hàng loạt nếu 1 module có vấn đề - mà ở trường hợp này là bị gỡ bỏ.
  • Nhiều module trên npm không được tổ chức tốt, khi thậm chí có module chỉ có 1 dòng code, 1 hàm.
  • Lập trình viên đang quá phụ thuộc vào các thư viện có sẵn, kể cả các hàm đơn giản như left-pad, isArray cũng cần tới việc cài thêm 1 module riêng.

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ó :sweat_smile:.

5 Likes

Đoạn này tóm tắt thế này là ổn =))

Kik -> Azer: We want your name.
Azer -> Kik: Nope, already have an open source project
Kik -> Azer: We’ll sue you and make your life a living hell… but really we are nice people.
Azer -> Kik: Go AWAY
Kik -> NPM: Halp, developer mean :frowning:
NPM -> Azer: Company nice… help us make friends with company.
Azer -> Kik: Fine… 30k and I’ll do whatever you want… everyone has a price.
Kik -> NPM: LAAAAAWWWYYYEEERRRSSS!!! But really we are nice.
Kik -> NPM Developer mean :frowning:
Kik -> NPM: LAAAAAWWWYYYEEERRRSSS!!! Developer mean :frowning:
NPM -> Azer/Kik: Sorry bro… Company nice… company have lots of users… sucks2bu. Kik… tell me where to send the stolen goods.
Kik -> NPM: Thanks.
Azer -> NPM: Fine… I’ll take my ball and go home.
So, no it wasn’t just a polite request, once you threaten with Lawyers, its not polite anymore and its not a request. Your app has been uninstalled, and I hope all the bad press you receive destroys your brand completely.

@Itachi_Citus Hay, thông tin hữu ích :slight_smile:

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 :rage:

Không biết khi nào thì ông isArray nổi giận đây :joy:

There’s a package called isArray that has 880,000 downloads a day, and 18 million downloads in February of 2016. It has 72 dependent NPM packages. Here’s its entire 1 line of code:

return toString.call(arr) == '[object Array]';

Cá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 :joy:


Mà code JS lạ ta, mấy cái này cũng install package à :thinking: Chẳng trách sao thằng bạn …

5 Likes

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 :smile:

Some years ago. Before Node.js and npm. I had a large database of code snippets I used to copy-paste into projects when I needed it. They were small utilities that sometimes came in handy. npm is now my snippet database. Why copy-paste when you can require it and with the benefit of having a clear intent. Fixing a bug in a snippet means updating one module instead of manually fixing all the instances where the snippet is used.

3 Likes

Right!

Nếu đã từng đọc Code Complete thì chuyện hàm một dòng đâu có vấn đề :slight_smile:

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.

2 Likes

À ra là vậy :smile:. Nhưng mà vẫn có cảm giác gì đấy kỳ kỳ :sweat_smile:

À 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ử :sweat_smile:. 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.

4 Likes

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á :sweat_smile: 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ỉ :sweat_smile:

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 :sweat_smile: 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 :smile:

3 Likes

Uhm xài packages ngoài là chắc chắn gặp nguy cơ xung đột rồi :sweat_smile:.

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

2 Likes

Nhờ vụ left pad mà em học được về bit operator để dùng với Javascript

module.exports = leftpad

function leftpad (str, len, ch) {
  str = String(str)

  if (!ch && ch !== 0) ch = " "

  len = len - str.length
  if (len <= 0) return str

  ch = ch + ""
  var pad = ""
  while (true) {
    if (len & 1) pad += ch
    len >>= 1
    if (len) ch += ch
    else break
  }
  return pad + str
}

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 :smiley:

2 Likes

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

1 Like

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 :sweat_smile:.

Hehe. Thuật toán khác mà.

Đóng nó thành package https://github.com/thangngoc89/left-pad (ko publish lên npm)

2 Likes

Github xanh lè, ngưỡng mộ quá :cry:

Mới đạt 38 days streak thôi anh. Có nhiều người 99 days streak :smiley:

1 Like

devDependencies khác dependencies nha bạn :slight_smile:

“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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?