Меньше знаешь - крепче спишь
Фраза спорная, но в написании кода помогает: несколько раз за последние 2 недели ловил себя на смешной ошибке, когда автодополнением кода вставлял имя не той переменной, которое требовалось.
В моем случае ошибки относительно безобидные - несколько раз в логи вместе поля computer_uid я писал просто uid. В будущем это явно бы могло сыграть со мной злую шутку, если бы пришлось решать проблему на стороне клиента.
Причем подобные ошибки достаточно легко пропустить, а допустить их можно много раз в одном блоке кода.
Можно себя обезопасить, задав себе вопрос: а не слишком ли много знает этот кусочек кода/класс/подпрограмма?
Если много - то уберите лишний контекст, дайте ровно столько данных, сколько нужно. Дадите больше данных - можете их криво использовать.
Интересно, почему в MISRA или NASA стандартах для надежного C кода, который должен стабильно работать в автомобилях и на луне, нет подобного пункта.
Отберите у себя возможность ошибки, как родители отбирали у вас провод от компьютера в детстве💻
Фраза спорная, но в написании кода помогает: несколько раз за последние 2 недели ловил себя на смешной ошибке, когда автодополнением кода вставлял имя не той переменной, которое требовалось.
В моем случае ошибки относительно безобидные - несколько раз в логи вместе поля computer_uid я писал просто uid. В будущем это явно бы могло сыграть со мной злую шутку, если бы пришлось решать проблему на стороне клиента.
Причем подобные ошибки достаточно легко пропустить, а допустить их можно много раз в одном блоке кода.
Можно себя обезопасить, задав себе вопрос: а не слишком ли много знает этот кусочек кода/класс/подпрограмма?
Если много - то уберите лишний контекст, дайте ровно столько данных, сколько нужно. Дадите больше данных - можете их криво использовать.
Интересно, почему в MISRA или NASA стандартах для надежного C кода, который должен стабильно работать в автомобилях и на луне, нет подобного пункта.
Отберите у себя возможность ошибки, как родители отбирали у вас провод от компьютера в детстве
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Есть вещи из моей практики C++ программиста(кроме статической типизации), по которым я скучаю.
Например по алгоритмам из стандартной библиотеки.
Вот на примере кусок кода все из той же Chromium OS, который двигает панели.
На первом скрине исходный код, на втором и третьем результат рефакторинга. Вариант на третьем скрине использует обобщенный бинарный алгоритм поиска, за счет чего более хорош по сложности, но суть не в этом.
Суть в очень красивом, по моему мнению, и лаконичном подходе с использованием обобщенного программирования или дженериков в простонародье. Насильно все к ним приводить не стоит, но уместное использование сильно режет количество кода. Меньше кода - меньше потенциального места для ошибок.
В питонячьей среде дженерики тоже есть, но вот аналога stl нет, да и не будет его. А мест, где нужно итерироваться по коллекциям, тьма. Пишем for дальше, что поделать💻
Например по алгоритмам из стандартной библиотеки.
Вот на примере кусок кода все из той же Chromium OS, который двигает панели.
На первом скрине исходный код, на втором и третьем результат рефакторинга. Вариант на третьем скрине использует обобщенный бинарный алгоритм поиска, за счет чего более хорош по сложности, но суть не в этом.
Суть в очень красивом, по моему мнению, и лаконичном подходе с использованием обобщенного программирования или дженериков в простонародье. Насильно все к ним приводить не стоит, но уместное использование сильно режет количество кода. Меньше кода - меньше потенциального места для ошибок.
В питонячьей среде дженерики тоже есть, но вот аналога stl нет, да и не будет его. А мест, где нужно итерироваться по коллекциям, тьма. Пишем for дальше, что поделать
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Forwarded from FastNews | Никита Пастухов
Как отправить жопу мейнтейнера в космос. Краткий гайд от вайбкодеров.
У нас тут first-time-contributor притащил в FastStream прикольную фичу – поддержку HTTP в AsyncAPI.
Сначала код выглядел достаточно чистенько, но с косяками. Я подробно описывал, что поправить – в несколько итераций. В общем, обычный процесс ревью. В итоге пришли к финальной версии, где все норм. Я пошел проверять и кое-что править (а то я и так чувака заебал своими правками) – и оказалось, что его правки в AsyncAPI схему тупо не соответствуют спецификации – он их сам придумал. Схема не валидна и не рисуется...
А вероятнее даже их придумал не он, а LLM. У меня сейчас складывается картинка, что чувак просто закинул кодбазу + Issue в LLM, а вывод закинул как PR. Я же ревьюил код нейронки, а он просто кидал мои комменты обратно в LLM. А в итоге все вообще превратилось в тыкву, которая с самого начала была чьими-то галлюцинациями.
Ебаные блять вайб-фармеры-коммитов-в-OpenSource. Я трачу свое время на сопровождение PR, а он тупо в LLM все закидывает
https://github.com/ag2ai/faststream/pull/2142
У нас тут first-time-contributor притащил в FastStream прикольную фичу – поддержку HTTP в AsyncAPI.
Сначала код выглядел достаточно чистенько, но с косяками. Я подробно описывал, что поправить – в несколько итераций. В общем, обычный процесс ревью. В итоге пришли к финальной версии, где все норм. Я пошел проверять и кое-что править (а то я и так чувака заебал своими правками) – и оказалось, что его правки в AsyncAPI схему тупо не соответствуют спецификации – он их сам придумал. Схема не валидна и не рисуется...
А вероятнее даже их придумал не он, а LLM. У меня сейчас складывается картинка, что чувак просто закинул кодбазу + Issue в LLM, а вывод закинул как PR. Я же ревьюил код нейронки, а он просто кидал мои комменты обратно в LLM. А в итоге все вообще превратилось в тыкву, которая с самого начала была чьими-то галлюцинациями.
Ебаные блять вайб-фармеры-коммитов-в-OpenSource. Я трачу свое время на сопровождение PR, а он тупо в LLM все закидывает
https://github.com/ag2ai/faststream/pull/2142
GitHub
feat: Add AsyncAPI HTTP Support by tmulligan98 · Pull Request #2142 · ag2ai/faststream
Description
Add support for an include_in_schema parameter to register HTTP routes in the app schema
TODO: Should include_in_schema be True by default?
Part of #2091
Type of change
Please delete op...
Add support for an include_in_schema parameter to register HTTP routes in the app schema
TODO: Should include_in_schema be True by default?
Part of #2091
Type of change
Please delete op...
Маты заблюрить к сожалению не могу, поэтому прошу простить.
Много разговоров про пользу и помощь от LLM’ок, кто-то там уже найм замораживает и людей опять под нож планирует, но я либо не туда смотрю, либо мне пора очки надевать: я будто не видел положительных кейсов, когда моделька могла бы реально закрывать задачи.
Пока я будто вижу один большой стеб вайбкодеров и разговоры вокруг да около, за исключением генерации картинок и видео( меня очень зацепил сгенерированный роман «Ангельский двигатель», прикольно сделано). Как крутой поисковик тоже сойдет, по сути сейчас точка начала моего ресерча в неизвестных мне темах начинается с запроса в дипсик, а дальше раскручиваю по старинке.
У вас есть сохраненные примеры успешного внедрения LLM у каких-либо компаний? Поделитесь, буду признателен👀
Много разговоров про пользу и помощь от LLM’ок, кто-то там уже найм замораживает и людей опять под нож планирует, но я либо не туда смотрю, либо мне пора очки надевать: я будто не видел положительных кейсов, когда моделька могла бы реально закрывать задачи.
Пока я будто вижу один большой стеб вайбкодеров и разговоры вокруг да около, за исключением генерации картинок и видео( меня очень зацепил сгенерированный роман «Ангельский двигатель», прикольно сделано). Как крутой поисковик тоже сойдет, по сути сейчас точка начала моего ресерча в неизвестных мне темах начинается с запроса в дипсик, а дальше раскручиваю по старинке.
У вас есть сохраненные примеры успешного внедрения LLM у каких-либо компаний? Поделитесь, буду признателен
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Я тут проект под ключ реализовал
Для кого заключительная неделя перед релизом, а для меня первый день отпуска. Отоспавшись на выходных, решил подвести итоги своей работы за полдгода.
С декабря месяца я взялся поднимать функциональность аналитики и отчетности в АСМ(это продукт, разработкой которого я занимаюсь). План был прост:
1) Собрать команду
2) Разобраться в устройстве корпоративных хранилищ данных, ведь аналитика и отчетность строится на каких-то данных, а данные еще нужно сложить и подготовить для отображения(привет data engineering).
3) Разобраться в моделирование бизнес-процессов для подготовки аналитических данных.
4) Сделать хранилище и смоделировать один бизнес процесс для обкатки выбранных подходов и инструментов.
5) Сделать отображение данных в графиках и таблицах.
И тут в целом можно было вспомнить, что я так-то бекенд разработчик, чем я тут вообще занимаюсь. Но вспоминать было некогда — работы вагон и еще три состава:
— Вместо одного бизнес процесса моделировать пришлось 5. Два месяца я засыпал и просыпался я в обнимку с томиком Кимбалла.
— Параллельно происходил ресерч и обоснование выбранных технологий для построения ETL-процессов и отображения данных, ресурсов на разработку собственных решений за отведенное время нет.
— Команда собрана. Нас пятеро друзей Оушена.
— Мы соответствуем РБПО, поэтому выбранные инструменты затянуты к себе и взяты на поддержку.
— Были подняты стенды для дев и целевой среды, так на свет родились deb-пакеты для Airflow и Superset, несуществовавшие в природе до этого. CI часть этого всего — это почти еще один продукт :)
— Разработаны ETL-процессы. Полностью. С нуля.
— Разработаны предустановленные отображения для данных. 6 страниц с кучей данных и переходами между друг другом, связанные общими фильтрами.
— Мы разворачиваемся у клиента с минимальными махинациями в админках используемых инструментов — так в dag-скриптах появились env’ы с подключением к БД и автоматический импорт дашбордов.
— Документация. Мы еще даже рассказываем, как при желании сделать собственные страницы с отчетами и как у нас там данные лежат.
Список можно продолжать и дальше, привел ключевые пункты. На самом деле делать пришлось больше запланировано, в конце апреля я сидел и думал, успеем ли мы все сделать. Сделали большую часть, прям блин большую.
Выпускаемся и смотрим, что делаем дальше. Жду обратную связь от пользователей.
Сделано столько работы, а это будто лишь начало пути.
Для кого заключительная неделя перед релизом, а для меня первый день отпуска. Отоспавшись на выходных, решил подвести итоги своей работы за полдгода.
С декабря месяца я взялся поднимать функциональность аналитики и отчетности в АСМ(это продукт, разработкой которого я занимаюсь). План был прост:
1) Собрать команду
2) Разобраться в устройстве корпоративных хранилищ данных, ведь аналитика и отчетность строится на каких-то данных, а данные еще нужно сложить и подготовить для отображения(привет data engineering).
3) Разобраться в моделирование бизнес-процессов для подготовки аналитических данных.
4) Сделать хранилище и смоделировать один бизнес процесс для обкатки выбранных подходов и инструментов.
5) Сделать отображение данных в графиках и таблицах.
И тут в целом можно было вспомнить, что я так-то бекенд разработчик, чем я тут вообще занимаюсь. Но вспоминать было некогда — работы вагон и еще три состава:
— Вместо одного бизнес процесса моделировать пришлось 5. Два месяца я засыпал и просыпался я в обнимку с томиком Кимбалла.
— Параллельно происходил ресерч и обоснование выбранных технологий для построения ETL-процессов и отображения данных, ресурсов на разработку собственных решений за отведенное время нет.
— Команда собрана. Нас пятеро друзей Оушена.
— Мы соответствуем РБПО, поэтому выбранные инструменты затянуты к себе и взяты на поддержку.
— Были подняты стенды для дев и целевой среды, так на свет родились deb-пакеты для Airflow и Superset, несуществовавшие в природе до этого. CI часть этого всего — это почти еще один продукт :)
— Разработаны ETL-процессы. Полностью. С нуля.
— Разработаны предустановленные отображения для данных. 6 страниц с кучей данных и переходами между друг другом, связанные общими фильтрами.
— Мы разворачиваемся у клиента с минимальными махинациями в админках используемых инструментов — так в dag-скриптах появились env’ы с подключением к БД и автоматический импорт дашбордов.
— Документация. Мы еще даже рассказываем, как при желании сделать собственные страницы с отчетами и как у нас там данные лежат.
Список можно продолжать и дальше, привел ключевые пункты. На самом деле делать пришлось больше запланировано, в конце апреля я сидел и думал, успеем ли мы все сделать. Сделали большую часть, прям блин большую.
Выпускаемся и смотрим, что делаем дальше. Жду обратную связь от пользователей.
Сделано столько работы, а это будто лишь начало пути.
👍8🫡3
Год назад Redis решил сменить лицензию в рамках своей войны с облачными провайдерами, которые предоставляют managed service. Мол "не хорошо, что ребята пользуются плодами open source, зарабатывают деньги, а своими доработками(а провайдеры допиливают технологию, чтобы продавать получше) не делятся. Хотя, насколько мне известно, всеми любимый Яндекс таки контрибьютил в Redis.
И как-то так сложилось, что "картельный сговор", состоящий из Amazon, Google Cloud, Oracle, а эти ребята далеко не последние по предоставлению облачных услуг, подсуетился и выпустил Valkey, в рамках которого планировалось дальнейшее развитие открытой кодовой базы редиски. Лицензия BSD, контроль проекта у Linux Foundation.
Сначала был просто форк, но осенью прошлого года вышел релиз Valkey 8.0, который решил:
1) пересмотреть подход к работе с потоками(да, редис не однопоточный в современных версиях, команды в один поток, но под сторонние активности потоки есть)
2) оптимизация хеш-таблиц — за счет предвыборки данных значения в бакете(хеш таблицы реализованы на методах закрытой адресации) и закидыванием их в кеш процессора(L1), избавились от последовательного чтения из оперативки. Может показаться, что экономят на спичках, но задержку сократили вдвое, звучит прекрасно.
3) починили репликацию — изменения на мастере, которые происходят, пока реплика оживает, теперь отправляются на реплику, а не хранятся на мастере.
4) немного память оптимизировали для словарей, но работает только при небольших размерах ключей.
5) докинули метрик — использование процессора, статистика по использованию ключей, метрики ввода/вывода по каждому слоту кластера. Теперь искать слоты с повышенной нагрузкой легче.
Хоть Redis и дал заднюю в 8 версии, сказав "цели и задачиспециальной изменения лицензий достигли цели, вон эти халавщики выкинули свое детище в открытый мир, теперь мы вместе работаем на благо мира" и Санфилиппо вернули, но телодвижения интересные, конечно.
Признавайтесь, была у кого паника в компании в прошлом году по этому поводу?
И как-то так сложилось, что "картельный сговор", состоящий из Amazon, Google Cloud, Oracle, а эти ребята далеко не последние по предоставлению облачных услуг, подсуетился и выпустил Valkey, в рамках которого планировалось дальнейшее развитие открытой кодовой базы редиски. Лицензия BSD, контроль проекта у Linux Foundation.
Сначала был просто форк, но осенью прошлого года вышел релиз Valkey 8.0, который решил:
1) пересмотреть подход к работе с потоками(да, редис не однопоточный в современных версиях, команды в один поток, но под сторонние активности потоки есть)
2) оптимизация хеш-таблиц — за счет предвыборки данных значения в бакете(хеш таблицы реализованы на методах закрытой адресации) и закидыванием их в кеш процессора(L1), избавились от последовательного чтения из оперативки. Может показаться, что экономят на спичках, но задержку сократили вдвое, звучит прекрасно.
3) починили репликацию — изменения на мастере, которые происходят, пока реплика оживает, теперь отправляются на реплику, а не хранятся на мастере.
4) немного память оптимизировали для словарей, но работает только при небольших размерах ключей.
5) докинули метрик — использование процессора, статистика по использованию ключей, метрики ввода/вывода по каждому слоту кластера. Теперь искать слоты с повышенной нагрузкой легче.
Хоть Redis и дал заднюю в 8 версии, сказав "цели и задачи
Признавайтесь, была у кого паника в компании в прошлом году по этому поводу?
www.opennet.ru
СУБД Redis переходит на проприетарную лицензию. Обсуждение удаления Redis из Fedora
Компания Redis Ltd объявила об изменении лицензии на СУБД Redis, относящейся к классу NoSQL-систем. Начиная с выпуска Redis 7.4 код проекта будет распространяться под двумя проприетарными лицензиями RSALv2 (Redis Source Available License v2) и SSPLv1 (Server…
🫡3👍2
Фото специально размыто, коммерческая тайна и все такое :)
Последний раз писал апишку почти год назад. Сейчас временно моя команда раскидалась на помощь другим, я пошел помогать в старую команду и сел запиливать базовые CRUD операции, тыкать в аналитиков палкой, требуя спецификации к входным и выходным схемам, в темпе вальса мокать апишку, чтобы фронты могли потестить свою верстку и все такое. Типичное крудошлепство, почти отдых, за исключением того, что сервис совсем новый, только в CI закинута болванка сервиса, чтобы можно было деплоится, и все.
Наши сервисы имеют слоистую архитектуру с кучей другой паттернов: адаптеры, репозитории для запросов в хранилище, команды и запросы(привет CQRS), unit of work для обеспечения транзакционности действий в системе, агрегаты, сервисы, билдеры на сервисы и билдеры на модели, все еще на интерфейсах, чтобы тестировать удобно было... Чтобы реализовать ручку, нужно реализовать 5-6 интерфейсов и реализаций. Ситуация, как в тех бородатых анекдотах про реализацию чего-угодно в Java: сначала напишите фабрику, а если фабрика уже есть - напишите абстрактную фабрику. Пришлось вспоминать, как вообще все эти сущности между собой должны дружить.
Понятно, что вернувшись через год к типу задач, реализация которых подразумевает кучу всего, нужно будет переключить мозги, но по моему мнению, если ты возвращаешься к своему проекту и вообще не понимаешь, что тут и как работает - это либо ты сильно все упростил, либо сильно перемудрил. Причем с первым разобраться сильно проще, чем со вторым, на мой взгляд.
Отсюда два вывода:
1) Настраивайте себе шаблонизаторы, когда у вас устоявшиеся подходы.
2) Если ваш сервис предполагает, что про его разработку забудут на полгода-год(на моей памяти есть такой сервис для получения курса валют), есть смысл писать его проще - в плоских структурах и куче if-ов быстрее разобраться(да-да, рубрика "Вредные советы"). Опять же если не написана совсем жесть, тогда земля пухом🔫 .
Всем доброй ночи, а я пошел запиливать себе шаблоны наконец-то, ибо те 30 файликов на скрине ПРа меня утомили.💻 Это кстати реализация Create операции, с тестами...
Последний раз писал апишку почти год назад. Сейчас временно моя команда раскидалась на помощь другим, я пошел помогать в старую команду и сел запиливать базовые CRUD операции, тыкать в аналитиков палкой, требуя спецификации к входным и выходным схемам, в темпе вальса мокать апишку, чтобы фронты могли потестить свою верстку и все такое. Типичное крудошлепство, почти отдых, за исключением того, что сервис совсем новый, только в CI закинута болванка сервиса, чтобы можно было деплоится, и все.
Наши сервисы имеют слоистую архитектуру с кучей другой паттернов: адаптеры, репозитории для запросов в хранилище, команды и запросы(привет CQRS), unit of work для обеспечения транзакционности действий в системе, агрегаты, сервисы, билдеры на сервисы и билдеры на модели, все еще на интерфейсах, чтобы тестировать удобно было... Чтобы реализовать ручку, нужно реализовать 5-6 интерфейсов и реализаций. Ситуация, как в тех бородатых анекдотах про реализацию чего-угодно в Java: сначала напишите фабрику, а если фабрика уже есть - напишите абстрактную фабрику. Пришлось вспоминать, как вообще все эти сущности между собой должны дружить.
Понятно, что вернувшись через год к типу задач, реализация которых подразумевает кучу всего, нужно будет переключить мозги, но по моему мнению, если ты возвращаешься к своему проекту и вообще не понимаешь, что тут и как работает - это либо ты сильно все упростил, либо сильно перемудрил. Причем с первым разобраться сильно проще, чем со вторым, на мой взгляд.
Отсюда два вывода:
1) Настраивайте себе шаблонизаторы, когда у вас устоявшиеся подходы.
2) Если ваш сервис предполагает, что про его разработку забудут на полгода-год(на моей памяти есть такой сервис для получения курса валют), есть смысл писать его проще - в плоских структурах и куче if-ов быстрее разобраться(да-да, рубрика "Вредные советы"). Опять же если не написана совсем жесть, тогда земля пухом
Всем доброй ночи, а я пошел запиливать себе шаблоны наконец-то, ибо те 30 файликов на скрине ПРа меня утомили.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Профессионал приходит со своими инструментами
Люблю задавать вопрос "Какой ваш любимый набор инструментов для разработки?". Чаще всего в ответ слышу "Такого нет/Не знаю, на чем скажут, на том и сижу".
Для меня такой ответ непонятен: вы кучу времени за работой, прям вообще ни одного инструмента, без которого вам работать менее приятно, за столько времени вы не нашли? Да, хоткеи много где совпадают, но чтобы делать работу лучше и быстрее, важно, чтобы вы знали свой инструмент, чтобы он был "заточен".
Много разрабов, кто делал что-то прикольное, имеет заточенный для себя набор утилит от редактора до менеджера окон. Хорошей практикой я нахожу создание папки с конфигами и закидывания ее в git. Я таким образом перепрыгивал на разные рабочие места(или на разные ОС) и всегда под рукой было все, что нужно для работы. Можно еще автоматизировать установку через разные скрипты, но тут я поленился :)
Для меня список следующий, начнем с консольных инструментов:
- консоль с установленным
-
-
-
-
-
Из не консольного:
-
-
-
Готовьте свою рабочую среду для себя, так реальнее кайфовее работать.
Люблю задавать вопрос "Какой ваш любимый набор инструментов для разработки?". Чаще всего в ответ слышу "Такого нет/Не знаю, на чем скажут, на том и сижу".
Для меня такой ответ непонятен: вы кучу времени за работой, прям вообще ни одного инструмента, без которого вам работать менее приятно, за столько времени вы не нашли? Да, хоткеи много где совпадают, но чтобы делать работу лучше и быстрее, важно, чтобы вы знали свой инструмент, чтобы он был "заточен".
Много разрабов, кто делал что-то прикольное, имеет заточенный для себя набор утилит от редактора до менеджера окон. Хорошей практикой я нахожу создание папки с конфигами и закидывания ее в git. Я таким образом перепрыгивал на разные рабочие места(или на разные ОС) и всегда под рукой было все, что нужно для работы. Можно еще автоматизировать установку через разные скрипты, но тут я поленился :)
Для меня список следующий, начнем с консольных инструментов:
- консоль с установленным
fish-shell. Я долго просидел на дефолтной убунтовской, но обратно возвращаться не хочу. К fish'у я добавил менеджер плагинов и пару плагинов: для работы с git и fzf, он же fuzzy-search. Первый позволяет написать короткую мнемонику команды вместо полной, например gcm - это git commit -m. Последний добавляет комбинации клавиш для поиска по файлам, истории команд, запущенным процессам, логу гита, переменным окружения. -
rg(ripgrep, улучшенный grep), bat(улучшенный cat). Нужны для вима, но использую их вместо прородителей. Их cli интерфейс мне нравится больше, да и bat сразу с подсветкой синтаксиса.-
httpie - замена для curl, с более удобным cli интерфейсом(для curl запарно запоминать набор параметров) и хорошей документацией.-
hyperfine - тулза для бенчмарков. С ее помощью первично прозваниваю ендпоинты на нагрузку.-
tmux с плагинами на сохранение сессий, поиск по имени сессии и кастомизации внешнего вида. В нескольких сессиях открыты разные проекты. -
nvim, куда без него. Использую LazyVim, подпиленный напильником.Из не консольного:
-
Pycharm, в основном для разруливания конфликтов или копирования папок между проектами, тут это удобно делать.-
DataGrip. Ничего лучше для работы с БД еще не находил. В чарме тоже есть вкладка с подключениями в БД, тут по сути эта вкладка вынесена в отдельный продукт от JB и мне так удобнее.-
Nimble Commander. Это тот же Midnight Commander, только для мака. Готовьте свою рабочую среду для себя, так реальнее кайфовее работать.
👍6
Краткое содержание поста в одной картинке 👀
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
12 факторов. Часть 1
Был период, когда стандартов развертывания веб приложениях особых не было, каждый разворачивался как хотел, масштабировался как мог. Появились докер, кубер и стали корпоративным стандартом: заворачивай приложение в контейнер, настраивай деплой и автоматическое масштабирование и поехали.
Так как появились стандартизированные инструменты, появились и рекомендации для разработки приложений с той целью, чтобы минимизировать проблемы с деплоем с помощью этих инструментов. Рекомендации эти обозвали "12 факторные приложения" или же "12 шагов к куберу".
Кратко концепцию можно сформулировать так: если приложение не может запуститься одной командой на вашей рабочей тачке — вы не заскейлитесь в нужный момент, либо скейл будет сопровождаться танцем с бубном и шаманским горловым пением.
Предлагаю рассмотреть часть пунктов и разберемся чем они полезны.
1) Кодовая база. Одна кодовая база - одно приложение. Кодовая база ведется с помощью системы контроля версий, любой, на ваш вкус. Каждый разработчик в команде работает с одним и тем же кодом(изменения, внесенные разработчиком во время работы не противоречат этому пункту), на серверах запускается этот же код. Представьте, что у вас есть N друзей близняшек, одевающихся почти одинаково. Отличать их друг от друга смогут разве что родители(а смогут ли?).
2) Зависимости. Приложения явно указывает пакеты, которые нужны ему для работы через манифесты декларации зависимостей и менеджер зависимостей. Таким образом мы избегаем ситуаций, когда в одной среде приложение работает корректно, а при запуске на другом компьютере приложение падает из-за отсутствия нужной библиотеки.
3) Конфигурация. Должна подкидываться приложению из переменных окружения. Если вы прибьете гвоздями креды для подключения к БД в коде, а потом поменяете пароль на сервере базы или же переместите базу на другой хост, то без патча в исходном коде приложения вы банально не заведетесь.
В последующих постах пройдемся и по остальным 9 пунктам :)
Был период, когда стандартов развертывания веб приложениях особых не было, каждый разворачивался как хотел, масштабировался как мог. Появились докер, кубер и стали корпоративным стандартом: заворачивай приложение в контейнер, настраивай деплой и автоматическое масштабирование и поехали.
Так как появились стандартизированные инструменты, появились и рекомендации для разработки приложений с той целью, чтобы минимизировать проблемы с деплоем с помощью этих инструментов. Рекомендации эти обозвали "12 факторные приложения" или же "12 шагов к куберу".
Кратко концепцию можно сформулировать так: если приложение не может запуститься одной командой на вашей рабочей тачке — вы не заскейлитесь в нужный момент, либо скейл будет сопровождаться танцем с бубном и шаманским горловым пением.
Предлагаю рассмотреть часть пунктов и разберемся чем они полезны.
1) Кодовая база. Одна кодовая база - одно приложение. Кодовая база ведется с помощью системы контроля версий, любой, на ваш вкус. Каждый разработчик в команде работает с одним и тем же кодом(изменения, внесенные разработчиком во время работы не противоречат этому пункту), на серверах запускается этот же код. Представьте, что у вас есть N друзей близняшек, одевающихся почти одинаково. Отличать их друг от друга смогут разве что родители(а смогут ли?).
2) Зависимости. Приложения явно указывает пакеты, которые нужны ему для работы через манифесты декларации зависимостей и менеджер зависимостей. Таким образом мы избегаем ситуаций, когда в одной среде приложение работает корректно, а при запуске на другом компьютере приложение падает из-за отсутствия нужной библиотеки.
3) Конфигурация. Должна подкидываться приложению из переменных окружения. Если вы прибьете гвоздями креды для подключения к БД в коде, а потом поменяете пароль на сервере базы или же переместите базу на другой хост, то без патча в исходном коде приложения вы банально не заведетесь.
В последующих постах пройдемся и по остальным 9 пунктам :)
👍6
Hustle Hard Programmer
12 факторов. Часть 1 Был период, когда стандартов развертывания веб приложениях особых не было, каждый разворачивался как хотел, масштабировался как мог. Появились докер, кубер и стали корпоративным стандартом: заворачивай приложение в контейнер, настраивай…
12 факторов. Часть 2
4) Сторонние службы. Это службы, доступные приложению по сети. База данных, очереди сообщений, кеши - все это сторонние службы и они должны быть подключаемыми ресурсами, доступными по URL-адресу, который в свою очередь заносится через параметры конфигурации. В случае, если сервер сторонней службы начинает барахлить, служба переносится на другой сервер и приложению дают URL с новым сервером.
5) Сборка, релиз и выполнение. Жесткое разделение этапов развертывания приложения на сборку(берем код и "компилируем" его: ставим зависимости в окружение; реально компилируем, если ЯП проекта компилируемый), релиз(к "собранной" программе докидываются конфиги) и выполнение(непосредственно запуск программы) позволяет контролировать то, какой код был развернут на сервере с помощью систем контроля релиза(например Jenkins), которые в случае чего позволят откатить релиз и проанализировать проблемный релиз на предмет ошибок.
6) Процессы. Приложение запускается как один, либо как несколько процессов, без сохранения внутреннего состояния(сервис без состояния - stateless). Так же между процессами не должно быть разделяемых данных. Это нужно для упрощения горизонтального масштабирования - просто добавьводы еще один процесс. В случае, если у сервиса есть состояние(допустим, он кеш хранит в глобальном словаре), то нужно это состояние распространить и держать согласованным между всеми инстансами приложения. Состояние, если оно у вас есть, должно быть вынесено во внешнюю службу(для нашего примера для кеша использовать Redis/Memcached).
4) Сторонние службы. Это службы, доступные приложению по сети. База данных, очереди сообщений, кеши - все это сторонние службы и они должны быть подключаемыми ресурсами, доступными по URL-адресу, который в свою очередь заносится через параметры конфигурации. В случае, если сервер сторонней службы начинает барахлить, служба переносится на другой сервер и приложению дают URL с новым сервером.
5) Сборка, релиз и выполнение. Жесткое разделение этапов развертывания приложения на сборку(берем код и "компилируем" его: ставим зависимости в окружение; реально компилируем, если ЯП проекта компилируемый), релиз(к "собранной" программе докидываются конфиги) и выполнение(непосредственно запуск программы) позволяет контролировать то, какой код был развернут на сервере с помощью систем контроля релиза(например Jenkins), которые в случае чего позволят откатить релиз и проанализировать проблемный релиз на предмет ошибок.
6) Процессы. Приложение запускается как один, либо как несколько процессов, без сохранения внутреннего состояния(сервис без состояния - stateless). Так же между процессами не должно быть разделяемых данных. Это нужно для упрощения горизонтального масштабирования - просто добавь
👍3😍2
image_2025-08-16_23-52-57.png
21.9 KB
12 факторов. Часть 3
Прошлый пост.
7) Привязки портов. Сервисы экспортируются через бинд порта - то есть сервис тусит на порту и слушает запросы. Тут камень в огород способа развертывания приложения как дополнительного модуля к веб серверу, существовавшему ранее. Сейчас же будьте добры делать приложение самодостаточным, идущем в комплекте с собственным веб-сервером(который вы объявите в зависимостях), а не подсовывайте сервер извне.
8) Параллельное выполнение команд. И для параллельного выполнения используются процессы. За основу взяли все хорошее из модели Unix процессов + разделение на типы процессов: если сервис будет обрабатывать HTTP-запросы и выполнять задачи в фоне, то сервис должен быть разделен на веб-процесс и процесс фоновых задач. Таким образом, если увеличивается нагрузка на веб-процесс, то мы докидываем дополнительный веб процесс. Аналогично для процесса фоновых задач. На картинке можно наглядно посмотреть. Вот тут пост сооснователя heroku с предложением данной концепции.
9) Утилизируемость. Приложение должно запускаться и останавливать свою работу в любой момент, когда это потребуется. В идеале мы минимизируем время запуска, а процесс завершения делаем безопасным - завершаем текущую сессию с БД, чтобы соединения не текли, завершаем все фоновые задачи, только после этого процесс умирает. Хорошо бы еще добавить устойчивость к внезапной смерти оборудования, но подобное событие считается менее вероятным, чем простое завершение работы по SIGTERM. Весь этот фактор направлен на то, чтобы автомасштабирование работало по принципу "включил/выключил", как свет на кухне: нужно - добавили подов, ненужно - убрали.
Прошлый пост.
7) Привязки портов. Сервисы экспортируются через бинд порта - то есть сервис тусит на порту и слушает запросы. Тут камень в огород способа развертывания приложения как дополнительного модуля к веб серверу, существовавшему ранее. Сейчас же будьте добры делать приложение самодостаточным, идущем в комплекте с собственным веб-сервером(который вы объявите в зависимостях), а не подсовывайте сервер извне.
8) Параллельное выполнение команд. И для параллельного выполнения используются процессы. За основу взяли все хорошее из модели Unix процессов + разделение на типы процессов: если сервис будет обрабатывать HTTP-запросы и выполнять задачи в фоне, то сервис должен быть разделен на веб-процесс и процесс фоновых задач. Таким образом, если увеличивается нагрузка на веб-процесс, то мы докидываем дополнительный веб процесс. Аналогично для процесса фоновых задач. На картинке можно наглядно посмотреть. Вот тут пост сооснователя heroku с предложением данной концепции.
9) Утилизируемость. Приложение должно запускаться и останавливать свою работу в любой момент, когда это потребуется. В идеале мы минимизируем время запуска, а процесс завершения делаем безопасным - завершаем текущую сессию с БД, чтобы соединения не текли, завершаем все фоновые задачи, только после этого процесс умирает. Хорошо бы еще добавить устойчивость к внезапной смерти оборудования, но подобное событие считается менее вероятным, чем простое завершение работы по SIGTERM. Весь этот фактор направлен на то, чтобы автомасштабирование работало по принципу "включил/выключил", как свет на кухне: нужно - добавили подов, ненужно - убрали.
👍4
Hustle Hard Programmer
image_2025-08-16_23-52-57.png
12 факторов. Часть 4
10) Паритет разработки/работы приложения. Держим среду разработки идентичной среде развертывания. Если на проде используется Postgres, то локально мы тоже используем Postgres, никаких SQLite/Oracle/MySQL, иначе вы очень рискуете стать тем самым "а у меня локально все работает" парнем. На моей практике различие версии одной зависимости между стейджем и продом привели к двухнедельному кранчу. Фактор обеспечивает способность непрерывного развертывания приложения за счет минимизации различий между средами разработки и исполнения.
11) Журналирование. Логи как поток событий. Приложение отдает контроль за своими логами на аутсорс стороннему инструментарию(привет ELK, а если точнее, то logstash). Каждый процесс пишет логи в стандартный вывод, а там оно уже как-нибудь "само". Почему? Опять же: для простоты масштабирования. Еще важно подчеркнуть - логи рассматриваются как поток событий(одна строка логов - одно событие системы), из которых формируется журнал. Журнал - это поток агрегированных, упорядоченных по времени событий, собранных из потоков вывода всех запущенных процессов и вспомогательных сервисов. По сути это такой же текстовый файл, но его можно визуализировать для удобства(привет Kibana).
12) Администрирование. Выполняем администрирование в разовых процессах, причем среда выполнения таких процессов идентична среде выполнения всего приложения. К администрированию относится выполнение миграций, запуск разовых скриптов(например пользака с админскими правами создать), и тому подобное. Очень сильно перекликается с 10 пунктом и нужно по тем же причинам: если мы будем запускать приложение в одной среде, а администрировать приложение в другой, мы точно в конечном итоге нарвемся на рассогласование конфигураций. Хранить разовые скрипты рекомендуется рядом с основным кодом приложения.
10) Паритет разработки/работы приложения. Держим среду разработки идентичной среде развертывания. Если на проде используется Postgres, то локально мы тоже используем Postgres, никаких SQLite/Oracle/MySQL, иначе вы очень рискуете стать тем самым "а у меня локально все работает" парнем. На моей практике различие версии одной зависимости между стейджем и продом привели к двухнедельному кранчу. Фактор обеспечивает способность непрерывного развертывания приложения за счет минимизации различий между средами разработки и исполнения.
11) Журналирование. Логи как поток событий. Приложение отдает контроль за своими логами на аутсорс стороннему инструментарию(привет ELK, а если точнее, то logstash). Каждый процесс пишет логи в стандартный вывод, а там оно уже как-нибудь "само". Почему? Опять же: для простоты масштабирования. Еще важно подчеркнуть - логи рассматриваются как поток событий(одна строка логов - одно событие системы), из которых формируется журнал. Журнал - это поток агрегированных, упорядоченных по времени событий, собранных из потоков вывода всех запущенных процессов и вспомогательных сервисов. По сути это такой же текстовый файл, но его можно визуализировать для удобства(привет Kibana).
12) Администрирование. Выполняем администрирование в разовых процессах, причем среда выполнения таких процессов идентична среде выполнения всего приложения. К администрированию относится выполнение миграций, запуск разовых скриптов(например пользака с админскими правами создать), и тому подобное. Очень сильно перекликается с 10 пунктом и нужно по тем же причинам: если мы будем запускать приложение в одной среде, а администрировать приложение в другой, мы точно в конечном итоге нарвемся на рассогласование конфигураций. Хранить разовые скрипты рекомендуется рядом с основным кодом приложения.
👍3
Hustle Hard Programmer
12 факторов. Часть 4 10) Паритет разработки/работы приложения. Держим среду разработки идентичной среде развертывания. Если на проде используется Postgres, то локально мы тоже используем Postgres, никаких SQLite/Oracle/MySQL, иначе вы очень рискуете стать…
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
Вопрос на засыпку в воскресенье вечером:
Почему в забугорных научных публикациях настолько большой список ссылок на другие статьи?
Соревнуются, кто больше статей укажет 🤡
Почему в забугорных научных публикациях настолько большой список ссылок на другие статьи?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Упоминал как-то про шаблоны в разработке.
Речь сейчас не про плюсовые шаблоны и обобщенное программирование, а про приземленную генерацию файлов и папочек по заранее заготовленному виду в вашем любимом редакторе.
Идея проста: у вас в проекте устоялись абстракции и паттерны, разработка новой функциональность требует копипасты и переименования классов, вы вызываете консоль команд редактора, выбираете команду генерации, выбираете шаблон, вводите название класса и все готово. Вот написаны нужные базовые импорты, вот прописаны миксины в предках и сделаны заглушки в методах, которые вам нужно реализовать первым делом.
Это работает как для одного файла, так и для группы файлов, если в купе они образуют совокупность семантических единиц. Например вы разом создаете часть сервисного слоя, часть слоя работы с БД, а так же создаете обработчики HTTP запросов на базовые CRUD операции, если API методы реализуются с нуля.
На гифке для примере создается реакт компонент, для простоты искал пример для vscode.
В целом можно взять любой движок шаблонов, разницы нет, главное, чтобы файлы-шаблоны добавлять было удобно, а использовать через cli интерфейс в консоли, если нет возможности вызывать из интерфейса вашей IDE. Можно обойтись сниппетами, так же добавив нужные аббревиатуры и правила заполнения содержимого, но файловую структуру придется забивать самостоятельно. Даже так это ускорит вашу разработку.
Если у вас руки совсем развязаны, то тренеруйте llm'ку, пусть за вас все делает :)
Речь сейчас не про плюсовые шаблоны и обобщенное программирование, а про приземленную генерацию файлов и папочек по заранее заготовленному виду в вашем любимом редакторе.
Идея проста: у вас в проекте устоялись абстракции и паттерны, разработка новой функциональность требует копипасты и переименования классов, вы вызываете консоль команд редактора, выбираете команду генерации, выбираете шаблон, вводите название класса и все готово. Вот написаны нужные базовые импорты, вот прописаны миксины в предках и сделаны заглушки в методах, которые вам нужно реализовать первым делом.
Это работает как для одного файла, так и для группы файлов, если в купе они образуют совокупность семантических единиц. Например вы разом создаете часть сервисного слоя, часть слоя работы с БД, а так же создаете обработчики HTTP запросов на базовые CRUD операции, если API методы реализуются с нуля.
На гифке для примере создается реакт компонент, для простоты искал пример для vscode.
В целом можно взять любой движок шаблонов, разницы нет, главное, чтобы файлы-шаблоны добавлять было удобно, а использовать через cli интерфейс в консоли, если нет возможности вызывать из интерфейса вашей IDE. Можно обойтись сниппетами, так же добавив нужные аббревиатуры и правила заполнения содержимого, но файловую структуру придется забивать самостоятельно. Даже так это ускорит вашу разработку.
Если у вас руки совсем развязаны, то тренеруйте llm'ку, пусть за вас все делает :)
👍5