Сказать программисту, что для того, чтобы делать X, уже есть библиотека, это все равно что сказать / it-юмор :: приколы для даунов :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)
Подробнее
Сказать программисту, что для того, чтобы делать X, уже есть библиотека, это все равно что сказать певцу, что о любви уже есть
песня
приколы для даунов,it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор
я испытываю постоянную жопную боль из-за этого, и вместо того чтобы эффективно говнокодить, собираю велосипед. Хотя часто спасает библиотека поменьше и жопная боль не такая сильная
Вот так сделаешь на первое время, а оно и останется навсегда.
Уж лучше не тянуть всю библиотеку, а перетащить к себе в проект нужную её часть. Самим же проще будет потом.
Было бы неплохо ещё оценивать сложность втаскивания либ.
Пока у тебя простое - скорее всего либа тебе подойдёт. Но всё равно есть вероятность притащить вместе с либой целый фреймворк, который тебе и нахуй не всрался, потому
что либа самостоятельно не существует.
Что-то специфичное - и адаптация легко может быть на порядок труднее самописного. Неисправимые баги либы - в подарок.
И вообще, пусть ментейнеры библиотеки велосипедят, три-шейкинг там добавляют и прочее. А то накодируют говно в своих билиотеках, а пользователи этих библиотек потом виноваты оказываются.
То на андройде этой библиотеки не существует.
То на маке эта библиотека не линкуется из-за конфликта версий.
То когда все же собрал под мак, выясняется, что библиотека использует сервис который идет в комплекте какойго то проекта, который стоит денег, больше не продается и последний раз работал на версии мака 2014 года и на новых системках уже не стартует.
То на том самом виндовс ноутбуке крашится вся система при старте в момент загрузки этой библиотеки.
То библиотека кушает 77 петабайт ОЗУ, а без неё прога ест всего 2МБ.
Лучше б сам написал
Лучше б сам написал, чем либу юзал.
Ага. Особенно если это файл со стороны. В котором, в некотором роде, действительно что-то там comma separated, и это что-то - values, только... Ну, пустые значения это \0, экран первой и 28 колонки - \, в остальных - %, колонки с 5 по 12 fixed length (список длин прилагается), а в некоторых записях меньше на три значения, это надо трактовать как пустые 15,17,19 колонки.
А в остальном, прекрасная маркиза, все CSV, всё цэээ эс ве.
Руками это относительно легко парсится, а сторонней либой - это будет болью в жопе.
Меня напрягают сторонние библиотеки за пределами того, что дают создатели "движка" - их неупровляемость. Через лет 5 многие "ужеестьки" становятся либо устаревшими с последним обновлением 2 года назад, либо обновление на новую требует переписать половину проекта.
Есть несколько игр с собственным велосипедом, и как же я рад, что решил написать это решение. Несколько раз испытывал боль с обновлением популярного аналога в области разогретого стула либо из за прекращения разработки, либо из за очень сильного изменения библиотеки, делающего его обновление болезненным. "Своя" же библиотека не заточена на красоту, ошибок ака deprecated не будет, интерфейс не меняется, только дополняется.
Из минусов: да, однажды я поменяю место работы и для того, кто придет на смену - моя самописная библиотека станет таким же шитбургером с датой последнего обновления репозитория на дату ухода из кампании. В прочем есу ничег оне помешает продолжить её дописывать по мере необходимости.
Тоже держим свои либы для части логики( в основном для рендера и обработки пдф и парочка коммон либ). Только у нас либо древнее зло, либо в один момент "а давай нахуй перепилим весь интерфейс и выпилим часть ненужных методов". В итоге из-за этого приходится перепиливать огромные куски проектов. И отказаться от версии нельзя ибо вместе с этим "мы перестали платить за %либа_имя%, переделывайте (до релиза 1 неделя)"
Я тут дополню, свою длинную речь, что да, есть библиотеки, которые велосипедить смысла нет от слова вообще, но некоторые пытаются. Иногда дешевле свое, чем купить, тоже есть такое: велосипед по неволе.
И ещё есть библиотеки, которые просто реализовуют функционал, с минималистичным интерфейсом. А есть - по сути, "плагины" какого-либо мега-комбайна, обычно из кровавого энтерпрайза. И одну такую ты в проект не положишь, оно притянет тебе гиг хуйни за собой. И просто так не заюзаешь, ибо даже создать экземпляры объектов, которые либа принимает на вход, не заводя всю эту блядскую шарманку, которая идёт с либой, невозможно.
И вместо написания контролируемого потом кода, который решает бизнес-задачу, ты пишешь ебанный адаптер к не контролируемому. И ещё не факт, что это решит задачу именно так, как тебе нужно.
Я тебя ненавижу, чувак. Когда приходишь с проекта написанного с помщью поддерживаемой коммюнити либой, которую оттестировали 100500 человек, вылизали все интерфейсы до идеала и поддержки практически чего угодно, что только может потребоваться, на проект с самописным блевотроном, не умеющим ровно нихуя, кроме того что уже есть, кривыми наслоениями исторического говна в интерфейсах и кучей скрытых багов в узких случаях, который на каждый новый кейс приходится дописывать, если не переписывать...
"Лёг в основу" - это конечно хорошо, но, смею полагать, разница меж твоей "основой" и текущей версией - небо и земля.
"Внутренняя либа", разрабатываемая одним чуваком\маленькой командой как побочный продукт в процессе работы над основным проектом, без полировки большим комьюнити - всегда говно.
Но это лучше чем "либа с комьюнити", которое последний раз о ней вспоминало 5 лет назад =)
Тут ппц сложно все. Надо естественно сесть и оценить плюсы и минусы. В любой непонятной ситуации брать 3rd решение - такой же говноподход как и всегда писать велосипеды.
Вы ничего не понимаете. Или понимаете, но не понимаете.
У нас был случай на фирме: чуваки почти два года пилили сериализатор, чтобы по сети передавать координаты игроков и прочие данные. Клиент все это время платил зарплату целой команде.
Кто не знает, что такое сериализатор, то это то, что сжимает данные. Пример с конем в вакууме:
"вася пупкин одетый в доспех Пиздобола сидит в локации Новокукуево с бафом Проперженный диван"
в
"usr:100500;loc:13;arm:PZD;buf:-pd"
и эти данные можно быстрее передать через сеть. А на другой стороне происходит обратная операция, называемая десериализация, когда сжатая строка превращается обратно в "вася пупкин...".
Надо ли говорить, что на такую крайне необходимую функцию уже давно есть масса библиотек и решений. Я, если честно, даже не знаю как им удалось уговорить клиента писать свой сериализатор, и почему не подходили другие варианты.
>>Кто не знает, что такое сериализатор, то это то, что сжимает данные.
Подушню, сериализация -- перевод в формат, позволяющий записывать в битовую последовательность, которую уже можно отсылать по сети или в файл.
>>уже давно есть масса библиотек
Ага, например в json, который весит как мамонт. Или как пример дефолтная бинарная сериализация в .net не является секьюрной, что не рекомендуется использовать с сетях с недовереным подключением (игровые клиенты из них). Какой-нибудь protobuff не умеет во все стандарты языка. В итоге свой говнокод в целом может иметь смысл, правда при условии что там все же действительно нечто бинарное, а не как пример выше (подозреваю что это для общего понимания).
Ну и сериализатор это не то чтобы прям что-то мега жирное для написания, особенно если ты делаешь "для себя" и можно забить на обратную совместимость.
ну если это небольшой функционал, то можно тупо скопировать логику из библиотеки в свой код, и тогда не будешь в бедующем завесить от изменений в библиотеке
А теперь - я расскажу вам, когда начинается настоящий секс.
Вам надо втащить в проект либу номер один. Она вроде решает задачу, всё збс.
Втащили, накатали тонну кода, который её использует.
Потом - то же самое, но с либой номер два.
А потом вы сталкиваетесь с ситуацией, когда в либе номер один (или два, не важно), вам надо сделать мааааленкий фикс, который вам просто блокер на данный момент.
И есть превосходная новость: этот фикс за вас сделали авторы либы! Замечательно, обновляем версию, и полетели!
Ой, а чо это оно не собирается? А, ну у второй либы с этой есть общие зависимости, хули, говно вопрос, обновляем и вторую, чтобы сравнять версии либы 3, которая у обоих в дереве.
Что? Обновление до нужной версии либы 3 обновляет 3 мажорных версии либы один, и у них полностью переписано апи(вариант: нет совместимых обновлений)? Аааааааааа, сууууука.
Добро пожаловать в ад.
Либа 2, делающая нужное, зависит от либы 3 5.0.5+
Либа 1 вашей версии зависит от либы 3 до 2.0.0.
Либа 1 с зависимостью от 3 5.0.6 несовиестима с вашим кодом, и требует переписывания всего.
Добро пожаловать в ад.
Я там был.
Мы так апдейтили движок для JS HTML CSS поддержки в C++ и наоборот. В итоге плюнули, откатили все в хуй, скопипиздили фикс у автора, собрали и так и живем теперь. Сами иногда пилим фиксы.
Благо исходники автор предоставляет
Ну, будем честны. Вариант с̶п̶и̶з̶д̶и̶т̶ь̶ форкнуть авторский код, творчески выпиляв его из либы, и адаптировав к своему, вместо импорта либы, в живой природе ИТ тоже ахуенно не редкий. Хотя, в общем случае, говорить об этом не слишком принято.
Несколькими путями. Стоит сразу отметить, что большинство описываемого справедливо для версии 1.18+.
Для начала в го 100% обратная совместимость. Я дом труба шатал с питоном, хоть он мне и нравится. Не надо надеятся, что импорт с этим разобрался - всё будет норм по умолчанию.
Почти всё опенсорс. Может это лично моя болевая точка, но черный ящик - самое злое.
Все зависимости нужные можно указать вплоть до хэша конкретного коммита, в том числе можно и указать те, что прям точно не нужны, если очень хочется, либо ренж какой-то. Контролируется это ещё при компиляции, затраты времени на которую стремятся к нулю (несколько сотен тысяч строк кода обычно компилится секунд за 10-30). Не будет такого, что поднимаемая инстанция гитлаба через 10 минут вдруг скажет, что чет не работает. Я конечно люблю кофе попить, но это такое себе.
Отсутствуют как класс цикличные зависимости - компилятор объявляет ещё при сборке, что херню натворил. Казалось бы, это и есть проблема, но когда все пакеты такую проверку проходят, то становится легче дышать, но неизбежно появляется и ситуация ниже.
Проблема того, что пакет А1 использует версию Б1 0.42, а импортируемый пакет С1 использует версию Б1 0.421 решается на уровне разных (а иногда и одного при нормальном объявлении подходящей версии) го.мод и го.сам. Решается простым декларированием такого пакета как самостоятельного модуля и пусть он использует что ему нужно. И всё вместе со всеми непрямыми зависимостями тестируется встроенным в компилятор инструментом где-то за пару секунд.
Тот случай когда абстракция "Х" нихуя не применима. Например сортировка. Она есть везде и всюду, и все юзают встроенное, ибо нахуй надо. Но тут приходит задача отсортировать 100500 записей и начинается поиск ответа на вопрос 42.
Ага, а бывают ситуации когда, какой-нибудь Elasticsearch наплодил в темповой папочке, несколько сотен тысяч файлов. И сюрприз все проверенные временем и правильные unix-way решения, тупо не могут удалить эти файлы, и либо вешаются на задаче, либо пишут, что слишком много аргументов. И приходится писать свой велосипед. Или на днях нужно было считать скользящие средние, всё хорошо библиотечка популярная, куча всего, скользящие средние на любой вкус. Но проблема в том, что обрабатывать мне нужно было десятки гигов данных, и как можно скорее. Решил глянуть внутренности библиотечки. И там такие перлы, к примеру, сумма 1+2+3+n считается тупо в цикле, хотя достаточно простой формулы n * (n+1) / 2. В итоге, переписывание 2 функций по 5-6 строчек из библиотечки дало ускорение в 70 раз.
>все проверенные временем и правильные unix-way решения, тупо не могут удалить эти файлы
оставлю ремарку, что тут, скорей всего, имеются ввиду "известные мне попсовые решения", а не "правильные юникс-вей"
Правильный юникс-вей - использовать, например, find + delete, который не разворачивает * в список аргументов.
Обратное тоже имеется.
Когда либа, вместо того, чтобы делать всё в цикле, обрабатывая поток, пытается загрузить всё сразу, посчитать результаты, и выдает тебе эти результаты.
Вот только данные у тебя на терабайты, потому никак иначе, чем перемалывать постепенно поток, немедленно сбрасывая результаты в другой поток(ибо они не особо меньше), вариантов просто нет. Это медленнее, чем посчитать по датасету в памяти, но когда датасет не лезет ни в какую память...
программисты
варварская куча говна
СВЯЩЕННЫЙ проект
I СЛАВНЫЙ тимлид
/ШШ ВЕЛИКАЯ архитектура
ШШ(благороаный
коллектив
А ММ ХРАБРЫЕ
|КОВАРНЫИ
начальник
■¡ЁШ ПРИМИТИВНЫЕ coding practices
СНОТСТАЛЫЕ
петухи
ВИжестокие\ А
ЧСВшники LA
\Ч\' \\\ч'
L_\ ,/ ///' *//)
/и
SrcJ С
ЛЧХЧ *\W чЧГ
Болконский
@1_аз1:_о1с1_тап
Жена отправляет мужа-программиста в магазин: — Купи батон хлеба, если будут яйца — возьми десяток.
А муж так и не вернулся, ведь этого в запросе не было указано.
Уж лучше не тянуть всю библиотеку, а перетащить к себе в проект нужную её часть. Самим же проще будет потом.
Пока у тебя простое - скорее всего либа тебе подойдёт. Но всё равно есть вероятность притащить вместе с либой целый фреймворк, который тебе и нахуй не всрался, потому
что либа самостоятельно не существует.
Что-то специфичное - и адаптация легко может быть на порядок труднее самописного. Неисправимые баги либы - в подарок.
То на маке эта библиотека не линкуется из-за конфликта версий.
То когда все же собрал под мак, выясняется, что библиотека использует сервис который идет в комплекте какойго то проекта, который стоит денег, больше не продается и последний раз работал на версии мака 2014 года и на новых системках уже не стартует.
То на том самом виндовс ноутбуке крашится вся система при старте в момент загрузки этой библиотеки.
То библиотека кушает 77 петабайт ОЗУ, а без неё прога ест всего 2МБ.
Лучше б сам написал
Лучше б сам написал, чем либу юзал.
А в остальном, прекрасная маркиза, все CSV, всё цэээ эс ве.
Руками это относительно легко парсится, а сторонней либой - это будет болью в жопе.
А это так, повод достать свою виртуальную медальку грандмастера легаси и костылестроения, и написать парсер.
Есть несколько игр с собственным велосипедом, и как же я рад, что решил написать это решение. Несколько раз испытывал боль с обновлением популярного аналога в области разогретого стула либо из за прекращения разработки, либо из за очень сильного изменения библиотеки, делающего его обновление болезненным. "Своя" же библиотека не заточена на красоту, ошибок ака deprecated не будет, интерфейс не меняется, только дополняется.
Из минусов: да, однажды я поменяю место работы и для того, кто придет на смену - моя самописная библиотека станет таким же шитбургером с датой последнего обновления репозитория на дату ухода из кампании. В прочем есу ничег оне помешает продолжить её дописывать по мере необходимости.
"Внутренняя либа", разрабатываемая одним чуваком\маленькой командой как побочный продукт в процессе работы над основным проектом, без полировки большим комьюнити - всегда говно.
Тут ппц сложно все. Надо естественно сесть и оценить плюсы и минусы. В любой непонятной ситуации брать 3rd решение - такой же говноподход как и всегда писать велосипеды.
У нас был случай на фирме: чуваки почти два года пилили сериализатор, чтобы по сети передавать координаты игроков и прочие данные. Клиент все это время платил зарплату целой команде.
Кто не знает, что такое сериализатор, то это то, что сжимает данные. Пример с конем в вакууме:
"вася пупкин одетый в доспех Пиздобола сидит в локации Новокукуево с бафом Проперженный диван"
в
"usr:100500;loc:13;arm:PZD;buf:-pd"
и эти данные можно быстрее передать через сеть. А на другой стороне происходит обратная операция, называемая десериализация, когда сжатая строка превращается обратно в "вася пупкин...".
Надо ли говорить, что на такую крайне необходимую функцию уже давно есть масса библиотек и решений. Я, если честно, даже не знаю как им удалось уговорить клиента писать свой сериализатор, и почему не подходили другие варианты.
Подушню, сериализация -- перевод в формат, позволяющий записывать в битовую последовательность, которую уже можно отсылать по сети или в файл.
>>уже давно есть масса библиотек
Ага, например в json, который весит как мамонт. Или как пример дефолтная бинарная сериализация в .net не является секьюрной, что не рекомендуется использовать с сетях с недовереным подключением (игровые клиенты из них). Какой-нибудь protobuff не умеет во все стандарты языка. В итоге свой говнокод в целом может иметь смысл, правда при условии что там все же действительно нечто бинарное, а не как пример выше (подозреваю что это для общего понимания).
Ну и сериализатор это не то чтобы прям что-то мега жирное для написания, особенно если ты делаешь "для себя" и можно забить на обратную совместимость.
Вам надо втащить в проект либу номер один. Она вроде решает задачу, всё збс.
Втащили, накатали тонну кода, который её использует.
Потом - то же самое, но с либой номер два.
А потом вы сталкиваетесь с ситуацией, когда в либе номер один (или два, не важно), вам надо сделать мааааленкий фикс, который вам просто блокер на данный момент.
И есть превосходная новость: этот фикс за вас сделали авторы либы! Замечательно, обновляем версию, и полетели!
Ой, а чо это оно не собирается? А, ну у второй либы с этой есть общие зависимости, хули, говно вопрос, обновляем и вторую, чтобы сравнять версии либы 3, которая у обоих в дереве.
Что? Обновление до нужной версии либы 3 обновляет 3 мажорных версии либы один, и у них полностью переписано апи(вариант: нет совместимых обновлений)? Аааааааааа, сууууука.
Добро пожаловать в ад.
Либа 2, делающая нужное, зависит от либы 3 5.0.5+
Либа 1 вашей версии зависит от либы 3 до 2.0.0.
Либа 1 с зависимостью от 3 5.0.6 несовиестима с вашим кодом, и требует переписывания всего.
Добро пожаловать в ад.
Я там был.
Благо исходники автор предоставляет
Для начала в го 100% обратная совместимость. Я дом труба шатал с питоном, хоть он мне и нравится. Не надо надеятся, что импорт с этим разобрался - всё будет норм по умолчанию.
Почти всё опенсорс. Может это лично моя болевая точка, но черный ящик - самое злое.
Все зависимости нужные можно указать вплоть до хэша конкретного коммита, в том числе можно и указать те, что прям точно не нужны, если очень хочется, либо ренж какой-то. Контролируется это ещё при компиляции, затраты времени на которую стремятся к нулю (несколько сотен тысяч строк кода обычно компилится секунд за 10-30). Не будет такого, что поднимаемая инстанция гитлаба через 10 минут вдруг скажет, что чет не работает. Я конечно люблю кофе попить, но это такое себе.
Отсутствуют как класс цикличные зависимости - компилятор объявляет ещё при сборке, что херню натворил. Казалось бы, это и есть проблема, но когда все пакеты такую проверку проходят, то становится легче дышать, но неизбежно появляется и ситуация ниже.
Проблема того, что пакет А1 использует версию Б1 0.42, а импортируемый пакет С1 использует версию Б1 0.421 решается на уровне разных (а иногда и одного при нормальном объявлении подходящей версии) го.мод и го.сам. Решается простым декларированием такого пакета как самостоятельного модуля и пусть он использует что ему нужно. И всё вместе со всеми непрямыми зависимостями тестируется встроенным в компилятор инструментом где-то за пару секунд.
Если зависимостей чёт много и хрен разберешься, то тот же компилятор может сам вычистить всё ненужное. Исключением будет это: https://github.com/golang/go/wiki/Modules#why-does-go-mod-tidy-record-indirect-and-test-dependencies-in-my-gomod
Ну это если вкратце то, что мне заходит и что вспомнил так сразу. Пока проблема с зависимостью если и появлялась, то решалась за такое смехотворное время, что даже упоминать её не стоит.
https://stephencoakley.com/2019/04/24/how-rust-solved-dependency-hell
Или на днях нужно было считать скользящие средние, всё хорошо библиотечка популярная, куча всего, скользящие средние на любой вкус. Но проблема в том, что обрабатывать мне нужно было десятки гигов данных, и как можно скорее. Решил глянуть внутренности библиотечки. И там такие перлы, к примеру, сумма 1+2+3+n считается тупо в цикле, хотя достаточно простой формулы n * (n+1) / 2.
В итоге, переписывание 2 функций по 5-6 строчек из библиотечки дало ускорение в 70 раз.
оставлю ремарку, что тут, скорей всего, имеются ввиду "известные мне попсовые решения", а не "правильные юникс-вей"
Правильный юникс-вей - использовать, например, find + delete, который не разворачивает * в список аргументов.
Когда либа, вместо того, чтобы делать всё в цикле, обрабатывая поток, пытается загрузить всё сразу, посчитать результаты, и выдает тебе эти результаты.
Вот только данные у тебя на терабайты, потому никак иначе, чем перемалывать постепенно поток, немедленно сбрасывая результаты в другой поток(ибо они не особо меньше), вариантов просто нет. Это медленнее, чем посчитать по датасету в памяти, но когда датасет не лезет ни в какую память...