30/09/2018, 20:07

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:

genk.vn – 26 Mar 16

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;
}
davidhaney.io – 23 Mar 16

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.

Thành Phạm viết 22:09 ngày 30/09/2018

Email qua lại giua Azer và Kik Interactive

Medium – 23 Mar 16

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

Mai Anh Dũng viết 22:19 ngày 30/09/2018

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.

Itachi Citus viết 22:17 ngày 30/09/2018

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

  • 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ó .

Mai Anh Dũng viết 22:13 ngày 30/09/2018

Đ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
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
Kik -> NPM: LAAAAAWWWYYYEEERRRSSS!!! Developer mean
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

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 đây

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

github.com/tjmehta/is-positive-integer
fearphage

drastically simplified code

improved performance as a side effect
by fearphage on 02:05PM - 23 Mar 16
changed 2 files with 3 additions and 10 deletions.

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

Thành Phạm viết 22:23 ngày 30/09/2018

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

github.com/sindresorhus/ama

Issue: One-line node modules

opened by hemanth on 2015-07-01
closed by sindresorhus on 2015-07-01
Lot of people don't get the benefits of one line modules, what would you say to those who tend to critic...

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.

Mai Anh Dũng viết 22:13 ngày 30/09/2018

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.

Itachi Citus viết 22:18 ngày 30/09/2018

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

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

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

À 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.

Thành Phạm viết 22:17 ngày 30/09/2018

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

Itachi Citus viết 22:21 ngày 30/09/2018

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

Khoa Nguyen viết 22:14 ngày 30/09/2018

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

Khoa Nguyen viết 22:07 ngày 30/09/2018

Mà code JS lạ ta, mấy cái này cũng install package à

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

Itachi Citus viết 22:13 ngày 30/09/2018

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 .

Khoa Nguyen viết 22:09 ngày 30/09/2018

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

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

Itachi Citus viết 22:13 ngày 30/09/2018

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

Khoa Nguyen viết 22:17 ngày 30/09/2018

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

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

Nguyen Duc viết 22:22 ngày 30/09/2018

devDependencies khác dependencies nha bạn

Nguyen Duc viết 22:21 ngày 30/09/2018

“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 ạ.

Khoa Nguyen viết 22:16 ngày 30/09/2018

Cũng không nhớ rõ. Nhưng mà tj bây giờ chuyển sang golang rồi. Chỉ maintain koajs thôi

Bài liên quan
0