Почему я не поддерживаю семвер

В этом выпуске рассказываю, о том, почему я не поддерживаю семвер:

Подкаст-версия для тех, кто в дороге:

Тема начинается с 1:34.

РСС для подкастных программ:

https://ilyabirman.ru/meanwhile/tags/podcast/rss/

И теперь можно найти подкаст в каталоге Айтюнса. Надо искать «Видеоблог-подкаст Ильи Бирмана», но в нормальных программах находит даже если просто написать «Бирман».

Дальше
17 комментариев
Eduard Kozhevnikov 2020

А можно догонки перенести в конец видоса? Вроде заходишь тему послушать, а приходится левой инфы переждать. Если слушать не на ютубе, то проматать по таймкоду нельзя

Денис Исайченко 2020

Если пакет распространяется через npm/composer и он не использует semver, то это должно быть явно указано в документации. И при этом нельзя писать в документации инструкцию по установке так: npm install ilyabirman-likely —save, потому что по дефолту npm использует semver и пропишет в package.json например ^2.4.0. Если завтра вы дропните IE 10+ и сделаете релиз 2.4.1 или 2.5.0, а не 3.0.0, то все кто ставил ваш пакет при следующем автоапдейте дропнут IE и у себя. И не обязателен именно автоапдейт, просто сборка проекта со старым npm где нет package.lock.json тоже сломает его.

У меня недавно такое произошло с summernote, они решили что убирать совместимость с IE не стоит major версии и прописали это в третью цифру. Клиентский проект перестал собираться, я потратил 3 часа чтобы перелопатить все зависимости и найти что именно в этом пакете проблема и исправить. Неприятно.

Alexey Shamrin 2020

5 лет назад про семвер хорошо написал Jeremy Ashkenas. Выдержка:

«If you pretend like SemVer is going to save you from ever having to deal with a breaking change — you’re going to be disappointed. It’s better to keep version numbers that reflect the real state and progress of a project, use descriptive changelogs to mark and annotate changes in behavior as they occur, avoid creating breaking changes in the first place whenever possible, and responsibly update your dependencies instead of blindly doing so.

Basically, Romantic Versioning, not Semantic Versioning.»

https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e

Евгений Степанищев 2020

Понятный программистам пример — char (character). Тут тоже «к».

Евгений Лазарев 2020

Денис Исайченко, то, что НПМ при установке зависимости добавляет к версии ^, подразумевая, что зависимость может быть автоматически обновлена до любой минорной версии выше — полный бред и факап. По умолчанию зависимость всегда должна ставиться жёстко той версии, которая устанавливается при подключении зависимости. Все обновления должны проходить ручной контроль разработчика/команды/тимлида. Апдейты не нужны, если только ты сам этого не попросил.

Денис Исайченко 2020

Евгений Лазарев, в новых версиях npm (5+) так и будет, т.к зависимость будет устанавливаться из lock файла. Правда в сети огромное число legacy проектов без lock файлов и отсутствие semver у зависимостей начинает стрелять.

Но я не согласен по поводу обновлений. Я хочу получать багфиксы/новые фичи автоматически при обновлении, не копаясь при этом в двухзначном числе зависимостей (если добавить туда ещё дерево зависимостей, то может получится число трехзначное) и читая историю обновлений каждой из них, в попытке понять что там поменялось. Если бы в npm/composer не использовался semver, то я представляю сколько человеко-часов тратилось бы каждым разработчиком каждого пакета на вычитку изменений в каждой зависимости. Люди бы годами не подтягивали обновления зависимостей с правками багов и все превратилось бы в болото. Возьмите любой популярный фреймворк на js (React, Vue, Angular) или PHP фреймворк (Laravel, Symfony) — все они следуют semver и я спокойно в своих проектах могу их обновлять с закрытыми глазами.

Konstantin Baryshnikov 2020

Semver нужен разработчикам, которые пишут и используют библиотеки или фреймворки. Если посмотреть на любой современный фреймворк или крупную библиотеку на том же PHP, все они используют массу других библиотек. При этом какая-то популярная библиотека может использоваться десятком других библиотек. Системы управления версиями типа composer позволяют вычислить, какие версии чего надо установить, чтобы вся система работала. Без semver-а было бы непонятно, как вычислить такое пересечение.

