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

Нужно что-то придумать, чтобы остановить это безумие, но что? У меня есть идея. Помните историю с left-pad? Неплохо бы устраивать такое почаще.



Предлагаю вознаграждение настоящими деньгами всем, кто удалит свой модуль npm. Точная сумма будет рассчитываться по приведенной формуле; она предполагает, что модули с большим количеством скачиваний и малым числом строк кода будут оцениваться выше. Есть еще одно условие: модуль вы должны удалить без предупреждения, чтобы все, кто от него зависят, просто проснулись и обнаружили поломанный билд.

Давайте рассмотрим isArray в качестве примера. Там всего четыре строки кода.

var toString = {}.toString;

module.exports = Array.isArray || function (arr) {
return toString.call(arr) === '[object Array]';
};


Если учесть, что число скачиваний составляет 51 миллион, получается итоговая сумма в 710 $.
Чтобы избежать мошенничества, согласовывать каждое удаление мы должны заранее. Я ознакомлюсь с вашим модулем, чтобы убедиться, что он соответствует требованиям и проверить, нет ли там чего подозрительного – например, накрутки в скачиваниях или минификации в коде. Удалять модуль можно только после того, как мы обо всем договоримся, иначе я уже не смогу узнать число скачиваний и строк.

Возможно, я попрошу вас немного подождать с удалением, чтобы между исчезновениями модулей и сопутствующими вспышками хаоса проходило по несколько недель – это нужно, чтобы добиться максимального эффекта. И наконец, сумма выплат в каждом случае будет составлять не более 1000 $, а то жить мне тоже на что-то надо.

Ну что, по рукам? Подать заявку можно здесь.

Ну ладно, шутки в сторону – это несерьезный пост. Я не собираюсь платить вам деньги за удаление модулей npm и погружать экосистему Node в мрачную эпоху смуты тоже не планирую. Тем более что это все равно не сработало бы.

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

Большинство разработчиков на Node не имеют представления, что творится у них в зависимостях. Многие из этих деревьев содержат тысячи элементов и никогда не проходили ревизию. Это безответственный подход и с этим нужно что-то делать.

В большей части моих проектов менее ста зависимостей; немало и таких, где их меньше десяти. В некоторых зависимостей нет вообще. Это не случайность. Как ни печально, платить приходится за всё, поэтому введение зависимости – это серьезное решение, которое обсуждается всей командой. Новая зависимость подвергается проверке, ее здоровье и прогнозы на будущее получают оценку, и в дальнейшем разработчики не жалеют времени на то, чтобы повторять этот процесс и при необходимости менять курс.

Комментарии (14)


  1. YChebotaev
    23.11.2021 11:17
    +5

    После инцидента с left-pad, npm приняла политику, согласно которой пакеты, у которых есть зависимые, или у которых более 300 скачиваний в неделю не могут быть удалены.

    А чем ситуация с npm принципиально отличается от любого другого реестра пакетов? Того же apt, или pypi?

    Что касается isarray. Ну мода такая была. Это даже считалось за бест-практайс. У комьюнити не было на что ориентироваться, кроме своего вкуса. Это сейчас Sebastian Markbage и рассказал как надо. А тогда не знали


    1. Revertis
      23.11.2021 13:54

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


    1. vitaly_il1
      25.11.2021 17:19
      +1

      +1 - мне тоже интересно.
      Я слабо знаком как управляются репо с библиотеками других языков.
      На уровне Линукс репо (RPM / DPKG) каждый дистрибутив управляет репо для себя, так что разработчик не может удалить свой пакет. Естественно, часто "родных" репо нехватает, тогда используют дополнительные, и там уже может быть всякое.


  1. Akuma
    23.11.2021 11:28
    +1

    А то конкретно не так с npm?

    Да, там 100500 пакетов и многие из них укладываются в пару строк. Ну так они и повторяются по тысяче раз на проект.

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


  1. gameplayer55055
    23.11.2021 16:37
    +2

    Да от такого предложения даже Apple кони двинет. Давай создадим пирамиду: вы укажете всем друзьям программистам насколько npm плохой и скидываетесь деньгами. Удаляем модули, и наступает мировой коллапс экономики из-за бага с библиотекой в блокчейн сетях


    1. NetBUG
      26.11.2021 12:37

      Напоминает байку про уничтожение то ли змей, то ли крыс в Индии через систему вознаграждений от англичан


  1. speshuric
    23.11.2021 23:13
    +1

    Интересно, что по формуле может получиться и отрицательное вознаграждение (если количество строк превышает количество скачиваний в неделю).


  1. codecity
    24.11.2021 14:55
    +11

    Зашел увидеть эту картинку а ее нет. Непорядок:

    npm
    image


  1. trokhymchuk
    25.11.2021 10:36

    Только эта проблема не специфична исключительно для нпм(хоть там она раскрывает себя наиболее красиво).

    Что действительно стоит делать, так объяснять, что пакеты типа isArray или left-pad не стоит не только использовать, но и писать.


  1. ksbes
    25.11.2021 15:23

    Я на JS программирую исключительно эпизодически. И мне стало интересно:

    • Есть ли модули-паки? Т.е. вообще без кода, но которые собирают, например, все "правильные" зависимости для работы с векторами?

    • А есть ли вообще такая возможность - не ставить кучу хрен-знает-каких зависимостей? Особенно когда работаешь с каким-нибудь фреймворком вроде react + ...?


    1. ddidwyll
      25.11.2021 23:20
      +1

      А есть ли вообще такая возможность

      Могу сказать, что когда работаешь со svelte - вполне нормально иметь пустой dependencies (на больших и сложных проектах одна - две зависимости обычно всё таки есть), правда в devDependencies будет сам svelte и, возможно, какой-нибудь uikit.


      1. ddidwyll
        25.11.2021 23:22

        del


  1. 13werwolf13
    26.11.2021 10:35

    у меня есть решение посложнее, зато 100%

    плати деньги конторам чтобы node в прод не пускали

    всё, проблема решена (да и подозреваю так даже дешевле будет))


  1. Blooderino
    29.11.2021 12:22

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