Size: a a a

Чат подкаста «Разбор Полётов»

2020 July 13

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
Andrey Listochkin
У меня претензии не к языку, а к паккеджингу и резолву библиотек. Что нужно по имени класса идти в интернет и искать в каких джарках он лежит и выбирать “вероятно правильную”, а потом разруливать все случаи конфликтов.

Вроде как OSGi и Jigsaw это должны были как-то пофиксить, но что-то не заметно пока.
пааагади. а в других языках не так? :))
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
пишешь программу на условном питоне, скопировал код, там функция которая не распознаётся - нужно подключить библиотеку. идёшь ищешь, где же она может быть
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
всё то же самое
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
ну и нет, ни OSGi ни Jigsaw этого не собирались чинить (именно этот сценарий)
источник

AL

Andrey Listochkin in Чат подкаста «Разбор Полётов»
Нет, не так. В джаве захотел ты подрубить Хибернейт. Зашел на мавен централ или на ДжейБоссовский репозиторий - а там миллион пакетов, в которых одни и те же классы запаблишены. Причем набор классов в разных джарах разный, потому что люди бандлят несколько зависимостей вместе и паблишат это рядом. И в зависимости от того, какой у тебя application server, через какой апи ты хочешь с хибером работать, что у тебя помимо хибера используется, тебе подойдет какой-то конкретный вариант джарника.

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

Поэтому обновлять зависимости в JVM-мире никто не любит. Люди копипастят свои sbt/gradle/maven скрипты со старыми зависимостями, тк знают что эта комбинация работает. Или пишут всякие “генераторы проектов” (jHipster помнишь?) чтобы те за них делали эту работу.

Что сделал npm, и что потом подхватил Rust, Deno, и наверняка еще кто-то - это разделил пространство резолюций зависимостей, так что иметь разные версии транзитивных зависимостей стало возможно.

В npm и cargo я регулярно бампаю версии, тк знаю, что мне ничего не грозит - код мой продолжит работать. В cargo есть момент с зависимостями на C/C++ библиотеки - там dll-hell продолжает присутствовать. Но в живом проекте их единицы.

И да, есть миллион шуток про размер node_modules, но лучше иметь 300 мегов зависимостей, чем плавить мозг jar-hell-ом
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
Ну то есть ты говоришь про версии?
источник

AL

Andrey Listochkin in Чат подкаста «Разбор Полётов»
Плюс банальный visibility.

import { MyClass } from ‘my-package’;

против

import tld.my.package.MyClass;

в JS я точно знаю, что в ./node_modules/my-package будет лежать MyClass.

причем - в исходниках!

а tld.my.package.MyClass может оказаться в любом jar-файле. И без инструментов я его не найду
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
много букв а сути я так и не понял, с чем проблема.
источник

VI

Vladimir Ivanov in Чат подкаста «Разбор Полётов»
Andrey Listochkin
Нет, не так. В джаве захотел ты подрубить Хибернейт. Зашел на мавен централ или на ДжейБоссовский репозиторий - а там миллион пакетов, в которых одни и те же классы запаблишены. Причем набор классов в разных джарах разный, потому что люди бандлят несколько зависимостей вместе и паблишат это рядом. И в зависимости от того, какой у тебя application server, через какой апи ты хочешь с хибером работать, что у тебя помимо хибера используется, тебе подойдет какой-то конкретный вариант джарника.

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

Поэтому обновлять зависимости в JVM-мире никто не любит. Люди копипастят свои sbt/gradle/maven скрипты со старыми зависимостями, тк знают что эта комбинация работает. Или пишут всякие “генераторы проектов” (jHipster помнишь?) чтобы те за них делали эту работу.

Что сделал npm, и что потом подхватил Rust, Deno, и наверняка еще кто-то - это разделил пространство резолюций зависимостей, так что иметь разные версии транзитивных зависимостей стало возможно.

В npm и cargo я регулярно бампаю версии, тк знаю, что мне ничего не грозит - код мой продолжит работать. В cargo есть момент с зависимостями на C/C++ библиотеки - там dll-hell продолжает присутствовать. Но в живом проекте их единицы.

И да, есть миллион шуток про размер node_modules, но лучше иметь 300 мегов зависимостей, чем плавить мозг jar-hell-ом
плюсую, в npm мире я буквально 2 раза нарывался на проблемы за несколько лет
источник

VI

Vladimir Ivanov in Чат подкаста «Разбор Полётов»
в джаве это было просто постоянно
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
ну то есть суть в том что ты просто используешь последние версии библиотек?
источник

VI

Vladimir Ivanov in Чат подкаста «Разбор Полётов»
Anton Arhipov
много букв а сути я так и не понял, с чем проблема.
суть в том, что при обновлении одной библиотеки есть риск сломать продакшн, буквально
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
Vladimir Ivanov
суть в том, что при обновлении одной библиотеки есть риск сломать продакшн, буквально
а, ну то есть если ты обновишь библиотеку не в Java мире то всё каким то магическим образом останется работать?
источник

AL

Andrey Listochkin in Чат подкаста «Разбор Полётов»
Anton Arhipov
ну то есть суть в том что ты просто используешь последние версии библиотек?
Нет, не обязательно последние. Но я не боюсь обновляться. Мне не нуно на обновление закладывать 8 часов времени
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
я вам не верю 🙂
источник

VI

Vladimir Ivanov in Чат подкаста «Разбор Полётов»
Anton Arhipov
а, ну то есть если ты обновишь библиотеку не в Java мире то всё каким то магическим образом останется работать?
вероятность этого по опыту в сотни раз меньше
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
Vladimir Ivanov
вероятность этого по опыту в сотни раз меньше
какая то очень неподкреплённая оценка
источник

VI

Vladimir Ivanov in Чат подкаста «Разбор Полётов»
Anton Arhipov
какая то очень неподкреплённая оценка
ну это моя эмпирика
источник

AL

Andrey Listochkin in Чат подкаста «Разбор Полётов»
По опыту уровень боли от обновления:

Java - Python - Ruby - Rust - JavaScript

Слева самое болезненное, справа наименее болезненное
источник

AA

Anton Arhipov in Чат подкаста «Разбор Полётов»
я не вижу как что-то может ломаться по другому в других технологиях, если рантайм рассматривает модули/библиотеки как flat-коллекцию сущностей и нет изоляции.
источник