Найти в Дзене
Студент Программист

left-pad: как 11 строк кода парализовали тысячи проектов по всему миру

В марте 2016 года один разработчик удалил из npm библиотеку из 11 строк кода. В результате тысячи JavaScript-проектов по всему миру перестали собираться. Так мир узнал о пакете left-pad и о том, насколько хрупкой может быть современная разработка. Эта история звучит абсурдно. Как вообще одиннадцать строк могут положить пол-интернета? Но это случилось, и последствия были настолько серьёзными, что npm пришлось срочно менять правила работы всей платформы. Давайте разберёмся, что произошло и почему это важно даже для тех, кто никогда не писал код. Представьте, что вам нужно вывести число с нулями впереди. Например, не "5", а "00005". Простая задача, правда? Можно написать функцию за пару минут. Именно это и сделал разработчик Azer Koçulu. Он создал tiny библиотеку left-pad, которая добавляла символы слева от строки до нужной длины. Одиннадцать строк кода. Даже не функция - просто крошечный кусочек логики. Koçulu выложил библиотеку в npm - это хранилище пакетов для JavaScript, откуда разраб
Оглавление

В марте 2016 года один разработчик удалил из npm библиотеку из 11 строк кода. В результате тысячи JavaScript-проектов по всему миру перестали собираться. Так мир узнал о пакете left-pad и о том, насколько хрупкой может быть современная разработка.

left-pad: как 11 строк кода парализовали тысячи проектов по всему миру
left-pad: как 11 строк кода парализовали тысячи проектов по всему миру

Эта история звучит абсурдно. Как вообще одиннадцать строк могут положить пол-интернета? Но это случилось, и последствия были настолько серьёзными, что npm пришлось срочно менять правила работы всей платформы.

Давайте разберёмся, что произошло и почему это важно даже для тех, кто никогда не писал код.

Что такое left-pad

Представьте, что вам нужно вывести число с нулями впереди. Например, не "5", а "00005". Простая задача, правда? Можно написать функцию за пару минут.

Именно это и сделал разработчик Azer Koçulu. Он создал tiny библиотеку left-pad, которая добавляла символы слева от строки до нужной длины. Одиннадцать строк кода. Даже не функция - просто крошечный кусочек логики.

Koçulu выложил библиотеку в npm - это хранилище пакетов для JavaScript, откуда разработчики скачивают готовые решения. Вместо того чтобы писать функцию самому, можно взять готовую. Удобно.

И вот тут началось самое интересное. Left-pad оказался настолько удобным, что его начали использовать везде.

Как работают зависимости

Современная разработка построена на модулях. Вы создаёте проект и подключаете готовые библиотеки: для работы с датами, для валидации форм, для HTTP-запросов. Эти библиотеки, в свою очередь, тоже используют другие библиотеки. Получается дерево зависимостей.

Left-pad использовался в популярных пакетах вроде Babel и React. А эти пакеты использовали тысячи других проектов. Получалась такая матрёшка: ваш проект зависит от Babel, Babel зависит от какого-то пакета, а тот - от left-pad.

Как работают зависимости
Как работают зависимости

Разработчики даже не знали, что где-то глубоко в недрах их проекта сидит библиотека из одиннадцати строк. Но она была. И когда она исчезла, всё рухнуло.

Что случилось 22 марта 2016 года

История началась с юридического спора. У Koçulu был пакет под названием "kik" - просто набор инструментов для его проектов. Но существовала компания Kik, мессенджер с миллионами пользователей, и они попросили npm передать им название пакета.

Npm встал на сторону компании. Koçulu разозлился - ему казалось, что крупный бизнес просто отбирает его имя. В знак протеста он удалил все свои 273 пакета из npm, включая left-pad.

И тут началось.

Проекты по всему миру перестали собираться. Разработчики запускали сборку - и получали ошибку: "Cannot find module 'left-pad'". Никто не понимал, что происходит. Библиотека была там ещё вчера, а сегодня исчезла.

Facebook не мог собрать React. Node.js и Babel падали с ошибками. Тысячи проектов встали. Представьте: программисты приходят на работу, пытаются развернуть код - и ничего не работает. А причина - одиннадцать строк, которые кто-то удалил.

Экстренные меры

