Адзінаццаць радкоў JavaScript зламалі інтэрнэт. Адмена публікацыі.
22 сакавіка 2016 г., 21:30 UTC: распрацоўшчык адмяняе публікацыю ўсіх 273 сваіх пакетаў npm пасля таго, як npm перадае назву пакета "kik" кампаніі Kik, прыкладанню для абмену паведамленнямі, чый патэнтны агент абяцаў "юрыстаў, якія стукаюцца ў вашыя дзверы".
22 сакавіка 2016 г., 21:30 UTC: распрацоўшчык адмяняе публікацыю ўсіх 273 сваіх пакетаў npm пасля таго, як npm перадае назву пакета "kik" кампаніі Kik, прыкладанню для абмену паведамленнямі, чый патэнтны агент абяцаў "юрыстаў, якія стукаюцца ў вашыя дзверы". Адзін з 273 – гэта left-pad: адзінаццаць радкоў, якія ставяць прабелы перад радком, спампаваныя 2,5 мільёна разоў на месяц. За некалькі хвілін зборкі Babel, React і Node выходзяць з ладу па ўсім свеце, сотнямі ў хвіліну. Форк з'яўляецца праз дзесяць хвілін і нічога не мяняе, таму што Babel цягне left-pad праз нумары радкоў, што дакладна фіксуе 0.0.3. У 23:55 npm аднаўляе выдаленую версію з рэзервовай копіі — першая "адмена адмены публікацыі" ў гісторыі рэестра — і праз тыдзень уводзіць правіла 24-гадзіннай адмены публікацыі. Постфактум, з уласнага акаўнта npm і апублікаванага Kik ланцужка электронных лістоў: рэестр, які дазваляў любому аўтару выдаляць любую версію без праверкі залежных, транзітыўнае дрэва вырашалася ў рэжыме рэальнага часу пры кожнай устаноўцы, без файла блакіроўкі па змаўчанні. Віна Git: 60 npm / 25 Kik / 15 звычка залежнасці. Вердыкт па выпраўленні: SHIP IT.
Чытаць пісьмовае выданне (англійская) ↗
Што ахоплівае гэта відэа
- 11 сакавіка: патэнтны агент Kik просіць Азера Кочулу перайменаваць `kik`; праз гадзіну: юрысты "стукаюцца ў вашыя дзверы і закрываюць вашыя ўліковыя запісы"; Азер: $30,000; Kik адпраўляе электронныя лісты ў службу падтрымкі npm
- 18–20 сакавіка: генеральны дырэктар npm перадае назву Kik ("можна было б разумна чакаць, што яна будзе звязана з kik.com"); Азер просіць выдаліць усе яго модулі
- 22 сакавіка, 21:30–23:55 UTC: 273 пакеты адмененыя; [email protected] 404s у праектах Babel, Atom, Node; форк 1.0.0 у 21:42; тэхнічны дырэктар npm твіціць "un-un-publishing" у 23:03; 0.0.3 вернуты з рэзервовай копіі ў 23:55 — 2,5 гадзіны
- 23 і 29 сакавіка: паслясмертны аналіз npm ("мы прапусцілі") і новая палітыка: адмена публікацыі толькі на працягу 24 гадзін, ахоўныя месцы для выдаленых імёнаў (72 гадзіны з 2020 г.)
Перакладзеная стэнаграма
Перакладзена з арыгінальнай англійскай агучкі. Даступнае аўдыя і субтытры кантралююцца YouTube.
0:00 Адзін распрацоўшчык выдаляе адзінаццаць радкоў JavaScript, і праз некалькі хвілін Babel, зборкі React і Node выходзяць з ладу па ўсім свеце, сотнямі ў хвіліну. Функцыя называецца left-pad. Яна дадае прабелы да радка, і да канца вечара npm робіць тое адзінае, што, як яно кажа, не можа зрабіць: перапублікаваць выдаленую версію. Як гэта адбываецца, чаму гэта магчыма, і хто вінаваты. Гэта The Daily Diff, паслясмертны аналіз. 11 сакавіка. Патэнтны агент Kik, дадатку для абмену паведамленнямі,
0:26 адпраўляе электронны ліст Азеру Кочулу: перайменуйце ваш пакет npm, kik – гэта наш брэнд. Азер кажа не. Праз гадзіну: нашы юрысты па таварных знаках будуць стукацца ў вашыя дзверы і закрываць вашыя ўліковыя запісы. Азер называе цану, трыццаць тысяч долараў, і Kik перасылае размову ў службу падтрымкі npm. 18 сакавіка. Генеральны дырэктар npm вырашае, што кожны, хто набірае npm install kik, чакае менавіта
0:48 дадатак для абмену паведамленнямі, і перадае назву. Азер просіць выдаліць усё, што яму належыць. Праз два дні ён робіць гэта сам: дзвесце семдзесят тры пакеты. 22 сакавіка, 21:30 UTC. Кожная зборка, якая звяртаецца да left-pad, атрымлівае 404. Праз дзесяць хвілін незнаёмец перапублікуе яго як 1.0.0, і нічога не мяняецца, таму што Babel і Atom загружаюць яго праз пакет пад назвай line-numbers, які патрабуе дакладна 0.0.3.
1:13 У 23:03 тэхнічны дырэктар npm твіціць: un-un-publishing. У 23:55, 0.0.3 вяртаецца з рэзервовай копіі. Дзве з паловай гадзіны. Чаму адзін чалавек можа гэта зрабіць? Тры прычыны. Любая версія на npm можа быць выдалена яе аўтарам, імгненна, без праверкі таго, хто ад яе залежыць. Па-другое, залежнасці транзітыўныя: Babel не ведае, што left-pad існуе, ён ведае line-numbers, і ўсё дрэва вырашаецца ў рэжыме рэальнага часу пры кожнай устаноўцы.
1:36 Па-трэцяе, у 2016 годзе нішто не фіксавала гэтае дрэва па змаўчанні; lockfiles былі неабавязковымі, таму кожны запуск CI зноў пытаўся ў інтэрнэту, як выглядаюць адзінаццаць радкоў кода. Адзін рэестр, якім ніхто не кіруе і ніхто не залежыць ад яго. Віна git. npm, шэсцьдзесят працэнтаў: яго ўласны постфактум кажа, што неабмежаваная адмена публікацыі выклікала боль, і, цытую, мы прапусцілі. Kik, дваццаць пяць: патэнтны агент, а не юрыст, абяцаючы юрыстаў каля дзвярэй з-за назвы, якую Kik ужо вырашыў не выкарыстоўваць. Звычка залежнасці, пятнаццаць: кожны, хто ўсталяваў npm адзінаццаць радкоў замест таго,
2:06 каб іх набраць. Уключаючы Kik, чые зборкі таксама ламаюцца. Радыус паражэння: дзвесце семдзесят тры пакеты былі выдалены, адзін з іх спампоўваўся два з паловай мільёны разоў на месяц. Выпраўленне займае дзве з паловай гадзіны; функцыя займае адзінаццаць радкоў. На Hacker News паведамленне з пытаннем, ці забыліся мы, як праграмаваць, набрала тысячу семсот пунктаў, у асноўным ад людзей, чые зборкі ўсё яшчэ чырвоныя. Вердыкт, паслясмертны аналіз: SHIP IT.
2:26 npm аднаўляецца з рэзервовай копіі, публікуе постфактум на наступны дзень, і на працягу тыдня ўводзіць правіла, якое ўсё яшчэ дзейнічае: вы можаце адмяніць публікацыю на дваццаць чатыры гадзіны, пасля гэтага вы размаўляеце з чалавекам. Панядзелак: зафіксуйце свой lockfile, і калі функцыя займае адзінаццаць радкоў, гэта абзац, а не залежнасць. Дасылайце мне інцыдэнт, пра які вы яшчэ не маеце права гаварыць, у каментарах, або на the daily diff dot dev. І гэта diff на сёння.
2:48 Я Ніка з Axrisi. Аб'ядноўвайце адказна.
Крыніцы
- npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)blog.npmjs.org
- npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
- Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
- Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
- Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
- left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
- Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
- Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
- Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
- The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com



