gram news
Максим Иглин | Backend channel avatar

Максим Иглин | Backend

@maximiglindgtl

Макс, инженер-разработчик на Python. Попробую рассказать вам про питон, бэк, архитектуру и процессы в IT.

ProjectsRUProgramming

1,350subscribers

Open the Channel

Latest posts

  • Максим Иглин | Backend

    28 Feb, 06:20edited

    Есть ощущение, что с нейросетями происходит очень предсказуемый сценарий. Технология сначала проходит фазу реальной инженерной работы – и только потом становится рынком темок.Термин "проблема голодных детей" я подсмотрел у одного небезызвестного биз-дева. Формулировка показалась неприятно точной, как говорят шизы проработанные: —откликается.Сначала к прорывной технологии добираются инженеры и продуктовые компании. Они тратят годы на исследование, обучение моделей, инфраструктуру, масштабирование, снижение стоимости вычислений. Они делают тяжёлую, часто невидимую работу. Именно они превращают абстрактную идею в работающий инструмент. Именно благодаря им нейросети сегодня доступны через API, имеют документацию и тот уровень качества, который доступен на за 20-200 бачей.А потом барьер входа падает. Инфраструктура готова. Модели доступны. Появляются готовые обёртки, no-code
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,64019141Open in Telegram
  • Максим Иглин | Backend

    10 Feb, 08:54edited

    Почему физика в бэкграунде часто делает из разработчика сильного инженера?Я часто замечаю одну и ту же закономерность: ребята с хорошей школьной и университетской базой по физике быстрее растут в инженерной разработке. И дело не в знании формулы Максвелла и не в умении считать интегралы в уме. Дело в типе мышления, который физика формирует и который очень хорошо ложится на разработку. Я именно про конкретные когнитивные привычки, влияющие на качество инженерных решений.Физика с самого начала приучает мыслить через модели. Ты не воспринимаешь систему как хаос, а пытаешься выделить ключевые параметры, сделать допущения и отбросить второстепенное. По сути, ты учишься упрощать реальность так, чтобы с ней можно было работать. В разработке происходит то же самое: декомпозиция, абстракции, борьба с лишней сложностью. Сильный разработчик почти всегда сначала строит модель системы в голове,
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,57020103Open in Telegram
  • Максим Иглин | Backend

    10 Jan, 09:36edited

    .Стоит ли входить в айти в 20{N} году?В этот раз у нас N=2026, но пост этот я отложкой могу поставить на 27, 28...M года соответственно.Вечные вопросы, ежедневно мелькающие в паблике... Короче, разбираем очередную панику, которой кишит интернет. Стоит ли лезть в профессию в 2026-м и почему на самом деле база остается прежней? Всегда помните одно: весь мусор, который мы ежедневно потребляем, направлен либо на то, чтобы повысить нашу тревожность и собрать "классы", либо, чтобы ее понизить и тоже собрать "классы". Я попробую своими мыслями, которые не меняются из года в год, а лишь модифицируются, выступить в роли нейтрализатора тревоги.Разберем 4 основных шума и тезиса. Спойлер: в сфере нет НИЧЕГО, что глобально отличало бы её от других или же от нее самой год-два-пять назад. Ни магических зарплат из воздуха, ни бесконечного дефицита кадров за красивые глаза.1. AI всех заменил
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,6602988Open in Telegram
  • Максим Иглин | Backend

    8 Dec 2025, 15:04edited

    Почему я выбираю только работу из дома.За последние 5 лет я сходил в офис 5 раз. Два из них, чтобы уволиться.Моя позиция, как вы поняли, железобетонная: я выбираю только удаленку. Речь идет не о том, чтобы работать с ноутбуком, потягивая кокос на Бали (привет, суровые корпоративные правила РФ и СНГ, где зарубежная удаленка под запретом). Речь о том, как эффективнее использовать свое время и время команды.Плюсы: Я считаю, что это способ успевать в 10 раз больше при правильной организации.- Концентрация 10х: В своём домашнем офисе, где нет болтовни, приглашений на кофе или перекур, моя концентрация максимальна. Если ты научился выстраивать удалёнку (самодисциплина + адекватная организация рабочего места), то на текущие дела уходит ровно столько времени, сколько нужно.- Интеграция дел в рабочий день: Я могу оптимизировать абсолютно все рутинные задачи. Тренировки (если зал рядом
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,7402496Open in Telegram
  • Максим Иглин | Backend

    16 Nov 2025, 14:48

    В новом видео рассказал про самый популярный паттерн в микросервисной архитектуре – Transactional Outbox. Разобрал на примере небольшого проекта на FastApi + RabbitMq.Переходи, смотри до конца, ставь лайк и оставляй комментарий!
    YouTubeГарантированная доставка событий в микросервисах. Transactional Outbox в проекте на FastAPI+RabbitMqВ этом видео разбираем, что такое Transactional Outbox, зачем он нужен в микросервисах и как он гарантирует доставку событий даже при падении брокера или сетевых сбоях. Простым языком объясняем ключевые проблемы согласованности данных и показываем рабочую…
    1,56012931Open in Telegram
  • Максим Иглин | Backend

    8 Nov 2025, 16:28

    Код-ревью: как не тормозить, а ускорять поставку продукта. Часть - 2.4. Делайте саморевью перед открытием PR Одна из самых недооценённых практик – саморевью. Ты открыл PR – и сразу же пробежался глазами по изменениям: - глянул, нет ли мусорного кода, отладочных принтов, забытых комментариев; - проверил названия переменных и функций – всё ли читаемо; - оценил, насколько логично читается код тем, кто в него не погружён. Эту проверку можно делать самостоятельно, а можно – с помощью нейрух. Пусть нейросеть скажет, что по ее мнению не ок. Это занимает 10 минут, но экономит часы на ревью. Чем чище вход, тем меньше возни в процессе и на выходе.5. Держите фокус на поставке В момент, когда вы правите замечания, обсуждаете правки, дорабатываете PR – не распыляйтесь. Не переключайтесь на другие задачи. Не лезьте в другую фичу. Почему это важно? Потому что: - вы теряете контекст – и
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,4001363Open in Telegram
  • Максим Иглин | Backend

    8 Nov 2025, 16:28

    Код-ревью: как не тормозить, а ускорять поставку продукта. Часть - 1.Код-ревью – процесс, с которым вы сталкиваетесь практически ежедневно, особенно когда команда по одному стеку переваливает за 5 человек. В такой конфигурации с высокой долей вероятности у вас будет 2–3 (а то и больше) Pull Request'а в день, которые нужно отревьюить, апрувнуть, отдать в тестирование/довести до прода. Этот этап критически влияет на T2M (time-to-market) любой задачи. Почему? Потому что в него вовлекается сразу несколько этапов. Стандартный PR требует времени и внимания: - от автора, который этот код писал; - от ревьюеров, которые его читали, обсуждали, вносили замечания и ожидали исправлений; - от тестировщиков, которые получили инкремент (и не факт, что рабочий) после ревью. И если процесс устроен неэффективно, ревью превращается из полезного инструмента в узкое горлышко, которое стопорит всю цепочку
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,2101254Open in Telegram
  • Максим Иглин | Backend

    4 Nov 2025, 16:50edited

    Сегодня разберём супер-базовый вопрос – выбор между == и is в Python. Тоже крайне частый вопрос для собесов, секций лайв-кодинга и корректности использования при написании ваших приложух.Оператор == сравнивает значения объектов, то есть данные, которые в них хранятся. А оператор is их идентификаторы, то есть проверяет, являются ли два имени ссылками на один и тот же объект в памяти.>>> 1 == True True >>> 1 is True <python-input-1>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="? FalseВ кодинге нас чаще интересуют значения, поэтому в приложениях оператор == встречается гораздо чаще, чем is.Когда используется is? Иногда важно не значение, а сам объект, когда переменная может указывать на уникальный экземпляр. В данном случае что будет внутри объекта? Скорее всего синглтон. Самый распространённый пример – сравнение с None:if x is None: ... или
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,0101453Open in Telegram
  • Максим Иглин | Backend

    3 Nov 2025, 19:00edited

    Селективность (она же избирательность) в реляционных СУБД.Селективность – это простая, но ключевая характеристика запросов и индексов. Она показывает, какая доля строк таблицы проходит под условие фильтра.Если запрос возвращает 10 строк из миллиона, селективность высокая. Если запрос возвращает половину таблицы, селективность низкая. Оптимизатор СУБД выбирает, как выполнить запрос: использовать индекс или просто прочитать всю таблицу целиком (sequential scan). Решение он принимает, в том числе, оценивая селективность.Представим таблицу: cities(id, name, country, population) Имеем 10 000 000 городов (включая все населённые пункты и дубликаты названий).Теперь три запроса: SELECT FROM cities WHERE country = 'Iceland'; В Исландии ~70 городов. Селективность = 1 /( 70 / 10 000 000) = 1 / 0.000007, примерно 142к, выразим числом! Отлично! Индекс по country сработает молниеносно: СУБД
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    903852Open in Telegram
  • Максим Иглин | Backend

    30 Oct 2025, 15:03

    Мутабельные атрибуты класса: когда каждый экземпляр меняет общие данныеОдна из задач, которая недавно попалась ученику на собесе. Классика. Выглядит безобидно – обычный __init__, пара списков, ничего сложного. Именно на таких вопросах и проверяют, понимаешь ли ты базовые концепции ссылок и мутабельности, как Python создаёт объект и как реально лежат данные.Суть задачи class A: values: list = []def __init__(self, , values: list): self.values.extend(values)a = A(values=[1, 2, 3]) b = A(values=[4, 5, 6])print(a.values) print(b.values) print(A.values)Ожидаемый результат при "нормальном" поведении:
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    964984Open in Telegram
  • Максим Иглин | Backend

    28 Oct 2025, 15:01edited

    А точно ли вам нужна гибкая схема или всё-таки возьмем реляционки?У разработчиков всегда была отличная черта – заюзать технологию ради технологии. А нужна она в данном контексте или нет – вопрос вторичен. Главное затащить что-то модное в проект и получить опыт работы с технологией. Что на деле не всегда целесообразно.Разберем на примере гибких схем и нереляционных СУБД.Представим, что разработчику Васе поставили задачу: сделать полнотекстовый поиск по названиям городов клиентов, уникальных значений в БД всего ~100 000. Вася, однажды услышав, что "полнотекстовый поиск – это про ElasticSearch", не думая, прикручивает Elastic. Хотя в его Postgres уже есть like/ilike+, GIN-индексы и задача тривиально решается без зоопарка.Или Пете поставили задачу: хранить данные профиля пользователя, включая соцсети, доп. контакты, хобби, ссылки и т.д. Он пошел и взял MongoDB – потому что "гибкая
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    939862Open in Telegram
  • Максим Иглин | Backend

    25 Oct 2025, 14:56

    Как устроен список в PythonНа 90% собеседований вы точно встретите вопросы про структуры данных в Python, и классическим образом, чем подробнее и глубже вы про него расскажете, тем лучше будет фидбэк.Возьмем вопрос "Расскажи про списки в Python". План "копания" в такого рода вопросах состоит из 3 пунктов: - общий обзор и практическое применение - сложность операций со структурой (вставка, удаление и тд) - внутреннее устройствоКогда я провожу реальные или мок-собесы, большинство интервьюируемых сыпятся на 2 вещах: 1) низкоуровневое устройство 2) сложность операций (вставка, удаление и тд), причем это напрямую зависит от пункта выше Если кандидат на одном дыхании может выдать мне эту инфу - ему точно респект и с большой долей вероятности он не зазубрил.Давайте сегодня разберемся, каким образом устроены списки в Python.Список в Python – это динамический массив указателей. Он храни
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,0101454Open in Telegram
  • Максим Иглин | Backend

    23 Oct 2025, 15:01edited

    7 октября вышел Python 3.14. Я разобрал все нововведения по официальным release-notes, показал разницу с Python 3.13, сделал демо и выводы, что будем применять на практике. Код из примеров в файлике в коментах!Закидывайте в коменты обратную связь и оставляйте свое впечатление о новом питоне, буду рад почитать!
    YouTubeЧто нового в Python3.14? Полный обзор и сравнение с 3.13. Subinterpretters, t-strings, uuid6Вышел Python 3.14, и это, один из самых богатых релизов последних лет. Без GIL, t-strings, субинтерпретаторы, zstandard, JIT и многое другое. Я разобрал все нововведения по официальным релиз-ноутсам, показал разницу с Python 3.13, сделал демо и выводы, что…
    1,010841Open in Telegram
  • Максим Иглин | Backend

    21 Oct 2025, 15:06

    Паттерн Database per Service (база на сервис).В монолитных приложениях обычно используется одна или несколько общих баз данных для всех его модулей. Микросервисная архитектура предлагает другой подход - Database per Service. Это подход, при котором каждый микросервис владеет своим набором данных, изолированных от других сервисов, и предоставляет к ним доступ только через API. Это снижает связность, то есть изменения в одной базе не ломают другие, а сервисы работают автономно.Как реализуется паттерн. Достаточно логически разграничить данные. Например, выделить сервису собственную схему в общей базе, либо, при необходимости, дать ему отдельный экземпляр СУБД. Главное - выстроить ролевое разделение. У каждого сервиса свои креды с правами только на свои объекты. Без этого разработчики легко обойдут правила и залезут в чужие таблицы.Кроме изоляции, паттерн даёт гибкость в выборе
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,110122Open in Telegram
  • Максим Иглин | Backend

    18 Oct 2025, 15:00edited

    Порядок выполнения SQL‑операторовЗапрос пишем слева направо, но в каком порядке его выполняет СУБД? Мы пойдём верхнеуровнево, то есть без деталей конкретных алгоритмов планировщика и executor-а. Цель – сложить в голове правильную модель, на которой вы сможете построить больше уровней абстракций и разобраться с деталями реализации. Это логический порядок обработки данных в SQL, а не физический порядок исполнения плана. Реальный порядок может отличаться!Пример запроса SELECT DISTINCT u.id, u.name, AVG(o.total) AS avg_order FROM users u JOIN orders o ON o.user_id = u.id WHERE u.active = true AND o.created_at >= date_trunc('month', now()) GROUP BY u.id, u.name HAVING AVG(o.total) > 100 ORDER BY avg_order DESC LIMIT 10 OFFSET 5; Мы хотим: 10 активных пользователей за текущий месяц со средним чеком заказа > 100, отсортированных по убыванию их среднего чека.1. FROM База начинает с того,
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,21011103Open in Telegram
  • Максим Иглин | Backend

    2 Oct 2025, 20:24edited

    Сейчас рынок хардов?Забавно было наблюдать, как за последние 5 лет рынок разработки менялся и продолжает меняться. Посмотрим на наиболее яркие рубежи.В постковид все трубили о важности софтов, самопрезентации, продаже себя. Действительно, рынок был достаточно широким, разработчики не были ограничены географией, был фриланс, куча зарубежных компаний и развивающийся внутренний рынок. Порог входа в профессию был ниже, работодатели конкурировали за умы и щедро инвестировали. Думаю, многие слышали истории, как зелёный банк перекупал разрабов прайсом 3х от предыдущего места. На том рынке важность хардов и софтов были примерно 50/50 по значимости.А потом везде резко кризис, даже если не брать в учёт локацию, везде всё ± одинаково. Стартапы схлопываются, корпорации меньше инвестируют, найм становится более аккуратным. Нанимающие делают акцент на долгосрочном сотрудничестве. Рынок хардов
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,2001065Open in Telegram
  • Максим Иглин | Backend

    1 Oct 2025, 20:34edited

    Накидал тут скриптец за 10 минуток для очистки удаленных акков в чате телеги, дабы почистить от мусора чатик обсуждений. Приземлю тут, может, кому-то понадобится. Можете зарефачить нормально и сохранить, оно и так работает, но хотя бы лог-файл не будете открывать каждый раз при записи лога)1. Заходим под учеткой с правами к чату на https://telegram.org/apps 2. Регистрируем апку, получаем все ключи 3. Вставляем ключи и ссылочку на чат в скриптец. 4. Ставим либу telethon и запускаем 5. Логинимся в терминале (скриптец ведет с вами диалог) 6. Ждем import asyncio from datetime import datetimefrom telethon import TelegramClient from telethon.tl.functions.channels import EditBannedRequest from telethon.tl.types import ChatBannedRightsapi_id = '' api_hash = '' # Встав свой api_hash chat_username = '' # @username чата или ID (int)ban_rights = ChatBannedRights(until_date=None,
    1,130121Open in Telegram
  • Максим Иглин | Backend

    20 Sept 2025, 14:51

    Jitter в ретраях: как не убить зависимый сервис при сбоях Представьте, у вас есть система с сотнями микросервисов или клиентов, которые делают синхронные HTTP-запросы, например, в сервис уведомлений.Однажды этот сервис начинает отдавать 503 Service Unavailable. И все клиенты одновременно получают ошибку и запускают повторную попытку через фиксированное время (например, через 1 секунду). - Через секунду все они шлют повторный запрос одновременно. - Сервис, который и так упал, снова перегружается. - Ретраи срабатывают синхронно → создаётся шквал запросов → сервис окончательно ложится.Это называется thundering herd problem — эффект "стада", когда множество клиентов одновременно "набегают" на ресурс.backoff и jitter Чтобы смягчить нагрузку и дать сервису шанс на восстановление, применяются два подхода: 1. Exponential backoff — каждая новая попытка делает паузу длиннее (1s → 2s → 4s →
    Image from a post by Максим Иглин | BackendImage from a post by Максим Иглин | Backend
    1,270852Open in Telegram
  • Максим Иглин | Backend

    20 Sept 2025, 11:51edited

    Python HTTP-Client Часть-2 🔐На данный момент имеем готовую зависимость, которую можно инжектить в любую часть вашего проекта. Кроме того, clients.notifications можно вынести в библиотеку и подключать к любому сервису в компании, у нас, например, вынос клиентов практикуется.Посмотрим на бизнес-логику. class CreateOrderService: def __init__(self, notification_client: NotificationClient) -> None: self.notification_client = notification_clientasync def execute(self, input_dto: CreateOrderDTO) -> OrderDTO: try: await self.notification_client.create_notification( body="Новый заказ!", email="test@example.com", ) await self.notification_client.create_notification( body="Новый заказ 2!", email="test1@example.com", ) except HTTPStatusError as e:
    99194Open in Telegram
  • Максим Иглин | Backend

    20 Sept 2025, 11:51

    Python HTTP-Client Часть-1 🔐 После того, как мы составили чеклист интеграций, посмотрим на пример — как можно аккуратно оформить HTTP-клиент для сервиса уведомлений. Ситуация: есть серивис delivery и cервис notifications, задача отправить 2 уведомления при создании заказа. HTTP-клиент для сервиса уведомлений Вынесем всю работу с API в отдельный клиент внутри сервиса delivery. Так мы не будем разбрасывать вызовы httpx по всему проекту, а получим централизованный SDK. ├── clients │ ├── __init__.py │ ├── base.py # базовый клиент с общей логикой │ └── notifications # модуль для работы с сервисом notifications │ ├── __init__.py │ ├── client.py # имплементация клиента │ └── models │ ├── __init__.py │ └── create_notification.py # модели для валидации Базовый клиент from httpx import AsyncClientclass HttpClientBase: def __init__(self, , base_url: str) -> None: self.base_url = base_url self.cl
    920551Open in Telegram