Npm отреагировал быстро. Команда приняла беспрецедентное решение: восстановить пакет вручную, даже без согласия автора. Через несколько часов left-pad вернулся в реестр, но уже под управлением npm.

Это был первый и единственный случай, когда npm забрал пакет у автора. Обычно платформа придерживается принципа: автор владеет своим кодом и может делать с ним что угодно. Но инцидент показал, что иногда приходится нарушать правила ради стабильности всей экосистемы.

После этого npm изменил политику. Теперь удалить популярный пакет нельзя - можно только пометить как устаревший. Если у пакета больше определённого количества загрузок или от него зависят другие проекты, он остаётся в реестре навсегда.

Почему это вообще произошло

Самый частый вопрос: зачем использовать библиотеку для такой простой задачи? Неужели нельзя было написать функцию самому?

Конечно, можно. Но в JavaScript-сообществе сложилась культура микропакетов. Зачем писать код, если кто-то уже написал, протестировал и выложил? Подключил пакет - и работает.

Проблема в том, что эта философия создала хрупкую систему. Проекты зависят от десятков, сотен, иногда тысяч библиотек. Многие из них поддерживает один человек в свободное время. Если этот человек устал, забил или удалил код - всё ломается.

Проекты зависят от десятков, сотен, иногда тысяч библиотек
Проекты зависят от десятков, сотен, иногда тысяч библиотек

Left-pad показал уязвимость всей экосистемы. Один пакет, один разработчик, одно действие - и тысячи проектов встали. Это как если бы один винтик в огромной машине вылетел, и всё перестало работать.

Уроки для индустрии

После инцидента разработчики стали осторожнее. Появились инструменты для аудита зависимостей, менеджеры пакетов научились кешировать библиотеки локально. Компании начали создавать приватные зеркала npm, чтобы не зависеть от внешних источников.

Но главный урок оказался глубже. Современная разработка построена на доверии незнакомым людям. Вы скачиваете пакет, написанный кем-то на другом конце планеты, и встраиваете в критически важный проект. Вы доверяете, что этот человек не внесёт вредоносный код, не удалит библиотеку, не бросит поддержку.

И пока это работает. Но left-pad напомнил: система хрупкая. Она держится на энтузиазме разработчиков, которые бесплатно поддерживают проекты. Что будет, если они устанут?

Что изменилось

Сейчас npm более устойчив. Пакеты не исчезают внезапно. Есть системы мониторинга зависимостей, предупреждения об устаревших библиотеках, инструменты для проверки безопасности.

GitHub (которому принадлежит npm) запустил программу спонсорства для мейнтейнеров. Теперь разработчики популярных пакетов могут получать деньги от тех, кто использует их код. Это не решает проблему полностью, но хоть что-то.

Появились альтернативные менеджеры пакетов - Yarn, pnpm. Они по-умолчанию кешируют зависимости, так что даже если пакет удалят из npm, у вас останется локальная копия.

Разработчики стали меньше доверять микропакетам. Функцию на одиннадцать строк теперь скорее напишут сами, чем подключат внешнюю зависимость. Left-pad научил осторожности.

Цена удобства

История с left-pad - это про баланс между удобством и надёжностью. Удобно использовать готовые решения. Удобно не писать код с нуля. Удобно стоять на плечах гигантов.

Но эти плечи могут оказаться хрупкими. Один человек, одиннадцать строк кода, один импульсивный поступок - и вот уже тысячи проектов не работают.

Мы живём в мире, где критическая инфраструктура зависит от добровольцев. Netflix, PayPal, Facebook - гиганты индустрии используют код, который поддерживают энтузиасты бесплатно, в свободное время. Это одновременно красиво и страшно.

Left-pad остался в истории как предупреждение. Система работает, пока все играют по правилам. Но правила могут измениться в любой момент.

Npm содержит теперь больше двух миллионов пакетов
Npm содержит теперь больше двух миллионов пакетов

Прошло десять лет с того инцидента. Npm содержит теперь больше двух миллионов пакетов. Каждый день разработчики скачивают миллиарды зависимостей. И где-то среди них наверняка есть новый left-pad - маленькая библиотека, от которой зависит больше, чем кто-то может представить. Остаётся надеяться, что её автор не обидится на мир.