Left-pad: как 11 строчек кода обрушили половину интернета
В 2016 году один разработчик в обиде удалил крошечную библиотеку из одиннадцати строк — и по всему миру посыпались сборки тысяч проектов, включая гигантов индустрии. История о хрупкости современной разработки, держащейся на чужих кубиках.
Одиннадцать строчек кода, которые умели всего одно: добавлять пробелы в начало строки. Их удаление на несколько часов парализовало разработку по всему миру.
История left-pad — это про то, как современный софт собирается из тысяч чужих маленьких кусочков, и почему вынуть один из них бывает достаточно, чтобы всё посыпалось.
Что вообще делал left-pad
Библиотека left-pad решала смехотворно простую задачу — дополнить строку слева до нужной длины. Например, превратить "5" в "005". Вся её суть умещалась в несколько строк:
function leftPad(str, len, ch) {
str = String(str);
while (str.length < len) {
str = ch + str;
}
return str;
}
console.log(leftPad("5", 3, "0")); // "005"Такое любой программист напишет за минуту. И всё же тысячи проектов подключали готовый left-pad вместо того, чтобы написать самим. Почему? Потому что в мире JavaScript так принято: есть огромный склад готовых библиотек (npm), и оттуда тянут даже мельчайшие функции.
Невидимая паутина зависимостей
Ключевое слово здесь — зависимости. Большой проект подключает библиотеку A. Та, в свою очередь, зависит от B и C. B зависит от D, E, F. И так далее, вглубь на много уровней. Получается дерево из сотен и тысяч библиотек, большинство из которых разработчик даже в глаза не видел.
Left-pad оказался где-то глубоко в основании этого дерева у множества популярных инструментов. От него зависели те, от кого зависели гиганты. Никто не подключал его напрямую — но он был внутри почти у всех.
Один обиженный человек — и обвал
В марте 2016 года разработчик по имени Азер Кочулу поссорился с площадкой npm из-за спора о названии другого своего пакета. В знак протеста он удалил все свои библиотеки разом, включая left-pad. Пакет исчез со склада.
И тут началось. Любой проект, который при сборке пытался скачать left-pad (пусть и через десять уровней вложенности), внезапно получал ошибку «пакет не найден» и не собирался. Падали сборки у крупнейших компаний и популярнейших инструментов. Тысячи разработчиков по всему миру одновременно уставились на сломанные билды, не понимая, что произошло.
Развязка за пару часов
Масштаб был такой, что площадка npm пошла на беспрецедентный шаг — вернула удалённый пакет обратно, фактически отменив решение автора. Это вызвало уже другой спор: а вправе ли площадка восстанавливать то, что человек удалил сам? Но сборки чинить было надо, и left-pad воскресили.
Уроки, которые остались надолго
Крошечная библиотека преподала индустрии большой урок:
- Хрупкость цепочек. Современный продукт держится на сотнях чужих кусков, и любой может исчезнуть или сломаться.
- Не тяни зависимость ради мелочи. Подключать целую библиотеку, чтобы добавить пару пробелов, — сомнительная экономия.
- Нужна страховка. После этого случая стали популярны механизмы, которые сохраняют копии всех зависимостей у себя, чтобы внезапное удаление с чужого склада не ломало сборку.
Left-pad стал символом целой проблемы. Он показал: за удобством «возьми готовое из интернета» прячется незаметная зависимость от незнакомцев, чьи решения могут в любой момент аукнуться половине мира.