нормальных за 10 лет не встречал, плотно работал с Gradle, Buck, Bazel
не оч плотно: Make, Maven, Ant, Cargo, Go build
было бы круто иметь в билд системе:
1. статически типизированный современный яп для билд файлов и плагинов вроде Kotlin 2. параллельную конфигурацию модулей 3. кеширование конфигурации 4. параллельное выполнение билд графа 5. локальный билд кеш между проектами
6. распределенный ремоут билд кеш 7. трейсинг и профайлинг конфигурации и билд графа 8. строгое версионирование и верификация зависимостей 9. легковесная контейнерезация окружения выполнения 10. JSON/etc вывод для интеграции с IDE и другим тулингом 11. мониторинг файловой системы
12. распределенное ремоутное выполнение билда на кластере машин с контейнерезацией окружения выполнения 13. поддержка зависимостей как исходники и как пребилд
наверняка шото забыл, разберу по пунктам как это работает в существующих системах
1. яп конфигурирования и плагинов:
Gradle: Groovy мрак, гадаешь типы, интерпретация не оч быстрая, добавили Kotlin, стало получше
но Gradle разрешает сайд эффекты в билд скриптах(!)
то есть в конфигурационном файле или плагине буквально можно делать любой файловый или сетевой IO
это безумие
ломает повторяемость конфигурации проекта: два раза запускаешь — результат может зависеть от внешних файторов, секьюрити риск
1. Bazel: яп конфигурации и плагинов
вводная такая, Bazel не супер известная, но довольно крутая билд система от Google
внутри известна как Blaze, начиналась ещё в середине 2000х, где-то в 2015 стала оупен сорсной
у них свой яп конфигурации и плагинов (rules) — Starlark
Starlark синтаксически копирует Python, но имеет свою стандартную библиотеку без IO и интерпретатор, который жестко ограничивает сайд эффекты и не позволяет хранить глобальное состояние в памяти
из прикольного, rule в Bazel может создать Persistent Worker — процесс который оборачивает какую-то штуку в демона, удобно для интеграции JVM/etc тулов в билд которые для перформанса лучше держать горячими, чем запускать на каждый чих
экономически удаленный кеш это крайне целесообразная штука тк сохраняет человеко и cpu часы
надеюсь, сможем стабильно продавать и окупаться
делаем большой упор на производительность: min latency, max throughput
на этой задаче можно собаку съесть, разрабатывать in-house дорого
естественно есть оупен сорс реализации
на небольших нагрузках они работают, можно и S3 использовать если по деньгам, перформансу и лимитам ок
Grаdle предоставляет это как часть их Enterprise решения, но оно оч дорогое
норм облачного я пока не видел, есть шанс быть первыми
планирую запустить в двух режимах:
free с лимитами для оупен сорс проектов
paid для коммерческих клиентов, выбираешь сколько нужно места, регион, рейт лимиты
→ ускорение билдов!
self-hosted может позже, сложно упаковать в удобный для распределенного деплоя и обновлений
как мы оптимизируем latency и throughput на бекенде:
- только NVMe диски
- non-blocking IO (io_uring) оч рад что нашел человека который по этому тоже загоняется
- альфа на Kotlin JVM, бета на Rust -> уберем GC паузы, будем профилировать конечно
- аккуратная работа с БД
7. трейсинг и профайлинг конфигурации и билд графа
во многих билд системах хорошо если время в логах есть
а вот Bazel и Gradle молодцы
у Bazel мега крутой трейсинг в формате Chrome Trace
у Gradle есть Build Scan и gradle-profiler
тк оба на JVM можно цеплять JVM профайлеры
тулкит для профайлинга билда это критический инструмент для средних-больших проектов
у меня коллега 8 месяцев потратил на свое решение, чтобы анализировать проблемные места
без данных это гадание на кофейной гуще, легко потратить время на оптимизацию того, что не так важно
оптимизации для инфраструктурных команды build eng и devops — большИй кусок работы после введения системы в эксплуатацию
дорогущий Grаdle Enterprise в этом плане комплексно решает проблему тк централизованно собирает статистику
для других систем надо велосипедить
удивлен шо JеtBrains до сих пор не предоставили какой-то аналог Google Analytics для разработчиков
могут очень много данных из IntelliJ собирать и классифицировать как по билдам так и по работе с кодом
мы делали кастомную аналитику для тулинга, это больно
периодически задумываюсь может стоит как второй коммерческий проект Pushtorefresh сделать
но раз за разом прихожу к осознанию
шо аналитика уровня Google Analytics и Я Метрики оч сложная задача по хранению и анализу огромного кол-ва данных
есть другие low hanging fruits
8. строгое версионирование и верификация зависимостей
меня как-то раскритиковали Go-шники, за мой наезд на то что у них зависимости тянутся как гит репозитории просто с мастер ветки
и есть КОНВЕНЦИЯ шо не надо ломать совместимость и пожалуйста не внедряйте бэкдоры
треш
с тех пор воды утекло, почти все билд системы позволяют четко указать версии зависимостей
генерируют dependencies-lock файл, в котором их version solver вычисляет какую версию конкретной зависимости нужно использовать
+ проверка подписи, шобы не подсунули фейк
и хорошо
без фиксированных версий зависимостей я не знаю как спать по ночам
когда любой следующий билд может получить более новую версию какой-то библиотеки
и ваш продукт уйдет в прод с неизвестными багами, а еще хуже с какими-нибудь бекдорами или уязвимостями
фиксируйтесь!
то же самое относится к удалению зависимостей из централизованных репозиториев
известный случай в JS комьюнити — удаление библиотеки left-pad из NPM Registry
чел снес 17 строчек кода и на несколько дней поставил тысячи JS команд в состояние — у нас не работает билд
безумие
с тех пор большинство подобных репозиториев приняли политику
шо библиотеку с реальным использованиями нельзя удалить, кроме случаев когда там вредоносный код или шото около того
также решается self-hosted репозиторием артефактов типа Artifactory от JFrog, который хранит копии
9. легковесная контейнерезация окружения выполнения
для разных build action/task нужно разное окружение: какие-то SDK, утилиты определенных версий в PATH и тп
условно говоря, это то что дает Docker: повторяемое окружение для программы
afaik это нет ни в одной из билд систем
и это задача разработчиков или билд инженеров поддерживать локальное и CI окружение в нужном состоянии для успешного билда
задача паршивая, часто это macOS/Windows у разработчиков, Linux на CI
Docker спасибо за всё легенда
хочется на action иметь возможность указать image
это оч больно мейнтейнить в больших командах
я писал тулы и скрипты чисто для этой проблемы, шобы при вызове билда у разработчика быстро проверить все ли пакеты нужных версий есть или доставить
все это версионировалось с проектом в VCS
на CI естественно контнейнеры
в Lуft я перед уходом сделал CI на k8s с разными версионированными образами на разные задачи и динамическим шедулингом и автоскейлингом
он стал летать и потреблять 10x меньше денег в месяц, но менеджмент не особо оценил :/
Так сложилось исторически, что последние 8 лет я занимаюсь несколькими проектами одновременно. По каждому проекту много задач. Со временем моей оперативки перестало хватать на то, чтобы запоминать всё. И я начала срывать дедлайны и подводить людей.
Возникла потребность в неком подходе, решающем эту проблему. Пробовала многое: писала задачи на день на листочке, выделяла отдельные дни под проекты, тудушки, календари, напоминалки… Проблема не решалась, только множилось количество бесполезных действий.
В итоге я пришла к bullet journal. Если коротко — миллениалы переизобрели ежедневники. Суть в том, что вы заводите физический ежедневник с _линовкой_ в точку. И записываете туда всё, что надо запомнить.
Сегодня будет небольшой тред-заметка про то, что помогает готовиться к выступлениям.
Вебинары, лекция, выступление — для всего пригодится.
Первым делом выбор темы. Если это не лекция на заданную тему, то стараюсь выбирать то, в что действительно интересно. Если есть энергия, заряженности, то она передаётся зрителю.
После выбора темы составляю план. Это помогает зафиксировать важные темы, о которых обязательно нужно сказать.
Пока меня тут джависты в конец не съели (хотя я и сам в большой степени джавист). Еще один небольшой тред. Про computer science.
Дело в том, что широко бытует у подрастающего поколения заблуждение о том, что программирование - это то же самое, что и computer science.
На самом деле нет. Computer science еще дальше от прикладного программирования, чем физика. Computer science - это в большой степени изучение теории алгоритмов решаемости отдельных задач и вопросы асимптотической сложности.
Все, доделал часть дел. Теперь #треддня. Как обещал про IT образование вообще и "первый язык" в частности.
Ну для начала непопулярное мнение. Не всем нужно войти вайти. Да, на данный момент, в IT сильно не хватает людей, поэтому зарплаты все еще высокие. Особенно в России, которая к сожалению страна достаточно бедная и возможность работать на международную компанию очень ценится.
Тем не менее как раз потому что зарплаты высокие, люди часто идут в IT не потому, что оно им нравится, а в погоне за этой самой зарплатой. Часто это так себе заканчивается. Даже в самих IT есть разные задачи, не связанные с программированием.
Забабахаю все-таки на ночь глядя небольшой тредик.
Мне тут на интервью очень хороший вопрос задали: какие технологии надо в первую очередь осваивать для научного программирования. Я как-то об этом даже не задумывался. А вопрос отличны. Подумал. Пишу приблизительный ответ.
Питон (да простит меня @_bravit) все-таки маст-хэв. Он есть и, я думаю, долго еще останется, некоторым общим минимумом среди научных программистов. Разумеется, не столько Python, сколько numpy.
К счастью, его освоение занимает пару недель максимум (см. тред про идеологию).
Учить бы я стал в первую очередь веб-технологии. И клиентские и серверные. Как ни удивительно, эта область уже содержит многие вещи, нужные для науки. Коммуникационные протоколы, технологии работы с данными и соответствующие архитектуры.