Lama
Мне кажется, что в данной ситуации да Ну или 300к много для автотестера При разном уровне требований к работникам.
Зарплата зарплате рознь 300к за напилсание селекторов на селениуме, без ДМС, в офисе с тайтрекером, для гемблинга И 300к за разработку распределенных систем, на приятном функциональном языке с ДМС и плавающим графиком Это совершенно разные 300к
Nikullin
Ну, там не в офисе, удаленка. Но в целом согласен
Nikullin
Частично, просто умей я второе, зная об оплате за селекторы, призадумался о пересмотре компенсации
Źmićer
А потом такие «не, ну на эликсир никого не найти»
Aleksey @cheatex
Не новость. За интересные задачи ты доплачиваешь работодателю. Если не в прямую меньшей зарплатой то косвенно хуячингом и 24/7 доступностью.
Ilya
А потом такие «не, ну на эликсир никого не найти»
у нас такое в конторе в Казахстане, предлагают работникам 30к сначала тем, у кого же опыт есть, такой бред))) я пишу больше года, выше 80 не поднимают *уки
Dmitry
Привет! А в devops какие сейчас бест праксис, где хранить helm/terraform? В том же репозитории, где и код приложения или в отдельных?
Dmitry
Привет! Да, мы храним в той же репе. Это очень удобно
У меня есть один человек в команде, мечтающий разбить всё на 10-ки реп 😂
Ihor
Удобней все держать в одном месте, даже когда микросервисы
Ihor
Каждый коммит - слепок работающий системы со всеми конфигами для его запуска
Lama
Я тоже сторонник монореп. Основной аргумент за мултирепы это то что проще настраивать CI
Dmitry
А зачем?
Его аргументация, что у приложения и терраформа разные life cycle. Терраформ должен отображать инфраструктуру.
Dmitry
Я сам дикий сторонник монореп.
Dmitry
Сам пытаюсь понять логику.
Dmitry
А причём тут репозитории?...
Видимо, что то, что имеет разные life cycle должно лежать в разных репозиториях.
Lama
Я работал на проектах, где инфраструктура была в отдельных репах И я работал на проектах, где инфраструктура была в той же репе, что и проект (и его фронтенд и всё-всё-всё) Особой принципиальной разницы я не почувствовал. В плане удобства, к мултирепам и правда чуть-чуть проще писать CI, зато гораздо сложнее менеджить версии конечного варианта
Dmitry
Поэтому и было интересно, есть ли какие преимущества у не монорепо подход
Dmitry
я чего-то не понимаю или второе и есть монорепа
С раздельными репозиториями, исправил.
Lama
Поэтому и было интересно, есть ли какие преимущества у не монорепо подход
В случае с монорепами в рамках какого-нибудь gitlab, все MR-ы и все issue лежали бы в одной репе, что не очень удобно
Андрей
А причём тут репозитории?...
Тут есть два фактора. 1. Ты разрабатываешь каждое отдельное приложение и инфру независимо. 2. Отдельные элементы функционала связаны между приложениями (например, тебе может понадобиться поддержка какой-то вещи на сервере, когда ты пилишь что-то на клиенте или когда добавляешь какой-то новый элемент инфраструктуры). В итоге проще всего с точки зрения разрабоки это менеджится, когда у каждого отдельного компонента есть какое-то подобие версионирования, где ты можешь сказать, что с такого-то момента этот компонент поддерживает функционал N, соответственно, мы можем реализовать зависящую от этого функционала фичу в другом компоненте. Команда разработки первого функционала может реализовать эту фичу и забыть о ней. Потом придёт команда разработки второго компонента и продолжит работу над этой частью системы с их стороны. Добавить фиксы в первый компонент, если это необходимо, не проблема. При этом, когда мы имеем монорепу, у нас получается мусорка на этом этапе интеграции, потому что всё неизбежно скатывается в долгоживущую ветку, в которой работает несколько человек.
Андрей
Мне кажется, монорепа наоборот получила большую популярность, потому что в ней проще настраивать CI и инфру, т.к. у тебя просто директория со всем сразу.
Lama
Мне кажется, монорепа наоборот получила большую популярность, потому что в ней проще настраивать CI и инфру, т.к. у тебя просто директория со всем сразу.
CI в монорепах сложнее сделать эффективным. Нужно очень аккуратно хэшировать код и зависимости, чтобы не запускались юнит-тесты на бэке, когда ты меняешь фронт
Lama
Тут есть два фактора. 1. Ты разрабатываешь каждое отдельное приложение и инфру независимо. 2. Отдельные элементы функционала связаны между приложениями (например, тебе может понадобиться поддержка какой-то вещи на сервере, когда ты пилишь что-то на клиенте или когда добавляешь какой-то новый элемент инфраструктуры). В итоге проще всего с точки зрения разрабоки это менеджится, когда у каждого отдельного компонента есть какое-то подобие версионирования, где ты можешь сказать, что с такого-то момента этот компонент поддерживает функционал N, соответственно, мы можем реализовать зависящую от этого функционала фичу в другом компоненте. Команда разработки первого функционала может реализовать эту фичу и забыть о ней. Потом придёт команда разработки второго компонента и продолжит работу над этой частью системы с их стороны. Добавить фиксы в первый компонент, если это необходимо, не проблема. При этом, когда мы имеем монорепу, у нас получается мусорка на этом этапе интеграции, потому что всё неизбежно скатывается в долгоживущую ветку, в которой работает несколько человек.
> всё неизбежно скатывается в долгоживущую ветку, в которой работает несколько человек. А что если я тебе скажу, что можно заиметь ветку типа feature_in_mulitple_components, а от неё бранчеваться с feature_of_component_1, feature_of_component_2 и т.д.
Lama
И как раз таки фичи, которые пилятся для нескольних компонентов, гораздо проще пилить в монорепе, чем в мультирепе
Lama
Потому что мультирепы версионируются независимо друг от друга А это именно противоположность того что нужно для фичей, задействующих несколько компонентов
Андрей
А зачем мёржить нерабочий код в мастер???
Тут поинт в долгоживущей ветке.
Lama
Тут поинт в долгоживущей ветке.
А что не так с долгоживщей веткой-то?
Андрей
И как раз таки фичи, которые пилятся для нескольних компонентов, гораздо проще пилить в монорепе, чем в мультирепе
Ага. Особенно когда вы хотите потестить какую-нибудь штуку. В отдельных репах ты просто говоришь человеку переключиться на ветку, и он продолжает работать с кодом своего приложения. В монорепе для таких случаев приходится либо извращаться, либо пушить тестовые коммиты нонстопом.
Андрей
А что не так с долгоживщей веткой-то?
Это антипаттерн, который приводит к боли.
Lama
Это антипаттерн, который приводит к боли.
В каком месте это антипаттерн-то? Взгляни на любой большой софт — у всех у них есть долгоживущие ветки. Посмотри на linux, например. В этом проекте точно знают как правильно пользоваться гитом
Андрей
Continuous Integration предполагает отсутствие долгоживущих веток и быстрый мёрж в мастер. В конечном итоге это сводится к trunk based development.
Андрей
Давай сразу к делу, твои аргументы пока что итак очень жидкие
https://martinfowler.com/articles/branching-patterns.html Можешь почитать для просвещения.
Lama
Continuous Integration никак не противоречит долгим веткам
Андрей
> martinfowler Попробуй ещё раз
Твоя очередь раскрывать мысль.)
Андрей
В каком месте это антипаттерн-то? Взгляни на любой большой софт — у всех у них есть долгоживущие ветки. Посмотри на linux, например. В этом проекте точно знают как правильно пользоваться гитом
Ну и да. Ты выбираешь, как работать с гитом в зависимости от того, как у вас выстроен процесс релизов, по большей части. Для линукса и другого крупного софта это может быть и удачная стратегия. Дефолтный вебчик должен быть куда более гибким в плане изменений, поэтому ему не подойдут те же подходы, что используются в разработке ядра ОС.
Lama
У тебя есть проблема: фича должна запилиться транзакционно в нескольких компонентах. То есть набор компонентов будет валидным либо когда эта фича присутствует во всех компонентах, либо ни в одном. Например, ты меняешь апи, и меняешь его на фронте и на бэке. В случае с мультирепами, у тебя случится вот что: у тебя будет условие типа system_is_valid = (L1 < version(component1) < R1) and (L2 < version(component2) < R2). Это ещё нормально работает, когда фича одна, но когда фичей несколько, это получается очень душно. Решение такой задачи для N компонентов с зависимостями, строго говоря, O(N!), что душно даже для компьютера, не говоря уже про человека В случае с монорепами, у тебя отсутствует вообще проблема поиска подходящих версий: всё что в долгоживущей ветке (она не обязательно должна быть долгоживущей, это типа такая транзакция), вмерживается в мастер межкомпонентный, когда фича для всех компонентов готова. Задачи поиска совместимых версий тут просто нет
Андрей
У тебя есть проблема: фича должна запилиться транзакционно в нескольких компонентах. То есть набор компонентов будет валидным либо когда эта фича присутствует во всех компонентах, либо ни в одном. Например, ты меняешь апи, и меняешь его на фронте и на бэке. В случае с мультирепами, у тебя случится вот что: у тебя будет условие типа system_is_valid = (L1 < version(component1) < R1) and (L2 < version(component2) < R2). Это ещё нормально работает, когда фича одна, но когда фичей несколько, это получается очень душно. Решение такой задачи для N компонентов с зависимостями, строго говоря, O(N!), что душно даже для компьютера, не говоря уже про человека В случае с монорепами, у тебя отсутствует вообще проблема поиска подходящих версий: всё что в долгоживущей ветке (она не обязательно должна быть долгоживущей, это типа такая транзакция), вмерживается в мастер межкомпонентный, когда фича для всех компонентов готова. Задачи поиска совместимых версий тут просто нет
А потом ты либо сталкиваешься с проблемами синхронизации в команде, когда постоянно ребейзишься, чтобы избежать конфликтов, либо внезапно у тебя всё ломается, когда ты эти конфликты пытаешься решить при одном мёрже. А с долгоживущими ветками конфликты неизбежны, если вы пилите больше одной фичи параллельно.
Андрей
На самом деле, проблема существует в обоих кейсах (что с монорепой, что без). И в обоих случаях это решается одинаково — через фичефлаги. Только с таким подходом у тебя пропадает концепция общей ветки, в которой есть готовая фича.
Андрей
Но монорепа больше способствует описанному выше бардаку.
Lama
А потом ты либо сталкиваешься с проблемами синхронизации в команде, когда постоянно ребейзишься, чтобы избежать конфликтов, либо внезапно у тебя всё ломается, когда ты эти конфликты пытаешься решить при одном мёрже. А с долгоживущими ветками конфликты неизбежны, если вы пилите больше одной фичи параллельно.
Точно так же как конфликты неизбежны с мультирепами. Вообще, проблема мержа двух параллельно разрабатываемых фичей присутствует как монорепах, так и в мультирепах. Тут скорее разговор о том, как проще поддерживать транзакционность межкомпонентной фичи. От этой транзакции никуда не деться: в случае с монорепами это одна невалидная ветка которая живёт N дней, а в случае с мультирепами это M невалидных веток, каждая из которых живёт N дней
Lama
На самом деле, проблема существует в обоих кейсах (что с монорепой, что без). И в обоих случаях это решается одинаково — через фичефлаги. Только с таким подходом у тебя пропадает концепция общей ветки, в которой есть готовая фича.
Фичефлаги можно точно так же иметь в монорепе ровно с тем же эффектом, что и в мультирепе. Когда можно добавить фичефлаги, фича фактически превращается в несколько маленьких фичей, каждая из которых задействует только один компонент Мы тут говорим о тех слуаях, когда фичефлаги невозможны
Źmićer
C мультирепой легче разворачивать энв под фичу.
Źmićer
Еще с мультирепой легче кодить на го
Źmićer
Все
Lama
C мультирепой легче разворачивать энв под фичу.
> легче разворачивать энв под фичу. Почему?
Lama
Моё разворачивание энва под фичу в монорепе: git clone project && cd project && docker-compose up
Źmićer
Моё разворачивание энва под фичу в монорепе: git clone project && cd project && docker-compose up
Если твой проект влазит на локальную тачку - то какбы что тут обсуждать
Źmićer
Монорепа есть у гуугла и яндекса
Źmićer
Представь ихний docker-compose up
Lama
Представь ихний docker-compose up
Там тот же docker-compose up, только большинство сервисов замоканы и воспроизводят тейпы Да и потом, связность у них маленькая (на сколько я слышал)
Lama
Типа, у них же там свой API DSL типа Thrift, только какой-то другой
jm
C мультирепой легче разворачивать энв под фичу.
у меня прост flake.nix в поддиректориях
Lama
Надо посмотреть как там у гугла
Lama
у меня прост flake.nix в поддиректориях
Когда у серокелла уже будет какой-нибудь годный опенсурс на эликсире, кстати? Я видел либы, но они были какие-то скучные
jm
Представь ихний docker-compose up
так и docker-compose.yml в поддиректориях тоже можно
jm
хз почему
Lama
мой соучередитель против эликсира
Понимаю, у вас же хаскелле-компания
Lama
хз почему
Нельзя сидеть на двух стулах сразу
jm
просто разные инструменты для разного
jm
а флейки я в doma тоже притащил