Для конечного пользователя продутка типа Эгеи или, там, Гугл Хрома это все, разумеется, не имеет особого значения.

Евгений Лазарев, для проекта — да, конечно, зависимости надо четко фиксировать. А вот для библиотеки — нет.

Евгений Лазарев 2020

Konstantin Baryshnikov, а в чём отличие библиотеки от проекта?

Бисептол Олегович 2020

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

Konstantin Baryshnikov 2020

Отличие библиотеки от проекта в том, что библиотека не является конечным продуктом для пользователя, а предназначена для использования программистом в других проектах или библиотеках. Одна и та же библиотека может быть использована десятками других библиотек, которые используются в одном и том же проекте. И если везде привязаться к конкретной версии, то в случае несовпадения даже patchlevel-версии возникает конфликт при разрешении дерева зависимостей (сведения его к списку конкретных версий устанавливаемых библиотек). Semver же позволяет этот вопрос разумно решить: если библиотека X требует библиотеку A версий 2.*.*, а библиотека Y требует ту же библиотеку A версии 2.3.*, то очевидно, что можно установить A версии 2.3.последняя.

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

Евгений Лазарев 2020

Konstantin Baryshnikov, мне кажется неверным предположение, что библиотека не является продуктом. Всё — продукт. Программист тоже пользователь. Описание системы разруливания конфликтов выглядит хорошо, но на практике мы имеем что имеем — всё упирается в предположение о том, что разработчик библиотеки ничего не сломает даже минорным патчем. А это ну такое себе предположение для большинства проектов :—) Уверен, что в крупных значимых проектах, где десятки зависимостей, всё равно все зависимости проходят ручной контроль, а для мелких проблема решения конфликтов неактуальна. Короче, система получается бессмысленной и нежизнеспособной.

Konstantin Baryshnikov 2020

Если каждая версия библиотеки будет фиксировать конкретные версии других библиотек, то конфликт версий возникнет моментально. В javascript — там, да, можно установить сразу несколько версий, ведь JS-модули просто экспортируют объекты. А в тех же PHP или Java библиотеки регистрируют глобальные классы в глобальных неймспейсах, и две версии сразу использовать невозможно. Так что такая система будет просто нежизнеспособной — вообще ничего работать не будет.

На уровне проекта же в lock-файлах фиксируются все версии (не только напрямую используемых библиотек, но и всех их зависимостей).

Евгений Лазарев 2020

Konstantin Baryshnikov, всё прекрасно будет работать, но немного в другой парадигме. Например, разрешать публичное распространение даже минорного апдейта у пакета только после одобрения несколькими сторонними код-ревьюерами, для которых этот пакет приносит пользу. Таким образом, апдейты будут выходить реже, но они будут качественнее, и вот тогда уже можно ставить ^. А сейчас ^ можно ставить только у нескольких крупнейших проектов, у остальных по умолчанию должно быть строгое фиксирование версии и ручное разруливание конфликтов версий.

Shu Buznik 2020

Просто вы вроде не поддерживаете семвер, но Эгея у вас 2.9, но при этом промежуточные версии — это сборки v3543, v3387.
Это по сути и есть семвер.

Konstantin Baryshnikov 2020

Евгений, это сработает в рамках единой организации, но кто же будет ходить за чьим-то одобрением в мире опенсорса, в котором разработка ведется по «базарному» принципу (см. Eric S. Raymond, The Cathedral & the Bazaar) огромным количеством независимых разработчиков? Тут все строится на репутации, за качеством кода, покрытием тестами и отсутствием регрессий в действительно популярных и востребованных пакетах следят.

Гоша Осинкин 2020

Бесконечно можно смотреть на три вещи: как горит огонь, как течёт вода и как дизайнеры объясняют программистам почему они всё делают неправильно.

Konstantin Baryshnikov 2020

Гоша, вы так говорите, как будто это что-то плохое. Такие обсуждения важны, они вскрывают суть вещей, о которой забывают, делая все по привычке.

Илье для Эгеи semver нафиг не нужен, и в этом контексте его рассуждения логичны. А вот для той же системы поиска (забыл название), которая внутри Эгеи используется, в semver-е есть определенная польза.

Мои книги