<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Бэкенд</title>
    <description/>
    <link>https://tproger.ru/tag/backend</link>
    <atom:link href="https://tproger.ru/tag/backend/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 24 Oct 2026 04:30:51 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Бэкенд</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>6 инструментов разработчика для ежедневной работы в 2026 году</title>
      <link>https://tproger.ru/digest/6-instrumentov-razrabotchika-dlya-ezhednevnoj-raboty-v-2026-godu</link>
      <comments>https://tproger.ru/digest/6-instrumentov-razrabotchika-dlya-ezhednevnoj-raboty-v-2026-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/6-instrumentov-razrabotchika-dlya-ezhednevnoj-raboty-v-2026-godu</guid>
      <description><![CDATA[<p>Шесть инструментов для кода, контейнеров, API, баз данных и мониторинга. Рабочие сценарии, бесплатные версии, тарифы и ограничения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/6-instrumentov-razrabotchika-dlya-ezhednevnoj-raboty-v-2026-godu">6 инструментов разработчика для ежедневной работы в 2026 году</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 23 Oct 2026 07:36:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Инструменты разработчика полезнее выбирать под конкретные задачи: изменить код, проверить API, разобраться в данных или увидеть проблему после релиза. Собрали шесть решений для backend-, fullstack-разработчиков и DevOps-инженеров, которые дополняют друг друга. Разбираем рабочие сценарии, стоимость входа и ограничения — от подписки на ИИ до обслуживания собственного мониторинга.</p><ul><li>Kodik помогает менять код с ИИ-агентом, Git сохраняет историю изменений.</li><li>Docker Engine запускает приложения в контейнерах.</li><li>Bruno проверяет API, DBeaver Community помогает исследовать данные через SQL.</li><li>Grafana OSS собирает представление о состоянии системы на дашбордах.</li></ul><h2>Как выбирать инструменты под свой процесс</h2><p>Критерии отбора — отдельная роль в разработке, возможность работать с существующим проектом, понятные условия использования и доступная документация. Здесь одна IDE, система контроля версий, контейнерный движок, API-клиент, клиент баз данных и инструмент визуализации мониторинга. Номера обозначают порядок знакомства: сравнивать эти продукты по единой шкале производительности было бы бессмысленно. Начните с места, где регулярно теряется время, а затем проверьте, куда передаются данные, какие функции требуют подписки и кто будет обслуживать установку. Бесплатная лицензия уменьшает расходы на ПО, но не отменяет настройку, обновления и резервное копирование.</p><h2>1. Kodik (Кодик) - редактор кода с ИИ</h2><p>Kodik — российская AI-IDE на базе Visual Studio Code. Вы открываете проект локально или в связке с Git и описываете задачу: агент анализирует доступный контекст, находит связанные файлы и помогает внести изменения. Такой формат полезен, когда правка затрагивает несколько частей кодовой базы, так как контекст проекта изучается специализированным ИИ-агентом для программирования целиком.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-10-23/713405af-93b3-4444-b463-54d540d8bc07.webp" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-10-23/9d44a24d-2683-45a1-bd88-45351c3cfcd0.webp" alt="" /></figure><h3>Кому подойдёт</h3><p>Бэкенд-разработчик может поручить агенту генерацию кода — подготовку нового API-метода и тестов, а затем проверить diff. Fullstack-разработчик — найти связанные участки при исправлении бага. При рефакторинге Кодик помогает выполнить серию согласованных правок и обеспечить исправление ошибок; постановка задачи, ревью и проверка поведения остаются за человеком.</p><h3>Что можно развернуть</h3><p>Основной формат — десктопная IDE, а для Enterprise предусмотрено развёртывание ИИ-инфраструктуры в контуре организации. Поддерживаются модели через сторонних провайдеров. Это полноценная рабочая среда: команде, которая хочет сохранить JetBrains или Visual Studio и добавить только плагин, такой вариант потребует изменения привычного процесса.</p><h3>Инфраструктура и экосистема</h3><p>Встроена работа с Git; внешние инструменты, включая GitHub и GitLab, подключаются через MCP. В облачном сценарии код передаётся на обработку моделям. KodikShield предназначен для локального обнаружения и маскирования чувствительных данных перед отправкой. Для закрытого контура нужно отдельно выбирать конфигурацию On-Premise и модели: наличие анонимайзера само по себе не означает, что весь конфиденциальный код остаётся на устройстве.</p><h3>Отзывы и репутация</h3><p>На форуме продукта есть разделы помощи и баг-репортов. Они полезны при проверке проблем, похожих на ваши, но не дают агрегированной оценки качества. Для выбора IDE важнее проверить, насколько понятны предложенные агентом изменения и сколько ручной доработки требует задача из вашего проекта.</p><h3>Поддержка и каналы связи</h3><p>Обратиться можно через <a href="https://kodik.ru/forum">форум</a>, <a href="https://t.me/+_gAATuBtgvs0YTNi">Telegram-чат</a>, <a href="http://t.me/Kodik_AI">Telegram-аккаунт поддержки</a> и info@kodik.ru. Вопросы оплаты принимает billing@kodik.ru.</p><h3>Тарифы, ограничения и условия</h3><p>Pro стоит 1 599 ₽ в месяц и включает 250 кредитов. Super Pro — 15 999 ₽ за 4 500 кредитов, приоритетную обработку и увеличенный контекст. Team — 3 199 ₽ за пользователя в месяц, минимум два места; предусмотрены централизованные счета, аналитика использования и управление доступом. Enterprise рассчитывается индивидуально. Для годовой оплаты заявлена скидка 20%. Кредиты не следует считать количеством завершённых задач.</p><p>Бесплатного AI-тарифа нет, но можно запросить триал по доступным каналам связи. Регистрация и скачивание не требуют карты, AI-функции доступны без подписки. Принимается оплата от российских юрлиц; для оплаты через ЮКассу потребуется счёт или карта резидента РФ. Облачные модели требуют сетевого подключения, а сгенерированный код — проверки.</p><p>Официальный сайт: <a href="https://kodik.ru/?utm_source=tproger&amp;utm_medium=referral&amp;utm_campaign=developer_tools_selection" rel="follow">k</a><a href="https://kodik.ru/?utm_source=tproger&amp;utm_medium=referral&amp;utm_campaign=indie_developer_tools" rel="follow">odik.ru</a>.</p><h2>2. Git — история изменений</h2><p>Git — система контроля версий, которая связывает работу остальных инструментов. В репозитории можно хранить исходники, описания окружения и коллекции API-запросов, видеть изменения и возвращаться к предыдущим состояниям проекта.</p><h3>Кому подойдёт</h3><p>Разработчик отделяет экспериментальную функцию в ветку и перед коммитом проверяет diff. При регрессии использует bisect, чтобы сузить поиск до изменения, после которого появился сбой. В работе с ИИ Git помогает разделить предложенные правки на проверяемые коммиты и отменить неудачное изменение.</p><h3>Что можно развернуть</h3><p>Для начала достаточно CLI и локального репозитория: команды init, add и commit создают историю проекта. Для совместной работы подключают удалённый репозиторий. В справочнике есть и средства серверного администрирования, однако выбор и обслуживание хостинга — отдельная задача.</p><h3>Инфраструктура и экосистема</h3><p>Вокруг Git существуют графические клиенты, интеграции с редакторами и сервисы размещения репозиториев. В этой подборке он дополняет Kodik контролем истории, а Bruno — версионированием коллекций запросов. Подключение внешнего хостинга нужно оценивать отдельно: именно его настройки определяют доступ к размещённой там копии кода.</p><h3>Отзывы и репутация</h3><p>Git создавался для разработки ядра Linux. Официальная страница также ссылается на опрос Stack Overflow 2022 года, в котором использование Git указали 96% профессиональных разработчиков. Это исторический показатель распространённости, а не оценка доли рынка в 2026 году.</p><h3>Поддержка и каналы связи</h3><p>Вопросы и баг-репорты принимает список рассылки git@vger.kernel.org; есть IRC-канал #git на Libera Chat и Discord сообщества. Для специфичных проблем Windows предусмотрены отдельные Discussions и трекер Git for Windows. Ссылки собраны на <a href="https://git-scm.com/community">странице сообщества</a>.</p><h3>Тарифы, ограничения и условия</h3><p>Git бесплатен и распространяется под GPLv2; лицензия не требует подписки или оплаты зарубежной картой. Тарифы хостинга репозиториев в эту стоимость не входят. Команде всё равно нужны правила ветвления, ревью и разрешения конфликтов: система сохраняет изменения, но не оценивает их правильность.</p><p>Официальные источники: <a href="https://git-scm.com/about">о Git</a>, <a href="https://git-scm.com/docs">справочник команд</a>.</p><h2>3. Docker Engine — запуск в контейнерах</h2><p>Docker Engine — открытый движок для сборки образов и запуска контейнеров. Он управляет контейнерами, сетями и томами, позволяя описывать окружение приложения и повторять его запуск на подготовленных машинах.</p><h3>Кому подойдёт</h3><p>Бэкенд-разработчик запускает сервис и тестовую базу в отдельных контейнерах. QA воспроизводит ошибку на согласованном образе приложения. DevOps-инженер использует CLI или API движка в сценарии сборки и запуска. Особенно полезно это там, где ручная установка зависимостей регулярно приводит к различиям между окружениями.</p><h3>Что можно развернуть</h3><p>Engine устанавливается на поддерживаемые Linux-дистрибутивы и запускает приложения из контейнерных образов. В документации перечислены Ubuntu, Debian, Fedora, RHEL и другие системы. Для Windows и macOS движок также доступен через Docker Desktop, у которого свои условия использования.</p><h3>Инфраструктура и экосистема</h3><p>Архитектура включает демон dockerd, API и клиент docker. Томами управляют постоянными данными, сетями — связностью контейнеров; предусмотрены просмотр логов и rootless-режим. При планировании окружения учитывайте доступность реестра образов и источников пакетов: установленный движок сам по себе не обеспечивает получение всех зависимостей.</p><h3>Отзывы и репутация</h3><p>Поддержкой открытого движка занимаются сопровождающие проекта Moby и сообщество. Для оценки зрелости конкретной версии полезны журнал релизов и список устаревающих функций: они показывают, какие изменения могут затронуть ваши сценарии запуска.</p><h3>Поддержка и каналы связи</h3><p>Основные точки входа — документация и <a href="https://mobyproject.org/">проект Moby</a>. Docker прямо указывает, что не предоставляет поддержку Docker Engine как отдельного продукта. Для пакетов, собранных дистрибутивом Linux, документация рекомендует обращаться в трекер этого дистрибутива.</p><h3>Тарифы, ограничения и условия</h3><p>Открытый движок распространяется под Apache 2.0. Его не следует смешивать с лицензированием Docker Desktop: документация отдельно указывает необходимость платной подписки при коммерческом использовании Desktop в крупных компаниях. Установка Engine на собственный Linux-сервер также оставляет команде расходы на машину, обновления и хранение данных.</p><p>Официальные источники: <a href="https://docs.docker.com/engine/">Docker Engine</a>, <a href="https://docs.docker.com/engine/install/">установка, лицензирование и поддержка</a>.</p><h2>4. Bruno — коллекции в Git</h2><p>Bruno — API-клиент, который хранит коллекции запросов в локальных текстовых файлах. Их можно положить рядом с кодом и проверять изменения через Git. Это связывает реализацию API с запросами, которыми команда проверяет его поведение.</p><h3>Кому подойдёт</h3><p>Разработчик сохраняет запрос, воспроизводящий ошибку, и передаёт его коллеге вместе с изменениями проекта. QA запускает коллекцию после исправления; команда выносит повторяющиеся проверки в CI через CLI. Переменные позволяют использовать одну коллекцию с разными окружениями.</p><h3>Что можно развернуть</h3><p>Можно установить локальный API-клиент и CLI для автоматизированного запуска коллекций. На странице тарифов перечислены HTTP, REST, GraphQL и gRPC, тестирование и скрипты. Облачный аккаунт для базовой работы не требуется.</p><h3>Инфраструктура и экосистема</h3><p>Совместная работа строится вокруг файлов и Git: коллекции проходят тот же diff и ревью, что исходники. Есть импорт коллекций и окружений Postman. Локальное хранение не делает сетевые запросы автономными: для вызова удалённого API нужен доступ к нему, а реальные токены необходимо исключать из коммитов.</p><h3>Отзывы и репутация</h3><p>На официальном сайте опубликованы отзывы с именами и ссылками на исходные сообщения. Например, QA Lead компании Doctolib Ludovico Besana выделяет локальную работу и хранение коллекций в Git. Это выбранный разработчиком продукта отзыв, а не независимый рейтинг API-клиентов.</p><h3>Поддержка и каналы связи</h3><p>Для Open Source предусмотрена помощь сообщества, включая <a href="https://github.com/usebruno/bruno/discussions">GitHub Discussions</a>. В Pro указаны email и чат, в Ultimate — выделенный менеджер. Практические инструкции по коллекциям, переменным и CLI собраны в документации.</p><h3>Тарифы, ограничения и условия</h3><p>Open Source бесплатен: в таблице тарифов указаны два рабочих пространства и неограниченный Collection Runner. Pro стоит $6 за пользователя в месяц при годовой оплате, Ultimate — $11 на тех же условиях. Ultimate можно попробовать 14 дней без банковской карты. Встроенные Git-операции и корпоративные возможности различаются между редакциями.</p><p>Для Pro указан платёж банковской картой, для Ultimate — оформление заказа и оплата по счёту. Возможность оплаты из РФ нужно уточнять до покупки; для бесплатной редакции платёж не требуется.</p><p>Официальные источники: <a href="https://www.usebruno.com/">сайт и отзывы</a>, <a href="https://docs.usebruno.com/introduction/what-is-bruno">документация</a>, <a href="https://www.usebruno.com/pricing">тарифы</a>.</p><h2>5. DBeaver Community — данные через SQL</h2><p>DBeaver Community — бесплатный клиент для работы с базами данных. Редактор SQL и просмотр таблиц полезны, когда ответа API недостаточно и нужно разобраться, какие данные действительно записало приложение.</p><h3>Кому подойдёт</h3><p>После запроса в Bruno разработчик проверяет запись в PostgreSQL или MySQL. При разборе ошибки исследует связи таблиц и выполняет SQL-запрос. Для локального эксперимента может работать с SQLite, а результат исследования экспортировать для дальнейшего анализа.</p><h3>Что можно развернуть</h3><p>Устанавливается кроссплатформенный клиент, который подключается к существующим базам. В Community доступны SQL-редактор, редактор данных, диаграммы и средства переноса данных. Сам сервер СУБД нужно запускать и обслуживать отдельно — например, использовать подготовленную тестовую базу в контейнере.</p><h3>Инфраструктура и экосистема</h3><p>Подключения опираются на драйверы; официальный сайт описывает поддержку баз с JDBC-драйверами и расширение через плагины. Для конкретной СУБД проверяйте не только возможность соединения, но и доступность нужных операций в Community. Расширенные облачные интеграции и поддержка ряда NoSQL-систем относятся к PRO.</p><h3>Отзывы и репутация</h3><p>Проект публикует исходный код, список участников и журнал изменений. Например, релиз 26.2.1 от 21 сентября 2026 года содержит исправления редактора данных, подключений и работы с PostgreSQL. Такие записи помогают проверить исправление конкретной ошибки; сами по себе они не являются рейтингом удобства.</p><h3>Поддержка и каналы связи</h3><p>Канал поддержки Community — <a href="https://github.com/dbeaver/dbeaver/issues">GitHub Issues</a>. На сайте также есть документация и ссылки на официальные сообщества. Постоянная техническая поддержка перечислена среди возможностей коммерческой версии PRO.</p><h3>Тарифы, ограничения и условия</h3><p>Community распространяется бесплатно под Apache 2.0, без оплаты подписки. На сайте она позиционируется прежде всего для личных проектов; это не следует путать с запретом коммерческого использования по лицензии. Для корпоративных требований сравните функции безопасности и поддержки с PRO. При подключении к production разумно использовать учётную запись только для чтения: SQL-клиент позволяет выполнять реальные операции с данными.</p><p>Официальные источники: <a href="https://dbeaver.io/">DBeaver Community и журнал релизов</a>, <a href="https://dbeaver.io/about/">возможности, лицензия и контакты</a>.</p><h2>6. Grafana OSS — мониторинг на дашбордах</h2><p>Grafana OSS — открытый инструмент визуализации и анализа данных мониторинга. Он помогает перейти от отдельных запросов и проверок к наблюдению за работающей системой: запрашивать метрики, логи и трассировки из подключённых источников, строить панели и настраивать оповещения.</p><h3>Кому подойдёт</h3><p>DevOps-инженер выводит на дашборд нагрузку и ошибки сервиса. Бэкенд-разработчик сравнивает задержки до и после релиза. Дежурная команда настраивает оповещения для выбранных условий. Эти сценарии требуют заранее собранных данных: одна установка Grafana ещё не создаёт мониторинг приложения.</p><h3>Что можно развернуть</h3><p>Grafana OSS размещается на собственной инфраструктуре. Команда настраивает источники данных, дашборды и правила оповещения. Для хранения разных сигналов в экосистеме есть отдельные проекты: Loki для логов, Tempo для трассировок и Mimir для длительного хранения метрик Prometheus.</p><h3>Инфраструктура и экосистема</h3><p>Подключаемые источники и плагины позволяют объединять данные на дашбордах. Конфигурацию мониторинга можно включать в процесс поставки приложения. При самостоятельном размещении команда контролирует инфраструктуру, но отвечает за обновления, доступы и резервное копирование; маршрут данных зависит также от подключённых источников.</p><h3>Отзывы и репутация</h3><p>На странице Grafana OSS разработчик указывает более 1,5 млн активных установок и более 2 000 участников разработки. Эти цифры характеризуют масштаб проекта по данным Grafana Labs. При выборе для своей системы полезнее дополнительно проверить нужный источник данных и возможности его плагина.</p><h3>Поддержка и каналы связи</h3><p>Для открытой версии доступны <a href="https://community.grafana.com">форум сообщества</a>, <a href="https://slack.grafana.com/">Slack</a>, документация и GitHub проекта. Коммерческая поддержка и дополнительные корпоративные возможности относятся к Enterprise; условия этой редакции нельзя автоматически переносить на OSS.</p><h3>Тарифы, ограничения и условия</h3><p>Grafana OSS можно использовать бесплатно на своей инфраструктуре. Основные расходы такого варианта — серверы, хранение телеметрии и работа команды. Облачная и Enterprise-редакции имеют отдельные условия; их лимиты не относятся к OSS. Бесплатная самостоятельная установка не требует покупки облачной подписки, но доступность загрузок и необходимых плагинов стоит проверить в своей сети.</p><p>Официальные источники: <a href="https://grafana.com/oss/grafana/">Grafana OSS</a>, <a href="https://grafana.com/docs/grafana/latest/fundamentals/">назначение компонентов и различия редакций</a>.</p><h2>Сравнение по ключевым критериям</h2><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-24/3e8bbccd-35a7-423c-8426-7efcd5421c2c.webp" alt="Сравнительная таблица сервисов из подборки" /><figcaption>Сравнительная таблица сервисов из подборки</figcaption></figure><ul><li>Работа с кодом: Kodik помогает агентом внутри IDE; вход — 1 599 ₽ в месяц за Pro с 250 кредитами. Бесплатного AI-тарифа и триала нет.</li><li>Контроль изменений: Git бесплатен под GPLv2. Хостинг репозитория и правила командной работы выбираются отдельно.</li><li>Запуск окружения: Docker Engine — бесплатный открытый движок. У Docker Desktop отдельные условия лицензирования.</li><li>Проверка API: Bruno Open Source бесплатен, включает два рабочих пространства. Pro — $6, Ultimate — $11 за пользователя в месяц при годовой оплате.</li><li>Работа с базами: DBeaver Community бесплатен под Apache 2.0; расширенные интеграции и постоянная техническая поддержка относятся к PRO.</li><li>Наблюдение за системой: Grafana OSS бесплатна при самостоятельном размещении. Нужны источники телеметрии и ресурсы на обслуживание.</li></ul><h2>Как собрать из этого рабочий набор</h2><p>Для задачи с новым API-методом последовательность может выглядеть так: создать ветку в Git, подготовить изменения в Kodik, запустить приложение через Docker Engine, проверить запросы в Bruno и результат записи в DBeaver. После релиза Grafana поможет наблюдать за поведением сервиса — если сбор телеметрии уже настроен.</p><p>Устанавливать все шесть инструментов сразу необязательно. Выбирайте по повторяющейся задаче и цене сопровождения: AI-IDE должна оправдывать подписку на ваших правках, API-клиент — упрощать воспроизведение проверок, мониторинг — помогать находить причины сбоев. Хороший набор получается тогда, когда результат одного шага можно проверить на следующем.</p>]]></content:encoded>
    </item>
    <item>
      <title>Функциональные флаги в CI/CD: что, зачем и как</title>
      <link>https://tproger.ru/articles/funkcionalnye-flagi-v-ci-cd-chto-zachem-i-kak</link>
      <comments>https://tproger.ru/articles/funkcionalnye-flagi-v-ci-cd-chto-zachem-i-kak?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Лукьянов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/funkcionalnye-flagi-v-ci-cd-chto-zachem-i-kak</guid>
      <description><![CDATA[<p>Что такое функциональные флаги и как они ускоряют CI/CD. Виды флагов, инструменты (Flagsmith, LaunchDarkly), интеграция с pytest и лучшие практики внедрения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/funkcionalnye-flagi-v-ci-cd-chto-zachem-i-kak">Функциональные флаги в CI/CD: что, зачем и как</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Oct 2026 12:02:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали небольшой гайд по функциональным флагам: какими они бывают, чем полезны, зачем нужны в CI/CD и как их правильно использовать.</p><p>Функциональные флаги (feature flags, feature toggles) позволяют разработчикам включать и отключать функции приложения, но при этом не требуют повторно собирать и развёртывать код. Благодаря флагам в CI/CD можно чётко отделить друг от друга этапы «развёртывания» (доставки результатов разработки и сборки) и «релиза» (запуска новой функциональности для пользователей). Для чего и как именно это делается — разберём в этой статье.</p><h2>Что такое функциональный флаг</h2><p>Технически функциональный флаг — это специальный код в приложении, который проверяет значение предварительно выбранной переменной. В зависимости от этого активируется разная логика.</p><p>Ниже приведён пример JSON, который получает приложение. Оно проверяет геотег пользователя, и если пользователь из Москвы, то значение флага возвращает true и в итоге отображается виджет погоды. Для пользователей из других городов значение флага принимает default_variant: "disabled", и виджет для них не показывается.</p><p>Функциональные флаги могут использоваться в разных сценариях — приведём основные с парой примеров:</p><ul><li>Повышение надёжности системы: отключение рекомендаций при высокой нагрузке, переключение на резервный платёжный шлюз при сбоях в основном.</li><li>Обучение через продуктовые эксперименты и A/B-тестирование: сравнение двух вариантов страницы регистрации, тестирование двух видов кнопки «Купить».</li><li>Управление доступом по тарифам и подпискам: экспорт отчётов только для пользователей Pro, расширенные настройки только для корпоративных клиентов.</li><li>Сезонные и временные функции: промокоды на «чёрную пятницу», приём работ для конкурса.</li><li>Аварийные выключатели (kill switches): отключение медиаплеера из-за ошибок, удаление неверно настроенного способа оплаты.</li></ul><p>Далее рассмотрим основные типы флагов.</p><h2>Типы флагов</h2><p>Флаги классифицируются по механизму работы и целевому назначению.</p><h3>По механизму работы: статические и динамические флаги</h3><p><b>Статические флаги</b> чаще всего используют, чтобы скрыть недоделанную функциональность до релиза, проставить внутренние флаги, которые не требуют частого переключения, или флаги в микросервисах с редкими развёртываниями.</p><p>Их значение фиксируется на этапе сборки или при старте приложения. Чтобы изменить значение такого флага, придётся перезапускать сервис.</p><p>Статические флаги задаются через переменные окружения (.env), конфиг-файлы (config.json) или внешние сервисы конфигурации (Consul).</p><p>Пример в .env:</p><p>Пример в виде конфиг-файла:</p><p>Использование в коде:</p><p>Плюсы: простота, нулевые сетевые задержки, предсказуемость, безопасность (нет внешних вызовов в runtime).</p><p>Минусы: невозможность изменить поведение «на лету» — требуется пересборка/перезапуск.</p><p><b>Динамические флаги</b> идеальны для экспериментов с пользователями, постепенного развёртывания и таргетинга по регионам или ролям. Их можно менять в runtime без перезапуска приложения.</p><p>Такие флаги управляются через внешние системы: API, БД, специализированные сервисы.</p><p>В примере ниже — два флага. Первый проверяет, попадает ли пользователь в сегмент для тестирования нового способа оформления заказа: берутся только 25 % пользователей сервиса; также они должны входить в группы "beta_testers", "premium_users" и быть из России, Беларуси или Казахстана. Второй флаг показывает, что ИИ-рекомендации при заказах пока отключены для всех пользователей, но в нужный момент это можно изменить даже во время работы приложения.</p><p>Пример конфигурации:</p><p>Использование в коде:</p><p>Плюсы: гибкость — можно включать и выключать фичи на лету, перенастраивать систему без перезапуска сервиса (критично для высоконагруженных систем).</p><p>Минусы: усложнение логики системы (flag debt), дополнительная задержка при запросе состояния флага и зависимость от внешних систем.</p><p>Сведём сравнение типов флагов в небольшую таблицу:</p><figure><img src="https://media.tproger.ru/user-uploads/133989/2026-10-07/c805be74-aee7-4c16-9722-b241cf817d1b.webp" alt="" /></figure><h3>По цели применения: релизные, экспериментальные, операционные и разрешающие флаги</h3><p><b>Релизные флаги</b> (release flags) позволяют отделить развёртывание от релиза, то есть экспериментальная/незаконченная фича вливается в основную ветку и развёртывается вместе с остальным кодом, но остаётся выключенной до официального релиза. Если после релиза что-то пойдёт не так, флаг можно сразу же отключить, не делая новый релиз и не откатывая приложение. Когда новая функциональность начинает работать стабильно, релизный флаг удаляют.</p><p>Например, код нового платёжного шлюза уже в продакшене, но флаг пока enabled: false. Флаг включат 1 ноября, и фича станет доступной всем. Если с платежами возникнут проблемы, флаг сразу же отключат без отката деплоя.</p><p><b>Экспериментальные флаги</b> (experiment flags) — это инструмент для A/B-тестов и проверки гипотез. Они позволяют показать разные новые варианты новой функции разным пользователям (или показать новую функциональность только ограниченной лояльной группе пользователей), чтобы изучить их реакцию и на её основе сделать вывод о новой фиче. По окончании A/B-теста экспериментальный код и флаг удаляют.</p><p>В примере ниже команда интернет-магазина проводит тест, чтобы выбрать подходящий цвет для кнопки «Оформить заказ» в корзине. Выборка из 30 % пользователей распределяется случайным образом: 50 % из них видят зелёную кнопку, 25 % — красную, 25 % — оранжевую. Система собирает метрики: конверсию и отказ от корзины. Через две недели становится ясно, что оранжевая кнопка даёт +15 % к конверсии, поэтому её делают основной, а флаг и экспериментальный код удаляют.</p><p><b>Операционные флаги</b> (ops flags) нужны, чтобы регулировать поведение системы. С их помощью можно отключать ресурсоёмкие операции во время больших нагрузок или на слабых устройствах, переключаться между внешними сервисами, предотвращать критические сбои при запуске новой функциональности, управлять режимами деградации, проводить диагностику при инцидентах.</p><p>Операционные флаги зачастую не удаляют и оставляют в системе.</p><p>Рассмотрим следующий пример. В «чёрную пятницу» нагрузка в приложении интернет магазина растёт, утилизация CPU превышает 85 %. Из-за этого отключаются ИИ-рекомендации (на ресурсоёмкой ML-модели) и включаются обычные статические. После того как нагрузка снижается, флаг возвращается в исходное состояние.</p><p>Второй флаг позволяет переключиться на режим обслуживания БД, а третий — на резервный платёжный сервис, если есть сбои в основном.</p><p><b>Разрешающие флаги</b> (permission flags) — это одна из составляющих настройки доступа к специфическим функциям приложения, например к ролям в админ-панели для разработчиков и менеджеров или к платным функциям для клиентов. Такие флаги могут быть очень динамичными и менять состояние при каждом запросе.</p><p>Разрешающие флаги обычно долгоживущие и становятся неотъемлемой частью жизненного цикла приложения.</p><p>В примере ниже при каждом запросе к админ-панели система проверяет роль пользователя и статус подписки. Администратор видит все разделы, менеджер — только ограниченный набор, а премиум-клиент получает доступ к дашборду аналитики. Администраторы и премиум-клиенты также могут экспортировать отчёты в формате Excel.</p><p>Далее рассмотрим, какие существуют инструменты для управления функциональными флагами.</p><h2>Системы управления флагами</h2><p>Глобально все решения для управления флагами делятся на три категории: проприетарные, Open Source и собственные разработки.</p><p>Проприетарные SaaS-платформы предлагают готовую инфраструктуру, поддержку и продвинутый функционал «из коробки». Они идеально подходят для команд, которые хотят сосредоточиться на продукте, а не на поддержке инструмента. Крупным компаниям стоит инвестировать именно в такие решения, а для стартапов могут подойти базовые тарифы.</p><p>Перечислим тут несколько самых известных проприетарных инструментов для управления флагами:</p><ul><li>LaunchDarkly позволяет включать функционал для конкретных сегментов аудитории с высокой гранулярностью, то есть подходит для детального таргетинга пользователей и маркетинговых экспериментов. Платформа даёт enterprise-уровень надёжности и позволяет гибко управлять жизненным циклом флагов.</li><li>ConfigCat обеспечивает единую точку управления, если инфраструктура состоит из разнородных технологий (веб, мобильные приложения, бэкенд на разных языках).</li><li>Harness интегрирует управление флагами прямо в CI/CD-процессы. Предоставляет командам детальную аналитику о влиянии флагов на производительность и стабильность системы прямо в пайплайне развёртывания.</li></ul><p>Open Source-решения дают полный контроль над кодом и данными и позволяют развёртывать систему на своих серверах (on-premise), что критично для организаций со строгими требованиями к безопасности.</p><p>Вот пара примеров Open Source-платформ для управления флагами:</p><ul><li>Flagsmith позволяет сохранить данные внутри периметра компании, хорошо поддаётся конфигурации и кастомизации через удобный интерфейс.</li><li>Unleash хорошо подходит компаниям, которым важно разграничивать права управления флагами между разными командами, менеджерами и разработчиками.</li></ul><p>Собственная разработка тоже возможна, но требует значительных ресурсов. На ранних этапах разработки продукта или при тестировании гипотез внедрения флагов можно использовать переменные окружения, JSON-файлы или простой API-сервис. Но по мере роста продукта поддерживать собственное решение становится всё сложнее: нужно обеспечивать отказоустойчивость, безопасность и разработку SDK для всех языков программирования в проекте. Так что переход на специализированный инструмент (Open Source или SaaS) — обычно вопрос времени.</p><p>Независимо от того, какое решение вы выберете, важно убедиться, что оно легко интегрируется с вашей CI/CD-системой и не создаёт узких мест в разработке. Кроме того, внедрять полноценную систему управления флагами на ранних этапах разработки может быть избыточным, поэтому нужно всегда спрашивать себя, стоят ли затраченные усилия желаемого результата.</p><p>Теперь посмотрим, какую роль функциональные флаги играют в CI/CD.</p><h2>Функциональные флаги в CI/CD</h2><p>Флаги фундаментально меняют подход к управлению исходным кодом, особенно если используется модель ветвления Trunk Based Development (TBD).</p><p>При TBD в основную ветку (main/trunk) часто вливаются изменения. Функциональные флаги позволяют разработчикам интегрировать и развёртывать фичи, которые ещё не готовы к релизу, и при этом не рисковать стабильностью всего приложения. Благодаря флагам быстрее внедряются изменения и упрощается слияние, так как весь код (и основной, и разрабатываемый) остаётся в одной ветке. Это предотвращает конфликты слияния (merge hell), которые часто случаются при долгоживущих ветках.</p><p>Флаги улучшают управление рисками, а именно:</p><ul><li>дают возможность выключить функциональность сразу после релиза, если она работает неправильно, — благодаря этому система быстрее восстанавливается (MTTR);</li><li>позволяют включать фичу поэтапно, делать canary/rollout, быстро откатывать поведение через переключатель и не ждать новой сборки для исправления проблемы.</li></ul><p>На сам CI/CD-пайплайн функциональные флаги никак не влияют. Основная задача пайплайна — запуск автотестов, сохранение результатов их работы и передача далее для дальнейшего анализа. Проверка функциональности при включённом и выключенном флаге должна быть частью автотестов.</p><p>Чтобы эффективно протестировать оба состояния флага, можно использовать параметризованные тесты (переключаться между состояниями внутри одного набора тестов) либо поддерживать отдельные наборы тестов для включённого и выключенного флага.</p><p>Параметризованные тесты позволяют динамически переключать состояние флага во время выполнения приложения и тем самым уменьшают дублирование кода.</p><p>Отдельные наборы тестов могут быть полезны, когда состояния флагов фиксированы в разных окружениях (например, staging и production) или когда предпочтительнее запускать тесты по отдельности.</p><p>Допустим, мы готовим новую версию приложения и до того, как выпустить её в продакшен, тестируем релиз-кандидата в окружении staging. CI/CD-пайплайн собрал образ release-candidate и развернул его в staging. При запуске приложения запрашивается набор флагов из централизованной системы управления флагами. Далее при запуске автотестов подбирается набор тест-кейсов для заданного окружения. Также подбирается набор флагов для конкретного пользователя после того, как его логин и user id считаются из cookie во время запроса.</p><p>В результате тестовые сценарии становятся более гибкими, позволяют прогонять тесты в разных режимах флага, а также отдельно проверять критичные сценарии и постепенно расширять набор проверок.</p><p>Ниже подробнее рассмотрим сценарий тестирования релиз-кандидата.</p><h2>Сценарий тестирования релиз-кандидата с применением функциональных флагов</h2><p>Сценарий состоит из следующих шагов:</p><ol><li>CI/CD-пайплайн собирает образ release-candidate и деплоит в staging.</li><li>При запуске приложения запрашиваются флаги из Flagsmith с параметрами environment=staging, user_id, role.</li><li>Система флагов возвращает конфигурацию: какие флаги включены и какие тест-кейсы нужно выполнить.</li><li>Автотесты динамически фильтруют тесты на основе полученного ответа. Тесты, которые не относятся к активным функциям текущего окружения, не запускаются.</li></ol><p>Все флаги хранятся в системе управления флагами Flagsmith в формате JSON.</p><p>Здесь описан флаг new_payment_flow — он управляет новой версией процесса оплаты.</p><p>В нашем примере функция включена в staging и выключена в production.</p><p>Помимо самого состояния флага, конфигурация содержит список тестов для каждого окружения. Для staging предусмотрены три проверки:</p><ul><li>успешная оплата;</li><li>обработка ошибки;</li><li>обработка тайм-аута.</li></ul><p>Для production пока оставлен только тест успешной оплаты.</p><p>В config находятся параметры, которые тесты также могут получить из системы флагов. В нашем случае это timeout_ms 5000. Значение тайм-аута не зашито непосредственно в тесте, и его можно изменить через конфигурацию флага.</p><p>Автотесты при запуске запрашивают флаги из внешней системы с помощью следующего запроса:</p><p>Здесь тестовый раннер сообщает системе флагов контекст, в котором выполняется проверка. В параметре context указаны идентификатор release candidate и источник запроса — autotest_runner.</p><p>Получив такой запрос, система флагов определит, какие настройки применимы именно к этому запуску.</p><p>Автотесты используют функциональные флаги, чтобы динамически сформировать определённый тестовый сценарий. Для этого процесс сбора тестов перехватывается через специальную функцию (conftest.py):</p><p>Тут pytest находит все тесты, какие есть. Код узнаёт, в каком окружении запускаются тесты, подключается к Flagsmith и получает активные флаги.</p><p>Из флагов берётся список тестов, которые нужно запустить для конкретного окружения. Из всех найденных тестов остаются только те, которые:</p><ul><li>относятся к нужному окружению;</li><li>указаны в конфигурации активного флага.</li></ul><p>В результате pytest запустит только оставшиеся тесты.</p><p>Функциональные флаги влияют не только на выбор тестов. Сам тест также может получать из флага параметры, необходимые для его выполнения:</p><p>Здесь из конфигурации флага new_payment_flow извлекается параметр timeout_ms. В нашей конфигурации его значение было задано — 5000. Если бы оно не было указано, использовалось бы значение по умолчанию — 3000.</p><p>Таким образом, CI/CD-пайплайн остаётся универсальным и не содержит отдельной логики вроде «если это такой-то релиз, запусти такие-то тесты». Он запускает один и тот же механизм, а конкретное поведение определяется конфигурацией функциональных флагов.</p><p>Итого мы получаем инструмент, который позволяет гибко управлять тем, какие тесты и в каком окружении запускать и для каких пользователей включать новую функциональность.</p><h2>Риски и рекомендации по использованию флагов</h2><p>Флаги — это мощный инструмент, но если неправильно их использовать, они могут принести проекту больше вреда, чем пользы, поэтому применять их нужно с осторожностью.</p><h3>Основные риски при работе с флагами</h3><p><b>Деградация кода и тестов</b>. Забытые флаги создают в коде множество ветвлений. В результате тестировать такой код становится сложнее: нужно проверять не только каждый флаг отдельно, но и разные сочетания флагов.</p><p><b>Проблемы производительности и доступности</b>. Постоянные сетевые запросы к сервису флагов замедляют работу приложения, если не используется кеширование. Кроме того, сервис флагов становится критической зависимостью: если он упадёт, вместе с ним могут упасть все зависимые микросервисы.</p><p><b>Рассинхронизация</b>. Разные экземпляры приложения могут узнать об изменении флага не одновременно, поэтому могут временно работать по-разному.</p><h3>Архитектурные рекомендации</h3><p>Прежде всего, флаги нужно вовремя удалять: можно настроить в CI/CD автоматические уведомления на флаги, которые живут дольше установленного времени, например больше 30 дней. А релизные и экспериментальные флаги лучше удалять сразу после того, как стабилизировалась фича или закончился A/B-тест. У каждого флага должны быть владелец, дата создания и план удаления.</p><p>Как мы уже писали выше, флаги — это критическая зависимость, поэтому стоит обезопасить себя от сбоев в системе управления флагами: использовать на стороне приложения fallback-значения (default variants), внедрить локальное кеширование (чтобы пережить кратковременные падения сети), использовать автоотключение (Circuit Breaker) запросов к сервису флагов при множественных таймаутах.</p><p>Обезопасить себя при работе с флагами нужно и с других сторон: нельзя хранить в их конфигурации секреты или персональные данные, необходимо логировать все изменения (кто, когда и что изменил) и внедрить обязательный code review и approval-процесс для критичных флагов.</p><p>Чтобы избежать взрыва матрицы тестов, не нужно создавать отдельные тесты для каждого состояния флага — лучше использовать параметризованные тесты и динамическую фильтрацию (вроде того сценария, что мы рассматривали выше).</p><p>В целом, в зрелой практике флаги используют как временный инструмент для поставки и экспериментов, а не как постоянная замена нормальной архитектуре.</p><p>Резюмируем ключевые принципы:</p><ul><li>Временность. Для флагов должен быть чёткий план удаления.</li><li>Прозрачность. У каждого флага должны быть владелец, назначение и срок жизни.</li><li>Отказоустойчивость. Приложение должно работать даже при недоступности сервиса управления флагами.</li><li>Мониторинг. Состояние и использование флагов нужно постоянно отслеживать.</li></ul><p>Итак, функциональные флаги — это важный элемент культуры непрерывной поставки. Они повышают гибкость, безопасность и скорость доставки ПО, позволяют командам выпускать код чаще. Но важно помнить, что флаги — это не панацея: они дают максимум пользы только при грамотном внедрении и регулярной очистке, а без должной дисциплины могут усложнить кодовую базу и тестирование.</p>]]></content:encoded>
    </item>
    <item>
      <title>Идемпотентность и Outbox: как не выполнить одну операцию дважды</title>
      <link>https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy</link>
      <comments>https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy</guid>
      <description><![CDATA[<p>Как сделать ручку идемпотентной, где ломается наивная проверка ключа и зачем нужен transactional outbox. Забирайте код на Python, SQL и Node.js и чеклист.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy">Идемпотентность и Outbox: как не выполнить одну операцию дважды</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 09 Sep 2026 05:00:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>История, с которой начинает автор одного из разборов ниже, звучит буднично. Платёжный шлюз не ответил вовремя, клиентская библиотека повторила запрос, и покупателя списали дважды. Сумма небольшая, а возврат, тикет в поддержку и восстановление доверия заняли недели.</p><p>Виноват тут не шлюз. Виноват сервер, который исходил из того, что каждый запрос приходит ровно один раз. В сети, где теряются ответы, это допущение неверно всегда.</p><p>Идемпотентность — свойство операции, при котором повторное выполнение приводит к тому же состоянию, что и однократное. Сам ответ при этом может отличаться: повторный DELETE вернёт 404 вместо 200, и метод от этого идемпотентным быть не перестаёт. У HTTP это закреплено на уровне методов: <a href="https://www.rfc-editor.org/rfc/rfc9110">RFC 9110</a> относит к идемпотентным PUT, DELETE и безопасные методы, а POST идемпотентным по своей природе не является. Бизнес-операции почти всегда отправляют именно через POST.</p><p>Клиент не может отличить «сервер не получил запрос» от «сервер выполнил операцию, но ответ потерялся», поэтому повтор придёт в любом случае.</p><p>Ключ идемпотентности генерирует клиент, а сервер хранит связку ключа со слепком запроса и с готовым ответом, чтобы повтор получил тот же результат, а не новый.</p><p>Проверка «посмотреть и вставить» неатомарна: два одновременных повтора оба увидят отсутствие ключа. Нужен уникальный индекс или условная запись.</p><p>Запись в базу и отправка в очередь в одну транзакцию не помещаются. Обёртывать сетевой вызов в BEGIN и COMMIT вредно вдвойне: корректности не даёт, а пул соединений выедает.</p><p>Transactional outbox решает это одной таблицей: событие пишется в той же транзакции, что и бизнес-запись, а отдельный процесс доставляет его в очередь.</p><h2>Почему повтор неизбежен</h2><p>Сеть отказывает так, что установить факт доставки невозможно в принципе. Есть три типовых сценария, и внешне они неразличимы:</p><ul><li>Сервер обработал запрос, но ответ потерялся по дороге назад.</li><li>Сервер всё ещё считает, а у клиента уже сработал таймаут.</li><li>Балансировщик повторил запрос сам, никого об этом не уведомив.</li></ul><p>Для GET повтор безвреден. Для POST /payments это второе списание. Отсюда и правило: одна логическая операция должна приводить к одному записанному итоговому состоянию, сколько бы раз её ни отправили. Осознанно новая операция обязана прийти с новым ключом.</p><h2>Два способа сделать ручку идемпотентной и один в довесок</h2><h3>Способ первый: ключ идемпотентности</h3><p>Самый распространённый вариант: клиент генерирует уникальный идентификатор на одну логическую операцию и повторяет его при каждой попытке. Сервер хранит соответствие ключа и ответа, а на дубликате возвращает сохранённый результат вместо повторного выполнения работы.</p><p>Три детали, на которых ошибаются чаще всего. Ключ генерирует клиент, а не сервер: смысл в том, что сервер сам по себе не отличит новый запрос от повтора. Ключ должен быть с высокой энтропией, обычно это UUID v4; выводить его из изменяемого или малоразнообразного поля вроде номера клиента нельзя, потому что это повышает риск коллизии и переигрывания чужой операции.</p><p>И последнее: повтор должен получить <b>тот же самый ответ</b>. Если первая попытка вернула 201 с идентификатором платежа, то и повтор возвращает те же 201 и тот же идентификатор, а не 409 и не пустую двухсотку. Иначе клиент решит, что операция не прошла, и попробует ещё раз.</p><h3>Способ второй: сделать операцию идемпотентной по смыслу</h3><p>Иногда ключ не нужен вовсе, потому что семантику можно спроектировать идемпотентной с самого начала. Классический пример — PUT /users/42, который задаёт полное представление ресурса: отправьте его дважды, и состояние будет одним и тем же.</p><p>Для операций создания трюк в том, чтобы выводить идентификатор из самого запроса, а не генерировать случайный на каждый вызов:</p><p>Идентификатор детерминированно выводится из почты, поэтому повторный запрос даёт того же пользователя без дублирующей строки. Плата за простоту — необходимость естественного уникального ключа: почты, артикула, внешнего идентификатора. Хеш при этом считается от точной строки, поэтому почту нужно привести к нижнему регистру и обрезать пробелы до хеширования: иначе один и тот же ящик с заглавной буквы даст второго пользователя. И ключ должен быть неизменным: если пользователь сменит почту, выведенный из неё идентификатор либо останется прежним и перестанет соответствовать данным, либо изменится и оторвётся от всех ссылок на него в соседних таблицах. Нет подходящего ключа, возвращайтесь к первому способу.</p><h3>Довесок: оптимистичная блокировка</h3><p>Этот приём идемпотентности не даёт и в списке стоит по другой причине. Ключ защищает от повторов одного и того же запроса, но ничего не делает с двумя <b>разными</b> запросами, которые правят одну запись. Здесь работает проверка версии: клиент присылает версию, которую видел, а сервер отклоняет обновление при несовпадении.</p><p>Обратите внимание, что проверка версии живёт внутри самого UPDATE. Разнести её на отдельное чтение и последующую запись означало бы воспроизвести ровно ту гонку, о которой пойдёт речь в следующем разделе: два запроса с одной устаревшей версией оба прошли бы проверку и оба записали бы результат. Идемпотентным одиночный запрос этот приём не делает, зато закрывает частый источник задвоенных эффектов: двух писателей, затирающих работу друг друга.</p><h2>Где наивная реализация ключа разваливается</h2><h3>Гонка в проверке</h3><p>Последовательность «проверить наличие ключа, потом вставить» содержит зазор, в который помещаются оба одновременных повтора: обе стороны видят, что ключа нет, и обе выполняют работу. Резервировать ключ нужно атомарно, через уникальное ограничение базы, условную запись или транзакционный compare-and-set (атомарное сравнение с записью).</p><p>Это же относится и к примеру с платежом выше: замена словаря в памяти на Redis гонку не закрывает, пока проверка и вставка остаются двумя отдельными командами. Нужен атомарный примитив резервирования, вроде SET key value NX или INSERT ... ON CONFLICT DO NOTHING.</p><p>Проверяется это только настоящей конкуренцией. Юнит-тест, вызывающий функцию дважды подряд, гонку не поймает никогда. Отправьте полсотни одновременных запросов с одним ключом и убедитесь, что побочный эффект произошёл ровно один раз.</p><h3>Слепок запроса, а не только ключ</h3><p>Хранить один ключ недостаточно. Сервер канонизирует поля, определяющие бизнес-смысл операции, и считает от них хеш. Канонизация означает приведение к единому виду порядка полей, форматов чисел и дат, опущенных значений по умолчанию и незначащих пробелов. Если повторный вызов обязан воспроизвести решение, принятое по прежним правилам, в слепок включают ещё и версию политики. Пример: между первой попыткой и повтором поменялись тарифы, и повтор обязан вернуть старую цену, а не пересчитать по новой. Без версии в слепке сервер этого различия не увидит.</p><p>Когда тот же ключ приходит с другим слепком, это ошибка на стороне клиента, и отдавать ему старый результат нельзя. <a href="https://dev.to/seo_optimization_591fad6c/designing-idempotent-decision-endpoints-that-survive-real-retries-6c1">Разбор проектирования идемпотентных ручек</a> предлагает отвечать 409 Conflict; <a href="https://dev.to/sirmax/3-ways-to-make-your-api-requests-idempotent-with-working-code-4inl">автор практического руководства</a> в этом случае возвращает 422. Важно, чтобы выбранный код был задокументирован и никогда не подменяется молчаливой отдачей чужого ответа.</p><h3>Состояния и коды ответа</h3><p>Минимальная модель состояний записи выглядит так: PROCESSING, SUCCEEDED, FAILED_RETRYABLE и FAILED_FINAL. Рядом хранятся ключ операции, слепок, отметки времени, идентификатор решения, снимок ответа и версия политики. Клиенту нужна детерминированная карта из состояния в код ответа:</p><ul><li>201 или 200 — первый успешно завершённый результат.</li><li>200 с явной пометкой о повторе — проигрывание сохранённого ответа.</li><li>202 со ссылкой на статус — работу уже выполняет другой обработчик, начинать вторую не нужно.</li><li>409 — ключ переиспользован с другим содержимым.</li><li>Задокументированная финальная ошибка — обработка провалилась, и автоматическое продолжение небезопасно.</li></ul><p><b>Срок жизни ключей:</b><br />Хранить их вечно не нужно, это медленная утечка. Сутки покрывают практически любое реальное окно повторов, но выбирать срок стоит от риска предметной области: у платежей и у рекомендаций он разный. И помните, что ключ приходит снаружи: ограничьте длину и набор символов, привяжите его к арендатору и не дайте одному пользователю вытащить результат чужой операции.</p><h2>Вторая половина задачи: база и очередь</h2><p>Допустим, ручка стала идемпотентной. Остаётся более коварная проблема: почти всякая бизнес-операция пишет не в одно место. Заказ сохраняется в базу и публикует событие в очередь, чтобы склад начал сборку, почтовый сервис отправил подтверждение, а антифрод посмотрел на транзакцию.</p><p>Обе половины статьи растут из одного факта: ни HTTP, ни очередь не обещают доставку ровно один раз, они обещают её хотя бы один раз. Поэтому защищаться приходится дважды, на входе и на выходе.</p><p>Это две записи в две разные системы, и общей транзакции у них нет. Упал процесс, моргнула сеть, выкатился деплой между двумя вызовами — одна сторона зафиксирована, вторая нет. Заказ подтверждён на экране покупателя, а склад о нём не знает. Ошибка при этом нигде не залогирована и алерт не сработал.</p><h3>Почему обернуть это в транзакцию нельзя</h3><p>Соблазнительный и заведомо неверный вариант выглядит так:</p><p>Транзакция базы не имеет власти над очередью и умеет откатывать только операции базы. Если отправка прошла, а COMMIT упал, сообщение уже в очереди и забрать его оттуда нельзя.</p><p>Есть и вторая беда, чисто эксплуатационная. Такой код держит открытое соединение и блокировки строк всё время сетевого вызова. Обычно очередь отвечает быстро, но под нагрузкой, ретраями или деградацией вызов растягивается на секунды, и все запросы к тем же строкам стоят в очереди. Это надёжный способ исчерпать пул соединений и уронить заодно ни в чём не повинные части сервиса.</p><h3>Outbox: событие как строка в той же транзакции</h3><p>Идея паттерна в том, чтобы перестать считать публикацию второй записью. Вместо вызова очереди приложение вставляет строку в таблицу outbox в той же транзакции, что и бизнес-запись. Отдельный процесс читает таблицу и публикует сообщения дальше.</p><p>Откатилась транзакция, и вместе с ней исчезла строка outbox: осиротевшего сообщения в очереди не осталось. Упало приложение сразу после фиксации — строка на месте со статусом pending, и доставщик заберёт её на следующем проходе. Паттерн опирается ровно на одну гарантию, которую база и так даёт: атомарность одной транзакции.</p><p>Доставщик выбирает пачку необработанных строк и помечает их отправленными только после подтверждения очередью. Ключевая деталь здесь одна:</p><p>Этот SELECT и последующая простановка статуса выполняются в одной транзакции: блокировка живёт до фиксации. Благодаря SKIP LOCKED доставщик масштабируется горизонтально из коробки, каждый экземпляр берёт свой набор строк. А если он упадёт посреди пачки, вся пачка откатится и уйдёт повторно, что даёт ещё один довод в пользу идемпотентного потребителя.</p><p>Может показаться, что здесь мы делаем ровно то, что осудили выше: держим блокировку на время сетевого вызова. Разница в том, что блокируется не бизнес-таблица и соединение берётся не из пула, обслуживающего пользовательские запросы, а SKIP LOCKED не даёт одной медленной строке задержать остальные.</p><h3>Потребитель обязан быть идемпотентным</h3><p>Если доставщик упал посреди прохода, на следующем он переотправит те же строки. Очереди вроде SQS и Kafka в типовой конфигурации гарантируют доставку «хотя бы один раз», поэтому дедупликация на приёмной стороне обязательна, и уникальным ключом служит идентификатор события или решения.</p><p>Делает это условная запись. Важная деталь, на которой легко ошибиться: сама по себе она пустой операцией не становится. При несовпадении условия драйвер бросает исключение, и его нужно поймать явно, отличив штатный повтор от настоящей ошибки:</p><p>Настройки продюсера и подтверждения брокера снижают количество повторов, но не снимают с приложения ответственность за однократность бизнес-эффекта.</p><h3>Что добавить перед продакшеном</h3><p>Двух статусов мало. Нужен статус failed и счётчик попыток: после N неудач строка помечается провалившейся и перестаёт крутиться в цикле вечно. На стороне очереди настраивается очередь недоставленных сообщений, чтобы то, что потребитель не смог обработать, оседало в наблюдаемом месте, а не исчезало молча.</p><p>Когда задержка опроса становится критичной, полагающийся на периодический опрос доставщик заменяют захватом изменений: инструменты вроде Debezium читают журнал предзаписи PostgreSQL и публикуют изменения без паузы на опрос. Таблица outbox и потребитель при этом не меняются. Но это заметно более тяжёлое эксплуатационное обязательство, поэтому начинать почти всегда стоит с опроса.</p><h2>Что забрать с собой</h2><p>Обе части задачи выглядят избыточными ровно до первого инцидента. Тридцать строк кода с ключом идемпотентности стоят дешевле одного тикета с заголовком «вы списали дважды», а таблица outbox дешевле расследования, почему заказ есть у клиента и отсутствует на складе.</p><p>Коварство проблемы двух записей в том, что наивная реализация работает правильно почти всегда. Она отказывает в зазоре между двумя системами, и зазор этот становится виден только когда что-то пошло не так в самый неподходящий момент. К моменту, когда расхождение заметят в продакшене, данные уже разъехались, и красивого способа их починить не будет.</p><p>Как одно неверное допущение о порядке вызовов обернулось эпидемией задвоенных операций, показано в <a href="https://tproger.ru/articles/skrytyj-sboj-idempotentnosti-v-finteh-sisteme-razbor-incidenta">разборе реального инцидента в финтех-системе</a>.</p><p>Материалы, на которых основан разбор: <a href="https://dev.to/sirmax/3-ways-to-make-your-api-requests-idempotent-with-working-code-4inl">три паттерна идемпотентности с рабочим кодом</a>, <a href="https://dev.to/seo_optimization_591fad6c/designing-idempotent-decision-endpoints-that-survive-real-retries-6c1">проектирование ручек, переживающих реальные повторы</a> и <a href="https://www.freecodecamp.org/news/how-to-fix-the-dual-write-problem-in-node-js-with-the-outbox-pattern/">пошаговая сборка outbox на Node.js</a>.</p><p>Откройте самый денежный обработчик в своём сервисе и попробуйте отправить в него один и тот же запрос дважды. Если во второй раз что-то произошло, вы уже знаете, с чего начать понедельник.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пагинация и лимиты API: как отдавать данные постранично и не дать выгрести базу</title>
      <link>https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat</link>
      <comments>https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat</guid>
      <description><![CDATA[<p>Пагинация через OFFSET тормозит на глубоких страницах и теряет строки. Смотрите, как перейти на курсор и настроить лимиты запросов — с кодом и замерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat">Пагинация и лимиты API: как отдавать данные постранично и не дать выгрести базу</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Sep 2026 05:00:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш API отдаёт страницы по двадцать записей и работает прекрасно ровно до того дня, когда у первого крупного клиента накопится полмиллиона строк. Тогда выяснится сразу две вещи: страницы стали открываться секундами, а синхронизация на стороне клиента дважды затянула одни и те же заказы.</p><p>Оба симптома дают один и тот же виновник — постраничная выдача через OFFSET. И оба чинятся одним переходом, причём переписывать приходится только слой выдачи.</p><p>Пагинация — это способ отдать большую коллекцию по частям. Вариантов ровно два. Offset-пагинация просит базу пропустить N строк и вернуть следующие двадцать. Курсорная (её же называют keyset) запоминает последнюю отданную запись и просит всё, что идёт после неё.</p><p>Стоимость OFFSET растёт линейно: на таблице в 1,2 млн строк выборка со смещением в миллион занимает 2,4 с против 3 мс у курсора.</p><p>Под параллельными вставками и удалениями OFFSET выдаёт дубликаты и пропуски, потому что нумерация строк сдвигается между запросами.</p><p>Курсор не поддерживает переход на произвольную страницу, поэтому для админок и таблиц с кнопкой «страница 47» offset остаётся правильным выбором.</p><p>Лимиты запросов на счётчике в памяти инстанса не работают: при десяти инстансах настроенные 100 запросов в минуту превращаются в 1000.</p><p>Скользящее окно на сортированном множестве Redis и атомарном Lua-скрипте занимает пятнадцать строк и снимает гонку без распределённых блокировок.</p><p>Результат на спокойной базе одинаковый. Поведение под ростом данных и параллельными записями — принципиально разное.</p><h2>Offset ломается двумя разными способами</h2><p>Про первый знают почти все, про второй вспоминают уже после инцидента.</p><h3>Он линейно замедляется</h3><p>PostgreSQL, MySQL и SQLite не умеют «перепрыгнуть» через строки. При OFFSET 100000 база честно читает сто тысяч строк и выбрасывает их, чтобы отдать следующие двадцать. Стоимость запроса растёт вместе со смещением.</p><p>Автор разбора <a href="https://dev.to/sirmax/why-i-switched-my-api-from-offset-to-cursor-pagination-and-when-you-shouldnt-1464">замерил это на таблице в 1,2 млн строк</a> в PostgreSQL 15 с холодным кешем и обычным btree-индексом по id:</p><p>Курсорный вариант на той же таблице держал 3 мс на любой глубине. Разница объясняется сложностью: поиск по индексу это O(log n), а большое смещение — O(offset). На пятидесятитысячной странице пользователь ждёт больше двух секунд вместо миллисекунд.</p><h3>Он врёт, когда в таблицу пишут</h3><p>Этот сценарий коварнее. Пользователь загрузил первую страницу с двадцатью записями, отсортированными от новых к старым. Пока он читал, в таблицу добавились три новые записи. Запрос второй страницы с OFFSET 20 вернёт часть того, что уже было на первой: всё сдвинулось на три позиции.</p><p>Клиент получает дубликаты. При удалении записей картина обратная — часть строк он не увидит никогда, потому что они проскочили мимо границы страницы. У автора статьи на этом сломалась синхронизация у клиента: задание дважды загрузило одни и те же двадцать заказов, и три письма в поддержку ушло на то, чтобы понять, что виновата пагинация, а не код клиента.</p><p>Курсор от этого защищён по построению. Курсор — это последняя фактически полученная запись, поэтому «всё, что после неё» остаётся верным независимо от того, сколько строк вставили или удалили между запросами.</p><h2>Как выглядит курсор в коде</h2><p>Простейшая версия работает по первичному ключу и умещается в один обработчик:</p><p>Обратите внимание на per_page + 1. Запрашивая на одну запись больше, чем собираетесь отдать, вы узнаёте о существовании следующей страницы без отдельного запроса COUNT. Лишняя запись отбрасывается, а её наличие становится флагом has_more.</p><h3>Составной курсор: место, где ломается наивная версия</h3><p>Курсор по одному id корректен, только пока вы сортируете по id. Как только сортировка идёт по created_at, простое условие created_at &gt; X начинает терять записи: два заказа, созданные в одну миллисекунду, дают ничью, и одна из строк молча исчезает из выдачи.</p><p>Лечится это составным курсором — ключ сортировки плюс первичный ключ, сравниваемые как кортеж:</p><p>Сравнение кортежей разрешает ничьи детерминированно, поэтому ни одна строка не дублируется и не пропадает. Под это нужен составной индекс (created_at DESC, id DESC), иначе выигрыш в скорости пропадёт вместе с планом запроса.</p><p><b>Про формат курсора:</b><br />Не отдавайте наружу голый идентификатор, если планируете менять схему. Заверните значения в маленький JSON с полем версии и закодируйте в base64: тогда через год вы поменяете состав курсора, не сломав клиентов, которые прямо сейчас держат страницу открытой.</p><h2>Когда офсетную пагинацию нужно оставить</h2><p>Курсор не бесплатный, и подменять им всё подряд не стоит. Есть четыре ситуации, где offset честно лучше:</p><ul><li>Интерфейсу нужен переход на конкретную страницу. У курсора нет номеров страниц, поэтому админки, таблицы и всё с кнопкой «перейти к странице 47» остаются на offset.</li><li>Данных мало и они не меняются. Справочник на пять тысяч строк не выиграет ничего, зато offset проще объяснить и отладить.</li><li>Пагинация идёт по памяти или по кешу, где смещение и так стоит O(1).</li><li>Сортировка задаётся пользователем по произвольной колонке. Курсор тут превращается в кодирование кортежей в непрозрачные строки, и это уже заметная сложность.</li></ul><p>Разумное правило: курсор по умолчанию для всего, что может перерасти десять тысяч строк или читается во время записи. Offset — для небольших, статичных и внутренних данных.</p><p>И отдельно стоит помнить, что пагинация обычно не единственная нагрузка на базу. Кто ещё и насколько сильно её грузит, разбирали в переводе про <a href="https://tproger.ru/translations/patterny-upravleniya-trafikom-k-postgresql-v-production">паттерны управления трафиком к PostgreSQL</a>.</p><h2>Вторая половина задачи: кто и сколько может забрать</h2><p>Правильная пагинация решает, как отдавать данные. Она не решает, сколько их заберут за минуту. Ограничение частоты запросов выглядит тривиально («считай запросы, блокируй сверх N») и превращается в задачу распределённых систем ровно в тот момент, когда серверов становится два.</p><h3>Сначала ответьте, от чего защищаетесь</h3><p>От выбранной цели зависит вся конструкция, и целей <a href="https://dev.to/weston_carnes_d580b505e0c/api-rate-limiting-patterns-algorithms-and-how-to-do-it-right-4l35">обычно выделяют четыре</a>:</p><ul><li>Защита от перегрузки — не дать всплеску положить сервис.</li><li>Честное распределение — не дать одному шумному клиенту вытеснить остальных.</li><li>Защита от злоупотреблений — притупить перебор паролей, скрейпинг и подстановку учётных данных.</li><li>Контроль расходов — ограничить дорогие ручки вроде вызова модели или построения отчёта. Тот же принцип со стороны поставщика разбирали на примере <a href="https://tproger.ru/articles/kak-ogranichit-rashody-na-openai-api-chtoby-ii-agenty-ne-sozhgli">лимитов трат в OpenAI API</a>.</li></ul><h3>Три алгоритма и один, который выбирают почти всегда</h3><p><b>Фиксированное окно</b> считает запросы в календарном интервале: сто в минуту со сбросом на начале минуты. Просто и дыряво: клиент отправляет сотню в 12:00:59 и ещё сотню в 12:01:00, то есть двести за одну секунду. Граница окна и есть дыра.</p><p><b>Скользящее окно</b> считает в непрерывно сдвигающемся интервале, часто взвешивая счётчик предыдущего окна по мере хода времени. Точнее, но требует больше состояния.</p><p><b>Ведро токенов</b> обычно и оказывается верным выбором по умолчанию. В ведре лежит до N токенов, оно пополняется с постоянной скоростью, каждый запрос тратит один токен. Такая схема разрешает контролируемые всплески (молчавший клиент накопил токены и может потратить их разом), но держит среднюю нагрузку в рамках. Родственное «дырявое ведро» выдаёт идеально ровный поток и нужно там, где принимающая сторона всплесков не переносит.</p><blockquote>Фиксированное окно пишут первым и потом жалеют. На ведро токенов мигрируют.</blockquote><h3>Ловушка, из-за которой лимит не работает вообще</h3><p>Счётчик в памяти процесса живёт до появления второго сервера. После этого «сто запросов в минуту» тихо означает «сто запросов в минуту на инстанс», и при десяти инстансах клиент законно получает тысячу. Ошибку не видно ни в логах, ни в мониторинге: лимит вроде бы работает, просто не тот.</p><p>Лечится это переносом счётчика в общее хранилище, обычно в Redis, причём проверка и инкремент обязаны быть атомарными. Последовательность «прочитать, сравнить, увеличить» из кода приложения гоняется между инстансами и недосчитывает запросы ровно под той нагрузкой, ради которой лимит и ставили.</p><h2>Скользящее окно на Redis: пятнадцать строк Lua</h2><p>Команда сервиса jo4.io столкнулась с частным случаем этой задачи: ручка подсказки категорий ходит в модель через Groq, каждый вызов стоит денег, а пользователь может дёрнуть её полсотни раз за минуту. Нужны были лимиты на конкретную ручку и на конкретного пользователя, причём в тот же день.</p><p>Скользящее окно они <a href="https://dev.to/anand_rathnas_d5b608cc3de/redis-sliding-window-rate-limiting-with-lua-the-15-line-script-that-saved-our-ai-budget-p0i">собрали на сортированном множестве Redis</a>. Скор записи — временная метка в миллисекундах, а весь алгоритм умещается в один Lua-скрипт, который Redis выполняет атомарно:</p><p>Первая команда чистит записи старше окна относительно текущего момента — именно поэтому окно скользящее, а не фиксированное: границ, к которым можно приурочить всплеск, здесь просто нет. PEXPIRE с запасом в секунду доубивает ключ, если новых запросов не приходит, так что чистить хранилище отдельно не нужно.</p><h3>Две детали, на которых легко ошибиться</h3><p><b>Уникальность члена множества.</b> ZADD не добавляет запись, а перезаписывает существующую, если член совпал. Два запроса в одну миллисекунду с одинаковым значением дадут счётчик, который занижен. Авторы склеивают метку времени с восемью символами UUID: метка обеспечивает уникальность почти всегда, а восемь шестнадцатеричных символов дают около четырёх миллиардов вариантов внутри одной миллисекунды.</p><p><b>Куда падать при отказе Redis.</b> Решение здесь принимается осознанно и по-разному для двух случаев. Если вызов не получил внятного ответа вовремя (таймаут клиента, сетевая икота), запрос пропускают: лимит здесь страхует бюджет, а не безопасность, и блокировать живого пользователя из-за сбоя инфраструктуры хуже, чем оплатить лишний вызов модели. А вот жёсткое исключение (Redis недоступен, соединение отвергнуто) пробрасывают наверх: если хранилище легло целиком, лучше шумно упасть, чем молча жечь бюджет вообще без ограничений.</p><p>Обошлось это в два часа работы вместе с тестами. Одна запись в сортированном множестве занимает около 50 байт, на пользователя их пять, и даже при десяти тысячах активных пользователей всё хранилище лимитов весит порядка 2,5 МБ. Настроенный лимит составил пять запросов за шестьдесят секунд на пользователя. Первым же уловом стал автоматизированный скрипт, бивший в ручку больше двухсот раз в час.</p><h2>Честный контракт с клиентом</h2><p>Ограничение без внятного ответа превращает вежливого клиента в невежливого: не понимая, что происходит, он начинает долбить чаще. Минимальный набор обязательств выглядит так:</p><ul><li>Отдавать 429 Too Many Requests, а не общий 400 или 503. По коду клиент понимает, что делать.</li><li>Присылать заголовок Retry-After, чтобы клиент знал момент следующей попытки, а не подбирал его перебором.</li><li>Показывать остаток бюджета в заголовках вида X-RateLimit-Remaining и X-RateLimit-Reset.</li></ul><p>Последний пункт стоит дешевле всего и работает лучше всего: клиент, который видит свой остаток, обычно распределяет запросы сам и до стены не доходит.</p><h2>Что забрать с собой</h2><p>Обе половины задачи решаются до того, как появится нагрузка, и обе стоят один вечер. Курсорная пагинация убирает и деградацию на глубоких страницах, и молчаливую порчу выдачи при параллельных записях. Атомарный счётчик в общем хранилище превращает лимит из декоративного в настоящий.</p><p>Отложить их дешевле всего прямо сейчас и дороже всего в момент, когда в поддержку придёт клиент с задвоенными заказами: тогда чинить придётся не только API, но и данные на его стороне.</p><p>Разборы, на которых основан материал: <a href="https://dev.to/sirmax/why-i-switched-my-api-from-offset-to-cursor-pagination-and-when-you-shouldnt-1464">переход с offset на курсор с замерами</a>, <a href="https://dev.to/weston_carnes_d580b505e0c/api-rate-limiting-patterns-algorithms-and-how-to-do-it-right-4l35">паттерны и алгоритмы ограничения частоты</a> и <a href="https://dev.to/anand_rathnas_d5b608cc3de/redis-sliding-window-rate-limiting-with-lua-the-15-line-script-that-saved-our-ai-budget-p0i">скользящее окно на Redis и Lua</a>.</p><p>Откройте свой самый нагруженный список и выполните запрос с большим смещением. Если ответ идёт дольше сотни миллисекунд, вы уже нашли, с чего начать.</p>]]></content:encoded>
    </item>
    <item>
      <title>NGINX 1.31.5 маршрутизирует по телу JSON, а njs 1.0.1 закрыл три CVE</title>
      <link>https://tproger.ru/news/nginx-1-31-5-marwrutiziruet-po-telu-json-a-njs-1-0-1-zakryl-tri</link>
      <comments>https://tproger.ru/news/nginx-1-31-5-marwrutiziruet-po-telu-json-a-njs-1-0-1-zakryl-tri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/nginx-1-31-5-marwrutiziruet-po-telu-json-a-njs-1-0-1-zakryl-tri</guid>
      <description><![CDATA[<p>NGINX 1.31.5 выбирает location по любой переменной, читает тело запроса до маршрутизации и парсит JSON без njs. njs 1.0.1 закрыл три CVE, включая обход js_access.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/nginx-1-31-5-marwrutiziruet-po-telu-json-a-njs-1-0-1-zakryl-tri">NGINX 1.31.5 маршрутизирует по телу JSON, а njs 1.0.1 закрыл три CVE</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 04:56:43 GMT</pubDate>
      <content:encoded><![CDATA[<p>2 сентября вышел NGINX 1.31.5 с четырьмя новыми возможностями в открытом ядре: блок location теперь выбирается по любой переменной, а не только по пути URI, тело запроса можно прочитать до выбора location, появился встроенный модуль разбора JSON, и в открытую версию перенесён Control API из коммерческого NGINX Plus. Об этом <a href="https://blog.nginx.org/blog/nginx-1-31-5-control-api-predicate-locations-early-body-inspection-and-more">сообщили</a> в блоге NGINX Дилан Шварц и Алессандро Фаэль Гарсия. В тот же день вышел njs 1.0.1, модуль JavaScript для NGINX, который <a href="https://nginx.org/en/docs/njs/changes.html">закрывает три уязвимости</a>, одна из которых позволяла обойти проверку доступа в директиве js_access.</p><p>Для тех, кто держит NGINX перед API, это меняет привычную схему. Раньше, чтобы направить запрос к /graphql или /mcp на разные бэкенды в зависимости от того, что лежит внутри JSON, приходилось подключать njs или Lua. Теперь то же самое делается директивами конфигурации на C без скриптового рантайма. Тем, кто уже использует njs с js_access, обновление стоит поставить в первую очередь: до 1.0.1 ошибка внутри асинхронной проверки приводила к тому, что NGINX продолжал обрабатывать запрос, как будто проверка пройдена.</p><ul><li>NGINX 1.31.5 от 2 сентября 2026 года: location по переменной (predicate locations), директива client_body_early_read, модуль ngx_http_json_module, Control API из NGINX Plus R37.0.</li><li>Control API не имеет аутентификации: проект рекомендует запускать его только на UNIX-сокете с правами для привилегированных пользователей и не выставлять на сетевой порт.</li><li>Главное исправление 1.31.5: use-after-free при буферизованном проксировании к клиенту по HTTP/2, из-за которого клиенту могла уйти освобождённая память или падал worker.</li><li>njs 1.0.1 закрыл CVE-2026-18329 (обход js_access, появился в 0.9.9), CVE-2026-78222 (падение worker при пустой reason phrase у upstream, с 0.5.1) и CVE-2026-78689 (переполнение буфера в xml.exclusiveC14n(), с 0.7.10).</li><li>Исходники и бинарные пакеты для основных дистрибутивов Linux уже доступны на nginx.org.</li></ul><h2>Что изменилось в маршрутизации</h2><p>Авторы блога объясняют новую схему через почту. URI вроде /api/v1/checkout это адрес на конверте, заголовки Authorization и User-Agent это штампы, а тело запроса с JSON это само письмо внутри. Классический NGINX сортировал письма по адресу на конверте: выбирал location по URI, а тело обычно читалось уже после выбора location. Проблема в том, что современные клиенты, от GraphQL и JSON-RPC до MCP-серверов для ИИ-агентов и краулеров, шлют совершенно разные операции на один и тот же адрес /api/v1, /graphql или /mcp.</p><p>В 1.31.5 конверт можно вскрыть до сортировки. Четыре новые возможности складываются в одну цепочку: прочитать тело раньше, вытащить из JSON нужное поле в переменную, использовать переменную как условие выбора location.</p><h3>Predicate locations: location по любой переменной</h3><p>Любая переменная становится предикатом, если написать её в определении location (<a href="https://github.com/nginx/nginx/pull/1633">nginx/nginx#1633</a>). Блок срабатывает, когда переменная непустая и не равна нулю. Условие может учитывать что угодно: подсеть клиента, клиентский сертификат, заголовки, результат map или поле из тела запроса. Пример из блога:</p><p>По словам разработчиков, условия вычисляются на уровне C без скриптового рантайма. До сих пор сложную логику выбора location собирали из map, if и внутренних редиректов либо выносили в njs и Lua.</p><h3>client_body_early_read: тело до выбора location</h3><p>По умолчанию NGINX читает заголовки, выбирает location и только затем буферизует тело. Директива client_body_early_read меняет порядок: тело буферизуется до сопоставления location, а разбирает его уже отдельный JSON-модуль (<a href="https://github.com/nginx/nginx/pull/1641">nginx/nginx#1641</a>). Проект называет два сценария: маршрутизация по содержимому, когда вызов инструмента tools/call в MCP уходит на свой сервис вместо общего /mcp, и проверка на границе, когда слишком большой или некорректный payload отклоняется, ограничивается по частоте или валидируется до того, как уйдёт на бэкенд. Раньше для учёта отдельных вызовов инструментов агентов NGINX предлагал модуль MCP Observability на njs.</p><h3>ngx_http_json_module: поля JSON в переменные</h3><p>Новый модуль разбирает буферизованный JSON и кладёт поля, включая вложенные, в обычные переменные NGINX (<a href="https://github.com/nginx/nginx/pull/1642">nginx/nginx#1642</a>). Дальше переменную можно подать в map или прямо в предикат location. Пример вытаскивает поле method из тела POST-запроса. В анонсе аргументы приведены в обратном порядке; по исходному коду модуля директива принимает сначала имя новой переменной, затем источник и путь:</p><p>В паре с client_body_early_read переменные из JSON заполняются до выбора location. Полное описание директив модуля разработчики обещают в отдельных статьях: в блоге анонсированы три разбора, про predicate locations, про Control API и про маршрутизацию по телу запроса.</p><h2>Control API пришёл из NGINX Plus, но без аутентификации</h2><p>Control API впервые появился в NGINX Plus R37.0 LTS, а теперь перенесён в открытую версию (<a href="https://github.com/nginx/nginx/pull/1626">nginx/nginx#1626</a>). Он даёт программный доступ к состоянию процессов и конфигурации по адресам /1/control/processes и /1/control/config и позволяет перезагружать конфигурацию с синхронным ответом в JSON. Раньше перезагрузка делалась через nginx -s reload или сигнал, а результат приходилось ловить в /var/log/nginx/error.log: опечатка в конфигурации или проблема с правами на сокет обнаруживались уже постфактум. Теперь ошибка возвращается в HTTP-ответе, что удобно для конвейеров деплоя и инструментов infrastructure as code.</p><p>Для безопасного использования проект советует запускать NGINX с привязкой API к UNIX-сокету:</p><p>Control API работает и на сетевом порту, но команда NGINX прямо не рекомендует так делать: «API предоставляет открытый неаутентифицированный интерфейс к внутренностям NGINX и должен быть привязан к защищённой файловой системе, доступной только привилегированным пользователям» (перевод редакции). Путь к сокету в примере, /tmp/nginx.sock, взят из блога; на боевом сервере его стоит вынести в каталог с ограниченными правами.</p><h2>Какие ошибки исправили и почему авторы советуют обновиться</h2><p>Главной причиной обновиться разработчики называют исправление в буферизованном проксировании (<a href="https://github.com/nginx/nginx/pull/1664">nginx/nginx#1664</a>). При ошибке на стороне клиента функция ngx_event_pipe_drain_chains() возвращала в пул все буферы, включая цепочку p-&gt;busy, которую ещё использовали фильтры вывода. По HTTP/1.1 это оставалось незаметным, потому что запрос завершался сразу. По HTTP/2 флаг ошибки ставился на фиктивное соединение, обработчик записи продолжал отправлять DATA-фреймы, указывающие на освобождённую память, и клиент мог получить содержимое кучи, а worker упасть на незамапленной странице. По словам авторов, вредоносный ввод для этого не требовался: в упрощённом описании анонса хватало ошибки в фильтре тела ответа и медленного клиента, у которого накапливались фреймы; в pull request сценарий воспроизведения описан подробнее, с настройками временных файлов и особым ответом upstream. Затронута любая конфигурация с proxy_buffering on и клиентами по HTTP/2.</p><ul><li>Worker без свободных файловых дескрипторов теперь завершается штатно. Раньше при заполненной таблице дескрипторов вызов recvmsg() с SCM_RIGHTS не мог прочитать канал управления, worker закрывал свой конец канала и больше не получал сигнал завершения, то есть висел после reload (<a href="https://github.com/nginx/nginx/pull/1662">nginx/nginx#1662</a>).</li><li>Таймер повторного включения accept удаляется вместе с listen-соединением: иначе после NGX_CMD_QUIT в логах появлялось accept4() failed (9: Bad file descriptor).</li><li>Имена параметров fastcgi_param от 128 байт и uwsgi_param от 256 байт теперь кодируются с правильной длиной. Раньше поле длины обрезалось до одного байта, запрос к бэкенду получался повреждённым, PHP-CGI сбрасывал соединение, и NGINX отвечал 502 на каждый запрос к такому location (<a href="https://github.com/nginx/nginx/pull/1648">nginx/nginx#1648</a>). SCGI не затронут.</li><li>Три проверки входных данных: длины ответов memcached вблизи NGX_MAX_OFF_T_VALUE отклоняются с 502, начало диапазона Range у самого максимума в модуле slice игнорируется с ответом 416, а CRYPTO-фреймы QUIC в 1-RTT-пакетах после завершения рукопожатия отвергаются с ошибкой unexpected_message. Первые две ошибки были неопределённым поведением и роняли сборки с -fsanitize=signed-integer-overflow.</li><li>Исправлен расчёт переполнения длины при формировании JSON в ngx_json_obj_length().</li></ul><h2>Что закрыл njs 1.0.1</h2><p>njs, модуль, который добавляет в NGINX JavaScript, получил версию 1.0.1 в тот же день. В <a href="https://nginx.org/en/docs/njs/changes.html">списке изменений</a> три записи с пометкой Security.</p><ul><li>CVE-2026-18329: обход контроля доступа в js_access. Если асинхронное продолжение чтения тела запроса бросало исключение или завершалось необработанным rejection, NGINX продолжал обрабатывать запрос так, будто проверка js_access прошла. Ошибка появилась в njs 0.9.9; нашёл её Та Дык Тхиен.</li><li>CVE-2026-78222: падение worker-процесса при чтении Response.statusText, когда upstream вернул строку статуса с пустой reason phrase. Ошибка присутствовала с версии 0.5.1.</li><li>CVE-2026-78689: переполнение буфера в куче при разборе списка префиксов пространств имён, переданного в xml.exclusiveC14n(). Ошибка с версии 0.7.10; о ней сообщили исследователи из Cyera и evilgensec.</li></ul><p>Помимо уязвимостей, в 1.0.1 исправлены use-after-free, аварийные завершения worker и утечки при циклических ссылках между объектами Fetch, HTTP-запроса и Stream-сессии в движке QuickJS, переполнение буфера на стеке при экспорте RSA-ключей длиннее 4096 бит в JWK через crypto.subtle.exportKey(), шифрование и расшифровка RSA-OAEP с SHA-256 и SHA-384, проверка значений заголовков Fetch и имён в r.headersOut, а также целей редиректа в r.return(). Добавлены глобальные функции btoa() и atob() в движке QuickJS и совместимость с quickjs-ng 0.16.0 и новее.</p><h2>Что делать администратору</h2><ol><li>Если в конфигурации есть js_access, обновить njs до 1.0.1 сразу: до этого ошибка внутри проверки доступа открывала запрос вместо того, чтобы его отклонить.</li><li>Если NGINX проксирует с proxy_buffering on и принимает HTTP/2, обновить ядро до 1.31.5: это исправление разработчики называют главной причиной обновления.</li><li>Ветка 1.31 это mainline, где новые возможности появляются первыми. Predicate locations, client_body_early_read, JSON-модуль и Control API есть только здесь; в стабильной ветке их пока нет, и о сроках переноса в блоге не сказано.</li><li>Пробуя Control API, привязывать его только к UNIX-сокету в каталоге с ограниченными правами. Аутентификации у API нет.</li></ol><p>NGINX 1.31.5 <a href="https://nginx.org/en/download.html">доступен</a> в исходниках и бинарными пакетами для основных дистрибутивов Linux. Предыдущая версия 1.31.4 вышла 19 августа и добавила PROXY protocol v2 в модули stream и mail. По каждой из четырёх новых возможностей команда NGINX обещает отдельные статьи с примерами конфигурации, и редакция вернётся к теме, когда появится документация директив JSON-модуля.</p><p>Источники: <a href="https://blog.nginx.org/blog/nginx-1-31-5-control-api-predicate-locations-early-body-inspection-and-more">NGINX 1.31.5: Control API, predicate locations, early body inspection, and more (NGINX Community Blog)</a>, <a href="https://nginx.org/en/CHANGES">CHANGES nginx 1.31.5</a>, <a href="https://nginx.org/en/docs/njs/changes.html">Changes with njs 1.0.1</a>, <a href="https://github.com/nginx/nginx/releases/tag/release-1.31.5">Релиз nginx 1.31.5 на GitHub</a></p><p>Изображение на обложке: Изображение: F5 NGINX</p>]]></content:encoded>
    </item>
    <item>
      <title>Anthropic открыла Claude Commerce Agents: чертёж торгового агента на Claude</title>
      <link>https://tproger.ru/news/anthropic-otkryla-claude-commerce-agents-chertyozh-torgovogo-agent</link>
      <comments>https://tproger.ru/news/anthropic-otkryla-claude-commerce-agents-chertyozh-torgovogo-agent?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/anthropic-otkryla-claude-commerce-agents-chertyozh-torgovogo-agent</guid>
      <description><![CDATA[<p>Anthropic открыла Claude Commerce Agents под Apache 2.0: два агента для магазина, три способа запуска, проверки внутри вызова инструмента и свой бэкенд.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/anthropic-otkryla-claude-commerce-agents-chertyozh-torgovogo-agent">Anthropic открыла Claude Commerce Agents: чертёж торгового агента на Claude</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 19:53:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>Anthropic 2 сентября 2026 года <a href="https://x.com/ClaudeDevs/status/2095233745167282602">открыла исходники</a> Claude Commerce Agents: двух агентов на Claude для интернет-торговли под лицензией Apache 2.0. Первый, покупательский, бизнес встраивает в своё приложение для клиентов. Второй, мерчантский, нужен сотрудникам, чтобы вести листинги, цены, остатки и кампании. В <a href="https://github.com/anthropics/commerce-agents">репозитории anthropics/commerce-agents</a> лежат оба агента, четыре демонстрационные вертикали (розница, путешествия, телеком, билеты), семь pip-пакетов и плагин для Claude Code, который собирает такого агента под чужой стек.</p><p>Для команды, которая пишет ассистента магазина или маркетплейса, интерес здесь в архитектуре, а не в демо. Anthropic показывает, как описать агента один раз и запускать тремя способами, где стоят проверки, чтобы модель не могла подложить в корзину чужой товар или изменить цену без человека, и как подключить свой каталог через два интерфейса на Python.</p><p>Оговорка стоит в самом README: это референсная реализация, она не поддерживается и не принимает внешний вклад. В примерах нет аутентификации, MCP-серверы по умолчанию слушают loopback.</p><ul><li>Два агента, три способа запуска (Messages API, Claude Agent SDK, Managed Agents (beta)), четыре вертикали и восемь веб-приложений в одном репозитории под Apache 2.0.</li><li>Не оформляет заказ, не списывает деньги и не меняет живые листинги: checkout только рисует корзину, каждая запись мерчанта ждёт одобрения человека.</li><li>Проверки provenance, лимиты, ограждение стороннего текста и валидация памяти работают внутри вызова инструмента и держатся на всех трёх путях запуска.</li><li>Своя интеграция сводится к реализации StorefrontBackend или MerchantBackend; отсутствующие системы выключаются переключателями enable_*.</li><li>Модели по умолчанию: claude-sonnet-5 у покупательского агента, claude-opus-5 у мерчантского, claude-haiku-4-5-20251001 для памяти; рантаймы работают через Vertex AI, Bedrock, Microsoft Foundry и шлюзы.</li><li>Требования: Python 3.11 и новее, Node 22. Демо поднимается шестью командами из README.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/8278495a-80f4-42a1-baf3-e052ab3d3504.webp" alt="Кадр из видео Anthropic с четырьмя вертикалями: Retail, Travel, Telecom, Ticketing" /><figcaption>Четыре вертикали из анонсирующего видео. Скриншот: Anthropic, commerce-agents</figcaption></figure><h2>Один агент описан один раз и работает на трёх рантаймах</h2><p>Главная архитектурная идея репозитория, как её формулирует <a href="https://github.com/anthropics/commerce-agents/blob/main/README.md">README</a>: каждый агент определён один раз (промпт, скиллы, контракты инструментов, гейты) и запускается на Messages API, на Claude Agent SDK и на Managed Agents. Четыре вертикали работают поверх одних библиотек и различаются бэкендом и доменными расширениями интерфейса.</p><p>Покупательский агент ищет и сравнивает товары, собирает планы покупок, наполняет корзину, отвечает на вопросы о заказах и правилах магазина и запоминает, что покупатель о себе рассказал. Его пять сценариев лежат как skills в каталоге <a href="https://github.com/anthropics/commerce-agents/tree/main/shopping-agent/skills">shopping-agent/skills</a>. Мерчантский агент объясняет показатели, правит листинги, реагирует на алерты по остаткам и заказам, назначает цены и промо, готовит кампании. Его пять сценариев лежат в <a href="https://github.com/anthropics/commerce-agents/tree/main/merchant-agent/skills">merchant-agent/skills</a>. Любая запись мерчанта становится staged change, которую применяет уже интерфейс одобрения на стороне хоста.</p><blockquote>Nothing places an order, charges a card, or changes a live listing: checkout renders the cart for the host to complete, and every merchant write is staged until a person approves it.</blockquote><p>Код разложен на семь pip-пакетов. Общее для обеих ролей вынесено в commerce-common: конфиг, ограждение стороннего текста, память, скиллы, grounding, презентационные компоненты, исполнитель инструментов и события. У каждой роли три пакета: core с типами, интерфейсом бэкенда, промптом, контрактами инструментов и гейтами; runtime с циклом ходов на Messages API; sdk с тем же агентом на Agent SDK и консолью. CI проверяет, что имена семи пакетов остаются незарегистрированными в публичном индексе, а pin-файлы ставят их из каталогов репозитория.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/6f818534-34eb-4db9-9321-d353b648b4e1.webp" alt="Горизонтальная диаграмма: состав репозитория commerce-agents в штуках: 2 агента, 3 рантайма, 4 вертикали, 7 пакетов, 8 веб-приложений, 10 flows, 7 расширений интерфейса, 4 команды плагина" /><figcaption>Состав поставки по README репозитория. График: Tproger по данным README anthropics/commerce-agents</figcaption></figure><p>Эталонный путь запуска, вокруг которого построены примеры, это Messages API. Хост создаёт объект агента с бэкендом, каталогом скиллов и конфигом и стримит события хода; извлечение памяти вызывается отдельно после хода, и только на этом пути. Код из README:</p><p>На Agent SDK тот же промпт, скиллы и инструменты, но цикл ведёт SDK: хост заранее подгружает данные для grounding, после хода ничего не выполняется. На Managed Agents агент размещён у Anthropic и ходит за данными в ваш MCP-сервер; деплой делает скрипт scripts/deploy_managed_agent.sh, без флага --live это сухой прогон. Различия трёх путей по docs/safety.md:</p><ul><li><b>Messages API.</b> Все правила grounding включаются принудительно через tool_choice; работают извлечение памяти после хода, сжатие истории и бюджеты аналитического делегата мерчанта.</li><li><b>Agent SDK.</b> Grounding только для правил с формой предварительной загрузки; цикл ограничен max_turns; аналитика мерчанта идёт субагентом без SQL-инструмента и бюджетов; память хост извлекает сам.</li><li><b>Managed Agents.</b> Grounding отсутствует, циклом владеет платформа, память пишется только через save_memory, одобрением staged change служит промпт always_ask на apply_change.</li></ul><h2>Проверки стоят внутри вызова инструмента, поэтому переживают смену рантайма</h2><p>Документ <a href="https://github.com/anthropics/commerce-agents/blob/main/docs/safety.md">docs/safety.md</a> делит правила на три группы: что код проверяет сам, что по-прежнему просят у модели промптом и что обязан добавить деплой. Ключевой приём: правило внутри вызова инструмента держится на всех трёх путях, потому что все три прогоняют вызовы через один исполнитель в модуле commerce_common/execution.py. Правило на уровне хода живёт в конкретном рантайме, и таблица указывает, где оно не работает.</p><blockquote>A rule enforced inside a tool call holds on all three paths, because the Messages API runtime, the SDK toolset, and the MCP server execute tools through the same executor.</blockquote><p>Что именно проверяется в коде, по таблице документа:</p><ul><li><b>Ограждение (fencing).</b> Сторонний текст очищается, оборачивается в ограждение с фиксированной меткой и обрезается до max_fenced_chars. Очистка убирает невидимые и управляющие символы, поддельные маркеры ходов, теги транскрипта и вызовов инструментов и копии самого маркера ограждения.</li><li><b>Лимиты цикла.</b> Запрошенное моделью число результатов поиска обрезается до max_search_results; после max_tool_iterations раундов рантайм Messages API принудительно делает ход без инструментов.</li><li><b>Provenance корзины.</b> В корзину попадают только идентификаторы товаров, которые в этой сессии вернул инструмент каталога или заказов. Попытка добавить товар с опциями (размер, цвет) задерживается, и модели показывают варианты. Действует лимит на позицию и на число строк.</li><li><b>Нет оплаты.</b> У StorefrontBackend нет метода, который размещает заказ или списывает деньги. URL размещённого checkout приходит из checkout_handoff после вызова модели и не проходит через неё.</li><li><b>Provenance staged-записей мерчанта.</b> Изменение принимает только идентификаторы листингов и кампаний, возвращённые инструментом в этой сессии; правка контента требует чтения get_listing. apply_change принимает только идентификаторы изменений, которые вернули staging или get_pending_changes.</li><li><b>Guardrails мерчанта.</b> Проверяются при постановке изменения и повторно при применении: число позиций, размах изменения цены, глубина промо, размер пополнения, бюджет кампании, защищённые поля.</li><li><b>Одобрение хостом.</b> При require_host_approval (включено по умолчанию) apply_change проходит только для идентификаторов, которые хост пометил одобренными. Карточка предпросмотра ничего не одобряет, «да, применяй» в чате тоже.</li><li><b>Память.</b> Ключ факта до 64 символов, значение до 200, одна из трёх категорий; значения, похожие на идентификаторы, отбрасываются. Извлечение читает только текст последнего обмена, никогда результаты инструментов.</li><li><b>Поверхность инструментов и идентичность.</b> Список инструментов вычисляется из конфига деплоя, исполнитель отказывает любому другому имени. Идентичность держит сервер: ни один аргумент инструмента не называет пользователя или мерчанта.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/858edd4a-4a45-4ee5-adca-71116592a154.webp" alt="Горизонтальная диаграмма лимитов: ключ факта памяти 64 символа, значение 200 символов, ограждение стороннего текста 12 000 символов по умолчанию" /><figcaption>Лимиты, которые проверяет код: память покупателя и размер одного ограждения. График: Tproger по данным docs/safety.md и docs/backends.md anthropics/commerce-agents</figcaption></figure><p>Вторая группа правил остаётся в промпте: трактовать ограждённый текст как материал для отчёта, называть условия и цифры только из результата инструмента, подтверждать запись только после успешного вызова, называть товары по идентификатору. Документ оговаривает: промптовые правила держатся ровно настолько, насколько модель следует инструкциям, а таблица держится на любой модели. Деплой, который меняет модель или выключает require_host_approval, должен сначала перегнать свои evals по этому разделу.</p><blockquote>When the model breaks one of these, the error is confined to its text. Every write, figure, and disclosure behind that text still passed the checks in the table above, so the failure is a misstatement to correct and no action needs reversing.</blockquote><p>Третья группа целиком на стороне деплоя: аутентификация и авторизация на каждом маршруте и на MCP-серверах (примеры принимают любого вызывающего), учётные данные для вызова ваших сервисов, лимиты запросов, бизнес-правила (фрод, право на покупку, цены, остатки), оплата после checkout, обращение с памятью как с персональными данными, гигиена логов и сама поверхность одобрения. Значения guardrails в двух файлах config.py названы демонстрационными.</p><h2>Своя интеграция сводится к двум интерфейсам и переключателям enable_*</h2><p>Точка входа для собственных систем описана в <a href="https://github.com/anthropics/commerce-agents/blob/main/docs/backends.md">docs/backends.md</a>. Деплой реализует StorefrontBackend поверх каталога, корзины, заказов и политик или MerchantBackend поверх аналитики, каталога, остатков, цен и кампаний. Контрактом служат докстринги методов в backend.py и types.py каждой роли. Каждый метод вызывает ваш сервис на стороне сервера с учётными данными, которые хост хранит для сессии; модель видит только результат.</p><blockquote>Each one calls your service server-side with the credential your host holds for the session; the model reads only the result.</blockquote><p>Документ раскладывает интеграцию на шесть шагов. Первый: решить, кто вызывающий. Хост аутентифицирует человека и стартует сессию с принципалом; токен покупателя живёт в контексте сессии, сервисная учётка передаётся в конструктор бэкенда. Гость тоже принципал: чтение, которому нужен аккаунт, бросает исключение, которое подкласс исполнителя превращает в просьбу войти. Второй: порядок многошаговых сценариев (удержать места, затем подтвердить) хранится и проверяется в бэкенде, а нарушение маппится через domain_error в понятный модели результат. Третий: как завершается checkout. Вариантов три: ссылка на маршрут в вашем приложении, размещённый checkout платформы, для которого checkout_handoff возвращает URL, или маркетплейс с записью на каждого продавца.</p><p>Четвёртый шаг: товары с опциями. Запись бывает простой, семейством (с полем options) или вариантом (с option_values и variant_of); идентификатор варианта идёт всюду, где ждут идентификатор товара. Детали товара возвращают все варианты семейства в одном ограждении, обрезанном до max_fenced_chars (12 000 символов по умолчанию). Компактная строка варианта занимает 70–120 символов, так что в семейство помещается около шестидесяти вариантов; кроссовки в восьми цветах и четырнадцати размерах документация советует подавать как восемь семейств по четырнадцать, потому что за пределами лимита результат режется без ошибки. Пятый: записи мерчанта по семействам, где изменение цены и пополнение именуют вариант. Шестой: для цифр, которых у платформы нет, возвращать None с пометкой, а не подставной ноль.</p><p>Для пилота README предлагает начинать с малого. Покупательский пилот реализует поиск и карточку товара, а остальное заглушает: метод-заглушка возвращает результат «недоступно» и не меняет ни байта промпта. Мерчантский пилот реализует восемь методов чтения, записи отказывают. Система, которой у бизнеса нет совсем, выключается переключателем enable_*: это убирает её инструменты, строки промпта и правило grounding на всех трёх путях, а сценарии, которым она нужна, паркуются в каталоге skills/_staged/. Свой сценарий добавляется каталогом с файлом SKILL.md, доменный интерфейс расширением PresentationExtension (вертикали поставляют семь), а brand_name, assistant_name и brand_voice в конфиге задают личность ассистента.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/632d0218-5e02-4a2c-8f59-e75bb9f7efce.webp" alt="Кадр из видео Anthropic: путь от намерения покупателя до staged-заказа" /><figcaption>Кадр «From intent to a staged order» из анонсирующего видео. Скриншот: Anthropic, commerce-agents</figcaption></figure><h2>Модели заданы строкой в конфиге, а переключение платформы сосредоточено в одном месте и зависит от рантайма</h2><p>По <a href="https://github.com/anthropics/commerce-agents/blob/main/docs/deployment.md">docs/deployment.md</a> код по умолчанию ходит в API Anthropic, но у каждого пути есть одно место, где деплой переключает платформу. Рантаймы Messages API принимают любой асинхронный клиент из пакета anthropic аргументом client=: AsyncAnthropicVertex для GCP Vertex AI, AsyncAnthropicBedrockMantle или AsyncAnthropicBedrock для AWS, AsyncAnthropicFoundry для Microsoft Foundry, AsyncAnthropic с base_url и auth_token для собственного шлюза. Пакеты требуют anthropic 0.91 и новее. Рантаймы Agent SDK HTTP-клиента не создают: платформу выбирает CLI Claude Code по переменным окружения, которые добавляются в options.env. Managed Agents работает на инфраструктуре Anthropic, поэтому у него нет варианта для Vertex, Bedrock и Foundry.</p><p>Модель задаётся строкой в конфиге: поля model и memory_model у каждой роли, у мерчанта ещё analysis_model. Значения по умолчанию, по таблице документа: claude-sonnet-5 для покупательского агента, claude-opus-5 для мерчантского, claude-haiku-4-5-20251001 для извлечения памяти. Грамматика идентификаторов у платформ разная: Vertex пишет датированные снимки через @, Bedrock через Mantle берёт идентификаторы с префиксом anthropic., а через Invoke API идентификаторы inference-профилей. Все три поля идут через один клиент, поэтому все три модели должны существовать на целевой платформе. Живого разговора с облаком в CI нет; документ просит прогнать его на своей платформе до того, как на неё полагаться.</p><p>Доступность API Anthropic и облачных платформ для конкретной страны или способа оплаты в документации репозитория не обсуждается. Для собственного шлюза документ называет требование: отдавать /v1/messages со стримингом SSE для Messages API, а для Managed Agents ещё проксировать /v1/skills, /v1/agents, /v1/environments, /v1/sessions и поток событий сессии с заголовками anthropic-beta.</p><h2>Демо поднимается шестью командами, а плагин Claude Code собирает агента под ваш стек</h2><p>Порядок запуска из README (нужны Python 3.11 и новее и Node 22, ключ ANTHROPIC_API_KEY в файле .env):</p><p>Флаг --merchant поднимает портал мерчанта вместо витрины, --all оба. В README каждой вертикали есть раздел Try с репликами, которые прогоняет scripts/smoke_chat.py. Розничная ACME показывает поиск, сравнение, корзину, checkout и память; ACME Travel добавляет инвентарь с датами; ACME Mobile матрицу тарифов и серверные раскрытия комиссий; ACME Tickets таймированные удержания мест, листы ожидания и карту зала.</p><p>Второй способ начать: <a href="https://github.com/anthropics/commerce-agents/tree/main/plugins/commerce-builder">плагин commerce-builder</a> для Claude Code. Он читает клонированный репозиторий как эталон и собирает агента на этих пакетах против ваших систем либо проверяет уже написанного. Установка и первая команда из README:</p><p>Команда /scaffold-commerce-agent спрашивает о стеке, проговаривает план и строит проект. Дальше /add-commerce-flow добавляет сценарий, /author-commerce-evals пишет evals, /review-commerce-agent начинает с уже существующего агента. Собственных MCP-коннекторов в поставке нет: оба агента ходят в системы через интерфейсы бэкенда. Где официальный коннектор является источником истины (Snowflake, BigQuery, Stripe, Square, Slack и другие в списке README), он и становится целью интеграции. MCP-сервер торговой платформы вызывается из метода бэкенда на сервере, и гейты provenance остаются перед каждой записью.</p><p>Проверка после правок: ruff check и ruff format --check, pytest, python scripts/check.py; python scripts/verify_all.py добавляет сухие прогоны деплоя и сборку веб-приложений; python scripts/smoke_chat.py --vertical travel проводит один живой разговор и требует ключ. Чтобы убедиться, что кэширование промпта работает, README советует читать cache_read_input_tokens из события turn_complete: ноль на втором ходу означает, что префикс промпта изменился.</p><h2>Что делать команде, которая пишет ассистента для магазина</h2><ol><li>Поднять розничное демо по шести командам выше (Python 3.11 и новее, Node 22, ключ API) и пройти реплики из раздела Try в examples/retail/ на витрине (порт 3000) и в портале мерчанта (флаг --merchant, порт 3100).</li><li>Сверить таблицу «Enforced in code» и список «What a deployment owns» из docs/safety.md с собственной платформой: аутентификация, учётные данные, лимиты запросов, бизнес-правила, оплата, персональные данные в памяти, логи.</li><li>Для пилота реализовать в StorefrontBackend только поиск и карточку товара, для MerchantBackend восемь методов чтения. Отсутствующие системы выключить через enable_*, зависимые сценарии убрать в skills/_staged/.</li><li>Разложить каталог по трём формам записи из docs/backends.md и проверить самое большое семейство против лимита max_fenced_chars в 12 000 символов.</li><li>Выбрать завершение checkout: свой маршрут, размещённый URL платформы через checkout_handoff или ссылка на продавца для маркетплейса; оплата остаётся в хосте.</li><li>Для Vertex AI, Bedrock, Foundry или шлюза передать клиент аргументом client= (anthropic 0.91 и новее) или переменные CLI в options.env и заменить все три идентификатора моделей.</li><li>Перед выкладкой прогнать ruff, pytest, scripts/check.py и scripts/verify_all.py, затем один живой разговор scripts/smoke_chat.py на своей платформе; при смене модели перегнать evals по разделу «Still asked of the model».</li></ol><p>Репозиторий создан 1 сентября, анонс в аккаунте Claude Developers вышел 2 сентября в 19:33 UTC. На 3 сентября, 01:53 мск, по <a href="https://api.github.com/repos/anthropics/commerce-agents">данным GitHub API</a> у проекта 277 звёзд и 46 форков. Поддержки и приёма внешних изменений Anthropic не обещает: «This is a reference implementation; it is not maintained and does not accept contributions», говорится в README. На практике это значит, что исправления и адаптацию под свои системы команде придётся вести в собственном форке, а промпты и гейты под новые модели проверять своими evals. Цен, лимитов и сроков дальнейшего развития Anthropic в репозитории не называет.</p><p>Источники: <a href="https://x.com/ClaudeDevs/status/2095233745167282602">Claude Developers в X: анонс открытия Claude Commerce Agents (2 сентября 2026)</a>, <a href="https://github.com/anthropics/commerce-agents">GitHub: anthropics/commerce-agents</a>, <a href="https://github.com/anthropics/commerce-agents/blob/main/README.md">README репозитория commerce-agents</a>, <a href="https://github.com/anthropics/commerce-agents/blob/main/docs/safety.md">docs/safety.md: правила, проверяемые кодом, и обязанности деплоя</a>, <a href="https://github.com/anthropics/commerce-agents/blob/main/docs/backends.md">docs/backends.md: подключение своих систем</a>, <a href="https://github.com/anthropics/commerce-agents/blob/main/docs/deployment.md">docs/deployment.md: Vertex AI, Bedrock, Microsoft Foundry и шлюзы</a>, <a href="https://github.com/anthropics/commerce-agents/tree/main/plugins/commerce-builder">Плагин commerce-builder для Claude Code</a>, <a href="https://github.com/anthropics/commerce-agents/tree/main/shopping-agent/skills">Скиллы покупательского агента</a>, <a href="https://github.com/anthropics/commerce-agents/tree/main/merchant-agent/skills">Скиллы мерчантского агента</a></p><p>Изображение на обложке: Anthropic, кадр из анонса Claude Commerce Agents</p>]]></content:encoded>
    </item>
    <item>
      <title>Llama 2 на DigitalOcean за $12: self-hosting гид</title>
      <link>https://tproger.ru/articles/llama-2-na-digitalocean-za-12-self-hosting-gid</link>
      <comments>https://tproger.ru/articles/llama-2-na-digitalocean-za-12-self-hosting-gid?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/llama-2-na-digitalocean-za-12-self-hosting-gid</guid>
      <description><![CDATA[<p>Разбираем, как запустить Llama 2 7B в Docker на DigitalOcean с FastAPI API. Реальная смета, пошаговые команды и советы по безопасности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/llama-2-na-digitalocean-za-12-self-hosting-gid">Llama 2 на DigitalOcean за $12: self-hosting гид</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Aug 2026 10:02:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Плата за OpenAI API для небольшого pet-проекта легко переваливает за несколько сотен долларов в месяц. Альтернатива — развернуть открытую языковую модель самостоятельно и платить только за виртуальный сервер. В этом гайде разбираем, как запустить <b>Llama 2 7B</b> в собственном Docker-контейнере на DigitalOcean и получить production-ready HTTP API меньше чем за 15 минут работы с терминалом.</p><p>Автор оригинального руководства указывает заголовок «за $5/месяц», но на практике минимально жизнеспособная конфигурация обходится в <b>$6–12/месяц</b>. За $5 дроплет даёт всего 1 ГБ ОЗУ — для семимиллиардной модели этого катастрофически мало. Ниже — реальные цифры и честная смета.</p><h2>Что такое Llama 2 и зачем её self-hostить</h2><p><b>Llama 2</b> — семейство открытых больших языковых моделей от Meta. Версия 7B содержит 7 миллиардов параметров, понимает английский и ряд других языков, умеет писать код, отвечать на вопросы и дополнять текст. Лицензия разрешает коммерческое использование при соблюдении простых правил, а веса можно скачать с Hugging Face.</p><p><b>Self-hosting</b> в данном случае означает, что вы сами устанавливаете модель на арендованный сервер, контролируете окружение, не делитесь данными пользователей с третьими лицами и не зависите от чужих rate limit. Главная экономика: при интенсивном использовании собственный инференс обходится в десятки раз дешевле облачных API.</p><ul><li>Llama 2 7B можно запустить на DigitalOcean Droplet с 2 vCPU и 4 ГБ ОЗУ при 4-битном квантовании.</li><li>Реальная стоимость — $12/месяц за Droplet плюс около $0,50 за трафик, а не $5.</li><li>Docker + FastAPI дают воспроизводимое окружение и HTTP API из коробки.</li><li>Для загрузки весов с Hugging Face нужен токен и принятая лицензия на Llama 2.</li><li>Для публичного доступа обязательны HTTPS, базовая аутентификация и rate limiting.</li></ul><h2>Что понадобится для развёртывания</h2><h3>Аппаратная часть</h3><ul><li>DigitalOcean Droplet на Ubuntu 22.04 LTS.</li><li>Минимум: 1 vCPU / 2 ГБ ОЗУ ($6/месяц) — только для экспериментов.</li><li>Рекомендуемый: 2 vCPU / 4 ГБ ОЗУ ($12/месяц) — стабильная работа с квантованием.</li><li>80 ГБ SSD: ~13 ГБ уйдёт на Docker-образ, модель и кэш.</li></ul><h3>Программная часть</h3><ul><li>SSH-ключ и базовое умение работать в терминале.</li><li>Docker и Docker Compose для управления контейнером.</li><li>Аккаунт на <a href="https://huggingface.co">Hugging Face</a> с принятой лицензией Llama 2 и API-токеном.</li><li>Nginx или аналогичный reverse proxy для вывода API в интернет.</li></ul><p><b>Российская специфика:</b> сайт DigitalOcean периодически попадает под блокировки Роскомнадзора. Для регистрации и управления Droplet может понадобиться VPN. Альтернативы — Hetzner, Selectel, Yandex Cloud или другие европейские и российские провайдеры; логика развёртывания от этого почти не меняется.</p><h2>Шаг 1. Создаём Droplet и подключаемся по SSH</h2><p>В панели DigitalOcean нажимаем <b>Create → Droplet</b>. Выбираем ближайший к целевой аудитории регион — для России это обычно Франкфурт или Амстердам. В качестве образа указываем Ubuntu 22.04 x64, тип — Basic Shared CPU, конфигурацию — 2 vCPU / 4 ГБ RAM. Авторизацию настраиваем через SSH-ключ, парольный вход отключаем.</p><p>Сгенерировать ключ и подключиться можно так:</p><h2>Шаг 2. Устанавливаем Docker и зависимости</h2><p>После подключения обновляем пакеты и ставим Docker официальным скриптом. Добавляем root в группу docker, чтобы не писать sudo перед каждой командой.</p><h2>Шаг 3. Собираем Docker-образ с FastAPI</h2><p>Приложение состоит из трёх файлов: Dockerfile, requirements.txt и app.py. Ключевой трюк — CPU-версия PyTorch и библиотека bitsandbytes, которая позволяет загрузить 7-миллиардную модель в 4 ГБ видеопамяти/ОЗУ.</p><h3>Dockerfile</h3><h3>requirements.txt</h3><h2>Шаг 4. Пишем FastAPI-приложение</h2><p>Приложение загружает модель при старте, кэширует её в /app/models и предоставляет три endpoint: /health, /info и /generate. Квантование в 4 бита снижает точность незначительно, но уменьшает потребление памяти в 3–4 раза.</p><p>Создаём файл с токеном Hugging Face. Никогда не коммитьте его в репозиторий: в продакшене используйте переменные окружения или секрет-менеджер.</p><h2>Шаг 5. Собираем и запускаем контейнер</h2><p>Первый запуск занимает 10–15 минут: скачиваются зависимости PyTorch и веса модели. Чтобы не качать веса при каждом перезапуске, подключаем Docker volume.</p><p>Для удобного управления добавляем docker-compose.yml:</p><h2>Шаг 6. Проверяем API</h2><p>Когда в логах появится Uvicorn running on http://0.0.0.0:8000, тестируем endpoint'ы:</p><p>Ответ должен содержать сгенерированный текст, количество токенов и время инференса. На CPU одна генерация из 100 токенов занимает 4–10 секунд — это нормально для бюджетного дроплета.</p><h2>Шаг 7. Безопасно выводим API в интернет</h2><p>Открывать порт 8000 напрямую в интернет небезопасно. Ставим Nginx как reverse proxy, настраиваем HTTPS через Let's Encrypt и базовую аутентификацию. Для rate limiting используем limit_req в Nginx или облачный firewall DigitalOcean.</p><p>Минимальная конфигурация Nginx выглядит так:</p><p><b>Про безопасность:</b> Llama 2 — мощная модель, способная генерировать вредоносные инструкции, персональные данные или нежелательный контент. Не выставляйте публичный API без аутентификации, логируйте запросы и рассмотрите фильтрацию промптов на уровне приложения.</p><h2>Выводы</h2><p>Self-hosted Llama 2 — рабочий способ снизить затраты на генеративный ИИ в pet-проектах и прототипах. При правильном квантовании семимиллиардная модель помещается в бюджетный дроплет, а Docker + FastAPI превращают развёртывание в рутинную процедуру. Главное — не экономить на RAM и не забывать про безопасность публичного API.</p><blockquote>Собственный инференс — не волшебная кнопка, а инструмент с чёткой областью применения: он выигрывает там, где важны предсказуемость расходов, приватность данных и отсутствие лимитов.</blockquote><p>Если соберётесь повторить гайд, начните с $12 Droplet и протестируйте нагрузку вручную. А если DigitalOcean недоступен — переносите тот же Docker Compose на Hetzner, Selectel или Yandex Cloud без изменения кода.</p><p><b>Источник:</b> <a href="https://dev.to/ramosai/how-to-deploy-llama-2-on-digitalocean-for-5month-complete-self-hosting-guide-13dl">How to Deploy Llama 2 on DigitalOcean for $5/Month: Complete Self-Hosting Guide</a> — RamosAI, Dev.to.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик уходит, инженер остаётся: как AI-экосистема меняет работу команды разработки</title>
      <link>https://tproger.ru/articles/razrabotchik-uhodit-inzhener-ostayotsya-kak-ai-ekosistema-menyaet-r</link>
      <comments>https://tproger.ru/articles/razrabotchik-uhodit-inzhener-ostayotsya-kak-ai-ekosistema-menyaet-r?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ислам Виндижев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/razrabotchik-uhodit-inzhener-ostayotsya-kak-ai-ekosistema-menyaet-r</guid>
      <description><![CDATA[<p>Александр Сахаров (Диасофт) — о том, почему чисто агентский подход к разработке устарел, чем опасен вендорлок на LLM и как устроена AI-driven Digital Q.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/razrabotchik-uhodit-inzhener-ostayotsya-kak-ai-ekosistema-menyaet-r">Разработчик уходит, инженер остаётся: как AI-экосистема меняет работу команды разработки</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 Jul 2026 14:16:47 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Александр Сахаров — член правления и директор по работе с партнёрами Диасофт — на партнёрском дне 29го мая 2026 года вёл программу и показывал обновлённый процесс разработки на платформе</i> <i>Digital Q.</i></p><figure><img src="https://media.tproger.ru/user-uploads/133609/2026-07-15/20558e56-1e70-4f4c-9cf9-952891070b29.webp" alt="" /></figure><p>AI продолжает плотно внедряться в процессы самых разных компаний. Строятся пайплайны и цепочки агентов, жгутся токены, генерируются тонны кода и строятся целые AI-экосистемы для разработки. Это обсуждают практически на всех отраслевых конференциях, ищут способы внедрения и оптимизации процессов.</p><p>Редакция Tproger недавно была нескольких таких ивентах и на партнёрском дне Диасофт пообщалась с членом правления Диасофт и директором по работе с партнёрами Александром Сахаровым. Мы поговорили о том, почему агентская разработка в её нынешнем виде — тупик, как строить эффективные AI-процессы разработки, почему фреймворк теперь важнее модели и что нового в AI-обновлении <a href="https://q.diasoft.ru/" rel="nofollow">платформы Digital Q</a>.</p><p><a href="https://q.diasoft.ru/">Digital Q</a> — российская low-code экосистема разработки от «Диасофт» с готовым «заводом» инструментов для сборки корпоративных приложений: от проектирования бэкенда, дизайна интерфейсов до DevOps. В мае 2026 года вышла AI-driven версия, где искусственный интеллект встроен в саму платформу — он проектирует архитектуру, генерирует код, фронтенд и бизнес-процессы по человекочитаемой спецификации, оставляя разработчику работу с замыслом, а не с рутиной.</p><h2>AI добрался до фундамента</h2><p><b>— Александр, начну с прямого вопроса. ИИ обсуждают на каждом углу. Как вы считаете, что действительно изменилось, стало главным сдвигом, а что просто шум?</b></p><p>— Главный сдвиг — это то, что AI добрался до вещей, которые казались незыблемыми. ERP-системы — это же фундамент крупного предприятия. И мы своими глазами видим, как крупные компании переходят на вайб-кодинг ERP. Звучит страшновато, но это факт, это происходит не в стартапах, а в очень больших организациях. Банки, промышленность, энергетика — везде одно и то же.</p><p>А шум — это вера, что AI всё решит сам по себе. Что можно купить лицензии Copilot, посадить за них разработчиков и они вам начнут производить продукты в десять раз быстрее. Нет, не начнут. Точнее, начнут, но счета вас очень неприятно удивят.</p><h2>От агентов к AI-native платформе</h2><blockquote>Агентская разработка как самостоятельный подход не работает. Не масштабируется. Подход должен быть AI-native</blockquote><p><b>— Вы на сцене показывали, как обновился Digital Q с декабря. Что конкретно поменялось за эти полгода?</b></p><p>— В декабре, на зимнем партнёрском дне, мы представили платформу Digital Q.GPT — на ней можно реализовывать агентский workflow. Интеграция со всеми LLM-моделями, экосистема построения агентов, мультиагентные системы. На тот момент это было супер актуально.</p><p>К маю выяснилось, что этого недостаточно. За последние шесть месяцев все — Anthropic, Google, Gartner, Amazon, Сбер на ЦИПР — пришли к одному и тому же выводу: агентская разработка как самостоятельный подход не работает. Не масштабируется. Подход должен быть AI-native, то есть AI вшит в саму экосистему разработки, а не прикручен сбоку отдельными агентами.</p><p><b>— А что плохого в агентах?</b></p><p>— С агентами ничего плохого, они нужны. Плохо, когда вся разработка строится только вокруг них. Если кто-то хочет писать агенты — пожалуйста, в Digital Q.GPT весь функционал остался: workflow, мультиагентные системы, всё это работает. Но это уже не центральная история. Центральная история теперь — единая экосистема, в которую AI встроен на каждом этапе процесса.</p><h2>Три способа потерять деньги на AI</h2><blockquote>Сегодня становится очевидно, что фреймворк важнее модели. Весь контекст, знания и артефакты разработки должны находиться внутри собственной экосистемы компании, а не зависеть от поставщика LLM. Это позволяет управлять стоимостью разработки, сохранять независимость и обеспечивать масштабирование решений.</blockquote><p><b>— Давайте про антипаттерны. Вы на сцене перечислили целый список — что точно делать не надо. Какой из них самый болезненный?</b></p><p>— Самый болезненный — вендорлок на конкретную LLM. Если вчера вы платили 20 долларов на разработчика в месяц, завтра это 100, послезавтра 200. Скоро будет дороже, чем один разработчик в месяц. И весь ваш контекст — спецификации, история, наработки — лежит у этой модели. Вы заложник. Они вам говорят: «не парьтесь, весь контекст у нас, всё будет хорошо». Хорошо у них будет, а у вас потом будут проблемы.</p><p>Второй болезненный — зоопарк инструментов. Если у вас разработчики накодили чего-то в пяти разных средах, потом вы это нормально не соедините. Получится лоскутное одеяло, только сделанное в десять раз быстрее, чем раньше.</p><p>Третий — использовать AI только в кодировании. Это путь в галлюцинации и в бесконечные ошибки, которые вы потом просто не отследите.</p><p><b>— Как можно решить эти проблемы?</b></p><p>— Главный тезис: фреймворк важнее модели. Они это называют harness, мы называем экосистема разработки. Есть термины IDP — Integrated Development Platform, IDE — Integrated Development Environment. Суть одна. Ваш фреймворк должен быть локально у вас, весь контекст — локально у вас, модели должны быть взаимозаменяемые. Тогда вы можете переключаться между ними и управлять стоимостью.</p><p>Простой Copilot, кстати, не работает. Слишком большой технический долг возникает. Это не моя позиция, это уже общее наблюдение крупных игроков.</p><h2>Как теперь устроена разработка</h2><p><b>— Вы говорили про два контура разработки. Объясните для тех, кто услышит об этом впервые.</b></p><p>— Раньше был один контур: ТЗ — постановка — кодирование — тестирование — релиз. Долго, последовательно. Цифровая трансформация это ускорила: годы превратились в кварталы и месяцы. Но всё равно один линейный процесс.</p><p>Сейчас он распадается на два. Первый — контур замысла, или, как у Сбера говорят, контур намерений. Здесь работает человек. Описывает на естественном языке, что хочет получить. Агенты помогают разложить это на артефакты — процессы, формы, справочники, архитектуру. Человек видит результат визуально, проверяет, правит, опять же голосом или текстом.</p><p>Второй контур — контур реализации. Здесь уже всё на агентах и моделях. Это фактически чёрный ящик под замыслом. Человек его контролирует только по результату. Не нравится — возвращается в контур замысла, правит спецификацию, перезапускает.</p><p>И самое важное между ними — экосистема, которая держит все артефакты и весь контекст. Если этой экосистемы нет — у вас ничего не получится развивать. Сгенерили код, отдали в продакшен, а через полгода вы уже не понимаете, как туда внести изменение.</p><p><b>— Это та же мысль, что и про вендорлок, по сути?</b></p><p>— Та же. Если экосистема не у вас, контекст не у вас, спецификации не у вас — вы теряете возможность развивать продукт. Останется только сгенерированный код, а к коду без замысла осмысленных изменений уже не приделать. После какого-то уровня сложности — точно.</p><p><b>— Вернёмся к Digital Q. Как она теперь устроена? Если разобрать на компоненты — что там лежит?</b></p><p>— Если коротко — то, во что крупные компании годами вкладываются, чтобы отстроить правильный процесс разработки. Независимость от модели — это базовое. Полный SDLC: как правильно писать, какие артефакты должны быть. Репозиторий справочников, репозиторий процессов, репозиторий потоков. Работа с данными. Поддержка двухконтурной модели. Единые репозитории инструкций для разного типа агентов. Полностью DevOps. Полностью процесс тестирования.</p><p>На самом деле там на двухчасовой разговор материала. Но главная мысль одна: только такая штука обеспечивает вам контроль по затратам, нормальный процесс и независимость от иностранных LLM или дорогих российских моделей.</p><blockquote>Разработчик всегда идёт на самую дорогую модель — она же лучшая. И запускает её сто раз в день. Ему кажется, что это бесплатно. Извините, не бесплатно.</blockquote><p><b>— Почему вы так настойчиво возвращаетесь к теме денег? Ведь все маркетинговые материалы AI-вендоров обещают именно экономию.</b></p><p>— Потому что это самая опасная иллюзия сейчас. Uber, пытаясь сэкономить на разработчиках, потратил больше трёх миллиардов долларов на AI-генерацию кода. Японская компания за несколько месяцев потратила 500 миллионов долларов вместо тех людей, которых сократили. Долларов, не рублей. И это уже не теория, это свежие кейсы 2025–2026 годов.</p><p>Почему так получается? Потому что разработчик, если его не ограничивать, всегда идёт на самую дорогую модель — она же лучшая. И запускает её сто раз в день. Увидел маленькое расхождение в результате — поправил формулировку — перегенерил всё. Ему же кажется, что это бесплатно. Это так красиво, так удобно — нажал кнопку, всё пересоздалось. Извините, не бесплатно. Это огромные деньги. Свобода такая, что разоряет.</p><p><b>— И как вы с этим боретесь технически?</b></p><p>— Лимиты в самой экосистеме. Разработчикам автоматически предлагаются более дешёвые модели для простых задач, иногда вообще бесплатные. Жёстко зашиваем: при изменениях перегенерация только изменённых частей, не модуля целиком. Если в модуле 50 тысяч строк кода, и вы поправили одну спецификацию — не должны перегенериваться все 50 тысяч.</p><p>И главное — переиспользование. Когда мы даём задание на исполнение, первый шаг — найти весь код в репозитории, который можно встроить. Если компонент уже есть — мы его не генерим, мы его подключаем. Ни одного токена сюда не тратится. Половину нового модуля у нас собирается из готового кода. К модели обращаемся только за тем, чего ещё нет.</p><p><b>— Расскажите про демо с CRM. Вы показывали, как из 400-страничного ТЗ получается работающее приложение. Это правда один день двух человек, или там есть нюансы?</b></p><p>— Один день двух человек — это правда. Нюансы есть, конечно. Главный: это не black box, который сгенерил вам что-то непонятное. Это полностью оснащённый артефактами IT-проект. Можно пойти и сдать любому госзаказчику по ГОСТу. Полная документация — техническая, пользовательская, финансовая. Полный набор описанных бизнес-процессов. Полный набор тестов, включая тесты на уязвимости.</p><p>Что происходит по шагам? Загружаем ТЗ в основной контекст платформы. Она начинает читать, находит нестыковки, раскладывает по полочкам — где процесс, где поток, где архитектура. Задаёт уточняющие вопросы заказчику. Можно ответить, можно сказать «работаем как есть» — тогда она дальше креативит по тому, что есть.</p><p>Дальше прорисовывает архитектуру бэкенда. Здесь критически важный момент: она смотрит на репозиторий и решает, что писать с нуля, а что переиспользовать. У неё в инструкциях жёстко зашито: инфобез не писать, использовать готовый. Логирование не писать. Справочники, типовые штуки — не переписывать. Только то, что реально новое.</p><p><b>— А фронтенд?</b></p><p>— Полностью автогенерация. Мастер: меню справа, меню слева, нужна аналитика — не нужна, нажал галочки — получил весь фронт. Документированный, открытый, лежит в гите. Дальше можно дорабатывать голосом — буквально говоришь в микрофон «добавь форму жалобы на робота», и она лезет в MCP, смотрит схему дизайна, добавляет форму, обновляет версии, выпускает изменение. Современные разработчики уже на клавиатуре ничего не пишут — у них микрофон.</p><p>Потом бизнес-процессы. Та же AI-машина смотрит на ТЗ и генерит BPMN-процесс — уже машиночитаемый, его можно сразу выполнять. Но она же его и критикует: смотрит со стороны и говорит — у вас тут проблема, тут проблема, ТЗ было неполным, давайте решать. И человек уже работает с агентом, который ему подсвечивает дыры.</p><p>И финал — DevOps-сборка, докер-образы, юнит-тесты, интеграционные, регрессионные, тесты на уязвимости. Половина этих тестов сгенерилась автоматически по нашим стандартам ещё на этапе подготовки.</p><p><b>— Вы говорили, что AI-агенты теперь работают не только в коде, но во всех ролях — от аналитика до девопса. Как это устроено?</b></p><p>— У каждой роли — аналитик, архитектор, фронтенд-разработчик, бэкенд-разработчик, девопс-инженер — теперь свой набор агентов. И не только в IT-ролях. Продавцы, юристы, логисты, кадровики — у всех появляются свои агенты. На некоторых российских предприятиях речь идёт уже не о сотнях, а о тысячах агентов, которые работают параллельно и автоматизируют не только разработку, но и все процессы внутри организации.</p><p>Фишка нашей платформы в том, что мы все роли оснастили всеми агентами из коробки. Не надо ничего собирать самому. Скачали Digital Q, поставили, производите ПО.</p><h2>Что доступно прямо сейчас</h2><blockquote>С июля начинаем публиковать обновлённую версию. Можно скачать, развернуть, запускать.</blockquote><p><b>— И эта экосистема действительно доступна партнёрам?</b></p><p>— Да, мы её отдаём рынку. С июля начинаем публиковать обновлённую версию для партнёров. Можно скачать, развернуть, запускать. Правда, нужно знать, что такое Kubernetes и Kafka — это не магический инсталлер для гуманитариев. Но если знаете — берёте и работаете.</p><p>У нас уже сейчас несколько десятков компаний создали свои продукты на этой экосистеме. Кто-то с большим успехом, крупные компании тоже распробовали и начали работать.</p><p><b>— Возвращаясь к началу разговора. Вы фактически заявляете, что Диасофт — единственный, кто отдаёт такую экосистему рынку. Это правда так, или маркетинг?</b></p><p>— Это так. Давайте честно: на российском рынке такие экосистемы делают несколько компаний. Сбер, ВТБ, Тинькофф — для себя. Это им и нужно, у них колоссальные команды разработки, они это могут себе позволить. Кто-то из телекома делает для своих больших разработок. Иногда они пробуют что-то предложить рынку, но по большому счёту — это всё «для себя».</p><p>Диасофт делает экосистему и для себя, и для рынка. Сегодня в рынок такую экосистему — уже трансформированную под AI — фактически продолжаем отдавать только мы. Это наш бизнес, это наша история. Сбер и другие крупные игроки сейчас взяли паузу с публикацией для рынка, на два-три года минимум. После этого цикла, может быть, появится альтернатива. Сейчас её нет.</p><blockquote>Если такого человека нет — никакая AI-генерация вас не спасёт. Будет только дороже и хуже.</blockquote><p><b>— Какой главный совет тем, кто только сейчас задумывается о собственной AI-трансформации разработки?</b></p><p>— Не повторяйте чужих ошибок. Не садитесь на одну модель — это вендорлок, и он дорого стоит. Не пытайтесь решить всё через агентов поверх существующего бардака — масштабироваться не будет. Не верьте, что AI сам по себе сэкономит вам деньги — без управляющей экосистемы он их сожрёт быстрее, чем вы успеете уволить разработчиков.</p><p>И ещё одно. Команды теперь строятся вокруг продуктового инженера. Это новая ключевая роль. Раньше ценностью был код. Сейчас ценность — бизнес-компетенция, способность правильно поставить задачу. Если у вас есть человек, который понимает бизнес и умеет это сформулировать — код появится быстро. Если такого человека нет — никакая AI-генерация вас не спасёт. Будет только дороже и хуже.</p><h2>Бонус: чек-лист «AI-разработка без иллюзий»</h2><p>Разговор получился интересный, и мы собрали для вас короткий чек-лист, который пригодится и разработчикам, и бизнесу.</p><p><b>Чего точно не стоит делать:</b></p><p>— Сажать команду на одну LLM-модель — это вендорлок, и он будет дорожать;</p><p>— Разрешать разработчикам неограниченно гонять самую дорогую модель;</p><p>— Использовать AI только в кодировании, без интеграции в остальной процесс;</p><p>— Накупить разных инструментов и надеяться, что они потом «как-нибудь соберутся»;</p><p>— Сокращать разработчиков в расчёте на «бесплатные» токены.</p><p><b>Что стоит сделать:</b></p><p>— Держать экосистему разработки и весь контекст локально;</p><p>— Зашить в платформу переиспользование кода — половину нового модуля собирать из готового;</p><p>— Настроить лимиты: дешёвые модели для простых задач, перегенерация только изменённых частей;</p><p>— Разделить процесс на два контура — замысла (где работает человек) и исполнения (где работают агенты);</p><p>— Растить продуктовых инженеров — людей, умеющих формулировать задачу, а не только писать код.</p><p>Реклама. Рекламодатель: ООО «Диасофт», ИНН 7715560268, erid: 2W5zFJRM88q</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust, Go или Zig: как выбрать язык для высоконагруженного бэкенда в 2026 году</title>
      <link>https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend</link>
      <comments>https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend</guid>
      <description><![CDATA[<p>Сравниваем Rust, Go и Zig для высоконагруженных сервисов: производительность, сложность, экосистема и реальные кейсы миграции.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend">Rust, Go или Zig: как выбрать язык для высоконагруженного бэкенда в 2026 году</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Jul 2026 06:41:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы строите высоконагруженный бэкенд, выбор языка сегодня сводится к тройке: Rust, Go и Zig. У каждого — своя цена, своя скорость разработки и свои сценарии, в которых он выигрывает. Разбираем, как не ошибиться и когда смешивать их в одном проекте.</p><p>Речь пойдёт не о сравнении синтаксиса в вакууме, а о бэкенд-сервисах: API, шлюзах, обработке событий, парсинге данных и всём, что работает под нагрузкой. В статье — авторский взгляд на материал блога инженера Pooya Golchian, дополненный российским контекстом и поправками на реальное состояние экосистем.</p><p><b>Go</b> остаётся стандартным выбором для большинства микросервисов: быстрая компиляция, простота найма, огромная экосистема.</p><p><b>Rust</b> выигрывает там, где важны предельная задержка и контроль над памятью, но требует опытной команды и времени на обучение.</p><p><b>Zig</b> подходит для узких, критичных к производительности участков и для интеграции с существующим C-кодом, но экосистема пока незрелая.</p><p>В больших системах работает гибридный подход: Go для скорости разработки, Rust/Zig для горячих путей.</p><p>Мигрировать стоит только после профилирования: оптимизация без замеров обычно дороже, чем выгода.</p><h2>Почему именно эти три языка</h2><p>В 2026 году для нового backend-проекта по-прежнему можно взять Java, C#, Python или Node.js. Но если речь заходит о высоких нагрузках, низкой задержке и контроле над ресурсами, внимание смещается к трём игрокам.</p><ul><li><b>Rust</b> — язык с владением и заимствованием, дающий безопасность памяти без сборщика мусора.</li><li><b>Go</b> — язык с простой моделью конкурентности, статической линковкой и минималистичной философией.</li><li><b>Zig</b> — язык в духе C, но с современной системой сборки, comptime и явным управлением памятью.</li></ul><p>Все трое компилируются в нативный код, дают один бинарник на выходе и не требуют виртуальной машины. Именно это отличает их от Java, C# и Python на старте.</p><h2>Rust: максимум производительности, максимум сложности</h2><h3>Сильные стороны</h3><ul><li>Безопасность памяти на этапе компиляции — нет use-after-free, data races и большинства утечек.</li><li>Нулевая стоимость абстракций: высокоуровневый код часто компилируется так же эффективно, как ручной C.</li><li>Мощная модель конкурентности поверх tokio или async-std.</li><li>Зрелая экосистема: axum, actix-web, serde, sqlx.</li></ul><h3>Слабые стороны</h3><ul><li>Крутая кривая обучения: borrow checker требует перестройки мышления.</li><li>Долгая компиляция: полная пересборка крупного проекта занимает десятки секунд и минуты.</li><li>Меньше кадров на рынке, чем у Go или Java.</li><li>Итерации медленнее: каждая ошибка компилятора — это время на переделку.</li></ul><h3>Когда выбирать Rust</h3><p>Rust логичен, если вы строите инфраструктуру — прокси, базы данных, очереди, edge-сервисы — или если профилирование показывает, что горячий путь съедает CPU и память. Примеры из продакшена: Cloudflare использует Rust на edge, Discord переписал на Rust часть read-path сервисов.</p><h2>Go: скорость разработки в масштабе</h2><h3>Сильные стороны</h3><ul><li>Компиляция за секунды и один статический бинарник для деплоя.</li><li>Встроенные горутины и каналы — простая, но мощная конкурентность.</li><li>Отличная стандартная библиотека и быстрое тестирование через go test.</li><li>Большая база инженеров и проверенные практики в крупных компаниях.</li></ul><h3>Слабые стороны</h3><ul><li>Сборщик мусора может давать всплески задержек, хотя в последних версиях паузы сокращаются.</li><li>Меньше контроля над расположением памяти и размером структур.</li><li>Пиковая пропускная способность ниже, чем у Rust и Zig, на CPU-bound задачах.</li><li>Система типов и обработка ошибок минималистичны — кому-то этого достаточно, кому-то не хватает.</li></ul><h3>Когда выбирать Go</h3><p>Go — выбор по умолчанию для команд из 5–50 человек, которым нужно быстро запускать CRUD-сервисы, API-шлюзы и data pipeline. Uber, Google и Яндекс активно используют Go в микросервисах. Если главная метрика — time to market, а не последний процент производительности, Go обычно выигрывает.</p><h2>Zig: новый игрок с C-душой</h2><h3>Сильные стороны</h3><ul><li>Производительность уровня C с более современным синтаксисом и системой сборки.</li><li>comptime — выполнение кода на этапе компиляции для генерации оптимизированных структур.</li><li>Прямое взаимодействие с C без FFI-слоёв.</li><li>Маленькие быстрые бинарники и явное управление памятью.</li></ul><h3>Слабые стороны</h3><ul><li>Экосистема backend-фреймворков и библиотек пока существенно меньше, чем у Rust и Go.</li><li>Сообщество и количество инженеров на рынке ограничены.</li><li>Ручное управление памятью перекладывает ответственность на разработчика.</li><li>Некоторые части языка и стандартной библиотеки всё ещё эволюционируют.</li></ul><h3>Когда выбирать Zig</h3><p>Zig хорош, когда нужна C-производительность, но с более удобным инструментарием, или когда приходится интегрироваться с существующим C-кодом. Пример из продакшена: финансовая база данных TigerBeetle написана на Zig. Для универсального backend в 2026 году Zig ещё рано называть mainstream-выбором.</p><h2>Сравнение в цифрах</h2><p>Ниже — иллюстративные цифры из оригинального материала, полученные на AWS c7g.2xlarge (Graviton3). Относитесь к ним как к точке отсчёта, а не как к гарантии для вашего сервиса: в реальности большее значение имеют I/O, запросы к базе данных и сетевая задержка.</p><p><b>Бенчмарки:</b><br />HTTP throughput — Rust 892K req/s, Go 734K req/s, Zig 812K req/s.<br />JSON-сериализация — Rust 1,2M/s, Go 890K/s, Zig 1,1M/s.<br />Память на 10K соединений — Rust 45MB, Go 78MB, Zig 38MB.<br />Размер бинарника — Rust 8,2MB, Go 12,4MB, Zig 6,1MB.<br />Время компиляции с нуля — Rust 42s, Go 3,2s, Zig 18s.<br />P99 latency — Rust 2,1ms, Go 3,8ms, Zig 2,4ms.</p><h2>Реальные истории миграции</h2><h3>Discord: Go → Rust</h3><p>Discord переводил read-path сервисы с Go на Rust из-за пауз сборщика мусора, которые проявлялись в хвостовых задержках. По данным компании, throughput вырос в несколько раз, а tail latency снизилась. Ключевой вывод: мигрировать стоит только горячие пути, а не весь сервис целиком.</p><h3>Uber: Python → Go</h3><p>Uber мигрировал часть микросервисов с Python на Go, чтобы обойти ограничения GIL и упростить масштабирование. Переход занял годы, но зато проходил постепенно: Go-совместимость и простота языка позволяли быстро обучать команду.</p><h3>TigerBeetle: C++ → Zig</h3><p>TigerBeetle — финансовая база данных, ориентированная на корректность и производительность. Команда выбрала Zig, отказавшись от сложности C++ и сборщика мусора. comptime позволил генерировать специализированные структуры данных под задачу.</p><h2>Гибридная архитектура</h2><p>На практике редко выбирают один язык на весь проект. Гораздо чаще используют гибрид:</p><ul><li><b>API Gateway и CRUD</b> — Go: быстро писать, просто деплоить, легко искать людей.</li><li><b>Горячие пути</b> — Rust: низкая задержка и контроль над памятью.</li><li><b>Специализированные компоненты</b> — Zig: парсинг бинарных форматов, криптография, интеграция с C.</li></ul><p>Такая схема позволяет получить скорость разработки в большинстве сервисов и производительность там, где она действительно нужна. Главное — разделять систему по чётким границам и не превращать проект в зоопарк ради самого зоопарка.</p><h2>Что выбрать в 2026 году</h2><p>Выбор зависит от приоритетов команды и задачи:</p><ul><li><b>Нужна скорость разработки и лёгкий найм</b> — Go.</li><li><b>Нужна максимальная производительность и безопасность памяти</b> — Rust.</li><li><b>Нужна C-производительность с современной сборкой и интеграцией с legacy на C</b> — Zig.</li><li><b>Команда маленькая и сроки горят</b> — начинайте с Go, профилируйте, мигрируйте горячие пути при необходимости.</li><li><b>Строите базу данных, прокси или edge</b> — Rust становится очень сильным кандидатом.</li></ul><h2>FAQ</h2><h2>Выводы</h2><p>Rust, Go и Zig — не конкуренты в прямом смысле, а инструменты для разных условий. Go задаёт темп разработки, Rust отвечает за надёжность и производительность, Zig покрывает специализированные ниши. Лучшая стратегия для 2026 года — начать с Go, измерять, а затем точечно внедрять Rust или Zig там, где данные это оправдывают.</p><blockquote>Нет универсального лучшего языка — есть лучший язык для конкретной команды, задачи и бюджета на обучение.</blockquote><p><b>Источник:</b> <a href="https://pooya.blog/blog/rust-go-zig-high-performance-backend-2026/">Pooya Golchian — Rust vs Go vs Zig: High-Performance Backend Services in 2026</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Airflow, n8n и Make: что выбрать для API-оркестрации</title>
      <link>https://tproger.ru/articles/airflow-n8n-i-make-chto-vybrat-dlya-api-orkestracii</link>
      <comments>https://tproger.ru/articles/airflow-n8n-i-make-chto-vybrat-dlya-api-orkestracii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/airflow-n8n-i-make-chto-vybrat-dlya-api-orkestracii</guid>
      <description><![CDATA[<p>Сравниваем Apache Airflow, n8n и Make для оркестрации API: плюсы, минусы, стоимость и российская специфика. Выберите инструмент под свою задачу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/airflow-n8n-i-make-chto-vybrat-dlya-api-orkestracii">Airflow, n8n и Make: что выбрать для API-оркестрации</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jun 2026 13:25:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современное приложение редко живёт в вакууме: платёжка общается с банком, CRM — с телефонией, а аналитика собирает данные из десятка источников. Когда одного curl мало, на сцену выходит API-оркестрация — последовательность вызовов, обработка ошибок, преобразование данных и контроль за выполнением. Выбор инструмента для этой работы определяет, сколько времени вы потратите на поддержку и сколько он будет стоить при росте нагрузки.</p><ul><li><b>Apache Airflow</b> — мощный оркестратор для сложных Python-конвейеров, но требует инфраструктуры и DevOps-культуры.</li><li><b>n8n</b> — визуальный конструктор с открытым исходным кодом: удобен для средних нагрузок, можно бесплатно хостить на своём сервере.</li><li><b>Make</b> (бывший Integromat) — облачный визуальный автоматизатор для бизнес-команд, дешевле Zapier, но тарифицирует каждый шаг сценария.</li><li>Для российских команд критичны: возможность self-hosting, стоимость инфраструктуры и риски доступности зарубежного SaaS.</li><li>Нет универсального победителя — выбор зависит от размера команды, сложности логики и требований к контролю над данными.</li></ul><p><b>API-оркестрация</b> — это не просто «позвонить в API», а построить надёжный конвейер: вызвать один сервис, передать результат в другой, обработать ошибку, повторить при сбое и записать лог. Иногда это пара запросов в час, а иногда — десятки тысяч операций в день. Отсюда и разница в подходах: где-то важна гибкость кода, где-то — скорость запуска, а где-то — цена за операцию.</p><h2>Apache Airflow: тяжёлый артиллерист</h2><p>Airflow появился в Airbnb и за десять лет стал стандартом для data-пайплайнов. Его используют Netflix, Spotify и Uber — там, где нужно управлять сотнями зависимых задач с контролем SLA и аудитом. Главная идея: вы описываете workflow как Python-код в виде направленного ациклического графа (DAG), а scheduler отвечает за порядок, ретраи и мониторинг.</p><h3>Зачем выбирать Airflow</h3><ul><li>Сложная логика: ветвления, условия, ретраи, расписания через cron.</li><li>Полный контроль над кодом: любые библиотеки Python, кастомные операторы, unit-тесты.</li><li>Зрелая экосистема: SLA-мониторинг, audit trail, интеграция с Kubernetes и Spark.</li><li>Open Source: можно развернуть на своей инфраструктуре, в том числе на российских облаках.</li></ul><h3>Честный взгляд на минусы</h3><ul><li>Высокий порог входа: нужно разворачивать БД, Redis, воркеры и веб-интерфейс.</li><li>Минимальный кластер на VPS обходится примерно в €50/месяц без учёта времени администратора.</li><li>При 50+ задачах DAG превращается в большой Python-файл, который сложно поддерживать без дисциплины.</li><li>Коммуникация между задачами через XCom требует внимания: забыли очистить — получили memory leak.</li></ul><p>Пример простого DAG, который забирает пользователя, его посты и считает количество:</p><p>Airflow хорош, когда у вас уже есть data-команда, Kubernetes и понимание, зачем нужны DAG. Для стартапа из трёх человек это, скорее, оверинжиниринг.</p><h2>n8n: визуальный middle ground</h2><p>n8n занимает промежуточную нишу между кодом и no-code. Это node-based редактор: вы перетаскиваете блоки, соединяете их стрелками, а логика — в JavaScript-функциях и условиях. Главное преимущество: n8n open-source, его можно поднять на собственном сервере, и за это не придётся платить пошагово.</p><h3>Зачем выбирать n8n</h3><ul><li>Быстрый старт: визуальный конструктор позволяет собрать пайплайн за час, а не день.</li><li>Self-hosting: контейнер на VPS за $5–10/мес может обрабатывать тысячи запусков в день.</li><li>Гибридный подход: 90 % задач решается мышкой, сложную трансформацию можно написать на JS.</li><li>Прозрачная цена облака: плата за выполнение workflow, а не за каждый модуль.</li></ul><h3>Ограничения</h3><ul><li>При сотнях задач в одном workflow визуальная схема становится громоздкой.</li><li>Нативные узлы покрывают не всё: экзотический API придётся звать через HTTP Request.</li><li>Self-hosted версия требует обновлений и бэкапов — это всё ещё инфраструктура, хоть и простая.</li><li>Для России: облако n8n — европейский сервис, но self-hosted можно развернуть на Selectel, Yandex Cloud или любом другом провайдере.</li></ul><p>Пример JSON-экспорта workflow, который забирает пользователей, преобразует данные и пишет в PostgreSQL:</p><p>n8n часто выбирают команды, которым нужна скорость no-code, но не хочется терять контроль над инфраструктурой и платить за каждый шаг сценария.</p><h2>Make: бизнес-автоматизация по шагам</h2><p>Make (ранее Integromat) — это облачный визуальный автоматизатор для бизнес-команд. Его сценарии собираются из модулей: триггер → действие → фильтр → маршрутизатор. По сравнению с Zapier у Make глубже логика, а цена ниже, но он остаётся полностью SaaS-решением.</p><h3>Зачем выбирать Make</h3><ul><li>Быстрая интеграция с популярными сервисами: Google Sheets, Slack, Telegram, CRM, email-рассылки.</li><li>Визуальные маршрутизаторы (routers), итераторы и агрегаторы позволяют строить ветвления без кода.</li><li>Низкий порог входа для маркетологов, менеджеров продукта и операционистов.</li><li>План Core стоит от $9/мес за 10 000 операций — дешевле многих конкурентов.</li></ul><h3>Подводные камни</h3><ul><li>Тарификация по операциям: каждый модуль в сценарии считается отдельно. Десять шагов × тысяча запусков = 10 000 операций.</li><li>Нельзя self-host: данные обрабатываются на серверах Make, что может быть проблемой для чувствительных данных.</li><li>Для России: сервис работает как зарубежный SaaS, есть риски доступности и оплаты.</li><li>Сложные сценарии сложнее отлаживать: приходится кликать по модулям в истории выполнений.</li></ul><p>Типичный сценарий в Make выглядит так: вебхук из формы → проверка дубликата в Google Sheets → запись в CRM → отправка уведомления в Telegram. Всё это строится мышкой, но стоит добавить кастомную логику — и придётся использовать HTTP-модуль или встроенные функции.</p><h2>Сравнение в цифрах</h2><p>Сводная таблица по ключевым параметрам. Вместо абстрактных «плюсов» смотрите на конкретные ограничения:</p><ul><li><b>Airflow</b> — код Python, self-hosted, сложность высокая, стоимость от €50/мес + администрирование, лучше для data-платформ.</li><li><b>n8n</b> — визуальный + JS, self-hosted или cloud, средняя сложность, self-hosted от $5–10/мес, лучше для средних нагрузок и гибридных команд.</li><li><b>Make</b> — визуальный no-code, только cloud, низкая сложность входа, от $9/мес за 10K операций, лучше для бизнес-автоматизации.</li><li><b>Модель оплаты</b>: Airflow — инфраструктура; n8n — инфраструктура или executions в облаке; Make — операции (каждый модуль отдельно).</li><li><b>Контроль данных</b>: максимальный у Airflow и self-hosted n8n; минимальный у Make как SaaS.</li></ul><p><b>Российская специфика:</b><br />Для команд в РФ критичен self-hosted путь: Airflow и n8n можно развернуть на отечественных VPS или в Yandex Cloud/Selectel. Make, Zapier и другие зарубежные SaaS не дают гарантий доступности и оплаты. Если данные не могут покидать страну — выбор очевиден.</p><h2>Как выбрать инструмент</h2><h2>FAQ</h2><h2>Выводы</h2><p>Нет единого лучшего инструмента для API-оркестрации — есть подходящий под ваши ограничения. Airflow остаётся выбором зрелых data-команд, которым нужна масштабируемость и контроль. n8n закрывает большинство задач среднего уровня и даёт свободу self-hosting. Make — удобный SaaS для бизнес-автоматизации, но с привязкой к облаку и пошаговой тарификацией.</p><blockquote>Хороший оркестратор не тот, у кого больше иконок в интерфейсе, а тот, чьи ошибки вы сможете отладить в два часа ночи.</blockquote><p>Источник: материал основан на публикации «Airflow vs n8n vs Make for API orchestration» автора Raizan в DEV Community — <a href="https://dev.to/chasebot/airflow-vs-n8n-vs-make-for-api-orchestration-1lb8" rel="noopener">dev.to/chasebot/airflow-vs-n8n-vs-make-for-api-orchestration-1lb8</a>. Раздел про Make и сравнительный анализ дополнены редакционным контекстом.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как поднять свой S3-совместимый объектный склад на MinIO для staging</title>
      <link>https://tproger.ru/articles/kak-podnyat-svoj-s3-sovmestimyj-obektnyj-sklad-na-minio-dlya-sta</link>
      <comments>https://tproger.ru/articles/kak-podnyat-svoj-s3-sovmestimyj-obektnyj-sklad-na-minio-dlya-sta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-podnyat-svoj-s3-sovmestimyj-obektnyj-sklad-na-minio-dlya-sta</guid>
      <description><![CDATA[<p>Разворачиваем MinIO на VPS, настраиваем HTTPS через Traefik и presigned URL для загрузки файлов. Экономим на облачном S3 на этапе разработки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-podnyat-svoj-s3-sovmestimyj-obektnyj-sklad-na-minio-dlya-sta">Как поднять свой S3-совместимый объектный склад на MinIO для staging</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jun 2026 12:23:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если в приложении есть загрузка файлов — аватары, документы, отчёты, записи звонков — каждый тестовый файл на staging утекает в облачный счёт. AWS S3, Cloudflare R2 и Yandex Object Storage берут деньги за хранение и трафик, а в staging это чистый перерасход: тут нет SLA, зато полно битых загрузок, ночных сбросов базы и файлов, которые никто не удаляет.</p><p>Выход — поднять собственное S3-совместимое хранилище на том же VPS, где крутится staging. <b>MinIO</b> реализует API Amazon S3, понимает те же SDK и presigned URL, но стоит ровно столько, сколько стоит диск сервера. Один и тот же код приложения работает и с MinIO на dev, и с R2 в проде — меняются только переменные окружения.</p><h2>Что такое MinIO и почему он подходит для staging</h2><p>MinIO — это open-source сервер объектного хранилища, написанный на Go. Он поддерживает основные операции S3: бакеты, объекты, multipart upload, versioning, lifecycle, шифрование SSE-S3, CORS и IAM-политики. Для приложения он выглядит как обычный S3-эндпоинт, поэтому подходит почти любой SDK: AWS SDK, boto3, minio-js, aws-sdk-go.</p><p>На staging важно не столько масштабирование, сколько идентичность поведения продакшена. Если в проде R2 или S3, а в staging — локальная файловая система, вы тестируете не тот код. MinIO закрывает этот разрыв: тот же PutObjectCommand, те же presigned URL, те же ошибки SignatureDoesNotMatch.</p><ul><li>MinIO — полноценный S3-совместимый сервер, который можно развернуть в Docker на VPS за 10–15 минут.</li><li>Для staging это экономия на хранении тестовых файлов и единый код с продакшеном.</li><li>HTTPS и домен лучше отдавать reverse proxy — Traefik или NGINX — с Let’s Encrypt.</li><li>Presigned URL позволяют загружать и скачивать файлы напрямую из браузера, не проксируя байты через бэкенд.</li><li>Root-ключи MinIO нельзя отдавать приложению: создавайте отдельного пользователя с IAM-политикой только на нужный бакет.</li></ul><h2>Архитектура: прод против staging</h2><p>В продакшене обычно используется управляемое хранилище: AWS S3, Cloudflare R2, Yandex Object Storage, Hetzner Object Storage. Там работают репликация, резервное копирование и чужой дежурный. В staging достаточно одного MinIO-контейнера на сервере с регулярным зеркалированием в дешёвое холодное хранилище.</p><p>Приложение не знает, с кем оно говорит: код инициализации клиента одинаков. Разница только в переменных окружения: эндпоинте, регионе, ключах и флаге forcePathStyle, который нужен большинству S3-совместимых сервисов, включая MinIO и R2.</p><p><b>Важно:</b> виртуальный хостинг bucket.example.com в MinIO работает, но на staging проще включить path-style и не мучиться с DNS-записями под каждый бакет.</p><h2>Что понадобится</h2><ul><li>VPS с Linux, публичным IP и открытыми портами 80/443.</li><li>Два A-записи: minio-staging.example.com и minio-console.example.com.</li><li>Docker и Docker Compose v2.</li><li>Reverse proxy с TLS — в примере Traefik v2 + Let’s Encrypt.</li><li>Около 10 ГБ свободного места под тестовые данные.</li></ul><h2>Разворачиваем MinIO в Docker Compose</h2><p>Минимальный docker-compose.staging.yml заводит один контейнер, внешнюю сеть для Traefik и именованный том для данных.</p><p>Два параметра критичны для presigned URL. MINIO_SERVER_URL говорит серверу, на каком публичном домене подписывать ссылки. Без него ссылка будет подписана для http://minio:9000 и браузер отклонит подпись. MINIO_BROWSER_REDIRECT_URL нужен для корректных редиректов веб-консоли.</p><h2>Прокидываем HTTPS через Traefik</h2><p>Добавляем лейблы к сервису minio, чтобы Traefik маршрутизировал API и консоль на разные порты и автоматически выпускал сертификаты.</p><p>Проверяем здоровье сервера с локальной машины: curl -I https://minio-staging.example.com/minio/health/live должен вернуть HTTP 200.</p><p><b>Cloudflare:</b> для поддомена с API лучше выключить оранжевое облако. Бесплатный тариф Cloudflare обрезает тело запроса на 100 МБ и может убирать S3-заголовки, из-за чего ломается подпись.</p><h2>Бакеты, политики и отдельный пользователь для приложения</h2><p>После запуска создаём бакет и отдельного IAM-пользователя. Делать это root-ключами приложения — плохая идея: root может удалить всё.</p><p>Теперь создаём пользователя staging-app и IAM-политику, ограничивающую права только этим бакетом.</p><p>Логин staging-app и его секрет — это и есть S3_ACCESS_KEY и S3_SECRET_KEY для приложения.</p><h2>Код приложения не меняется</h2><p>Пример на AWS SDK v3 для Node.js. Обратите внимание на forcePathStyle: true: без него SDK попытается обратиться к bucket.minio-staging.example.com, и запрос уйдёт в никуда.</p><p>Переменные для staging:</p><p>Для продакшена — только другой набор значений, код идентичен.</p><h2>Presigned URL: загрузка и скачивание без проксирования</h2><p>Presigned URL — это обычный HTTPS URL с короткой подписью в query string. Кто угодно может выполнить ровно то действие, на которое выдана подпись: PUT для загрузки или GET для скачивания. Бэкенд проверяет права, подписывает URL и отдаёт клиенту — сам файл идёт напрямую в MinIO.</p><h3>Загрузка из браузера</h3><p>Важный подводный камень: Content-Type, который браузер отправляет при PUT, должен точно совпадать с тем, что было передано в PutObjectCommand. Иначе MinIO вернёт SignatureDoesNotMatch.</p><h3>Скачивание приватных файлов</h3><p><b>Почему это лучше проксирования:</b> при прямой загрузке через ваше API все байты проходят через приложение, съедая CPU, RAM и пропускную способность. С presigned URL трафик идёт между клиентом и MinIO — бэкенд только подписывает ссылку.</p><h2>CORS, lifecycle и безопасность</h2><p>Несколько команд, которые стоит выполнить сразу после создания бакета.</p><h3>CORS для браузерных загрузок</h3><h3>Автоудаление старых тестовых файлов</h3><h3>Шифрование данных в покое</h3><p>И ещё раз: root-ключи храните в менеджере секретов и используйте только для mc admin. Консоль MinIO, если она доступна из интернета, закрывайте IP-allowlist или базовой авторизацией на уровне Traefik.</p><h2>Бэкапы и мониторинг</h2><p>Staging не должен хранить что-то ценное, но периодическое зеркалирование в дешёвое холодное хранилище спасает от случайного удаления. Команда mc mirror синхронизирует бакет в Backblaze B2, Yandex Object Storage или другой S3-совместимый бэкенд.</p><p>Для метрик MinIO отдаёт Prometheus-экспортёр по пути /minio/v2/metrics/cluster. В Grafana можно импортировать дашборд ID 13502 и сразу видеть занятое место, RPS, задержки и ошибки.</p><h2>Типичные проблемы</h2><ul><li><b>SignatureDoesNotMatch при PUT</b> — браузер отправил Content-Type, отличный от подписанного. Проверьте заголовок PUT.</li><li><b>Подписанная ссылка работает локально, но не в браузере</b> — не задан MINIO_SERVER_URL. Ссылка подписана для внутреннего http://minio:9000.</li><li><b>403 после Cloudflare</b> — бесплатный тариф Cloudflare модифицирует заголовки. Переведите A-запись в режим DNS-only.</li><li><b>CORS preflight failed</b> — на бакете не настроены CORS-правила.</li><li><b>Консоль редиректит на http://minio:9001</b> — не задан MINIO_BROWSER_REDIRECT_URL.</li></ul><h2>Выводы</h2><p>Self-hosted MinIO на staging — это не попытка заменить облако, а способ сделать тестовую среду дешевле и ближе к продакшену. Тот же API, те же SDK, те же presigned URL, но без счетов за хранение битых файлов и ночных сбросов базы.</p><p>Ключевые моменты, которые стоит запомнить: всегда указывайте MINIO_SERVER_URL для корректных подписей, не используйте root-ключи в приложении, включайте path-style на staging и настраивайте lifecycle, чтобы мусор не копился.</p><blockquote>Самое дорогое в staging — не железо, а различия в кодовых путях между dev и prod. MinIO помогает убрать одну из этих разниц почти бесплатно.</blockquote><p>Источник: <a href="https://www.freecodecamp.org/news/how-to-self-host-an-s3-compatible-object-store-with-minio-on-your-staging-server/">freeCodeCamp — How to Self-Host an S3-Compatible Object Store with MinIO on Your Staging Server</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как Android-инженер спроектировал gateway для миллионов пользователей: опыт перехода в инфраструктуру</title>
      <link>https://tproger.ru/articles/kak-android-inzhener-sproektiroval-gateway-dlya-millionov-polzova</link>
      <comments>https://tproger.ru/articles/kak-android-inzhener-sproektiroval-gateway-dlya-millionov-polzova?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Кирилл Соколов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-android-inzhener-sproektiroval-gateway-dlya-millionov-polzova</guid>
      <description><![CDATA[<p>История перехода из андроид разработки в инфраструктуру. Как мобильный инженер спроектировал gateway для платформы с миллионами пользователей, освоил распределённые системы и научился строить отказоустойчивые сервисы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-android-inzhener-sproektiroval-gateway-dlya-millionov-polzova">Как Android-инженер спроектировал gateway для миллионов пользователей: опыт перехода в инфраструктуру</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[App Store]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Jun 2026 07:41:54 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Перешёл из Android-разработки в инфраструктуру и спроектировал gateway для платформы с миллионами пользователей. Делюсь опытом: какие пробелы пришлось закрывать, почему мобильный бэкграунд — это преимущество, и с чего начать, если думаете о похожем переходе. </i></p><h2>Почему инфраструктура начинает привлекать больше, чем фичи</h2><p>С фичами всё прозрачно: написал код — увидел результат на экране. Быстрая и понятная обратная связь. Но со временем замечаешь, что проблемы повторяются. Приложение тормозит не из-за плохого кода, а потому что на один экран уходит пять-шесть сетевых вызовов. Логика на клиенте. Хочешь что-то изменить — готовь релиз, проходи App Store Review и жди недели, пока обновление дойдёт до всех.</p><p>Я перешёл в Android-инфраструктуру — начал делать инструменты для других мобильных разработчиков. Это помогло увидеть: главные проблемы не в фичах, а в слое между приложением и бэкендом.</p><p>Возвращаться к фичам стало неинтересно. В инфраструктуре задачи сложнее, результат измеряется метриками — latency, error rate, скорость релизов, — а влияние на всю систему, а не на один экран.</p><h2>Что Android даёт для инфраструктуры — а чему учиться с нуля</h2><p>Мобильный бэкграунд оказался не балластом, а преимуществом. Я понимал ограничения изнутри. Backend-инженер может прочитать, что мобильные сети ненадёжны, память ограничена, а батарея — критичный ресурс. Но прочитать и прочувствовать — разное. Я годами наблюдал, как приложение “захлёбывается” на устройствах среднего сегмента. Знал, что 60% пользователей сидят именно на таких. Видел, как баг, который мы починили за день, продолжает висеть у людей неделями — просто потому, что они не успели обновиться.</p><p>Когда я проектировал gateway, я точно знал, что почувствуют мобильные разработчики, если ошибусь. Добавить ещё один сетевой вызов — это будет не бесплатно. Оставить логику в приложении — значит отдать её на устройство, которое я не контролирую.</p><p><b>Чего именно не хватало?</b> Я неплохо понимал мобильную сторону, но совершенно не ориентировался в распределенных системах. Знал, например, что такое таймаут, но не представлял, как выставить его в цепочке из пяти сервисов так, чтобы одно медленное звено не обрушило весь экран пользователя. Понимал, что сети падают, но не умел проектировать систему, способную оставаться на плаву в таких условиях.</p><p><b>Чему пришлось учиться с нуля? </b>Операционному мышлению. В Android ты выпускаешь релиз — и он либо работает, либо нет. Если крашится, починишь в следующей версии. В инфраструктуре нет «следующей версии». Если gateway падает, всё приложение ложится для миллионов пользователей прямо сейчас.</p><p>Пришлось учиться думать в терминах деградации, частичных отказов, плавного падения.</p><p>Что делать, если один из пяти сервисов не ответил? Как понять, что мы катимся к инциденту, до того, как пользователи начнут жаловаться?</p><p>Этому в мобильной разработке не учат.</p><h2>Как я учился: пробелы, сроки и смена мышления</h2><p>Формального плана у меня не было — учился на практике. Это лучший, хотя и самый стрессовый способ. Пробелы выявляла практика. Столкнулся с нерешаемой задачей — понял, чего не знаю. Пошёл разбираться.</p><p>Учился итеративно, не пытаясь объять необъятное сразу. Gateway начинался как простой прокси. Затем добавили агрегацию ответов, потом — конфигурационные определения экранов. Каждый такой шаг вынуждал осваивать следующий уровень: circuit breakers, стратегии повторов, observability, планирование мощностей.</p><p>По срокам: техническая база уложилась в несколько месяцев. Паттерны осваиваются быстрее, чем кажется, особенно если сразу применять их к живой задаче. Гораздо дольше происходила смена образа мышления. Перейти от вопроса «работает ли фича?» к вопросу «что случится, когда это упадёт в три часа ночи?» — вот что заняло основное время.</p><h2>Что означает «выдающийся уровень» в инфраструктуре</h2><p><i>Когда говорят «спроектировать gateway с нуля и перевести на него живую платформу», за этими словами стоит не один навык, а целых три, и каждый требует совершенно разной подготовки.</i></p><p>Проектирование с нуля — это не рисование квадратиков на доске и не выбор модного стека. Это в первую очередь определение границ: что система будет делать, а что — категорически нет, и как с ней станут взаимодействовать десятки команд. Настоящая сложность здесь в том, чтобы предвидеть, что именно сломается, и заложить защиту от этого ещё до того, как написан хоть один файл с кодом.</p><p>Затем — миграция живой системы, где права на ошибку практически нет. Приложение нельзя выключить или отрепетировать в реальном масштабе. Остаётся только постепенный перевод трафика: shadow mode → 1% → 5% → 25% → 50% → 100%, с автоматическим откатом при любом росте ошибок. И всё это — пока миллионы пользователей активно работают с продуктом, не подозревая, что под капотом идёт замена двигателя на ходу. Такой уровень дисциплины и инструментации приходит только с практикой.</p><p>Наконец, владение надёжностью. Gateway — единая точка отказа: упал он, упало всё. Годы уходят на то, чтобы сделать его скучным и предсказуемым: резервирование, автомасштабирование, circuit breakers, режимы деградации, еженедельный пересмотр мощностей. Высший пилотаж — когда о системе просто не думаешь, потому что она работает.</p><h2>Почему путь в инфраструктуру доступнее, чем кажется?</h2><p>Карьерные траектории в инфраструктуре редко бывают чётко описаны. Здесь нет готового чек-листа в духе «диплом по Computer Science, пять лет в бэкенде, обязательное знание Kafka и Kubernetes». С одной стороны, такая неопределённость пугает. С другой — именно она и делает этот путь более доступным, чем принято думать.</p><p>Когда перед тобой лежит жёсткий список формальных требований, люди часто отсеивают себя сами, даже не попробовав. А в инфраструктуре по-настоящему важно только одно: можешь ли ты решать задачи. Я пришёл сюда без профильного диплома и учился ровно тому, что требовалось в моменте, потому что задачи сами подталкивали к этому.</p><p>Индустрия, к слову, до сих пор не слишком хорошо умеет проверять те навыки, которые на этом уровне оказываются решающими: умение видеть ограничения на стыке систем, предвидеть сценарии отказов, двигать людей к соглашению. Всему этому учатся не до начала работы, а непосредственно в процессе.</p><p>Поэтому если вы мобильный инженер и размышляете, можно ли перейти в инфраструктуру, — вопрос не в том, правильный ли у вас бэкграунд. Вопрос в другом: готовы ли вы учиться тому, чего пока не знаете, и способны ли обратить то, что уже понимаете, в собственное преимущество. Если ответ «да» — путь для вас открыт. Просто указателей на нём пока не расставили.</p><h2>Мобильный бэкграунд как преимущество архитектора</h2><p>Считаю ли я, что мобильный опыт сделал меня лучшим архитектором для mobile-first продуктов? Безоговорочно, да.</p><p>Я помнил, как ощущается медленный экран на устройстве среднего сегмента. Помнил, что случается, когда API возвращает слегка неправильные данные и приложение падает при парсинге. Помнил то чувство, когда баг уже в проде, а ты ждёшь App Store Review и ничего не можешь исправить.</p><p>Поэтому когда я проектировал gateway, я не занимался абстрактной «оптимизацией перформанса». Я опирался на совершенно конкретный опыт. Знал, что убрать один сетевой round trip — это подарок каждому мобильному разработчику. Знал, что перенос логики на сервер означает перенос в место, где я могу починить всё за минуты, а не за недели.</p><p>Лучшая инфраструктура для мобильных продуктов строится теми, кто сам их создавал и знает все узкие места не понаслышке. Этот опыт даёт верное направление: ты чувствуешь, где настоящие проблемы, потому что сталкивался с ними лично. Такому не учат по книгам.</p><h2>Коротко: что делать, если думаете о переходе</h2><ul><li>Найдите промежуточный шаг. Не прыгайте сразу в бэкенд. Начните с задач на стыке: оптимизация API, инструменты для мобильных разработчиков, улучшение сетевого слоя.</li><li>Используйте мобильный контекст как рычаг. Вы понимаете то, о чём бэкенд-инженеры только догадываются. Говорите об этом вслух.</li><li>Учитесь измерять невидимое. В инфраструктуре результат — это метрики: latency, error rate, скорость релизов. Учитесь рассказывать историю через цифры.</li><li>Проектируйте под отказ, а не тушите пожары. Senior-уровень — это определить, что сломается и кто за это отвечает, до того, как оно сломается.</li><li>Не ждите разрешения. Путь не размечен, но он открыт. Начните с малого — и двигайтесь туда, где задачи становятся интереснее.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как приручить legacy-код: безопасная модернизация без заморозки фич</title>
      <link>https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki</link>
      <comments>https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[KODE]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki</guid>
      <description><![CDATA[<p>Как модернизировать legacy-код без остановки продукта: Strangler Fig Pattern, feature flags, shadow testing и безопасная миграция данных. Практика и антипаттерны.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki">Как приручить legacy-код: безопасная модернизация без заморозки фич</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Twitter]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Legacy]]></category>
      <category><![CDATA[Техника]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Jun 2026 06:16:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Legacy-код — одна из самых болезненных тем в инженерных командах. Обычно все понимают, что система устарела: архитектура мешает быстро выпускать изменения, новые фичи приходится встраивать через обходные пути, тесты либо неполные, либо отсутствуют, а любое изменение в одном модуле неожиданно ломает другой.</p><p>Но при этом к такому коду часто боятся прикасаться. И не без причины. В старых системах редко бывает понятная карта зависимостей. Документация устарела, часть знаний живет только в головах нескольких разработчиков, а бизнес при этом продолжает ждать новых релизов, интеграций и продуктовых экспериментов.</p><p>Так появляется классическая ловушка legacy: систему надо модернизировать, но остановить развитие нельзя. Переписать всё с нуля страшно, поддерживать как есть — всё дороже. В результате продукт обрастает временными решениями, скорость разработки падает, а стоимость каждого следующего изменения растет.</p><p>Хорошая новость в том, что модернизация legacy-кода не обязана быть большим взрывом. Старую систему можно менять постепенно, сохраняя рабочий продукт, не замораживая фичи и не устраивая один критический релиз, от которого зависит всё.</p><h2>Почему Big Bang-переписывание чаще всего заканчивается плохо</h2><p>Когда команда долго живет с устаревшей системой, идея переписать всё с нуля выглядит очень соблазнительно. Кажется, что можно наконец избавиться от технического долга, выбрать нормальную архитектуру, перепроектировать модули, покрыть всё тестами и начать «правильно».</p><p>На старте такой план часто звучит логично. Особенно если текущая система действительно мешает развитию. Например, мобильное приложение растет, у него уже миллионы пользователей, бэкенд написан несколько лет назад как монолит, а каждая новая фича требует изменений в десятке мест. Команда устала чинить регрессии, бизнес устал ждать, и всем хочется «один раз нормально переписать».</p><p>Проблема не в самой идее переписывания, а в условиях, при которых оно проваливается. Большой риск возникает, когда совпадают четыре фактора: переписывание занимает много месяцев, в это время бизнес продолжает развивать старую систему, новая версия покрывает сразу большую часть функциональности, а откат связан с миграцией данных. Если все четыре пункта присутствуют, Big Bang почти гарантированно превратится в долгий и дорогой проект.</p><p>Допустим, команда решила переписать модуль заказов в e-commerce-продукте. В старой версии есть корзина, промокоды, доставка и оплата. Команда планирует за полгода сделать новый сервис заказов. Но за эти полгода бизнес добавляет подписки, подарочные сертификаты, частичную оплату бонусами и новую логику возвратов. В итоге новая система, которую проектировали под старые требования, к моменту релиза уже нуждается в доработке.</p><p>Есть и другая проблема: большой релиз почти всегда несет максимальный риск. Если вы заменяете крупный кусок системы целиком, ошибка влияет сразу на большую часть пользователей. Откат тоже становится сложным, потому что новая логика уже связана с новыми данными, контрактами и интеграциями.</p><p>Big Bang всё-таки бывает оправдан — но в узких условиях. Если кодовая база молодая (год-два), пользователей мало, у системы нет критичного состояния в БД и продукт можно временно заморозить или вести в обоих контурах параллельно, полное переписывание может оказаться дешевле постепенной миграции. Это редкая ситуация, и она быстро исчезает по мере роста продукта. В зрелых системах безопаснее работает другой подход — постепенная архитектурная эволюция.</p><h2>Пример: как команда переписала сервис документов и потеряла полгода</h2><p>Команда сопровождала сервис — старый модуль на aiohttp с Pydantic v1, через который проходила вся обработка путевых листов и актов осмотра транспорта. Сервис существовал шесть лет, был покрыт тестами фрагментарно, а его API использовали мобильное приложение водителей, диспетчерская веб-панель и пакетный импорт.</p><p>Команда решила переписать сервис целиком: перейти на FastAPI, обновить Pydantic до v2, заодно почистить контракты и заменить внутреннее хранилище документов с MongoDB на PostgreSQL. План был рассчитан на четыре месяца.</p><p>Через восемь месяцев проект всё ещё не был готов к выкатке, а к десятому месяцу команда откатила миграцию полностью. Причин было несколько.</p><p>Во-первых, переписывание шло параллельно с продуктовой разработкой. За время миграции бизнес добавил два новых типа документов и изменил правила подписи актов. Новая система проектировалась под старые требования и к моменту готовности уже не соответствовала продукту.</p><p>Во-вторых, команда не написала характеристических тестов. Поведение «как есть» нигде не было зафиксировано, и расхождения находились только в продакшене после переключения.</p><p>В-третьих, у старого сервиса были скрытые побочные эффекты, о которых никто не помнил. При смене статуса документа публиковал событие в Kafka, которое читал биллинг и сервис аналитики. В новой реализации это поведение не было воспроизведено, потому что в коде оно выглядело как «лишний» вызов. После переключения биллинг перестал получать события, и расхождение обнаружили только через две недели — по жалобе финансового отдела.</p><p>В-четвёртых, переключение было сделано «в лоб»: маршрут в API Gateway просто перенаправили на новый сервис. Фича-флага не было, теневого запуска не было, плана отката не было. Когда выяснилось, что новый сервис строже валидирует исторические форматы документов и отклоняет часть старых записей, быстро вернуться на старую реализацию не получилось — её к тому моменту уже отключили на стенде, а в БД успели уйти записи в новом формате.</p><p>В итоге миграцию свернули, потратив около десяти человеко-месяцев и потеряв доверие бизнеса. Сервис до сих пор работает в исходной реализации, а команда переходит к плану, описанному ниже.</p><h2>Strangler Fig Pattern: как заменить систему по частям</h2><p>Один из самых практичных подходов к модернизации legacy-кода — Strangler Fig Pattern. В софтверном виде паттерн был сформулирован Мартином Фаулером в 2004 году под названием StranglerFigApplication. Идея проста: не переписывать систему целиком, а постепенно выносить отдельные части в новую реализацию.</p><p>Название пришло из биологии. Фикус-душитель растет вокруг дерева-хозяина и постепенно вытесняет его. В архитектуре принцип похожий: старая система продолжает работать, новая функциональность появляется рядом, а затем отдельные потоки постепенно переводятся на новую реализацию.</p><p>Представим старый монолит интернет-магазина. Внутри него есть каталог, корзина, заказы, платежи, скидки, личный кабинет и уведомления. Переписать всё сразу — рискованно. Но можно начать с относительно изолированного участка, например с уведомлений.</p><p>Сначала команда описывает текущий контракт: какие события приходят в модуль уведомлений, какие каналы используются, какие шаблоны отправляются, какие ошибки считаются допустимыми. Затем рядом создается новый сервис уведомлений, который реализует тот же контракт. На первом этапе он может даже не отправлять реальные сообщения, а только принимать события и логировать результат. После проверки часть трафика переводится на новую реализацию. Когда сервис стабилизируется, старый код уведомлений удаляется из монолита.</p><p>Strangler Fig хорошо работает там, где между старым и новым кодом есть сетевая граница: HTTP, message bus, RPC. Если такой границы нет — например, нужно постепенно заменить функцию или класс внутри одного процесса — используется родственный паттерн Branch by Abstraction: над старой реализацией создается абстракция, рядом пишется новая реализация, переключение происходит через конфигурацию или фича-флаг, после стабилизации старая ветка удаляется. Снаружи это выглядит как Strangler Fig, но без сетевого прокси.</p><p>Такой подход снижает риск. В системе нет одного большого релиза, где всё меняется сразу. Есть серия небольших контролируемых изменений. Каждое можно протестировать, измерить и откатить.</p><h2>Главное правило: сначала повторить поведение, потом улучшать</h2><p>Одна из частых ошибок при модернизации legacy-кода — попытка одновременно переписать систему и улучшить бизнес-логику. Команда смотрит на старый модуль и думает: «Раз уж мы его трогаем, давайте сразу сделаем нормальную архитектуру, изменим контракты, уберем странные кейсы и перепишем поведение».</p><p>Это опасный путь. В legacy-системах странное поведение часто существует не случайно. За ним может стоять неочевидное бизнес-правило, старый клиент, интеграция с внешней системой или исторический баг, на который уже кто-то завязался.</p><p>Например, в системе расчета налогов может быть правило: для контрактов, заключенных до 2018 года, НДС округляется в меньшую сторону до целого рубля, а для всех остальных — по математическим правилам. Новый разработчик может решить, что это ошибка, и «исправить» округление. Но потом выяснится, что часть крупных клиентов держит это поведение в своих сверках, а смена правила приведет к расхождениям в актах и претензиям.</p><p>Прежде чем менять поведение, его нужно зафиксировать. Для этого пишут характеристические тесты (characterization tests, иногда называемые golden master или approval tests). Идея простая: на реальных данных или их обезличенных копиях прогоняется старая реализация, её ответы сохраняются как эталон, и любые будущие изменения, отклоняющиеся от эталона, отлавливаются автоматически. Тесты пишутся не для красоты, а для того, чтобы зафиксировать существующее поведение — даже странное — перед тем, как его трогать. Подробно эта техника описана у Майкла Физерса в книге Working Effectively with Legacy Code; на практике её удобно реализовать через библиотеки семейства approval-tests (approvaltests-python, approvaltests-java и аналоги).</p><p>Поэтому первый этап модернизации — не улучшение, а воспроизведение текущего поведения. Новая реализация должна вести себя так же, как старая. Даже если старое поведение кажется странным. Только после стабилизации можно отдельно обсуждать, что именно стоит менять.</p><h2>Feature toggles: как включать новую логику без риска</h2><p>Feature toggles, или фича-флаги, — один из главных инструментов безопасной миграции. Они позволяют включать и выключать новую логику без деплоя.</p><p>В обычной разработке релиз часто выглядит бинарно: код либо выкатили, либо нет. При миграции legacy это неудобно. Гораздо безопаснее иметь возможность включить новую реализацию для 1% пользователей, затем для 10%, потом для половины аудитории и только после этого для всех.</p><p>Например, команда переносит расчет стоимости доставки из монолита в новый сервис. С помощью фича-флага это выглядит так:</p><p>user_id передается явно, чтобы решение «попал ли пользователь в новый сегмент» было стабильным от запроса к запросу. Иначе один и тот же клиент будет получать разные ответы при обновлении страницы, и поведение системы станет непредсказуемым.</p><p>На первом этапе флаг включают только для внутренней команды. Потом для тестового сегмента пользователей. Затем для небольшой доли реального трафика. Если метрики стабильны, долю увеличивают. Если появляются ошибки, флаг выключают, и пользователи снова идут в старую реализацию.</p><p>Важно различать два разных типа флагов. Флаг постепенной выкатки (rollout flag) меняется редко и контролирует, какой процент пользователей видит новую логику. Kill switch — отдельный флаг, единственная задача которого — мгновенно выключить новую реализацию при инциденте. Kill switch должен опрашиваться на каждом запросе, его кэширование должно жить секунды, а не минуты, и он принципиально не должен зависеть от той системы, которую он выключает. Иначе в момент аварии может оказаться, что выключатель сам недоступен.</p><p>В качестве инфраструктуры для флагов команды обычно берут одну из платформ: LaunchDarkly, Unleash, Flagsmith, GrowthBook, либо собирают собственную поверх Redis или конфигурационного сервиса. Для миграции важны три свойства: быстрое распространение изменений (секунды, а не минуты), поддержка таргетинга по пользователю/сегменту и аудит — кто и когда менял флаг.</p><p>Важно, что фича-флаг — это не просто if в коде. Для серьезной миграции нужны правила: кто может включать флаг, как быстро его можно отключить, какие метрики отслеживаются, когда флаг должен быть удален.</p><p>Последний пункт особенно важен. Если флаги не удалять, система быстро превращается в набор ветвлений, где никто уже не понимает, какая логика актуальна.</p><h2>Shadow testing: как проверить новую систему на реальном трафике</h2><p>Feature toggles помогают безопасно переключать пользователей. Но перед этим хорошо бы понять, совпадает ли новая логика со старой. Для этого используют shadow testing.</p><p>Shadow testing — это запуск новой реализации параллельно старой, но без влияния на пользователя. Пользовательский запрос по-прежнему обрабатывает старая система, а новая получает копию запроса и считает результат «в тени». Пользователю этот результат не показывается. Команда только сравнивает ответы.</p><p>Например, есть старый модуль расчета скидок. Он учитывает промокоды, сегмент пользователя, историю покупок, регион и партнерские условия. Команда пишет новый сервис скидок. Чтобы не переключать пользователей сразу, можно запустить теневой режим:</p><p>Два момента, на которые стоит обратить внимание в этом коде. Теневой вызов запускается через asyncio.create_task — корутина сразу планируется в event loop и начнёт выполняться, как только функция вернёт управление. И весь блок завернут в try/except: исключение в новой логике не должно ронять основной запрос. Без этих двух свойств shadow testing рискует ухудшить продакшен вместо того, чтобы безопасно его проверить.</p><p>Небольшая оговорка для продакшена: event loop держит на task только слабую ссылку, и без сохранённой ссылки задача может быть собрана сборщиком мусора прямо во время выполнения. В реальном коде Task имеет смысл класть в set фоновых задач и удалять оттуда через add_done_callback. В примере выше эта обвязка опущена для читаемости.</p><p>Для критичной доменной логики — платежей, биллинга, расчета тарифов — допустимый уровень расхождения должен быть около нуля: цель в shadow-режиме не «как можно меньше различий», а «понимаем каждое расхождение». Для менее чувствительных доменов (рекомендации, ранжирование результатов поиска) можно жить с расхождением в долях процента, но и там расхождения нужно классифицировать, а не игнорировать. Возможно, это баги новой реализации. А возможно, старая система содержит устаревшую логику, которую нужно отдельно обсудить с бизнесом.</p><p>Shadow testing особенно полезен для критичных доменных частей: платежей, биллинга, расчета тарифов, персональных предложений, транзакций. Там нельзя просто «попробовать на пользователях» и посмотреть, что будет.</p><p>При этом важно отличать теневую проверку чтения от теневой проверки записи. Чтение проверить относительно дёшево: запрос идёт в обе системы, ответы сравниваются, никаких внешних эффектов нет. С записью всё сложнее. Если новая реализация в shadow-режиме действительно создаст заказ, спишет деньги или отправит письмо, у пользователя возникнут двойные эффекты. Поэтому для writes либо вводят идемпотентные ключи и shadow-режим без реальных побочных действий (внешние вызовы заменены no-op-стабами, БД — отдельной shadow-копией), либо вообще отказываются от теневой проверки записи в пользу постепенной выкатки за фича-флагом.</p><p>Сравнение ответов в реальной системе тоже не сводится к одной функции compare. Нужно отдельно решать, как игнорировать «нормальный» шум (метки времени, идентификаторы, порядок коллекций), как сэмплировать трафик, чтобы не утопить хранилище расхождений, и как организовать триаж — кто и в каком ритме разбирает накопившиеся диффы. Готовые решения этого класса — GitHub Scientist (Ruby и его порты в другие языки), Twitter Diffy, либо собственный лёгкий регистратор поверх Kafka и таблицы расхождений.</p><h2>С чего начинать модернизацию</h2><p>Начинать лучше не с самого больного и не с самого центрального модуля. Это звучит контринтуитивно, потому что обычно хочется сразу взяться за главный источник проблем. Но если начать с ядра системы, команда быстро упрется в максимальное количество зависимостей и рисков.</p><p>Удобный способ выбрать первый кусок — оценить кандидатов по двум осям: насколько модуль критичен для бизнеса (low / high) и насколько сильно он связан с остальной системой (low / high). Начинать стоит с квадранта low-criticality + low-coupling: ошибки в нем не уронят бизнес-показатели, а малое количество зависимостей позволит провести миграцию полностью, не утянув за собой смежные модули. Высоко-критичные и сильно связанные части (платежи, ядро авторизации) трогают в последнюю очередь — на этот момент команда уже наберёт опыт безопасной миграции.</p><p>Хорошие точки входа обычно: уведомления, генерация отчетов, поиск, история операций, профиль пользователя, отдельная часть каталога. Важно, чтобы у команды была возможность описать контракт: какие данные входят, какие выходят, какие ошибки возможны, какие внешние системы участвуют.</p><p>Допустим, в банковском приложении есть старый модуль истории операций. Он медленный, сложно расширяется, но при этом не выполняет сами транзакции. Это хороший кандидат для первой миграции. Ошибка в истории операций неприятна, но обычно менее критична, чем ошибка в списании денег.</p><p>Команда может вынести чтение истории в отдельный сервис, сначала запустить его в shadow-режиме, потом включить для части пользователей, затем полностью перевести чтение на новую реализацию. При этом критичная транзакционная логика останется в старой системе до тех пор, пока команда не наберет опыт безопасной миграции.</p><h2>Миграция данных: самая сложная часть</h2><p>Большая часть статьи говорит о маршрутизации запросов и переключении трафика. Но в реальных проектах основная сложность лежит ниже — в данных. Старая и новая реализации почти всегда работают с общим состоянием: одной БД, одним хранилищем документов, одним набором очередей. Переехать туда «одним коммитом» нельзя.</p><p>Базовый рабочий приём — Expand-Contract (он же Parallel Change). Изменение схемы делается в три такта. На этапе expand в БД добавляются новые поля, таблицы или индексы, при этом старое поведение полностью сохраняется. Затем — migrate: обе реализации начинают писать и в старое, и в новое место (dual writes), а отдельный фоновый процесс делает backfill — заполняет новые поля историческими данными. После этого читатели по одному переключаются на новую схему. Только когда никто из читателей не использует старую структуру, наступает contract — удаление лишних колонок и таблиц.</p><p>Несколько практических деталей, которые часто упускают:</p><p>·         Dual writes — это не бесплатная операция. Две записи означают две точки отказа. Если одна из них упала, нужно решать, что делать: продолжать ли работу, ставить ли событие в очередь на повтор, помечать ли запись как несогласованную. Простое «сначала пишем туда, потом сюда» в продакшене на нагрузке приводит к расхождениям.</p><p>·         Backfill часто длиннее, чем кажется. На большой таблице миграция в одном UPDATE блокирует продакшен. Поэтому backfill делают батчами по N тысяч строк с паузами, отслеживают прогресс и предусматривают возможность остановить и продолжить.</p><p>·         Онлайн-изменения схемы на крупных таблицах делаются не штатным ALTER TABLE, а специализированными инструментами: gh-ost или pt-online-schema-change для MySQL, встроенные онлайн-механизмы PostgreSQL для индексов и колонок, Liquibase/Flyway — для управления версионированием изменений в репозитории.</p><p>·         Shadow testing данные не покрывает. Можно сравнить, что новая реализация возвращает то же, что и старая, но если за этим стоит другая схема в БД, проверка корректности самой миграции данных — это отдельная работа: сверки, контрольные суммы, выборочный аудит исторических записей.</p><p>Без этих шагов любая красивая фасадная архитектура наталкивается на разъезжающиеся данные — и тогда даже идеальный Strangler Fig снаружи не спасает.</p><h2>Прокси-слой как точка контроля</h2><p>Чтобы постепенно заменять legacy-код, нужно управлять маршрутизацией запросов. Для этого часто создают прокси-слой, API Gateway или фасад, через который проходит обращение к старой и новой логике. В терминах Domain-Driven Design такой слой часто называют Anti-Corruption Layer: он защищает новую реализацию от старых контрактов и наоборот, позволяя двум моделям сосуществовать без взаимного «загрязнения».</p><p>Без такой точки контроля миграция становится хаотичной. Часть клиентов ходит напрямую в старый модуль, часть — в новый, часть использует обходные пути, а команда теряет возможность централизованно переключать трафик.</p><p>Прокси-слой решает несколько задач. Он скрывает детали реализации от клиентов, позволяет направлять часть запросов в новую систему, поддерживает фича-флаги, собирает метрики и упрощает откат.</p><p>В качестве технической основы команды обычно берут один из трех вариантов: классический API gateway (Kong, AWS API Gateway), service mesh (Envoy, Istio) или более простой reverse proxy (NGINX, HAProxy). Service mesh особенно удобен, когда трафик уже идёт внутри Kubernetes-кластера: маршрутизацию можно менять конфигурацией, без правок кода клиентов и сервисов.</p><p>Например, мобильное приложение обращается к endpoint /orders/history. Раньше этот endpoint напрямую обслуживал монолит. После введения API Gateway приложение продолжает ходить по тому же контракту, но внутри gateway может решать, куда направить запрос: в legacy-модуль или новый сервис истории заказов.</p><p>Управление маршрутизацией обычно делается не «всё или ничего», а на основании атрибутов запроса: значения заголовка (X-Migration-Cohort: new), куки, хэша от user-id (стабильное разбиение пользователей на сегменты) или географического региона. Это позволяет выкатывать новую реализацию сначала на одну страну, на сотрудников самой компании или на тестовый сегмент — и только потом расширять охват.</p><p>Для клиента ничего не меняется. Для команды появляется управляемость.</p><h2>Наблюдаемость: без метрик миграция превращается в гадание</h2><p>Постепенная модернизация невозможна без нормальной наблюдаемости. Если команда не видит, что происходит внутри системы, она не сможет безопасно переключать трафик.</p><p>Минимальный набор — это логи, метрики и распределенная трассировка (distributed tracing). Нужно понимать, сколько запросов идет в старую и новую реализацию, сколько ошибок возникает, как меняется latency, где появляются таймауты, какие статусы возвращаются, какие бизнес-метрики проседают.</p><p>Технические метрики стоит формулировать не как «средний ответ» и «процент ошибок», а в терминах SLI и SLO: целевые показатели вида «99.9% запросов на /orders/history отвечают быстрее 300 ms за 30 дней» с явным error budget. Latency измеряется по перцентилям (p50, p95, p99) — среднее значение почти всегда обманчиво, а хвосты распределения говорят о реальном опыте пользователя. На время миграции имеет смысл выставить отдельные SLO для нового и старого пути и сравнивать их.</p><p>В качестве инструментов де-факто стандартом стал OpenTelemetry для трассировок, метрик и логов — единый протокол, который пишет в практически любое хранилище. Дальше — Prometheus и Grafana для метрик, Jaeger или Tempo для traces, Sentry или аналог для ошибок. Для миграции важна возможность фильтровать метрики по «варианту» — отдельно по старому и новому пути — иначе все цифры смешаются и реальную динамику будет не видно.</p><p>Технических метрик недостаточно. Если команда переносит оформление заказа, важно смотреть не только на 500 ошибки и время ответа, но и на конверсию в оплату, количество брошенных корзин, повторы запросов, обращения в поддержку.</p><p>Пример: новая система формально отвечает быстрее старой и не дает ошибок. Но после включения на 10% пользователей падает конверсия в оплату. Причина может быть не в серверной ошибке, а в изменении порядка полей, другом тексте сообщения или потере какого-то edge-case. Без бизнес-метрик команда может решить, что миграция успешна, хотя для продукта она уже создает проблему.</p><h2>Практическая последовательность миграции</h2><p>Рабочая последовательность обычно выглядит так.</p><p>Сначала команда выбирает ограниченный участок системы. На этом этапе важно не просто назвать модуль, а описать его границы. Какие сценарии он закрывает? Кто его вызывает? Какие данные он читает и пишет? Какие внешние интеграции использует? Какие неочевидные бизнес-правила в нем есть?</p><p>Затем поверх legacy-логики создается стабильный контракт. Это может быть API, фасад, gateway или отдельный слой внутри приложения. Главная задача — сделать так, чтобы клиенты зависели не от внутренней реализации, а от понятного интерфейса. На этом этапе полезно вспомнить про contract testing (Pact, Spring Cloud Contract): автотесты со стороны потребителей фиксируют, что именно они ожидают от API, и предупреждают о ломающих изменениях до того, как они доедут до продакшена.</p><p>После этого рядом пишется новая реализация. Она должна повторять текущее поведение, а не сразу становиться «идеальной версией будущего». На этом этапе полезно фиксировать все расхождения: где старая система работает странно, где требования не описаны, где бизнес-правила требуют уточнения.</p><p>Следующий этап — shadow testing. Новая система получает копии реальных запросов, считает результат, но пользователю по-прежнему возвращается ответ legacy. Команда сравнивает результаты и устраняет расхождения.</p><p>Когда новая реализация достаточно стабильна, начинается постепенное переключение через feature toggles. Сначала внутренние пользователи, потом 1% реального трафика, затем 5–10%, затем 50% и только после этого 100%.</p><p>На каждом этапе команда смотрит на метрики. Если всё стабильно, движение продолжается. Если появляются проблемы, флаг выключается, трафик возвращается в legacy, а команда разбирает причины.</p><p>Последний этап — удаление старого кода. Это не формальность, а обязательная часть миграции. И «удалить старый код» — это не один коммит, а явный Definition of Done: вырезана старая ветка кода, удалён фича-флаг, обновлена документация и схемы архитектуры, переименованы или удалены устаревшие дашборды и алерты, обновлены runbook’и для on-call и проведено короткое внутреннее обучение. Если этого не сделать, через полгода никто уже не вспомнит, какой путь актуален, и легаси-ветвление останется в коде навсегда.</p><h2>Откат миграций: дешёвый только пока не пошли записи</h2><p>Откатить миграцию, в которой ещё не было записи в БД, легко: достаточно переключить фича-флаг, и трафик снова идёт через старую реализацию. Откатить миграцию, в которой новая система уже неделю писала данные в новые таблицы, — отдельный, гораздо более тяжёлый разговор.</p><p>Поэтому ещё на этапе проектирования каждое изменение должно сопровождаться явным планом отката. Удобно различать три типа шагов.</p><p>Полностью обратимые шаги. Чтение через новый сервис, расчёт «в тени», новые метрики. Откат — выключить флаг. Это самый комфортный режим, и в нём стоит держать миграцию как можно дольше.</p><p>Обратимые с компенсацией. Новая реализация пишет дополнительные данные (например, дублирует операции в новую таблицу), но старый источник тоже обновляется. Откат возможен, но требует решить, что делать с уже записанными данными: оставить, очистить, синхронизировать. План этих действий должен быть написан до выкатки, не во время инцидента.</p><p>Forward-only. После некоторой точки откат становится невозможен — например, после того, как старая схема удалена или внешние интеграции перенастроены на новый сервис. Такие шаги допустимы, но к ним нужно приходить отдельно, осознанно, с особенно строгими SLO в предыдущем этапе. До forward-only-перехода имеет смысл подержать систему в режиме параллельной работы дольше, чем по графику.</p><p>Базовое правило: ни один шаг миграции не должен уходить в продакшен, если у команды нет письменного ответа на вопрос «как мы откатываемся в случае проблемы». Иначе при инциденте откатываться будут на ходу — и не факт, что успешно.</p><h2>Пример: как тот же сервис мигрировали со второй попытки</h2><p>После неудачного опыта команда взялась за тот же сервис заново, но изменила подход.</p><p>На первом шаге они зафиксировали поведение существующего сервиса. На самые часто используемые сценарии (создание путевого листа, подпись акта осмотра, выгрузка пакета документов за период) написали характеристические тесты на реальных продакшен-данных, обезличенных и сохранённых как фикстуры. Любое будущее изменение поведения теперь падало в CI как явное расхождение.</p><p>Параллельно команда провела инвентаризацию побочных эффектов. Из исходного кода и логов выяснилось, что сервис не только хранит документы, но и: публикует событие в Kafka при смене статуса, инкрементирует счётчик в Redis для рейтинга водителей, отправляет webhook во внешнюю систему партнёра, пишет в таблицу аудита. Каждый из этих эффектов попал в отдельный пункт чек-листа «что должно остаться» в новой реализации.</p><p>Затем команда выбрала первый кусок для выноса — не весь сервис, а только чтение документов (GET /documents/{id} и GET /documents/by-driver/{driver_id}). Это была наименее рискованная часть: ошибки в чтении неприятны, но не ломают финансовые потоки.</p><p>Новый сервис написали на FastAPI рядом со старым. На уровне API Gateway появилось правило маршрутизации: запросы на чтение шли в старый сервис, но в фоне дублировались в новый. Ответ пользователю всегда возвращал legacy, а ответ нового сервиса сравнивался с эталоном и записывался в отдельную таблицу для разбора. Использовали обёртку поверх asyncio.create_task — на ответ пользователя теневой вызов не влиял.</p><p>За три недели shadow-режима команда нашла четыре расхождения. Два оказались багами новой реализации (округление времени, неправильная сортировка вложений). Два — давно забытыми особенностями старого сервиса (одно поле возвращалось в UTC, другое — в локальной зоне; так было исторически, бизнес не возражал, но в новой реализации захотели единый формат). Все четыре зафиксировали явно: баги — починили, особенности — согласовали с продуктовой командой как осознанное изменение.</p><p>Когда расхождений не осталось, включили фича-флаг на сотрудников самой компании. Через неделю — на 1% реальных водителей. Дальше шаг по 5%, 25%, 50%, 100% с паузой в несколько дней между этапами. На каждом шаге следили не только за HTTP-ошибками и latency, но и за продуктовыми метриками: количество подписанных актов, время от открытия документа до подписи, доля повторных запросов. Один раз пришлось откатиться с 25% на 5% — в одном из регионов выросло время отклика из-за неэффективного запроса. Исправили, выкатили снова.</p><p>Через два месяца чтение полностью перешло в новый сервис. Старый код чтения и фича-флаг удалили в том же релизе. После этого по той же схеме мигрировали запись документов, потом публикацию событий, потом импорт из внешних систем. Полная миграция заняла девять месяцев — почти столько же, сколько провалившийся Big Bang, — но продукт всё это время продолжал развиваться, инцидентов не было, и в конце команда осталась с системой, которую понимает.</p><h2>Типичные ошибки при работе с legacy</h2><p>Первая ошибка — пытаться улучшить всё сразу. Команда одновременно меняет архитектуру, бизнес-логику, контракты и инфраструктуру. В результате становится невозможно понять, какая именно часть вызвала проблему. Правильнее сначала воспроизвести поведение, стабилизировать новую реализацию и только потом улучшать.</p><p>Вторая ошибка — недооценивать скрытые зависимости и побочные эффекты. Legacy-код часто делает больше, чем кажется. На один и тот же вызов могут быть навешаны: запись в таблицу аудита, инкремент счётчика в кэше, публикация события в очередь, обновление статуса связанной сущности, инвалидация кэша, дёрганье webhook’а во внешнюю систему. Если в новой реализации воспроизвести только явный путь, скрытые потребители молча перестанут получать данные — и узнают об этом через жалобу бизнеса, а не через ошибку в логах. Поэтому перед выносом любого модуля имеет смысл составить инвентаризацию побочных эффектов: пройтись по коду и логам и выписать каждое нелогичное действие отдельным пунктом чек-листа.</p><p>Третья ошибка — отсутствие наблюдаемости. Без логов, метрик и трассировки команда не управляет миграцией, а угадывает. Особенно опасно смотреть только на технические ошибки и игнорировать бизнес-показатели.</p><p>Четвертая ошибка — не договариваться с бизнесом. Модернизация не должна быть невидимой «инженерной активностью в стол». Её нужно встраивать в roadmap, объяснять эффект и договариваться о приоритетах. Если бизнес не понимает, зачем команда тратит время на миграцию, работа будет постоянно проигрывать новым фичам.</p><p>Пятая ошибка — не удалять старый код. Временное сосуществование старой и новой логики нормально. Вечное сосуществование — нет. Если legacy не удаляется, технический долг не уменьшается, а просто меняет форму.</p><p>Шестая ошибка — не удалять фича-флаги после миграции. Флаг, который сыграл свою роль и больше никогда не выключается, превращается в постоянное ветвление в коде. Через год команда не помнит, можно ли удалить такую ветку или там сидит важный edge-case. Через два — кода с такими «мёртвыми» флагами становится больше, чем основной логики. Поэтому каждый флаг должен заводиться с условием удаления («после полной выкатки и двух недель стабильной работы») и иметь ответственного, кто этим удалением займётся.</p><p>Отдельно стоит упомянуть организационную сторону. Закон Конвея работает и в обратную сторону: если новый и старый код владеются разными командами с разными приоритетами, миграция будет тормозиться независимо от выбранного паттерна. На время миграции имеет смысл явно проговорить, кто отвечает за переход, и не разделять старую и новую реализации между несовместимыми roadmap’ами.</p><h2>Компромиссы, к которым нужно быть готовыми</h2><p>Постепенная модернизация безопаснее Big Bang-переписывания, но она не бесплатна. Некоторое время система будет сложнее, чем раньше. В ней появятся старый и новый код, прокси-слой, фича-флаги, дублирование логики, дополнительные метрики.</p><p>Shadow testing увеличит нагрузку на инфраструктуру, потому что часть запросов будет обрабатываться дважды. Команде придется поддерживать дисциплину: документировать контракты, отслеживать флаги, удалять старую реализацию после миграции, поддерживать contract-тесты в актуальном состоянии.</p><p>Но это контролируемая сложность. Она распределена во времени и управляется инженерными практиками. В отличие от Big Bang-риска, где команда долго работает с минимальной обратной связью, а потом выкатывает один большой релиз с максимальной неопределенностью.</p><h2>Когда Strangler Fig особенно оправдан</h2><p>Постепенная миграция особенно хорошо подходит для систем, где downtime невозможен или слишком дорог. Это финтех, e-commerce, биллинг, мобильные бэкенды с большой аудиторией, высоконагруженные продукты, старые монолиты и системы с большим количеством интеграций.</p><p>Если продуктом ежедневно пользуются сотни тысяч или миллионы людей, нельзя позволить себе «переписать и посмотреть, что будет». Нужно менять архитектуру так, чтобы пользователь не замечал процесса миграции.</p><p>Этот подход также полезен там, где бизнес продолжает активно развивать продукт. Если фичи нельзя заморозить на полгода, модернизация должна идти параллельно с продуктовой разработкой.</p><h2>Когда модернизацию лучше не делать</h2><p>Постепенная миграция — мощный инструмент, но у неё тоже есть стоимость, и иногда правильный ответ — оставить систему как есть. Несколько сценариев, в которых модернизация плохо окупается.</p><p>Продукт, который уходит из эксплуатации. Если через год сервис будет выключен или заменён на покупное решение, тратить квартал на его рефакторинг бессмысленно. Достаточно стабилизировать то, что есть.</p><p>Модуль, который никто не трогает. Если код десятилетней давности продолжает работать, не падает, не требует изменений и не вызывает инцидентов, его «уродливость» — не повод его переписывать. Цель модернизации — упростить будущие изменения; если будущих изменений нет, цели тоже нет.</p><p>Регулируемые системы с тяжёлой ресертификацией. В банковских, медицинских и государственных контурах любое изменение в критичной системе может потребовать повторной сертификации, перепрохождения аудитов, обновления договорной обвязки. В таких условиях стоимость модернизации может на порядок превышать стоимость поддержки текущей реализации, и решение нужно принимать вместе с владельцем продукта и юристами, а не только инженерным составом.</p><p>Простой тест: если на вопрос «какой бизнес-сценарий мы откроем после миграции» нет внятного ответа — модернизацию имеет смысл отложить и заняться чем-то другим.</p><h2>Что получает команда</h2><p>Главный результат постепенной модернизации — управляемость. Команда начинает лучше понимать систему, контролировать изменения и снижать риск инцидентов.</p><p>Появляются понятные контракты, наблюдаемость, практика безопасных релизов, культура удаления старого кода. Разработчики перестают бояться legacy, потому что у них появляется метод, а не только желание «когда-нибудь всё переписать».</p><p>Для бизнеса это тоже выгодно. Продукт продолжает развиваться, сроки становятся более прогнозируемыми, риски крупных сбоев снижаются, а технический долг постепенно уменьшается.</p><h2>Модернизация — это процесс, а не проект</h2><p>Legacy нельзя «починить за квартал». Если система развивалась годами, она не станет простой после одного рефакторинга. Но её можно системно улучшать.</p><p>Strangler Fig Pattern, Branch by Abstraction, feature toggles, shadow testing и аккуратная миграция данных дают рабочую модель: выбрать ограниченный участок, описать контракт, реализовать новую версию, проверить её на реальном трафике, постепенно переключить пользователей и удалить старый код.</p><p>Это не самый быстрый путь. Зато он управляемый. А в зрелых продуктах управляемость важнее скорости.</p><p>Потому что цель модернизации — не написать красивую новую систему. Цель — сделать так, чтобы продукт продолжал развиваться, команда могла безопасно вносить изменения, а пользователи не становились участниками инженерного эксперимента.</p>]]></content:encoded>
    </item>
    <item>
      <title>Чистое API на Node.js: практическое руководство</title>
      <link>https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd</link>
      <comments>https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd</guid>
      <description><![CDATA[<p>Как построить поддерживаемое REST API на Node.js: слои, Zod, единые ошибки, версионирование и Swagger. Проверьте свою архитектуру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd">Чистое API на Node.js: практическое руководство</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Jun 2026 11:00:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваше Node.js-приложение начиналось с одного server.js, а через полгода превратилось в лабиринт маршрутов, где бизнес-логика растворилась в обработчиках Express — эта статья для вас. Чистое API проектируется не ради красоты, а чтобы команда могла добавлять конечные точки, не боясь сломать соседние.</p><p>Разберём минимальный, но готовый к продакшену скелет: разделение слоёв, валидацию входных данных, централизованную обработку ошибок, версионирование, ограничение частоты запросов и автоматическую документацию. Все принципы применимы и к Express, и к Fastify, и к NestJS.</p><p>Чистое API — это прежде всего разделение ответственности: роутер знает маршруты, контроллер переводит HTTP в вызовы сервиса, сервис отвечает за бизнес-логику, а схема проверяет входные данные. Такой подход делает код предсказуемым при любом масштабе.</p><p>Чистое API — это, прежде всего, разделение ответственности: роутеры, контроллеры, сервисы и валидация живут в разных слоях.</p><p>Валидация с помощью Zod выполняется на границе — до того, как запрос попадёт в бизнес-логику.</p><p>Централизованный обработчик ошибок — единственное место, где исключения превращаются в HTTP-ответы.</p><p>Стоит закладывать версионирование и документацию OpenAPI с первого дня: позже это обойдётся дороже.</p><p>Fastify и NestJS дают те же архитектурные идеи из коробки, но логика слоёв от этого не меняется.</p><h2>Что мы будем строить</h2><p>Возьмём намеренно простой домен — каталог товаров. Нам важна не бизнес-логика, а структура. К концу у нас будет REST API с единым форматом ответов, валидацией, версионированием по пути /api/v1, ограничением частоты запросов и интерактивной документацией Swagger.</p><h2>Структура проекта</h2><p>Прежде чем писать код, договоримся, где что лежит. Каждая фича — отдельная папка, а не рассыпанный по проекту набор файлов.</p><ul><li>api/v1/ — все маршруты версионированы с первого дня. Добавить v2 позже можно новой папкой, а не рефакторингом.</li><li>products/ — фичевая папка владеет роутером, контроллером, сервисом и схемой.</li><li>middleware/ — сквозная функциональность: защита, логирование, лимиты.</li><li>lib/ — утилиты без привязки к фреймворку.</li></ul><h2>Разделяем ответственность</h2><p>Самая частая ошибка в Express-приложениях — бизнес-логика внутри обработчика маршрута. Там же появляется валидация, работа с базой данных и формирование ответа. При росте проекта такой файл становится опасным для изменений.</p><h3>Роутер знает только «куда идти»</h3><h3>Промежуточный обработчик валидации</h3><p>Промежуточный обработчик validateRequest проверяет body, params и query до попадания в контроллер. Если данные не проходят проверку, ошибка передаётся в централизованный обработчик.</p><h3>Контроллер переводит HTTP в вызовы сервиса</h3><p>Контроллер не знает, где хранятся товары. Его задача — извлечь параметры из запроса, вызвать сервис и вернуть ответ. Всё остальное передаётся в централизованный обработчик ошибок через next(error).</p><h3>Сервис содержит бизнес-логику</h3><p>Сервис не зависит от HTTP. Когда придёт время заменить хранилище в памяти на настоящую базу данных, потребуется поправить только этот файл.</p><h2>Валидация на границе с Zod</h2><p>Любое API, принимающее внешние данные, должно их проверять. Без валидации один некорректный запрос способен превратиться в ошибку времени выполнения, некорректную запись в базе или уязвимость.</p><p>Zod даёт две вещи сразу: проверку во время выполнения и типы TypeScript, выведенные из одной схемы. Промежуточный обработчик validateRequest проверяет body, params и query до того, как запрос попадёт в контроллер. Если данные невалидны, дальше они не идут.</p><h2>Единый обработчик ошибок</h2><p>Разбросанная обработка ошибок — один из главных источников хаоса: где-то возвращается { error: '...' }, где-то { message: '...' }, а где-то случайно отдаётся HTML-страница. Решение — один обработчик, через который проходят все исключения.</p><p>Теперь клиент всегда получает предсказуемую форму ответа, а добавление логирования или отправки ошибок в мониторинг — однострочное изменение в одном месте.</p><h2>Единый формат ответов</h2><p>Успешный ответ всегда выглядит как { success: true, data: ... }, а ошибка — как { success: false, error: { code, message, details } }. Фронтенд или сторонний интегратор знает, чего ожидать от любого эндпоинта.</p><h2>Версионирование API</h2><p>Версионировать API с первого дня стоит недорого. Добавить версию позже — значит ломать существующих клиентов или городить сложную миграцию.</p><p>Новая версия — новая папка src/api/v2/ и новый префикс. Старые клиенты продолжают работать на /api/v1.</p><h2>Ограничение частоты запросов</h2><p>Rate limiting защищает API от случайных и намеренных перегрузок. Настроить его в Express помогает пакет express-rate-limit.</p><p>Глобальный лимит распространяется на все запросы; операции, которые изменяют данные, ограничены жёстче. Ответ тоже соответствует единому формату ошибки.</p><h2>Документация OpenAPI и Swagger</h2><p>API без документации годится только для автора. С помощью swagger-jsdoc и swagger-ui-express можно получить интерактивную документацию прямо из JSDoc-комментариев в роутерах.</p><p><b>Совет:</b><br />Держите описания эндпоинтов в одном файле с маршрутами, а glob в swagger.ts настройте на файлы, доступные во время работы приложения. Лучше генерировать спецификацию на этапе сборки, чем полагаться на исходники TypeScript.</p><h2>Fastify и NestJS: альтернативы Express</h2><p>Всё, что мы разобрали, работает и в Express. Но если вы начинаете проект с нуля, стоит взглянуть на альтернативы.</p><ul><li>Fastify — быстрее Express в бенчмарках (порой в два раза), имеет встроенный логгер Pino и валидацию по схеме. Разделение слоёв остаётся на совести разработчика.</li><li>NestJS — популярен в крупных компаниях: слои модулей, контроллеров и сервисов навязаны архитектурой, что упрощает введение новых разработчиков в проект.</li><li>Express — остаётся лучшим выбором, если вы присоединяетесь к существующему проекту или команда уже знает экосистему.</li></ul><p>Архитектурные принципы — разделение слоёв, единый формат ошибок, валидация на границе — не зависят от фреймворка. Меняется только синтаксис.</p><h2>FAQ</h2><h3>Минимальный набор для старта</h3><p>Для самостоятельного запуска понадобятся базовые зависимости и алиасы путей в tsconfig.json. Объявите @/* на папку src, и примеры заработают без ручных правок импортов.</p><h2>Выводы</h2><blockquote>Чистая структура API — это не переусложнение. Это минимум, при котором бэкенд можно поддерживать нескольким людям.</blockquote><p>Мы собрали минимальный, но масштабируемый каркас: папки по фичам, разделённые слои, валидацию на границе, централизованную обработку ошибок, единый формат ответов, версионирование, лимиты и автоматическую документацию. Ни один из этих шагов сложный сам по себе. Их ценность — в сочетании и в том, чтобы сделать всё это до того, как код разрастётся.</p><p>Если начинаете новый Node.js-проект, не откладывайте структуру «на потом». А в существующем — попробуйте вынести валидацию в схему и собрать ошибки в одном обработчике. Потом всегда дороже.</p><h2>Источники</h2><p>Идеи и примеры в статье основаны на материале Gavin Cettolo «<a href="https://dev.to/gavincettolo/clean-api-design-in-nodejs-a-practical-guide-3a32">Clean API Design in Node.js: A Practical Guide</a>» (dev.to).</p>]]></content:encoded>
    </item>
    <item>
      <title>Индексы в Postgres: почему ваш индекс не работает и что такое INCLUDE</title>
      <link>https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in</link>
      <comments>https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in</guid>
      <description><![CDATA[<p>B-tree, композитные, функциональные, частичные, покрывающие индексы Postgres — разбираем на примерах, где lower() убивает индекс и когда реально нужен INCLUDE.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in">Индексы в Postgres: почему ваш индекс не работает и что такое INCLUDE</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 Apr 2026 15:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш SELECT всё ещё тормозит, хотя вы добавили индекс? Вот три главные причины, почему Postgres его не использует: вы обернули колонку в lower(), перепутали порядок колонок в композитном индексе или полагаетесь на INCLUDE ради скорости записи. Индекс — это отсортированная структура, по которой база делает бинарный поиск вместо чтения всей таблицы. Но даже правильно созданный индекс легко выключить одной лишней функцией.</p><p>Джон Чартер в статье <a href="https://jon.chrt.dev/2026/04/15/things-you-didnt-know-about-indexes.html" rel="noopener">«Things you didn't know about indexes»</a> разбирает не только базовые принципы B-tree, но и три типа индексов, о которых новичкам не рассказывают: функциональные, частичные и покрывающие. Переводим полностью, с примерами на таблице покемонов и объяснением, почему EXPLAIN — ваш лучший друг.</p><p>Индексы ускоряют чтение, но замедляют запись. INSERT, UPDATE и DELETE обновляют каждый индекс — восемь индексов на таблице значат восемь дополнительных обновлений.</p><p>Композитный индекс (type_1, type_2) работает для запросов на type_1 и на обе колонки вместе, но не для запросов только на type_2. Порядок колонок важен.</p><p>Функция над индексированной колонкой убивает индекс. WHERE lower(name) = 'pikachu' не использует индекс на name — нужен функциональный индекс на lower(name).</p><p>Частичный индекс с WHERE покрывает только нужные строки. Для soft-delete или редких флагов экономит место и ускоряет запись.</p><p>Покрывающий индекс с INCLUDE отвечает на запрос без похода в таблицу — в EXPLAIN это Index Only Scan.</p><p>Не угадывайте — используйте EXPLAIN ANALYZE. Он показывает реальный план запроса и реальное время выполнения.</p><h2>Начнём с того, что вы, вероятно, уже знаете</h2><p>Индекс в базе данных похож на алфавитный указатель в конце учебника. Хотите найти страницы про фосфор? Идёте в конец, находите тему и номера страниц рядом с ней:</p><p>Представим таблицу покемонов:</p><p>Без индекса поиск Пикачу означает, что база прочитает каждую строку, проверяя колонку name. На четырёх строках это мгновенно. На десяти миллионах — уже проблема. Такое чтение называется full table scan, и оно не медленное само по себе: современные базы легко прошивают миллионы строк в секунду. Проблема в линейной сложности — удваиваете число строк, удваиваете время. Индексный поиск этой разницы почти не замечает.</p><p>Но если добавить индекс на name, получится примерно то же, что указатель в учебнике:</p><p>Данные отсортированы, поэтому база может сделать бинарный поиск по имени и найти нужную строку, а не сканировать всю таблицу. Под капотом Postgres хранит это как B-tree (сбалансированное дерево), но идея такая же, как в учебнике: отсортированные данные, по которым можно быстро искать.</p><p>Итак, индексируем всё подряд, верно? Не так быстро.</p><h2>Цена индексации</h2><p>Как бы ни хотелось проиндексировать всё, у индексов есть компромиссы. Главное правило:</p><blockquote>Чтение ускоряется, запись замедляется.</blockquote><p>С новым блестящим индексом каждый INSERT, UPDATE и DELETE должен обновить и индекс тоже. Когда мы добавляем нового покемона, база находит правильное место в отсортированном индексе имён и вставляет его туда. А индексов может быть несколько — умножайте эту работу на каждый из них.</p><p>Плюс индексы — это реальные структуры данных, и их нужно хранить. Они живут на диске и подгружаются в память: в Postgres это shared_buffers. У таблицы с восемью индексами девять объектов, которые конкурируют за буфер, а не один.</p><p>И не забываем про планировщик (query planner) — компонент, который перед каждым запросом оценивает варианты доступа к данным и выбирает самый дешёвый. Чем больше индексов, тем больше вариантов он взвешивает, так что время планирования растёт и на быстрых выборках может даже превысить время выполнения.</p><p><b>Отдельный риск на проде.</b> Обычный CREATE INDEX блокирует таблицу на запись до конца построения. На таблице в десятки миллионов строк это минуты недоступности. В production используйте CREATE INDEX CONCURRENTLY — он строит индекс без эксклюзивной блокировки, ценой чуть большего времени и того, что операция может быть прервана и оставить индекс в состоянии INVALID (который надо пересобрать).</p><h2>Почему ваш индекс не работает</h2><p>Вы взвесили компромиссы, решили, что индекс уместен. Отлично. Но он не работает как ожидалось: улучшения нет или, хуже того, скорость падает. Разберём типичные грабли.</p><h3>Композитные индексы и порядок колонок</h3><p>Возвращаясь к таблице покемонов: вы могли решить, что хороший индекс — это индекс на type_1 и type_2. «Покажи всех покемонов типа Water и Flying» — вполне разумный запрос.</p><p>Этот индекс определённо поможет запросам вроде:</p><p>Но вот этому — уже нет:</p><p>Удивлены? Когда вы создаёте композитный индекс (type_1, type_2), вы просите базу построить структуру примерно такого вида:</p><p>Сначала сортировка по type_1, затем по type_2 внутри каждой группы. Для запросов по type_1 индекс отличный, для запросов по type_1 AND type_2 — ещё лучше, но для запросов только по type_2 он не будет использован так, как вы надеетесь. Посмотрите на Flying: он разбросан под Bug, Electric, Fire и Water — базе некуда прыгнуть.</p><p>Задайте себе вопрос: какие запросы будут частыми? Если по type_2 вы будете искать так же часто, как по type_1, создайте второй индекс на type_2.</p><h3>Функции убивают индекс</h3><p>Поиск без учёта регистра — частая фича. Пользователям всё равно, пишут ли они «Pikachu», «pikachu» или «PiKaChU» — они просто хотят результат. Поэтому можно написать так:</p><p>Я бы не обратил на такой запрос особого внимания. Выглядит нормально. У нас есть индекс на name, запрос должен летать. Но, конечно, он не летает.</p><p>Почему? Индекс на name, а не на lower(name). Для базы это две совершенно разные вещи. Ваш индекс — это отсортированный список значений вида Bulbasaur, Charmander, Squirtle, Pikachu, а не bulbasaur, charmander, squirtle, pikachu. Так что когда вы просите строки, где lower(name) = 'pikachu', у базы нет отсортированной структуры для этого — и она откатывается к сканированию всей таблицы, приводя каждое имя к нижнему регистру по ходу дела.</p><p>Это касается любой функции, оборачивающей колонку. Если база не видит индексированную колонку слева от сравнения, индекс выбывает из игры.</p><p>И вот настоящие грабли: неявные преобразования тоже считаются. Классический пример — колонка user_id типа bigint сравнивается со строкой (WHERE user_id = '42') или timestamp сравнивается со строковой датой. Postgres тихо добавит приведение типа — и индекс работать перестанет с тем же эффектом, что и явная обёртка функцией.</p><p>Как обойти это? К счастью, можно построить индекс на выражении. Индекс на lower(name) абсолютно валиден, и запрос выше будет использовать его без проблем. К этому мы ещё вернёмся.</p><h3>Как избежать этих ловушек</h3><p>Короткий ответ: не гадайте. Измеряйте. Как? Спросите базу.</p><p>В Postgres есть инструмент EXPLAIN, который показывает, как именно база собирается выполнить запрос. Поставьте его перед любым SELECT — и получите отчёт:</p><p>Index Scan — это то, что вы хотите видеть. Значит, база использует индекс. Сравните с проблемным запросом:</p><p>Seq Scan значит, что читается каждая строка. Никаких индексов.</p><p>Если хотите реальные тайминги вместо оценок планировщика, используйте EXPLAIN ANALYZE. Он действительно запускает запрос и сообщает, что произошло. Попробуйте на запросе, который, как вам кажется, вы понимаете — результаты часто удивляют. А если Postgres тормозит не из-за индексов — у нас есть <a href="https://tproger.ru/articles/tormozit-postgres--12-wagov-diagnostiki" rel="noopener">12 шагов диагностики</a>, от pg_stat_activity до auto_explain.</p><h2>Чего вам не рассказывали</h2><p>Мы разобрали базовый индекс на одной колонке и его композитного брата. Вместе они покрывают большинство случаев. Но есть ещё несколько видов индексов, которые иногда оказываются именно тем, что нужно.</p><p><b>Сначала оговоримся про типы индексов в целом.</b> Всё, о чём мы пока говорили, — это B-tree, тип по умолчанию в Postgres. Но для нестандартных задач есть другие: GIN для jsonb и полнотекстового поиска, GiST для геоданных и диапазонов, BRIN для огромных таблиц с физически упорядоченными данными (логи, временные ряды), Hash для точного равенства. Ниже речь идёт именно о B-tree — но идеи функциональных, частичных и покрывающих индексов применимы и к другим типам.</p><h3>Функциональные индексы</h3><p>Мы затрагивали это в разделе про функции. Проблемный запрос был такой:</p><p>Индекс на name не помогает, потому что база ищет строки с lower(name) = ..., а отсортированной структуры для lower(name) у неё нет. Исправление — дать ей такую структуру:</p><p>Это функциональный индекс (его ещё называют индексом на выражении). Вместо того, чтобы индексировать сырую колонку, вы индексируете результат выражения, применённого к ней. Конечно, это не ограничивается lower(). Можно индексировать любое детерминированное выражение:</p><p>Годится любая функция с меткой IMMUTABLE — в Postgres это означает, что она возвращает одинаковый результат для одинаковых аргументов при любых условиях (в отличие от STABLE, которая детерминирована только в рамках одной транзакции, и VOLATILE).</p><p>Но осторожно. Если тянуться к функциональному индексу при первом же случае, это часто плохой запах. Если мы так часто ищем по имени в нижнем регистре, почему мы вообще не храним имя в нижнем регистре? Альтернативы: отдельная колонка name_lower, которую заполняете на вставке; тип citext (case-insensitive text) из одноимённого расширения; или COLLATE с регистронезависимой коллацией. Функциональный индекс — когда изменить хранение уже нельзя.</p><h3>Частичные индексы</h3><p>Большинство индексов покрывает каждую строку таблицы. Но иногда вы запрашиваете только её небольшой срез — и индексировать всё подряд расточительно. Напомню: индексы не бесплатны.</p><p>В нашей таблице покемонов есть колонка is_legendary. На момент написания существует около 1000 видов покемонов, из которых легендарными считаются всего 80 — меньше 10%.</p><p>Представьте приложение с опцией «показать всех легендарных». Изначально так и хочется создать составной индекс:</p><p>Это работает, но это перебор. Индекс теперь содержит запись для каждого покемона, а подавляющее большинство — не легендарные. Мы будем платить за хранение и запись 1000 строк, чтобы обслуживать запросы, которым интересны только 80. Более того, поскольку is_legendary — булево, получается структура, где сначала идёт разделение на False и True, и первая группа — это 920 записей мёртвого груза, оплачивающих свою долю каждой записи в таблицу ради запросов, которые их игнорируют.</p><p>Частичный индекс покрывает только строки, которые подходят под условие:</p><p>Теперь в индексе 80 записей вместо 1000. Он меньше, быстрее в запросах; а запросы вида WHERE is_legendary = true используют его без вопросов. Запросы, которые не подходят под условие (WHERE is_legendary = false), откатываются к full table scan — что вам и нужно. Эти запросы и так матчат почти каждую строку, так что индекс им не особо помог бы.</p><p>Любая колонка, где вы почти всегда запрашиваете одно значение, — кандидат на частичный индекс. Представьте индекс на колонке email в таблице users, где у вас реализован soft-delete:</p><p>Soft-deleted строки почти никогда не запрашиваются, но без фильтра всё равно раздували бы ваши индексы.</p><h3>Покрывающие индексы</h3><p>Когда база использует индекс, чтобы найти строку, это только половина работы. Индекс указывает, где строка лежит, но потом база должна сходить в саму таблицу и забрать остальные колонки, которые запросил запрос. Две поездки.</p><p>А что, если я скажу, что так делать необязательно?</p><p>Если в индексе уже есть все колонки, которые нужны запросу, база может ответить на запрос из одного только индекса. Это покрывающий индекс. В EXPLAIN вы увидите его как Index Only Scan — три самых сладких слова из возможного вывода EXPLAIN.</p><p><b>Одна важная оговорка.</b> Даже при Index Only Scan Postgres всё же заглядывает в visibility map — битовую карту, которая для каждой страницы таблицы отмечает, видимы ли все её строки всем активным транзакциям. Если страница «грязная» (были недавние UPDATE/DELETE), Postgres всё равно пойдёт в heap за проверкой MVCC. Так что на интенсивно пишущих таблицах регулярный VACUUM (автовакуум обычно справляется) критичен для того, чтобы Index Only Scan оставался «онли».</p><p>Вот запрос:</p><p>Наш частичный индекс из предыдущего раздела идеально покрывает этот запрос. Индекс на name, отфильтрованный по легендарным, — и запрос просит name легендарных. Всё, что нужно запросу, уже в индексе. Поход в таблицу не нужен.</p><p>Покрывающие индексы можно строить и специально. Postgres позволяет добавить к индексу дополнительные колонки через INCLUDE:</p><p>Теперь на такой запрос можно ответить прямо из индекса:</p><p>Почему не положить base_attack прямо в индексируемые колонки? Потому что база считает индексируемые колонки тем, по чему нужно сортировать и искать. Если добавить base_attack в ключевые колонки индекса, вы скажете базе сортировать индекс сначала по name, потом по base_attack — дополнительная работа, которая не нужна, если вы ищете только по name. INCLUDE говорит: «тащи эту колонку с собой, но не морочься сортировкой».</p><h3>Правка автора: когда на самом деле нужен INCLUDE</h3><p>В комментариях на Reddit автор получил поправку от <a href="https://www.reddit.com/user/therealgaxbo/" rel="noopener">u/therealgaxbo</a> и обновил статью. Скорость записи — не главная причина использовать INCLUDE для покрывающих индексов: в обоих случаях (колонка в ключе или в INCLUDE) индекс обновляется при каждой записи, разница по нагрузке скромная.</p><p>Реальные причины использовать INCLUDE:</p><p>Можно включать колонки, у которых типы данных не имеют подходящего operator class для типа индекса (operator class — набор функций сравнения, по которым Postgres строит индекс для конкретного типа; для некоторых типов он просто не определён). Например, колонку box (геометрический прямоугольник) нельзя добавить в B-tree индекс как ключевую — нет оператора «меньше/больше». А через INCLUDE можно.</p><p>Можно добавить колонки в уникальный индекс без изменения его семантики уникальности:</p><p>Это обеспечивает уникальность только по email, но при этом покрывает запросы, которым нужен user_id.</p><h2>Выводы</h2><p>Индексы могут казаться новичку чем-то второстепенным. Даже опытные инженеры часто создают их не задумываясь или не создают вовсе. Но грамотная индексация делает или ломает производительность вашей базы.</p><p>Хотите глубже? Сайт <a href="https://use-the-index-luke.com/" rel="noopener">Use The Index, Luke</a> научит вас всему, что только можно знать про индексы в разных СУБД. А если вы только начинаете с Postgres — загляните в наши <a href="https://tproger.ru/articles/osnovy-postgresql-dlya-nachinayushhih--ot-ustanovki-do-pervyh-zaprosov-250851" rel="noopener">основы PostgreSQL</a>: от установки до первых запросов.</p><p>И не забудьте запустить EXPLAIN ANALYZE хотя бы на одном запросе сегодня — результаты могут вас удивить.</p><p>Источник: <a href="https://jon.chrt.dev/2026/04/15/things-you-didnt-know-about-indexes.html" rel="noopener">jon.chrt.dev — Things you didn't know about indexes</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Почему ваш канал связи — не ваш. История о том, как паранойя заставила меня написать свой мессенджер с нуля.</title>
      <link>https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas</link>
      <comments>https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[igrym]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas</guid>
      <description><![CDATA[<p>Вернул UIN-ы из нулевых и завернул всё в PWA: как я писал свой мессенджер, балансируя между ностальгией и Highload</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas">Почему ваш канал связи — не ваш. История о том, как паранойя заставила меня написать свой мессенджер с нуля.</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Apr 2026 14:35:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>В какой-то момент я понял неприятную вещь: если твой канал связи живет по чужому настроению, политической погоде, сбою в чужом облаке или очередной внезапной любви регулятора к кнопке «запретить» — это не твой канал связи. Это аренда с правом внезапного выселения.</p><p>Мне эта модель быстро наскучила.</p><p>Поэтому я сделал то, что обычно делают люди с нездоровой смесью инженерной паранойи, скуки и профессиональной деформации: психанул и начал писать свой мессенджер.</p><p>Сразу зафиксируем рамки, чтобы не плодить фантомные ожидания:</p><p>- это не убийца Telegram;</p><p>- это не презентация для инвестора с KPI и growth loops;</p><p>- это не проповедь о том, как всем теперь жить.</p><p>Это мой личный цифровой бункер, моя песочница, мой учебный полигон и мой инженерный аттракцион. Я строю это прежде всего для себя: как резервный канал связи, как способ не зависеть от чужих решений и как честный highload-эксперимент, в котором можно не рассуждать про real-time в теории, а ловить его за горло руками.</p><p>И вот здесь началось смешное.</p><p>Я рассчитывал на бодрую гаражную поделку. Но эта штука оказалась заметно живее, упрямее и интереснее, чем я ожидал. Поэтому я и притащил ее на TProger. Не за аплодисментами. За самым ценным, что здесь умеют делать лучше многих: находить слабое место раньше, чем автор успевает самодовольно сказать «ну вроде едет».</p><h2>Что это вообще такое</h2><p>На текущем этапе это PWA-мессенджер.</p><p>Да, PWA. Да, осознанно. Да, я знаю весь стандартный набор комментариев про ограничения платформы, кривые пуши, фоновые ограничения и то, что</p><p>«настоящие пацаны пишут только натив». Можете не разогреваться, я это всё уже сам себе рассказал.</p><p>Почему все равно PWA:</p><p>- мне нужен был короткий путь от идеи до живого клиента;</p><p>- мне нужен был быстрый цикл выката без ритуальных танцев с</p><p>магазинами приложений;</p><p>- мне нужен был клиент, который можно быстро ломать, чинить,</p><p>пересобирать и снова кидать в бой;</p><p>- мне нужно было что заработает на разных платформах;</p><p>- мне нравится, что PWA живет в браузерной песочнице, а не лезет в телефон как хозяин квартиры.</p><p>У PWA есть реальные потолки:</p><p>- нет такой свободы по платформенным API, как у нативного клиента;</p><p>- фон, пуши и некоторые сценарии мобильной жизни работают хуже, чем</p><p>хотелось бы;</p><p>- нет нормальных VoIP-пушей (звонки работают только когда приложение</p><p>открыто), нет нормальной интеграции со списком вызовов телефона;</p><p>- по голой производительности натив его обгоняет.</p><p>И, да, Service Workers иногда ведут себя как подростки в пубертате, а iOS местами режет фоновую жизнь PWA так, будто лично обиделась на идею веб-клиента. Я в курсе. Выживаем с тем, что есть.</p><p>Но для моей задачи PWA дал главное: скорость эволюции. А в экспериментальном проекте это иногда важнее, чем стерильная идеология.</p><p>И да, работает эта штука подозрительно хорошо. Лучше, чем я ожидал, если честно.</p><h2>Зачем вообще писать еще один мессенджер, когда мир и так ими забит</h2><p>Потому что «и так забит» — плохой аргумент, когда существующие варианты в любой момент могут начать вести себя как полуживые.</p><p>Потому что я люблю контролировать инфраструктуру, а не молиться на чужую.</p><p>Потому что читать статьи про очереди, ретраи, доставку, порядок сообщений и борьбу с race condition — это теория. А написать свое, увидеть, где оно течет, и потом руками это затыкать — уже ремесло.</p><p>Потому что мне скучно.</p><p>Да, это тоже важная часть правды. На обычной работе мозг периодически начинает зевать от предсказуемости. А когда ты в одиночку пытаешься собрать живой real-time-сервис, где есть сессии, доставка сообщений, поиск, синхронизация состояния, очереди и weird cases мобильной сети —</p><p>то зевота быстро заканчивается.</p><p>То есть да: это учебный проект. Но из тех учебных проектов, которые в какой-то момент говорят: «всё, детский сад закончился, теперь давай как взрослые».</p><p>Где начинаются не разговоры про highload, а настоящая инженерная жизнь</p><p>Пока не собираешь такое сам, кажется, что мессенджер — это просто чатик.</p><p>Ну текстик, ну websocket, ну кнопка «отправить», господи. А потом начинается взрослая часть спектакля.</p><h3>1. Сообщение должно не просто уйти, а дойти правильно</h3><p>Самая скучная и самая дорогая ошибка — считать, что «отправил» значит</p><p>«доставил».</p><p>Нет. В реальной жизни между клиентом, сетью, сервером и хранилищем полно мест, где всё может стать интересно:</p><p>- клиент послал пакет, но сеть моргнула;</p><p>- сервер принял, но клиент не получил подтверждение;</p><p>- клиент решил, что ничего не дошло, и отправил повторно;</p><p>- внезапно у тебя уже не просто доставка, а идемпотентность,</p><p>дедупликация, подтверждения, ретраи и очень неприятные разборки с</p><p>дублями.</p><p>И это только один кусок.</p><h3>2. Порядок сообщений — штука гораздо более капризная, чем кажется</h3><p>Пользователь хочет простой магии: чтобы сообщения были в нужном порядке, статусы не врали, а история не прыгала, как пьяный курсор.</p><p>Инженерная реальность куда веселее:</p><p>- локальный optimistic update на offline-first клиенте хочет быть</p><p>быстрым;</p><p>- серверная истина хочет быть правильной;</p><p>- база хочет жить в своей временной линии;</p><p>- несколько устройств одного пользователя могут в это время смотреть на</p><p>мир разными глазами.</p><p>Как только начинаешь совмещать низкую задержку с внятной консистентностью, выясняется, что ты не «чатик пишешь», а торгуешься с физикой и распределенными состояниями.</p><h3>3. Race condition — это когда баг уже произошел, но ты еще не знаешь, где именно тебя унизили</h3><p>Race conditions — мой любимый жанр инженерного фольклора. Это когда всё прекрасно, пока ты смотришь. И ломается ровно в тот момент, когда отвлекся налить кофе.</p><p>Условно:</p><p>- один поток думает, что пользователь в онлайне;</p><p>- второй уже считает, что он отвалился;</p><p>- третий в это время честно пишет новое состояние;</p><p>- четвертый с невинным лицом отдает клиенту вчерашнюю правду.</p><p>А потом ты сидишь и объясняешь себе, почему в 99.7% случаев всё идеально, а в оставшихся 0.3% система внезапно начинает разговаривать голосами. А когда еще и пытаешься заставить работать реалтайм систему еще в кластере, то все сложности возводятся в квадрат.</p><h4>4. Любая «маленькая фича» очень быстро приходит за твоей архитектурой с ножом</h4><p>Захотел новую механику? Например, необычную резервацию UIN еще до регистрации? На бумаге выглядит забавно. На бэкенде начинается вечеринка:</p><p>- появляется состояние для еще не существующего пользователя;</p><p>- нужно резервировать ресурс так, чтобы его не вымели любопытные и жадные боты;</p><p>- нужно думать о TTL, освобождении, гонках, повторных запросах и кривом клиентском поведении;</p><p>- нужно следить, чтобы веселая фича не превратилась в атаку на собственную логику.</p><p>И вот так почти всё. В продуктовых презентациях фича может подаваться как «геймификация входа». В серверной реальности — «еще один слой боли, зато красиво».</p><h3>5. Поиск и история сообщений сначала кажутся простыми. Потом ты взрослеешь</h3><p>Пока данных мало, Postgres прощает тебе оптимизм. Потом история растет, индексы начинают намекать, что дружба дружбой, а latency по расписанию, и любой неаккуратный запрос внезапно становится личным конфликтом с CPU.</p><p>И тут выясняется, что в реальном мессенджере мало просто «хранить сообщения». Нужно еще:</p><p>- быстро искать;</p><p>- не ломать горячий путь доставки;</p><p>- не превращать сервер в печку под нагрузкой;</p><p>- думать наперед, где потом начнется горизонтальное масштабирование, а</p><p>где сначала будет боль, потом переписывание, потом снова боль.</p><p>Чтобы это не выглядело как очередная литература про «сложности highload», вот живой пример. Это кусок поиска по групповым сообщениям в моем бекенде: с проверкой доступа, выборкой только текстовых сообщений и сортировкой по релевантности.</p><p>Под этот запрос у меня лежит не молитва, а вполне конкретная опора: partial GIN index по выражению`(content-&gt;&gt;'text') gin_trgm_ops`.Иначе такая красота очень быстро превращает сервер в отопление стойки за счет тупого перебора JSONB.</p><p>А вот так тот же самый функционал очень часто пишут новички — вроде работает, пока данных смешно мало:</p><p>Проблема тут не в эстетике. Проблема в том, что верхний вариант ищет по нужному полю, умеет нормально ранжировать результат и опирается на индекс. Нижний часто уезжает в тяжелый scan по JSONB, ищет по строковому представлению всего объекта и под нагрузкой начинает жечь CPU просто потому, что автору было лень договориться с базой по-хорошему.</p><p>На реальном объеме истории в проде разница здесь может быть уже не в процентах, а на порядок и выше. То есть это очень быстро превращается не в «чуть-чуть быстрее», а в 10x+, а дальше всё зависит от размера истории, доли текстовых сообщений, партиций и того, насколько сильно вы любите мучить PostgreSQL.</p><p>И это еще сравнительно добрый пример. В по-настоящему наивной реализации люди (да часто и нейросети в руках новичков) иногда забывают не только про индекс и ранжирование, но и про нормальную проверку членства в чате — и тогда у тебя получается не просто медленный поиск, а еще и билет в секцию «как я сам себе устроил privacy-инцидент».</p><h3>6. Очереди, ретраи и backpressure — это не украшения, а повод спать чуть спокойнее</h3><p>В сетевом сервисе нельзя жить по принципу «ну отправили и ладно». Когда клиентов много, а сеть у части из них вечно в состоянии «между EDGE и молитвой», тебе нужны механизмы, которые умеют не только гнать трафик, но и не убивать систему собственным рвением.</p><p>То есть нужны:</p><p>- очереди (Kafka, или что вы там предпочитаете);</p><p>- повторные попытки (retry-логика);</p><p>- backpressure;</p><p>- вменяемая реакция на временную деградацию (graceful degradation);</p><p>- circuit breaker чтобы какой-нибудь маленький и вроде бы некритичный сервис не мог каскадно положить бы всю инфраструктуру;</p><p>- архитектура, которая умеет признавать, что мир не идеален.</p><p>Красиво это звучит только в статьях. В коде это обычно выглядит как серия компромиссов, которые ты принимаешь с лицом человека, только что подписавшего договор с хаосом. И все это когда у тебя нет сотен высокопроизводительных серверов в кармане, которые уже лишь за счет их мощности могли бы прощать многое.</p><h2>Интерфейс я подсматривал у Telegram. И да, специально</h2><p>Я не стал устраивать дизайнерский карнавал ради уникальности. У пользователя уже есть мышечная память. Она дороже моего самолюбия.</p><p>Если человек открывает новый мессенджер, он хочет быстро разобраться и написать сообщение. Ему не нужен артхаус-квест «найди кнопку отправки, автор так видит».</p><p>Поэтому UI здесь знакомый. Не потому что я беден фантазией, а потому что я делаю инструмент связи, а не выставку интерфейсного концептуализма.</p><figure><img src="https://media.tproger.ru/user-uploads/136500/2026-03-17/d42e785c-1951-43a6-b560-bc03d1f503a2.webp" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/136500/2026-03-17/7f9a0d02-7637-41c9-8ca1-408153554887.webp" alt="" /></figure><h2>Моя любимая инженерная шалость: UIN-рулетка до регистрации</h2><p>Тут я, конечно, немного похулиганил.</p><p>Я сделал резервацию UIN еще до этапа регистрации. То есть можно зайти, поймать красивый номер, а уже потом решить, нужен тебе вообще этот зоопарк или нет.</p><p>С человеческой стороны это фан, ностальгия и немного ICQ-вайба.</p><p>С серверной стороны это пачка вопросов:</p><p>- как хранить состояние для «почти-пользователя»;</p><p>- как не раздать красивые номера слишком щедро;</p><p>- как не дать мимо проходящему ботнету выгрести пул;</p><p>- как освобождать резервы и не плодить мусор;</p><p>- как не застрелить логическую целостность ради красивой игрушки.</p><p>С практической точки зрения миру, возможно, и не нужна эта фича. С инженерной — она просто слишком вкусная, чтобы я прошел мимо.</p><h2>Про безопасность — без дешевой магии и без сказок для инвестора</h2><p>Нет, я не изобретал свою криптографию. Я вообще считаю, что желание «сейчас быстренько придумаю свой защищенный протокол» должно автоматически активировать тревожную сирену. Да, создать защищенный протокол возможно, но это сложнее и дольше чем кажется из-за необходимости учета множества edge-cases; и в реальности сделанные на коленке протоколы чаще ненадежны, и, что еще хуже, об их уязвимостях могут знать лишь немногие пронырливые и порой не самые добросовестные люди.</p><p>Поэтому мой подход скучный, взрослый и не очень годится для красивых презентаций:</p><p>- транспорт закрыт современным TLS 1.3 (который на текущий момент, март 2026, взломать прямым криптографическим методом практически невозможно);</p><p>- клиент живет как PWA в браузерной песочнице, какая уже сама по себе имеет ряд уровней защиты;</p><p>- поверх этого я стараюсь не творить откровенной дичи;</p><p>Но важная оговорка, и она принципиальна: проект развивается быстро, агрессивно и временами как лаборатория под кофеином. Некоторые части еще могут отваливаться на ходу. Какие-то углы я уже вижу. Какие-то, уверен, еще нет.</p><p>Поэтому, несмотря на базово вменяемый современный уровень безопасности приложения, я не рекомендую сейчас доверять системе особо чувствительные данные.</p><p>Если вам нужна зрелая крепость для деликатной переписки — берите зрелые решения, которым вы уже доверяете.</p><p>Если вам нужен живой инженерный эксперимент, резервный канал связи и объект для вдумчивого краш-теста — вот он.</p><h2>Почему я вообще тащу это именно на TProger</h2><p>Потому что TProger — это место, где тексту мало быть наглым. Здесь за дерзость прощают только одно: если под ней есть мясо.</p><p>А у меня как раз тот случай, когда мне интереснее не «собрать лайки», а получить нормальную техническую реакцию:</p><p>- где архитектура выглядит спорно;</p><p>- где логика доставки сообщений может начать чудить;</p><p>- где PWA упрется в реальные ограничения платформы;</p><p>- где резервация UIN создает лишнюю поверхность атаки;</p><p>- где под нагрузкой начнет хрустеть то, что в одиночных тестах ведет себя прилично;</p><p>- где в протоколе, порядке событий, ретраях или кешировании я недооценил крайний случай.</p><p>Мне не нужен хор в духе «вау, круто».</p><p>Мне нужен ваш внутренний вредный сеньор. Тот самый тип, который открывает статью, хмыкает, а потом начинает мысленно разбирать чужую систему на части.</p><p>Вот ему я и пишу.</p><h2>Что я от вас хочу</h2><p>По сути — честной драки, но умной.</p><p>- Хотите проверить, как это переживает плохую сеть — отлично.</p><p>- Хотите посмотреть, как выглядит поведение в edge-cases — вообще прекрасно.</p><p>- Хотите понять, насколько легко читается логика протокола — давайте.</p><p>- Хотите найти баг в порядке сообщений, в кеше, в подтверждениях, в резервации UIN, в клиентском поведении — тем более.</p><p>Только давайте без детского жанра «я что-то молча сломал и ушел сиять в закат». Если найдете слабое место, баг, странность, дыру, подозрительный сценарий или красивый способ заставить систему вести себя не так, как я планировал, — пишите.</p><p>Мне это полезнее, чем аплодисменты.</p><p>И да: я не заявляю, что построил новый и единственно верный мессенджер.</p><p>Я заявляю другое. Я собрал свой рабочий велосипед, уже довольно злой и живой, и мне интересно, где именно TProger попробует вставить ему отвертку в спицы, и на какой секунде этот велосипед упадет.</p><p>Что можно делать прямо сейчас</p><p>- Если вы параноик или устали от мейнстрима и навязанных решений — держите это как запасной канал связи.</p><p>- Если вы соскучились по временам красивых UIN — приходите ловить UIN-номер.</p><p>- Если вы любите sniff, разбор трафика и сетевые игры — смотрите что идет по проводу.</p><p>- Если у вас профессиональная привычка первым делом искать edge-cases — вот, собственно, ради вас всё это и принесено.</p><p>И если что-то положите, вскроете или красиво разберете — пришлите детали. Я не обидчивый. Я, строго говоря, именно ради этого и открыл двери.</p><h2>Что дальше</h2><p>Планы без корпоративной шелухи, но вполне понятные:</p><p>- дальше допиливаю PWA-версию;</p><p>- нативные Android и iOS-клиенты — в планах, но пока не в приоритете;</p><p>- клиентскую часть, вероятно, позже открою, когда там станет меньше творческого барокко;</p><p>- идея с SDK / библиотекой для кастомных клиентов мне нравится отдельно: если люди захотят писать свои оболочки, это будет уже совсем красивый уровень игры.</p><p>Исходники сейчас закрыты. Не потому что я жадничаю или прячу священный секретный соус, а потому что местами там еще такой авторский лофт из боевых решений, экспериментов, временных костылей и честной инженерной импровизации, что сначала я предпочту сам это немного причесать.</p><h2>Итог</h2><p>На сегодня это экспериментальный PWA-мессенджер, который родился из упрямства, паранойи, скуки и любви к инженерным задачам, от которых нормальные люди обычно стараются держаться подальше.</p><p>Я делал его в первую очередь для себя. Но он уже дорос до стадии, когда его интересно не только строить, но и показывать наружу.</p><p>Если будете пробовать — лучше сразу добавить его на домашний экран (PWA так устанавливается). Так приложению жить будет заметно удобнее: платформа позволит заработать пуш-уведомлениям, появится нормальное кеширование, а оффлайн-режим перестанет быть декоративной надписью.</p><p>Если хотите просто еще один канал связи — пожалуйста.</p><p>Если хотите посмотреть и проверить, насколько крепок мой цифровой эксперимент, — тем более пожалуйста.</p><p>Если хотите проверить заодно и собственные навыки на живой системе, которая не притворяется идеальной, — вот, собственно, и весь смысл этой публикации.</p><p>Добро пожаловать.</p><p>Посмотрим, кто кого утомит первым: вы — мой сервер, я — ваши попытки его удивить, или реальность — нас обоих.</p><p><b>PS:</b></p><p>Меня там можно найти по нику IGRYM или по UIN 10001. Также есть внутренняя группа для первых пользователей (Early Birds, доступна на экране списка чатов через «+» вверху экрана)</p><p>Ссылки:</p><p>- Приложение: https://beta.plumb-app.ru/</p><p>- Телеграм-канал с новостями проекта: https://t.me/plumb_channel</p><p>- Телеграм-группа обсуждения: https://t.me/plumb_group</p>]]></content:encoded>
    </item>
    <item>
      <title>Сравнение golang веб-фреймворков 2026 года: топ-5 лучших вариантов</title>
      <link>https://tproger.ru/potoksoznaniya/sravnenie-golang-veb-frejmvorkov-2026-goda--top-5-luchwih-variant</link>
      <comments>https://tproger.ru/potoksoznaniya/sravnenie-golang-veb-frejmvorkov-2026-goda--top-5-luchwih-variant?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/potoksoznaniya/sravnenie-golang-veb-frejmvorkov-2026-goda--top-5-luchwih-variant</guid>
      <description><![CDATA[<p>Сравнение веб‑фреймворков 2026 года: разбираем топ‑5 вариантов на Go — Gin, Fiber, Echo, Chi и Beego. Анализируем производительность, потребление памяти, поддержку асинхронности, удобство маршрутизации и экосистему. Помогаем выбрать оптимальный фреймворк под ваш проект: от MVP до enterprise.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/potoksoznaniya/sravnenie-golang-veb-frejmvorkov-2026-goda--top-5-luchwih-variant">Сравнение golang веб-фреймворков 2026 года: топ-5 лучших вариантов</a>»</p>]]></description>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[#Случайные открытия]]></category>
      <category><![CDATA[#Потоксознания]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 20 Feb 2026 15:11:28 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Почему стоит выбрать Go для веб-разработки?</h2><p>Go стал очень популярным языком для бэкенд-API, потому что он предоставляет:</p><ul><li>Очень высокая производительность (компилируемый язык)</li><li>Простой параллелизм с помощью горутин</li><li>Простое развертывание (один бинарный файл)</li><li>Отлично подходит для микросервисов и облачных приложений</li></ul><p>Такие крупные компании, как Google, Uber, Twitch, Dropbox, активно используют Go для серверных сервисов.</p><h2>5 лучших веб-фреймворков Go в 2026 году</h2><h2>Gin — безопасный выбор по умолчанию</h2><p><i></i><i>Сайт </i>→ <a href="https://gin-gonic.com/" rel="nofollow">https://gin-gonic.com/</a></p><p><i>GitHub </i>→ <a href="https://github.com/gin-gonic/gin" rel="nofollow">https://github.com/gin-gonic/gin</a></p><p><b>Gin</b> — пожалуй, самый популярный фреймворк на Go на сегодняшний день. Если вы не знаете, что выбрать, выбирайте Gin.</p><p><b>Скорость изучения:</b> 1–2 дня</p><p><b>Идея для бенчмарка: </b>~50–70 тыс. запросов в секунду</p><p><b>Преимущества</b> 👍</p><p>• Очень прост в настройке</p><p>• Огромное сообщество и промежуточное ПО</p><p>• Стабилен и проверен в реальных условиях</p><p>• Работает со стандартной экосистемой net/http</p><p><b>Недостатки</b> 👎</p><p>• Непредвзятость → большие проекты могут стать запутанными</p><p>• Отсутствие встроенной системы внедрения зависимостей</p><p>• Некоторым не нравится стиль с использованием контекста</p><h2>Fiber — стиль Express.js для Go</h2><p><i>Сайт</i> → <a href="https://gofiber.io/" rel="nofollow">https://gofiber.io/</a></p><p><i>GitHub</i> → <a href="https://github.com/gofiber/fiber" rel="nofollow">https://github.com/gofiber/fiber</a></p><p><b>Fiber</b> похож на Express.js, но написан на Go. Если вы знакомы с Node.js, он вам понравится.</p><p><b>Скорость обучения</b>: 1 день</p><p><b>Идея бенчмарка:</b> ~70–110 тыс. запросов в секунду</p><p><b>Преимущества</b> 👍</p><p>• Чрезвычайно быстрый</p><p>• Очень удобен для разработчиков на Node</p><p>• Множество встроенных функций</p><p>• Чистый и простой синтаксис</p><p><b>Недостатки</b> 👎</p><p>• Использует fasthttp вместо net/http</p><p>• Некоторые библиотеки Go не работают</p><p>• Отладка может быть затруднена</p><p>• Экосистема меньше, чем у Gin</p><h2>Echo — чистый и продуманный фреймворк</h2><p><i></i><i>Сайт</i>→ <a href="https://echo.labstack.com/" rel="nofollow">https://echo.labstack.com/</a></p><p><i>GitHub</i> → <a href="https://github.com/labstack/echo" rel="nofollow">https://github.com/labstack/echo</a></p><p><b>Echo</b> — это сбалансированный фреймворк. Не слишком маленький, не слишком большой.</p><p><b>Скорость изучения:</b> 2–3 дня</p><p><b>Идея бенчмарка:</b> ~50–65 тыс. запросов в секунду</p><p><b>Преимущества</b> 👍</p><p>• Чистая структура</p><p>• Встроенная система проверки и промежуточное ПО</p><p>• Хорошая документация</p><p>• Развитая и стабильная</p><p><b>Компромиссы</b> 👎</p><p>• Экосистема меньше, чем у Gin</p><p>• Для некоторых расширенных функций требуются дополнительные библиотеки</p><p>• Не такой быстрый, как Fiber</p><h2>Chi — легковесный маршрутизатор для чистой архитектуры</h2><p><i>Сайт</i> → <a href="https://go-chi.io/" rel="nofollow">https://go-chi.io/</a></p><p><i>GitHub</i> → <a href="https://github.com/go-chi/chi" rel="nofollow">https://github.com/go-chi/chi</a></p><p><a href="https://github.com/go-chi/chi" rel="nofollow"></a><b>Chi</b> — это не полноценный фреймворк. Это маршрутизатор, который используется во многих серьезных микросервисах.</p><p>Время обучения: несколько часов</p><p>Идея бенчмарка: ~45–60 тыс. запросов в секунду</p><p>Преимущества 👍</p><p>• Очень легкий</p><p>• Использует стандартную сеть/http</p><p>• Идеально подходит для чистой архитектуры</p><p>• Простое тестирование</p><p>Компромиссы 👎</p><p>• Не подходит для новичков</p><p>• Все нужно создавать самостоятельно</p><p>• Нет встроенной объектно-реляционной модели или вспомогательных инструментов</p><p>• Медленное начало работы над небольшими проектами</p><h2>Beego — полноценный MVC-фреймворк</h2><p><i>Сайт</i> → <a href="https://beego.vip/" rel="nofollow">https://beego.vip/</a></p><p><i>GitHub</i> → <a href="https://github.com/beego/beego" rel="nofollow">https://github.com/beego/beego</a></p><p><b>Beego</b> похож на Django. В нем есть ORM, интерфейс командной строки, сессии, шаблоны.</p><p><b>Скорость освоения:</b> 1–2 недели</p><p><b>Идея бенчмарка:</b> ~20–40 тыс. запросов в секунду</p><p><b>Преимущества</b> 👍</p><p>• Все встроено</p><p>• Быстрая разработка монолитных приложений</p><p>• Хорошие инструменты командной строки</p><p>• Встроенная объектно-реляционная модель и шаблоны</p><p><b>Компромиссы</b> 👎</p><p>• Более низкая производительность</p><p>• Больше весит по сравнению с Gin или Fiber</p><p>• Сегодня сообщество меньше</p><p>• Не подходит для микросервисов</p><h2>Откуда взяты эти показатели производительности</h2><p>Приведенные выше цифры не случайны. Вы можете проверить их здесь:</p><p>👉 <a href="https://www.techempower.com/benchmarks/" rel="nofollow">https://www.techempower.com/benchmarks/</a></p><p>Это самый надежный бенчмарк в сфере бэкенд-разработки. Он тестирует фреймворки на одном и том же оборудовании с одинаковой нагрузкой.</p><p><b>Но помните</b> ⚠️</p><p>Реальная производительность зависит от:</p><p>• использования базы данных</p><p>• ведения журналов</p><p>• аутентификации</p><p>• размера полезной нагрузки</p><p>• TLS</p><p>• аппаратного обеспечения</p><p><i>Поэтому всегда проводите собственное тестирование.</i></p><h2>Мои рекомендации на 2026 год:</h2><p>- Если вы новичок → начните с Gin</p><p>- Если вам нужна максимальная производительность → попробуйте Fiber</p><p>- Если вам нужна сбалансированная структура → используйте Echo</p><p>- Если вам нравится чистая архитектура → используйте Chi</p><p>- Если вам нужен полноценный MVC → используйте Beego</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-02-20/854421c7-0f72-43e3-b742-2ca15d690417.webp" alt="" /></figure><p>Помните, что идеального фреймворка не существует. Выберите тот, который подходит вашей команде и проекту.</p><p><a href="https://dev.to/mahdi0shamlou/go-web-frameworks-comparison-2026-top-5-picks-gin-fiber-echo-chi-beego-mahdi-shamlo-57d4">Перевод статьи</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Впервые сделал кроссплатформенное приложение на Tauri и Rust</title>
      <link>https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust</link>
      <comments>https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust</guid>
      <description><![CDATA[<p>Это история о том, как я впервые сделал настоящее (наверное, если его вообще можно таковым считать с учётом использования Tauri) приложение под macOS и Windows и о боги даже скомпилировал его под RedOS</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust">Впервые сделал кроссплатформенное приложение на Tauri и Rust</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 04 Feb 2026 09:35:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет.</p><p>Меня зовут Максим, я не совсем разработчик, хотя и работаю в IT.</p><p>Это история о том, как я впервые сделал <b>настоящее</b> (наверное, если его вообще можно таковым считать с учётом использования Tauri) приложение под macOS и Windows и о боги даже скомпилировал его под RedOS</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-04/304fb854-6c38-4c87-bcbb-093e85c27e69.webp" alt="" /></figure><p>Честно, я пытался собрать его и под АльтЛинукс, но не осилил корректную работу с глобальными хоткеями.</p><p>Возможно, соберусь силами, мыслями и помощью ИИ и всё-таки это поправлю 🙂</p><p>Было больно, интересно и очень познавательно.</p><p>По воле случая(работы) мне часто приходится использовать однотипные ответы для коллег на базовые вопросы и типовые вещи. Думаю, многие с таким сталкиваются, ну или не многие(везет же вам!)</p><p>И каждый раз это выливается в:</p><ul><li>копипаст,</li><li>переключение окон,</li><li>поиск нужного файла, как в посте так и на компе</li></ul><p>Да, есть готовые решения, но они меня не устроили: где-то оверхед по функционалу, где-то я просто забивал болт (будем честны)</p><p>Плюс был ещё один минус — отсутствие нормальной мультиплатформы.</p><p>Перепробовав несколько вариантов, я понял, что хочу что-то своё родное, со своими багами, приколами и нужным мне функционалом.</p><p>Ну и, конечно, чтобы это было мультиплатформенно.</p><p>Изначально проект писался на C# под Windows. Он даже работал, и в целом всё было неплохо — кроме внешнего вида (привет дефолтным формам Visual Studio).</p><p>А потом у меня появился Mac, и стало понятно: нужно одно приложение, один внешний вид, привычные команды и одинаковый функционал на всех платформах.</p><p>Начались изыскания.</p><p>В теории можно было использовать .NET и Avalonia, но не срослось.</p><p>Потом взгляд упал на Electron - вроде всё хорошо, я даже собрал тестовый билд.Но на тот момент у меня было дикое желание привязывать к шаблонам глобальные хоткеи, а делать это из-под Electron, да ещё и мультиплатформенно, оказалось для меня слишком сложно.</p><p>Я не осилил это зло и… просто забил.</p><p>Вообще забил на приложение и идею его делать.</p><p>Спустя время мне на глаза попался <b>Tauri</b>.</p><p>Я немного потыкался в него и мне понравилось:</p><ul><li>размеры билдов небольшие</li><li>не тащим за собой целый браузер ради маленького desktop-приложения (в отличие от Electron)</li><li>UI на обычном HTML/CSS</li><li>ну и как тут не залететь в хайп-поезд под названием Rust 🙂</li></ul><p>Так, собственно, за месяц неспешной работы на свет появился <b>EasyPaste</b>.</p><h4>Что было самым сложным</h4><p>Честно не UI и даже не логика(ведь приложение простое).</p><p>Самое сложное:</p><ul><li>сборки под разные платформы(первый раз таким занимался, да еще и через воркфлоу)</li><li>системные зависимости</li><li>tray и hotkeys</li><li>и просто понять, как правильно делать вещи в Tauri</li></ul><h4>Что же такое EasyPaste</h4><p>По факту это библиотека шаблонов со следующим функционалом:</p><ul><li>хранение шаблонов в виде дерева (разделы и файлы)</li><li>открытие через быстрое окно шаблонов</li><li>поиск по названию, тексту и тегам</li><li>избранные шаблоны</li><li>работа с форматированным текстом (жирный, курсив, таблицы)</li><li>вложения файлов к шаблонам</li><li>перетаскивание текста или файлов прямо в любое приложение</li></ul><h2>Для кого это</h2><p>Изначально я делал это для себя, но довольно быстро понял, что инструмент полезный и подойдет для:</p><ul><li>служб поддержки</li><li>sales-менеджеров</li><li>HR и рекрутеров</li><li>людей, которые часто отвечают на типовые вопросы</li></ul><h2>Почему вообще я написал весь этот текст</h2><p>Сейчас EasyPaste уже работает и используется, но я не хочу превращать его в продукт в вакууме.</p><p>Мне очень нужен живой фидбек:</p><ul><li>удобно ли</li><li>чего не хватает</li><li>что лишнее</li><li>где больно.</li></ul><p>Поэтому я ищу людей, которые готовы потестировать приложение и честно сказать своё мнение.</p><p>Я не обещаю «революцию», но, возможно вы поможете сделать продукт более полезным и функциональным.</p><p>Скачать приложение и получить свежий триальный ключ можно на сайте:</p><p>Буду очень благодарен за любой фидбек 🙏</p><p>PS ах да тк я зажопил(будем честны) деньги на сертификаты, то будут алерты, но настанут светлые дни и Майкрософт мне подтвердить уз, чтобы я через Azure мог подписывать приложения за 9.99$ в месяц и оплачу Apple Developer Account(как большие разработчики), то все проблемы исчезнут а пока вот вам лайфхаки:</p><p>Windows: можно нажать «Доверяю / Установить», проверив любым понравившимся антивирусом Если будет спрос то выложу портабл версию без инсталятора</p><p>macOS (Intel и ARM): выполните в терминале после того как перенесете приложение в Applications</p>]]></content:encoded>
    </item>
    <item>
      <title>Хакер собрал публичную базу «навайбкоженных» приложений с сотнями уязвимостей</title>
      <link>https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej</link>
      <comments>https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej</guid>
      <description><![CDATA[<p>Хакер собрал публичный реестр iOS-приложений, созданных вайб-кодингом с ИИ, где нашли сотни уязвимостей и открытые базы данных</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej">Хакер собрал публичную базу «навайбкоженных» приложений с сотнями уязвимостей</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Firebase]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 22 Jan 2026 10:42:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Анонимный хакер <a href="https://firehound.covertlabs.io/">запустил</a> публичный реестр небезопасных iOS-приложений, созданных с помощью вайб-кодинга.</p><p>Судя по всему, это те самые приложения, которые были собраны на скорую руку с помощью ИИ. В базе уже <b>167 приложений</b>. Проект опубликован на платформе <b>Firehound</b> и активно обсуждается в <a href="https://www.reddit.com/r/iosdev/comments/1qhw9by/a_hacker_is_making_a_list_of_vibecoded_apps_198/">сообществе</a> iOS-разработчиков на <b>Reddit</b>.</p><h2>Что именно нашли</h2><p>Firehound сканирует iOS-приложения и ищет публично доступные базы данных и файлы — без взлома, логинов и обхода защиты. Речь идет о классической ошибке конфигурации: бэкенд приложения открыт для всех желающих.</p><p>В реестре уже есть приложения с:</p><ul><li>десятками миллионов записей в открытых базах;</li><li>доступными коллекциями profiles, posts, comments, likes;</li><li>утекшими email-адресами, никнеймами, метаданными активности.</li></ul><p>Один из лидеров антирейтинга — приложение <i>Adult Coloring Book – Pigment</i>. У него <b>более 7,7 млн документов</b> оказались доступны без какой-либо аутентификации.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-22/77f179d5-9a1e-470f-b146-6617e72e50b0.jpeg" alt="" /></figure><h2>Причем тут вайб-кодинг</h2><p>По словам автора проекта, большинство уязвимостей выглядят одинаково: разработчики используют ИИ для генерации кода и инфраструктуры, но не понимают, <b>что именно деплоят в прод</b>.</p><p>Типичный сценарий:</p><ul><li>ИИ предлагает использовать Firebase, Supabase или MongoDB.</li><li>Конфигурация безопасности либо отсутствует, либо остается дефолтной.</li><li>Ключи и переменные окружения попадают в клиентский код.</li><li>База становится публичной — иногда буквально в один клик.</li></ul><p>Как подчеркивают участники обсуждения на Reddit, проблема не в ИИ как таковом, а в том, что вайб-кодинг часто заканчивается <b>полным отсутствием базовой гигиены кибербезопасности</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-22/64f6ee24-b42d-4286-b0b1-a34e198067f5.jpeg" alt="" /></figure><h2>Это не взлом — и в этом главная проблема</h2><p><b>Важно:</b> Firehound не эксплуатирует уязвимости. Он лишь показывает то, что уже открыто. Данные в публичной версии интерфейса частично замаскированы, но сам факт доступности никто не отрицает.</p><p>Именно это делает ситуацию неприятной: формально никто ничего не «ломал», но пользовательские данные все равно утекли.</p>]]></content:encoded>
    </item>
    <item>
      <title>Node.js разработка в телеком-компании: почему мы выбрали TypeScript и NestJS – взгляд проджекта</title>
      <link>https://tproger.ru/articles/node-js-razrabotka-v-telekom-kompanii--pochemu-my-vybrali-typescript-i-nestjs---vzglyad-prodzhekta</link>
      <comments>https://tproger.ru/articles/node-js-razrabotka-v-telekom-kompanii--pochemu-my-vybrali-typescript-i-nestjs---vzglyad-prodzhekta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[MCN Telecom]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/node-js-razrabotka-v-telekom-kompanii--pochemu-my-vybrali-typescript-i-nestjs---vzglyad-prodzhekta</guid>
      <description><![CDATA[<p>Когда в телеком-компании заходит разговор о выборе backend-стека, он почти никогда не начинается с вопроса «на каком языке писать».</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/node-js-razrabotka-v-telekom-kompanii--pochemu-my-vybrali-typescript-i-nestjs---vzglyad-prodzhekta">Node.js разработка в телеком-компании: почему мы выбрали TypeScript и NestJS – взгляд проджекта</a>»</p>]]></description>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 20 Jan 2026 12:30:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда в телеком-компании заходит разговор о выборе backend-стека, он почти никогда не начинается с вопроса «на каком языке писать». На практике мы обсуждаем совсем другое: как быстро команда сможет вносить изменения, насколько предсказуемо система поведет себя под нагрузкой и сколько будет стоить ошибка – в деньгах, репутации и инцидентах.</p><p>Именно в этом контексте Node.js перестал быть экспериментом и стал рабочим инструментом. Не универсальным, но очень эффективным для определенного класса задач. Причем в связке не просто с JavaScript, а с TypeScript и NestJS, которые фактически задали стандарт современной разработки внутри компании.</p><p>Почему Node.js вообще рассматривается в телекоме</p><p>Телеком – это не только сеть и биллинг. Большая часть IT-систем оператора – это сервисы, которые постоянно общаются друг с другом: принимают запросы, ходят в CRM, дергают каталоги продуктов, публикуют события, отвечают мобильным приложениям и партнерам. Такие системы почти всегда I/O-bound, и именно здесь асинхронная модель Node.js оказывается уместной.</p><p>Для проджекта ключевое преимущество Node.js – не в «скорости языка», а в скорости изменений. Сервисы на Node.js проще и быстрее адаптируются к новым контрактам, партнерским требованиям и продуктовым экспериментам. Это особенно важно в среде, где бизнес-процессы меняются быстрее, чем успевают обновляться презентации.</p><h2>Почему не Java, Go или .NET: прагматичный выбор</h2><p>В реальности вопрос звучит не как «какой язык лучше», а как «где этот язык дает наименьшую стоимость владения».</p><p>Java в телекоме никуда не делась и прекрасно чувствует себя в тяжелых доменных системах – биллинге, расчетах, core-платформах. Но для API, BFF и интеграционных сервисов ее избыточная строгость часто замедляет изменения.</p><p>Go отлично показывает себя в сервисах, где важна предсказуемая производительность и минимальный рантайм. Однако в продуктовой разработке с большим количеством контрактов, схем, валидаций и быстро меняющихся требований экосистема TypeScript оказывается более гибкой.</p><p>Node.js выигрывает именно там, где важны скорость поставки и адаптация, а не максимальная вычислительная эффективность.</p><h2>TypeScript как основа контрактной разработки</h2><p>TypeScript в телекоме – это не «мода на типы». Это инструмент управления сложностью. В распределенной системе с десятками интеграций ошибка в контракте почти всегда приводит к инциденту, а не просто к падению тестов.</p><p>Типизация позволяет зафиксировать модель данных и снизить количество неявных допущений между командами. Особенно заметен эффект, когда frontend и backend используют один язык: изменения в API становятся более прозрачными, а синхронизация команд – менее болезненной.</p><p>С точки зрения проджекта это напрямую влияет на количество дефектов, откатов и срочных хотфиксов.</p><h2>Почему мы активно переходим на NestJS</h2><p>На ранних этапах Node.js-проекты часто стартуют с минималистичных фреймворков. Но в крупной компании такой подход быстро перестает масштабироваться организационно. Разные команды пишут по-разному, появляются несовместимые подходы к логированию, ошибкам, структуре кода.</p><p>NestJS решает эту проблему не за счет магии, а за счет жестких, но понятных правил. Он задает единый каркас для сервисов, упрощает внедрение общих библиотек и делает код более предсказуемым для новых участников команды. Именно поэтому Nest постепенно становится стандартом, а не просто еще одним фреймворком в стеке.</p><h2>Метрики, по которым мы оцениваем эффективность стека</h2><p>На уровне управления проектами нас интересуют не ощущения, а измеримые показатели. Для Node.js-сервисов мы смотрим в первую очередь на:</p><ul><li>lead time изменений, частоту релизов и MTTR после инцидентов;</li><li>SLO по доступности и latency (p95/p99) для ключевых API.</li></ul><p>Если стек позволяет улучшать эти метрики без роста операционных рисков – значит, он выбран правильно.</p><h2>Мониторинг и наблюдаемость как обязательное условие</h2><p>Node.js сам по себе не делает систему надежной. Надежность появляется только тогда, когда сервис хорошо наблюдаем. В продакшене мы опираемся на структурированные логи, метрики и распределенный трейсинг, чтобы видеть не только факт ошибки, но и ее причину в цепочке вызовов.</p><p>Особое внимание уделяется специфике Node.js – event loop lag, потреблению памяти и поведению сервиса под пиковыми нагрузками. Без этого любые разговоры о масштабируемости остаются теорией.</p><h2>Как достигается отказоустойчивость на практике</h2><p>Отказоустойчивость – это не один механизм, а набор инженерных решений, которые работают вместе:</p><ul><li>таймауты, ретраи и circuit breaker на внешних зависимостях;</li><li>корректная работа с lifecycle сервиса, включая graceful shutdown и безопасные релизы.</li></ul><p>Node.js хорошо вписывается в такую модель, если сервисы проектируются stateless и изначально ориентированы на горизонтальное масштабирование.</p><h2>Итог: взгляд проджекта на Node.js в телекоме</h2><p>Node.js в связке с TypeScript и NestJS – это не попытка заменить весь backend одной технологией. Это осознанный выбор для конкретного слоя системы, где важны скорость изменений, управляемость и наблюдаемость.</p><p>Для проджект-менеджера ценность этого стека в том, что он помогает держать баланс между инженерной сложностью и бизнес-реальностью. А в телекоме это зачастую важнее, чем выбор «самого правильного» языка.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пузырь 2021–2022 годов лопнул: эксперты составили прогноз рынка на 2026 год</title>
      <link>https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god</link>
      <comments>https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god</guid>
      <description><![CDATA[<p>После пузыря 2021–2022 ИТ-рынок стабилизируется: в 2026 ждут низкий найм, меньше джунов и рост спроса на сильных инженеров</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god">Пузырь 2021–2022 годов лопнул: эксперты составили прогноз рынка на 2026 год</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 30 Dec 2025 11:01:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>IT-рынок пережил болезненную коррекцию после бума и перегрева 2021–2022 годов.</p><p>Тогда компании нанимали инженеров с запасом, под давлением цифровизации, дешевых денег и страха «остаться позади». По данным Indeed и FRED, пик вакансий пришелся на середину 2022 года. После чего последовал резкий спад, так и не вернувшись до прежнего уровня.</p><h2>Почему ИИ — удобный, но не главный виновник</h2><p>ИИ стал публичным оправданием сокращений. Заявление «мы заменяем людей на ИИ» хорошо смотрится в отчетах и перед инвесторами.</p><p>На практике же компании сокращали издержки, выравнивали штат и параллельно активнее нанимали за пределами США и Европы, где инженеры стоят дешевле.</p><p>Исследования показывают, что ИИ пока не делает разработчиков быстрее в реальной работе. Напротив, опытные инженеры иногда теряют в продуктивности из-за необходимости проверять и исправлять сгенерированный код.</p><h2>Как будет выглядеть рынок в 2026 году</h2><p>Эксперты <a href="https://www.finalroundai.com/blog/software-engineering-job-market-2026">сходятся</a> во мнении: 2026 год пройдет в режиме «низкого найма — низких увольнений». Массовых сокращений не ожидается, но и бурного роста вакансий не будет. Так выглядит стабилизация рынка.</p><p>При этом спрос смещается — универсальных «кодеров» нужно меньше. А вот инженеры, которые умеют проектировать системы, работать с производительностью, безопасностью и сложной интеграцией, наоборот будут все чаще находить вакансии под себя.</p><p>По прогнозу Бюро статистики труда США, число вакансий для разработчиков продолжит расти примерно на 15%. Это медленнее, чем ожидалось раньше, но все еще быстрее большинства профессий.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-30/3a3ad90f-f354-48b3-83bd-8857158de8e8.jpeg" alt="" /></figure><h2>Почему джунам повезло меньше всего</h2><p>Самое слабое место рынка — начальные позиции. Количество вакансий для junior-разработчиков упало примерно на 40% по сравнению с допандемийным уровнем.</p><p>Компании больше не готовы вкладываться в длительное обучение: им нужны люди, которые могут приносить пользу почти сразу.</p><p>Но это также создает отложенную проблему — без притока новичков рушится кадровый «конвейер».</p><h2>Какие навыки реально востребованы</h2><p>В 2026 году ценятся не языки сами по себе, а связки «язык + область».</p><p>Тот же Python чаще всего нужен при работе с ИИ и данными. JavaScript и TypeScript — для фронтенда и fullstack. Go — для бэкенда и инфраструктуры. Java — для enterprise-систем.</p><p>Параллельно растет спрос на ИИ- и дата-инженеров, а также специалистов по ИИ-инфраструктуре.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мы разрабатываем систему голосового управления презентациями на базе Whisper и GigaChat</title>
      <link>https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat</link>
      <comments>https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Киприн]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat</guid>
      <description><![CDATA[<p>Как создать инструмент, который позволяет переключать слайды с помощью голосовых команд и контекстного анализа речи. В статье разбирается микросервисная архитектура на React и Python (FastAPI), использование модели OpenAI Whisper для транскрибации в реальном времени и интеграция LLM GigaChat для интеллектуального ведения презентации. Также описываются проблемы нестабильности нейросетей в живых выступлениях и реализованные решения: режим байпаса и навигация по ключевым словам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat">Как мы разрабатываем систему голосового управления презентациями на базе Whisper и GigaChat</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 27 Dec 2025 11:40:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Наша команда разрабатывает инструмент для интеллектуального управления презентациями.</p><p>Пользователь может транслировать презентацию через "AI Кликер", а сервис будет записывать и транскрибировать речь спикера и аудитории. Спикер может переключать слайды простыми голосовыми командами или ключевыми словами, привязанными к конкретным слайдам.</p><p>Интеграция LLM позволяет реализовать интеллектуальные функции - переключение слайдов по описанию, контексту, генерация нового контента в реальном времени. Целевая аудитория — учителя, преподаватели и спикеры, на постоянной основе работащие с презентациями.</p><h2>Архитектура решения</h2><p>Наша команда использует JavaScript с React на фронтенде и Python c FastAPI на бэкенде. Мы используем PosgtreSQL как базу данных и S3 как объектное хранилище для хранения презентаций. Мы строим микросервисную архитектуру в нашем приложении.</p><p>Первый сервис - REST API для авторизации, управления личным кабинетом и контентом пользователя. Развернут на отдельном дешевом сервере за прокси NGINX, запросы шифруются HTTP</p><figure><img src="https://media.tproger.ru/user-uploads/135058/2025-12-16/91ac9c1a-c7e9-46e6-903d-8224c80bf981.png" alt="" /><figcaption>Архитектура REST API</figcaption></figure><p>Второй сервис - API трансляции презентации. Двустороннее взаимодействие браузера и этого сервиса (передача звука и отдача команд по переключению слайдов) идет по протоколу WebSocket Secure. Отдельный сервис для трансляции позволяет нам динамически управлять дорогими серверами с GPU, уничтожать их, поднимать, экспериментировать с конфигурациями, не переживая о сохранности основного приложения. Модель OpenAI Whisper используется для транскрибации речи и GigaChat от Сбера как LLM для анализа контекста выступления и генерации команд и контента.</p><figure><img src="https://media.tproger.ru/user-uploads/135058/2025-12-16/4ef40e63-5b61-4e65-997d-ff80ac16061b.png" alt="" /><figcaption>Архитектура сервиса трансляции</figcaption></figure><h2>Работа Whisper</h2><p>В AI-кликере распознавание речи - фундамент всей системы. Пока человек говорит, система должна получить текст, проверить команды, сопоставить с ключевыми словами, передать в LLM. Для этого обычного Whisper недостаточно — он отлично работает с файлами, но плохо подходит для живого потока.</p><p>Поэтому в проекте используется связка Whisper + <a href="https://github.com/QuentinFuxa/WhisperLiveKit">WhisperLiveKit</a> — библиотека, которая позволяет кормить модель аудио чанками в реальном времени, а не загружать готовые записи.</p><h2>Байпас: ручное управление голосом</h2><p>Одна из ключевых фич — байпас-режим. Это механизм, который позволяет управлять презентацией жёсткими голосовыми командами, в обход всей нейросетевой логики.</p><p>Когда Whisper отдаёт текст, он сначала проверяется не через LLM, а через механизм сопоставления фраз:</p><p>Дальше всё работает просто:</p><ul><li>если пользователь сказал фразу, похожую на “кликер вперёд” → слайд листается вперёд;</li><li>если “кликер назад” → слайд листается назад.</li></ul><p>Данная реализация позволяет пользователю в любой момент перебить автоматику и принудительно перелистнуть слайд. Это критично для надёжности: если LLM вдруг “поплыла”, у спикера всегда есть жёсткий голосовой руль.</p><h2>Ключевые слова: автоматический переход на нужный слайд</h2><p>Вторая важная часть — режим ключевых слов. Это уже не просто “вперёд/назад”, а сопоставление речи с конкретными слайдами.</p><p>Логика такая:</p><ol><li>Для презентации загружается набор ключевых фраз, который группируется по номеру слайда.</li><li>Когда приходит новый фрагмент речи — он сравнивается с ключевыми словами и в случае успеха отправляет команду на переключение:</li></ol><p>То есть фактически система работает как голосовой навигатор по презентации:</p><ul><li>сказал фразу, связанную со слайдом 5 → система предлагает перейти на 5;</li><li>сказал фразу из блока 10 → прыжок сразу туда</li></ul><p>При этом переход отправляется в очередь и дополнительно проверяется по порогу уверенности:</p><p>Слайд переключается только если вероятность достаточная. Это защищает от случайных совпадений и шумов.</p><h2>Работа с LLM (Гигачат) - промпты, контексты, очереди</h2><p>Если Whisper в AI-кликере отвечает за то, чтобы услышать, то GigaChat отвечает за то, чтобы понять, о чём сейчас говорит спикер и какой слайд этому соответствует. Вся работа с LLM построена асинхронно: распознанная речь не блокирует систему, а складывается в очередь и обрабатывается в фоне. Каждый фрагмент речи:</p><ul><li>попадает в очередь,</li><li>добавляется в историю пользователя,</li><li>отправляется в GigaChat,</li><li>а результат в виде вероятностей по слайдам уходит дальше в очередь переключения.</li></ul><p>Такой подход позволяет не тормозить распознавание речи, не зависеть от времени ответа нейросети, обрабатывать несколько фрагментов параллельно.</p><h2>В чём возникла основная проблема?</h2><p>Текущая концепция работы LLM строится на предугадывании номера слайда по смыслу речи. И именно здесь в реальных условиях всплыла главная боль проекта. На живых выступлениях выяснилось, что GigaChat может путаться между похожими слайдами и менять своё решение от фразы к фразе. В итоге презентация иногда начинала хаотично перелистываться, даже если спикер говорил последовательно и спокойно. Для пользователя это выглядит как будто “нейросеть сошла с ума и живёт своей жизнью”.</p><p>Пока проблема не решена полностью, в системе есть страховочный механизм — временное отключение GigaChat при ручном управлении. Если пользователь даёт жёсткую голосовую команду (байпас), то нейросеть временно игнорируется, а управление полностью возвращается человеку. Через несколько секунд автоматика включается обратно, что позволяет не ломать выступление даже в моменты, когда LLM начинает вести себя нестабильно</p><p>Практика показала, что угадывать слайд по смыслу — слишком нестабильная стратегия для живого продукта. Поэтому сейчас происходит переход к новой модели:</p><ul><li>было - нейросеть угадывает номер следующего слайда.</li><li>станет - нейросеть находит слайд по его описанию. После определенной команды, система слушает пользователя, пока он не закончит предложение (как умная колонка) и тогда один раз выбирает и переключает слайд. Это снижает вероятность случайных переключений и делает поведение системы более предсказуемым.</li></ul><h2>Итоги</h2><p>Мы продолжаем реализацию проекта и планируем скорый выход на рынок. Реализация местами еще сырая, но мы стараемся тестировать решение с фокус-группой профессионалов, работающих с презентациями, чтобы выработать лучшие решения, удобные для них. У нас получилось выиграть небольшой студенческий грант на реализацию, это поможет нам оплатить сервера и работу разработчиков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мигрировать на Node.js 22 без рисков: инструкция</title>
      <link>https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya</link>
      <comments>https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Гринь]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya</guid>
      <description><![CDATA[<p>Node.js 22 стал надёжным стандартом для компаний, которым важно сохранить стабильность после завершения поддержки прежних версий. Разберём практические шаги по безопасной миграции. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya">Как мигрировать на Node.js 22 без рисков: инструкция</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 14 Dec 2025 12:40:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Node.js 22 сегодня становится дефолтным выбором для компаний, которые откладывали обновление годами. Вокруг этой версии сформировалась зрелая экосистема, а крупные команды уже успели протестировать релиз в продакшене. Разберём, что думают разработчики о платформе и какие подводные камни вас ждут при миграции.</p><h2>Почему релиз Node.js 22 важен</h2><p>30 апреля 2025 года завершился жизненный цикл версии Node.js 18. Сообщество заранее предупреждало об этом через официальный аккаунт в X. Там напомнили разработчикам о необходимости перейти на более свежие версии — Node.js 20 или 22. Восемнадцатая версия перестала получать патчи безопасности, поэтому обновление стало критичным для поддержания стабильной работы приложений.</p><p>Наиболее надёжным вариантом стала миграция на Node.js 22, которая сейчас находится в статусе долгосрочной поддержки (LTS) и гарантирует обновления безопасности и стабильность на ближайшие годы.</p><p>Хотя релиз этой версии не выглядел революционным, он существенно изменил основу платформы. Многие возможности, которые раньше требовали внешних библиотек, теперь встроены прямо в платформу: WebSocket-клиент, стабильный fetch(), работа с файлами, Blob и URL, улучшенная совместимость ESM и CommonJS. Это уменьшает количество зависимостей, снижает вероятность уязвимостей и значительно упрощает поддержку проектов.</p><p>Помимо удобства разработки, в новой версии усилились производительность и безопасность. Обновлённый движок V8 ускоряет выполнение кода, а оптимизация старта и снижение потребления памяти делают Node.js более стабильным в высоконагруженных и serverless-сценариях. Улучшенная модель разрешений, строгие настройки TLS и расширенная поддержка AbortController повышают защиту на уровне рантайма, ограничивая последствия уязвимостей в сторонних пакетах. Это даёт компаниям возможность строить более надёжные сервисы с меньшими затратами на контроль рисков и эксплуатацию.</p><p>Node.js 22 также стал удобнее для работы гибридных команд. Стабильная интеграция ESM и CommonJS облегчает миграцию старых проектов, а унификация Web-API делает код универсальным и понятным даже для сотрудников без глубокого опыта в бэкенде. Улучшенные инструменты тестирования и диагностики повышают прозрачность разработки и снижают время на нахождение ошибок.</p><blockquote>Node.js 22 — эволюционный релиз. Он развивает ранее введённые возможности (fetch, ESM, WebSocket и др.), но не переворачивает парадигму разработки. Это укрепление уже заданного курса.</blockquote><h2>Возможности Node.js 22</h2><p><b>Расширение JavaScript и обновление V8.</b> Получив движок V8 12.x, Node.js подтянул все улучшения ECMAScript 2024. Код стал исполняться быстрее как за счёт оптимизаций в компиляторе, так и благодаря улучшенной работе с асинхронностью. Например, async/await теперь обрабатываются эффективнее, а создание структур данных, активно используемых в серверах, стало менее затратным.</p><p>С точки зрения разработчика изменения могут быть неочевидны, но приложения на реальной нагрузке выполняются быстрее, стабильнее и предсказуемее.</p><p><b>Corepack включён по умолчанию.</b> До выхода Node.js 22 разработчики сами решали, подключать ли Corepack. Теперь он активен без дополнительной настройки, и это серьёзное изменение в экосистеме. Все менеджеры пакетов контролируются единой прослойкой, что устраняет зависимость от версии, установленной глобально у разработчика или в CI.</p><p>На практике это означает, что версия менеджера пакетов становится частью проекта и перестаёт зависеть от среды. Ошибки вида «у меня работает, а у коллеги нет» заметно сокращаются. Благодаря этому процессы разработки и сборки становятся стабильнее.</p><blockquote>Corepack, как мне кажется, сильно упростит жизнь большим командам. Исчезает вечная история “а у меня Yarn другой версии” или “Pnpm не подтянулся”. Corepack берёт на себя управление версионированием менеджеров пакетов, а значит, сборки становятся более воспроизводимыми. Для корпоративных проектов это плюс, особенно если речь идёт о распределённых командах или CI/CD-конвейерах.</blockquote><p><b>WebSocket API и улучшенные Web Streams.</b> Node.js 22 внедрил нативную поддержку WebSocket API. Теперь можно создавать WebSocket-клиенты и серверы без сторонних библиотек вроде ws. Это делает код чище и ближе к браузерному API.</p><p>Параллельно были улучшены Web Streams. Работа с потоками стала предсказуемой, а инструменты вроде CompressionStream и DecompressionStream функционируют так же, как и в современных браузерах. Поддержка универсального кода — сервер + клиент — стала проще, а объём внешних зависимостей уменьшился.</p><p><b>Улучшения в работе CommonJS и ESM.</b> Node.js постепенно движется в сторону ESM, но у огромного количества проектов всё ещё используется CommonJS. В новой версии улучшена производительность смешанных проектов и сокращены ошибки при импорте модулей между двумя системами. Между ними появилось меньше «подводных камней», а значит миграция на ESM может идти постепенно, без ломки архитектуры.</p><p><b>Стабильный встроенный fetch().</b> Его реализация теперь полностью совпадает с браузерной, так что в простых кейсах можно отказаться от axios или node-fetch. Меньше зависимостей — быстрее запуск и меньше технического долга.</p><p><b>Развитие модели разрешений</b>, которая позволяет ограничивать доступ приложения к файловой системе, сети или переменным окружения прямо на уровне рантайма. Даже если зависимость уязвима, код не сможет выйти за пределы разрешённых прав. Это огромный шаг в сторону реальной безопасности.</p><blockquote>Я бы отметил более зрелую работу с Permission Model. Она уже не экспериментальная и реально помогает ограничивать доступ к файловой системе и сети. Параллельно улучшилась производительность V8, а вместе с ней и общая отзывчивость серверных приложений. Подтянули и Web-стек: стабильнее стали Web Streams, Request/Response и другие API, которые сближают Node с браузерами. Всё это не революция, но тренд на унификацию растёт.</blockquote><p><b>Расширенные возможности тестирования.</b> Node.js продолжает развивать встроенный тестовый фреймворк node:test. Теперь доступны кастомные репортеры, покрытие кода без внешних инструментов и mock timers (замена реальной работы таймеров). Это позволяет использовать встроенный тест-раннер для большинства задач, отказавшись от Jest или Vitest в простых проектах.</p><p><b>Обновления в безопасности.</b> Обновление OpenSSL — одно из самых чувствительных изменений в релизе. Поддержка старых криптоалгоритмов исключена, проверка сертификатов стала строже, а взаимодействие по TLS 1.3  стабильнее.</p><blockquote>С точки зрения безопасности рывка не произошло, но заметное движение есть: Permission Model, улучшенная работа с OpenSSL, более аккуратная валидация входящих данных. Всё это снижает риски, но полностью опасность не снимает, потому что реальная безопасность всё равно лежит в архитектуре, процессов CI/CD и культуре разработки.</blockquote><p><b>Повышенная производительность.</b> Заметные улучшения коснулись старта приложения, работы с памятью и производительности под нагрузкой. Приложения запускаются быстрее, а распределение нагрузки между worker threads стало более эффективным. Это позволит обслуживать больше запросов при тех же ресурсах и уменьшить расходы на инфраструктуру.</p><p><b>Международные стандарты и локализация.</b> Были обновлены Intl API на базе новой версии ICU. Преимущества: точные часовые пояса, поддержка новых календарей и систем чисел. Это критично для глобальных SaaS-платформ, аналитических сервисов и финтех-продуктов.</p><p>По словам Даниила Гоника, для разработчиков наиболее значимы такие изменения, как WebSocket-клиент, модульная система., обновление V8, улучшение JIT-компиляторов, добавление новых возможностей JS и улучшение встроенного test-раннера.</p><h2>Как безопасно мигрировать на Node.js 22</h2><p>Переход лучше начинать с <b>аудита и подготовки окружения</b>. Сначала стоит убедиться, что все зависимости поддерживают Node.js 22. Особенно это касается библиотек, которые используют нативные модули, криптографию и WebSockets. Проверка совместимости позволит избежать неожиданностей вроде ошибок компиляции или падений при запуске.</p><p>После этого нужно прогнать <b>тесты</b>. Даже минимальный набор позволит выявить проблемы, связанные с изменениями в ESM/CJS, WebSocket API или OpenSSL.</p><p>Само <b>обновление среды</b> зависит от выбранного инструмента. Через nvm или n процесс занимает секунды, а для Docker достаточно указать новый базовый образ. Если проект использует CI/CD, стоит уделить внимание Corepack: теперь он активен всегда, что может изменить поведение сборки.</p><p>После обновления полезно <b>проверить логи</b> и внимательно <b>изучить предупреждения</b>. Большинство проблем решается установкой последних версий библиотек, иногда — правкой конфигурации TLS или обновлением менеджера пакетов.</p><p>Обновление стоит внедрять поэтапно, начиная со staging или частичного продакшена, и держать готовность к откату.</p><blockquote>Я обычно советую подход двухконтурного обновления. Сначала поднять проект на 22-ю версию в отдельной среде, включить максимальный объём логов, запустить тесты и прогнать реальные сценарии. Потом обновить линтеры, сборщики и самые старые пакеты, чтобы убрать накопленные за годы предупреждения. И только когда всё стабильно, имеет смысл переключать продакшен. По сути, обновление Node нужно делать так же аккуратно, как обновление облачных сервисов: через изоляцию, наблюдаемость и бэкап-стратегию.</blockquote><blockquote>В Node.js 22 удалены некоторые устаревшие, малоиспользуемые функции, поэтому при переходе может потребоваться рефакторинг мест, где они использовались. Следует проверить депрекейты: Node.js 22 помечает ряд старых возможностей как устаревшие и предлагает альтернативы. Необходимо убедиться, что все библиотеки и пакеты, используемые проектом, поддерживают новую версию Node.js.<br />При скачке сразу с 18/20 на 22 некоторые зависимости могут оказаться несовместимыми с обновлённым движком V8 или новыми APIs — может понадобиться их обновление до последних версий.</blockquote><h2>Кому стоит подождать с переходом</h2><p>Переход на Node.js 22 подходит не всем проектам. В некоторых ситуациях разумнее подождать, чтобы избежать регрессий и поломок в продакшене. Вот кому стоит повременить с переходом:</p><ul><li>Тем, кто использует инструменты сборки или менеджеры пакетов, которые ещё не совместимы с Node.js 22 и могут выдавать ошибки или не работать вовсе.​</li><li>Командам, которые работают на старых версиях ОС. Известны проблемы совместимости с macOS 10.14 и ниже, а также возможны ошибки на Windows при миграции старых приложений.​</li><li>Тем, чьи CI/CD, контейнеры или Docker-образцы завязаны на конкретные версии Node.js и npm. Переход на 22-ю версию требует много регрессионного тестирования.​</li><li>Проектам с критически важными C++-добавками. Смена major-версии влечёт за собой обновление бинарных интерфейсов, что может вызывать ошибки при компиляции нативных модулей.</li><li>Пользователям определённых интеграций. Для некоторых версий MongoDB‑драйверов зафиксированы фатальные баги после перехода на конкретные промежуточные версии Node.js 22.x.​</li><li>Если вы используете проекты, которые сами рекомендуют Node.js 18 или 20, а обновление их зависимостей под 22 только планируется.</li></ul><blockquote>В продакшене чаще всего проблемы возникают не из-за самих изменений в платформе, а из-за того, как эти изменения проявляются в реальных проектах. Где-то обновился V8 и стал вести себя строже, где-то повылезали deprecated-модули, а где-то просто сломались сборщики или старые зависимости. Многие команды до сих пор живут на Webpack 4, Express 4 или TypeORM старых версий: вот они первыми столкнутся со сложностями.</blockquote><h2>Что дальше</h2><p>Среди будущих трендов в экосистеме <a href="http://node.js/">Node.js</a> Максим Захаренко выделяет следующие: <i>«Первое — постепенное сближение Node с Web-стеком, чтобы код становился максимально универсальным. Второе — рост влияния Bun и Deno, которые будут подталкивать Node к более агрессивной оптимизации. И третье — всё более активная интеграция с AI-инструментами, особенно в DevTools и в цепочках генерации кода»</i>.</p><blockquote>Всё больше веб-API внедряются в Node.js (fetch, WebSocket, EventTarget). Этот тренд будет продолжаться. ESM становится стандартом, поддержка будет расширяться, CommonJS постепенно уйдёт в прошлое. Расширяется WASI и поддержка WASM-модулей. Node.js движется в сторону мульти-языковой среды. Модель прав доступа и другие sandbox-механизмы также продолжат развиваться. Кроме того, в версии Node.js 22.5.0 экспериментально добавлен встроенный модуль SQLite (через –experimental-sqlite). Это важное уточнение: в релизе 22.0.0 SQLite отсутствовал.</blockquote><p>Даниил Гоник хотел бы увидеть в будущих релизах стабильную и удобную модель разрешений, возможность require() для ESM без флагов, улучшения в DevX: поддержка TS «из коробки», больше инструментов в ядре, расширение SEA (Single Executable Apps) и встроенные механизмы верификации зависимостей (подписи, integrity).</p><h2>Выводы</h2><p>Node.js 22 делает приложения быстрее, безопаснее и совместимее с Web API, улучшает работу с памятью и снижает зависимость от глобальных инструментов. Хотя переход требует подготовки, он не представляет серьёзных рисков, если следовать базовой процедуре: проверить зависимости, прогнать тесты и обновить среду постепенно. Если инфраструктура современная, а стек устойчивый, переход на Node.js 22 принесёт ощутимые преимущества как в скорости работы, так и в удобстве разработки.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 опенсорс-инструментов для повседневной работы разработчика</title>
      <link>https://tproger.ru/articles/5-opensors-instrumentov-dlya-povsednevnoj-raboty-razrabotchika</link>
      <comments>https://tproger.ru/articles/5-opensors-instrumentov-dlya-povsednevnoj-raboty-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-opensors-instrumentov-dlya-povsednevnoj-raboty-razrabotchika</guid>
      <description><![CDATA[<p>Для работы с видео, паролями, серверами, торрентами и защиты экрана от любопытных глаз.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-opensors-instrumentov-dlya-povsednevnoj-raboty-razrabotchika">5 опенсорс-инструментов для повседневной работы разработчика</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Видеоконтент]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Dec 2025 12:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рабочий день программиста состоит не только из написания кода. Нужно управлять серверами, скачивать видео для обучения, хранить секреты проектов, работать с торрент-архивами документации и защищать конфиденциальные данные на экране. Для каждой из этих задач есть готовые решения, но часто они либо платные, либо требуют облачной подписки, либо закрыты.</p><p>Мы собрали пять свободных инструментов, которые решают типичные задачи разработчика: от скачивания видео с любых сайтов до защиты от подглядывающих коллег. Все они работают локально или self-hosted, не отправляют данные в облако и распространяются с открытым исходным кодом.</p><p>Больше подобных находок — в тг-канале <a href="https://t.me/+P6xe2tVbQWU2NDhi">Инструменты программиста</a>. Там каждый день появляются свежие CLI-утилиты, GUI-приложения, библиотеки и сервисы для разработки. Всё протестировано, с примерами использования и ссылками на репозитории.</p><h2>GUI для скачивания видео: yt-channel-downloader</h2><p><a href="https://github.com/hyperfield/yt-channel-downloader/">yt-channel-downloader</a> — графическое приложение для скачивания видео с YouTube и любых других сайтов, где есть видеоконтент. Это не только видеохостинги: если на странице есть видео, приложение попытается его скачать.</p><p>Под капотом работает связка из трёх Python-библиотек: yt-dlp для универсального парсинга, scrapetube для работы с каналами и плейлистами, pytube как вспомогательный инструмент. Поверх этого — кроссплатформенный графический интерфейс для Windows, macOS и Linux.</p><p>Как это работает: вводите ссылку на видео, плейлист или целый канал. Приложение подтягивает список доступных роликов и даёт выбрать, что именно качать — целиком или выборочно. Можно скачать только аудиодорожку или выбрать конкретное качество видео.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-11/638e1ddb-0815-4e1a-8919-178e91ef38d5.jpeg" alt="" /></figure><p>Полезные особенности:</p><ul><li>Вход в аккаунт YouTube прямо из приложения. Это позволяет скачивать приватные ролики, доступные только по ссылке или для авторизованных пользователей. Куки хранятся в локальном конфиге и автоматически очищаются при выходе из аккаунта.</li><li>Пометка уже скачанных файлов. Не нужно вручную проверять, что уже есть на диске.</li><li>Ограничение параллельных потоков. Если качаете большой плейлист, можно задать лимит одновременных загрузок, чтобы очередь не подвисала и не перегружала канал.</li></ul><p>Для работы нужен установленный ffmpeg — он используется для конвертации и склейки потоков. Для пользователей Windows доступен <a href="https://github.com/hyperfield/yt-channel-downloader/releases">готовый инсталлятор в разделе Releases</a> (размещён на SourceForge).</p><p>Код и инструкции по установке — <a href="https://github.com/hyperfield/yt-channel-downloader/">на GitHub</a>. В планах у автора: поддержка скачивания YouTube Shorts, поиск по полученному списку видео, более наглядный прогресс-бар, история загрузок и расширенная поддержка других видеоплощадок.</p><h2>gopass — менеджер паролей для разработчиков</h2><p><a href="https://github.com/gopasspw/gopass">gopass</a> — консольный менеджер паролей, заточенный под командную работу и версионирование. Все секреты хранятся в виде файлов, шифруются через GPG и версионируются в Git. Вы можете держать их локально, синхронизировать через любой git-ремоут (GitHub, GitLab, собственный сервер) и при этом всегда иметь историю изменений.</p><p>Рабочий цикл выглядит консольно и привычно для разработчиков. Из терминала вы листаете хранилище командой gopass ls, смотрите конкретный пароль через gopass show, генерируете новый — gopass generate. Копирование в буфер обмена тоже работает из командной строки, что удобно для скриптов и автоматизации.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-11/a7518a77-b4b1-47a5-8b0f-1e4bcb19061c.jpeg" alt="" /></figure><p>Поверх базовой функциональности есть плагины:</p><ul><li>gopass-bridge — интеграция с браузером. Позволяет автоматически заполнять формы входа без копирования паролей вручную.</li><li>Помощь с Git-кредами. gopass может выступать credential helper для Git, так что пароли от репозиториев тоже хранятся зашифрованными и версионируются.</li><li>Проверка через Have I Been Pwned. Можно проверить, не утекли ли ваши пароли в публичные базы.</li></ul><p>GPG обеспечивает асимметричное шифрование: секреты зашифрованы вашим публичным ключом, приватная часть не покидает машину. Если работаете в команде, достаточно добавить GPG-ключи коллег в хранилище — каждый сможет расшифровать общие секреты своим приватным ключом. При этом никто не видит приватных ключей других участников.</p><p>gopass написан на Go, поэтому работает на macOS, Linux и Windows без дополнительных зависимостей. Настройка сводится к созданию git-репозитория с зашифрованными файлами и клонированию его на рабочие машины. Один репозиторий — доступ с любого устройства.</p><p><a href="https://github.com/gopasspw/gopass">Код в репозитории</a>, документация подробная, есть примеры для всех основных сценариев использования.</p><h2>Self-hosted SSH-клиент: Termix</h2><p><a href="https://github.com/Termix-SSH/Termix">Termix</a> — полностью опенсорсная и self-hosted альтернатива Termius для управления серверами по SSH через единый веб-интерфейс. Разворачивается в Docker как бэкенд, синхронизируется с клиентами под веб, Windows, Linux, macOS, iOS и Android.</p><p>Ключевые возможности:</p><ul><li>SSH-терминал с вкладками и сплитами. Можно открыть до 4 панелей одновременно, переключаться между сессиями, кастомизировать тему оформления и шрифты. Всё работает через браузер или нативное приложение.</li><li>SSH-туннели с автопереподключением. Настраиваете туннель один раз, система сама восстанавливает соединение при обрывах и отслеживает состояние туннелей в реальном времени.</li><li>Файловый менеджер поверх SSH. Можно просматривать и редактировать код прямо в интерфейсе, смотреть картинки, слушать аудио, проигрывать видео, загружать и выгружать файлы, выполнять операции копирования, перемещения, удаления — всё без отдельного SFTP-клиента.</li><li>Менеджер хостов. Организация серверов по тегам и папкам, автоматическая заливка SSH-ключей на хосты, безопасное хранение логинов и паролей в зашифрованной базе.</li><li>Мониторинг. Для любого подключённого сервера можно посмотреть загрузку CPU, память, диск, сеть, аптайм и системную информацию. Есть дашборд с общим обзором по всем хостам.</li></ul><p>Под капотом: веб-клиент собран на React + Tailwind + Shadcn, бэкенд работает с зашифрованной базой SQLite, автоматическая настройка SSL-сертификатов, вход через OIDC и двухфакторная аутентификация (TOTP). Интерфейс поддерживает несколько языков.</p><p>Проект распространяется под Apache 2.0. Основной способ установки — docker-compose с томом для данных, всё настраивается за пару минут. Для десктопа и мобильных устройств доступны нативные сборки и приложения в официальных сторах под все основные платформы.</p><p><a href="https://github.com/Termix-SSH/Termix">Код в репозитории</a>, на скриншотах видно, как выглядит интерфейс — аккуратно, функционально, без лишних элементов.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-11/ae32f5b2-ef82-4e08-9018-270c5eaccfa6.jpg" alt="" /></figure><h2>TUI-клиент для торрентов: Torrra v2</h2><p><a href="https://github.com/stabldev/torrra">Torrra</a> — TUI-клиент для поиска и скачивания торрентов прямо из консоли, без браузера и без отдельного GUI-приложения. Написан на Python, интерфейс собран на библиотеке Textual, так что всё выглядит аккуратно и отзывчиво даже в терминале.</p><p>Можно подключаться к своим индексаторам Jackett или Prowlarr, смотреть результаты поиска и выбирать, чем качать. Есть два режима: через встроенный движок на базе libtorrent или передать magnet-ссылку во внешний торрент-клиент (Transmission, qBittorrent и так далее).</p><p>Автор утверждает, что во второй версии серьёзно ускорил UI, улучшил навигацию по спискам, прокачал поиск и добавил возможность работы с несколькими торрентами одновременно. Плюс почистил интеграцию с индексаторами и отполировал раскладку интерфейса — теперь всё помещается в стандартное окно терминала без скроллинга.</p><p>Установить можно несколькими способами:</p><ul><li>Через pipx: pipx install torrra</li><li>Из AUR для пользователей Arch Linux</li><li>Через Homebrew на macOS</li><li>Docker-образ для изолированного запуска</li><li>Готовые бинарники под Linux, macOS и Windows</li></ul><p>После установки минимальный сценарий работы такой: поднимаете Jackett или Prowlarr (это отдельные сервисы для агрегации торрент-индексаторов), запускаете</p><p>Дальше стрелками ходите по списку результатов, Enter — начать скачивание, p — пауза, r — продолжить, q — выйти из программы.</p><p>Поведение можно подкрутить через файл config.toml: задать дефолтные индексаторы, пути для сохранения файлов, какие клиенты использовать для загрузки, чтобы каждый раз не вбивать одно и то же в аргументах командной строки.</p><p>Проект кроссплатформенный (Linux/macOS/Windows) и активно развивается: есть подробная документация, регулярные релизы, автор отвечает на issues. <a href="https://github.com/stabldev/torrra">Код в репозитории</a>, на видео можно посмотреть демонстрацию работы.</p><h2>Защита от подглядывания: EyesOff для macOS</h2><p><a href="https://github.com/YM2132/EyesOff">EyesOff</a> — приложение для macOS, которое следит через веб-камеру и предупреждает, когда кто-то подглядывает в ваш экран. Актуально для работы в опенспейсах, коворкингах или просто дома, когда не хочется, чтобы кто-то читал ваш код или переписку через плечо.</p><p>Написано на Python + PyQt, модель распознавания лиц крутится локально на вашем Mac — ничего не уходит в облако, никакие кадры не сохраняются. Есть три режима оповещения на выбор:</p><ul><li>Попап на экране — появляется окно с предупреждением, что кто-то смотрит.</li><li>Системная нотификация — более деликатный вариант, уведомление в углу экрана.</li><li>Автозапуск приложения — можно настроить, чтобы автоматически запускалась блокировка экрана или любое другое приложение.</li></ul><p>Автор написал <a href="https://ym2132.github.io/building_EyesOff_part2_model_training">подробный разбор</a> того, как тренировал модель детекции. Интересный момент: он оптимизировал accuracy не в среднем по всем дистанциям, а конкретно для mid-range (~1-2 метра) — именно там обычно стоят любопытные коллеги. На близких дистанциях (менее метра) и дальних (более трёх метров) точность может быть ниже, но это компромисс ради производительности и практичности.</p><p>Есть одно ограничение: приложение пока детектит просто наличие лиц в кадре, а не направление взгляда. То есть если человек в кадре, но смотрит в сторону или на свой телефон, EyesOff всё равно сработает. Автор обещает доработать определение направления взгляда в следующих версиях, но для большинства сценариев текущей логики достаточно.</p><p>Для параноиков и тех, кто работает с конфиденциальными данными в публичных местах, это полезный инструмент. Код открыт, можно посмотреть, как именно работает детекция, и убедиться, что никакие данные не утекают.</p><p>Все пять инструментов объединяет один принцип: контроль над своими данными. Вы не зависите от подписок, облачных сервисов или закрытых платформ. Каждый из них решает конкретную задачу, делает это хорошо и не требует доверять кому-то свои пароли, SSH-ключи или видео с камеры. Код открыт, можно проверить, как всё устроено, и при желании — доработать под свои нужды.</p>]]></content:encoded>
    </item>
    <item>
      <title>Генерируем CRUD для gRPC по схеме БД следуя Google AIP</title>
      <link>https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd</link>
      <comments>https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Украинский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd</guid>
      <description><![CDATA[<p>Как с помощью db-exporter автоматизировать процесс генерации CRUD-операций для gRPC, соблюдая стандарт Google AIP</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd">Генерируем CRUD для gRPC по схеме БД следуя Google AIP</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[gRPC]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 20 Nov 2025 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>К сожалению, жизнь разработчика не всегда полна сложными и интересными задачами, время от времени мы все-таки пишем CRUD'ы.</p><p>Задача в целом проста:</p><ol><li>Открыть структуру таблицы</li><li>Скопировать названия колонок</li><li>Соотнести типы, которые существуют в спецификации (gRPC, OpenAPI, и т.п.)</li><li>Описать API метод</li><li>Проверить на соответствие стайл-гайду</li></ol><p>Но это утомительно и отнимает драгоценное время разработчиков. Данную  инструкцию за нас может выполнить инструмент <b>db-exporter. </b>В этой статье рассмотрим, как с его помощью автоматизировать процесс генерации CRUD-операций для gRPC, соблюдая <a href="https://google.aip.dev/121">стандарт</a> Google AIP по ресурсно-ориентированному дизайну.</p><p>В последующих разделах мы подробно рассмотрим:</p><ul><li>Принцип работы db-exporter</li><li>Процесс настройки и конфигурации</li><li>Примеры генерации различных типов операций</li><li>Валидацию сгенерированных proto файлов</li><li>Как внедрить инструмент для постоянной работы с ним</li></ul><h2>Знакомимся с инструментом</h2><p>db-exporter — это Open Source утилита для генерации кода и документации к схеме базы данных. «Экспортировать» можно в различные распространенные форматы: диаграмма классов, protobuf, код на Go и другие. На данный момент инструмент поддерживает PostgreSQL и MySQL. Реализована поддержка основных операционных систем. Инструмент достаточно молодой и активно развивается.</p><figure><img src="https://media.tproger.ru/user-uploads/133667/2025-10-31/fefdf04a-7291-41f2-9722-23a28266595f.png" alt="" /><figcaption>Принцип работы db-exporter</figcaption></figure><p>Для начала работы с db-exporter необходимо скачать его со страницы релизов. Далее разархивировать и переместить в /usr/local/bin. Или выполнить всё одной командой.</p><p><b>Mac OS</b></p><p><b>Linux</b></p><p>Теперь у нас установлен инструмент и мы почти готовы его запускать, но перед этим разберемся, составим пример таблицы, над которой будем проводить эксперименты.</p><h2>Составим пример</h2><p>Договоримся, что нашим примером для генерации кода будет являться таблица пользователей. У пользователей есть: id, имя, отчество, дата создания, статус (активен, заблокирован) и дата удаления.</p><p>Итого, схема выглядит так:</p><p>Данного примера достаточно для того, чтобы рассмотреть ключевые моменты:</p><ul><li>Генерация первичных ключей (поле id)</li><li>Генерация опциональных полей (поле middle_name)</li><li>Генерация временных меток (поля created_at, deleted_at)</li><li>Генерация енамов (поле status, енам user_status)</li><li>Работа с soft-delete</li></ul><h2>Генерируем protobuf</h2><p>Для того, чтобы запустить db-exporter необходимо описать конфигурацию —делается это декларативно, в yaml-файле. db-exporter оперируют задачами, в которых описаны:</p><ul><li>Формат, в котором нужно выполнить генерацию. В нашем случае — это grpc-crud<br /></li></ul><ul><li>Директория, в которую сохранить файлы</li><li>Специфичные формату параметры (далее: спека задачи)</li></ul><p>Также важно не забыть указать подключение к базе данных. В нашем примере, используется PostgreSQL на 5432 порту. Для успешного запуска стоит убедиться, что БД запущена и в ней есть схема с таблицами.</p><p>Итого, конфигурация, описывающая перечисленные требования, выглядит следующим образом:</p><p>Сохраняем этот файл, как .db-exporter.yaml.</p><p>Далее запускаем инструмент, выполняя команду db-exporter и получаем отчет о проделанной работе — db-exporter сообщает о том, какие файлы были созданы и какой они имеют вес.</p><figure><img src="https://media.tproger.ru/user-uploads/133667/2025-11-10/8ccb11d3-2595-4782-95ef-d920d8f76a0c.png" alt="" /><figcaption>Результат выполнения db-exporter</figcaption></figure><h3>Разбираемся, что получили на выходе</h3><p>В результате выполнения команды был сгенерирован файл users.proto, в котором используется синтаксис соответствует proto3. Файл содержит:</p><ul><li><b>UsersService</b> с методами <i>List</i>, <i>Get</i>, <i>Delete</i>, <i>Undelete</i>, <i>Create</i>, <i>Patch</i></li><li>Сообщение <b>User</b>, отражающее таблицу users</li><li>Енам <b>UserStatus</b></li></ul><h4>Сообщение User и enum UserStatus</h4><p>Сообщение User отражает структуру таблицы users и имеет вид:</p><p>Что здесь видим?</p><ol><li>id<i> </i>- uuid'ы генерируются, как строки. Первичный ключ помечается, как OUTPUT_ONLY, говоря о том, что поле используется только для ответов.</li><li>name, email сгенерированы, как строки</li><li>Поля created_at, deleted_at обернуто в гугловый Timestamp<i><br /></i></li><li>Для статуса пользователя сгенерирован енам UserStatus</li></ol><p>UserStatus выглядит следующим образом</p><h4>Метод для получения списка пользователя</h4><p>Метод List принимает на вход ListUsersRequest и возвращает ListUsersResponse</p><p>Запрос включает в себя поле с массивом идентификаторов пользователей. db-exporter добавляет в тело запроса первичный ключ, если первичный ключ состоит из одного поля. Также в запросе присутствует флаг <i>show_deleted</i>, как того требует стандарт <a href="https://google.aip.dev/132">AIP-132</a>, при работе с сущностями, поддерживающими soft-delete: по умолчанию сервер возвращает список активных пользователей, например, используя sql-запрос с фильтром deleted_at is null.</p><p>По умолчанию db-exporter добавляет token-based пагинацию, описанную в <a href="https://google.aip.dev/158">AIP-158</a>. Такая пагинация удобна для межсервисного взаимодействия. Но если основной клиент вашего API — это фронтенд, то вероятнее всего, вам нужна офсетная пагинация. Ее можно включить, добавив в спеку задачи pagination: offset. Если пагинация уж совсем не требуется, то pagination: none.</p><p>В ответе же список пользователей и токен следующей страницы.</p><h4>Метод получения пользователя</h4><p>Стандарт <a href="https://google.aip.dev/131">по получению ресурса</a> описывает достаточную простую конструкцию — Метод Get принимает на вход GetUserRequest и отдает на выход сообщение User.</p><p>Тело запроса включает в себя поле id, так как оно является первичным ключом.</p><h4>Методы удаления и восстановления пользователя</h4><p>Стандарт <a href="https://google.aip.dev/164">AIP-164</a> гласит: мало того, что сущность удаляется методом <b>Delete</b>, так еще нужно и мочь ее восстанавливать с помощью метода <b>Undelete</b>, если таблица поддерживает soft-delete.</p><p>Поэтому в результате генерации мы получаем методы Delete и Undelete: db-exporter самостоятельно определяет поддержку soft-delete у таблиц, смотря на поля <i>deleted_at</i> и <i>delete_time</i>.</p><p>Метод <b>Delete</b> принимает на вход DeleteUserRequest и отдает на выход DeleteUserResponse. Метод <b>Undelete </b>принимает UndeleteUserRequest и возвращает восстановленный ресурс User.</p><p>Тела запросов также, как и для метода Get, содержат поле первичного ключа — id.</p><p>По умолчанию возвращается <i>google.protobuf.Empty</i>, как требуется в стандарте<i>. </i>Возможна генерация пустого сообщения<i> DeleteUserResponse </i>— для этого нужно добавить параметр в спеку:</p><h3>Методы создания и обновления пользователя</h3><p>По стандартам <a href="https://google.aip.dev/133">AIP-133</a> и <a href="https://google.aip.dev/134">AIP-134</a> методы<b> Create</b> и <b>Update</b> имеют похожие сигнатуры.</p><p>Тела запросов также схожи, включают в себя ресурс User и возвращают его обновленную версию.</p><p>По стандарту поле update_mask предполагается использовать для частичного обновления сущности. <b>FieldMask</b> содержит в себе список полей, которые необходимо обновить у сущности User.</p><h3>Добавляем HTTP пути к методам</h3><p>В gRPC есть полезная опция <i>google.api.http</i>, с помощью которой можно указать HTTP адрес для метода. Ее полезно использовать, если вы используете REST поверх gRPC сервисов — например, с помощью grpc-gateway.</p><p>Наверняка, мы хорошие разработчики и версионируем свой API: установим версию v1 в параметре path_prefix.</p><p>И получаем вот такой результат:</p><h2>Валидируем результат</h2><p>Теперь, когда у нас есть файл users.proto — важно проверить, что он корректен синтаксически. Для этого соберем go-клиент, используя утилиту protoc.</p><h3>Указываем Go пакет</h3><p>Выше мы обсуждали gRPC контракты без привязки к конкретному стеку. Ну что ж, время пришло!</p><p>Для генерации Go-клиента в .proto файле необходимо указать опцию <b>go_package</b>. Мы можем сами поправить .proto файл, но при частом использовании db-exporter это будет не так удобно, поэтому скажем экспортеру, какой пакет нам нужен. Для этого нужно указать опцию в спеке задачи .db-exporter.yaml:</p><p>Нам остается еще раз сгенерировать users.proto, используя уже знакомую команду db-exporter.</p><h3>Собираем зависимости</h3><p>Сгенерированный users.proto импортирует зависимости <i>google.api </i>для указания HTTP методов/путей, обязательности полей. Их можно скачать с GitHub <i>googleapis</i>: <a href="https://github.com/googleapis/googleapis/blob/master/google/api/http.proto">http.proto</a>, <a href="https://raw.githubusercontent.com/googleapis/googleapis/refs/heads/master/google/api/field_behavior.proto">field_behavior.proto</a> и <a href="https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto">annotations.proto</a>.</p><p>Скачать зависимости можем следующим скриптом:</p><p>Итого мы должны были организовать следующую структуру файлов:</p><p>Теперь запустим генерацию гошного кода:</p><p>В результате выполнения команды в наш проект добавились 2 новых файла:</p><ul><li>pkg/api/users.pb.go — структуры для ресурса, запросов и ответов</li><li>pkg/api/users_grpc.pb.go — rpc-сервис UserService и клиент к нему</li></ul><p><b>Вывод</b>: из сгенерированного db-экспортером .proto файла можно сгенерировать валидный програмнный код. Считаем проверку успешно выполненной</p><h2>Непрерывная генерация</h2><h3>Перезапись файлов</h3><p>Собранная нами конфигурация отлично подходит для «одноразовых генераций», но со временем, когда сервис обрастет новыми методами, использовать генератор будет неудобно из-за того, что он по умолчанию перезаписывает уже существующие файлы. Чтобы избежать такой ситуации, необходимо указать генератору, что мы не хотим перезаписывать файлы. Сделать это можно, добавив опцию <i>skip_exists</i>.</p><p>Теперь db-exporter не будет перезаписывать уже существующие файлы и будет генерировать только новые.</p><h3>Генерация лишних таблиц</h3><p>По умолчанию db-exporter генерирует файлы по всем таблицам из схемы БД. В проекте может десяток или десятки таблиц, не для всех из них нужна генерация CRUD-операций. Генератору можно передать список таблиц, по которым необходимо генерировать файлы.</p><p>Но править постоянно конфиг не очень удобно. Укажем переменную.</p><p>Теперь мы можем запускать генерацию по конкретным таблицам, например вот так:</p><p>Или обернуть это в Makefile:</p><p>Использовать эту конструкцию можно следующим образом:</p><h2>Что в итоге?</h2><p>В итоге мы собрали рабочую конфигурацию db-exporter, которая позволяет генерировать CRUD по схеме БД в валидный .proto файл, включая полезные опции: <i>google.api.field_behavior</i> и <i>google.api.http</i>. Собранную конфигурацию и необходимое окружение вы сможете найти по <a href="https://github.com/ArtARTs36/db-exporter/tree/master/examples/grpc-crud">этой ссылке</a>.</p><p>Надеюсь, этот пост был для вас полезным и поможет ускорить разработку крудов. Если у вас есть предложения по улучшению/расширению кодо-генератора, добро пожаловать в <a href="https://github.com/ArtARTs36/db-exporter">репозиторий</a>.</p><p>В репозитории вы также сможете найти примеры генерации диаграмм классов, mermaid, markdown и так далее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Мультиклауд-FinOps: как не разориться на нескольких облаках одновременно</title>
      <link>https://tproger.ru/articles/multiklaud-finops--kak-ne-razoritsya-na-neskolkih-oblakah-odnovremenno</link>
      <comments>https://tproger.ru/articles/multiklaud-finops--kak-ne-razoritsya-na-neskolkih-oblakah-odnovremenno?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Важенин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/multiklaud-finops--kak-ne-razoritsya-na-neskolkih-oblakah-odnovremenno</guid>
      <description><![CDATA[<p>Несколько облаков — не приговор бюджету. Рассказываем, как свести счета, поймать аномалии и выстроить FinOps-контроль в мультиклауде.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/multiklaud-finops--kak-ne-razoritsya-na-neskolkih-oblakah-odnovremenno">Мультиклауд-FinOps: как не разориться на нескольких облаках одновременно</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 14 Nov 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мультиклауд – важен, но сложен. Готовьтесь к этому.</p><p>Представим ситуацию: у вас три облака. Да, все российские (да и как же иначе?), но каждое работает по своим правилам. Одно считает трафик отдельной строкой в счете, второе как-то замешивает его в стоимость виртуалок, третье вообще берет фикс за месяц и не парится. Красота? Да нет, конечно! Потому что как все это складывать, решительно непонятно. Но вот был бы у вас FinOps, жить было бы куда легче. И дешевле.</p><h2>Почему компании используют несколько облаков одновременно</h2><p>Мультиклауд – это практика использования нескольких облаков для распределения нагрузки. Это не очень удобно с точки зрения унификации, но в таком подходе есть своя логика:</p><ul><li>Во-первых, если ложится одна площадка, то вторая может взять нагрузку на себя;</li><li>Во-вторых, разные провайдеры могут предлагать специализированные сервисы, которых нет у конкурентов.</li><li>В-третьих, регуляторные требования тоже вносят свои коррективы. Иногда данные просто обязаны лежать в конкретном облаке с нужными сертификатами, которых нет у других.</li></ul><p>У одной компании может быть и 3, и 4 площадки одновременно. Например, основа – это Яндекс Облако, VK Cloud – для экспериментов, Cloud.ru – для работы с госсектором. Конфигурации могут быть самые разные. Главное – суметь свести все расходы воедино и понять, на чем реально можно сэкономить, а на чем – нет.</p><p>Ведь если у вас десятки сервисов размазаны по всем площадкам, и каждая из них присылает данные в несопоставимых форматах, сложить это в единую картину с наскока может и не получиться.</p><p>Причем названия сервисов скорее всего тоже будут разные. То, что в Яндексе называется Object Storage, в VK Cloud может быть S3-совместимым хранилищем, а в Cloud.ru обозначаться как-то по-своему.</p><p>Из-за этого примерно треть организаций реально не понимают, куда конкретно уходят их облачные бюджеты. Они видят итоговую цифру в конце месяца, но не могут объяснить, как она складывается, и теряют на этом миллионы рублей.</p><h2>Проблемы миграции с AWS и Azure на российские облака</h2><p>В 2022 году западные провайдеры ушли с российского рынка довольно резко. AWS, Azure, Google Cloud просто закрыли возможность создавать новые ресурсы, а потом начали постепенно отключать существующих клиентов. У компаний было всего несколько месяцев на то, чтобы перенести всю инфраструктуру куда-то еще.</p><p>Поэтому переезжали кто во что горазд, не особо заботясь об оптимизации.</p><p>Первой проблемой, с которой сталкивались те, кто решил не отключаться от заграничного облака, – это расхождение планируемого и реального счетов, вызванные курсовой разницей. Если доллар рос, росли и счета. В итоге бюджет, утвержденный в начале квартала, к его концу мог банально превратиться в фикцию. Хеджировать такие риски и сложно, и дорого. Казалось, что проще уж полностью перейти на рублевые расчеты с российскими провайдерами.</p><p>На самом же деле сложностей от этого не убавилось. Поскольку 152-ФЗ предъявляет особые требования к хранению персональных данных, многим пришлось раскидывать нагрузку по нескольким облакам. Ведь важна не только территориальная принадлежность провайдера, но и наличие у него определенных сертификатов. Получается, что даже если вы нашли облако с хорошими ценами, использовать его для всех задач скорее всего было нельзя.</p><p>Но даже после этого счета скорее всего не уменьшились, а выросли, хотя нагрузка осталась той же.</p><p>Просто тарифы у местных провайдеров устроены чуть иначе, чем у зарубежных. В AWS можно было выгодно взять инстанс побольше с запасом по памяти, потому что разница в цене была небольшая. Но у наших та же логика могла привести к переплате в полтора раза. А поскольку многие переносили виртуалки один в один без оптимизации под нового провайдера, не пересчитывая конфигурации под реальную нагрузку, счета росли на 30-40%.</p><h2>Как спроектировать инфраструктуру для мультиклауда</h2><p>А ведь этих и других проблем можно было избежать, если изначально заложиться на работу с несколькими провайдерами. Вот три базовых правила мультиоблачности, которые нужно соблюдать:</p><ol><li>Не завязывайтесь на уникальные сервисы конкретного провайдера. Если компания активно использует фирменные managed-базы со специфичными настройками, сервисы ML, которые есть только у этого вендора, проприетарные API, переехать к другому без переписывания половины кода будет невозможно. Используйте стандартные решения там, где это возможно: PostgreSQL вместо фирменной базы, S3-протокол для хранения объектов, Kubernetes для контейнеров.</li><li>Описывайте инфраструктуру как код. Kubernetes + Terraform дают гибкость. Один раз описали инфраструктуру, развернули в Яндексе. Потом взяли тот же манифест, поменяли параметры провайдера – и без проблем развернули в VK Cloud. Правки будут, конечно: названия инстансов разные, зоны доступности называются по-другому. Но исправить это займет часы, но никак не месяцы.</li><li>Проверяйте отказоустойчивость на практике. Размазать нагрузку по трем облакам – это еще не мультиклауд. Задумывались ли вы, что будет, если основная площадка ляжет на часов эдак на 8? Как быстро переключится трафик? Кто это будет делать и по какой инструкции? Без подобных учений эти вопросы остаются без ответа до тех пор, пока не сломается что-то реально важное.</li></ol><h2>Кто в компании должен контролировать облачные расходы</h2><p>Хорошо, архитектуру продумали, провайдеров выбрали. Теперь вопрос: кто за все это отвечает?</p><p>Тут нет универсального ответа. <a href="https://t.me/finops_ru/156">Все зависит от размера компании</a> и того, насколько у вас вообще налажены процессы.</p><ul><li>В маленьких компаниях обычно один DevOps на все. Он и мониторит расходы, и общается с провайдерами, и поддерживает инфраструктуру. Просто потому что больше некому. Такой подход называется централизованным и работает до тех пор, пока проектов немного и бюджет считается на коленке. Но как только начинается рост, вся схема ломается. Человек физически не успевает отследить расходы по десяткам сервисов в трех облаках.</li><li>Крупные компании идут другим путем. Каждое подразделение получает свой бюджет и само решает, как его тратить. Маркетинг управляет своими аналитическими системами, разработка продукта своими, бэкенд-команда своими. Это федеративная модель. Тут главное, чтобы сверху были единые правила: как тегировать ресурсы, какие отчеты предоставлять, кто принимает решения о резервировании мощностей. Без этого получается хаос, где никто не знает, кто виноват в перерасходе.</li><li>Золотая середина – это гибридная модель. Она предполагает, что есть небольшая центральная команда, которая договаривается с вендорами, выбирает инструменты учета, пишет политики использования облаков. А исполнение остается за подразделениями. То есть центр задает стандарты, команды их выполняют.</li></ul><p>Как понять, что система работает нормально? Посмотрите, какой процент расходов вы можете объяснить. Если половина бюджета уходит непонятно куда, без привязки к проектам и командам, значит контроль не работает. В идеале вы должны быть способны объяснить буквально каждый рубль.</p><h2>Cost per unit и другие метрики для контроля облачных затрат</h2><p>Допустим, вы внедрили контроль расходов, назначили ответственных. Теперь надо понять: а работает ли это вообще? На какие цифры смотреть, чтобы увидеть реальную картину?</p><p>Начните с простого – посчитайте стоимость базовых действий в вашем сервисе:</p><ul><li>Одного письма</li><li>Одного заказа</li><li>Одного показа страницы пользователю</li></ul><p>Важно считать траты не за месяц, а именно за одно конкретное действие. Только тогда можно будет начать сравнивать провайдеров между собой и понять, что в одном облаке письмо стоит 2 копейки, в другом 5.</p><p>Дальше смотрим за динамикой. Если количество пользователей выросло вдвое, а счета за инфраструктуру втрое, значит, что-то пошло не туда. Может, архитектура плохо масштабируется. А может, кто-то забыл выключить дорогой инстанс после теста. А вот если наоборот, то тогда хорошо. Это верный знак, что масштабирование прошло правильно.</p><p>Еще один важный момент касается видимости трат. Чтобы команды видели свои расходы, нужно им их показать. Когда сотрудники начнут осознавать, что их халтура напрямую съедает бюджет на разработку новой фичи, отношение к ресурсам мгновенно поменяется. На этом же этапе обычно выясняется, что многое можно оптимизировать без потери качества работы.</p><h2>Как снизить расходы на межоблачный трафик</h2><p>Все думают, что деньги жрут виртуалки. В целом, да: GPU, мощные инстансы, терабайты дисков – все это стоит денег. Но на самом деле главной неожиданностью является трафик.</p><p>Причем внутренний трафик, когда данные ходят между вашими сервисами в одном облаке, обычно бесплатный или почти бесплатный. А вот исходящий в интернет и межоблачный — дорогие. У некоторых провайдеров гигабайт исходящего может стоить как час работы небольшой виртуалки.</p><p>К чему это ведет: API лежит в одном облаке, статика раздается из второго, аналитика собирается в третьем. Каждый запрос пользователя теперь не просто обрабатывается, а гоняет данные туда-сюда между площадками. Миллион запросов в день по 50 килобайт каждый – и вот вам счет на сотни тысяч рублей лишь за трафик.</p><p>Чтобы остановить это, начните с рисования схемы потоков данных. Реально возьмите бумагу или откройте какой-нибудь draw.io и прикиньте, куда ходят ваши данные и зачем. В результате получится, что логи пишутся в одно облако, обрабатываются во втором, результаты складываются в третье. И половину этих переездов можно убрать, просто переставив сервисы поближе друг к другу.</p><p>Ну и в довесок еще момент. Иногда дешевле продублировать данные в каждом облаке, чем постоянно синхронизировать их по сети. База на 100 гигабайт в хранении стоит копейки. Зато если ее дергать из другого облака по сотне раз в минуту, счета взлетят так, что мама не горюй.</p><h2>Резервирование мощностей и спотовые инстансы: как экономить на облаках</h2><p>Облачные провайдеры живут на том, что компании покупают ресурсы как попало. А ведь у каждого есть скидки на долгосрочные договоры и резервирование. Надо только научиться ими пользоваться.</p><p>Первым делом разделите нагрузку на стабильную и переменную. Если у вас есть базовые сервисы, которые работают круглосуточно с примерно одинаковым потреблением, зарезервируйте под них мощности прямо на весь год. Только за счет этого можно получить неплохую скидку. А вот пиковые нагрузки, тесты и эксперименты покрывайте ресурсами по требованию. Там гибкость важнее экономии.</p><p>Спотовые инстансы дают скидку до 70-80%, но могут отключиться в любой момент. Поэтому для продакшена они не подойдут. Но для CI/CD, обработки данных, рендеринга это то, что нужно. Хотя если архитектура спроектирована правильно, можно часть нагрузки держать на спотах с автоматическим переключением на обычные инстансы при отключении. В общем, тут смотрите сами. На худой конец, посоветуйтесь со спецами в сообществе <a href="https://t.me/+u61Cfe38dwAwMTky">Практики FinOps</a>.</p><p>Также учитывайте сезонность. Если ваш сервис связан с онлайн-торговлей, готовьтесь к разного рода распродажам заранее. Если с образованием – к сентябрю и или к новому году. Провайдеры дают возможность зарезервировать дополнительные мощности на конкретный период. Это дешевле, чем докупать их в последний момент, когда всем нужно вчера.</p><p>Ну и не забывайте сравнивать провайдеров. Один дает хорошие скидки на вычисления, другой на хранение, третий на трафик. Поэтому, чтобы ничего не упустить, заведите себе табличку и пересчитывайте условия раз в квартал. Расценки могут меняться вообще без видимых для внешнего наблюдателя факторов. От вас лишь требуется не профукать эти изменения.</p><h2>Как финансовый контроль помогает ловить проблемы с безопасностью</h2><p>Чем больше облаков, тем больше шансов, что что-то где-то может сломаться или подвергнуться атаке. Вот только при чем тут FinOps? Речь же о безопасности, а не об экономии.</p><p>Очень даже причем, надо сказать. Странные движения денег зачастую указывают на проблемы раньше, чем средства технического мониторинга.</p><p>Технический мониторинг может не заметить продуманную атаку без явных признаков. А вот счет не обманешь. Он просто не может вырасти без причины. Появились расходы на GPU, которые команда не заказывала? Трафик между облаками удвоился без изменений в коде? Каждый такой случай требует разбора. Что-то да найдете.</p><p>Настройте алерты на финансовые аномалии. Резкий рост расходов без объяснений должен включать тревогу так же быстро, как падение продакшена. Данные о тратах все равно собираете, но попробуйте посмотреть на них под другим углом. Иногда это бывает полезно не только с точки зрения экономии, но и безопасности.</p><h2>Решения для учета расходов в облаке</h2><p>Привести данные о расходах из нескольких разных облаков, которые приходят в разных форматах, к общему виду действительно непросто. Поэтому без специальных инструментов тут не обойтись.</p><p>За границей для этой цели используют FOCUS (FinOps Open Cost and Usage Specification). У нас про такое пока не слышали, поэтому решают проблему своими силами. Кто-то пишет скрипты на Python, которые собирают данные через API. Кто-то использует готовые ETL-инструменты вроде Airflow. Кто-то просто скачивает CSV и сводит в Excel.</p><p>Но какой бы путь вы ни выбрали, есть базовые вещи, без которых система не заработает:</p><ul><li>Провайдеры обновляют API без предупреждения. Сегодня поле с ценой называется cost, завтра price, послезавтра total_amount. Из-за этого ваши скрипты ломаются, отчеты начинают показывать нули, а вы узнаете об этом только когда руководство спрашивает, почему счета не сходятся. Автоматические проверки на изменения в структуре данных решают эту проблему.</li><li>Без меток project, owner, environment в мешанине из сотен инстансов вы точно не разберетесь. Каждый ресурс должен знать, к какому проекту относится, кто владелец, какое окружение. Думаете, что запомните? Не обольщайтесь. Через месяц никто не вспомнит, зачем вообще была нужна та ВМ и можно ли ее выключить.</li></ul><p>Теперь про конкретные инструменты. В России их пока не так много, но они все-таки есть:</p><ul><li>Клаудмастер от Inferit FinOps. Российская разработка, которая входит в реестр отечественного ПО. Система смотрит на реальную нагрузку и предлагает корректировки размеров, чтобы не переплачивать за простаивающие мощности.</li><li>Kubecost + Prometheus решают специфическую проблему кубернетес-кластеров. Prometheus собирает метрики о том, сколько ресурсов потребляет каждый под, каждый контейнер. Kubecost берет эти метрики и накладывает на них цены провайдера. В результате видите не абстрактные CPU и память, а рубли.</li><li>Самописные решения. Это может быть дашборд в Grafana, который собирает данные из API провайдеров раз в час, скрипт на Python с утренней сводкой в Telegram или что-то другое. Для первых шагов будет вполне достаточно.</li></ul><h2>Практический чек-лист готовности к мультиклауд-FinOps</h2><p>Теория это хорошо, но нужно обязательно проверить, все ли у вас настроено правильно:</p><ol><li>Начните с архитектуры. Если завтра понадобится перенести часть нагрузки в другое облако, сколько времени это займет? Неделю правок в конфигах или три месяца переписывания кода? Используете ли проприетарные сервисы провайдера там, где можно обойтись стандартными решениями? Когда последний раз проверяли, что будет при отказе одной из площадок?</li><li>Дальше про данные. Биллинг из всех облаков собирается автоматически или кто-то вручную скачивает CSV раз в месяц? Есть ли проверки на изменения в структуре данных от провайдеров? Все ли ресурсы помечены тегами с проектом, владельцем и окружением? Если на последний вопрос ответ нет, начните именно с этого.</li><li>Финансовая часть. Можете ли посчитать, сколько стоит одна транзакция в вашей системе? Один активный пользователь за месяц? Гигабайт данных в хранилище? Учитываются ли в прогнозах сезонные пики нагрузки? Закупки ресурсов планируются заранее на основе статистики или покупаете все по требованию когда припрет?</li><li>Автоматизация и безопасность. Настроены ли правила для автоматической уборки забытых ресурсов? Алерты на резкий рост расходов без видимых причин? Совместно ли команды FinOps и безопасности отслеживают аномалии в потреблении?</li></ol><p>Если хотя бы на половину вопросов ответили утвердительно, уже неплохо. Если меньше, есть над чем работать. Мультиклауд без контроля расходов превращается в черную дыру для бюджета. Но с правильно настроенным FinOps получаете не только экономию, но и дополнительный инструмент для мониторинга безопасности и стабильности всей инфраструктуры. Так что дерзайте. Хуже точно не будет.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 вещей, которые должен знать фронтенд-разработчик про Docker</title>
      <link>https://tproger.ru/articles/5-veshhej--kotorye-dolzhen-znat-frontend-razrabotchik-pro-docker</link>
      <comments>https://tproger.ru/articles/5-veshhej--kotorye-dolzhen-znat-frontend-razrabotchik-pro-docker?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дима Державин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-veshhej--kotorye-dolzhen-znat-frontend-razrabotchik-pro-docker</guid>
      <description><![CDATA[<p>Зачем фронтенд-разработчику Docker? Практическое руководство: основные команды, создание Dockerfile, подключение к бэкенду, работа с реестрами и запуск в продакшене. Повысите свой уровень с Middle до Senior.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-veshhej--kotorye-dolzhen-znat-frontend-razrabotchik-pro-docker">5 вещей, которые должен знать фронтенд-разработчик про Docker</a>»</p>]]></description>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 30 Oct 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Каждый день граница между фронтендом и бэкендом размывается, поэтому компании всё чаще ищут универсальных разработчиков, способных не только написать код, но и обеспечить стабильную работу приложения на каждом этапе релизного цикла, вплоть до запуска в продакшене.</p><p><i>Много кто пропустил момент, когда Docker стал стандартом в индустрии, а контейнеризация перестала быть приятным опциональным бонусом при найме опытного разработчика.</i></p><p>Сегодня причислять себя к Senior-грейду без знания основ контейнеризации — неоправданно.</p><p>Не будем лукавить — также компании любят экономить на сотрудниках, размывая отвественность из смежных областей на фронтенд-разработчика, который находится где-то посредине релизного цикла.</p><p>Давайте разбираться, что должен знать фронтенд-разработчик про Docker.</p><h2>Что такое Docker?</h2><p><i>Docker</i> — это программа для создания, развёртывания и управления приложениями в контейнерах. Контейнер создаётся на основе образа, который описан в <i>Dockerfile</i>.</p><p><i>Dockerfile</i> — по сути, инструкция для создания контейнера. В нём описывается окружение, зависимости и команды для запуска приложений внутри, например, прокси-сервера или микросервиса авторизации.</p><h3>Какие проблемы решает Docker во фронтенде?</h3><p>В небольшом проекте работа с web-приложением сводится к использованию четырёх команд: start, build, test, deploy.</p><p>А вот запуск веб-приложения в большом и устоявшемся коммерческом проекте выглядит так:</p><ul><li>Запусти Nginx, чтобы отдать клиент.</li><li>Подними (а перед этим установи) бекенд на Go и кэш на Redis, чтобы заработало API.</li><li>Запусти БД, чтобы были данные.</li><li>Запусти вспомогательные сервисы для API, например, аутентификацию или backoffice.</li></ul><p>Без контейнеризации запуск сложного приложения превращается в филиал ада: разработчики тратят время на запуск инфраструктуры, у пользователей MacOS не работает то, что работает у пользователей Ubuntu, а порты Postgres конфликтуют с портами локально поднятого почтового сервера.</p><p>Так ноутбук начинает выполнять функцию обогревателя для помещения площадью 40 квадратных метров 🙂</p><h3>Для решения каких задач фронтенд-разработчики выбирают Docker чаще всего?</h3><p>На стороне фронтенда Docker чаще всего используют для:</p><ul><li>Запуска и работы web-приложения.</li><li>Запуска инфраструктуры для web-приложения.</li><li>Запуска тестов (создание скриншотов, e2e-тесты).</li><li>Сборка приложения на CI.</li></ul><h2>Что же должен знать фронтенд-разработчик про Docker?</h2><h3>Основные команды для работы с Docker</h3><p>Без знания основных команд вы не сможете ни запустить контейнер, ни отладить, ни понять, что же с ним происходит.</p><p>Базовое управление контейнерами также доступно через интуитивно понятный Docker UI.</p><p><b>Важно:</b> все основные команды имеют полезные аргументы. Полный список аргументов вы можете найти в документации.</p><h3>Как создать базовый Docker-образ для веб-приложения?</h3><p>Прежде чем запустить контейнер, нужно описать его содержимое, а также выбрать порядок выполнения команд.</p><p>Образ стандартного web-приложения выглядит примерно так:</p><p>При создании Dockerfile рекомендуем следовать минимальному набору лучших практик:</p><ul><li>Использовать базовые образы, чтобы не нагружать образ лишними модулями.</li><li>Добавлять <i>.dockerignore</i>, чтобы исключать лишние файлы из сборки.</li><li>Не запускать контейнер от root, чтобы снизить риски для безопасности.</li><li>Проверять сторонние образы с помощью docker scan, опять же, чтобы снизить риски для безопасности.</li></ul><h3>Как отправить образ в Container Registry?</h3><p><i>Container Registry</i> — это хранилище для Docker-образов.</p><p>Container Registry можно сравнить с Github, только вместо репозиториев — готовые для развёртывания образы.</p><p>Для работы с Container Registry есть несколько основных команд:</p><p>По тегу latest вы всегда можете получить последнюю версию вашего контейнера.</p><p>Популярные Container Registry:</p><ul><li>Docker Hub (публичный, простой и бесплатный для открытых проектов);</li><li>GitHub Container Registry (платный, интегрирован с GitHub);</li><li>Google Container Registry (платный);</li><li>Yandex Container Registry (платный).</li></ul><p>Важно: старайтесь подбирать Container Registry под экосистему, в которой будет работать ваше приложение. Это сэкономит много сил и времени.</p><h2>Как запустить Docker-контейнер локально и на сервере?</h2><p>Для локального запуска контейнера потребуется пройти простой пайплайн:</p><p>Если вы хотите запустить контейнер на удалённом сервере с установленным Docker, то вам потребуется пройти пайплайн посложнее:</p><p>Важно: в данном примере мы используем в качестве Container Registry — Docker Hub.</p><h2>Как подключить фронтенд к бэкенду внутри Docker?</h2><p>Чтобы не настраивать общение клиента и сервера через порты, хорошая практика — объединять сервисы в рамках единой Docker-сети.</p><p>Обычно этой задачей занимается файл-оркестратор docker-compose.yml:</p><p>Чтобы поднять весь стэк, нам понадобятся команды:</p><p>Ключевые моменты:</p><ul><li>Сервисы в одной сети могут общаться по имени (в примере фронтенд обращается к бэкенду по http://backend:5000);</li><li>depends_on гарантирует порядок запуска, но не ждёт готовности сервиса;</li><li>Для продакшена можно разделить конфигурации на docker-compose.yml и docker-compose.prod.yml.</li></ul><h2>Бонус: Как управлять контейнерами через UI?</h2><p>В случае отсутствия опыта контейнеризации у команды разработки, управление контейнерами можно осуществлять через UI (вместо терминала) при помощи <i>Portainer</i>.</p><p>Portainer — это легковесная панель управления Docker-контейнерами. Через удобный графический интерфейс он позволяет выполнять операции, которые обычно отправляются через терминал (docker run, docker ps, docker compose up).</p><figure><img src="https://media.tproger.ru/user-uploads/113154/2025-10-16/4ff13bab-77e8-4d2f-b78d-2695dc106945.png" alt="Админ панель Portainer.IO для управления контейнерами и их образами" /><figcaption>Админ панель Portainer.IO для управления контейнерами и их образами</figcaption></figure><p>Portainer делает управление докер-контейнерами доступным для широкого круга пользователей: от разработчиков и тестировщиков до системных администраторов.</p><p>Portainer не заменяет необходимость знания Docker, но значительно ускоряет и упрощает такие рутинные операции, как развёртывание и мониторинг.</p><h2>Когда Docker необходим, а когда можно обойтись?</h2><p>Используйте Docker когда:</p><ul><li>работаете в команде с разными ОС;</li><li>проект имеет сложные внутренние и внешние зависимости;</li><li>нужно обеспечить идентичность разных сред: разработки, тестирования, продакшена;</li><li>работаете с full-stack приложениями, где фронтенд тесно связан с бэкендом.</li></ul><p>Без Docker можно обойтись когда:</p><ul><li>работаете над небольшим проектом;</li><li>вся команда использует одинаковое железо и ОС;</li><li>проект не имеет сложных зависимостей;</li><li>нет необходимости в изоляции окружений.</li></ul><h2>Заключение</h2><p>В последние годы Docker прочно вошёл в арсенал фронтенд-разработчиков, перестав быть инструментом исключительно для бэкенда и DevOps.</p><p>Основная ценность Docker для фронтенд разработчика заключается в решении двух ключевых задач: быстрый запуск сложной рабочей среды приложения и обеспечение стабильности на протяжении релизного цикла.</p><p>Поэтому даже базовое знание Docker поможет выделиться на фоне других разработчиков, ведь вы сможете не просто создать приложение, но и провести его через полный релизный цикл.</p><p>В своём <a href="https://t.me/+2OPggty992w5YTY6">телеграмм-канале</a> я делюсь практическим опытом разработки, честно рассказываю о трудностях в работе, а также показываю кейсы проектов, которыми занимаюсь в свободное время!</p><p>Буду рад каждому, кто подписался  ✨</p><h2>Возможно, вам будет интересно:</h2><p>Делитесь своими находками и полезными командами для работы с Docker в комментариях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Типы языков программирования: от низкоуровневых до высокоуровневых — как выбрать для новичка</title>
      <link>https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka</link>
      <comments>https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka</guid>
      <description><![CDATA[<p>Выбираете первый язык программирования? Узнайте о низкоуровневых (C, C++), среднеуровневых (Java, C#) и высокоуровневых (Python, JavaScript) языках: плюсы, минусы и примеры применения. Чек-лист от экспертов поможет новичкам выбрать язык для веб, мобильной разработки или игр.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka">Типы языков программирования: от низкоуровневых до высокоуровневых — как выбрать для новичка</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Xamarin]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для погружения в программирование нужно всего 3 вещи:</p><ul><li>Решить, с какого языка/технологии вы хотите начать.</li><li>Решить, на каком ресурсе вы хотите обучаться.</li><li>Выделить время на само программирование.</li></ul><p>Звучит просто, однако у вас уйдёт много времени на исследования, чтобы решить, что вам подходит и на каком ресурсе обучаться.</p><p>Некоторые люди начинают с относительно низкоуровневого программирования на C и C++. Другие выбирают более традиционный путь, изучая Java или C#. Есть и те, кто начинает с высокоуровневых или скриптовых языков вроде Python, Ruby или JavaScript.</p><p>Мы классифицируем языки по уровню абстракции. Для новичков: низкоуровневые — как ручная сборка машины (контроль, но сложный); среднеуровневые — как готовый конструктор с инструкцией (сохраняем баланс); высокоуровневые — как приложение на смартфоне (быстро, но меньше контроля). Ниже разберём плюсы и минусы и поможем сделать правильный выбор.</p><h2>Низкоуровневые языки: близко к «железу»</h2><p>Это языки, где вы напрямую работаете с памятью компьютера. Нет автоматической уборки ненужных данных, <b>всё под вашим контролем</b>. Подходят для системного ПО, игр или устройств (например, микроконтроллеров).</p><p>Примеры: C (для ОС вроде Linux), C++ (для игр на движке вроде Unreal Engine), Assembler (для оптимизации критических частей кода).</p><p><b>Плюсы:</b></p><ul><li>Полный контроль: вы решаете, как использовать ресурсы. Так, в C++ можно вручную выделять память для массивов, избегая ненужных копий данных.</li><li>Высокая скорость: прямой доступ к памяти позволяет писать код, который работает быстрее (это важно для работы с играми или серверами).</li><li>Основы основ: такие языки учат, как компьютер работает изнутри, чтобы в будущем ценить удобства других языков. Например, вы узнаёте, почему «утечка памяти» — это проблема.</li><li>Эффективность: низкоуровневые языки мотивируют думать об оптимизации заранее, снижая расход батареи или CPU.</li><li>Компактность: минимальная библиотека, приложения получаются лёгкими (идеально для embedded-систем, как в IoT-устройствах).</li></ul><p>Минусы:</p><ul><li>Всё-таки это сложно: рутинные задачи (например, чтение файла) требуют больше кода и внимания к деталям, рискуя ошибками вроде переполненного буфера.</li><li>Ручное управление памятью: можно легко «забыть» освободить память, вызвав утечки или краши. Например, в C нужно использовать malloc/free, иначе программа съест всю RAM.</li><li>Много копипасты: придётся писать шаблонный код, и делать это часто.</li><li>Платформо-зависимость: код для Windows может не работать на Linux без правок.</li></ul><h2>Среднеуровневые языки: баланс контроля и удобства</h2><p>Эти языки предлагают готовые инструменты, упрощающие работу, но требуют строгой проверки типов данных. Для их запуска нужна специальная программа (среда выполнения). Они идеальны для приложений, серверов и игр.</p><p>Примеры: Java (для Android-приложений), C# (для Unity-игр или .NET-серверов).</p><p>Плюсы:</p><ul><li>Автоматическая память: память очищается автоматически благодаря сборщику мусора, что избавляет от ручной работы и снижает вероятность ошибок, вроде утечек памяти в больших проектах. При этом можно получить доступ к низкоуровневым функциям для особых задач, например, через специальные инструменты в Java.</li><li>Богатые библиотеки: готовые инструменты для сетей, GUI или баз данных. Пример: Java’s Spring для веб-серверов.</li><li>Кроссплатформенность: компиляция в байт-код (JVM для Java) позволяет запускать код везде. Например, пишешь на Windows, запускаешь на Linux.</li><li>Безопасность: язык проверяет типы данных перед запуском программы, помогая заранее найти ошибки. Среда выполнения защищает от опасных сбоев, например, от переполненной памяти.</li><li>Масштабируемость: встроенные инструменты для параллельных вычислений позволяют легко создавать программы, которые одновременно выполняют много задач (серверы для тысяч пользователей и т.п.).</li></ul><p>Минусы:</p><ul><li>Дополнительная нагрузка от рантайма: Среда выполнения и автоматическая очистка памяти создают дополнительную нагрузку. Сборщик мусора может ненадолго останавливать программу, что заметно в играх или при обработке видео.</li><li>Меньше контроля: абстракции скрывают детали памяти, усложняя оптимизацию (например, в Java сложно избежать боксинга примитивов).</li><li>Повторяющийся код, которого много: приходится писать повторяющийся код и тренировать свою усидчивость, например, для доступа к данным объекта. Кстати, инструменты вроде Lombok могут упростить эту задачу.</li><li>Зависимость от среды: для запуска программ нужна специальная среда (например, JVM для Java), что влияет на размер программ и замедляет их старт.</li><li>Сложность интеграции: подключение кода на других языках, например, на C, требует писать специальные обёртки, что усложняет работу и снижает скорость.</li></ul><h2>Высокоуровневые языки: удобство и скорость разработки</h2><p>Эти языки скрывают технические детали, позволяя сосредоточиться на создании <b>логики программы</b>. Подходят для веба, data science или скриптов.</p><p>Примеры: Python (для ML), Ruby (для веб-разработки), JavaScript (для фронтенда).</p><p>Плюсы:</p><ul><li>Простота: сложные задачи решаются в пару строк. Так, в JS async/await упрощает API-запросы.</li><li>Быстрая разработка: динамическая типизация позволяет быстро писать и тестировать код без необходимости его компиляции.</li><li>Богатые экосистемы: есть библиотеки для всего (к примеру, NumPy для данных в Python).</li><li>Гибкость: легко менять код, идеально для прототипов или стартапов.</li></ul><p>Минусы:</p><ul><li>Низкая производительность: абстракции добавляют нагрузки. Например, циклы в Python медленнее, чем в C.</li><li>Ошибки на рантайме: из-за слабой типизации ошибки выявляются только при запуске программы, что усложняет отладку.</li><li>Риск «спагетти-кода»: лёгкость изменений может привести к хаосу без дисциплины.</li><li>Скрытые проблемы: абстракции маскируют баги.</li><li>Зависимость от интерпретатора: программы требуют установленного интерпретатора, что замедляет их запуск и добавляет зависимость от дополнительного ПО.</li></ul><h2>Чек-лист: как выбрать язык программирования для новичка</h2><p>Этот чек-лист основан на советах экспертов, чтобы помочь новичкам выбрать первый язык программирования. Каждый пункт включает конкретные рекомендации.</p><ol><li><b>Определите, что вас вдохновляет, и выберите сферу.</b> Подумайте, что вы хотите создавать: сайты, игры, мобильные приложения или серверы. Разные сферы требуют разных языков. Например, для веб-разработки подойдут JavaScript или Python, для мобильных приложений — Java, Kotlin, Swift или Dart, а для игр — C# или C++. Составьте список идей (например, сайт-визитка, игра, аналитика данных) и найдите, какие языки для них используют. <br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Ищите язык с широким применением.</b> Выбирайте языки, которые используются в разных областях, чтобы легче переключаться между задачами. Например, Kotlin подходит для мобильной разработки, веба и серверов, а C# — для десктоп-приложений, игр (Unity) и бэкенда. Это даёт гибкость и упрощает изучение новых языков в будущем.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Проверьте спрос на рынке труда. </b>Если цель — смена профессии, изучите вакансии на HH.ru или LinkedIn. Введите «junior Python», «junior Java» и сравните, где больше предложений и какие требования. Избегайте языков с низким спросом, если хотите быстро найти работу. Например, Java, Kotlin, Python и JavaScript популярны для найма.<br />— Владислав Масунов, Head of Development</li><li><b>Опробуйте языки на практике.</b> Напишите простые программы (например, "Hello World" или калькулятор) на нескольких языках, чтобы понять, какой синтаксис вам ближе. Используйте онлайн-редакторы вроде Replit или CodePen. Например, попробуйте TypeScript для веба (он поддерживает типизацию и разные подходы к программированию) или C++ для понимания работы с памятью. Это поможет почувствовать, к чему лежит душа.<br />— Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS; Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Выберите язык с хорошей документацией и сообществом.</b> Убедитесь, что у языка много обучающих материалов и активное сообщество. Например, TypeScript имеет богатую документацию и поддержку, что упрощает старт. Проверьте ресурсы вроде LearnPython.org, freeCodeCamp для JavaScript или Telegram-чаты для C++. Это поможет быстрее решать вопросы.<br />— Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS</li><li><b>Учитывайте сложность и карьерные цели.</b> Для небольших проектов или быстрого старта берите Python или PHP — они проще и подходят для веб-разработки или скриптов. Для сложных задач с высокой нагрузкой (например, серверы или оптимизация) попробуйте C++ или Go. Если цель — работа в крупных компаниях, Java и Kotlin востребованы и часто используются с ИИ-инструментами. Выбирайте, исходя из сложности и ваших амбиций.<br />— Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Смотрите на универсальность и переход к другим языкам. </b>Выбирайте язык, который учит основам программирования и упрощает переход к другим. Например, изучение C# может помочь освоить Java, а затем — Android-разработку. TypeScript учит объектно-ориентированному и функциональному программированию, что полезно для разных задач. Это создаёт базу для дальнейшего роста.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH; Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS</li><li><b>Не гонитесь за гилти плежа.</b> Избегайте языков, которые изучают «для удовольствия» без практического применения. Выбирайте те, которые можно применить в реальных проектах или которые востребованы в индустрии. Например, вместо нишевых языков берите Python, Java или Kotlin: они имеют чёткие сценарии использования.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Практикуйтесь с ИИ-инструментами.</b> Если хотите работать в крупных компаниях, освойте язык, который хорошо сочетается с ИИ-инструментами (например, Go или Java). Практикуйтесь с ИИ-агентами по типу GitHub Copilot для автоматизации задач — это ценится работодателями.<br />— Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Составьте план развития.</b> Создайте roadmap: определите, какие проекты хотите делать через 3-6 месяцев (например, мобильное приложение или веб-сервис), и подберите язык под эти цели. Если выбрали C#, начните с десктоп-приложений, затем попробуйте Xamarin для кроссплатформенной разработки. Постепенно добавляйте новые языки, опираясь на первый.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li></ol><p>Если не определились, предлагаем пройти квиз и расставить всё по полочкам:</p>]]></content:encoded>
    </item>
    <item>
      <title>11 топовых библиотек и фреймворков для Java в 2025 году</title>
      <link>https://tproger.ru/articles/11-topovyh-bibliotek-i-frejmvorkov-dlya-java-v-2025-godu</link>
      <comments>https://tproger.ru/articles/11-topovyh-bibliotek-i-frejmvorkov-dlya-java-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/11-topovyh-bibliotek-i-frejmvorkov-dlya-java-v-2025-godu</guid>
      <description><![CDATA[<p>Топ библиотек и фреймворков Java 2025: Spring Boot, Hibernate, JUnit, Micronaut, Quarkus. Практические советы от Senior и Lead разработчиков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/11-topovyh-bibliotek-i-frejmvorkov-dlya-java-v-2025-godu">11 топовых библиотек и фреймворков для Java в 2025 году</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Oct 2025 12:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Java-разработчики поделились списком инструментов, которые реально используют в работе. Подборка понравится:</p><ul><li><b>джунам</b>, которые выбирают первый стек технологий;</li><li><b>мидлам</b>, которые хотят сравнить свой опыт с коллегами;</li><li><b>сеньорам</b>, которые подбирают инструменты под новый проект.</li></ul><p>Вы узнаете — какие библиотеки и фреймворки выручают Java-разработчиков в 2025 году. <a href="https://www.linkedin.com/in/kazakov-i/">Игорь Казаков</a>, <a href="https://t.me/three_monitors">Константин Шибков</a> и <a href="http://@vad2604">Вадим Федосеев</a> рассказали, почему джависты предпочитают конкретный инструмент, для каких задач он удобен и на что обращать внимание при выборе.</p><h2>Чем фреймворк отличается от библиотеки?</h2><p><b>Библиотека </b>работает как набор инструментов.</p><p>Хотите парсить JSON? Подключаете Jackson. Нужно логирование? Добавляете SLF4J. Вы решаете, когда и как использовать код библиотеки.</p><p><b>Фреймворк </b>задаёт структуру приложения.</p><p>К примеру, <a href="https://tproger.ru/articles/pishem-java-veb-prilozhenie-na-sovremennom-steke-s-nulja-do-mikroservisnoj-arhitektury-chast-1">Spring Boot</a> — он запускает ваше приложение, создаёт контекст, инжектит зависимости. Хотите вы или нет, но придётся писать контроллеры, сервисы и репозитории по правилам фреймворка.</p><p>Некоторые фреймворки можно использовать как библиотеки. Например, Hibernate — с ним работают как с библиотекой для маппинга объектов или как с полноценным фреймворком с управлением сессиями и жизненным циклом. Выбор зависит от задачи и предпочтений команды.</p><h2>На что смотрят профи, когда выбирают Java-фреймворк?</h2><blockquote>Фреймворк должен сопровождаться хорошей документацией, без этого самый крутой функционал превращается в головную боль. На втором месте — стабильность. Очень расстраивает, когда сделал 90% фичи, а потом всё встало из-за нерешённого бага в библиотеке.</blockquote><p><i>Игорь Казаков, Lead Software Engineer (Java)</i>, при выборе инструмента оценивает:</p><ul><li>Производительность. Следующие преимущества будут неактуальными, если инструмент плохо оптимизирован.</li><li>Документацию. Её наличие экономит массу времени и новичкам, и продвинутым пользователям.</li><li>Поддержку. Важно, чтобы команда разработки инструмента следила за его актуальностью и совместимостью, держала вопросы безопасности на высоком уровне.</li><li>Сообщество. Даже с блестящей документацией важно комьюнити, готовое поделиться опытом.</li></ul><p>Отдельно он подчёркивает модульность и обратную совместимость — никто не хочет переписывать половину проекта после обновления версии.</p><p><i>Константин Шибков, Java-разработчик</i>, ждёт от фреймворка следующее:</p><blockquote>Жду от идеального фреймворка регулярные релизы с поддержкой новых технологий и версий языка, простое подключение модулей и понятный путь при миграции до новых мажорных версий. Идеальный фреймворк закрывает 80% типовых задач без бойлерплейта и лишней магии. Заложенная безопасность, готовая россыпь метрик его работы, обратная связь с командой разработки — это обязательные элементы отличного инструмента.</blockquote><h2>1. Spring Boot</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/e711de5d-2767-4915-ab26-23cea62d42c7.jpg" alt="" /></figure><p>Spring — это целая экосистема фреймворков. Spring Boot — один из его фреймворков. При работе с SB вы используете «стартеры», которые автоматически создают бины для компонентов Spring.</p><p>Фреймворк определяет, какие библиотеки вы используете, и самостоятельно их настраивает. Если подключите базу данных, Spring Boot создаст пул соединений, добавите веб-зависимость — получите встроенный Tomcat-сервер. Любую автоматическую настройку можно переопределить.</p><p>Spring Boot выбирают для разработки:</p><ul><li>REST API и микросервисов,</li><li>веб-приложений с шаблонизаторами,</li><li>консольных утилит и планировщиков задач,</li><li>интеграций с внешними системами.</li></ul><blockquote>Spring Boot — самый распространённый фундамент любого бекэнд приложения. В большинстве вакансий я вижу именно SB. Фреймворк отлично сочетает рабочие библиотеки, хорошо описан и даёт достаточно контроля.</blockquote><blockquote>Новичкам советую начать именно со Spring Boot. Даже если проект в итоге не потребует всего функционала, вы получите отличное понимание современных практик Java-разработки, а также сможете быстро написать приложение без копания в тоннах документации и бесконечных отладок кода.</blockquote><h2>2. Hibernate</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/48d60d2f-d161-485b-acf2-97b0705c74e4.jpg" alt="" /></figure><p>Фреймворк связывает Java-объекты с таблицами в базе данных. Вместо написания SQL-запросов вы работаете с обычными классами и методами.</p><blockquote>Hibernate — зрелая ORM, реализующая стандарт JPA. Используется в большинстве видимых мною проектов с реляционными БД. Снимает с разработчика много рутины и позволяет в достаточной мере оптимизировать работу с базами.</blockquote><p>Инструмент рекомендуют для разработки типичных бизнес-приложений с CRUD-операциями. Hibernate автоматически генерирует SQL, управляет транзакциями и кеширует данные. Вы пишете user.save() — фреймворк сам создаёт INSERT-запрос и выполняет его.</p><blockquote>Иногда складывается обманчивое впечатление, когда запуск простого приложения на фреймворке — это задача 5 минут. Hibernate достаточно прост для создания CRUD приложения. Но когда нужны сложные связи между таблицами, особые типы данных или непростые выборки данных, в этих случаях фреймворк начинает «давить» на разработчика ограничениями и неявными правилами, которые были скрыты в угоду удобства.</blockquote><h2>3. Jackson</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/432d1347-d269-4360-8964-d147957a9870.jpg" alt="" /></figure><p>Библиотека превращает Java-объекты в JSON и обратно. Работает через аннотации — вешаете @JsonProperty на поле, и Jackson понимает, как его назвать в JSON.</p><p>Нужно игнорировать какое-то поле? Добавили @JsonIgnore и забыли. При этом Jackson умеет работать даже без аннотаций — просто смотрит на геттеры и сеттеры вашего класса.</p><blockquote>Jackson стабилен, гибок и незаменим в работе с JSON.</blockquote><p>Базовый модуль работает с JSON, но можно подключить дополнительные: для XML, YAML, CSV. Один и тот же код сериализует объекты в разные форматы. Ещё Jackson дружит с Java 8+ фичами через отдельный модуль.</p><p>Библиотека пригодится, когда пишете REST API, работаете с конфигурационными файлами или интегрируетесь с внешними сервисами. <b>Spring Boot использует Jackson по умолчанию</b> — все @RestController автоматически отдают JSON через него.</p><h2>4. JUnit</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/8074073c-9c4b-4fb9-9a45-9a237cd0e176.jpg" alt="" /></figure><p>Больше 20 лет JUnit лидирует среди фреймворков для тестирования Java-приложений. Разработчики выбирают его за простоту и скорость написания тестов — достаточно поставить аннотацию @Test над методом, и он превращается в полноценный тест.</p><blockquote>JUnit — это модульные тесты через простую аннотационную модель, интеграция с IDE и средами сборки.</blockquote><p>Фреймворк выручает при рефакторинге старого кода. Написали тесты на существующую логику — можете менять реализацию. Тесты покажут, если что-то сломалось.</p><p>JUnit 5 добавил параметризованные тесты: один тестовый метод проверяет сразу десяток разных входных данных.</p><blockquote>К Spring Boot обязательно беру JUnit + AssertJ, Mockito и Testcontainers — вместе они обеспечивают реалистичные интеграционные тесты и быстрый фидбек в CI.</blockquote><h2>5. MapStruct</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/26bfd959-19c8-4f80-8bb3-2e7f17f51164.jpg" alt="" /></figure><p>Библиотека генерирует код маппинга между Java-объектами во время компиляции. Вместо ручного переписывания полей из одного объекта в другой, вы пишете простой интерфейс с аннотациями — MapStruct создаёт реализацию автоматически.</p><blockquote>Не представляю быструю реализацию мапперов без MapStruct. Библиотека избавляет от сотен строк шаблонного кода и ошибок при преобразовании DTO&lt; -&gt;Entity.</blockquote><blockquote>MapStruct изящно решает рутинную задачу преобразования объектов без магии и просадок производительности.</blockquote><h2>6. Lombok</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/21424b29-2056-4c29-8a55-f4678b9d651c.jpg" alt="" /></figure><p>Библиотека автоматически генерирует повторяющийся код через аннотации. Вместо того, чтобы писать геттеры, сеттеры, конструкторы и методы equals/hashCode руками, вы просто ставите аннотацию @Data над классом.</p><blockquote>Lombok экономит время: помогает писать код чище.</blockquote><p>Библиотека встраивается в процесс сборки и добавляет нужные методы в байт-код. Новые разработчики в команде могут удивиться, откуда берутся методы, которых нет в исходниках. Зато вы экономите время на рутине и концентрируетесь на бизнес-логике.</p><blockquote>Jackson и Lombok — стандарт для энтерпрайза, без них не обходится ни один проект. Lombok не идеален, но сильно сокращает шаблонный код и делает DTO более читаемыми, позволяет сосредоточиться на бизнес-логике.</blockquote><h2>7. Testcontainers</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/ae215712-368b-4f9c-9afc-b8f4ca0baa33.jpg" alt="" /></figure><p>Testcontainers решает классическую проблему: как протестировать код, который работает с базой данных или внешними сервисами? Библиотека запускает настоящие Docker-контейнеры прямо из тестов — PostgreSQL, Redis, Kafka, что угодно. Тесты получают реальное окружение вместо заглушек и моков.</p><p>Контейнеры живут ровно столько, сколько выполняются тесты. Запустил тест — поднялась база, прошёл тест — контейнер удалился.</p><p>Testcontainers выручает при:</p><ul><li>интеграционном тестировании с реальными базами данных,</li><li>проверке миграций и SQL-запросов,</li><li>тестировании микросервисов с брокерами сообщений,</li><li>работе с NoSQL-хранилищами.</li></ul><blockquote>JUnit 5 с Jupiter API — стандарт для тестирования. Особенно в связке с Testcontainers — это очень важный инструмент.</blockquote><h2>8. Micronaut</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/a588e1f2-1bfb-4398-b45e-9bb28caf5a82.jpg" alt="" /></figure><p>Фреймворк компилирует магию dependency injection на этапе сборки, а не во время запуска приложения. Ваш сервис стартует за 1-2 секунды вместо привычных 10-30 секунд у Spring Boot. Типичное приложение съедает 50-100 МБ вместо нескольких сотен.</p><p>Фреймворк рекомендуют в трёх случаях:</p><ul><li>Пишете микросервисы и устали ждать перезапуска при каждом изменении.</li><li>Разворачиваете приложения в AWS Lambda, Google Cloud Functions.</li><li>Платите за облачные ресурсы и хотите сэкономить на железе.</li></ul><p>Micronaut поддерживает реактивное программирование из коробки, дружит с GraalVM и компилируется в нативные образы. При этом синтаксис остаётся знакомым — те же аннотации @Controller, @Service, @Repository, что и в Spring.</p><h2>9. Quarkus</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/dd181c07-0c3d-4223-9d15-d6f4627ea7d7.jpg" alt="" /></figure><p>Фреймворк компилирует код в нативные исполняемые файлы через GraalVM. Ещё Quarkus работает с микросервисами и облачными платформами.</p><p>Quarkus потребляет в 10 раз меньше памяти по сравнению с традиционными Java-приложениями. Разработчики пишут обычный Java-код, а фреймворк самостоятельно оптимизирует его под контейнеры и Kubernetes.</p><blockquote>Некоторые компании используют Quarkus как более быструю и легкую альтернативу Spring Boot. Однако мне показалось, что вакансий с ним на рынке СНГ в разы меньше, чем на SB.</blockquote><blockquote>Quarkus и Micronaut хороши для небольших проектов и там, где важен быстрый старт приложения. Но пока они проигрывают Spring Boot в зрелости и глубине интеграций для большинства enterprise-сценариев.</blockquote><h2>10. MyBatis</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/ca5295e9-ed69-4ff3-a51c-769a1e6dcf60.jpg" alt="" /></figure><p>Фреймворк соединяет Java-объекты с БД через SQL-запросы. В отличие от Hibernate, где SQL генерируется автоматически, здесь вы пишете запросы сами и размещаете их в XML-файлах или аннотациях.</p><blockquote>MyBatis выбираю для маппинга запросов, когда планируется сложная бизнес-логика.</blockquote><p>Фреймворк не навязывает архитектуру приложения и легко встраивается в существующий код.</p><h2>11. Guava</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-17/81a806a8-8980-4fe0-a1ee-7cbc5ec3412c.jpg" alt="" /></figure><p>Библиотека Google Guava закрывает пробелы стандартной Java. Это набор утилит, который экономит время на рутине. Валидация параметров, работа с Optional до Java 8, удобные билдеры для коллекций — библиотека решает десятки мелких задач, с которыми сталкивается каждый разработчик.</p><blockquote>Новичкам всегда советую брать самые популярные инструменты, которыми пользуются большинство компаний. В Java не так много фреймворков, поэтому по умолчанию рекомендую Spring Boot, Hibernate, JUnit. Это тот опыт, который нужен для большинства вакансий. Изучив перечисленные инструменты, можно попробовать менее популярные инструменты и уже на личном опыте оценить их пользу.</blockquote><p>🙄<i> После публикации заметили, что забыли упомянуть один не менее популярный фреймворк. Делитесь догадками в комментариях — какой инструмент незаслуженно остался на страницах черновика?</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Bun 1.3: full-stack рантайм, поддержка Redis и новый SQL API. Разобрались, что еще нового</title>
      <link>https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo</link>
      <comments>https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo</guid>
      <description><![CDATA[<p>Bun 1.3 стал full-stack рантаймом с Redis, SQL API, поддержкой MySQL и PostgreSQL, новым тест-раннером и ускорением сборки до 2,5 раз</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo">Вышел Bun 1.3: full-stack рантайм, поддержка Redis и новый SQL API. Разобрались, что еще нового</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 13 Oct 2025 04:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда <b>Oven</b> <a href="https://bun.com/blog/bun-v1.3">представила</a> <b>Bun 1.3</b> — крупнейший релиз в истории JavaScript-рантайма.</p><p>Теперь Bun официально позиционируется как <b>full-stack платформа</b> для фронтенда и бэкенда. И она объединяет сервер, сборщик, менеджер пакетов вместе с тест-раннером в одном инструменте.</p><p>В новую версию добавлены десятки ключевых функций: встроенные клиенты для <b>Redis</b>, <b>MySQL</b>, <b>PostgreSQL</b> и <b>SQLite</b>, единый <b>SQL API</b>, улучшенные <b>WebSocket-модули</b>, переработанный <b>тест-раннер</b> и поддержка <b>VSCode Test Explorer</b>.</p><h2>Full-stack по-умному</h2><p>Главное новшество — режим <b>full-stack Bun.serve()</b> с поддержкой роутинга, cookies и WebSockets.</p><p>Теперь фронтенд и бэкенд можно запускать в одном процессе без проблем с CORS, а приложение собрать в <b>единый исполняемый файл</b> с помощью bun build --compile.</p><p>Разработчики могут напрямую импортировать HTML, запускать React-приложения с хот-перезагрузкой и собирать проект одной командой bun init --react. По данным команды, скомпилированные React-приложения в Bun работают <b>до 1,8 раза быстрее, чем через nginx</b>.</p><h2>Новый SQL и встроенный Redis</h2><p>Bun 1.3 представил унифицированный <b>Bun.SQL API</b> — теперь один и тот же код работает с MySQL, PostgreSQL, SQLite и MariaDB. Добавлен хелпер sql.array() для работы с массивами в PostgreSQL, улучшена поддержка JSON и Unix-сокетов.</p><p>Кроме того, в рантайм встроен <b>Redis-клиент</b>, который поддерживает 66 команд, автоматическое переподключение, очереди сообщений и Pub/Sub. По данным разработчиков, он <b>значительно быстрее ioredis</b>, а поддержка кластеров и Lua-скриптов появится в будущих релизах.</p><h2>Новые возможности</h2><p>Среди прочих улучшений — <b>Zstandard-сжатие</b>, нативная поддержка <b>YAML</b>, API для безопасного хранения секретов (<b>Bun.secrets</b>), и серьезный прирост производительности: операции с криптографией ускорены <b>до 400х</b>, установка пакетов — <b>до 2,5х</b>.</p><p>Также обновлен менеджер пакетов с <b>интерактивным bun update</b>, изолированными установками и API для проверки безопасности зависимостей.</p><h2>Почему это важно</h2><p>Bun 1.3 превращает экспериментальный рантайм в <b>полноценную платформу для веб-разработки</b>, способную заменить Node.js, Vite и Redis-CLI одновременно.</p><p>Разработчики называют релиз «началом новой эпохи», цель которой — сделать Bun лучшим способом писать и развертывать JavaScript-приложения.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как подключить GPT API в своё приложение</title>
      <link>https://tproger.ru/articles/kak-podklyuchit-gpt-api-v-svoyo-prilozhenie</link>
      <comments>https://tproger.ru/articles/kak-podklyuchit-gpt-api-v-svoyo-prilozhenie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-podklyuchit-gpt-api-v-svoyo-prilozhenie</guid>
      <description><![CDATA[<p>Как оплачивать API ChatGPT в России, рассчитывать стоимость запросов и подключить нейросеть OpenAI к приложению на Python или Javascript. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-podklyuchit-gpt-api-v-svoyo-prilozhenie">Как подключить GPT API в своё приложение</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 06 Oct 2025 12:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы хотите добавить в свой проект чат-бота, автоматически обрабатывать тексты или генерировать контент — эта публикация сэкономит пару дней экспериментов и поможет избежать типичных ошибок при интеграции. Разберём настройку доступа из России, покажем код на Python и JavaScript, обсудим риски и случаи, когда одного API недостаточно.</p><h2>Считаем расходы и настраиваем лимиты</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-29/d50e1490-01ee-4425-be66-1ea978220a91.jpg" alt="" /></figure><p>OpenAI взимает плату за <b>токены</b> — единицы измерения текста. Один токен — это 4 символа английского текста или 2-3 символа русского:</p><ul><li>«привет» — это 2 токена,</li><li>«hello» — 1 токен.</li></ul><p>Вы платите за два типа токенов:</p><ul><li>входящие — ваш запрос к модели,</li><li>исходящие — ответ модели.</li></ul><p>Актуальные цены <a href="https://platform.openai.com/docs/pricing?latest-pricing=priority">смотрите</a> на сайте OpenAI.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-29/cead9d84-1f31-462b-bc46-87eccae86b60.jpg" alt="" /></figure><p>Например, GPT-4o стоит $2.50 за миллион входящих токенов и $10 за миллион исходящих. Диалог на 1000 токенов обойдётся примерно в $0.01. При обработке 10 000 таких диалогов в день расходы составят $100 ежедневно.</p><p><b>Настройка финансовой защиты</b></p><p>Перед подключением API к приложению зайдите в настройки биллинга OpenAI и настройте три параметра:</p><ul><li><b>Usage limits</b> — жёсткое ограничение расходов. При достижении лимита API перестаёт отвечать на запросы.</li><li><b>Email notifications</b> — уведомления при достижении определённого процента от лимита (например, 80%).</li><li><b>Rate limits</b> — ограничения по токенам (TPM) и запросам (RPM) в минуту для каждого API-ключа.</li></ul><p>OpenAI показывает статистику с задержкой 5-10 минут. Для контроля в реальном времени используйте библиотеку tiktoken:</p><p>Начинайте с малых лимитов и увеличивайте постепенно. Лучше получить ошибку «превышен лимит» и быстро поднять порог, чем обнаружить пятизначный счёт в конце месяца.</p><blockquote>Я видел много задач, которые прекрасно решаются без LLM, но «пацаны не поймут». Если без LLM и правда никак, то научитесь считать: оптимизируйте промпты, не давайте агентам уходить в долгие циклы взаимодействия с моделями.</blockquote><h2>Работаем с ChatGPT из России</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-29/aefcb2bd-1709-4724-bf01-9d3b15a4cc61.jpg" alt="" /></figure><p>OpenAI официально не доступен российским пользователям. Если попробуете зайти на их сайт или отправить запрос к API напрямую — получите ошибку.</p><p>Можно купить подписку на любой сервис обхода блокировок за 200-500 рублей/месяц. Работает, но есть нюансы:</p><ul><li>скорость ответов снижается,</li><li>соединение периодически разрывается,</li><li>если сервис накроется — ваше приложение встанет.</li></ul><p>Более надёжный вариант — арендовать виртуальный сервер в Европе или США за $5-10 в месяц и настроить на нём прокси-сервер. Придётся потратить пару часов на настройку, зато получите стабильное соединение под вашим полным контролем.</p><blockquote>Пришлось настроить собственный прокси — это стабильно, надёжно и недорого.</blockquote><p><b>Платим за API</b></p><p>OpenAI принимает только зарубежные карты, и есть несколько вариантов:</p><ul><li>Виртуальные карты типа Pyypl или RedotPay. Минус один — при пополнении теряете 10-20 рублей на каждой сотне из-за курса, но для личных экспериментов терпимо.</li><li>Физические карты зарубежных банков. Нужно ехать в Казахстан, Армению или Грузию, либо искать посредников. Курс конвертации в таком случае будет менее грабительским.</li></ul><p>Если возиться с обходом блокировок не хочется, есть отечественные аналоги:</p><ul><li>GigaChat.</li><li>YandexGPT.</li></ul><p>Ещё можно рассмотреть OpenRouter. Это агрегатор разных моделей, включая ChatGPT. Работает без смены IP, но платить всё равно придётся зарубежной картой. Цены чуть выше, чем напрямую у OpenAI.</p><blockquote>В личных экспериментах использую OpenRouter, и мне нравится. Это «единое окно» в разные модели, работает без смены IP, совместимо с OpenAI. Также есть «обёртки» во всех популярных фреймворках, таких как langchain/langgraph, очень удобно.</blockquote><blockquote>С одной стороны, с агрегаторами (OpenRouter) проще в плане доступа, оплаты, использования единого OpenAI API для всех моделей, консолидированного учёта расходов. С другой стороны — есть минусы: риски безопасности, стоимость, ограничения глубокой настройки и набора функций / API, ошибки доступа и маршрутизации.</blockquote><h2>Подключаем API на Python</h2><p>Установите библиотеку OpenAI:</p><p>Пример базового запроса по API:</p><p>GPT API работает как любой другой сервис — отправили POST-запрос, получили JSON с ответом.</p><p>Три главных параметра, которые влияют на ответы:</p><ul><li><b>max_tokens</b> — сколько токенов (≈ слов) может содержать ответ. Поставите 50 — получите короткий ответ. Поставите 2000 — модель распишет подробно. Каждый токен стоит денег, помните об этом.</li><li><b>temperature </b>(от 0 до 2) — насколько предсказуемы ответы. При 0 модель выдаёт самый вероятный вариант. При 1.5 начинает фантазировать. Для технической документации ставьте 0.2, для креативных задач — 0.8-1.0.</li><li><b>top_p </b>— альтернатива temperature. Ограничивает выбор слов по вероятности. Обычно используют что-то одно: либо temperature, либо top_p.</li></ul><p>В реальных проектах вы не обойдётесь одним запросом. Чаще всего придётся строить цепочки: сначала извлечь данные, потом проверить их, затем сформировать финальный ответ. Каждый шаг — отдельный промпт со своими параметрами.</p><blockquote>Большинство промышленных задач с LLM не решается одним проходом и одним промптом, тебе нужна совокупность различных инструментов и ухищрений.</blockquote><h2>Подключаем API на JavaScript</h2><p>Установите библиотеку OpenAI:</p><p>Пример базового запроса по API:</p><p>Никогда не пишите API-ключ прямо в коде, используйте файл .env:</p><p>И библиотеку dotenv:</p><h2>Чтобы не уволили и не засудили</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-29/47edf285-a276-4892-84ec-50d25ce5f1dd.jpg" alt="" /></figure><p>В 2023 году инженеры Samsung <a href="https://interestingengineering.com/culture/chatgpt-alleged-leak-confidential-information-samsung">отправили</a> исходный код в ChatGPT, когда просили помочь с оптимизацией. После этого корпорация запретила сотрудникам работать с публичными нейросетями. И Samsung не одиноки — Amazon, Apple, JPMorgan Chase ввели похожие ограничения.</p><p>Вы отправляете данные на чужие сервера, и никто не гарантирует, что они там не останутся. OpenAI прямо пишет в документации, что может использовать ваши запросы для обучения моделей.</p><blockquote>Люди внезапно утратили всю бдительность и запихивают в чаты что ни попадя. Безопасники реагируют по всем направлениям, вот и про DLP (Data Leak Prevention) вспомнили.</blockquote><p><b>Как работать безопасно</b></p><p>Перед отправкой заменяйте настоящие данные на фейковые. Вместо «Иван Петров, +79291234045» пишите «USER_NAME, USER_PHONE». После получения ответа подставляйте реальные значения обратно.</p><p>API-ключи храните в переменных окружениях, а не в коде. Меняйте ключи каждые 30-60 дней. Настройте алерты на всплески запросов — если обычно делаете 100 запросов в день, а тут внезапно 10000, значит ключ утёк.</p><h2>Когда ждать ответ целиком, а когда показывать по частям</h2><p>В API есть два режима получения ответов: обычный и потоковый (streaming). В обычном режиме вы ждёте, пока модель сгенерирует весь текст, и получаете его целиком. В потоковом — ответ приходит частями.</p><blockquote>Стриминг нужен для тех случаев, когда не можем ждать конечный ответ (например, голосовые каналы или текстовые, где хотим удержать внимание пользователя). При этом, стриминг не повредит и в других сценариях, но только если вы понимаете, что реализация стриминга с вашей стороны не требует больших усилий.</blockquote><blockquote>Со стримингом больше мороки на стороне вашей системы, например, по частям отправлять результат на фронтэнд, либо собирать результат если требуется обработка полного ответа. Получается, что без стриминга оптимально работать, если ответы короткие, либо результат используется для анализа, классификации.</blockquote><h2>Когда нужны фреймворки</h2><p>Прямых вызовов API достаточно для простых задач — отправить запрос и получить ответ. Фреймворки нужны, когда строите чат-бота с памятью, систему с поиском по документам или многоагентную систему.</p><blockquote>Фреймворки чисто для вызова модели не нужны, они скорее помогают нам комбинировать сложные реализации вызовов, например при разработке агентских систем. Тут мой фаворит LangGraph.</blockquote><blockquote>Если цель сугубо академическая, и хочется детально разобраться, то лучше изучать «низкоуровневые» API. Если строите что-то прикладное, то удобнее, быстрее и проще взять фреймворк. Я люблю langchain/langgraph, но в последнее время DSPy всё увереннее завоёвывает моё сердечко.</blockquote><blockquote>Из фреймворков наиболее универсальное сочетание — LangChain + LangGraph. Также могу выделить LlamaIndex, Haystack, AutoGen, crewAI, Neurite, FlashRAG.</blockquote><h2>Чек-лист перед стартом</h2><ul><li>Зарегистрируйтесь на сайте OpenAI и получите API-ключ в разделе настроек.</li><li>Настройте финансовые лимиты в биллинге OpenAI: Usage limits, Email notifications и Rate limits.</li><li>Подключите зарубежную карту для оплаты (виртуальную Pyypl/RedotPay или физическую карту зарубежного банка).</li><li>Настройте VPN или прокси-сервер для доступа к API из России (или используйте OpenRouter).</li><li>Установите библиотеку OpenAI для вашего языка программирования (pip install openai для Python или npm install openai для JavaScript).</li><li>Создайте файл .env и поместите туда API-ключ.</li><li>Напишите тестовый запрос с базовыми параметрами: model, messages, max_tokens, temperature.</li><li>Настройте обработку ошибок и повторные попытки при сбоях соединения.</li><li>Настройте мониторинг количества запросов и алерты на аномальную активность.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Из мидла в сеньора: какие навыки нужны бэкендеру для перехода в грейд выше</title>
      <link>https://tproger.ru/articles/iz-midla-v-senora--kakie-navyki-nuzhny-bekenderu-dlya-perehoda-v-grejd-vywe</link>
      <comments>https://tproger.ru/articles/iz-midla-v-senora--kakie-navyki-nuzhny-bekenderu-dlya-perehoda-v-grejd-vywe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tатьяна Крупская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/iz-midla-v-senora--kakie-navyki-nuzhny-bekenderu-dlya-perehoda-v-grejd-vywe</guid>
      <description><![CDATA[<p>Как бэкендеру перейти из мидла в сеньора: ключевые навыки, примеры из практики и советы экспертов SimbirSoft для роста в карьере.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/iz-midla-v-senora--kakie-navyki-nuzhny-bekenderu-dlya-perehoda-v-grejd-vywe">Из мидла в сеньора: какие навыки нужны бэкендеру для перехода в грейд выше</a>»</p>]]></description>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 02 Oct 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пишешь стабильный код, закрываешь задачи в срок, фреймворк знаешь наизусть, а грейд и зарплата всё те же. На архитектурные обсуждения зовут других, инциденты разбирают без тебя. На ревью комментируешь детали, но решают сеньоры и тимлиды. Знакомо? Это потолок мидла.</p><p>В этой статье разберём, какие навыки помогают мидлу вырасти в сеньора. Своим опытом поделились<b> эксперты из SimbirSoft: сеньор, тимлид и архитектор Виталий Синабдеев и сеньор-разработчик, ментор, тимлид и техлид Алексей Жуков.</b></p><h2>Какие hard skills отличают сеньора от мидла</h2><p>Для сеньора техника — это база. Он уверенно работает с архитектурой. Видит, где оптимизировать, и находит решения там, где мидлу уже не хватает опыта. Разберём конкретные хард-скиллы, которые показывают разницу.</p><figure><img src="https://media.tproger.ru/user-uploads/116601/2025-09-24/392cdf62-08cd-469a-9312-fba84eaee060.png" alt="" /></figure><h3>Работа с данными</h3><p>Сеньор свободно работает с SQL. Он понимает транзакции и уровни изоляции. Знает, как устроен MVCC. Проектирует схему базы с запасом на рост объёма данных и нагрузки. Понимает, когда нужен SQL, а когда лучше NoSQL — для кеша, аналитики или событий. Пишет запросы так, чтобы база выдерживала нагрузку. Читает execution plan. Пользуется EXPLAIN ANALYZE. Находит узкие места и ускоряет работу через метрики и инструменты вроде PgHero или APM.</p><p>С Git у сеньора тоже порядок. Он ведёт чистую историю. Аккуратно разбирает конфликты. Использует rebase и merge. Делит изменения на маленькие PR. Так, команда легко понимает репозиторий, движется быстрее и без стопоров.</p><h3>Архитектура и разработка систем</h3><p>Сеньор смотрит на систему целиком. Она должна держать нагрузку, быстро вставать после сбоев. Для этого он делит домены, задаёт границы, фиксирует контракты и сразу решает, что считать ошибкой.</p><p>В архитектуру закладывает таймауты и ретраи с backoff. Делает вызовы идемпотентными, чтобы повторы не ломали данные. Добавляет защиту: circuit breaker останавливает каскадные сбои, rate limiting сдерживает всплески трафика и кривые запросы клиентов.</p><p>Сеньор смотрит на метрики. Проверяет, чтобы система отвечала быстро даже на пике нагрузки. Знает, сколько времени уйдёт на восстановление. Понимает, чем грозит падение очереди или реплики базы.</p><p>Каждое решение он примеряет к реальности. Консистентность или скорость, код или инфраструктура, допустимый сбой или критический? Выбор фиксирует в коротком ADR, чтобы команда потом понимала, что и зачем меняется.</p><p>Мидлу часто не хватает опыта, чтобы включаться в такие обсуждения. <b>Виталий Синабдеев, senior, тимлид и архитектор SimbirSoft, вспоминает</b>:</p><blockquote>Когда я был мидлом, мне мешал недостаточный коммерческий опыт, чтобы участвовать в архитектурных обсуждениях. Он накопился, появилась уверенность, что мои предложения релевантные и проверены практикой. Это стало переломным моментом. Я понял, что перешёл на уровень выше: решал реальные кейсы, внедрял идеи и мог серьёзно влиять на архитектуру.</blockquote><h3>Качество кода и тесты</h3><p>Сеньор пишет код не только для себя, но и для всей команды. Он делает его понятным и удобным надолго. Для этого решает, какие модули нужны, как их назвать, какие правила проверяет линтер. Для него commit и push — не просто «сдал задачу», а способ синхронизировать команду и держать кодовую базу в порядке.</p><p>Мидл может написать юнит-тест или подключить интеграцию. Сеньор решает, какие тесты реально ускоряют релизы и снижают риски. Юнит-тесты он пишет под ключевую логику, интеграционные — под связь сервисов, контрактные — под интерфейсы. Делает их быстрыми и изолированными, чтобы запускались при каждом коммите.</p><h3>Инфраструктура и работа в проде</h3><p>Сеньор отвечает не только за код, но и за работу системы после релиза. Разработчик умеет упаковать сервис в контейнер и развернуть его в Kubernetes. В работе опирается на 12-Factor: конфигурации в окружении, стейтлес-сервисы, централизованные логи.</p><p>Сеньор выстраивает полноценный CI/CD. Каждый коммит проходит тесты и линтеры, деплой идёт автоматически на стейдж и в прод. Для релизов использует фича-флаги, делает миграции небольшими шагами, поддерживает откат. В продакшене применяет blue-green и canary деплой, чтобы снизить риски.</p><p>Кроме этого, он настраивает метрики по латентности и ошибкам, связывает логи и трейсы, ставит алерты по SLO. А если что-то идёт не так, фиксирует причины, договорённости и следит, чтобы проблема не повторялась.</p><h2>Почему одного кода мало: зачем сеньору продуктовый подход</h2><p>Один код не делает продукт ценным. Сеньор думает шире: ищет решение, которое принесёт больше пользы, поможет сэкономить ресурсы, быстрее выйти на рынок и снизить риски.</p><p>Эксперты из SimbirSoft рассказывают истории из практики:</p><p><b>Виталий Синабдеев, senior, тимлид и архитектор:</b></p><blockquote>На одном проекте я делал систему для металлургической компании. Заказчик хотел универсальный backend-конструктор, который выполняет любую функцию. Это выглядело как огромная и почти нереальная задача. Я оценил такой конструктор, объяснил, как он будет работать, и показал масштаб работ. Затем предложил другой путь: начать с частного решения и шаг за шагом развивать его в сторону универсальности. В итоге проект получился успешным. Мы сократили сроки, снизили риски и сделали гибкую систему, которую можно масштабировать.</blockquote><p>Пример <b>Алексея Жукова, senior-разработчика, ментора, тимлида, техлида</b> показывает, как архитектурное решение напрямую влияет на качество продукта и метрики:</p><blockquote>В одном из продуктов возникла проблема с экспортом документов на разные принтеры — современные и старые. Команда не находила универсального решения. Я вынес логику отрисовки в отдельные классы-стратегии, и система сама подбирала нужный способ. За неделю мы сделали контрол, который работал на любых устройствах. Это повысило качество и дало +15% к удовлетворённости клиентов.</blockquote><h2>Какие soft skills делают разработчика сеньором</h2><p>Хард-скиллы вызывают доверие, а софт-скиллы помогают вести за собой команду, снижать риски и развивать бизнес.</p><h3>Коммуникация и работа в команде</h3><p>Сеньор объясняет свою позицию так, чтобы её поняли все: разработчики, продакты, тестировщики и DevOps-инженеры.</p><p>На встречах помогает команде держать фокус: задаёт цель, не даёт уйти в сторону и сводит разные мнения к рабочему решению. После обсуждения фиксирует договорённости. Кто за что отвечает и в какие сроки.</p><p>Эксперты из SimbirSoft объясняют, что помогает выйти на этот уровень.</p><p><b>Виталий Синабдеев, senior, тимлид и архитектор:</b></p><blockquote>Важно приводить аргументы и подробно их объяснять, ссылаться на лучшие практики и опыт других компаний. И, конечно, не бояться высказывать дельные идеи и советы.</blockquote><p><b>Алексей Жуков, senior-разработчик, ментор, тимлид, техлид:</b></p><blockquote>Ключевой фактор — инициатива. Я начал предлагать решения и разбирать проблемы на собраниях. Но важно, чтобы предложения были не поверхностными. Именно интерес и стремление найти выход формируют уважение к мнению.</blockquote><h3>Наставничество и рост коллег</h3><p>Сеньор помогает команде расти. Он распределяет ответственность так, чтобы коллеги становились самостоятельнее и не зависели от него на каждом шаге. Доверяет и делегирует задачи. Даёт задачи чуть сложнее, чем текущий уровень, и при этом поддерживает чек-листами, ревью или совместной работой.</p><figure><img src="https://media.tproger.ru/user-uploads/116601/2025-09-24/3a40f120-cbd8-4651-8058-f89d3448af71.png" alt="" /></figure><p><b>Виталий Синабдеев, senior, тимлид и архитектор в SimbirSoft</b>:</p><blockquote>Трудно было сдерживаться и не подсвечивать готовое решение. Хотелось сразу показать лучший путь. Но так делать нельзя. Коллега должен сам доходить до сути, нарабатывать собственный опыт.</blockquote><p><b>Алексей Жуков, senior-разработчик, ментор, тимлид, техлид в SimbirSoft:</b></p><blockquote>Самым тяжёлым было научиться правильно воспринимать неудачи подопечного. Поначалу я воспринимал каждый промах как собственную ошибку, что мешало объективно помогать. Постепенно я понял: наставничество — это не критика, а умение поддержать, разобраться в причинах и подсказать путь к решению.</blockquote><h3>Работа в условиях неопределённости</h3><p>Сеньор спокойно работает, когда требования неполные или противоречивые. Он разбивает задачу на гипотезы, отмечает риски и предлагает минимальное решение, которое можно быстро проверить. Все свои предположения и ограничения записывает, чтобы команда понимала, на чём держатся шаги и что менять, если вводные изменятся.</p><p><b>Алексей Жуков, senior-разработчик, ментор, тимлид, техлид в SimbirSoft:</b></p><blockquote>Задачи с размытыми требованиями встречаются регулярно. Особенно запомнилась одна: у разных сторон были противоположные ожидания. Я погрузился в предмет, чтобы понять, откуда растут противоречия. На встрече показал, какие требования конфликтуют. Так, мы нашли компромисс, который устроил всех. Этот опыт научил меня, что важно не только решать технические задачи, но и находить баланс между интересами.</blockquote><h3>Английский для документов и встреч</h3><p>Для мидла обычно достаточно читать документацию и разбирать простые комментарии. Сеньор пишет на английском документацию, отвечает на тикеты, общается с коллегами из других стран.</p><p><b>Алексей Жуков, senior-разработчик, ментор, тимлид, техлид в SimbirSoft:</b></p><blockquote>Прежде всего английский нужен для чтения технической документации. Это стало особенно заметно с 2007 года, когда появилась технология WPF. Официальных материалов не было, а книги от Microsoft не переводились. Язык также нужен, чтобы общаться с зарубежными коллегами, заказчиками и маркетологами.</blockquote><p><b>Виталий Синабдеев, senior, тимлид и архитектор в SimbirSoft:</b></p><blockquote>На онлайн-встречах с носителями языка знание английского особенно важно. Бывало, что моих знаний не хватало — и тогда выручал кто-то из команды. Командная работа критически важна в любом проекте.</blockquote><h2>Мидл и сеньор: сравниваем в таблице</h2><p>Собрали основные различия в задачах, ответственности и подходах к разработке.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-02/7c14b1ec-c41b-4be1-a98d-bf71755c7d22.png" alt="" /></figure><h2>Советы от сеньоров</h2><p>Мы спросили у опытных разработчиков, что помогает мидлу расти дальше и за сколько реально выйти на уровень сеньора. Вот их ответы.</p><p><b>Виталий Синабдеев, senior, тимлид и архитектор в SimbirSoft:</b></p><blockquote>Будьте самокритичны. Но в меру. Попробуйте учить других. Это лучший способ увидеть свои пробелы. Развивайте софт- и хард-скиллы. Сеньор — это не только технический эксперт, но и человек, который погружается в предмет, общается с командой и заказчиками, создаёт рабочую среду. Если вы горите работой, готовы жертвовать временем и учитесь, рост возможен быстро. Я знаю человека, который вырос со стажёра до сеньора за 4 месяца, но это редкость. Главное, постоянное желание развиваться. Рост — это не прыжок, а устойчивое движение вперёд. Работайте над собой — и результат придёт.</blockquote><p><b>Алексей Жуков, senior-разработчик, ментор, тимлид, техлид в SimbirSoft:</b></p><blockquote>Срок, за который можно повысить грейд, зависит от количества проектов и вовлечённости. Нужно не просто выполнять задачи и писать код в сервис, а глубже разбираться. Понимать архитектуру; задавать техлиду вопросы, почему выбраны именно эти технологии. Важно расширять кругозор: читать книги по программированию, смотреть доклады, изучать чужой код и подходы.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Что нового в Python 3.14: разбираем главные изменения</title>
      <link>https://tproger.ru/articles/chto-novogo-v-python-3-14--razbiraem-glavnye-izmeneniya</link>
      <comments>https://tproger.ru/articles/chto-novogo-v-python-3-14--razbiraem-glavnye-izmeneniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-novogo-v-python-3-14--razbiraem-glavnye-izmeneniya</guid>
      <description><![CDATA[<p>Полный разбор нововведений Python 3.14: шаблонные строки, отложенные аннотации типов и улучшенная многопоточность. Примеры кода и практические рекомендации по переходу на новую версию. Актуальная информация для разработчиков на 2025 год.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-novogo-v-python-3-14--razbiraem-glavnye-izmeneniya">Что нового в Python 3.14: разбираем главные изменения</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 30 Sep 2025 12:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Очередной апдейт Python не только улучшил в архитектуру и синтаксис, но и серьёзно изменил работу рантайма. Официальный релиз 3.14 <a href="https://www.python.org/downloads/release/python-3140rc3/">запланирован</a> на 7 октября 2025 года, но мы уже изучили документацию и готовы показать, что скрывается за сухими строчками <a href="https://docs.python.org/3/whatsnew/changelog.html">чейнджлога</a> (журнала изменений).</p><p>Вам больше не придется ставить скобки при перехвате исключений, появились строки-шаблоны для безопасного форматирования и множественные улучшения многопоточности. Разберём ключевые нововведения на конкретных примерах кода — от обработки ошибок до параллельных вычислений.Материал будет полезен как опытным разработчикам, так и тем, кто только начинает погружаться в мир Python. .</p><h2>Улучшенный синтаксис и новые возможности</h2><p>Python 3.14 вносит несколько изменений в синтаксис языка. Они затронут обработку исключений, работу со строками и аннотациями.</p><h3>Обработка исключений без скобок</h3><p>Раньше при перечислении нескольких исключений в блоке except нужно было ставить скобки. Теперь это правило смягчили. Скобки можно не указывать, если вы не используете ключевое слово as. Это мелочь, но она делает код аккуратнее.</p><p>Вот как выглядело раньше:</p><p>Теперь можно писать так:</p><p>Но если нужно поймать исключение в переменную, скобки все равно требуются:</p><p>Это изменение описано в <a href="https://peps.python.org/pep-0758/">PEP 758</a>. Python Enhancement Proposal — официальный документ с предложениями по улучшению Python, в котором описаны новые функции, процессы или среды разработки языка.</p><h3>Строки-шаблоны для безопасной обработки</h3><p>В Python 3.14 появились строки-шаблоны (<a href="https://first.institute/ru/blog/template-strings-strokovye-shablony-v-python-314/">template strings</a>). Их отмечают префиксом t вместо привычного f. Такие строки не вычисляются сразу в строковый объект. Вместо этого они возвращают специальный объект Template, который можно обработать особым образом.</p><p>Пример создания шаблона:</p><p>Такой шаблон можно разбирать на части. Это полезно для безопасной вставки значений, например, в HTML или SQL-запросы. Вы сами контролируете процесс подстановки и можете экранировать опасные символы.</p><p>Вот пример функции, которая корректно обрабатывает HTML:</p><p>Это основано на <a href="https://peps.python.org/pep-0745/">PEP 750</a>.</p><h3>Ленивые аннотации типов</h3><p>Аннотации типов в Python 3.14 перешли на новую модель вычисления. Раньше они вычислялись сразу при создании объектов, что вызывало проблемы с резоловингом имен в рантайме. Теперь используется механизм отложенного вычисления через дескриптор __annotations__ и атрибут __annotate__.</p><p>Когда интерпретатор встречает аннотацию, он не вычисляет ее значение сразу. Вместо этого создается специальный объект, который хранит строковое представление аннотации. Реальное вычисление происходит только при первом обращении к __annotations__.</p><p>Вот как выглядела типичная проблема раньше:</p><p>Теперь этот код работает корректно. При компиляции аннотация -&gt; MyClass сохраняется как строка. Когда вы обращаетесь к MyClass.build.__annotations__, дескриптор запускает механизм вычисления и возвращает готовый тип.</p><p>Новая логика компилятора разделяет процесс на два этапа:</p><ol><li>Генерация функции `__annotate__` из AST во время работы компилятора</li><li>При вызове дескриптора `.__annotations__` теперь будет вызван `.__annotate__(format=annotationlib.Format.VALUE)`</li></ol><p>Пример работы нового механизма:</p><p>Это изменение основано на <a href="https://peps.python.org/pep-0649/">PEP 649</a> и делает работу с аннотациями более интуитивной и надёжной. Более того, `from _future_ import annotations` теперь не нужен для корректной работы —  это признано не самым удачным решением.</p><p>Для работы с аннотациями добавили модуль <a href="https://docs.python.org/3.14/library/annotationlib.html#module-annotationlib">annotationlib</a>. Он позволяет получать аннотации в разных форматах:</p><p>Эту возможность внесли по <a href="https://peps.python.org/pep-0649/">PEP 649</a> и <a href="https://peps.python.org/pep-0749/">PEP 749</a>.</p><h2>Изменения в стандартной библиотеке</h2><p>Разработчики продолжают наполнять стандартную библиотеку полезными модулями и функциями. В Python 3.14 добавили поддержку новых форматов сжатия, улучшили работу с файловыми путями и UUID.</p><h3>Модуль compression.zstd для быстрого сжатия</h3><p>В стандартной библиотеке Python 3.14 появился модуль для работы с алгоритмом сжатия Zstandard (zstd). Эта технология изначально разрабатывалась в Facebook* и уже несколько лет доступна как сторонняя библиотека zstandard. Теперь она интегрирована в стандартную поставку Python по <a href="https://peps.python.org/pep-0784/">PEP 784</a>.</p><p><i>*Компания Meta признана на территории РФ экстремистской и запрещена</i>.</p><p>Zstandard демонстрирует лучшую эффективность и скорость по сравнению с классическим zlib. Алгоритм особенно хорошо показывает себя на современных многоядерных процессорах, поддерживая распараллеливание операций сжатия.</p><p>Основные преимущества zstd:</p><ul><li>высокая скорость сжатия и распаковки;</li><li>хорошая степень сжатия, сравнимая с zlib;</li><li>поддержка словарей для улучшенного сжатия текстовых данных;</li><li>возможность настройки уровня сжатия от 1 до 22.</li></ul><p>Пример использования:</p><p>Для тех, кто работал с внешней библиотекой <a href="https://pypi.org/project/zstandard/">zstandard</a>, интерфейс будет знакóм. Модуль сохраняет совместимость с API оригинальной реализации, что упрощает переход на стандартную версию.</p><h3>Новые методы для Path в pathlib</h3><p>Класс Path в модуле pathlib получил методы для копирования и перемещения файлов. Раньше для этих операций приходилось использовать функции из shutil или писать собственные реализации. Теперь работа с файлами стала более удобной и логичной.</p><p>Пример копирования файла с проверкой сохранности исходного файла:</p><p>Метод copy() создает копию файла, оставляя оригинал без изменений. Это важно понимать при работе с критически важными данными.</p><p>Пример перемещения файла:</p><h3>Поддержка UUID версий 6-8</h3><p>Модуль uuid теперь поддерживает генерацию UUID шестой, седьмой и восьмой версий. Каждая версия решает конкретные практические задачи, выходящие за рамки классических UUIDv4.</p><p>UUIDv6 сохраняет временную информацию как UUIDv1, но использует более удобный порядок байт. Это позволяет эффективно индексировать временные метки в базах данных без дополнительных преобразований. Идеален для систем, где важна хронологическая сортировка идентификаторов.</p><p>UUIDv7 генерируется на основе текущего времени в Unix-формате с добавлением случайных битов. Он сочетает сортируемость по времени с равномерным распределением, что исключает утечку информации о системе-генераторе. Подходит для веб-приложений и распределенных систем.</p><p>UUIDv8 предоставляет гибкость для кастомных реализаций. Разработчики могут определять собственную структуру UUID под специфические требования проектов.</p><p>Пример генерации новых UUID:</p><p>Выбор версии зависит от конкретных требований к сортировке, безопасности и структуре идентификаторов в вашей системе.</p><h2>Многопоточность и параллелизм</h2><p>Важное направление эволюции Python — улучшенная поддержка многопоточности и параллельных вычислений. В версии 3.14 этот тренд развивается особенно активно.</p><h3>Множественные интерпретаторы в стандартной библиотеке</h3><p>Запускать несколько интерпретаторов в одном процессе в Python можно давно, но эта функция была доступна только через C-API. Теперь опцию <a href="https://peps.python.org/pep-0734/">вынесли</a> в стандартную библиотеку в модуль concurrent.interpreters.</p><p>Интерпретаторы изолированы друг от друга лучше, чем потоки. Каждый интерпретатор имеет собственное состояние и, по умолчанию, собственный GIL. Это настраивается — через C-API можно создать интерпретаторы с общим GIL или полностью независимые.</p><p>Такая архитектура позволяет операционной системе распределять интерпретаторы по разным ядрам процессора. Это обходит ограничения глобальной блокировки, которая вне free-threading билда мешает настоящему параллелизму.</p><p>Пример запуска кода в отдельном интерпретаторе:</p><p>Система даёт разработчикам гибкость в выборе модели параллелизма в зависимости от конкретных требований приложения. Модуль concurrent.futures предоставляет высокоуровневый интерфейс для асинхронного выполнения, а interpreters позволяет работать с множественными интерпретаторами Python, что особенно полезно для изоляции задач и эффективного использования ресурсов.</p><p>Больше подробностей — в этом <a href="https://www.youtube.com/watch?v=VBiaNNpLzWA">видео</a>.</p><h3>Официальная поддержка свободной многопоточности</h3><p>Свободная многопоточность (<a href="https://peps.python.org/pep-0779/">free-threading</a>) перестала быть экспериментальной. Теперь это официально поддерживаемая опция сборки Python. В таком режиме интерпретатор не использует GIL, что позволяет потокам работать действительно параллельно.</p><p>Это особенно полезно для задач, связанных с интенсивными вычислениями. Например, для научных расчетов или обработки больших данных. Также есть преимущества для сетевых операций — можно обрабатывать множество соединений одновременно без блокировок GIL.</p><p>Однако не все сторонние библиотеки совместимы с этим режимом. Многие расширения разрабатывались с учетом существования GIL и могут требовать доработки для безопасной работы в многопоточной среде без глобальной блокировки.</p><h2>Производительность и внутренние улучшения</h2><p>Каждая новая версия Python приносит оптимизации производительности. В 3.14 эти улучшения особенно заметны.</p><h3>Новый интерпретатор с промежуточными вызовами</h3><p>Tail-Calling Interpreter — это не оптимизация хвостовой рекурсии в языке Python для программистов, а внутренний метод диспетчеризации байт-кода в самом интерпретаторе CPython. Он призван заменить ранее использовавшиеся подходы (огромный switch-оператор или вычисляемые goto) для более эффективного перехода между обработчиками отдельных инструкций байт-кода.</p><p>Вместо одного большого цикла с оператором switch или множественных переходов между метками внутри гигантской функции каждый обработчик инструкции (например, OP_ADD) теперь реализован как небольшая самостоятельная функция на языке C. Завершается такая функция не простым возвратом, а хвостовым вызовом (tail call) следующей функции-обработчика.</p><p>Это возможно благодаря специальным атрибутам компилятора:</p><ul><li>[[clang::musttail]] — гарантирует, что компилятор преобразует вызов в прямой прыжок (jump), а не в классический call с созданием нового стек-фрейма.</li><li>__attribute__((preserve_none)) (GHC-соглашение о вызовах) — указывает, что функция не должна сохранять значения регистров, что минимизирует накладные расходы при таком стиле диспетчеризации.</li></ul><p>Подход позволяет разбить монолитный код интерпретатора на множество мелких функций, что упрощает работу компилятора (например, распределение регистров) и потенциально повышает производительность.</p><p>Подробнее об этом читайте в тг-канале <a href="https://t.me/opensource_findings/892">Находки в опенсорсе</a> Никиты Соболева.</p><h3>Оптимизация счетчиков ссылок</h3><p>Это изменение основано на реализации «immortal objects» (PEP 683), где некоторые встроенные объекты становятся бессмертными. Их счетчики ссылок перестают изменяться, что уменьшает нагрузку на механизм управления памятью и делает такие объекты полностью иммутабельными на уровне C.</p><p>Подробнее об этой оптимизации можно узнать из <a href="https://peps.python.org/pep-0683/">PEP 683</a> и <a href="https://habr.com/ru/articles/929228/">обсуждений</a> в рабочих группах по производительности Python.</p><h2>Инструменты разработчика и отладка</h2><p>Python 3.14 добавляет опции, которые существенно упрощают жизнь разработчикам. Речь пойдет об отладке и проверке кода.</p><h3>Безопасный интерфейс для внешних отладчиков</h3><p>Добавили безопасный интерфейс (<a href="https://peps.python.org/pep-0768/">PEP 768</a>) для подключения отладчиков к работающим процессам Python. Раньше отладчики использовали недокументированные возможности, что могло привести к нестабильной работе.</p><p>С новым интерфейсом можно подключаться к процессу без его остановки. Это особенно ценно для продакшн-систем, где нельзя прерывать работу сервиса.</p><p>Основные компоненты интерфейса:</p><ul><li>sys.debug_attach() — инициализация отладочной сессии</li><li>sys.debug_detach() — завершение сессии</li><li>sys.debug_eval() — выполнение кода в контексте процесса</li></ul><p>Пример использования для отладки работающего приложения:</p><p>Интерфейс обеспечивает безопасное подключение без остановки процесса. Отладчик получает доступ к стеку вызовов, переменным и состоянию потоков через стандартизированное API.</p><h3>Предупреждения для return в finally</h3><p>Блок <a href="https://docs.python.org/3.14/reference/compound_stmts.html#finally">finally</a> предназначен для очистки ресурсов. Операторы return, break или continue в этом блоке могут привести к неожиданному поведению (ниже рассмотрим пример). Теперь компилятор выдает SyntaxWarning для таких случаев.</p><p>Пример проблемного кода:</p><p>В нормальной ситуации функция вернула бы значение из блока try. Но из-за return в finally возвращается другое значение. Теперь компилятор предупредит о потенциальной проблеме.</p><h3>Безопасность и подписи релизов</h3><p>Изменения затронули и процесс распространения Python. Разработчики отказались от PGP-подписей в пользу более современного решения. Причины апдейта — растущая сложность работы с PGP и сниженная популярность этого способа среди разработчиков.</p><h3>Переход на Sigstore</h3><p>Начиная с Python 3.14, релизы больше не подписывают с помощью PGP. Вместо этого используют <a href="https://www.python.org/downloads/metadata/sigstore/">Sigstore</a> — современный стандарт для подписи, проверки и защиты программного обеспечения. Sigstore — это набор инструментов с открытым исходным кодом, включающий Cosign для подписи контейнеров, Fulcio для управления сертификатами и Rekor для ведения прозрачного журнала.</p><p>Новый подход решает ключевые проблемы PGP:</p><ul><li>Sigstore использует кратковременные сертификаты, привязанные к идентификаторам OIDC (OpenID Connect) — теперь не нужно бесконечно хранить приватные ключи.</li><li>Система обеспечивает проверяемую прозрачность через публичный журнал всех операций подписи. Каждая подпись сопровождается временной меткой и информацией о сертификате.</li></ul><p>Разработчики могут проверять подписи с помощью инструмента sigstore-python. Пример проверки выглядит так:</p><p>Решение соответствует современным стандартам безопасности и упрощает процесс проверки для конечных пользователей. Sigstore уже используют такие проекты, как Kubernetes, GitHub и теперь официальный Python.</p><h2>Подготовка к переходу на Python 3.14</h2><p>Переход на новую версию требует тщательной подготовки. Обратите внимание на ключевые моменты, чтобы избежать проблем.</p><h3>Проверка совместимости</h3><p>Некоторые изменения нарушают обратную совместимость. Платформы, кроме macOS и Windows, теперь по умолчанию используют forkserver вместо fork для multiprocessing и ProcessPoolExecutor. Это связано с проблемами стабильности при использовании fork в многопоточных приложениях.</p><p>Новый подход может вызывать ошибки NameError или проблемы с pickle. Модули, которые полагаются на унаследованное состояние после fork, потребуют доработки. Проверьте код на совместимость с методом запуска forkserver. Особое внимание уделите работе с глобальными переменными и открытыми ресурсами.</p><p>Системные администраторы должны обновить конфигурации развертывания. Новые методы запуска влияют на управление процессами в production-среде.</p><h3>Обновление инструментов</h3><p>Новый синтаксис не работает в предыдущих версиях Python. Строки-шаблоны и другие возможности требуют обновить весь инструментарий:</p><ul><li>Проверьте поддержку Python 3.14 в ваших IDE и редакторах. Обновите линтеры и форматеры кода. MyPy и другие статические анализаторы потребуют новых версий для корректной работы с обновленной системой типов.</li><li>Интеграционным системам нужна настройка. Обновите конфигурации CI/CD для тестирования на Python 3.14. Убедитесь, что системы сборки поддерживают новую версию.</li><li>Сторонние библиотеки могут требовать обновления. Проверьте совместимость ключевых зависимостей вашего проекта. Некоторые пакеты могут еще не поддерживать новые возможности Python.</li><li>Документационные генераторы и инструменты тестирования также нуждаются в проверке. Убедитесь, что вся экосистема разработки готова к переходу.</li></ul><h2>Итоги</h2><p>Python 3.14 продолжает традиции развития языка. Нововведения делают код чище, а программы — эффективнее. Строки-шаблоны открывают возможности для безопасной обработки, а отложенные аннотации решают проблему циклических импортов.</p><p>Улучшения в многопоточности и параллелизме помогают использовать современное железо. А новые модули стандартной библиотеки избавляют от необходимости искать сторонние решения.</p><p>Официальный релиз запланирован на 7 октября 2025 года. У вас есть время подготовиться к переходу. Проверьте свои проекты на совместимость и познакомьтесь с новыми возможностями.</p><p>Python остается языком, который развивается с учетом потребностей разработчиков. Версия 3.14 — очередной шаг в этом направлении.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как непротестированная вкладка чуть не убила релиз</title>
      <link>https://tproger.ru/blogs/pochti-proval--pochti-pobeda</link>
      <comments>https://tproger.ru/blogs/pochti-proval--pochti-pobeda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Якушева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/blogs/pochti-proval--pochti-pobeda</guid>
      <description><![CDATA[<p>История из первых рук о том, как незаметная «забытая» вкладка во время финальной проверки привела к 500-й ошибке, панике и спасению релиза в последний момент. Про усталость, стыд, самоиронию и то, как команды учатся на собственных провалах (иногда на горьком опыте).</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/blogs/pochti-proval--pochti-pobeda">Как непротестированная вкладка чуть не убила релиз</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[История успеха]]></category>
      <category><![CDATA[История IT]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Блоги]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Sep 2025 12:29:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>История ради истории про мой проход по тонкому льду и дефекты прямо перед демо.</p><p>Также подписывайтесь на мой ТГ, который я почти не веду.</p><p>Однажды, в самом начале карьеры, когда я была молода и горяча, мы пилили приложение. Большое, серьёзное, адски сложное и практически неподъёмное. Сидели до ночи, заливались литрами кофе, выходили в выходные и на ноябрьские праздники, чтобы на руках пронести первый релиз — сдобренный молитвами и нашими слезами.</p><p>Я помню, как сейчас, ту прекрасную зимнюю пору: готовилась к демо. Последняя попытка. Последний шанс выйти в прод до нового года. Коллеги из других команд уже ушли на новогодний корпоратив — пить, курить и веселиться. А мы узким кружком готовились к демонстрации. Часики тикали, всё почти готово. Я открываю финальную вкладку… и у меня схлопывается интерфейс в ошибку 500, приложение встаёт колом — ни туда, ни сюда.</p><p>Мы выкатываем глаза, разработчик начинает исправлять дефекты наживую, а минутная стрелка стремительно приближается к началу демо.</p><p>Пока все собираются, я начинаю тираду в духе: «Добрый день, здравствуйте, дорогие коллеги. Мы очень рады представить вам наш <i>мертворождённый</i> релиз…»</p><p>На фоне вижу, как разработчик машет руками и показывает пальцами вверх: он починил, всё будет хорошо.</p><p>Я радостно показываю новый функционал, который, вообще-то, был хорош — действительно годный для старта, чтобы опробовать и понять: надо/не надо. Мне он нравился от начала и до конца. Всё шло гладко, я подробно рассказывала про каждую кнопочку, вкладочку и ссылку — всё будет ровнее ровного.</p><p>И тут я понимаю… О боже. Холодный пот выступает на лбу, когда я осознаю, что в тестировании бэкенда я совсем забегалась и даже не открывала ту злополучную вкладку, которая может схлопнуть приложение.</p><p>Нет.</p><p>В ней не пророс буйным цветом дефект регресса. Она не тестировалась вообще.</p><p>Никогда.</p><p>Ошибка 500 не была случайностью. Она была слепым пятном, про которое в спешке я забыла!</p><p>Господь. Я была плохой девочкой и тестировала без документации и тест-кейсов. Но обещаю, что это мой последний провал (ха-ха — нет). Обещаю потом всё задокументировать (нет). Обещаю аккуратно ввести рабочие планы (всё ещё нет).</p><p>Я взмолилась (всем известным богам) и в частности своему разработчику, который стоял за моей спиной, пил кофе и следил за демо. Мне было страшно и стыдно; с трясущимися пальцами я медлила открыть ту самую вкладку.</p><p>Кажется, мозг отключился. Я уже приготовила монолог: «Мы так задумывали — чтобы приложение умирало между запросом и ответом. Так вы сможете сделать себе чай, пока серверы проходят свой персональный краш-тест.»</p><p>Быть опозоренной перед всеми: заказчиками, пользователями, инфобезой, командой разработки. Я ощутила как над моей головой нависла секира невидимого палача, чтобы одним рывком – точным и расчетливым – перерубить мою карьеру на корню. Я была готова выкладывать свое резюме на hh под бой курантов.</p><p>И вдруг кружок загрузки завертелся — вкладка открылась.</p><p>За моей спиной аналитик и разработчик дают друг другу «пять» и чокаются кружками мерзкого американо, потому что молоко скисло ещё вчера.</p><p>Мы справились. За час мы пролетели через все эмоциональные качели: провал — успех — осознание приближающегося конца — смерть — и снова успех.</p><p>Не помню, напились ли мы после того рабочего дня или залипали в стену до новогодних праздников. Кажется, мой мозг заблокировал те воспоминания, которые случились именно тогда.</p><p>Хочу отметить: потом мы долго и скрупулёзно доводили процессы до ума, чтобы уже не бегать с горящей задницей перед релизом.</p><p>Да, мы бегали.</p><p>Да, у нас были провалы.</p><p>Да, у нас были дефекты в проде.</p><p>Очень много «да». Я складываю руки в молитве за каждый такой провал и верю, что мне ещё много чему предстоит научиться. И да — я облажаюсь еще раз. Я в этом уверена и с какой-то тёплой надеждой жду момента, когда снова придётся преодолеть очередную катастрофу.</p><p>К чему это я? Приближается горячий сезон, и каждый из нас готовится к нему. Не знаю, как вы, но мои единственные планы на высокий сезон — это скидки на Алиэкспресс и попытка ухватить навесной унитаз по вопиюще низкой цене. Я слишком долго пила антидепрессанты, чтобы работать в таком режиме в свои 27.</p><p>Никто не вспомнит, как ты задерживался на работе. Тебя заменят другим человеком, и никто не поставит памятник (разве что ты сам соберёшь его из гор пластиковых кофейных стаканчиков).</p><p>sorry not sorry</p><p>Хочу поддержать каждого, кто проходил через подобное. У меня нет слов, чтобы описать, сколько боли и нервов было потрачено тогда, и сколько трудностей ждёт нас впереди.</p><p>Если вы дошли до этого места — спасибо вам. И помните: всё обязательно получится (или не получится). Не теряйте веры. Не теряйте надежды. Продолжайте учиться и совершенствоваться.</p><p>Будущее не будет радужным и безоблачным — на самом деле, никогда не будет.</p><p>Но я верю в вас. Я учусь на своих провалах и катастрофах. Я знаю, что иногда была не права и по-старинке остаюсь идиоткой время от времени (уже меньше, но всё ещё бывает).</p>]]></content:encoded>
    </item>
    <item>
      <title>5 технологий, которые через три года станут стандартом для бэкенда: прогноз на основе данных</title>
      <link>https://tproger.ru/articles/5-tehnologij--kotorye-cherez-tri-goda-stanut-standartom-dlya-bekenda--prognoz-na-osnove-dannyh</link>
      <comments>https://tproger.ru/articles/5-tehnologij--kotorye-cherez-tri-goda-stanut-standartom-dlya-bekenda--prognoz-na-osnove-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-tehnologij--kotorye-cherez-tri-goda-stanut-standartom-dlya-bekenda--prognoz-na-osnove-dannyh</guid>
      <description><![CDATA[<p>Анализируем отчеты Gartner, Stack Overflow и GitHub о будущем бэкенд-разработки. Обзор AI-ассистентов, cloud-native решений, Security as Code и других технологий, которые изменят подход к разработке. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-tehnologij--kotorye-cherez-tri-goda-stanut-standartom-dlya-bekenda--prognoz-na-osnove-dannyh">5 технологий, которые через три года станут стандартом для бэкенда: прогноз на основе данных</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 12 Sep 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ежедневная рутина убивает креатив. Пока одни тратят часы на ручное развёртывание инфраструктуры или отладку монолитных систем, другие уже проектируют отказоустойчивые облачные архитектуры, которые масштабируются одним щелчком.</p><p>Мир бэкенда стремительно меняется под влиянием искусственного интеллекта, облачных платформ и новых парадигм разработки. Через три года эти технологии превратятся из модных трендов в привычные инструменты каждого разработчика.</p><p>На основе анализа отчётов Gartner, Stack Overflow Developer Survey и открытых данных GitHub мы выделили пять ключевых технологий, которые определят стандарты бэкенд-разработки к 2028 году.</p><h2>Ключевые тренды в современном бэкенде</h2><p>Бэкенд-разработка переживает фундаментальную трансформацию. <a href="https://www.ndtvprofit.com/technology/cloud-computing-will-become-a-business-necessity-by-2028-gartner">По данным Gartner</a>, к 2028 году облачные вычисления превратятся из прорывной технологии в критически важный компонент для поддержания конкурентоспособности бизнеса. Это означает, что компании, не перешедшие на новые инструменты в облаках, окажутся в заведомо проигрышном положении.</p><p>Другой важный тренд — интенсивное внедрение ИИ в разработку. Stack Overflow Developer Survey 2025 <a href="https://survey.stackoverflow.co/2025/technology">показывает</a>, что 82% разработчиков уже используют GPT-модели OpenAI в своей работе. И это не просто дань моде — AI кардинально меняет процессы создания кода, тестирования и отладки. Например, GitHub Copilot не только предлагает фрагменты кода, но и генерирует unit-тесты, а также исправляет уязвимости прямо в процессе написания программы.</p><p>Российский IT-рынок демонстрирует особую динамику. После впечатляющего роста на 46% в прошлом году, он продолжает <a href="https://adpass.ru/prognoz-razvitiya-rossijskogo-it-rynka-do-2028-goda/">развиваться</a>, хотя и более умеренными темпами — около 12% в год. Акцент на импортозамещение создаёт уникальную среду для развития отечественных бэкенд-решений, что особенно заметно в сегменте заказной разработки ПО с <a href="https://adpass.ru/prognoz-razvitiya-rossijskogo-it-rynka-do-2028-goda/">ежегодным приростом</a> около 14%.</p><p>Особое значение <a href="https://integrator.nota.media/blog/articles/trendy-zakaznoy-razrabotki-v-2025-godu/">приобретает</a> гиперперсонализация бэкенд-систем. Современные платформы всё чаще анализируют поведение пользователей и автоматически адаптируют API-ответы, бизнес-логику и уровни доступа под индивидуальные потребности. Это позволяет создавать гибкие системы, в которых каждый юзер получает персонализированную версию функционала без изменения базового кода.</p><p>Ещё один значимый тренд — развитие IoT-интеграций. Промышленные предприятия, логистические и медицинские компании активно внедряют системы, объединяющие бэкенд с устройствами интернета вещей. Это требует новых подходов к обработке потоковых данных, обеспечению низкой задержки и созданию отказоустойчивых архитектур, способных работать с тысячами подключенных устройств одновременно.</p><p>Кроме того, растёт спрос на low-code решения для бэкенда. Бизнес-аналитики и продакт-менеджеры получают возможность самостоятельно настраивать бизнес-логику с помощью визуальных конструкторов, что сокращает нагрузку на разработчиков и ускоряет процесс. Это особенно актуально для российского рынка, где <a href="https://blog.cortel.cloud/2025/04/15/it-trendy-chto-budet-s-otechestvennym-softom-v-2025-2027-godah/">сохраняется</a> дефицит квалифицированных бэкендеров.</p><p>Далее — подробный разбор технологий, которые станут привычными инструментами прогеров в ближайшем будущем.</p><h2>Технология 1: AI-ассистенты для разработки и DevOps</h2><p>Искусственный интеллект теперь — эффективный помощник почти каждого программиста. AI такой же незаменимый инструмент, как IDE или система контроля версий.</p><h3>Почему это станет стандартом</h3><p>AI-ассистенты решают одну из главных проблем разработки — рутинные операции. Современные системы на базе больших языковых моделей способны генерировать шаблонный код, предлагать варианты оптимизации, находить уязвимости и даже помогать в рефакторинге.</p><p>Год назад Gartner <a href="https://www.advsyscon.com/blog/gartner-it-automation/">прогнозировал</a>, что к 2025 году 50% предприятий будут использовать платформы оркестрации AI для операционализации искусственного интеллекта. В бэкенд-разработке это выразится в интеграции AI-помощников непосредственно в DevOps-процессы — от автоматического написания тестов до оптимизации запросов к базам данных.</p><p>Современные ИИ-инструменты уже могут создавать сложные приложения по текстовым описаниям. В 2025 году платформа Replit <a href="https://habr.com/ru/articles/907122/">показала</a> впечатляющий пример: она сгенерировала полноценный клон игры Zelda с боями, ландшафтом и ИИ-противниками всего по одному запросу. При этом инструмент сам тестировал результат через скриншоты, имитируя цикл обратной связи разработчика.</p><p>ИИ-системы теперь применяют новые методы тестирования:</p><ul><li>автоматически проверяют код через скриншоты и визуальную верификацию;</li><li>сравнивают результаты с эталонными решениями на сложных эталонных тестах (бенчмарках) вроде SWE-bench;</li><li>используют метаморфное тестирование для поиска скрытых ошибок .</li></ul><p>При отладке ИИ не только находит ошибки, но и предлагает исправления с пояснениями. Однако 66% разработчиков <a href="https://stackoverflow.blog/2025/07/29/developers-remain-willing-but-reluctant-to-use-ai-the-2025-developer-survey-results-are-here/">отмечают</a> проблему «почти правильного» кода, который всё же требует доработки . Это доказывает: ИИ не заменяет программистов, а меняет их работу — теперь они больше фокусируются на сложных архитектурных задачах.</p><p>Ключевое преимущество современных AI-ассистентов — способность интегрироваться в полный цикл разработки. Например, такие инструменты, как GitHub Copilot, не только генерируют код, но и помогают создавать конфигурации для Infrastructure as Code (IaC), включая YAML-файлы, шаблоны Terraform и конфигурации Ansible. Это значительно снижает ошибки при настройке CI/CD-пайплайнов и ускоряет развёртывание инфраструктуры.</p><p>Кроме того, AI-ассистентов всё чаще <a href="https://habr.com/ru/sandbox/246908/">используют</a>, чтобы автоматического анализировать логи и выявлять аномалии, что позволяет проактивно устранять проблемы заранее.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-09/4930f2f6-aac3-49c1-a430-e3463be29694.png" alt="" /></figure><p><i>Практическая польза уже очевидна: разработчики, применяющие AI-инструменты, сообщают о сокращении времени на рутинные задачи на 30-40%. Это подтверждается <a href="https://survey.stackoverflow.co/2025/technology">данными</a> Stack Overflow о том, что профессиональные разработчики всё чаще используют Claude Sonnet от Anthropic.</i></p><h2>Технология 2: Cloud-native и отраслевые облачные платформы</h2><p>Облачные технологии прошли путь от популярного тренда до бизнес-необходимости. Gartner <a href="https://www.ndtvprofit.com/technology/cloud-computing-will-become-a-business-necessity-by-2028-gartner">предсказывает</a>, что более 50% предприятий будут использовать отраслевые облачные платформы к 2028 году. Это означает переход от общих cloud-решений к специализированным платформам, созданным для конкретных индустрий.</p><h3>Ключевые изменения в подходе</h3><p>Современные cloud-native решения — это не просто перенос приложений в облако, а принципиально иная архитектура. Контейнеризация стала де-факто стандартом: Docker показал рекордный рост +17% за год с 2024 по 2025 — это наибольший показатель среди всех технологий в <a href="https://survey.stackoverflow.co/2025/technology">опросе</a> Stack Overflow.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-09/4ff8e817-cb17-4d03-bbb5-bc019c64e2bf.png" alt="" /></figure><p>Важным элементом экосистемы cloud-native становятся инструменты оркестрации вроде Kubernetes и Service mesh (например, Istio), которые автоматически развертываются, масштабируются и управляют контейнеризованными приложениями.</p><p>Результат этих технологий  — сквозная отказоустойчивость и безопасность на уровне отдельных сервисов, что особенно критично для распределённых систем. Интеграция с CI/CD-системами непрерывно вносит изменения без остановок — такой подход полностью преобразует циклы разработки и эксплуатации приложений.</p><p>В России этот тренд имеет особую специфику. Активный рост облачного рынка (<a href="https://habr.com/ru/companies/finam_broker/news/931988/">прогнозируемые</a> +18% в год до 2029 года) сочетается с процессами импортозамещения. Российские ИТ-компании, такие как «Группа Астра» (76% рынка ОС), создают собственные облачные решения и уникальные экосистемы для разработчиков.</p><p><i>Преимущества cloud-native подхода очевидны: автоматическое масштабирование, отказоустойчивость, сниженные операционные затраты. <a href="https://www.advsyscon.com/blog/gartner-it-automation/">По данным</a> Gartner, гиперавтоматизация снижает операционные затраты на 30% при оптимизации процессов. Бэкенд-разработчики теперь сосредотачиваются на бизнес-логике вместо управления инфраструктурой.</i></p><h2>Технология 3: Безопасность как код (Security as Code)</h2><p>Кибербезопасность — уже не отдельная функция, а неотъемлемая  часть процесса разработки. Почти 80% руководителей, опрошенных Gartner, <a href="https://habr.com/ru/companies/finam_broker/news/931988/">уделяют</a> защите данных и процессов максимум внимания. Это напрямую влияет на подходы к бэкенду.</p><h3>Интеграция безопасности в жизненный цикл разработки</h3><p>Концепция «Security as Code» (SaC) означает встроенную защиту  на всех этапах жизненного цикла разработки и развёртывания программного обеспечения. В рамках этого подхода реализуется автоматизированная проверка на уязвимости, анализ зависимостей, настройка политики доступа и шифрования. Все параметры безопасности определяются декларативными описаниями и сохраняются вместе с исходным кодом..</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-09/d5077556-2d40-4bd5-a121-16713726e2e8.png" alt="" /></figure><p>Ключевой элемент SaC — автоматизация security-проверок на всех этапах разработки. Политики безопасности, описанные в виде кода (например, с использованием языка Rego), интегрируются непосредственно в CI/CD-пайплайны.</p><p>Система автоматически блокирует развертывание, если обнаруживает уязвимости или нарушение стандартов, и обеспечивает постоянный контроль безопасности без участия человека.Такие инструменты, как <a href="https://www.checkpoint.com/downloads/products/cloudguard-spectral-code-solution-brief.pdf">CloudGuard Spectral</a>, предоставляют готовые решения для внедрения SaC, сканируя исходный код, конфигурации и зависимости в реальном времени.</p><p>На российском рынке интерес к решениям в области безопасности стабильно растет. Компания Positive Technologies — один из лидеров на российском рынке кибербезопасности — показывает рост объема заказов на 111% в первом квартале 2025 года. Это свидетельствует о высоком спросе на решения для защиты информации.</p><p><i>Практическая ценность подхода «безопасность как код» — в предотвращении уязвимостей на ранних этапах, а не в их исправлении постфактум. Это сокращает затраты на безопасность на 40-60% согласно уже упомянутому в нашей статье <a href="https://www.advsyscon.com/blog/gartner-it-automation/">исследованию</a> Gartner. Для разработчиков это означает необходимость осваивать новые инструменты и практики, но результат стоит того — более надёжные и безопасные приложения с меньшими усилиями.</i></p><h2>Технология 4: Бессерверные архитектуры (Serverless)</h2><p>Бессерверная архитектура преодолела стадию экспериментальных внедрений и становится актуальным решением для отдельных типов рабочих нагрузок. Её основное преимущество — разработчики не управляют инфраструктурой, что позволяет сконцентрироваться на реализации бизнес-логики.</p><h3>Эволюция подходов к архитектуре</h3><p>Современные бессерверные платформы предлагают не просто Function-as-a-Service (FaaS), а комплексные решения для построения событийно-ориентированных архитектур. Это позволяет создавать системы, которые автоматически масштабируются до тысяч одновременных исполнений и обратно до нуля, когда нагрузки нет.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-09/1a3f8a2f-9717-4580-8da0-c7a8cefaf740.png" alt="" /></figure><p>Особенность современных бессерверных платформ — их глубокая интеграция с экосистемой облачных сервисов. Такие решения, как AWS Lambda, Azure Functions и Yandex Cloud Functions, предоставляют готовые триггеры для обработки событий от баз данных, очередей сообщений, систем хранения и API-шлюзов.</p><p>Разработчики создают сложные распределённые системы, не беспокоясь о низкоуровневой инфраструктуре, мониторинге и проблемах с отказоустойчивостью.</p><p>Stack Overflow <a href="https://survey.stackoverflow.co/2025/technology">отмечает</a> значительный рост популярности FastAPI (+5 процентных пунктов), что говорит об устойчивом тренде на Python для производительных API. Многие из этих API развёртываются именно в бессерверных средах, что обеспечивает им автоматическое масштабирование и высокую доступность.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-09/2ef00e84-e355-421f-b682-28d8f757af4f.png" alt="" /></figure><p>Выгоды serverless-архитектур особенно очевидны для стартапов и компаний с переменной нагрузкой. Они экономят до 70% затрат на инфраструктуру по сравнению с традиционными подходами.</p><p><i>Переход к бессерверной модели требует от бэкендов пересмотра подхода: вместо монолитных приложений необходимо осваивать микросервисную архитектуру, основанную на асинхронной обработке событий в распределённых системах. Однако результат в виде сниженной операционной нагрузки того стоит.</i></p><h2>Технология 5: Платформенная инженерия (Platform Engineering)</h2><p>Платформенная инженерия возникла как ответ на растущую сложность DevOps-практик в крупных организациях. Суть подхода в том, чтоб создавать внутренние платформы, которые предоставляют разработчикам готовые инструменты и сервисы для самостоятельного развертывания и управления приложениями.  Например, платформа <a href="https://backstage.io/">Backstage</a> от Spotify объединяет инструменты разработки в единый портал с каталогом сервисов, шаблонами проектов и системой самообслуживания.</p><h3>Внутренние developer-платформы</h3><p>Вместо того чтобы каждый раз настраивать CI/CD-пайплайны, системы мониторинга и логирования, разработчики получают доступ к стандартизированной платформе, которая предоставляет все эти возможности через простое API или пользовательский интерфейс.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-09/4f5722a2-5edc-4322-9bbd-332b58c08557.jpg" alt="" /></figure><p>Gartner <a href="https://www.advsyscon.com/blog/gartner-it-automation/">отмечает</a>, что поставщики решений для автоматизации всё чаще обращаются к платформенной инженерии, чтобы получить курируемый набор инструментов и функциональных возможностей. Это снижает нагрузку на разработчиков, позволяя им сосредоточиться на бизнес-ценности, а не на операционных задачах.</p><p>В России необходимость импортозамещения ускорила развитие платформенных решений. Компании типа «Хэдхантер» и «Группа Астра», которые показали рост выручки в первом квартале 2025 года, <a href="https://habr.com/ru/companies/finam_broker/news/931988/">инвестируют</a> в собственные платформы, чтобы ускорить разработку и повысить надежность сервисов.</p><p><i>Главное преимущество платформенной инженерии — ускоренный вывод продукта на рынок и стандартизация процессов. Разработчики могут самостоятельно запускать сервисы и не ожидать помощи DevOps-инженеров, что сокращает циклы разработки на 30-50% согласно данным Gartner.</i></p><h2>Итоги: готовьтесь к новому стандарту</h2><p>К 2028 году эти пять технологий станут базовым минимумом для бэкенд-разработки, поскольку уже доказали свою ценность. Они решают реальные бизнес-задачи: снижают затраты, ускоряют разработку, повышают надежность и безопасность.</p><p>Российский рынок имеет свою специфику, но развивается в том же направлении. Рост выручки и акцент на импортозамещение создают уникальные возможности для разработчиков, готовых осваивать новые технологии.</p><p>Ключевой вывод: успех в бэкенд-разработке через три года будет определяться не знанием конкретного фреймворка или языка, а способностью интегрировать AI-инструменты, работать с cloud-платформами, встраивать безопасность в процесс разработки, проектировать бессерверные архитектуры и эффективно использовать внутренние платформы. Начинайте осваивать эти технологии сейчас — и будете на шаг впереди.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сеньоры документируют проекты: протокол архитектурных решений</title>
      <link>https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij</link>
      <comments>https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij</guid>
      <description><![CDATA[<p>Как сеньоры документируют архитектуру без боли. Обзор подхода ADR: шаблоны, примеры из практики и комментарии экспертов. Ускорьте онбординг и перестаньте объяснять одно и то же.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij">Как сеньоры документируют проекты: протокол архитектурных решений</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Unity]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Это перевод <a href="https://dev.to/koladev/how-senior-software-engineers-document-their-project-1nf4">статьи</a> автора <a href="https://dev.to/koladev">Мангабо Колаволе</a> с портала DevTo с комментариями экспертов.</i></p><p>Есть одна задача, которую программисты терпеть не могут — но именно она отличает хорошего инженера от посредственного: как они документируют свой проект? Несколько лет назад я отвечал за запуск финтех-проекта. Мы выбрали стратегию быстрого старта, поэтому масштабируемость не стала для нас приоритетом. Главной целью было проверить гипотезу — и мы двигались вперёд, разрабатывая API, архитектуру и системы —  с упором на простоту, не особенно задумываясь о будущем.</p><p>Но я отвечал за бэкенд и инфраструктуру — и понимал: как бы хороша ни была моя память, через шесть месяцев я не смогу вспомнить все технические детали.</p><p>Во время работы я наткнулся на подход, который мне очень понравился: ADR — Architectural Decision Record, или «протокол архитектурных решений».</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-05/7d1206a7-6729-4bcb-ab55-63d59240df12.png" alt="" /></figure><p>По сути, это документ, в котором
фиксируются все изменения, внесённые в архитектуру: само решение, его влияние и
полученные уроки.</p><p>Проще говоря, это как личный дневник —
только для всей команды.</p><h2>Почему это важно?</h2><p><b>Память
— ненадёжна.</b> Мы часто забываем, почему выбрали одну
архитектурную модель, а не другую. Документирование изменений помогает
восстановить ход мыслей и избежать повторения одних и тех же ошибок.</p><p><b>Это
усиливает команду.</b> Представьте, что вы перепробовали
несколько вариантов решения проблемы и зафиксировали как удачные, так и
неудачные попытки. Это не просто ваш личный опыт — это знание, которым могут
воспользоваться все, включая тех, кто придёт после вас.</p><p><b>Будущие
разработчики скажут вам спасибо.</b> Подумайте о человеке,
который через пять лет будет разбираться в вашем коде. Если вы не оставили
объяснений, он, скорее всего, будет мучиться, пытаясь понять, зачем было
сделано то или иное изменение. А теперь представьте другого разработчика в
другой компании, который находит ADR-документ с чётким объяснением принятого
решения. Он, без сомнения, будет вам благодарен.</p><p>Синьор-фронтендер из ВК Маргарита Лукина, автор телеграм-канала <a href="https://t.me/frontend_kitchen">«Фронтенд кухня»</a>:</p><blockquote>Ценность ADR я впервые осознала в 2019 году. В команду, где работала, активно набирали новых ребят, и приблизительно раз в неделю кто-нибудь из новых разработчиков спрашивал "а почему это сделано так, а не иначе?" Приходилось постоянно давать ответы на одни и те же вопросы, и тогда-то я и поняла, насколько будет удобно записывать ответы где-нибудь в документацию в confluence и просто кидать ссылку новичкам. <br /><br />В 2019 году я еще не знала сам термин ADR и говорила "документация". С термином я познакомилась совсем недавно — этим летом, на курсе по архитектуре монолитных приложений. Тогда я поняла, насколько эффективно можно использовать ADR для ускорения разработки и уменьшения TTM. Дело в том, что начиная разрабатывать новый проект, разработчик первое время (от месяца до полугода! всё зависит от размера проекта) погружается в проект — разбирается, как всё устроено, чтобы вносить изменения соответственно архитектуре. В этот период разработчик, по сути, составляет собственные adr —  обычно в виде мыслеобразов в своей голове :) Если записать основные решения, разработчик сможет намного быстрее погрузиться в проект.</blockquote><h2>Как писать ADR?</h2><p>Существует несколько общепринятых правил, но
вы всегда можете адаптировать их под себя.</p><p>Вдохновившее меня соглашение можно найти на <a href="https://adr.github.io/madr/">GitHub</a>
. Вы также можете ознакомиться с процессом <a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/architectural-decision-records/adr-process.html">ADR на Amazon</a>.</p><p>Вот пример шаблона, который вы можете
использовать.</p><p>Такой тип документа может находиться прямо в репозитории проекта, в Confluence или, например, в JIRA.</p><p>В моей последней компании, где я работал фронтенд-разработчиком, не существовало одного централизованного документа, фиксирующего все архитектурные изменения. Вместо этого мы использовали задачи GitLab и привязывали каждое архитектурное изменение к соответствующей ветке. Это позволяло отслеживать причины изменений даже спустя месяцы после их внедрения.</p><p>Практика спасала нас бесчисленное количество раз. Как я всегда говорю: не важно, насколько вы или ваши коллеги умны — будь то технический директор, менеджер или любой другой участник команды — никто не помнит каждое техническое решение, принятое два года назад.</p><p>Синьор-фронтендер из ВК Маргарита Лукина, автор телеграм-канала <a href="https://t.me/frontend_kitchen">«Фронтенд кухня»</a>:</p><blockquote>Многие руководители хотят видеть на своём проекте разработчиков, которые "сразу, без раскачки" начнут перформить. Совсем избежать периода погружения невозможно, но можно ускорить его в десятки раз за счёт ADR</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Как мы сделали SDK, CLI и MCP с ИИ за неделю</title>
      <link>https://tproger.ru/articles/kak-my-sdelali-sdk--cli-i-mcp-za-nedelyu-s-ii</link>
      <comments>https://tproger.ru/articles/kak-my-sdelali-sdk--cli-i-mcp-za-nedelyu-s-ii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Пронин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-my-sdelali-sdk--cli-i-mcp-za-nedelyu-s-ii</guid>
      <description><![CDATA[<p>За 7 дней мы создали SDK, CLI и MCP-сервер для нашего API на Python. Рассказываем, как использовали Flask, Marshmallow и современные AI-инструменты, чтобы ускорить разработку и избежать типичных ошибок.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-my-sdelali-sdk--cli-i-mcp-za-nedelyu-s-ii">Как мы сделали SDK, CLI и MCP с ИИ за неделю</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 06 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последнюю неделю мы в <a href="https://pingera.ru?utm_source=tproger">Pingera</a> активно работали над расширением возможностей нашего API, создав SDK, CLI и даже Model Context Protocol (MCP) сервер. В этой статье я расскажу, как мы это делали, и с какими трудностями столкнулись.</p><h2>Начнем с API</h2><p>Исторически сложилось так, что наш бэкенд написан на Python с использованием <a href="https://flask.palletsprojects.com/en/stable/">Flask</a>. На старте мы сразу заложили строгую типизацию данных с помощью библиотеки <a href="https://marshmallow.readthedocs.io/en/latest/">Marshmallow</a>. Это позволяет описывать схемы данных, которые API должен отдавать, и валидировать входящие запросы. Если вы работали с Django REST, то Marshmallow — это аналог их Schemas.</p><p>В какой-то момент мы решили, что хотим отдавать OpenAPI-спецификацию для нашего API. Мы попробовали <a href="https://github.com/jmcarp/flask-apispec">flask-apispec</a>, но столкнулись с проблемой: сгенерированная спецификация имела кучу ошибок в валидаторе, потому что библиотека миксовала OpenAPI v2 и v3. Частично это удалось решить с помощью ручных @doc() декораторов, но это было неудобно и больше походило на костыль, чем на нормальное решение.</p><p>В итоге я перешел на <a href="https://pypi.org/project/flask-smorest/">flask-smorest</a>. Эта библиотека активно развивается, работает поверх Flask и Marshmallow и умеет генерировать корректный OpenAPI v3. Все завелось «из коробки» с минимальными изменениями. Marshmallow-схемы поддерживают метаданные, которые smorest потом проксирует в спецификацию. Например, так выглядит поле type для проверок в нашем коде:</p><p>smorest берёт эти данные и добавляет их в спеку. Кроме того, можно (и нужно) описать, какие коды ответов возвращает ваш API-метод и другие детали:</p><p>Как только мы это сделали, то <a href="https://api.pingera.ru/swagger-ui">получили</a> приличный Swagger и валидную OpenAPI JSON-спецификаци</p><figure><img src="https://media.tproger.ru/user-uploads/117408/2025-08-29/36c0ac6a-1d91-490b-993a-82f239d82d81.png" alt="pingera swagger ui at api.pingera.ru/swagger-ui" /><figcaption>Swagger UI сгенерированный по openapi схеме</figcaption></figure><h2>SDK</h2><p>Далее мы поняли, что одного API недостаточно. Чтобы вызывать методы API из будущих CLI или MCP, нам не хотелось писать клиент с нуля. Поэтому мы решили создать SDK.</p><p>Если у вас есть OpenAPI-спецификация, то писать клиент с нуля бессмысленно. Для этого есть отличный инструмент — <a href="https://github.com/OpenAPITools/openapi-generator">openapi-generator</a>. Он позволяет сгенерировать API-клиенты для разных языков одной командой, просто получив на вход спецификацию.</p><p>Так мы получили полноценный Python-клиент и залили его в PyPI. Весь код можно найти на GitHub: <a href="https://github.com/pingera/pingera-python-sdk">pingera/pingera-python-sdk</a>. Особенно интересен файл <a href="https://github.com/pingera/pingera-python-sdk/blob/main/generate_client.py">generate-client.py</a>, который запускает openapi-generator и подменяет директории. После этого оставалось только залить все в <a href="https://pypi.org/project/pingera-sdk/">PyPI</a>, чтобы можно было использовать пакет в других сервисах и продуктах.</p><p>Конечно, имена сгенерированных методов не самые изящные, например v1_checks_check_id_results_check_result_id_get, но это в сто раз лучше, чем каждый раз писать requests.get, добавлять try-except обертки и волноваться об изменениях в API.</p><h2>Model Context Protocol (MCP) сервер</h2><p><a href="https://www.anthropic.com/news/model-context-protocol">MCP</a> — это стандарт, разработанный компанией Anthropic (создатели Claude). Его идея — стандартизировать взаимодействие LLM с данными или сервисами, превращая их в ИИ-агентов. Теперь не нужно объяснять агенту, как взять данные из базы данных или JIRA, достаточно указать MCP-сервер, который уже это умеет, и агент сам разберётся.</p><p>Мы в Pingera давно задумывались о том, как искусственный интеллект повлияет на мониторинг, поэтому создание собственного MCP-сервера было логичным шагом.</p><p>Для создания MCP-сервера мы использовали фреймворк <a href="https://github.com/jlowin/fastmcp">fastmcp</a>. Код MCP-инструментов («tools») повторяет структуру нашего SDK. Например, в MCP есть код, который выводит список проверок:</p><p>list_checks здесь просто вызывает метод SDK v1_checks_get().</p><p>Из-за такой повторяемости 80-85% кода MCP-сервера было сгенерировано ИИ-агентом Replit (можно взять любой другой). Весь код мы также опубликовали на GitHub: <a href="https://github.com/pingera/pingera-mcp">pingera/pingera-mcp</a>. Подробнее о сценариях использования можно прочитать в нашем блоге: <a href="https://pingera.ru/tpost/koti38ky91-pingera-mcp-server-blizhe-k-ai">Pingera MCP сервер — ближе к AI</a>.</p><figure><img src="https://media.tproger.ru/user-uploads/117408/2025-08-29/80953ad1-3500-45f6-86fe-bec689125989.png" alt="MCP inspector для Pingera-mcp" /><figcaption>Интерфейс MCP inspector</figcaption></figure><h2>Command Line Interface (CLI)</h2><p>CLI — это про консоль и инженеров. Иногда гораздо удобнее выполнить команду в терминале, чем заходить в веб-интерфейс и кликать мышкой.</p><p>Создание CLI было похоже на работу над MCP — много похожих вызовов методов. ИИ-агент снова отлично справился, хотя были проблемы с выводом результатов. Мы взяли две библиотеки: <a href="https://typer.tiangolo.com/">Typer</a> для создания интерфейса и <a href="https://github.com/Textualize/rich">Rich</a> для красивого, цветного вывода в консоль. С Rich были трудности — то таблица уезжала, то цвет не тот. Но ИИ справился и помог решить эти проблемы.</p><figure><img src="https://media.tproger.ru/user-uploads/117408/2025-08-29/7d8ff6f3-944e-4f4f-b5a0-c174b1e7ef41.png" alt="Вывод pngr - pingera CLI" /><figcaption>Вывод pngr - CLI тузлы Pingera</figcaption></figure><p>Весь код также доступен на GitHub: <a href="https://github.com/pingera/pingera-cli">pingera/pingera-cli</a>. Из-за ограниченного контекста LLM, нельзя было скормить агенту всю спецификацию сразу. Поэтому пока наш CLI умеет работать только с проверками.</p><h2>Заключение</h2><p>Использование ИИ-агентов для генерации повторяющегося кода — это не просто удобная фича. Как показал наш опыт с Replit, такие помощники берут на себя рутину, освобождая время для более сложных и творческих задач. Когда 80-85% кода MCP-сервера было сгенерировано автоматически, это позволило нам сосредоточиться на архитектуре, логике и оптимизации, вместо того чтобы вручную переписывать однотипные вызовы методов.</p><p>В конечном итоге, ИИ-агенты — это не замена инженеру, а инструмент, который многократно может повысить производительность. В будущем мы видим всё больше сценариев, где ИИ будет не просто предлагать фрагменты кода, а создавать целые модули и сервисы на основе высокоуровневых спецификаций. Это приближает нас к тому моменту, когда разработка будет похожа на управление оркестром, где дирижер (разработчик или продакт) задает направление, а умные агенты исполняют отдельные партии, обеспечивая гармонию и эффективность всего процесса.</p>]]></content:encoded>
    </item>
    <item>
      <title>Курсы Backend-разработчика: обучение Backend-разработке с нуля</title>
      <link>https://tproger.ru/articles/kursy-backend-razrabotchika--obuchenie-backend-razrabotke-s-nulya</link>
      <comments>https://tproger.ru/articles/kursy-backend-razrabotchika--obuchenie-backend-razrabotke-s-nulya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анастасия Шишкина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kursy-backend-razrabotchika--obuchenie-backend-razrabotke-s-nulya</guid>
      <description><![CDATA[<p>Лучшие курсы по Backend-разработке. Рейтинг вариантов бесплатного и платного обучения для бэкенд-разработчиков с нуля.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kursy-backend-razrabotchika--obuchenie-backend-razrabotke-s-nulya">Курсы Backend-разработчика: обучение Backend-разработке с нуля</a>»</p>]]></description>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Sep 2025 08:58:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Бэкенд — это не только алгоритмы, но и архитектурные решения, от которых зависят скорость, безопасность и стабильность работы приложений, используемых миллионами людей. Освоив эту профессию, вы станете не просто исполнителем, а инженером, который строит фундамент цифровых продуктов.</p><p>Совместно с экспертами <a href="https://kursfinder.ru/">Kursfinder</a> я изучила около 60 программ и подготовила подборку из 45 лучших вариантов обучение для старта в профессии. Еще больше вариантов <a href="https://kursfinder.ru/backend-developer/">курсов по бэкенду</a> можно найти в нашем каталоге Kursfinder.</p><p><b>Для некоторых курсов доступны эксклюзивные скидки, акции и промокоды, которые помогут начать обучение с выгодой.</b></p><h2>ТОП-10 лучших курсов по backend-разработке в 2026 году</h2><ol><li><a href="https://experts2.ru/lzDbhU?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=1">Django: создание backend-приложений</a> от «Нетологии» — курс бэкенд-разработчика с выдачей удостоверения о повышении квалификации.</li><li><a href="https://experts2.ru/dbKwGt?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=2">Backend-разработчик на Java</a> от Skypro — backend-курс на Java с сотавлением карьерного плана с экспертами.</li><li><a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=3">Node.js для backend-разработки</a> от «Нетологии» — создание приложения для доставки еды и агрегатора отелей.</li><li><a href="https://experts2.ru/hqlCLk?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=4">Бэкэнд-разработчик на Python</a> от SF Education — практический курс backend-разработчика с нуля.</li><li><a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=5">Бэкенд на Node.js для фронтенд-разработчиков</a> от «Яндекс Практикума» — отличный вариант для специалистов из смежных областей.</li><li><a href="https://experts2.ru/irzYKx?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=6">Backend-разработчик на Go</a> от Skillfactory — предоставление базы работодателей по окончании.</li><li><a href="https://experts2.ru/xQacCq?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=7">Backend-разработка на Kotlin</a> от OTUS — курс по бэкенд-разработке на Kotlin для опытных.</li><li><a href="https://experts2.ru/yxRdnE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=8">Backend-разработчик</a> от Онлайн-обучения в Университете Синергия — пять дополнительных курсов в подарок.</li><li><a href="https://experts2.ru/IfSohl?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=9">NestJS — с нуля, современный backend на TypeScript и Node.js</a> от PurpleSchool — возможность начать обучение бесплатно.</li><li><a href="https://experts2.ru/GguAnw?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=10">Back-end разработка</a> от Компьютерной академии ТОР — отличное предложение для подростков средних и старших классов.</li></ol><p>Обучение на backend-разработчика идеально подойдет тем, кого увлекает не визуальная сторона веб-сайтов, а их внутренняя логика и механизмы работы. Этот путь будет комфортен аналитическим умам, которые любят решать сложные, многозадачные проблемы и видят красоту в оптимизированном коде и эффективных алгоритмах. Он также станет отличным выбором для тех, кто хочет глубоко понимать архитектуру digital-продуктов и создавать надежные, масштабируемые системы, служащие основой для всего приложения.</p><h2>Онлайн-курсы по backend-разработке</h2><p><b>1.</b> <a href="https://experts2.ru/lzDbhU?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=1">Django: создание backend-приложений</a> | <b>«Нетология»</b></p><p><b>Используйте промокод kursfinder, чтобы получить скидку 7%</b></p><p><a href="https://experts2.ru/lzDbhU?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=1">Применить промокод&gt;&gt;&gt; </a></p><p>В рамках программы вы с нуля создадите полнофункциональный интернет-магазин и глубоко освоите мощный Python-фреймворк Django, основанный на архитектурном шаблоне MVC. Этот практический опыт позволит вам добавить Django в свое резюме и откроет новые карьерные возможности в сфере веб-разработки. После каждого теоретического модуля вы будете проходить тесты или выполнять практические задания, которые будут тщательно проверяться с персональными комментариями по улучшению кода. В процессе обучения вас ждет комплексная поддержка: экспертные консультации по техническим вопросам, помощь координатора в организации учебного процесса и постоянное сопровождение наставников, которые помогут разобраться в сложных моментах и направят ваше развитие в правильное русло.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/4e183e8c-0b87-4f75-81bc-270096474a48.png" alt="" /></figure><ul><li>Стоимость: от 22 800 рублей</li><li>Длительность: 7 недель</li><li>Формат обучения: видеолекции, статьи, практические задания</li><li>Сертификат: удостоверение о повышении квалификации</li></ul><p><b>Кому подойдет: </b></p><ul><li>новичкам;</li><li>специалистам из смежных сфер.</li></ul><p><b>Преимущества:</b></p><ul><li>поддержка в трудоустройстве;</li><li>гарантия возврата средств;</li><li>эксклюзивные учебные материалы;</li><li>помощь персонального наставника;</li><li>дополнительный бонус-модуль;</li><li>напоминания о дедлайнах;</li><li>беспроцентная рассрочка платежа.</li></ul><p><b>Недостатки:</b></p><ul><li>ограниченный по времени доступ к курсу (12 месяцев).</li></ul><p><b>Программа обучения:</b></p><ul><li>Знакомство с фреймворком Django и его архитектурой</li><li>Маршрутизация</li><li>Создание и использование шаблонов</li><li>Разработка RESTful API</li><li>Управление правами доступа и аутентификация</li><li>Фильтрация и поиск данных</li><li>Расширенные возможности проектирования API</li><li>Система разрешений в Django REST Framework</li></ul><p><a href="https://experts2.ru/lzDbhU?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=1">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>2.</b> <a href="https://experts2.ru/dbKwGt?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=2">Backend-разработчик на Java </a>| <b>Skypro</b></p><p><b>Используйте промокод Kursfinder, чтобы получить скидку 10%</b></p><p><a href="https://experts2.ru/dbKwGt?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=2">Применить промокод&gt;&gt;&gt; </a></p><p>Вы освоите разработку на Java с применением фреймворка Spring Boot и будете проводить автоматизированное тестирование созданных алгоритмов. Научитесь проектировать схемы баз данных, извлекать и записывать информацию с помощью SQL и непосредственно из Java-приложения. Также сможете отлаживать код, документировать его через JavaDoc и описывать API с использованием Swagger. Наконец, овладеете инструментами командной работы, такими как GitHub/GitLab и Jira, и будете применять принципы Agile в рабочих процессах.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/662345e5-afd2-4cab-ad8b-54994ed065be.png" alt="" /></figure><ul><li>Стоимость: от 185 004 рублей</li><li>Длительность: около 9-10 месяцев</li><li>Формат обучения: вебинары, домашняя работа, тестирования</li><li>Сертификат: диплом или удостоверение о повышении квалификации</li></ul><p><b>Кому подойдет: </b></p><ul><li>новичкам;</li><li>работникам из схожих сфер.</li></ul><p><b>Преимущества:</b></p><ul><li>помощь в трудоустройстве;</li><li>английский язык в подарок от Skyeng на год;</li><li>вводные занятия бесплатно;</li><li>открытый вебинар по профориентации;</li><li>практикующие наставники, всегда готовые помочь;</li><li>поддержка карьерных консультантов;</li><li>бонусный модуль по работе с нейросетями.</li></ul><p><b>Недостатки:</b></p><ul><li>на базовом тарифе выдается сертификат, а не диплом.</li></ul><p><b>Программа обучения:</b></p><ul><li>Старт в Java и знакомство с экосистемой</li><li>Базовый синтаксис языка</li><li>Циклические и условные конструкции</li><li>Коллекции и работа с массивами</li><li>Объектно-ориентированное программирование</li><li>Инкапсуляция и управление доступом</li><li>Основы многопоточности и параллельных вычислений</li><li>Исправление ошибок</li></ul><p><a href="https://experts2.ru/dbKwGt?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=2">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>3.</b> <a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=3">Node.js для backend-разработки</a> | <b>«Нетология»</b></p><p><b>Используйте промокод kursfinder, чтобы получить скидку 7%</b></p><p><a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=3">Применить промокод&gt;&gt;&gt; </a></p><p>В процессе обучения вам предстоит выполнить более сорока практических задач: вы создадите веб-API для библиотеки с модульной архитектурой, платформу для заказа продуктов на дом и сервис для поиска и бронирования жилья. Для усиления ваших конкурентных преимуществ программа включает не только базовые знания, необходимые для успешных собеседований, но и освоение более сложных технологий, таких как фреймворки Nest.js, Express.js и язык TypeScript. Чтобы вы могли уверенно работать в мировом профессиональном сообществе и иметь доступ к актуальным материалам, программа дополнена специализированным модулем по английскому для IT-специалистов от English Dom.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/30691a58-e789-4f16-98a7-832f9046e2c9.png" alt="" /></figure><ul><li>Стоимость: от 28 500 рублей</li><li>Длительность: 6 месяцев</li><li>Формат обучения: видеолекции, практические задания</li><li>Сертификат: удостоверение о повышении квалификации установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>желающим повысить квалификацию;</li><li>специалистам из похожих сфер деятельности.</li></ul><p><b>Преимущества:</b></p><ul><li>поддержка в трудоустройстве;</li><li>эксклюзивные учебные материалы;</li><li>стабильная техническая поддержка;</li><li>оперативная помощь экспертов;</li><li>мобильное приложение с полным функционалом;</li><li>автоматические напоминания о сроках сдачи работ;</li><li>возврат средств;</li><li>беспроцентная оплата в рассрочку.</li></ul><p><b>Недостатки:</b></p><ul><li>требуется базовая подготовка для комфортного обучения.</li></ul><p><b>Программа обучения:</b></p><ul><li>Архитектура модулей и инструментарий Node.js</li><li>HTTP-модуль и обработка потоков</li><li>Создание низкоуровневого сервера</li><li>Фреймворк Express.js для веб-разработки</li><li>Паттерн проектирования Middleware</li></ul><p><a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=3">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>4.</b> <a href="https://experts2.ru/hqlCLk?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=4">Бэкэнд-разработчик на Python</a> | <b>SF Education</b></p><p><b>Используйте промокод kursfinder, чтобы получить скидку 15%</b></p><p><a href="https://experts2.ru/hqlCLk?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=4">Применить промокод&gt;&gt;&gt; </a></p><p>Если вы планируете начать обучение с нуля на backend-разработчика, оптимальным решением станет данная программа. Здесь вы не только освоите синтаксис языка, но и погрузитесь в современные технологии под руководством опытных наставников. Программа построена вокруг реальных проектов: вы научитесь настраивать серверную логику, работать с базами данных и обеспечивать интеграцию с фронтендом. На практических примерах разбираются сложные аспекты, в том числе работа с составными типами данных, такими как List, что позволяет глубоко понять принципы построения эффективных back-end-решений.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/8273c39b-b330-44f9-b95c-9aceab5f049c.png" alt="" /></figure><ul><li>Стоимость: 89 244 рубля</li><li>Длительность: 3 месяца</li><li>Формат обучения: видеоуроки, вебинары, кейсы</li><li>Сертификат: сертификат HISTES</li></ul><p><b>Кому подойдет: </b></p><ul><li>IТ-специалистам и разработчикам;</li><li>менеджерам и аналитикам;</li><li>фронтенд-разработчикам.</li></ul><p><b>Преимущества:</b></p><ul><li>практико-ориентированный подход с реалистичными кейсами;</li><li>персональный куратор для оперативных консультаций;</li><li>два диплома государственного образца;</li><li>занятия в выходные дни для совмещения с работой.</li></ul><p><b>Недостатки:</b></p><ul><li>услуги по трудоустройству охватывают только помощь в составлении резюме, подготовку сопроводительных писем и предоставление доступа к базе вакансий.</li></ul><p><b>Программа обучения:</b></p><ul><li>Финансовая индустрия и карьерные треки</li><li>Backend-решений и API на Django</li><li>Продвинутые техники программирования на Python</li><li>Принципы DevOps и процессы деплоя</li><li>Интеграция и работа со сторонними API</li><li>Развитие гибких навыков (Soft Skills) для IT-специалистов</li></ul><p><a href="https://experts2.ru/hqlCLk?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=4">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>5.</b> <a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=5">Бэкенд на Node.js для фронтенд-разработчиков</a> | <b>«Яндекс Практикум»</b></p><p><b>Купите любой курс с выгодой до 20% при оплате сразу</b></p><p><a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=5">Получить скидку &gt;&gt;&gt;</a></p><p>В рамках комплексного обучения бэкенд-разработке вы полностью реализуете серверную часть современного веб-приложения Mesto, включая внедрение надежной системы аутентификации, валидацию входящих данных и создание эффективных механизмов обработки ошибок с соблюдением всех актуальных стандартов безопасности. Вы освоите разработку модульного API-сервиса на базе прогрессивного фреймворка Nest.js, научитесь проектировать эффективные маршруты и контроллеры, а также профессионально интегрировать базу данных PostgreSQL в архитектуру проекта. Завершением обучения станет деплой вашего проекта на удаленный сервер с организацией автоматического процесса выгрузки изменений через систему контроля версий Git и настройкой менеджера процессов PM2 для обеспечения бесперебойной работы приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/ed6cbe08-db9d-4b13-9327-0c6999f614ed.png" alt="" /></figure><ul><li>Стоимость: от 60 000 рублей</li><li>Длительность: 3,5 месяца</li><li>Формат обучения: видеолекции, вебинары, теория, воркшопы, практические задания, домашняя работа</li><li>Сертификат: диплом о профессиональной переподготовке</li></ul><p><b>Кому подойдет: </b></p><ul><li>тем, кто стремится улучшить свои профессиональные навыки;</li><li>специалистам из смежных областей.</li></ul><p><b>Преимущества:</b></p><ul><li>поддержка в трудоустройстве;</li><li>реализация коммерческого проекта;</li><li>гибкий график оплаты;</li><li>много кейсов для портфолио;</li><li>интуитивная образовательная платформа;</li><li>перенос сроков сдачи заданий;</li><li>гарантия полного возврата средств;</li><li>бесплатная вводная консультация;</li><li>корректировка учебного графика;</li><li>компенсация налогового вычета.</li></ul><p><b>Недостатки:</b></p><ul><li>интенсивность программы требует от 15 свободных часов в неделю.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в Node.js и экосистему NPM</li><li>Принципы проектирования REST API</li><li>Базы данных и системы аутентификации</li><li>Интеграция Passport.js</li><li>Решение прикладных задач разработки</li></ul><p><a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=5">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>6.</b> <a href="https://experts2.ru/irzYKx?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=6">Backend-разработчик на Go</a> | <b>Skillfactory</b></p><p>Вам предстоит понять мощный язык программирования для создания IT-решений любого уровня сложности — от мобильных приложений до корпоративных систем. Вы будете обучаться по четко структурированной программе с постоянной поддержкой наставников, что позволит вам быстрее достигать поставленных целей. Освоите backend-разработку на Java и основы DevOps, сформируете полноценное портфолио и сможете откликаться на вакансии уже через семь месяцев обучения. В процессе курса вы систематизируете знания, изучите исключительно практико-ориентированную информацию и будете последовательно двигаться по проверенной образовательной траектории.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/0b15833d-ab1f-4a35-b127-2e1490df472c.png" alt="" /></figure><ul><li>Стоимость: от 145 800 рублей</li><li>Длительность: 14 месяцев</li><li>Формат обучения: онлайн, вебинары, практика</li><li>Сертификат: диплом о профессиональной переподготовке установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>новичкам с нуля;</li><li>начинающим программистам.</li></ul><p><b>Преимущества:</b></p><ul><li>персональное сопровождение практикующими разработчиками;</li><li>экспертная поддержка на протяжении всего образовательного пути;</li><li>постоянный доступ ко всем учебным материалам без ограничений по времени;</li><li>корпоративные форматы обучения для командной работы;</li><li>рефералка с системой вознаграждений;</li><li>четыре дополнительные бонусные мини-программы углубленной подготовки;</li><li>специальные скидки на премиальные тарифы обучения;</li><li>программа лояльности с привилегиями для выпускников.</li></ul><p><b>Недостатки:</b></p><ul><li>отсутствие гарантии трудоустройства.</li></ul><p><b>Программа обучения:</b></p><ul><li>Фундаментальные основы программирования</li><li>Настройка рабочего окружения</li><li>Базовые элементы синтаксиса языка</li><li>Функции и методы программирования</li><li>Структуры данных: массивы, списки, очереди, стеки</li><li>Алгоритмы сортировки и их применение</li><li>Древовидные и графовые структуры</li><li>Управление файлами и процессами</li></ul><p><a href="https://experts2.ru/irzYKx?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=6">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>7.</b> <a href="https://experts2.ru/xQacCq?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=7">Backend-разработка на Kotlin</a> | <b>OTUS</b></p><p>Синтаксис Kotlin отличается простотой и выразительностью, что делает его отличным выбором для обучения бэкенд-разработке. Освоив Kotlin, вы получите доступ к современным инструментам, значительно упрощающим создание серверной части приложений. Вы сможете использовать один язык программирования как для фронтенда (Android), так и для бэкенда, что оптимизирует командную работу и повышает общую эффективность разработки. В программе также предусмотрено освоение передовых практик, включая чистую архитектуру, микросервисные решения и методы обработки больших данных.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/4a93bf44-9bd4-469b-bb3a-132c9cf17e67.png" alt="" /></figure><ul><li>Стоимость: 89 100 рублей</li><li>Длительность: 5 месяцев</li><li>Формат обучения: вебинары, практика, тестирования, домашняя работа, проекты</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>разработчикам, специализирующимся на Java;</li><li>разработчикам с опытом в других языках программирования;</li><li>специалистам в области мобильной разработки;</li><li>Kotlin-разработчикам, занимающимся бэкенд-разработкой.</li></ul><p><b>Преимущества:</b></p><ul><li>беспроцентная рассрочка платежа;</li><li>квалифицированная техническая поддержка;</li><li>корпоративные программы обучения;</li><li>компенсация налогового вычета (13%);</li><li>карьерные консультации специалистов;</li><li>пожизненный доступ к материалам;</li><li>закрытый чат для участников курса.</li></ul><p><b>Недостатки:</b></p><ul><li>фиксированный график обучения подойдет не всем.</li></ul><p><b>Программа обучения:</b></p><ul><li>Основы языка Kotlin</li><li>Продвинутые возможности Kotlin</li><li>Подготовка среды разработки</li><li>Проектирование API</li><li>Применение фреймворков и асинхронных технологий</li><li>Реализация бизнес-логики</li><li>Интеграция с базами данных</li><li>Защита итогового проекта</li></ul><p><a href="https://experts2.ru/xQacCq?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=7">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>8. </b><a href="https://experts2.ru/yxRdnE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=8">Backend-разработчик</a> | <b>Онлайн-обучение в Университете Синергия</b></p><p>В рамках практической части обучения вам предстоит разработать базовую версию карточной игры Blackjack, адаптированную для работы в командной строке. В процессе реализации вы создадите систему ставок, при которой игрок будет либо терять средства, либо получать выигрыш, либо сохранять начальную сумму в зависимости от результата игры. Кроме того, вы разработаете полнофункциональный интернет-магазин с необходимыми компонентами для администрирования товарного каталога и аутентификации пользователей, а также обеспечите создание удобного и интуитивно понятного пользовательского интерфейса для взаимодействия с сервисом.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/ee2e7344-f4cf-4112-9248-ba0e42e517ea.png" alt="" /></figure><ul><li>Стоимость: 100 800 рублей</li><li>Длительность: 6 месяцев</li><li>Формат обучения: видеоуроки, практические задания, вебинары</li><li>Сертификат: диплом о профессиональной переподготовке</li></ul><p><b>Кому подойдет: </b></p><ul><li>новичкам с нуля;</li><li>продолжающим программистам.</li></ul><p><b>Преимущества:</b></p><ul><li>пять программ в подарок;</li><li>помощь с устройством на работу;</li><li>пожизненный доступ к материалам;</li><li>профессиональное сообщество учащихся;</li><li>скидка 60% на все тарифы;</li><li>бесплатная вводная консультация.</li></ul><p><b>Недостатки:</b></p><ul><li>ограниченное количество мест.</li></ul><p><b>Программа обучения:</b></p><ul><li>Условные конструкции</li><li>Циклические конструкции</li><li>Обработка исключительных ситуаций</li><li>Принципы ООП и синтаксис классов</li><li>Операции ввода-вывода</li><li>Работа с графическими данными</li><li>Базовый синтаксис PHP</li><li>Статическая верстка</li><li>Создание базового приложения</li></ul><p><a href="https://experts2.ru/yxRdnE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=8">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>9. </b><a href="https://experts2.ru/IfSohl?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=9">NestJS — с нуля, современный backend на TypeScript и Node.js</a> | <b>PurpleSchool</b></p><p>Главное преимущество этого курса перед аналогами заключается в том, что вместо учебных проектов, таких как ToDoApp, вы создадите реальный production-сайт, который будет опубликован и полностью функционировать. Программа включает настройку окружения Node.js, освоение TypeScript и переход к фреймворку NestJS с подробным разбором его архитектуры. Вы научитесь разворачивать и работать с базой данных, реализуете валидацию входящих данных и систему авторизации. Особое внимание уделено тестированию и отладке приложений, а для углубленного изучения предусмотрены агрегации и функции в MongoDB.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/446c5ba2-62c4-4285-8f55-4807c0c43c48.png" alt="" /></figure><ul><li>Стоимость: от 3 999 рублей</li><li>Длительность: от 2 недель</li><li>Формат обучения: вебинары, видеоуроки, тестирования, конспекты, практика</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>тем, кто знает JavaScript на начальном уровне.</li></ul><p><b>Преимущества:</b></p><ul><li>300 бонусных рублей при регистрации;</li><li>возврат полной стоимости без объяснения причин;</li><li>разбор сложностей на еженедельных встречах с наставником;</li><li>честные отзывы выпускников в конце страницы курса.</li></ul><p><b>Недостатки:</b></p><ul><li>в базовом тарифе нет поддержки наставника.</li></ul><p><b>Программа обучения:</b></p><ul><li>Подготовка рабочего окружения</li><li>Основы TypeScript</li><li>Написание тестов</li><li>Валидация входящих данных</li><li>Отладка приложений</li><li>Реализация авторизации</li><li>Продвинутые техники работы с MongoDB</li><li>Деплой на production-сервер</li><li>Работа с файловой системой</li><li>Создание Telegram-бота для уведомлений</li><li>Интеграция со сторонними API</li><li>Финальное тестирование и защита проекта</li><li>Командная разработка финального проекта</li></ul><p><a href="https://experts2.ru/IfSohl?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=9">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>10. </b><a href="https://experts2.ru/GguAnw?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=10">Back-end разработка</a> | <b>Компьютерная академия ТОР</b></p><p>Вас обучают не теоретики, а практикующие back-end-разработчики с опытом работы в крупных IT-компаниях. Преподаватели отлично понимают специфику профессии и требования рынка, поэтому они передают только практические знания, которые можно сразу применять. В процессе обучения вы освоите создание веб-приложений на PHP, научитесь использовать принципы ООП в этом языке, проектировать базы данных и работать с источниками данных. Вы будете внедрять AJAX, разрабатывать проекты по паттерну MVC, работать с фреймворками Codeigniter и Laravel, а также освоите основы JavaScript и работу с JSON для сериализации и парсинга данных.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-09-03/896a6606-ba1f-441b-807a-d91a4eba1651.png" alt="" /></figure><ul><li>Стоимость: от 44 040 рублей</li><li>Длительность: 12 месяцев</li><li>Формат обучения: онлайн или офлайн, вебинары, лекции, практика</li><li>Сертификат: международный диплом</li></ul><p><b>Кому подойдет: </b></p><ul><li>начинающим с нуля;</li><li>подросткам 14-18 лет.</li></ul><p><b>Преимущества:</b></p><ul><li>старт обучения с нулевого уровня без оплаты;</li><li>международный диплом по завершении программы;</li><li>трудоустройство в процессе освоения курса;</li><li>реальные проекты для портфолио;</li><li>интерактивная платформа с практическими заданиями;</li><li>изучение актуальных технологий отрасли.</li></ul><p><b>Недостатки:</b></p><ul><li>мало методических материалов.</li></ul><p><b>Программа обучения:</b></p><ul><li>Стилизация при помощи CSS</li><li>Введение в веб-программирование на PHP</li><li>Обработка форм и функции в PHP</li><li>Паттерны проектирования в разработке</li><li>Технология AJAX в сочетании с PHP</li><li>Формат JSON и асинхронные запросы AJAX</li><li>Метод POST и основы библиотеки jQuery</li><li>Интеграция AJAX с jQuery</li></ul><p><a href="https://experts2.ru/GguAnw?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=10">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><h2>Еще 15 курсов backend-разработчика</h2><p>В расширенной подборке собраны дополнительные курсы backend-разработки от проверенных образовательных платформ. Здесь вы найдете программы для разных уровней подготовки — от начального до продвинутого, с акцентом на Python, Java и другие популярные языки. Каждый курс включает практические задания, работу с реальными проектами и поддержку наставников. Это ваш шанс глубоко погрузиться в мир серверной разработки и создать мощное портфолио.</p><ul><li><a href="https://experts2.ru/oaVAmy?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Ал­го­рит­мы и струк­ту­ры дан­ных для раз­ра­бот­чи­ков</a> от Skillbox. Курс открывает путь к фундаментальным знаниям и умению применять алгоритмы для решения практических задач. Это позволит вам претендовать на позиции в ведущих компаниях и стать участником сложных проектов с высоким уровнем дохода.</li><li><a href="https://experts2.ru/BdmWyc?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend-разработчик</a> от Международной академии бизнеса IAB. Дистанционная программа подготовки создана для того, чтобы в сжатые сроки вы превратились в востребованного и хорошо оплачиваемого специалиста. Уникальная учебная методология специально разработана для максимально быстрого и глубокого усвоения всех ключевых компетенций с возможностью их немедленного применения в реальных условиях, что исключает любую потерю времени.</li><li><a href="https://experts2.ru/yoxjRT?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Архитектор ПО</a> от Skillbox. В рамках обучения вы освоите современные инструменты и передовые методики проектирования архитектуры программного обеспечения. Вы получите навыки выбора оптимального архитектурного стиля под потребности бизнеса, научитесь создавать стабильные и легко масштабируемые приложения, что непременно положительно скажется на вашем профессиональном уровне и доходе.</li><li><a href="https://experts2.ru/mjhPtE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend-разработка</a> от beONmax. Команда beONmax анонсировала комплекс из тридцати учебных программ, запланированных к выходу на платформе в течение 2024 и 2025 годов. Они активно развивают линейку образовательных продуктов для начинающих в сфере IT и веб-технологий — теперь вы найдете не только курсы по программированию и верстке, но и полноценные траектории для всестороннего профессионального роста в различных IT-направлениях, в том числе в backend-разработке.</li><li><a href="https://experts2.ru/jzKevS?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Java-разработчик</a> от Skillbox. Программа построена таким образом, что восемьдесят процентов времени уделяется отработке навыков на практике. Все домашние задания и проектные работы представляют собой примеры реальных задач, с которыми сталкивается Java-разработчик. Благодаря встроенному интерактивному тренажеру вы будете отрабатывать решение коротких задач с мгновенной обратной связью по ошибкам, научитесь быстро находить недочеты в коде и существенно ускорите свой прогресс в обучении.</li><li><a href="https://experts2.ru/mgzBvW?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend разработка</a> от Stepik. Глубокое погружение в JavaScript и TypeScript в рамках этого курса закладывает прочную основу для вашего последующего перехода в fullstack-разработку. В состав программы входят восемь отдельных курсов, совокупная стоимость которых составляет 31 992 рубля. При покупке полного пакета вы заплатите всего 20 000 рублей, что позволит вам сэкономить 11 992 рубля.</li><li><a href="https://experts2.ru/ZPcpoi?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">GO-разработчик</a> от Kata Academy. Данный онлайн-курс по разработке на языке Go имеет сугубо практическую направленность. После каждого теоретического модуля вы будете выполнять задания по написанию кода, который затем будет проверен и прокомментирован ментором. Команда специально подготовила комплекс задач, результаты решения которых вы сможете включить в свое профессиональное портфолио.</li><li><a href="https://experts2.ru/pgElnD?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Фулстек-разработчик на Python</a> от Skillbox. Вас ожидает большое количество практических работ и два дипломных проекта: по фронтенду и бэкенду. Вы создадите полноценный сервис для поиска фильмов и функционального чат-бота. Прежде чем приступить к основным заданиям, вы сможете отработать навыки в интерактивном тренажере, что обеспечит более плавное и комфортное погружение в практическую часть обучения.</li><li><a href="https://experts2.ru/uchnHM?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Профессия Backend-разработчик</a> от LoftSchool. Запишитесь на курс, и всего за три месяца вы превратитесь в востребованного IT-специалиста, владеющего топовыми технологиями 2026 года и имеющего в своем портфолио четыре серьезных проекта. Программа обучения разработана с учетом необходимости восстановления сил и включает перерывы, что позволяет оптимально сочетать периоды интенсивной работы и отдыха.</li><li><a href="https://experts2.ru/EladJs?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Курс по backend разработке на Python</a> от Stepik. Курс создан для всех, кто мечтает освоить бэкенд-разработку на Django! Независимо от вашего текущего уровня подготовки, программа идеально подойдет как новичкам, только начинающим свой путь в веб-разработке, так и опытным программистам, желающим углубить свои знания. Мы дадим не только базовые принципы работы с фреймворком Django, но и познакомим с передовыми веб-технологиями, которые помогут вам создавать мощные приложения.</li><li><a href="https://experts2.ru/kgtuDJ?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend-разработка</a> от Itgirlschool. За время обучения вы в полном объеме освоите все навыки, необходимые Java-программисту для успешного трудоустройства. Вы будете работать над решением реальных задач и реализуете три серьезных проекта для своего портфолио. По окончании курса получите сертификат, подтверждающий 250 часов обучения. В рамках модуля по трудоустройству вы научитесь составлять идеальное резюме и начнете проходить собеседования.</li><li><a href="https://experts2.ru/dwxBMe?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Практика создания веб-приложения на Laravel (бэкенд)</a> от «Специалиста». Под руководством опытных наставников вы вместе с командой будете работать над созданием серверной части приложения (фрагмента его API) по аналогии с доской объявлений, такой как Avito или Cian. Вы проведете декомпозицию проекта веб-приложения на задачи и разработаете полноценное API с реализацией авторизации, CRUD-операций, массовой загрузки данных и другими ключевыми функциями.</li><li><a href="https://experts2.ru/VwrhDy?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend разработчик</a> от MBA Сity Business Academy. Начните обучение бэкенд-разработке через дистанционный формат, чтобы превратиться в высокооплачиваемого специалиста в этой области. Инновационная программа, реализуемая на современной образовательной платформе, вместе с непрерывной поддержкой опытных преподавателей-практиков обеспечит вам быстрое и эффективное освоение всех необходимых компетенций в сфере.</li><li><a href="https://experts2.ru/tZcQvr?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">JavaScript. Уровень 5. Серверное программирование на Node.js</a> от «Специалиста». На курсе по Node.js вы познакомитесь с тонкостями работы на серверной платформе, использующей JavaScript, узнаете, как устанавливать и запускать Node.js, изучите приемы работы с модулями и научитесь разрабатывать масштабируемые клиент-серверные приложения и сервисы.</li><li><a href="https://experts2.ru/WpqnhV?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Бэкенд-разработчик</a> от HTML Academy. Программа предназначена для новичков и тех, кто хочет прокачать свои навыки. Это самостоятельное обучение по качественным и структурированным материалам с итоговой проверкой знаний и аттестацией. После каждого задания вы можете сверить свою работу с записью ревью кода и понять, как можно было выполнить его еще лучше.</li></ul><p>PHP остается одним из ключевых языков для создания динамических веб-сайтов и приложений. Если вы хотите специализироваться на этом направлении, предлагаю обратить внимание на три интенсивные программы для обучения backend-специалистов. Эти курсы охватывают все аспекты — от базового синтаксиса до работы с фреймворками Laravel или Symfony и интеграции с базами данных. Идеальный вариант для тех, кто ценит структурированный подход и хочет быстро приобрести навыки, востребованные на рынке.</p><ul><li><a href="https://experts2.ru/sUCzup?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">PHP-разработчик с нуля до PRO</a> от Skillbox. Курсы backend разработчика предлагают комплексное погружение в мир веб-разработки на PHP. Вы с нуля освоите создание сайтов и веб-приложений, изучите мощный фреймворк Laravel, реализуете практические проекты включая облачное хранилище и сервис бронирования отелей.</li><li><a href="https://experts2.ru/NgnrKa?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">PHP-разработчик</a> от itProger. В течение программы вы глубоко погрузитесь в изучение языка PHP и его библиотек, создадите несколько полноценных веб-сайтов.</li><li><a href="https://experts2.ru/zwsThZ?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Онлайн‑курс PHP. Профессиональная веб-разработка</a> от HTML Academy. Программа специально разработана с учетом потребностей занятых людей с ограниченным временем, предлагая гибкий график обучения без ущерба для полноты освоения материала и качества подготовки.</li></ul><h2>Еще 4 курса по Node.js для backend-разработчиков</h2><p>Node.js позволяет использовать JavaScript для создания высокопроизводительных серверных приложений. В нашей подборке представлены четыре специализированные программы — курсы по backend-разработке с фокусом на этой технологии. Вы освоите асинхронное программирование, работу с Express.js, создание REST API и развертывание приложений. Подойдет как новичкам, так и опытным разработчикам, желающим расширить свой стек технологий современными инструментами.</p><ul><li><a href="https://experts2.ru/oSufiE?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Node.js</a> от Skillbox. Курсы backend разработчик предлагают комплексное освоение создания веб-приложений и CLI-утилит, что позволит вам значительно повысить свою квалификацию как разработчика и выйти на новый профессиональный уровень.</li><li><a href="https://experts2.ru/jdoyYU?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Node.js Developer</a> от OTUS. Программа обучения охватывает разработку серверных приложений на Node.js с применением современных технологий Express, TypeScript, GraphQL, Apollo и Nest.js, обеспечивая глубокое погружение в актуальный стек технологий.</li><li><a href="https://experts2.ru/sBrJaw?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Профессия: Node.js-разработчик</a> от «Хекслета». В рамках курса вы освоите программирование на JavaScript и научитесь использовать современные инструменты для создания бэкенд-приложений, включая работу с фреймворком Fastify для построения высокопроизводительных серверных решений.</li><li><a href="https://experts2.ru/fJtnLe?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Разработка на NodeJS</a> от IBS Training Center. Курс посвящен фундаментальному изучению NodeJS, системы управления пакетами NPM и фреймворка Express, а также включает практическую работу с файловой системой, базами данных, отладку приложений и реализацию функциональности через протокол WebSocket.</li></ul><h2>Бесплатные курсы Backend-разработчика</h2><p>Обучение бэкенд-разработке можно начать без существенных финансовых затрат, поскольку я проанализировала рынок и отобрала проверенные варианты бесплатных образовательных программ от авторитетных платформ и университетов.</p><p><b>1. </b><a href="https://experts2.ru/btFaDm?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend-разработка: уроки и вебинары</a> — <b>Skillbox</b></p><p>Более пяти десятков вебинаров по backend-разработке на любой вкус.</p><p><b>Главное о курсе:  </b></p><ul><li>составление резюме;</li><li>влияние искусственного интеллекта;</li><li>знакомство с Java и Python.</li></ul><p><b>2. </b><a href="https://experts2.ru/xQacCq?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Backend-разработка на Kotlin</a> —<b> OTUS</b></p><p>Открытые уроки по backend-разработке на Kotlin.</p><p><b>Главное о курсе:</b></p><ul><li>трансляции по несколько часов;</li><li>демо-занятия курса.</li></ul><p><b>3.</b> <a href="https://experts2.ru/FkmxGo?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Разработка программно-аппаративной части (Backend)</a> — <b>Stepik</b></p><p>Курс, посвященный backend-разработке с использованием языка программирования Python.</p><p><b>Главное о курсе:  </b></p><ul><li>12 уроков;</li><li>36 интерактивных задач.</li></ul><p><b>4. </b><a href="https://experts2.ru/pqaWhM?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Тренажеры по программированию</a> — <b>Code Basics</b></p><p>Онлайн-тренажер предлагает бесплатное обучение программированию с нуля.</p><p><b>Главное о курсе:  </b></p><ul><li>короткие текстовые уроки;</li><li>практика после каждого урока;</li><li>ИИ-помощник.</li></ul><p><b>5. </b><a href="https://experts2.ru/cCHmjh?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Back-end Путь Самурая</a> —<b> IT-KAMASUTRA</b></p><p>Курс про архитектуру backend.</p><p><b>Главное о курсе:</b></p><ul><li>как стать программистом;</li><li>развертывание проекта;</li><li>защита данных и ценных ресурсов.</li></ul><p><b>6. </b><a href="https://youtube.com/playlist?list=PLzT6uOEJjhV2Tlfck-Ap1xShUuPcXoiK3&amp;si=SkBSpIPorNX490i-">Backend</a> —<b> Nordic IT School</b></p><p>Плейлист о трудоустройстве и популярных профессиях в IT.</p><p><b>Главное о курсе:</b></p><ul><li>лекции от специалиста;</li><li>что учить начинающему разработчику.</li></ul><p><b>7.</b> <a href="https://experts2.ru/bYdgCi?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Бесплатное обучение Backend-разработке</a> — <b>Request</b></p><p>Вас научат программировать на наиболее востребованном языке.</p><p><b>Главное о курсе:  </b></p><ul><li>практика на большом количестве сайтов различной сложности;</li><li>подойдет новичкам.</li></ul><p><b>8. </b><a href="https://youtube.com/playlist?list=PLw6SJ6q6-1YptavAy65knVOSBZ_y6YxmV&amp;si=wyfpSyutZQjL8cIr">Backend на Java</a> — <b>Mad Brains</b></p><p>Большой курс для входа в профессию backend-разработчика.</p><p><b>Главное о курсе:</b></p><ul><li>вебинары;</li><li>полезные советы.</li></ul><p><b>9. </b><a href="https://youtu.be/rY7cpJPDTTA?si=YEP0z32qDlXrPlTv">Backend. </a>— <b>Egor Repnikov</b></p><p>В этом полном экскурсе вы узнаете как правильно изучать backend-разработку.</p><p><b>Главное о курсе:</b></p><ul><li>наиболее используемые языки программирования и фреймворки;</li><li>какие языки используются в банках;</li><li>разработке технологий баз данных.</li></ul><p><b>10. </b><a href="https://experts2.ru/FSiauj?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Школа бэкенд‑разработки</a> — <b>Академия Яндекса</b></p><p>Вы узнаете, как создавать код для высоконагруженных веб-сервисов.</p><p><b>Главное о курсе:</b></p><ul><li>начинающим специалистам;</li><li>возможность получить офер;</li><li>работа в команде.</li></ul><p><b>11. </b><a href="https://youtu.be/YYGUWtpvHVo?si=jJOgfP_EWi4Xk4hS">Как стать Backend разработчиком</a> — <b>Артём Шумейко</b></p><p>Пошаговый путь к Backend разработчику.</p><p><b>Главное о курсе:</b></p><ul><li>кто такие Backend разработчики;</li><li>почему Backend разработчиком платят больше других;</li><li>интерактивный роадмап backend-разработчика.</li></ul><p><b>12. </b><a href="https://youtu.be/EcCZ18wj6Mw?si=Xa24ZTb10dmvKF7d">10 вопросов backend-разработчику</a> —<b> Группа IT-компаний Lad</b></p><p>Почему backend — это сложный процесс? Что должен знать новичок и за что могут «наказать» опытные программисты? Алексей, backend-разработчик в IT-компании Lad, поделился своими знаниями.</p><p><b>Главное о курсе: </b></p><ul><li>кто такой backend-разработчик;</li><li>где учиться, чтобы стать backender’ом;</li><li>полезные книги, каналы, подкасты.</li></ul><p><b>13. </b><a href="https://experts2.ru/fRveqV?sub1=tproger-kf&amp;sub2=kursy-backend-razrabotchik&amp;sub4=netop">Основы PHP8</a> — <b>MyRusakov</b></p><p>На этом курсе вы освоите все необходимые знания для начала работы с PHP-программированием.</p><p><b>Главное о курсе:  </b></p><ul><li>общая продолжительность — семь часов;</li><li>поддержка автора;</li><li>более 100 упражнений для закрепления материала.</li></ul><h2>Чем занимается специалист и какие навыки ему необходимы: полный обзор перед выбором курса backend-разработчика</h2><p>Backend-разработчик — это специалист, который создает и поддерживает ту часть веб-сайта или приложения, которая не видна пользователю. Если представить цифровой продукт как ресторан, то фронтенд — это красивая обстановка зала, меню и официанты, а бэкенд — это кухня, где готовятся блюда, хранятся продукты и налажены все логистические процессы. Именно бэкенд-разработчик отвечает за серверную логику, базы данных, интеграции с другими сервисами, безопасность и производительность. Без его работы сайт превращается в статичную картинку, неспособную реагировать на действия пользователя.</p><h2>Основные обязанности backend-разработчика</h2><p>В ежедневные задачи такого специалиста входит написание серверного кода на одном из языков программирования (например, Python, Java, PHP, JavaScript (Node.js), Ruby или Go), проектирование архитектуры приложения и структуры баз данных. Он создает и поддерживает API (Application Programming Interface) — специальные интерфейсы, через которые фронтенд обменивается данными с сервером. Важной частью работы является обеспечение безопасности: защита от хакерских атак, шифрование конфиденциальной информации и корректное разграничение прав доступа для разных пользователей. Кроме того, бэкенд-разработчик занимается оптимизацией кода и запросов к базе данных, чтобы приложение работало быстро и стабильно даже под высокой нагрузкой.</p><h2>Необходимые технические навыки (Hard Skills)</h2><p>Для успешной работы необходимо уверенное владение одним или несколькими серверными языками программирования и их фреймворками (например, Django для Python, Spring для Java, Laravel для PHP или Express.js для Node.js). Обязательным является глубокое понимание принципов работы реляционных (MySQL, PostgreSQL) и нереляционных (MongoDB) баз данных, а также умение писать сложные и оптимизированные SQL-запросы. Не менее важны знания в области API-технологий (REST, GraphQL), систем контроля версий (Git), принципов тестирования кода (юнит-тесты, интеграционные тесты) и базового администрирования операционных систем (чаще всего Linux). В современных реалиях все чаще требуются навыки работы с облачными платформами, такими как AWS, Google Cloud или Azure, и инструментами контейнеризации, например, Docker.</p><h2>Ключевые мягкие навыки (Soft Skills)</h2><p>Помимо технических знаний, критически важны мягкие навыки. Аналитическое мышление необходимо для проектирования сложных систем и поиска неочевидных решений. Коммуникабельность и умение работать в команде требуются для эффективного взаимодействия с фронтенд-разработчиками, менеджерами проектов и другими коллегами. Так как технологии быстро меняются, а каждый проект уникален, способность к постоянному самообучению и поиску информации является не просто преимуществом, а жизненной необходимостью. Именно этот комплекс hard и soft skills позволяет стать востребованным специалистом, и качественное обучение backend разработке должно быть нацелено на формирование именно такого набора компетенций.</p><h2>Какие есть смежные специализации и направления развития</h2><p>Бэкенд-разработчик имеет несколько естественных путей развития в смежные технические специализации. DevOps-инженер является одним из наиболее логичных направлений — эта специализация фокусируется на автоматизации процессов разработки, развертывания и мониторинга приложений, что требует глубокого понимания серверной инфраструктуры, инструментов контейнеризации и CI/CD. Data Engineer — еще одно перспективное направление, которое предполагает работу с большими объемами данных, построение ETL-процессов и создание инфраструктуры для аналитики, что тесно связано с навыками работы с базами данных и оптимизацией запросов. Также можно развиваться в сторону архитектуры программного обеспечения, где фокус смещается на проектирование масштабируемых и отказоустойчивых систем, или в сторону специализации по безопасности (DevSecOps), что становится все более востребованным с ростом киберугроз.</p><p>Backend-разработка — это профессия, которая требует системного подхода. Это не только знание того, как писать код, но и как делать его эффективным, масштабируемым и безопасным. Важно уметь видеть общую картину: от бизнес-логики продукта до того, как данные хранятся, обрабатываются и передаются на фронтенд. Вместо того чтобы просто учить синтаксис языка, ищите программу, которая научит вас проектировать системы, разбираться в принципах работы веб-протоколов и правильно организовывать взаимодействие между компонентами. Именно курсы backend-разработки, где теория подкрепляется реальными проектами, обеспечивают тот фундамент, который поможет вам развиваться как специалисту и уверенно принимать технические решения.</p><p><i>А какой курс или школа привлекли ваше внимание больше всего? Делитесь вашим мнением и личным опытом прохождения в комментариях — это поможет другим читателям сделать осознанный выбор. И если вы уже прошли достойную программу, которой нет в подборке, обязательно посоветуйте ее!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Продукт и баги: какие ошибки ломают всё, а какие — просто часть кода</title>
      <link>https://tproger.ru/articles/produkt-i-bagi--kakie-owibki-lomayut-vsyo--a-kakie---prosto-chast-koda</link>
      <comments>https://tproger.ru/articles/produkt-i-bagi--kakie-owibki-lomayut-vsyo--a-kakie---prosto-chast-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Mila Dubovaya]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/produkt-i-bagi--kakie-owibki-lomayut-vsyo--a-kakie---prosto-chast-koda</guid>
      <description><![CDATA[<p>Как отличить опасные баги от некритичных и выстроить систему работы с ними? Разбираем примеры и инструменты для джунов и перечисляем неочевидные фишки для миддлов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/produkt-i-bagi--kakie-owibki-lomayut-vsyo--a-kakie---prosto-chast-koda">Продукт и баги: какие ошибки ломают всё, а какие — просто часть кода</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Утечка данных]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 02 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Критические баги: когда всё идёт не по плану</h2><p>Это те самые «монстры», которые рушат ключевую логику, приводят к потере денег, данных или репутации. Их объединяет одно: они блокируют пользовательский сценарий или создают серьёзную уязвимость.</p><h3>Пример 1: «Призрачный промокод», или классический Race Condition</h3><p>Представьте себе интернет-магазин, который запустил акцию: «Первые 100 покупателей получат скидку 50% с промокодом SUPER-SALE». Код простой: проверяем, сколько раз промокод уже был использован, и если меньше 100 — применяем скидку.</p><p>Ситуация: в понедельник утром маркетологи в панике: промокод применили 350 раз. Бизнес потерял кучу денег. Как так вышло?</p><p>Разбор полётов: проблема в параллельных запросах. Когда нагрузка на сервер высока, несколько пользователей могут одновременно отправить запрос на применение промокода.</p><p>Упрощённый код на бэкенде мог выглядеть так (Node.js-подобный псевдокод):</p><p>Что происходит под нагрузкой:</p><ol><li>Запрос А приходит. usageCount равен 99. Проверка 99 &lt; 100 проходит.</li><li>Запрос Б приходит сразу после Запроса А, но до того, как Запрос А успел обновить счётчик в базе. Для Запроса Б usageCount всё ещё равен 99. Проверка 99 &lt; 100 тоже проходит.</li><li>Запрос В приходит в тот же момент, для него usageCount равен 99.</li></ol><p>В итоге все три запроса успешно применяют скидку и увеличивают счётчик. Вместо одного использования мы получили три.</p><p>Это классическое состояние гонки (Race Condition). Проблема не в логике как таковой, а во времени и одновременном доступе к общему ресурсу (счётчику в БД).</p><p>Многие помнят про Race Condition, но часто забывают, что он может проявляться не только в классических банковских транзакциях, но и в менее очевидных местах: счётчики, генерация уникальных имён, бронирование слотов.</p><p>Как чинить? Самый надёжный способ — транзакции с блокировкой. Пояснение для новичков: FOR UPDATE говорит базе данных: «Сейчас буду менять эту строку, никому её не отдавай, пока я не закончу». Другие запросы выстроятся в очередь и будут ждать, пока первый не завершит свою работу.</p><h3>Пример 2: «Тихий убийца производительности», или утечка памяти на фронтенде</h3><p>Ситуация: пользователи жалуются, что после получаса работы в SPA (Single Page Application) сайт начинает тормозить, «съедать» память, а анимации становятся «дёргаными». Перезагрузка страницы помогает.</p><p>Разбор полётов: представим, что у нас есть компонент, который при монтировании подписывается на глобальное событие (например, изменение размера окна).</p><p>Этот компонент может появляться и исчезать с экрана много раз (например, в модальном окне). Каждый раз, когда он появляется, useEffect навешивает новый обработчик handleResize на глобальный объект window. Но когда компонент исчезает, обработчик не удаляется.</p><p>После 10 открытий-закрытий модального окна у нас будет 10 одинаковых обработчиков. При каждом изменении размера окна браузер будет выполнять одну и ту же «сложную логику» 10 раз. Через час их будет уже сотня. Это и есть утечка памяти (Memory Leak). Ссылки на функции handleResize и их замыкания остаются в памяти, потому что на них ссылается window.</p><p>Это классика, но дьявол в деталях. Утечки могут быть куда коварнее: неотписанные WebSocket-соединения, забытые таймеры (setInterval), ссылки на DOM-элементы в замыканиях, которые мешают сборщику мусора их убрать.</p><p>Как чинить? Всегда отписываться от событий в функции очистки.</p><h2>Некритичные баги: «фича, а не баг»</h2><p>Это ошибки, которые не ломают основной функционал. Они могут быть визуальными, «текстовыми», или проявляться в таких редких условиях, что 99.9% пользователей их никогда не увидят.</p><h3>Пример 1: «Магия чисел с плавающей запятой»</h3><p>Ситуация: в корзине интернет-магазина пользователь добавляет товар за 0.1$ и товар за 0.2$. Итоговая сумма заказа отображается как 0.30000000000000004$.</p><p>Разбор полётов: это не баг кода. Это фундаментальная особенность того, как компьютеры хранят дробные числа в формате IEEE 754 (floating-point).</p><p>Если кратко: большинство десятичных дробей не могут быть точно представлены в двоичной системе счисления, так же как 1/3 не может быть точно записана в виде конечной десятичной дроби (0.3333...). Когда вы пишете 0.1, компьютер хранит ближайшее возможное двоичное представление, которое чуть-чуть больше. То же самое с 0.2. При их сложении эти микроскопические неточности накапливаются и становятся видимыми.</p><p>Почему это чаще всего некритично? Проблема чисто визуальная и не мешает работе продукта. Если на бэкенде для финансовых расчётов используются специальные типы данных (как Decimal в Python или BigDecimal в Java), то реальный платёж пройдёт на правильную сумму (0.3$).</p><p>Это отличный пример бага, который выглядит как ошибка новичка, но его корни уходят глубоко в основы информатики. Опытные разработчики знают, что с деньгами нельзя работать через float / double и всегда используют либо целочисленное представление (хранят всё в копейках/центах), либо специальные библиотеки.</p><p>Как чинить (на фронтенде)? Просто отформатировать вывод.</p><h3>Пример 2: «Восставший z-index»</h3><p>Ситуация: на определённой странице выпадающее меню профиля пользователя оказывается под блоком с баннером. Кликнуть по ссылкам «Профиль» или «Выйти» невозможно. Баг воспроизводится только в Safari на macOS.</p><p>Разбор полётов: скорее всего, проблема в контексте наложения (stacking context). Многие думают, что z-index — это просто глобальный номер слоя: у кого больше, тот и выше. Но это не так.</p><p>Элемент с transform, opacity &lt; 1, filter и некоторыми другими CSS-свойствами создаёт свой собственный «мини-мир» слоёв — stacking context. Внутри этого мира z-index работает как ожидается. Но никакой z-index: 9999 внутри одного контекста не поможет элементу перекрыть другой элемент из другого контекста, если сам родительский контекст находится «ниже».</p><p>В нашем случае, блок с баннером мог иметь, например, transform: scale(1) (для анимации при наведении), что создало новый контекст наложения. И если этот блок в DOM-дереве находится после шапки с меню, то весь его «мир» (включая фон и сам баннер) будет выше «мира» шапки.</p><p>Почему это некритично? Во-первых, не влияет на данные или безопасность. Во-вторых, проявляется только в одном браузере и на одной странице. В-третьих, функционал не блокируется полностью: пользователь может перейти на страницу профиля по прямой ссылке.</p><p>Как чинить? Вариантов несколько:</p><ul><li>Убрать свойство, создающее stacking context (контекст наложения) с баннера, если оно не критично: это поможет избежать проблем с порядком наложения элементов (z-index), предотвратить случайное перекрытие модальных окон, тултипов и др., упростить управление слоями в интерфейсе;</li><li>Создать stacking context для родительского элемента (это элемент интерфейса, на котором активируется выпадающий список) меню, например, добавив position: relative; z-index: 1; на саму шапку;</li><li>Перенести элемент с меню в конец &lt;body&gt; через портал (как это делают в React/Vue), чтобы он не зависел от родительских контекстов.</li></ul><h2>Приоритет и серьёзность: как отличить одно от другого?</h2><p>Новички часто путают эти два понятия, а ведь именно их правильное понимание экономит команде кучу времени, поскольку важно корректно выделять наиболее приоритетные и серьезные задачи — то есть срочные и важные — и лишь потом приступать к остальным.</p><h3>Серьёзность (Severity): описывает, насколько сильно баг ломает продукт.</h3><p><b>Уровень 1: приложение не работает, данные теряются. </b></p><p>Примеры: приложение ломается при запуске, пользователи не могут его открыть; платёжная система не сохраняет данные транзакций, и деньги «исчезают».</p><p><b>Уровень 2: ключевой функционал не работает, но есть обходные пути.</b></p><p>Пример: функция экспорта данных в CSV для пользователей не работает, они не могут получить свои данные, остальные функции работают в стандартном режиме.</p><p><b>Уровень 3: неключевой функционал работает некорректно.</b></p><p>Примеры: не работает кнопка «Поделиться» в соцсетях (если это не ключевая функция продукта); в списке товаров некорректно отображаются некоторые параметры, например, дата добавления.</p><p><b>Уровень 4: визуальный дефект. </b></p><p>Пример: опечатка в тексте.</p><h3>Приоритет (Priority): этот термин определяет, насколько срочно нужно исправлять баг.</h3><p><b>Уровень 1: чинить немедленно, бросив всё.</b></p><p>Пример: любой пользователь может получить доступ к чужим данным через URL (критическая уязвимость).</p><p><b>Уровень 2: включить в следующий спринт/релиз.</b></p><p>Пример: заметное падение производительности на мобильных устройствах при обработке данных в реальном времени.</p><p><b>Уровень 3: починить, когда будет время.</b></p><p>Пример: у кнопки на тёмной теме сайта некорректно отображается цвет.</p><p>Приоритет (то есть срочность) может зависеть от бизнес-контекста, сроков релиза и аудитории. Серьёзность (важность) — от технического влияния на продукт. При этом серьёзность и приоритет могут не только не совпадать по уровням, но и конфликтовать.</p><p>Например, на главной странице в названии компании замечена опечатка. Это 4-ый уровень серьёзности: сайт работает, ничего не сломано. Но при этом 1-ый уровень приоритета: ведь сайт — лицо компании, и отдел маркетинга требует исправить «ещё вчера». Что делать в подобном случае? Зависит от корпоративных правил и коммуникаций.</p><p>Важно обращать внимание на детали из контекста. Например: критическая утечка данных (уровень 1 серьезности) требует немедленного исправления (уровень 1 приоритета). Но баг с крашем приложения в редком сценарии и приоритетом 2-го уровня, если затронуты всего 0.1% пользователей. Или, допустим, сломалась опция «Экспорт в PDF» (это уровень 3 серьёзности), но клиент заплатил за неё высокую цену — значит, повышаем срочность.</p><h2>Инструментарий охотника за багами: от нахождения до профилактики</h2><p>Как превратить борьбу с ошибками из хаотичного тушения пожаров в контролируемый процесс? Нужен комплексный подход к «охоте на баги».</p><p>Поимка бага — лишь начало битвы. Настоящее мастерство проявляется в эффективном управлении его жизненным циклом: фиксация, приоритезация, анализ, исправление, профилактика. Давайте рассмотрим основные категории этого инструментария.</p><h3>Системы отслеживания ошибок (Bug Trackers): центр управления полётами</h3><p>Когда баг обнаружен, нужно выстраивать систему для регистрации, классификации, назначения, отслеживания статуса и анализа истории ошибок. Здесь в бой вступают специализированные трекеры.</p><p>Jira: мощный и гибкий инструмент с глубокими возможностями кастомизации и интеграцией практически с любой DevOps-тулчейн. Однако его богатство функций может быть избыточным и сложным для освоения в маленьких командах.</p><p>YouTrack (JetBrains): трекер отличает скорость и «умный» поиск (на естественном языке), тесная интеграция с IDE JetBrains и GitHub. Часто воспринимается как более легковесная и быстрая альтернатива Jira для команд, ценящих эффективность.</p><p>Linear: продукт с минималистичным UI, упором на клавиатурные сокращения. Подходит для стартапов и небольших команд, где важен фокус и отсутствие накладных расходов на управление самим трекером.</p><p>GitHub Issues / GitLab Issues: интегрированы напрямую в репозиторий. Удобны для open-source проектов и команд, чья разработка тесно завязана на Git-операциях (мердж-реквесты, коммиты). Прямая привязка багов к коду — их главный козырь.</p><h3>Системы мониторинга и сбора ошибок: радар, ловящий баги в реальном времени</h3><p>Что, если баг проявился у пользователя, а вы об этом ещё не знаете? Трекеры молчат, пока проблема не зафиксирована человеком. Системы мониторинга и сбора ошибок действуют на опережение, автоматически вылавливая сбои в работающем приложении.</p><p>Sentry: становится вашими глазами и ушами в продакшене. В реальном времени ловит исключения и ошибки на фронтенде (JavaScript, React, Vue и др.) и бэкенде (Python, Java, Node.js, Go и др.). Магия Sentry — в автоматической группировке схожих ошибок, алертах с детальным стектрейсом, контекстом (параметры запроса, данные пользователя) и даже возможностью записать шаги, приведшие к ошибке. Позволяет узнать о проблеме раньше, чем начнут сыпаться жалобы.</p><p>ELK Stack (Elasticsearch, Logstash, Kibana) / Grafana Loki: когда ошибка — лишь симптом, а корень проблемы спрятан глубоко в логике распределенной системы или инфраструктуре, нужен мощный анализ логов. Эти инструменты (особенно в паре со сборщиками логов по типу Fluentd или Promtail для Loki) собирают, индексируют и визуализируют гигантские объемы лог-данных со всех серверов и сервисов. Kibana и Grafana предоставляют мощные дашборды для поиска закономерностей, аномалий и первопричин сбоев.</p><h3>Инструменты для дебага: скальпель для вскрытия проблемы</h3><p>Когда баг локализован (благодаря трекеру и мониторингу), наступает время точечной работы — понять, почему он возникает и как исправить. Здесь незаменимы отладчики.</p><p>Browser DevTools (Chrome DevTools, Firefox Developer Tools): комфортный инструмент фронтенд-разработчика. Мощный отладчик JavaScript, инспектор DOM/CSS, детальный анализ сетевых запросов (заголовки, время, размеры), профилировщик производительности (выявление «бутылочных горлышек»), аудит безопасности и доступности — всё под рукой прямо в браузере.</p><p>IDE Debuggers (VS Code, IntelliJ IDEA, PyCharm и др.): дают суперспособность пошагового выполнения кода на бэкенде или даже на фронтенде (интегрируясь с браузером). Установка точек останова (breakpoints), просмотр состояния переменных в реальном времени, пошаговый проход (step into/over), оценка выражений на лету — это фундамент для понимания потока выполнения и нахождения логических ошибок.</p><h3>Инструменты для профилактики: строим оборону до появления врага</h3><p>Самые эффективные баги — те, которые никогда не попали в продакшен. Современные практики разработки делают ставку на автоматизированную профилактику ошибок на этапе написания кода. Вот ключевые союзники в этом:</p><ul><li>ESLint (JavaScript/TypeScript), статический анализатор кода — сканирует код до запуска, выявляя потенциальные баги, антипаттерны и нарушения соглашений по стилю. Находит опечатки, необъявленные переменные, опасные конструкции (напр., console.log в prod), потенциальные утечки памяти. Многие ошибки (например, сравнение == вместо === по правилу eqeqeq) может исправить автоматически (--fix). Интеграция в редактор (VS Code, WebStorm) и CI/CD пайплайны перехватывает ошибки мгновенно.</li><li>SonarQube (25+ языков) для непрерывного контроля качества кода. Идёт глубже ESLint, выискивая сложные баги, уязвимости безопасности (OWASP Top 10: SQL-инъекции, XSS) и «запахи кода», ведущие к будущим проблемам. Выявляет критические ошибки: разыменование null (Null Pointer Exception), утечки ресурсов (файлы, соединения), возможные состояния гонки (race conditions). Оценивает технический долг и ключевые метрики (сложность кода, покрытие тестами), помогая поддерживать здоровье кодовой базы. Работает как часть CI/CD, предоставляя наглядные дашборды.</li><li>Prettier (50+ языков) бескомпромиссно применяет единые стилистические правила (отступы, точки с запятой, переносы строк, кавычки). Устраняет целый класс потенциальных ошибок, связанных с неочевидной работой парсера из-за форматирования (напр., Automatic Semicolon Insertion в JS). Фокусирует код-ревью на логике, а не на пробелах.</li><li>Проактивная профилактика: Prettier, ESLint, SonarQube автоматически блокируют огромный пласт рутинных ошибок и уязвимостей до того момента, как код попадет в репозиторий или сборку.</li><li>Раннее выявление: Sentry, ELK/Loki мгновенно сигнализируют о сбоях в работе приложения, минимизируя время реакции и воздействие на пользователей.</li><li>Эффективный менеджмент: Jira, YouTrack, Linear, GitHub Issues обеспечат прозрачность, контроль и анализ потока ошибок.</li><li>DevTools, IDE Debuggers дают разработчику возможность точно диагностировать и исправлять корневые причины сложных багов.</li></ul><p>Важно: максимальный эффект достигается при интеграции этих инструментов в CI/CD пайплайн. Prettier, ESLint и статический анализ SonarQube должны запускаться автоматически на каждый пул-реквест, блокируя мердж в основную ветку при обнаружении проблем. Сборка с ошибками или уязвимостями просто не должна попадать дальше. Это создает культуру качества и экономит сотни часов на исправлении «глупых» багов, позволяя команде сосредоточиться на сложных задачах и инновациях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Где развернуть MVP-проект: 7 VPS-хостингов с простым стартом</title>
      <link>https://tproger.ru/articles/gde-razvernut-mvp-proekt--6-vps-hostingov-s-prostym-startom</link>
      <comments>https://tproger.ru/articles/gde-razvernut-mvp-proekt--6-vps-hostingov-s-prostym-startom?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gde-razvernut-mvp-proekt--6-vps-hostingov-s-prostym-startom</guid>
      <description><![CDATA[<p>Провайдеры с акцентом на параметры минимального тарифа, сценарии для MVP, наличие шаблонов и гайдов, возможности апгрейда и формат оплаты, а также как быстро отвечает поддержка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gde-razvernut-mvp-proekt--6-vps-hostingov-s-prostym-startom">Где развернуть MVP-проект: 7 VPS-хостингов с простым стартом</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Быстрый старт]]></category>
      <category><![CDATA[Windows Server]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 01 Sep 2025 14:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Код прототипа готов, осталось выкатить его на реальных пользователей и проверить гипотезу. Разворачивать тяжелую инфраструктуру или ковырять биллинг AWS ради первой версии продукта невыгодно. На старте нужна понятная виртуалка: арендовали сервер, развернули окружение через Docker и пустили трафик.</p><p>Мы разобрали семь VPS-хостингов, которые подходят для быстрого деплоя без глубоких познаний в DevOps. Изучили доступные из коробки образы операционных систем и форматы тарификации.</p><p>Ниже собрали факты и сценарии использования площадок, чтобы вы могли за пару минут арендовать нужные мощности и вернуться к написанию кода.</p><h2>1. RUVDS: Гибкое решение для старта и развития MVP</h2><p><a href="https://ruvds.com/?utm_source=dtf&amp;utm_campaign=article">RUVDS</a> позиционирует себя как решение, ориентированное на потребности MVP-проектов, предлагая гибкие условия для старта и развития. Платформа позволяет развернуть прототип с минимальными затратами, быстро получить обратную связь и масштабировать ресурсы по мере роста проекта, избегая необходимости миграции.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/78435f7c-1132-4700-b085-13f8ced63956.png" alt="" /></figure><h3>Типовые сценарии использования (MVP):</h3><ul><li>Небольшой интернет-магазин;</li><li>Лендинг для проверки гипотез;<br /></li><li>Тестовый бэкенд/API;</li><li>Чат-боты.</li></ul><h3>Ключевые преимущества RUVDS для MVP-проектов:</h3><p><b>1. </b> <b>Гибкая тарификация и контроль затрат.</b><b></b></p><ul><li>Минимальный тариф: От 139 рублей в месяц за базовую конфигурацию (VPS на Linux, 1 vCPU, 512 МБ RAM, 10 ГБ диска, 1 белый IPv4).</li><li>Оплата по фактической нагрузке: Для проектов с переменной нагрузкой предусмотрена посекундная тарификация или списание каждые 15 минут, позволяющие оплачивать только фактически потребленные ресурсы. Неиспользованный остаток средств возвращается на баланс.</li><li>Долгосрочные скидки: При предоплате на срок от 3 до 12 месяцев предоставляются скидки до 20%.</li></ul><p><b>2.  Быстрый старт и удобное управление.</b><b></b></p><ul><li>Маркетплейс шаблонов: Доступны готовые шаблоны для быстрого развертывания различных решений.</li><li>База знаний: Подробный справочник с пошаговыми инструкциями для новичков и расширенными гайдами для опытных администраторов.</li><li>Бесплатная ISP Manager: До конца 2025 года панель управления ISP Manager предоставляется без дополнительной платы при создании любого VPS.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/c97302e9-fa68-4268-b449-34088e27a5aa.png" alt="" /></figure><p><b>3.  Бесшовное масштабирование.</b></p><p><b></b>Ресурсы сервера (CPU, RAM, диск) легко масштабируются непосредственно из личного кабинета, что исключает необходимость миграции данных при росте проекта.</p><ul><li>Стандартный IPv4-адрес. Каждая виртуальная машина включает в стоимость стандартный IPv4-адрес. Дополнительные IPv4-адреса доступны для аренды.</li><li>Интеллектуальное управление через API. API, соответствующее OpenAPI 3.0.0, позволяет интегрировать ресурсы с внешними системами и автоматически масштабировать серверные мощности в зависимости от нагрузки.</li></ul><p><b>4.  Глобальная инфраструктура и стабильность.</b><b></b></p><ul><li>Дата-центры: Инфраструктура включает 18 дата-центров уровня Tier III, расположенных по всему миру, что является одним из крупнейших показателей среди российских провайдеров по географическому охвату.</li><li>Оборудование: Использование корпоративного оборудования и современных накопителей (HDD, SSD, NVMe) обеспечивает высокую производительность и надежность работы размещенных проектов.</li></ul><p><b>5.  Круглосуточная техническая поддержка.</b><b></b></p><ul><li>Доступность: Служба поддержки доступна 24/7.</li><li>Время ответа: Среднее время ответа на запросы через тикет-систему или онлайн-чат составляет около 15 минут.</li><li>Административные права: Клиенты сохраняют полные административные права на серверы и могут получать консультации по их настройке и эксплуатации.</li></ul><p><b>6.  Безопасность.</b><b></b></p><p>Платформа реализует комплекс мер для обеспечения безопасности данных и стабильности работы клиентских проектов.</p><ul><li>Защита от DDoS-атак. Встроенная защита от DDoS-атак работает 24/7, обеспечивая бесперебойную работу серверов даже при сильном внешнем давлении.</li><li>Гарантия безопасности данных. Подтверждено соответствие требованиям ФСТЭК и ФЗ-152 по защите персональных данных.</li></ul><p>RUVDS предлагает комплексное решение для развертывания MVP-проектов, сочетая в себе экономичность, гибкость масштабирования и удобство управления. Это позволяет командам быстро тестировать гипотезы и развивать продукты, минимизируя первоначальные инвестиции и операционные сложности.</p><h2>2. KoaraCloud: быстрый и оптимальный старт</h2><p>Базовая конфигурация провайдера заточена под деплой нетребовательных сервисов. Минимальный тариф стоит 279 рублей за месяц аренды. В эту конфигурацию включен сервер с 1vCPU на базе процессора Ryzen 9 3900, 1 ГБ оперативной памяти, накопитель на 15 ГБ и пропускная способность сети 100 Мбит/с.</p><h3>Под какие задачи подойдет</h3><p>Стартовых мощностей достаточно для публикации лендингов, развертывания тестового бэкенда или проверки гипотез легкого SaaS-решения. Поднять интернет-магазин на минималках не выйдет — для работы тяжелых баз данных без лагов потребуются конфигурации START-2 или DE-1.</p><p>Ресурсы можно масштабировать по мере роста проекта. Апгрейд тарифа внутри одной линейки делается в два клика через панель управления. Провайдер работает по ежемесячной подписке без почасовой оплаты, но возвращает средства по запросу, если сервер не подошел под специфику сервиса.</p><h3>Формат работы поддержки</h3><p>Штат инженеров дежурит круглосуточно, среднее время ответа специалиста составляет 5–10 минут. Часть типичных задач берет на себя автоматический ИИ-ассистент — он же подсказывает по вопросам запуска MVP на минимальных тарифах. На старших тарифах с настройкой проекта помогает уже живой саппорт.</p><p>Задать технические вопросы можно на сайте, через Telegram-бота или в чате коммьюнити. Сбои обычно носят локальный характер и затрагивают небольшие группы серверов. Информацию об инцидентах сразу публикуют в канале, а восстановление доступа занимает от 5 до 20 минут.</p><p>Характеристики всех машин собраны на сайте <a href="https://koara.cloud/?from=7958&amp;utm_source=tproger&amp;utm_medium=article&amp;utm_campaign=botapi&amp;utm_content=link">KoaraCloud</a>. С апреля ребята также развивают свой <a href="http://blog.koara.io/">блог</a>, где раз в одну-две недели публикуют практические мануалы по работе с VDS.</p><h2>3. Timeweb: виртуальные серверы для MVP и рабочих окружений</h2><p>Когда речь заходит о запуске MVP-проекта, разработчикам важен не только тариф, но и то, как быстро можно развернуть инфраструктуру, перенести код и при необходимости расширить ресурсы. <a href="https://timeweb.com/ru/services/vds/">Timeweb</a> выстраивает всю экосистему вокруг этого подхода: прозрачные тарифы, гибкость в настройке и упор на поддержку, которая берёт часть задач на себя.</p><h3>Тарифы для старта: от минимального к кастомному</h3><p>Самый доступный вариант — Cloud MSK 15 за 270 ₽ в месяц (или 9 ₽ в день). Конфигурация выглядит так: процессор 1×3.3 ГГц, 1 ГБ RAM, 15 ГБ NVMe-диска, публичный IP и канал 1 Гбит/с без ограничений по трафику. Для MVP-лендингов, тестовых API или небольших CRM-систем этого достаточно.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/54ebeec0-130d-495c-9761-2e73813872ce.png" alt="" /></figure><p>Дальше тарифная линейка растёт по наращиванию RAM и диска: от Cloud MSK 30 (495 ₽/мес., 2 ГБ RAM и 30 ГБ диска) до конфигураций с двумя ядрами и расширенным хранилищем. Есть и кастомный вариант — собрать сервер под себя с минималкой от 594 ₽/мес.</p><p>Оплата возможна помесячно или по дням — удобно для тестов и экспериментов, когда сервер нужен на короткий срок.</p><h3>Сценарии использования</h3><p>Timeweb прямо указывает на широкий диапазон проектов: от тестовых сред разработки и блогов до онлайн-магазинов, ERP-систем и даже игровых серверов. На практике это значит, что один и тот же VPS можно легко переиспользовать: сегодня для staging-окружения, завтра — для SaaS-прототипа.</p><h2>Контроль и масштабирование</h2><p>Ключевая особенность — изоляция ресурсов. CPU, RAM и диск выделены конкретно под ваш сервер, без «соседей» по нагрузке. Это важно для предсказуемости тестов и стабильности даже небольших проектов. Масштабирование — через пару кликов в панели: можно добавить мощности или, наоборот, уменьшить конфигурацию, когда нагрузка падает.</p><h3>Интерфейсы и управление</h3><p>Управление организовано максимально гибко:</p><ul><li>собственная веб-панель с современным UI,</li><li>мобильные версии для iOS и Android,<br /></li><li>API для автоматизации, включая поддержку Terraform и cloud-init (массовый запуск серверов),<br /></li><li>привычные панели уровня ISPmanager, Vesta, Hestia и др., которые можно подключить в один клик.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/b13129ed-99ba-4123-87d2-543a0162938b.png" alt="" /></figure><h3>Поддержка и миграция</h3><p>Поддержка у Timeweb работает в чате и мессенджерах сразу, а тикеты разбирают в течение 20 минут. Для тех, кто переносит проект с другого хостинга, действует сервис миграции без простоев: команда сама перенесёт файлы, развернёт ПО (Nginx, Apache, MySQL, PHP) и проверит работоспособность. Бесплатно можно получить и настройку сервера, и восстановление сайта из бэкапа.</p><p>Для более сложных сценариев доступно платное администрирование — если хочется снять с себя рутину управления VPS.</p><h3>Инфраструктура и безопасность</h3><p>Сервера развёрнуты в дата-центрах уровня TIER III в России, Казахстане и Европе. SLA заявлен на уровне 99,98 %. С точки зрения безопасности — соответствие 152-ФЗ, ISO и GDPR (актуально, если пользователи из ЕС). Встроенная защита от DDoS покрывает уровни L3–L4, а L7 можно подключить дополнительно.</p><p>Timeweb подойдет для небольших интернет-магазинов, SaaS-MVP, игровых серверов, а также для команд, которые разворачивают staging-окружение и хотят быстро переключаться между конфигурациями.</p><h2>4. Cloud4box: виртуальные серверы с гибкой настройкой и строгим SLA</h2><p><a href="https://cloud4box.com/vps/">Cloud4box</a> делает акцент на прозрачности: никаких oversell, только гарантированные ресурсы и чёткий SLA на уровне 99,98 %. Для команд, которым важна предсказуемость окружения и возможность быстро менять конфигураци, это может стать ключевым фактором.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/86c71477-0c7b-4c50-947b-ffe75232af35.png" alt="" /></figure><h3>Тарифы и масштабирование</h3><p>У Cloud4box нет жёсткой тарифной сетки — здесь работает конфигуратор, который позволяет собрать сервер под задачу. Минимальный старт возможен с 1 ядра CPU, 1 ГБ RAM и 20 ГБ диска. Важная особенность — ресурсы можно увеличивать и уменьшать даже после оплаты, не прерывая работу сервиса. Это удобно для MVP: сегодня хватает базовой конфигурации, завтра — можно добавить ядро или пару гигабайт памяти в пару кликов.</p><p>Дополнительно доступны гибкие опции: +1 ядро за 110 ₽ в месяц, +1 ГБ RAM за 46 ₽, +1 ГБ диска всего за 4,8 ₽. Такой подход позволяет понять оптимальный баланс мощности и бюджета без переплат за неиспользуемые ресурсы.</p><h3>Техническая база</h3><p>Cloud4box использует современное «железо»: процессоры Intel i9-9900K и Xeon Gold 6240R, серверные SSD-диски Intel и Micron. Виртуализация — KVM без oversell, то есть клиент получает ровно те ресурсы, которые оплатил. С точки зрения стабильности задекларирован SLA в 99,98 %, а при простое по вине провайдера действует компенсация в трёхкратном размере.</p><p>Дата-центры уровня Tier-3, а сеть соединена с крупнейшими точками обмена трафиком. Для юридических лиц — полный комплект закрывающих документов через ЭДО.</p><h3>Управление и дополнительные услуги</h3><p>Сервера активируются в течение 5–10 минут после оплаты. На выбор доступны панели управления: Hestia, Fastpanel или Plesk. Из дополнительных опций — полные бэкапы дисков (3,3 ₽ за 1 ГБ в месяц), снапшоты, резервное копирование по расписанию.</p><p>Для ОС выбор широкий: от Ubuntu (20.04, 22.04, 24.04) и Debian (11, 12) до AlmaLinux, CentOS, FreeBSD и Windows Server (2016, 2019, 2022). При необходимости можно поставить любую другую ОС через панель.</p><h3>Поддержка и администрирование</h3><p>Техподдержка отвечает в среднем за 5–15 минут и работает 24/7. В базовом пакете — помощь с установкой ОС, перенос данных и базовая DDoS-защита (уровни L3–L4). Для тех, кому нужно больше, доступно платное администрирование: 625 ₽ за 15 минут.</p><p>Есть и сервисы для миграции: перенос сайта или данных со стороннего хостинга выполняется без лишних задержек. Для контроля инфраструктуры действует круглосуточный мониторинг.</p><h3>Для каких проектов подойдёт</h3><p>Cloud4box хорошо впишется в сценарии, где важна максимальная предсказуемость SLA и свобода настройки ресурсов. Это может быть staging-окружение для разработчиков, сервисы с непостоянной нагрузкой (например, маркетинговые кампании), корпоративные проекты с требованиями по документообороту.</p><h2>5. Макхост: виртуальные серверы на KVM с простым входом и гибкой линейкой</h2><p><a href="https://mchost.ru/services/linux-vps/">Макхост</a> предлагает линейку VPS/VDS на KVM-виртуализации с акцентом на баланс между минимальным входным порогом и возможностью развернуть серьёзные проекты.</p><h3>Стартовые тарифы и ресурсы</h3><p>Минимальный рабочий вариант — тариф KVM-1: одно ядро CPU (2.35 ГГц), 1 ГБ DDR4 RAM и 15 ГБ NVMe-диска. При оплате за год стоимость составит 396 рублей в месяц, плюс в комплекте бесплатный месяц панели ISPmanager 6. На этом уровне можно развернуть лендинг, блог, небольшую CRM или тестовый backend.</p><p>Дальше линейка масштабируется до KVM-12: 6 ядер CPU, 12 ГБ RAM и до 360 ГБ NVMe. Для интернет-магазинов, ERP-систем или SaaS-проектов средней нагрузки такие конфигурации дают запас прочности.</p><p>Отдельный вариант — короткие акции и спецтарифы с ограничениями (например, KVM-NEW с урезанной RAM), но основной акцент сделан на стабильные планы с безлимитным трафиком и выделенным IP.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/7d97b21d-e219-423d-951e-a72a15d9a300.png" alt="" /></figure><h3>Панели и управление</h3><p>Для управления сервером доступны две панели: бесплатная FastPanel с упором на простоту и Ispmanager lite, который на старте даётся на месяц бесплатно. Обе решают базовые задачи: настройка сайтов, доменов, почтовых ящиков, мониторинг ресурсов.</p><p>С точки зрения администрирования пользователи получают root-доступ и полный контроль: можно ставить любой софт, управлять портами и таблицами маршрутизации. Для автоматизации процессов предусмотрена интеграция с популярными Linux-дистрибутивами — CentOS, Debian, Ubuntu, включая готовые сборки с панелями</p><h3>География и дата-центры</h3><p>Сервера доступны в двух точках: Россия (Москва, DataPro) и Европа (Нидерланды, Serverius). По умолчанию выбирается российский ЦОД, но переключение на европейский вариант даёт гибкость, если проект ориентирован на зарубежных пользователей.</p><h3>Поддержка и миграция</h3><p>Поддержка работает 24/7 через тикет-систему. Отдельный бонус для тех, кто мигрирует с другого хостинга, — бесплатный перенос сайта и месяц использования в подарок. Для сложных задач можно подключить платное администрирование (от 1500 рублей за полчаса), что закрывает сценарии вроде аварийного восстановления или оптимизации производительности.</p><h3>Акции и дополнительные услуги</h3><p>К тарифам можно докупить выделенные IP-адреса, SSL-сертификаты и лицензии на панели управления. Часто действуют акции: домен в .RU или .РФ при оплате VPS на год, бонусы за переезд. Эти условия помогают командам оптимизировать бюджет на старте MVP.</p><h3>Для каких проектов подойдёт</h3><p>Макхост ориентирован на проекты, которым важна предсказуемость ресурсов и гибкость в управлении: интернет-магазины, корпоративные порталы, проекты с высокой посещаемостью и сложной архитектурой. На младших тарифах можно запускать пилотные версии SaaS-продуктов или выделять staging-сервера под разработку.</p><h2>6. Fornex: международный VPS с акцентом на географию и поддержку</h2><p>Для команд, которым важно запускать проекты в разных регионах и контролировать инфраструктуру на уровне железа,<a href="https://fornex.com/ru/virtual-private-servers/"> Fornex</a> предлагает VPS-сервера в пяти странах и делает ставку на стабильность работы дата-центров и скорость поддержки.</p><h3>Локации и инфраструктура</h3><p>Доступны пять точек размещения: Германия, Нидерланды, США, Швейцария и Испания. Все сервера работают на базе Supermicro с NVMe-дисками, объединёнными в RAID10, что даёт отказоустойчивость и предсказуемую скорость. Сетевая архитектура построена на оборудовании Juniper и Arista, а гипервизоры используют KVM-виртуализацию с полной изоляцией ресурсов.</p><p>Дата-центры сертифицированы по Tier III и обслуживаются локальными инженерами, которые следят за состоянием оборудования. SLA формализован через высокую доступность и защиту от DDoS-атак до 10 Гбит/с.</p><h3>Тарифы для старта</h3><p>Минимальная конфигурация — Cloud NVMe 1 за 6,5 € в месяц: 1 ядро CPU (3 ГГц), 1 ГБ RAM и 10 ГБ NVMe. Такой сервер подойдёт для MVP-лендинга или тестовой среды.</p><p>Следующий шаг — Cloud NVMe 2 (8,5 € в месяц), где уже 2 ГБ RAM и 20 ГБ диска — этого достаточно для простого SaaS-прототипа или небольшого интернет-магазина. Линейка продолжается до Cloud NVMe 8 (4 ядра, 8 ГБ RAM, 120 ГБ NVMe) — вариант для нагруженных сервисов.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/efb6dbc3-43f7-4560-824a-cb810dc3a4d2.png" alt="" /></figure><p>Трафик во всех тарифах безлимитный, скорость подключения — 100 Мбит/с.</p><h3>Панели и управление</h3><p>Управление строится вокруг root-доступа по SSH и VNC, но для удобства можно бесплатно добавить панели вроде HestiaCP, CyberPanel или CloudPanel. Из коробки поддерживаются популярные ОС: Ubuntu, Debian, Fedora, AlmaLinux, RockyLinux, Arch, CentOS и даже Windows Server.</p><p>В панели заказа доступны фильтрация трафика и быстрые изменения конфигурации VPS. Это позволяет менять ресурсы «на ходу» без долгих переносов.</p><h3>Поддержка и реакция</h3><p>Команда техподдержки работает 24/7, помогают с переносом сайтов, настройками и решением инцидентов без доплат. Среднее время реакции на тикет — 3 минуты 45 секунд, а оценка пользователей — 4,69 из 5. Для тех, кто хочет дополнительной уверенности, действует гарантия возврата денег, если сервис не устроит.</p><h2>Для каких проектов подходит</h2><p>Fornex выглядит интересным решением для международных проектов: от e-commerce с трафиком из Европы до SaaS-сервисов с географически распределёнными пользователями. Благодаря гибкой конфигурации и быстрому апгрейду VPS можно начинать с тестового окружения и постепенно расширять его под боевую нагрузку.</p><h2>7. THE.Hosting: масштабируемый VPS в 46 странах с акцентом на скорость и гибкость</h2><p>Когда проект требует размещения в разных точках мира — будь то MVP для локального рынка или сервис с распределённой аудиторией — важно, чтобы провайдер предлагал инфраструктуру в широком географическом диапазоне. <a href="https://the.hosting/ru/vps">THE.Hosting </a>работает сразу в 46 странах, а в ключевых локациях (Европа, США, Азия) предоставляет скорость соединения до 10 Gbps, что выделяет его среди решений для проектов с интенсивным трафиком.</p><h3>Локации и инфраструктура</h3><p>Сервера доступны в Европе, США, Азии, Латинской Америке и Океании. В крупных центрах — от Германии и Нидерландов до Японии и Австралии — заявлена скорость порта 10 Gbps, а дисковая подсистема построена на NVMe с RAID10 для отказоустойчивости. Виртуализация на базе KVM гарантирует изоляцию ресурсов и полный контроль.</p><p>Такой разброс по географии делает сервис интересным для SaaS-проектов, которые хотят приближать окружение к пользователям, снижая задержки, или для e-commerce, работающего сразу в нескольких странах.</p><h3>Тарифы для старта</h3><p>Минимальный тариф — Aluminium-[NL] за 5,77 € в месяц: 1 vCore, 1 ГБ ECC RAM, 25 ГБ NVMe и порт 10 Gbps. Это хорошая точка входа для прототипов и тестовых backend-окружений.</p><p>Далее линейка растёт ступенчато: Argentum-[NL] с 2 ядрами и 2 ГБ RAM за 6,77 €, Ruthenium-[NL] с 4 ГБ RAM за 9,77 €, и доходит до мощных конфигураций вроде Obsidian-[NL] (32 vCore, 64 ГБ RAM, 510 ГБ NVMe за 160 €) и Adamantium-[NL] (24 vCore, 32 ГБ RAM, 410 ГБ NVMe за 111 €). Такой диапазон позволяет плавно двигаться от MVP до полноценного продакшн-кластера.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-29/f01e68ea-b68b-4e79-b7a3-405ed6fe0886.png" alt="" /></figure><h3>Панели управления и ОС</h3><p>Для управления можно выбрать как платные, так и бесплатные панели: ISPmanager, Plesk, cPanel, DirectAdmin, а также VestaCP, Hestia, CyberPanel и другие без дополнительной платы.</p><p>Из операционных систем доступны популярные Linux-дистрибутивы (Ubuntu, CentOS, Debian, Arch, AlmaLinux и др.) и Windows Server — что делает сервис универсальным для разных стеков разработки.</p><h3>Поддержка и перенос</h3><p>THE.Hosting предлагает круглосуточную поддержку администраторов, которые помогают с настройкой окружения и запуском проекта. Важный плюс — бесплатный перенос данных с другого хостинга.</p><p>Запуск автоматизирован: сервер активируется в течение 15 минут после заказа. Это удобно для команд, которым нужно быстро развернуть тестовую или боевую среду без лишних задержек.</p><h3>Для кого подойдёт</h3><p>THE.Hosting хорошо вписывается в сценарии, где важны скорость и распределённость: стриминговые сервисы, международные SaaS-проекты, крупные e-commerce и highload-системы. Для команд с небольшими MVP подойдёт минимальный тариф, а в будущем можно перейти на серьёзные мощности без смены провайдера.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что можно накодить на телефоне и какие приложения для этого подходят</title>
      <link>https://tproger.ru/articles/chto-mozhno-nakodit-na-telefone-i-kakie-prilozheniya-dlya-etogo-podhodyat</link>
      <comments>https://tproger.ru/articles/chto-mozhno-nakodit-na-telefone-i-kakie-prilozheniya-dlya-etogo-podhodyat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-mozhno-nakodit-na-telefone-i-kakie-prilozheniya-dlya-etogo-podhodyat</guid>
      <description><![CDATA[<p>Подборка топовых мобильных IDE и редакторов, которые помогают фронтенд и бэкенд разработчикам писать код прямо со своего телефона.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-mozhno-nakodit-na-telefone-i-kakie-prilozheniya-dlya-etogo-podhodyat">Что можно накодить на телефоне и какие приложения для этого подходят</a>»</p>]]></description>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Смартфоны]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 11 Aug 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>К сожалению, в смартфонах нет среды разработки по типу VS Code, которая одинаково хорошо работает с Python, C++, Java и другими ЯП. Приходится выбирать между десятками приложений, упираясь в ограниченный функционал.</p><p>Мы собрали лучшие инструменты для мобильного программирования: от простых редакторов до IDE с компиляторами и отладчиками. Вы узнаете про приложения для фронтенда и бэкенда. Мы затронем тему вайб-кодинга и даже расскажем, как установить Linux-терминал поверх Android или iOS.</p><p><i>Ссылки на приложения опубликовали в комментариях.</i></p><h2>CodePen</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/360b9812-798c-4579-a75e-f7d86bc630b4.jpg" alt="" /></figure><ul><li>Приложение для браузера: ✅</li><li>Приложение для Android: ✅</li><li>Приложение для iOS: ❌</li></ul><p>Обзор начнём с онлайн-платформы для фронтендеров <b>CodePen</b>. Песочница работает с HTML, CSS, JS. С её помощью разработчики обмениваются идеями, создают прототипы и обучаются вёрстке. CodePen ценят за простоту – открыл песочницу, написал код, увидел результат.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/561609f4-d3be-44bf-9849-6abb016e0934.jpg" alt="" /><figcaption>Страница разработчика с популярными пэнами</figcaption></figure><p>Проекты называются «пэнами», ими можно делиться с другими пользователями. Ещё есть лента, где публикуют интересные работы с открытым кодом. Проекты можно копировать себе, оценивать и комментировать.</p><p>CodePen поддерживает 7 фреймворков, 5 библиотек и 24 набора UI-компонентов. Возможности ограничены только мощностью устройства: превью тяжёлых пэнов на телефоне будет лагать.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/45678e1b-f327-4666-90b7-467485a3da08.jpg" alt="" /><figcaption>Пример тяжёлого пэна, его превью не тянет даже ноутбук с 16 Гб ОЗУ</figcaption></figure><p>На бесплатном тарифе можно создавать неограниченное количество пэнов, коллекций и шаблонов. Единственное неудобство – добавлять картинки нужно через альтернативный хостинг. За $8 в месяц можно грузить картинки напрямую, работать в команде с коллегами, создавать личные пэны, которые закрыты от других пользователей.</p><h2>Code Editor</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/7c54b2a9-24e2-432c-b1dd-2273b30bf749.jpg" alt="" /></figure><ul><li>Веб-приложение: ❌</li><li>Приложение на Android: ✅</li><li>Приложение на iOS: ✅</li></ul><p>Универсальный редактор <b>Code Editor</b> подсвечивает синтаксис 110+ языков. В приложении есть поиск и замена символов, отображение и скрытие строк, выделение совпадающих скобок, автоматические отступы.</p><p>Фронтендеры скачивают Code Editor  ради предпросмотра HTML и плагина <a href="https://tproger.ru/articles/kak-plagin-emmet-pomogaet-uskorit-rabotu-s-programmnym-kodom">Emmet</a>. Также через встроенную консоль удобно тестировать и отлаживать JS-скрипты.</p><p>Приложение распознает комбинации клавиш, поэтому к телефону можно подключить физическую клавиатуру и кодить как за маленьким монитором.</p><p>Code Editor поддерживает FTP, FTPS, SFTP и WebDAV для работы с удалёнными серверами. Ещё в приложение добавили Google Диск, Dropbox и GitHub, чтобы синхронизировать файлы между устройствами.</p><h2>Acode</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/75cf8fe0-b50f-409d-ae14-e452e2c8b833.jpg" alt="" /></figure><ul><li>Веб-приложение: ❌</li><li>Приложение на Android: ✅</li><li>Приложение на iOS: ❌</li></ul><p>Редактор <b>Acode </b>охватывает 100+ языков программирования. Приложение оптимизировано для работы с файлами до 50000 строк. Acode выбирают для мобильной разработки, быстрых правок и обучения программированию.</p><p>Встроенный просмотр HTML и Emmet ускоряет вёрстку. В JS-консоли можно тестировать код фрагментами без создания отдельных файлов. Веб-сайты запускаются прямо в браузере приложения. Ещё редактор поддерживает GitHub, FTP/SFTP для работы с удалёнными серверами.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/b4a7cd0d-144f-48a8-83ba-d33d8068be6d.jpg" alt="" /><figcaption>Acode на планшете</figcaption></figure><p>Плагины расширяют функционал Acode. Например, можно установить эмулятор терминала или добавить ИИ-агента от популярных провайдеров.</p><h2>Pydroid, Cxxdroid, Jvdroid</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/1bb83185-6c33-425a-93ba-6962bf94ca3b.jpg" alt="" /></figure><ul><li>Веб-приложение: ❌</li><li>Приложение на Android: ✅</li><li>Приложение на iOS: ❌</li></ul><p>Приложения от одного разработчика не случайно объединили в один раздел – это лучшие мобильные IDE для Python, C/C++ и Java. Каждое заточено под конкретный ЯП, но все построены на одной архитектуре и предлагают схожий функционал.</p><p>IDE работают автономно – интернет нужен только для скачивания дополнений. В каждом приложении есть терминал, примеры кода для обучения, система управления пакетами и библиотеками.</p><p>Редакторы поддерживают:</p><ul><li>подсветку синтаксиса,</li><li>работу с вкладками,</li><li>расширенную клавиатуру,</li><li>быструю публикацию кода на Pastebin.</li></ul><p><b>Pydroid 3</b> – самое функциональное приложение из тройки. Это интерпретатор Python 3 с менеджером пакетов pip и готовыми библиотеками для data science:</p><ul><li>numpy,</li><li>scipy,</li><li>matplotlib,</li><li>scikit-learn,</li><li>jupyter.</li></ul><p>В премиум-версии доступны OpenCV, TensorFlow и PyTorch.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/e88e3e40-26f7-45e7-9fde-a8b7902622c2.jpg" alt="" /><figcaption>IDE для Python</figcaption></figure><p>Есть поддержка GUI-приложений через Tkinter, Kivy с SDL2-бэкендом и PySide 6. Также встроен компилятор C/C++/Fortran для сборки нативных библиотек и Cython.</p><p>Отладчик PDB работает с точками останова. Приложение определяет используемые библиотеки и переключается на соответствующий режим выполнения. Ещё редактор автоматически ставит отступы и предлагает навигацию по методам.</p><p><b>Cxxdroid </b>– это компилятор C/C++ на базе Clang с поддержкой ассемблера. В менеджере пакетов есть популярные библиотеки:</p><ul><li>Boost,</li><li>SQLite,</li><li>ncurses,</li><li>libcurl.</li></ul><p>Графические библиотеки SDL2, SFML и Allegro доступны в премиум-версии.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/5104e1cb-3cc4-4aa3-8a81-391e933244f6.jpg" alt="" /><figcaption>IDE для C/C++</figcaption></figure><p>Разработчики заморочились над системой кэширования, которая ускоряет сборку в среднем в 3 раза, а при использовании Boost – до 33 раз. Также есть режим интерпретатора (REPL) на основе CERN Cling для интерактивной работы с кодом.</p><p>Архитектура приложения исключает падения IDE из-за ошибок в пользовательском коде – анализ и компиляция выполняются одним компилятором.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/10db4050-fa2c-4f2f-830d-592b43f3422a.jpg" alt="" /><figcaption>IDE для Java</figcaption></figure><p><b>Jvdroid </b>работает на OpenJDK 11 – редактор поддерживает стандарты Java и jar-библиотек. Интегрирован с Maven для управления проектами и зависимостями. Компилятор оптимизирован с помощью Nailgun.</p><p>Приложение включает JShell для интерактивной работы с Java. Есть компиляция программ на Kotlin, Scala и Clojure через Maven. Ещё редактор показывает Javadoc для методов и классов.</p><h2>Replit</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/043f2475-978b-4e3e-bcac-bc5140d757d3.png" alt="" /></figure><ul><li>Веб-приложение: ✅</li><li>Приложение на Android: ✅</li><li>Приложение на iOS: ✅</li></ul><p><b>Replit </b>– облачная IDE с ИИ-агентом. Вы получаете помощника, который создаёт проекты по промпту: описываете идею приложения, агент предлагает функции, генерирует код и деплоит в облако.</p><p>Ассистент автоматически разбивает большие файлы на части, оптимизирует работу с API, добавляет нужные библиотеки. Есть поддержка основных языков:</p><ul><li>Python,</li><li>JavaScript,</li><li>TypeScript,</li><li>C++,</li><li>HTML/CSS,</li><li>Java,</li><li>Ruby и десятки других.</li></ul><p>До 100 человек могут одновременно редактировать код. Готовые проекты деплоятся одним кликом. Доступна выделенная VM, автоскейлинг, деплой по запросу.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/e3884f7c-bd41-4369-a705-beb9b44ced6c.jpg" alt="" /></figure><p>Встроенные инструменты:</p><ul><li>Автодополнение кода через Ghostwriter.</li><li>Поиск и исправление ошибок в реальном времени.</li><li>Модульное тестирование без настройки.</li><li>Интеграция с GitHub (автосинхронизация).</li><li>Аутентификация пользователей через Repl Auth.</li></ul><p>ИИ-агент поддерживает ограниченный набор технологий – Flask и Node.js. С React и другими фронтенд-фреймворками могут быть проблемы. Интеграции доступны только с OpenAI, Google, PostgreSQL и S3.</p><p>Официальные приложения для iOS и Android позволяют кодить прямо с телефона. Интерфейс адаптирован под сенсорные экраны, поддерживается голосовой ввод для общения с ассистентом.</p><p>Replit подходит для быстрого прототипирования, обучения и создания простых веб-приложений. ИИ-агент понравится тем, кто хочет воплотить идею в код без знаний разработки. Для сложных проектов не подойдет, но для MVP и экспериментов – хороший выбор.</p><h2>Termux (iSH Shell)</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-07-25/6df9c91d-c8dd-45de-b277-25abc5d28f97.jpg" alt="" /></figure><ul><li>Веб-приложение: ❌</li><li>Приложение на Android: ✅</li><li>Приложение на iOS: ✅</li></ul><p><b>Termux </b>– это полноценный Linux-терминал для Android. В отличие от редакторов кода, вы получаете ОС со всеми инструментами программиста. Можно работать с любыми языками программирования, компилировать код, устанавливать библиотеки, подключать базы данных, настраивать веб-серверы.</p><p>После установки в приложении вы увидите только чёрный экран – это Linux-терминал. Графического интерфейса нет, всё управляется командами.</p><p>Перед работой обновите систему:</p><p>Первая команда проверяет доступные обновления, вторая их устанавливает. На все вопросы отвечайте «Y».</p><p>Termux используют системные администраторы, разработчики, студенты IT-специальностей и все, кому нужна мобильная среда разработки. Единственный нюанс – нужно время на изучение bash, но это справедливая цена за мощный и гибкий инструмент.</p><h2>Подведём итоги</h2><p>Выбор мобильного редактора зависит от ваших задач:</p><ul><li>Для фронтенда подойдут CodePen (веб-разработка и прототипирование), Code Editor и Acode (универсальные редакторы с поддержкой HTML/CSS/JS).</li><li>Для бэкенда есть отдельные IDE: Pydroid для Python, Cxxdroid для C/C++, Jvdroid для Java. Они работают автономно и включают все необходимые инструменты.</li><li>Для экспериментов с ИИ попробуйте Replit – облачную IDE с умным ассистентом, который создаёт приложения по описанию.</li><li>Для профессиональной разработки установите Termux (Android) или iSH Shell (iOS) – это полноценные Linux-терминалы с неограниченными возможностями.</li></ul><p><i>Знаете классное приложение, которое не попало в подборку? Расскажите в комментариях о его плюсах и минусах! Ваши советы помогут коллегам в поисках идеального инструмента для работы с кодом на смартфоне.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Осторожно: @Size не проверяет на null! Как я пропустил баг</title>
      <link>https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-</link>
      <comments>https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тюрин ]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-</guid>
      <description><![CDATA[<p>Почему @Size(min = 1) в Spring не проверяет null и пропускает пустые поля? Разбираем реальный кейс с формой отзыва, объясняем поведение @Size, @NotBlank, @NotNull и показываем, как правильно валидировать обязательные поля в Spring Boot.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-">Осторожно: @Size не проверяет на null! Как я пропустил баг</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 10 Aug 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разрабатывая веб-приложения на Java Spring, мы часто сталкиваемся с необходимостью валидации входных данных. Одна из самых распространённых задач — убедиться, что обязательное текстовое поле заполнено и соответствует определённым критериям, например, длине. Кажется, что решение очевидно: используем аннотацию <i>@Size</i>. Но здесь нас поджидает одна неприятность.</p><p>Недавно я столкнулся с одной проблемой на реальном проекте. У меня есть сайт: бэкенд написан на Spring, а фронтенд — на Angular. Я добавлял новую форму для отправки отзыва пользователя и, в спешке, забыл добавить валидацию на одно из полей формы на фронтенде.</p><p>Я хотел, чтобы поле «комментарий» было обязательным и имело длину от 1 до 100 символов. На бэкенде использовал аннотацию @Size(min = 1, max = 100) к обязательным полям, например для поля `comment` в моем DTO имеет такой вид:</p><p>Тест с пустой строкой {"comment": ""} был корректно отклонён. Однако, когда я отправил запрос без поля "comment" вообще ( {} ), валидация прошла успешно, и поле «comment» пришло как null. Это была серьёзная ошибка — поле, которое по логике было обязательным, могло быть пропущено. Т.е. могли потеряться важные для меня данные.</p><h4>Почему так происходит?</h4><p>Причина кроется в спецификации JSR-303 (Bean Validation). Документация (Javadoc) для аннотации <i>@Size</i> прямо указывает: «null elements are considered valid». Это означает, что если значение поля null, валидатор <i>@Size</i> считает его валидным и не выполняет проверку длины.</p><p>Это поведение подтверждается и в исходном коде валидатора. Метод, отвечающий за проверку строки, сначала проверяет значение на null, и если оно null, сразу возвращает true, не переходя к проверке размера. Это стандартное поведение для многих аннотаций валидации, таких как<i> @Min, @Max, @Pattern</i> и т.д. Они проверяют <b>качество</b> значения, но не его <b>наличие</b>.</p><h4>Предлагаемое решение</h4><p>Чтобы поле было действительно обязательным (не null и не пустое), необходимо использовать аннотации, которые проверяют наличие значения - это <i>@NotNull, @NotEmpty, @NotBlank</i> . Для строк лучшим выбором является комбинация:</p><p>Понимание разницы между этими аннотациями критически важно:</p><ul><li><i>@NotNull</i>: Гарантирует, что значение поля не является null. Однако оно не проверяет пустые строки или строки из пробелов и будут считаться валидными.</li></ul><ul><li><i>@NotEmpty</i>: Гарантирует, что значение не null и не пустое (для строки длина &gt; 0). Это означает, что "" будет отклонено, но строка из одних пробелов "   " пройдёт валидацию, так как её длина больше 0.</li></ul><ul><li><i>@NotBlank</i>: Предназначена исключительно для String. Гарантирует, что строка не null, не пустая и после удаления пробелов с начала и конца (trim) имеет длину больше 0. Это означает, что null, "" и "   " будут отклонены. Именно это поведение обычно ожидается от "обязательного текстового поля".</li></ul><h4>Красивое возвращение ошибок</h4><p>Для того чтобы клиент (в моём случае, Angular-приложение) получал понятные сообщения об ошибках валидации, я настроил глобальный обработчик исключений с помощью <i>@ControllerAdvice</i>. Когда валидация не проходит, Spring выбрасывает MethodArgumentNotValidException. Далее, я его перехватываю и возвращаю структурированный ответ.</p><p>Angular-приложение может легко обработать этот JSON и отобразить пользователю понятное сообщение об ошибке.</p><h4>Выводы</h4><p>Аннотация <i>@Size</i> сама по себе не делает поле обязательным. Она проверяет только длину, если значение не null. Для обязательных строковых полей всегда используйте <i>@NotBlank</i>. Для других типов данных используйте <i>@NotNull</i>.</p><p>Не полагайтесь на @Size(min = 1) как на замену проверки на null или пустую строку. Эта ловушка, в которую я сам попался, может привести к консистентным данным в вашей системе и потенциальным уязвимостям, если бэкенд будет работать с неожиданными null значениями. Всегда явно указывайте, что поле является обязательным, с помощью соответствующих аннотаций.</p><p>Этот материал — не открытие века, а скорее напоминание как себе, так и  коллегам. Даже опытные разработчики иногда могут упустить из виду такие нюансы. Я столкнулся с этой проблемой на проекте, и она стоила мне времени на отладку и тестирование.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 VPS-хостингов в 2025, которые держат нагрузку: кейсы, стоимость, метрики</title>
      <link>https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki</link>
      <comments>https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki</guid>
      <description><![CDATA[<p>Сравниваем 5 VPS-провайдеров, которые стабильно работают под нагрузкой в 2025 году. Разбираем стоимость, примеры использования, производительность и uptime. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki">5 VPS-хостингов в 2025, которые держат нагрузку: кейсы, стоимость, метрики</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Быстрый старт]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[ВКонтакте]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Windows Server]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 Aug 2025 06:10:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году выбирать VPS по принципу дешево и сердито уже не работает. Любой рабочий или MVP-проект — от API для мобильного приложения до интернет-магазина  сталкивается с пиками нагрузки, которые нужно выдержать. Ошибки на старте обходятся дороже простоя в продакшне.</p><p>Собрали пять VPS-хостингов, которые показывают, как должны выглядеть выжившие серверы под нагрузкой: современное железо, каналы без счётчиков трафика, живая поддержка инженеров и опыт клиентов. Ниже — конфигурации, цены и метрики, чтобы вы подобрали сервер под свой сценарий.</p><h2>1. ИХЦ (Интернет ХостингЦентр): конфигурации под нагрузку с NVMe, CPU до 5 ГГц и трафиком без ограничений</h2><p>Один из самых гибких по конфигурациям хостеров в обзоре. Работает с 2009 года. Поддерживает разные типы виртуализации (KVM и Virtuozzo), предлагает линейки с SSD и NVMe, российские и европейские площадки, разные уровни мощности — от базовых до высоконагруженных.</p><h3>Линейки VPS и конфигурации</h3><ol><li>ssdVPS — базовая линейка для России. Позволяет собирать конфигурации от 1 до 32 ГБ оперативной памяти, от 1 до 10 виртуальных CPU и от 20 до 300 ГБ SSD-диска.</li><li>NVMe/ — линейка на базе KVM с более высокой производительностью ввода-вывода. Доступны конфигурации от 1 до 24 ГБ RAM, от 1 до 12 vCPU, SSD от 15 до 300 ГБ.</li><li>EU-NVMe/ — аналог NVMe-линейки, но размещённый в Амстердаме. Конфигурации расширены: от 1 до 64 ГБ оперативной памяти, от 1 до 18 CPU, от 15 до 1000 ГБ SSD, скорость порта — от 200 до 500 Мбит/с.</li><li>VPS 5 ГГц — отдельная линейка на KVM, ориентированная на проекты с высокой частотной нагрузкой, до 5 ГГц на ядро, порт до 1000 Мбит/с.</li></ol><p>VPS Windows — выделенная категория для задач на Windows.</p><h3>Особенности и инфраструктура</h3><p>В <a href="https://www.ihc.ru/vps.html">ИХЦ</a> можно выбрать между двумя видами виртуализации: <b>KVM</b> и <b>Virtuozzo</b>. Виртуализация KVM подходит для задач, где нужна изоляция ресурсов, стабильность под нагрузкой и совместимость с Linux и Windows. Virtuozzo — более экономный вариант с быстрой настройкой, но с возможной перераспределённой нагрузкой между соседними VPS.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/d8f9548f-7bd8-4eef-a4aa-6d50b0e424a2.png" alt="" /><figcaption>Дата-центры провайдера есть в Москве и Амстердаме.</figcaption></figure><p>Связь с поддержкой доступна через тикеты, онлайн-чат на сайте, телеграм-бота, телефон и сообщения ВКонтакте. Поддержка работает 24/7. На всех тарифах включена базовая <b>DDoS-защита</b>.</p><h3>Примеры использования VPS от IHC</h3><p>Компания предоставляет конкретные кейсы. Примеры:</p><ul><li>Проект 1: VPS NVMe/24 (24 ГБ RAM, ~200 ГБ SSD) используется под бэкенд iOS-приложения. Стек: nginx, PHP, MySQL. Нагрузка: 12 000 уникальных пользователей в сутки. Утилизация CPU — 25%.</li><li>Проект 2: VPS NVMe/12 (12 ГБ RAM, ~120 ГБ SSD) для развлекательного сайта. Стек: nginx, Docker, Node.js. Нагрузка: 7 000 уникальных пользователей в сутки, загрузка CPU — около 20%.</li></ul><p>Серверы стабильно держат среднюю и высокую нагрузку — даже с трафиком в 10–12 тысяч пользователей в сутки остаётся запас по ресурсам.</p><h3>Дополнительные опции</h3><p>ИХЦ предлагает <b>тестовый период в 3 дня</b>, <b>безлимитный трафик</b>, <b>бесплатный первый месяц ispmanager 6</b> в подарок, а также предустановку панелей управления (ispmanager, FastPanel) или VPN-шаблонов по выбору при заказе. Также доступны бэкапы, SLA и автоснапшоты.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/e5730a1c-375b-4b91-a238-6a52a51df67a.png" alt="" /></figure><h3>Цены</h3><p>Что касается ценовой политики, стоимость VPS в России (линейка «ssdVPS») начинается <b>от 380 руб/мес</b> или 3800 руб/год (12 месяцев по цене 10). Европейские VPS («EU-NVMe/») и VPS на KVM («NVMe/») стартуют <b>от 440 руб/мес</b> или 4400 руб/год, а каждый дополнительный гигабайт памяти стоит 6 рублей.</p><h2>2. FirstVDS: мощные VDS на AMD EPYC и Ryzen</h2><p><a href="https://firstvds.ru/">FirstVDS</a> — хостинг-провайдер с опытом на рынке более 20 лет. Предлагают VPS и VDS с виртуализацией KVM для проектов любого размера. Все серверы работают на современном оборудовании. Трижды победитель в номинации «Хостер года» Национальной премии «ЦОДы.РФ».</p><p>Есть VPS для разных сценариев нагрузки — от стандартных сайтов до тяжёлых веб-приложений и проектов с высокими требованиями к CPU и отказоустойчивости. Отдельные решения для Битрикс, установка ОС семейства Linux, FreeBSD и Windows Server.</p><h3>Линейки VPS: от базовой мощности до кластера Ceph</h3><p>FirstVDS предлагает три основные линейки, которые отличаются архитектурой и назначением:</p><ol><li>VDS Форсаж — гибкая конфигурация сервера на базе AMD EPYC, до 128 ядер (до 3,7 ГГц), до 512 Гб оперативной памяти и до 4 000 Гб быстрого NVMe-накопителя. Локации Москва и Амстердам. Стартовая стоимость такой конфигурации составляет от 749 руб/мес.</li><li>Для нагруженных проектов — CPU.Турбо — гибкая конфигурация сервера на базе AMD Ryzen с частотой до 5,7 ГГц, DDR5 и с быстрыми NVMe-накопителями. Идеально для Битрикс. Локация Москва. Начальная цена CPU.Турбо — от 624 руб/мес. При покупке лицензии Битрикс (1С-Битрикс: Управление сайтом или Битрикс24) есть дополнительная скидка 30% на 3 месяца аренды этого тарифа.</li><li>Отказоустойчивый VDS Атлант — гибкая конфигурация сервера на базе AMD EPYC — до 192 ядер (до 3,5 ГГц), до 768 Гб оперативной памяти и до 8 Тб быстрого NVMe-накопителя. Репликация данных между узлами кластера Ceph и дублирование сетевого оборудования. Локация Москва. Его стартовая стоимость от 1619 руб/мес, при этом бесплатные автобэкапы уже включены.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/3490237d-3e99-49c5-9d90-10e3849765ed.png" alt="" /></figure><p>Компания использует два центра обработки данных в <b>Москве</b>: <b>IXcellerate (уровень Tier III)</b> и Web DC. Для тарифа Форсаж и готовых тарифов также доступен ЦОД <b>euNetworks (уровень Tier III) в Амстердаме</b>.</p><h3>Сетевые возможности, трафик и безопасность</h3><p>В стоимость каждого сервера входит бесплатный выделенный IP-адрес. Клиенты могут выбрать между 100 Мбит/с с безлимитным трафиком или портом 1 Гбит/с с включёнными 32 Тб трафика.</p><p>Защита от DDoS-атак и система безопасности BitNinja для сервера и сайта доступны как подключаемые опции. Также предоставляются объектное хранилище S3, автобэкапы и Кибер-бэкап. Для безопасности коммуникаций используются SSL-сертификаты GlobalSign.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/7d36ac0d-4832-402b-b0b0-9d7955963916.png" alt="" /></figure><h3>Управление, ПО и поддержка</h3><p>При заказе сервера клиент получает лицензию ispmanager 6  lite: первый месяц панель предоставляется бесплатно, дальше оплачивается по тарифу самой панели. Предлагается гибкий выбор операционных систем, включая Linux, FreeBSD и Windows Server. Под разовые задачи доступны готовые рецепты установки — от Битрикс и GitLab до TeamSpeak, LAMP‑стека и других популярных наборов ПО.</p><p>Для установки и решения любых вопросов — доступна живая круглосуточная техническая поддержка 24/7 через чат на сайте, в личном кабинете и по телефону, без использования чат-ботов. Для самостоятельного решения вопросов предусмотрена обширная база знаний.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/7fc897fc-5d2d-4f28-9047-834a8b0202b1.png" alt="" /></figure><h3>Клиентские бонусы и программы</h3><p>Есть тестовый период до 3 дней. Регулярно проводятся акции и предоставляются скидки, в том числе на тарифы для нагруженных проектов.</p><p>1) При переходе от другого хостера FirstVDS бесплатно переносит до 10 сайтов. Дополнительно предоставляется скидка 40% на первый месяц аренды VPS при оплате сервера на 1, 3 или 6 месяцев, либо 3 месяца бесплатной аренды VPS при оплате на год.</p><p>2) Клиенты с возрастом аккаунта от 5 лет получают постоянную скидку на аренду VPS, начиная от 5% и увеличиваясь ежегодно до 20%.</p><p>3) Действует реферальная программа, по которой партнёр получает 10% от расходов привлечённых клиентов, а привлечённый пользователь — скидку 25% на первый месяц аренды VPS.</p><p>4) Стоимость продления домена у FirstVDS равна актуальной стоимости его регистрации.</p><h2>3. InCloud: VPS‑площадки для бизнеса, где важен SLA</h2><p><a href="https://incloud.ru/">InCloud</a> продаёт виртуальные серверы, работающие в отказоустойчивом кластере на базе enterprise хранилищ NetApp и HPE 3PAR. Позиционируется как решение для 1С, малого/среднего бизнеса и аутсорс компаний, которым нужны предсказуемые ресурсы и техподдержка профессиональных инженеров, а не чат‑ботов.</p><h3>Тарифные планы и ценообразование</h3><p>InCloud предлагает две основные линейки тарифов:</p><ol><li>Стандартный тариф: внутри процессоры Intel Xeon 2600v4 2ГГц и оперативная память DDR4 2400 МГц.Стоимость: 1 CPU – 200 рублей, 1 Гб RAM – 200 рублей.</li><li>Производительный тариф: использует процессоры AMD EPYC до 3.8 ГГц и оперативной памяти DDR5 4800 МГц. Стоимость: 1 CPU – 250 рублей, 1 Гб RAM – 250 рублей.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/c484688e-fd3f-48ca-b743-616c21699ac4.png" alt="" /></figure><p><b>Стоимость дискового пространства</b>: SATA диски: <b>3 рубля за 1 Гб</b>. SSD и NVMe диски: <b>13 рублей за 1 Гб</b>.</p><h3>Архитектура и поддержка</h3><p>Теперь про то, что упрощает жизнь и добавляет надежности нашим развернутым сервисам:</p><ul><li>Ежедневные бэкапы: данные ваших серверов будут копироваться каждый день, и храниться они могут до 30 дней.</li><li>Удобная панель управления: через нее можно делать снапшоты  и клонировать серверы. Для разработчиков это просто золото – быстро накатить тестовую среду, попробовать новую фичу, а потом откатиться или создать идентичные рабочие среды.</li><li>SLA-договор: есть возможность заключить SLA-договор, чтобы получить гарантированный уровень доступности услуг.</li><li>Новейшие мощные серверы — на базе AMD EPYC 4 поколения.</li></ul><p>Одна из фишек – это возможность напрямую проконсультироваться с сертифицированными инженерами InCloud по сложным проектам.</p><h3>А что с клиентскими кейсами</h3><ol><li><b>Кейс Vamkamin</b>: производственная компания, которая ускорила работу своей системы 1С и сократила IT-расходы на 35%. У них была проблема с медленной работой 1С при одновременном доступе бухгалтерии, склада и отдела продаж, а также с частыми простоями на локальных серверах. InCloud предложил перенести все сервисы в облако, используя серверы на базе AMD EPYC 9554, что обеспечило прирост производительности более 40% по сравнению с предыдущими решениями. Также были внедрены гибкое масштабирование ресурсов и ежедневное резервное копирование.</li><li><b>Кейс Веб-студии 100UP</b>: компания занимается разработкой и поддержкой сайтов для крупных торговых сетей и e-commerce проектов. 100UP переехала к облачному провайдеру InCloud, выбрав тарифы на базе AMD EPYC 9554 с высокой тактовой частотой и большим количеством ядер. Благодаря разнообразию тарифов команда легко распределила проекты по нужным по производительности виртуальным серверам. После переезда 100UP смогла сократить время отклика клиентских сайтов в среднем на 45%, обеспечить бесперебойную работу даже в периоды высокой сезонной нагрузки, ускорить запуск новых проектов, фокусироваться на разработке и маркетинге и улучшить качество предоставляемых услуг.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/c0b63a9f-bb39-4b44-9363-45cefd4c2f62.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/9f98fda8-0b7a-408a-9a82-00f063ee0d88.png" alt="" /></figure><h2>4. SmartApe: быстрые VPS на NVMe‑SSD</h2><p><a href="https://www.smartape.ru/ssd-vps">SmartApe</a> подойдет проектам, где дисковая подсистема и CPU работают без простоя: интернет‑магазины, порталы с большим количеством контента, внутренние корпоративные системы, высоконагруженные API. Если нужен быстрый старт — сервер создаётся за одну‑две минуты; если понадобится масштабирование, тариф можно увеличить без миграции.</p><h3>Преимущества этих VPS</h3><p>Используются современные серверные NVMe SSD диски в RAID массиве, которые в 600 раз быстрее обычных HDD. Скорость чтения достигает 8000 Мбайт/с, а записи — 2000 Мбайт/с.</p><p>Серверы работают на мощных процессорах Intel Xeon Gold или AMD EPYC (до 3.7 ГГц) и быстрой памятью DDR4. Используется полноценная виртуализация KVM с выделенными ресурсами для гарантии их предоставление. Дата-центры уровня TIER-III и TIER-IV обеспечивают Uptime 99.982%. Данные хранятся в хранилище RAID-10.</p><p>Дополнительно клиенты получают полный root-доступ (по SSH для Linux и RDP для Windows), возможность установки любых операционных систем (более 20, включая Ubuntu, CentOS, Debian, Windows Server) и ПО, а также полную изоляцию от других клиентов.</p><h3>Удобство и поддержка</h3><ul><li>Бесплатная панель управления (Hestia) или платная ISPmanager для простого управления сервером.</li><li>Бесплатное базовое администрирование и помощь в переносе сайтов.</li><li>Круглосуточная квалифицированная поддержка 24/7.</li><li>Бесплатный тестовый период 10 дней без оплаты и ввода карты.</li><li>Защита от DDoS-атак включена в стоимость.</li><li>Выделенный внешний IP-адрес (возможность купить до 10 IP).</li></ul><p>Перед покупкой дают десять дней теста без привязки карты; если сервис не подойдёт, в течение тридцати дней можно вернуть деньги за неиспользованный период.</p><h4>Пример использования: интернет‑магазин</h4><p>VPS c 2 vCPU, 4 ГБ RAM, 80 ГБ SSD и портом 100 Мбит/с; при обычном трафике сайт обслуживает 300–500 уникальных посетителей в день, одновременно на страницах бывает 10–20 человек, а в пиковую распродажу до 50; средняя нагрузка 5–10 запросов в секунду, короткими всплесками до 20; заявленный аптайм 99,982 %, реальные замеры отклика после кэширования — 200–300 мс; счёт за такой сервер выходит около 1 300 рублей в месяц.</p><h4>Пример использования: API на Node.js</h4><p>4 vCPU, 8 ГБ RAM, 160 ГБ NVMe и канал 200 Мбит/с; сервис стабильно обрабатывает 50–100 запросов в секунду, на пике достигает 200, одновременно подключены 500–1 000 клиентов, максимум 2 500; трафик близок к 200 ГБ в месяц; при том же аптайме 99,982 % средняя задержка ответа укладывается в 50–100 мс; ежемесячная стоимость в зависимости от опций колеблется в диапазоне 2 600–3 000 рублей.</p><p>SmartApe имеет смысл брать, когда дисковая скорость и гарантированные ресурсы важнее высокого GUI и почасовой тарификации, для расчёта стоимости есть калькулятор конфигураций на сайте и оперативная техподдержка.</p><h2>5. PSB Hosting: что даёт их VPS‑платформа</h2><p><a href="https://psb.hosting/vps">PSB Hosting</a> продвигает VPS-хостинг как решение для сайтов, приложений и SaaS-сервисов, которым нужна предсказуемая мощность и высокий SLA. Провайдер делает упор на новое оборудование, пропускную способность без ограничений и инфраструктуру уровня Tier III+.</p><h3>Локации и тарификация</h3><p>Серверы разворачиваются в четырёх точках: Нидерланды, США, Германия и Финляндия. Для каждой площадки доступен одинаковый конструктор конфигураций. Базовый план NL‑100, который включает 1 vCPU, 2 ГБ RAM и 30 ГБ SSD, стоит 6 долларов в месяц. Линейка поднимается ступенчато:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/62dfc578-ede9-4533-bfb8-bca1a1a26688.png" alt="" /></figure><p>Слайдеры позволяют довести параметры до 32 ядер, 64 ГБ RAM и 510 ГБ SSD; верхняя планка оплаты — 220 $ в месяц.</p><p>Трафик безлимитный на любых конфигурациях — дополнительной оплаты за гигабайты нет.</p><h3>Аппаратная платформа, ОС и предустановки</h3><p>В хост-узлах применяются процессоры последних линеек AMD и Intel. Оперативная память — DDR5, что снижает задержки при обращении к ОЗУ. Дисковая подсистема полностью на NVMe, объединена в RAID 10: чтение и запись выше, чем у классических SSD, а отказ одного накопителя не выводит хранилище из строя. К каждому VPS подключён выделенный канал с пропускной способностью до 10 Гбит/с.</p><p>Сервер можно поднять сразу с Windows Server, Ubuntu, Debian, CentOS или FreeBSD. Для быстрого старта доступны готовые образы: Bitrix, Django-стек, Docker, FastPanel, Hestia CP, Keitaro, LAMP, Node, OpenVPN, Outline, Portainer, Vesta CP и другие.</p><h3>Управление и поддержка</h3><p>Провайдер обещает круглосуточную техническую поддержку, резервные копии (бэкапы) и автоснапшоты. Для автоматизации предусмотрен API; в панели управления можно масштабировать ресурсы, перезагружать сервер и следить за статистикой.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/fabfe43d-7891-4129-8ad5-e87f45b087ef.png" alt="" /></figure><h2>Как выбрать VPS под свой проект</h2><p>Для сайта с пиковыми нагрузками подойдёт SmartApe, где дисковая подсистема на NVMe-SSD в RAID-10 обеспечивает скорость чтения до 8000 Мбайт/с и записи до 2000 Мбайт/с, а сайт на конфигурации с 2 vCPU, 4 ГБ RAM и 80 ГБ SSD выдерживает 300–500 уникальных посетителей в день с пиком до 50 одновременных пользователей и нагрузкой 5–10 запросов в секунду (короткими всплесками до 20).</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/bc98805d-7f7f-471d-a2a2-1df68139c637.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/204e63be-985f-449d-a37c-37ca9993d335.png" alt="" /></figure><p>Если проект включает высоконагруженный API, например, на Node.js, то оптимален SmartApe с конфигурацией 4 vCPU, 8 ГБ RAM и 160 ГБ NVMe, которая стабильно обрабатывает 50–100 запросов в секунду (пики до 200) при 500–1000 одновременных подключениях (максимум 2500) и трафике до 200 ГБ в месяц.</p><p>Для задач с 1С, где важна стабильность и сокращение IT-расходов, выбирайте InCloud на базе AMD EPYC 9554: в кейсе Vamkamin это ускорило работу системы на 40%, сократило расходы на 35% и минимизировало простои, с ежедневными бэкапами до 30 дней и SLA-договором.</p><p>Если нужен VPS для Битрикс с высокой частотой CPU, подойдёт FirstVDS на AMD Ryzen (CPU.Турбо) с частотой до 5,7 ГГц и DDR5: скидка 30% на 3 месяца при покупке лицензии Битрикс, плюс отказоустойчивость на кластере Ceph с репликацией данных.</p><p>Для веб-студий с разработкой и поддержкой сайтов для e-commerce, где требуется распределение проектов по производительности и бесперебойная работа в сезонные пики, подойдёт InCloud на AMD EPYC 9554: в кейсе 100UP это сократило время отклика на 45% и обеспечило стабильность под высокой нагрузкой.</p><p>Если проект ориентирован на международный трафик с предсказуемыми ресурсами и высоким SLA, выбирайте PSB Hosting с локациями в Нидерландах, США, Германии или Финляндии, безлимитным трафиком и каналом до 10 Гбит/с на DDR5 и NVMe в RAID 10.</p><p>Для бэкенда мобильного приложения с нагрузкой до 12 000 уникальных пользователей в сутки (утилизация CPU 25%) подойдёт ИХЦ на NVMe/24 с 24 ГБ RAM и ~200 ГБ SSD, стеком nginx, PHP, MySQL.</p><p>Если развлекательный сайт с более чем 5000 уникальных пользователей в сутки (загрузка CPU ~20%), то подходит ИХЦ на NVMe/12 с 12 ГБ RAM и ~120 ГБ SSD, стеком nginx, Docker, Node.js. Он обеспечит стабильность с безлимитным трафиком и DDoS-защитой.</p><p>Выбор сводится к трём вопросам: где ваши<br />пользователи, какую пиковую нагрузку вы ждёте и нужен ли формальный SLA.<br />Сформулируйте эти требования заранее — и любой из пяти хостингов закроет задачу<br />без проблем в продакшне. Добавить свои рекомендации VPS хостингов — вы всегда<br />можете в комментариях, желательно описывать короткие кейсы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Карьера через пет-проект: как выбрать идею и довести до результата</title>
      <link>https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata</link>
      <comments>https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata</guid>
      <description><![CDATA[<p>Разбираемся, как создать пет-проект и не выгореть: идея, MVP, обратная связь и упаковка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata">Карьера через пет-проект: как выбрать идею и довести до результата</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как найти идею для пет-проекта</h2><p>Новички, когда сталкиваются с пет-проектами, бросаются в две крайности. Создают очередной To-Do list, который ничем не выделяется, либо пытаются сделать что-то слишком сложное, например, убийцу Notion, и забрасывают работу на полпути. Так как же выбрать идею, которую получится довести до конца?</p><h3>Ключевые нюансы при выборе идеи пет-проекта</h3><p>Сначала надо подумать, какая у вас или вашего окружения есть проблема, которую вы могли бы решить своим проектом? Учите английский и любите сериалы? Так почему бы не сделать телеграм-бота, который будет присылать отрывки с определённой лексикой? Считаете своё резюме и портфолио слишком скучными? Можно оформить их в виде современного лендинга, правда придётся прикрутить интересные фичи, иначе это не пет-проект. Например, если вы фронтенд-разработчик, то можно сделать необычную анимацию, добавить несколько цветовых тем, демонстрацию проектов прямо на странице, интерактивную карту навыков и опыта.</p><p>Ваш «питомец» должен решать какую-то проблему и выделяться фишкой, иначе он никого не впечатлит.</p><blockquote>Впечатляют проекты, которые выглядят как реальные продукты. Например, когда кандидат делает пет-проект под конкретную потребность: финтех-дашборд, Telegram-бот или полноценное веб-приложение, которым уже пользуются или которое может быть полезно.</blockquote><blockquote>Как-то я пришёл на хакатон — занимался рекомендательными системами. Тогда был пик популярности Word2Vec — это модель, которая переводит слова в векторы и позволяет находить между ними смысловую близость. Я посмотрел на статистику и увидел: на одном из сайтов 25% запросов не давали результатов. Тут возникла идея, как это улучшить.<br /><br />Решил собрать демку и сделал прототип: например, на запрос «кресло из крокодиловой кожи» модель показывала зелёные кожаные кресла. Не крокодиловые, но всё равно релевантные запросу.<br /><br />За неделю допилил прототип до презентабельного состояния, показал коллегам и руководителю. Они дали «зелёный свет», через 2 месяца была первая MVP, которую уже начали продавать существующим клиентам. Ещё через месяц — первый клиент, интеграция, запуск.<br /><br />Спустя ~5 лет количество клиентов уже измерялось сотнями :)</blockquote><p><b>Подумайте, какие навыки хотите показать</b></p><p>Если делаете проект для портфолио, то можно выбрать несколько вакансий, на которые вы претендуете. Какие там требования к стеку, какие нужны навыки?</p><p>Например, если хотите работать фронтенд-разработчиком в онлайн-школе, то почему бы не сделать простое образовательное приложение на React и заточить его под себя? Смотрите, кого ищет рынок, и подстраивайтесь под его запросы.</p><p><b>Не затягивайте со сроками</b></p><p>Если рекрутер увидит, что вы полгода делали дизайн кнопки для сайта, то, скорее всего, подумает, что не умеете планировать работу и доводить проекты до конца.</p><p>Выбирайте несложный и интересный проект, который вы не затяните и который будет вам по силам.</p><blockquote>Основная ошибка — это незаконченные, «сырые» решения. HR смотрят на проекты, в том числе, как на способность завершать начатое. Если в портфолио много таких работ, это наводит на мысли, что разработчик быстро теряет интерес, плохо планирует время или бросает задачи при первых трудностях.</blockquote><p><b>Не используйте учебные работы, либо используйте их правильно</b></p><p>Многие онлайн-школы обещают готовое портфолио по окончании обучения, но оно обычно состоит из учебных проектов. В целом, это неплохо, но есть пара нюансов:</p><ol><li>У вас и ваших одногруппников эти работы одинаковые. Представьте лицо HR, когда он увидит несколько похожих проектов в разных резюме.</li><li>Учебные проекты не совсем ваши, ведь вы повторяли код и основные конструкции за преподавателями. Работодателю важно, как вы пишете сами, а не копируете.</li></ol><p>Следует разделять учебные проекты и пет-проекты. В первом случае вы осваиваете новые навыки и технологии, во втором стараетесь их показать. Выбрасывать работы с учёбы тоже не нужно, просто надо подумать, как их можно улучшить, какую фишку добавить, как переработать, чтобы отличиться от десятка таких же работ. Как пример, можно изменить фронтенд, добавить новую логику в бэкенд, разработать уникальную фичу.</p><h2>Всё равно не могу ничего придумать, что делать?</h2><p>Если самостоятельно не получается что-то придумать, то можно спросить у ИИ.</p><p>ChatGPT и другие языковые модели отлично умеют генерировать идеи на заданную тему. Часто в ответах появляются нестандартные, свежие задачи, которые вам бы и не пришли в голову. Даже если сгенерированные проекты кажутся банальными — всегда можно докрутить, добавить свою логику или фишку. Но используйте ИИ как вдохновителя, не просите его написать код проекта за вас — это будет заметно и станет не преимуществом, а «красным флагом».</p><p>Пример промпта для идеи пет-проекта:</p><p><b>Возьмите задачу с фриланса</b></p><p>Зайдите на любую фриланс-биржу и полистайте разделы с небольшими заказами. Часто там попадаются простые, но жизненные — например, сделать мини-сервис для бронирования столиков или инструмент для учёта личных трат. Никто не обязывает брать заказ — достаточно посмотреть, что нужно заказчикам, и сделать что-то подобное для портфолио.</p><p><b>Спросите друзей или аудиторию в соцсетях</b></p><p>Иногда самая классная идея приходит от окружения. Просто расскажите друзьям, что хотите сделать проект, и спросите, с какими неудобствами в жизни, работе или учёбе они сталкиваются. Кто-то устал вручную напоминать детям делать домашку — тут можно создать бота. Кто-то жалуется на путаницу в личных финансах — почему бы не собрать на эту тему простое приложение? Иногда полезные задачи всплывают и в тематических чатах или сообществах.</p><blockquote>У меня был разработчик, уставший от хаоса в списках фильмов, которые он хочет посмотреть. Сделал пет-проект — личный медиапланировщик с нейтральным UI. Проект не стал стартапом, но в портфолио смотрелся отлично. Если сложно — можно взять существующую идею и улучшить. Например, сделать привычный To do-лист с уклоном в UX, нейросети или интеграции. Главное — показать свою силу, а не сделать ещё один клон.</blockquote><h2>Как довести пет-проект до конца и не забросить его</h2><p>Вы выбрали идею для проекта, прикинули стек, сроки, пошли писать код и… забросили. Часто бывает, что вначале полны энтузиазма, а под конец либо ничего не получается, либо появляются мысли, что проект — пустая трата времени. Чтобы такого не было, лучше соблюдать следующие правила:</p><p><b>Чтобы сделать пет-проект, не делайте его.</b> По крайней мере, сразу. Мотивация — вещь непредсказуемая: сегодня идея кажется классной, а завтра — сущей ерундой. Не спешите сразу бросаться на проект, лучше дайте идее «настояться» неделю или две. Если прошло прилично времени, а руки всё ещё чешутся, то это хороший знак — за проект можно браться.</p><p><b>Определите для себя MVP</b> — минимальный рабочий продукт, который точно сможете довести до релиза. Всё, что не критично для запуска, сразу откладывайте, иначе перфекционизм и погоня за новыми фичами утащат вас на дно.</p><p>Например, если вы хотите сделать кроссплатформенный видеоплеер для изучения языков, то можно откинуть идею со встроенным ИИ, голосовым ассистентом и автоматической генерацией субтитров. Конечно, это всё здорово, но затягивает процесс. Простого перевода субтитров и автоматического создания карточек на первом этапе будет уже достаточно.</p><p><b>Разбейте проект на задачи и подзадачи.</b> Например, дизайн плеера, его вкладок, основная логика, подключение API, отладка.</p><p>Не забывайте отмечать выполненные задачи, когда мотивация вас покинет, у вас перед глазами будет уже какой-то прогресс, из-за которого жалко бросать работу на полпути.</p><p><b>Определитесь со сроками.</b> Пусть они будут примерными — главное, чтобы был ориентир. Например, дать себе месяц на MVP, неделю на запуск базовой версии, пару дней на исправление багов. Без сроков любая задача может растянуться, а когда есть конечная точка, появляется стимул не бросать начатое.</p><blockquote>Один из основных критериев — полезность продукта. Нет смысла изобретать велосипед. То, что вы создаёте, должно быть либо лучшего того, что уже есть, либо вообще уникальным. И тут не важно, в какой сфере вы решите это всё произвести, главное, чтобы было чёткое понимание, зачем это делается и какой будет итог. Проще говоря, без плана не нужно начинать, иначе велик риск всё забросить. Большая часть тех, кто начал и не закончил, как раз не прорабатывали свои идеи.</blockquote><p><b>Используйте знакомый стек.</b> Если этот проект нужен для портфолио, то лучше выбрать стек, в котором вы уже уверенно работаете. Иначе утонете в новом, не доведёте до конца, либо получите в итоге что-то непрезентабельное.</p><p>Конечно, это правило не абсолютное, использовать новые для вас технологии можно, просто это надо делать дозировано.</p><p>Если очень грубо, то ориентир выглядит так: 80% кода — это знакомый нам стек, 20% — место для экспериментов и обучения. Такой подход позволяет прокачать новые навыки и довести проект до финала без выгорания.</p><p><b>Занимайтесь регулярно по чуть-чуть.</b> Берегите себя, отдыхайте, не надо сидеть по 5 часов в день над проектом, если за него не платят. Вначале можно выезжать на мотивации, но со временем это приведёт к выгоранию.</p><p>Лучше постараться выработать привычку и заниматься петом, например, каждый день по 30 минут. Не можете соблюдать эту привычку по каким-то причинам? Не проблема, вместо 30 минут найдите 5. Да, за это время вы ничего не успеете, но сохраните «регулярность» —  на следующий день будет проще.</p><p><b>Делитесь результатами.</b> Не держите всё в столе, делитесь ходом работы и результатом. Покажите ваш MVP друзьям, обсудите его на форуме, заведите репозиторий на GitHub. Без обратной связи можно легко что-то упустить.</p><p>Аналогично с трудностями. Если сталкиваетесь с багами или просто чего-то не понимаете, то спрашивайте. В том же телеграм есть тематические чаты по пет-проектам, где можно запросить обратную связь.</p><p>А вот ещё несколько советов от Анастасии Егоровой — фронтенд-разработчика, автора  программы курса SkillBox по Vue 3 и ведущей ютуб-канала <a href="https://www.youtube.com/@CosyFrontendNastia">CosyFrontend</a>.</p><blockquote>Проблема пет-проектов в том, что их редко доводят до конца. Нет дедлайнов, нет ответственности перед руководством и коллегами, нет мотивации в виде будущей оплаты. Особенно сложно становится, когда пет-проект тянется уже не первую неделю, а первоначальная архитектура оказывается совсем неподходящей для дальнейшей разработки, что нередко бывает, когда мы пробуем новые технологии.<br /><br />У некоторых разработчиков количество таких заброшенных и недоделанных проектов — десятки штук. Что можно придумать для того, чтобы большинство ваших домашних проектов доводились бы до конца?<br /><br />1. Фиксировать прогресс, например, на доске Trello, чтобы самому видеть продвижение по проекту. Не забывать коммитить в гит. Некоторым разработчикам помогает отписываться о состоянии проекта в личный блог.<br /><br />2. Избегать перфекционизма — сначала сделать рабочую версию, а потом постепенно ее улучшать.<br /><br />3. Возвращаться без чувства вины — забросить проект может любой разработчик, у каждого из нас бывают авралы на работе, активности в жизни, выгорания, моменты прокрастинации.<br /><br />P.S. Когда мы обсуждали тему пет-проектов и их забрасывания в одном из айтишных чатов, один из разработчиков отметил: «А никак не нужно доводить их до конца — пет-проекты для того и существуют, чтобы попробовать на них новую идею и забросить». Так что такое мнение тоже есть, но справедливо ли оно для вас — решайте сами 😀</blockquote><h2>Как оформить пет-проект</h2><p>Для работодателя важен не столько масштаб проекта, сколько подход к работе, качество кода и умение доводить дело до конца, поэтому проект должен выглядеть презентабельно.</p><p><b>Поработайте над UI/UX.</b> Приятный и удобный интерфейс — ваш первый плюс в глазах работодателя. Потратьте время на то, чтобы кнопки, цвета и структура приложения были понятны с первого взгляда.</p><p>Чтобы убедиться, что пользователям удобно использовать сервис — запросите обратную связь у знакомых, коллег и родственников. Учтите их замечания.</p><p><b>Упакуйте проект в GitHub.</b> Если у вас пустой репозиторий, который называется my project, то проект никто не оценит. У HR большой поток откликов, иногда они принимают решение за пару секунд, поэтому очень важно, чтобы по вашему репозиторию как можно быстрее можно было понять, что вы сделали, как это работает и какие технологии вы использовали.</p><p>Сделайте подробное описание readme —  в паре абзацев расскажите, что это за проект, для кого, какие проблемы решает. Добавьте описание стека архитектуры. Чем подробнее, тем лучше.</p><p>Добавьте скриншоты, гифки, видео работы сервиса. А ещё лучше его демоверсию.</p><p>Постарайтесь проработать структуру проекта, чтобы она была логичной. В нём не должно быть дублей и мусора. Если кто-то впервые откроет ваш репозиторий, ему должно быть понятно, что это за проект.</p><p>То же самое с историей коммитов. Сделайте её читаемой с внятными комментариями, чтобы рекрутер видел не только ваш проект, но и процесс создания.</p><p>Опишите результаты  по конкретным метрикам, если, конечно, это возможно. Опубликовали приложение в Google play и получили хорошее удержание пользователей? Расскажите об этом. Вашу фичу оценили в социальных сетях? Поделитесь приятным фидбеком. Метрик нет, делали проект только под себя? Расскажите, как он помог вам решить проблему.</p><blockquote>Лучше всего оформить проект на GitHub с описанием задач, технологий и особенностей реализации. Выделяются разработчики, которые показывают, что не просто пишут код, но и обосновывают решение и объясняют, как всё устроено.<br /><br />Желательно, чтобы код был чистым, с продуманной архитектурой и, по возможности, прошёл ревью опытных коллег. Будет плюсом, если в проекте видно, что разработчик следит за качеством: пишет документацию и покрывает код тестами.</blockquote><p><b>Распишите проект как кейс.</b> Подготовьте шпаргалку. Это мини-история, где вы рассказываете о проекте. Какая проблема побудила вас его сделать, какие возникли трудности на этапе разработки, как их решали, какой получили результат. У вас получится подробное описание пути разработки от идеи до финала.</p><p>Это можно расписать в виде заметки, сделать пост в социальных сетях, опубликовать статью. Вы получите подробную шпаргалку, которую можно использовать для презентации проекта в портфолио или на собеседованиях.</p><p>Главное, не делайте проект ради проекта, старайтесь принести какую-то пользу и здраво оценивайте свои возможности.</p>]]></content:encoded>
    </item>
    <item>
      <title>Будущее Python: какие тренды развития и боли языка обсуждали на PyCon 2025</title>
      <link>https://tproger.ru/articles/budushhee-python--kakie-trendy-razvitiya-i-boli-yazyka-obsuzhdali-na-pycon-2025</link>
      <comments>https://tproger.ru/articles/budushhee-python--kakie-trendy-razvitiya-i-boli-yazyka-obsuzhdali-na-pycon-2025?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/budushhee-python--kakie-trendy-razvitiya-i-boli-yazyka-obsuzhdali-na-pycon-2025</guid>
      <description><![CDATA[<p>Что обсуждали на PyCon 2025? Отказ от GIL в CPython 3.14, управление зависимостями, статический анализ, научный код, ML4Code и безопасность open source — всё о будущем Python.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/budushhee-python--kakie-trendy-razvitiya-i-boli-yazyka-obsuzhdali-na-pycon-2025">Будущее Python: какие тренды развития и боли языка обсуждали на PyCon 2025</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 28 Jul 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>CPython и его «кишки», асинхронность и фрагментация, управление зависимостями, безопасность и боли научного кода. Что обсуждали на профильной конференции для Python-разработчиков.</p><p>Data QA <a href="http://youtube.com/channel/UC5KFcYE8KTD4yojjoothK-A">Елизавета Якушев</a>а побывала на конференции специально для Tproger и поделилась самым важным.</p><p>Вот и отгремела PyCon в Москве. Мероприятие продлилось два дня — с докладами, мастер‑классами, lightning talks, спринтами для ~700 участников и 20+ докладчиками. Рассказываем, какие тренды и боли обозначили эксперты индустрии.</p><p>Основная тема этого сезона — Python Core. Речь про внутренности языка, новые фичи, интерпретаторы, оптимизацию и профилирование. Конечно, никуда без тестирования, ML и Data Science. Отдельными важными темами стали асинхронность, интеграции с Rust/Go/C++, безопасность, микропитон (MicroPython), PyPy и прочая high‑load магия.</p><p>А теперь подробности!</p><h2>Будущее CPython 3.14</h2><p>Пётр Андреев из МФТИ рассказал про noGIL: погружение в будущее CPython 3.14. Основные проблемы с GIL и их решения.</p><p>GIL (Global Interpreter Lock) — главный тормоз многопоточности в Python. Он нужен для потокобезопасности, но мешает масштабировать CPU-bound задачи. Доклад объясняет, почему просто «убрать GIL» нельзя — слишком много внутренностей CPython завязано на него.</p><p>Бутылочное горлышко в GIL (limited RAM), по мнению эксперта, заключается в том, что он:</p><ul><li>Замедляет предобработку данных для GPU.</li><li>Ограничивает использование многоядерных процессоров для CPU-bound задач</li><li>Усложняет отладку и логирование при использовании процессов вместо потоков</li></ul><p>Но нельзя просто взять и убрать GIL, возникнет:</p><ul><li>Несовместимость с существующими расширениями.</li><li>Проблемы с потокобезопасностью внутренних структур памяти CPython (race condition).</li></ul><p>Возможный путь — Free-threading (без GIL), он даёт следующие преимущества:</p><ul><li>Атомарные операции гарантируют завершение.</li><li>Критические секции (Py_BEGIN_CRITICAL_SECTION и Py_END_CRITICAL_SECTION) обеспечивают потокобезопасность без явной блокировки, но могут снижать производительность, так как другие потоки будут вынуждены ожидать.</li></ul><p>Оптимизировать управление памятью можно с помощью Biased Reference Counting (BRC) и Deferred Reference Counting (DRC) для ускорения подсчета ссылок без GIL.</p><ul><li>BRC позволяет потоку-владельцу изменять счетчик ссылок неатомарно, а другие потоки делают это атомарно.</li><li>DRC — отложенные обновления счетчиков ссылок. Это позволяет улучшить производительность за счет уменьшения дорогостоящих атомарных операций.</li></ul><p>Виктор Тыщенко из Точки рассмотрел эволюцию CPython. Рассказал, почему python вырвался в ТОП-3 самых известных языков программирования, рассмотрел важные вехи его развития и ответил на вопрос, что нас ждёт в ближайших релизах.</p><p>А ждёт нас:</p><ul><li>Улучшение JIT-компилятора.</li><li>Top-of-stack caching.</li><li>Tail-calling interpreter.</li><li>Эффективное управление памятью.</li><li>Расширяемая система специализаций.</li><li>Поддержка субинтерпретаторов и многопоточности.</li></ul><h2>Асинхронность и фрагментация sync/async</h2><p>Евгений Блинов из Авито рассказал, как победить актуальную проблему — фрагментацию на sync и async, чтобы питон больше не ел сам себя. Ведь ещё недавно в Python-комьюнити активно обсуждали асинхронность, писали под неё фреймворки и переписывали библиотеки. Но это приводило к дублированию экосистемы и разрастанию числа библиотек.</p><p>Выход есть. Эксперт предлагает сократить дублирование кода с помощью шаблонизации. Для этого теперь есть инструмент transfunctions, который переписывает шаблонную функцию на уровне AST. Вершина эволюции — суперфункции, которые умеют быть всем.</p><h2>Управление зависимостями и разрешение конфликтов</h2><p>Евгений Желонкин из Контура поднял сложную тему эволюции алгоритмов разрешения конфликтов зависимостей в Python. Затронул графы зависимостей и объяснил, почему задача разрешения конфликтов относится к NP-полным и что нам с этим делать.</p><p>Разобрал как простые жадные стратегии, так и полноценные SAT-решатели и эвристики, используемые в pip, poetry и новом сверхбыстром инструменте uv.</p><p>Особенно полезна эта тема тем, кто работает со средними и большими Python-проектами, CI/CD, и в целом всем, кто когда-либо ставил зависимости и сталкивался с Dependency Hell.</p><h2>Повышение качества научного кода</h2><p>Python — классический инструмент для научных вычислений, он используется в биологии, физике, медицине, химии и множестве других сфер. У языка есть множество библиотек для самых разных отраслей. Но учёные часто не знакомы с лучшими практиками и стандартами программирования. В результате код становится трудночитаемым, неинтерпретируемым, его сложно рефакторить и запускать.</p><p>Андрей Гетманов из ИТМО рассказал, как обстоят дела в исследованиях в ML и о том, почему код научных статей так больно читать. Показал открытый проект Open Source Advisor (OSA), который разрабаотывают в ИТМО. OSA генерирует ридми, пишет докстринги, даёт рекомендации и даже оформляет Pull Request. Учёным остаётся внести правки и готово — получается красивый репозиторий с удобным кодом.</p><p>Андрей Гетманов также поделился, что происходит под капотом OSA: агентная логика, стратегии промптинга, работа с необычными запросами учёных.</p><h2>Data, ML, Data Governance и человеко-читаемые данные</h2><p>Артём Каледин из МТС в своём докладе рассказал, как заботиться о данных в таблицах и делать их human‑readable — то есть, понятными, воспроизводимыми и управляемыми в бизнес‑контексте.</p><p>Также показал, что сейчас предлагают в OpenSource и как компании внутри дорабатывают эти продукты для максимальной продуктивности. Научил преобразовать классический путь от построения витрины с данными и ML-моделей до их формального описания вне привычного MLOps.</p><h2>Работа с LLM, ML4Code и честные бенчмарки</h2><p>Павел Задорожный из Сбера провёл воркшоп на тему «Оценка моделей генерации кода: практика, ловушки и реальные бенчмарки на Python»  — разбор репозиториев, метрик BLEU и CodeBLEU, репотестов и Docker‑инфраструктуры.</p><p>Рассмотрел практические подходы к построению открытых бенчмарков для генерации кода, основанных на реальных сценариях разработки и полноценном тестировании.</p><p>Показал, как решали проблемы несовместимости зависимостей, нестабильных билдов и разнообразия тестовых инфраструктур, как автоматизировали сбор задач и сделали оценку прозрачной и воспроизводимой для любых исследователей.</p><h2>Безопасность и устойчивость в Python: тренд, который больше не игнорируют</h2><p>Алексей Смирнов из CodeScoring рассказал, что происходит в мире безопасности open source пакетов. Разобрался, что делает сообщество, чтобы защитить разработчиков от злоумышленников, какие новые PEP’ы появились и готовы ли разработчики им следовать.</p><p>Типовые слабости пакетов:</p><ul><li>CWE-937. Неправильная обработка входных данных пользователя.</li><li>CWE-400. Неконтролируемое потребление ресурсов.</li><li>CWE-22. Обход каталога (Path Traversal).</li><li>CWE-502. Десериализация недоверенных данных.</li><li>CWE-94. Некорректный контроль над генерацией кода (инъекции кода).</li></ul><p>Примеры вредоносных компонентов в открытых инструментах PyPI:</p><p>1.<a href="https://github.com/ossf/package-analysis"> OSSF package analysis</a></p><p>2. <a href="https://github.com/lyvd/bandit4mal">bandit4mal</a></p><p>3. <a href="https://github.com/microsoft/OSSGadget">OSSGadget</a></p><p>4. <a href="https://github.com/osssanitizer/maloss">MalOSS</a></p><p>5. <a href="https://github.com/IQTLabs/pypi-scan">pypi-scan [archived]</a></p><p>Но для решения этих проблем существуют базовые практики безопасной разработки:</p><ul><li>Применение правильных статических анализаторов;</li><li>Проверка не только своего кода;</li><li>bandit или semgrep.</li></ul><p>Нелли Камалян из Positive Technologies пояснила, почему статический анализ — ваша первая линия защиты и как его использовать. Ведь с помощью статического анализа можно обнаружить проблемы ещё на этапе разработки.</p><p>Говорили про анализ кода на примере Semgrep и других инструментов для проверки Python-приложений. А ещё был разбор самых популярных ошибок, способов их исправить и пути интеграции полезных инструментов в рабочие процессы.</p><p>Максим Сахно из Контура разъяснил классический архитектурный принцип инверсии зависимостей (DIP) для Python. Несмотря на популярность в других языках, в Python его долгое время не использовали. И вот, пожалуйста, честный разбор, как именно работает DIP в змеином языке и его популярных фреймворках для безопасности и устойчивости.</p><h2>Итоги</h2><p>PyCon 2025 показал, что Python продолжает активно развиваться как снаружи, так и изнутри. В центре внимания оказался CPython 3.14 с отменой GIL, а также борьба с фрагментацией между синхронным и асинхронным кодом, рост важности инструментов управления зависимостями и бум интереса к качеству научного и ML-кода. Разработчики всё чаще сталкиваются с необходимостью работать на стыке Python и других языков — Rust, Go, C++ — и одновременно ожидают повышения безопасности, удобства и масштабируемости.</p><p>Python вступает в эру, где качество инфраструктуры, безопасность open source, тестируемость, читаемость и доступность кода важны не меньше, чем синтаксис или фреймворки. Возникают новые практики и инструменты, которые помогают справляться с растущей сложностью: от Semgrep и uv до автоматизации Readme и метаданных через OSA. Вся экосистема движется к зрелости, в которой Python становится не только языком, но и полноценной платформой для гибкой, безопасной и воспроизводимой разработки.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я ушёл от REST и начал жить проще с Inertia.js</title>
      <link>https://tproger.ru/articles/kak-ya-uwyol-ot-rest-i-nachal-zhit-proshhe-s-inertia-js</link>
      <comments>https://tproger.ru/articles/kak-ya-uwyol-ot-rest-i-nachal-zhit-proshhe-s-inertia-js?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Чивирда]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-uwyol-ot-rest-i-nachal-zhit-proshhe-s-inertia-js</guid>
      <description><![CDATA[<p>Как упростить процесс создания веб-приложений, отказавшись от REST в пользу Inertia.js. В статье объясняется, как Inertia позволяет соединить Laravel и Vue без API, убрать дублирование кода, ускорить разработку и сохранить все плюсы SPA без лишней сложности. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-uwyol-ot-rest-i-nachal-zhit-proshhe-s-inertia-js">Как я ушёл от REST и начал жить проще с Inertia.js</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Веб-дизайн]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 26 Jul 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Меня зовут Сергей Чивирда, я PHP-разработчик в digital-агентстве <a href="https://www.ibrush.ru/">IBRUSH</a>. Мы в основном занимаемся дизайном и веб-разработкой. И сегодня я расскажу, как упростил себе жизнь, отказавшись от REST.</p><h2>Как всё устроено обычно и что в этом не так</h2><p>Если вы хоть раз писали современное веб-приложение, то наверняка шли по классической схеме: фронт на Vue или React, бэк на Laravel, Express или чем-то подобном. Между ними REST API. Иногда вместо REST используют GraphQL. Вроде всё по канону, но на практике возникает куча лишних проблем.</p><p>Первое, что раздражает — дублирование логики. Маршруты, валидация, обработка ошибок — всё приходится делать и на фронте, и на бэке. Получаются два мира, два набора кода, две точки отказа.</p><p>Плюс техническая возня. CORS, токены, CSRF-защита — всё это надо настраивать, поддерживать и отлаживать. А ещё ведь хочется, чтобы проект нормально индексировался поисковиками. Тогда подключаются Nuxt, Next, пререндеринг, мета-теги и куча других инструментов.</p><h2>Inertia.js — простое решение, которое сработало</h2><p>В какой-то момент я наткнулся на Inertia.js, и это был очень приятный сюрприз. Inertia — это не библиотека или фреймворк в привычном смысле. Это клей, который соединяет Laravel и Vue (или React), позволяя строить полноценные интерфейсы без отдельного API.</p><p>Фронтенд работает как обычное SPA, а бэк продолжает жить как Laravel-приложение: маршруты, контроллеры, middleware — всё привычно. Вместо return view() используем Inertia::render(), передаём данные, и они попадают напрямую во Vue-компонент как props.</p><p>То есть вы работаете в едином стеке. Валидация, авторизация и маршрутизация на сервере, без дублирования. Нет проксей, CORS и прочих сложностей. Просто Laravel отдаёт Vue-компоненты, и всё это отлично работает вместе. Интерфейс ведёт себя как SPA, но архитектура проще.</p><p>Если сравнивать с Livewire, то подход другой. В Livewire основной акцент на рендеринг HTML на сервере и обмен данными через AJAX. В случае с Inertia весь интерфейс строится на Vue или React, но без отдельной REST-инфраструктуры.</p><h2>Пример на практике</h2><p>Вот как это выглядит в реальном коде.</p><p>В контроллере Laravel просто пишем:</p><p>На фронте есть компонент Users/Index.vue, который принимает данные как props. Это всё. Не нужно писать отдельный API, сериализовывать данные, обрабатывать запросы вручную. Просто работаем с контроллером и компонентом.</p><p>Адреса страниц остаются стандартными, как в Laravel. Например, по маршруту /users Laravel отдаёт страницу, где Vue-компонент рендерит список пользователей. Переходы происходят быстро и без перезагрузки, как в SPA.</p><h2>Что я получил в реальной работе</h2><p>Когда я впервые использовал Inertia в боевом проекте, первым делом заметил, насколько сократилось количество кода. Не нужно писать отдельные контроллеры и для фронта, и для бэка, соединять их, думать о форматах данных и обрабатывать ошибки с двух сторон.</p><p>API как таковой просто исчез. А вместе с ним исчезли и проблемы с CORS, CSRF, токенами и заголовками. Всё работает как в монолите. Если возникает ошибка, ты сразу видишь, где именно она произошла. Не нужно прыгать между фронтом и бэком, выискивая источник бага.</p><p>Разработка стала быстрее. Когда фронт и бэк находятся в одном проекте, они не конфликтуют. Не нужно ждать, пока кто-то сделает API. Просто открываешь редактор и сразу реализуешь всю страницу целиком. Это особенно удобно, если ты один или в небольшой команде.</p><p>С SEO и SSR тоже стало проще. Поскольку рендер идёт на сервере, контент виден поисковикам, а настройка метатегов и пререндеринг выполняются привычными средствами Laravel.</p><p>И, пожалуй, главный плюс — всё работает единообразно. Авторизация, сессии, валидация, ошибки — всё в одной системе, без дублирования. Это упрощает отладку и снижает количество багов.</p><h2>Когда Inertia может не подойти</h2><p>Как и любой инструмент, Inertia не универсален. Он отлично показывает себя, когда фронт и бэк разрабатываются вместе, в рамках одного репозитория и одной команды. В таком случае он просто идеален.</p><p>Но если у вас фронтенд и бэкенд разделены по командам и живут в разных проектах — лучше выбрать REST или GraphQL. Inertia для такой архитектуры не подходит.</p><p>Также он не заменяет полноценный API. Если вам нужен мобильный клиент или вы планируете отдавать данные сторонним приложениям — API придётся реализовать отдельно.</p><p>И ещё один момент. Если вы собираетесь использовать Nuxt или Next.js для SSR — Inertia здесь не поможет. У него свой подход, который не интегрируется с этими фреймворками.</p><p>Так что всё зависит от задач.</p><h2>Итог</h2><p>Если вы фуллстек-разработчик и работаете в Laravel, очень советую попробовать Inertia. Он позволяет писать фронт и бэк в одном стеке, без лишней головной боли. Вы продолжаете использовать привычные инструменты Laravel — контроллеры, middleware, сессии, валидацию — но при этом создаёте интерфейс с Vue или React. Компоненты, реактивность, быстрые переходы — всё это на месте.</p><p>И главное — не нужно прыгать между двумя мирами. Порог входа очень низкий. Начать можно хоть с одной страницы.</p><p>Мой совет: попробуйте Inertia на небольшом проекте. Например, сделайте личный кабинет, блог или список задач. Скорее всего, вам понравится. Мне — точно зашло.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как найти работу в IT за границей в 2025 году: ответы на часто задаваемые вопросы и рекомендации экспертов</title>
      <link>https://tproger.ru/articles/kak-najti-rabotu-v-it-za-granicej-v-2025-godu--otvety-na-chasto-zadavaemye-voprosy-i-rekomendacii-ekspertov</link>
      <comments>https://tproger.ru/articles/kak-najti-rabotu-v-it-za-granicej-v-2025-godu--otvety-na-chasto-zadavaemye-voprosy-i-rekomendacii-ekspertov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Мария Грищенко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-najti-rabotu-v-it-za-granicej-v-2025-godu--otvety-na-chasto-zadavaemye-voprosy-i-rekomendacii-ekspertov</guid>
      <description><![CDATA[<p>Свежая статистика, исследования и советы экспертов: как российским IT-специалистам найти работу за границей в 2025 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-najti-rabotu-v-it-za-granicej-v-2025-godu--otvety-na-chasto-zadavaemye-voprosy-i-rekomendacii-ekspertov">Как найти работу в IT за границей в 2025 году: ответы на часто задаваемые вопросы и рекомендации экспертов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[На английском языке]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[GTK]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 18 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Российские IT-специалисты востребованы не только у себя на родине, но и за рубежом. В 2024 году иностранные технологические компании наняли <a href="https://www.kommersant.ru/doc/7675878">более 5 тыс. сотрудников</a> из России — это в два раза больше, чем годом ранее. Чаще всего наших айтишников приглашают работать китайские IT-гиганты Huawei, Alibaba и Tencent, также активизировались европейские работодатели SAP, Delivery Hero и американские Amazon, OpenAI. </i></p><p>Если вы хотите стать одним из них и расширить свои горизонты, сделать первые шаги вам поможет наш материал. Здесь мы собрали ответы на часто задаваемые вопросы по поиску работы в IT за рубежом: наиболее перспективные направления, вспомогательные сервисы, особенности виз, рекомендации, как адаптировать резюме для иностранного рынка и получить оффер мечты.</p><p>Бонус — комментарии экспертов с многолетним опытом работы за границей и глубоким пониманием международного рынка труда.</p><h2>Какие IT-профессии наиболее востребованы за рубежом</h2><p>По данным <a href="https://www.rbc.ru/business/29/01/2025/6799966d9a794709c7932279">сервиса по поиску работы HeadHunter</a>, в 2024 году наибольшим спросом за границей пользовались российские:</p><ul><li>менеджеры по продажам и работе с клиентами (13%),</li><li>операторы колл-центров (5%),</li><li>дизайнеры, менеджеры по маркетингу, интернет-маркетологи, художники (по 4%),</li><li>учителя, SMM- и контент-менеджеры (по 3%),</li><li>секретари, помощники руководителя, ассистенты (по 2%).</li></ul><p>Программисты и разработчики заняли почётное второе место (10%). А специалисты технической поддержки и тестировщики набрали всего по 2%.</p><p>Но в исследовании <a href="https://netology.ru/blog/news/03-07-2023-europe-it">образовательной онлайн-платформы «Нетология» и международного коммуникационного агентства Zecomms Agency</a> специалист технической поддержки — наоборот, наиболее востребованная профессия за рубежом. С ним связано 17% от общего массива IT‑вакансий, что делает специалиста техподдержки абсолютным лидером по количеству открытых вакансий.</p><figure><img src="https://media.tproger.ru/user-uploads/114863/2025-06-30/dd2413cd-3aac-48e1-a29c-30620bdccf1d.png" alt="" /><figcaption>Самые востребованные за рубежом IT-специальности, данные исследования «Нетологии» и Zecomms Agency</figcaption></figure><p>На втором месте расположился программный инженер (16%), на третьем — бизнес-аналитик (6%) и IT-консультант (6%).</p><p><b>Максим Оганов, ментор, бизнес-консультант, автор проекта Oganov.Consulting:</b></p><blockquote>Российские IT-специалисты всё ещё остаются востребованными за рубежом, но по сравнению с 2022 годом ситуация изменилась. Международные компании уже не так охотно берут в штат сотрудников из России, известны случаи сокращений из-за гражданства. Причина — политика компаний, особенно тех, которые решили покинуть российский рынок. Зато за последние три года многие отечественные стартапы релоцировались в другие страны, и они отдают предпочтение сотрудникам из России.</blockquote><p><b>Евгений Козак, senior фронтенд-разработчик компании With Intelligence, живёт в Лондоне, более 10 лет опыта работы за границей: </b></p><blockquote>В 2022 году интерес к российским IT-специалистам был выше, но в 2025 ситуация изменилась из-за экономической нестабильности, роста процентных ставок и замедления найма во многих странах. Вакансий стало меньше, особенно без разрешения на работу. Однако IT по-прежнему остаётся одной из самых высокооплачиваемых и востребованных сфер.</blockquote><h2>Языки программирования, актуальные для иностранных компаний</h2><p>Согласно <a href="https://netology.ru/blog/news/04-07-2023-top-programming-languages">исследованию «Нетологии» и Zecomms Agency</a>, Java признан самым популярным языком программирования — его активно используют компании по всему миру. На Java приходится более четверти всех открытых вакансий (26%) в сфере IT в Европе, США, Латинской Америке, Азии и на Ближнем Востоке.</p><p>Java — это универсальный язык программирования, который отличаются стабильностью, масштабируемостью и кроссплатформенностью. На нём пишут крупные корпоративные приложения в банках, промышленных, страховых и телеком-компаниях, облачные, распределённые и IoT- системы, микросервисы. Также Java считается неотъемлемой частью бэкенд-разработки.</p><p>На втором месте по популярности находится язык SQL, который используют для разработки баз данных и систем аналитики. На него пришлось 24% всех вакансий, бóльшая часть из них в Европе, Азии и на Ближнем Востоке.</p><p>Замыкает тройку лидеров Python (23%) — более половины открытых вакансий в Азии и на Ближнем Востоке связано именно с этим языком. Оно и неудивительно: на Python пишут модели для машинного обучения, анализа данных и автоматизации.</p><figure><img src="https://media.tproger.ru/user-uploads/114863/2025-06-30/6a35cec4-e5d1-4991-a1a8-ef49722d59ea.png" alt="" /><figcaption>Самые востребованные за рубежом языки программирования, данные исследования «Нетологии» и Zecomms Agency</figcaption></figure><h2>Сколько айтишникам платят за границей</h2><p>Более высокая зарплата — <a href="https://www.cnews.ru/news/top/2023-10-27_polovinu_rossijskih_it-shnikov">одна из главных причин</a>, почему российские IT-специалисты хотят работать за границей.</p><p><b>Евгений Козак, senior фронтенд-разработчик компании With Intelligence, живёт в Лондоне, более 10 лет опыта работы за границей:</b></p><blockquote>Трудоустройство за границей открывает доступ к международным командам, передовым технологиям и крупным проектам мирового уровня с лучшими практиками разработки, высокими стандартами качества кода и современными архитектурными подходами. Всё это способствует быстрому профессиональному росту. Мне переезд позволил быть ближе к центру IT-индустрии и дал возможность развиваться в высококонкурентной среде.</blockquote><p>В большинстве европейских стран зарплаты индексируются и официально растут вслед за инфляцией. За счёт этого доходы, пусть и медленно, но увеличиваются. К сожалению, не все отечественные компании могут такое гарантировать — практика индексации зарплат в России пока не так распространена.</p><p>Но ключевое — размер оклада. По данным <a href="https://ruitunion.org/posts/2024-04-24-market-and-wages-state/">«Профсоюза работников ИТ»</a>, медианная зарплата специалистов уровня senior в России составляет 276 362 рубля в месяц, в то время как за рубежом она равна 386 730 рублей в месяц. Российские миддлы получают 170 000 рублей, а работающие за границей — 205 142 рубля. Зарплата джунов несильно отличается, хотя «за бугром» она всё-таки немного больше: 85 000 рублей против 80 000 рублей в России.</p><p>Таким образом, зарплата IT-специалистов за рубежом как минимум в 1,5 раза больше, чем в России.</p><p>Дополнительное преимущество — оплата в валюте: долларах, евро или фунтах. После пересчёта на рубли итоговая сумма все равно будет выше средней зарплаты в России — и это без учёта премий и бонусов.</p><figure><img src="https://media.tproger.ru/user-uploads/114863/2025-06-30/caf0a60b-53e5-4468-9c37-44101399c92c.png" alt="" /><figcaption>Медианная зарплата IT-специалистов в России и за рубежом, статистика «Профсоюза работников ИТ»</figcaption></figure><h2>Где IT-кадры пользуются спросом</h2><p>Найти работу в IT сейчас везде нелегко, но чуть проще это сделать там, где активно развивается IT-сектор и требуется много кадров соответствующего профиля:</p><p><b>Германия. </b>Наибольший дефицит IT-специалистов наблюдается в Германии — в 2023 году было опубликовано <a href="https://netology.ru/blog/news/03-07-2023-europe-it">103 089 вакансий</a>. Особенно остро нехватка кадров ощущается в таких областях, как разработка программного обеспечения, Data Science, кибербезопасность и DevOps. А в 2025 году страна планирует выдать <a href="https://prian.ru/news/germaniya-vydast-200-000-viz-kvalificirovannym-kadram-iz-za-nehvatki-rabochey-sily.html">на 10%</a> больше рабочих виз, чем годом ранее.</p><p><b>Нидерланды.</b> В стране большое внимание уделяется IT-стартапам. Так, в 2024 году голландские технологические компании привлекли <a href="https://tech.eu/2025/06/12/the-growth-and-opportunities-of-the-netherlands-tech-ecosystem/">€3,7 млрд венчурных инвестиций</a> — это около 5% от общего объёма капитала, вложенного в европейскую экосистему. Благодаря этому Нидерланды вошли в топ‑10 стран Европы по объёму инвестиций в технологии. Особенно быстро растёт сектор DeepTech («глубоких технологий») — полупроводники, искусственный интеллект и квантовые технологии.</p><p><b>Канада.</b> Такие канадские города как Торонто, Ванкувер и Монреаль считаются настоящей IT-меккой. Здесь активно развиваются стартапы и работают подразделения крупнейших технологических компаний — Google, Microsoft, Amazon. Кроме того, для IT-специалистов есть много иммиграционных программ, например, <a href="https://www.canadacareersite.com/blog/global-talent-stream-canada-work-permit-application">Global Talent Stream</a>, которая позволяет получить разрешение на работу в течение двух недель.</p><p><b>США.</b> В 2023 году объём IТ-рынка США достиг <a href="https://www.comnews.ru/content/233424/2024-05-29/2024-w22/1008/rossiyskiy-it-rynok-ustupil-obemu-rynkam-stran-briks">$1,3 трлн</a> и продолжает развиваться <a href="https://www.mordorintelligence.com/industry-reports/united-states-it-services-market">высокими темпами</a>. В Европейском союзе он составил <a href="https://www.comnews.ru/content/233424/2024-05-29/2024-w22/1008/rossiyskiy-it-rynok-ustupil-obemu-rynkam-stran-briks">$1,05 трлн</a>, в Китае — <a href="https://www.comnews.ru/content/233424/2024-05-29/2024-w22/1008/rossiyskiy-it-rynok-ustupil-obemu-rynkam-stran-briks">$348 млрд</a>, в России — <a href="https://www.comnews.ru/content/233424/2024-05-29/2024-w22/1008/rossiyskiy-it-rynok-ustupil-obemu-rynkam-stran-briks">$36,1 млрд</a>. Таким образом, американский технологический рынок в 36 раз больше российского, в 1,24 раза больше европейского и почти в четыре раза превосходит китайский. Это подтверждает его статус мирового лидера. Соответственно, IT-специалистов нужно много.</p><h2>Куда уехать проще всего</h2><p>По данным <a href="https://www.rbc.ru/business/29/01/2025/6799966d9a794709c7932279">HeadHunter</a>, активнее всего российских специалистов приглашают на работу компании из:</p><ul><li>Белоруссии — 172,3 тыс. приглашений,</li><li>Казахстана — 150,9 тыс. приглашений,</li><li>Грузии и Турции — 69,7 тыс. и 67,8 тыс. приглашений соответственно,</li><li>Узбекистана — 57,2 тыс. приглашений.</li></ul><p>Самый большой рост интереса продемонстрировали китайские работодатели — он увеличился почти в шесть раз. В 2023 году количество предложений для жителей России о работе в Китае составляло всего 4,8 тыс., тогда как в 2024 году цифра достигла 27,6 тыс. предложений.</p><p>Кроме того, за год потребность в российских специалистах выросла в Сербии с 5,8 тыс. до 26,3 тыс. (+356,3%), в Турции — с 23,5 тыс. до 67,8 тыс. (+188,6%), на Кипре — с 4,6 тыс. до 12 тыс. (+160,9%), в Польше — с 4,1 тыс. до 9,0 тыс. (+119,6%) и в ОАЭ — с 19,2 тыс. до 41,7 тыс. (+117,2%).</p><p>А Европа стала лидером по количеству предложений для IT-специалистов со знанием русского языка — <a href="https://netology.ru/blog/news/03-07-2023-europe-it">3%</a> всех IT-вакансий в регионе. На других рынках доля таких предложений не превышает 1%. Чаще всего русскоязычных специалистов ищут <a href="https://netology.ru/blog/news/03-07-2023-europe-it">в Польше — 2 200 вакансий, Венгрии — 752 вакансии, Австрии — 178 вакансий, Греции — 152 вакансии</a>.</p><p><b>Максим Оганов, ментор, бизнес-консультант, автор проекта Oganov.Consulting: </b></p><blockquote>Не все страны охотно принимают специалистов из других стран. Если раньше одними из самых популярных направлений для релокации были Канада и США, то сейчас переехать туда стало значительно сложнее. Больше шансов на трудоустройство в компании Испании, Португалии, Кипра, ОАЭ.</blockquote><h2>Как IT-специалисту найти работу за границей: четыре шага</h2><h3>1. Зарегистрируйтесь на международных платформах</h3><p>Принцип поиска работы за рубежом такой же, как и в России. Нужно зарегистрироваться на платформах по типу HeadHunter и откликаться на понравившиеся вакансии. Чем больше откликов, тем лучше.</p><p>Вот подборка сайтов для поиска работы за границей:</p><ul><li><a href="https://ru.linkedin.com/">LinkedIn</a> — профессиональная социальная сеть, где можно искать вакансии и налаживать контакты;</li><li><a href="https://www.indeed.com/">Indeed</a> — международный агрегатор вакансий, позволяющий фильтровать их по странам, городам и отраслям;</li><li><a href="http://relocate.me">Relocate.me</a> — платформа для вакансий с релокацией;</li><li><a href="https://remoteok.com/">Remote OK</a> — площадка для поиска удалённой работы;</li><li><a href="https://weworkremotely.com/">WWR</a> — сервис, где публикуют вакансии крупные зарубежные компании, например, Amazon или Google.</li><li><a href="https://www.angellist.com/careers">AngelList Talent</a> — каталог вакансий в иностранных стартапах.</li></ul><p>Некоторые из них открываются только с VPN.</p><p><b>Максим Оганов, ментор, бизнес-консультант, автор проекта Oganov.Consulting: </b></p><blockquote>Удобнее всего искать вакансии зарубежных компаний через LinkedIn. По моему опыту, большинство специалистов находят работу за границей именно через эту площадку. Но есть и альтернативные варианты — например, телеграм-каналы с профильными вакансиями. Будьте готовы к тому, что придётся отправлять много откликов. В среднем на 100 откликов приходится не более 5 ответов.</blockquote><p><b>Евгений Козак, senior фронтенд-разработчик компании With Intelligence, живёт в Лондоне, более 10 лет опыта работы за границей: </b></p><blockquote>В основном я искал работу через LinkedIn. Это самая эффективная платформа: я обновил профиль, загрузил резюме и активно взаимодействовал с рекрутерами. Также полезно размещать резюме на популярных job-порталах и быть открытым к предложениям — тогда многие специалисты по подбору персонала сами выходят на связь.</blockquote><h3>2. Адаптируйте резюме для иностранного рынка</h3><p>Если вы собираетесь искать работу на европейском или американском рынке, разумеется, резюме должно быть составлено на английском языке. В англоязычных странах резюме называют Curriculum Vitae или CV.</p><p>Эксперты компании EP Advisory, которая помогает российским специалистам строить карьеру за рубежом, <a href="https://ep-advisory.com/ru/statii/rabotayushhee-rezyume-na-anglijskom-na-osnove-30-000-proverennyh-rezyume/">рекомендуют</a> включать в CV разделы Name, Profile, Education, Experience, Skills &amp; Other. Названия предыдущих компаний и занимаемые должности следует выделять, а каждый блок —  разграничить чертой.</p><figure><img src="https://media.tproger.ru/user-uploads/114863/2025-06-30/2f6d7e8d-fa4e-4d6c-8925-e3c2228fc0cb.png" alt="" /><figcaption>Пример грамотно составленного резюме на английском языке от экспертов EP Advisory</figcaption></figure><p>Кроме того, в некоторых странах, например, Великобритании, США и Канаде не принято добавлять фото в резюме. Такое правило стало следствием законов против дискриминации в этих странах, поэтому его несоблюдение может вызвать негативную реакцию и привести к мгновенному отказу.</p><p>Дополнительно к резюме стоит приложить мотивационное письмо (Cover Letter), подготовленное специально под конкретную вакансию. В мотивационном письме уже не пишут об образовании и навыках — эти сведения указывают только в резюме. А в Cover Letter особый упор делается на кейсах и объяснении, чем для вас интересна компания и почему вы для неё — самый подходящий кандидат.</p><p><b>Максим Оганов, ментор, бизнес-консультант, автор проекта Oganov.Consulting: </b></p><blockquote>Необходим большой и подтверждённый опыт работы. Придётся конкурировать со специалистами уровня senior со всех концов света. Особенно много кандидатов из Индии, Ирана, Пакистана.</blockquote><h3>3. Обратитесь в агентство по трудоустройству</h3><p>Самостоятельно найти работу за границей и разобраться во всех сопутствующих вопросах, связанных с написанием резюме, оформлением виз и переездом, может быть сложно. Поэтому стоит обратиться в агентства по трудоустройству, которые все эти моменты возьмут на себя.</p><p>Вот список наиболее известных рекрутинговых агентств:</p><ul><li><a href="https://www.adecco.com/">Adecco </a>— крупнейшее агентство с вакансиями по всему миру;</li><li><a href="https://manpower.ru/">Manpower</a> — международная стаффинговая, аутсорсинговая и HR-консалтинговая компания из России;</li><li><a href="https://www.michaelpage.com/">Michael Page</a> — международная компания, которая специализируется на подборе персонала среднего и высшего звена;</li><li><a href="https://www.hays.com/">Hays</a> — британская рекрутинговая компания, которая предоставляет услуги по подбору персонала в 33 странах мира;</li><li><a href="https://www.harveynash.com/">Harvey Nash</a> — международная компания, которая специализируется на IT-аутсорсинге;</li><li><a href="https://www.randstad.pl/ru/">Randstad</a> — голландская консалтинговая компания, которая сотрудничает с ведущими зарубежными работодателями.</li></ul><p>Агентства также консультируют по вопросам адаптации и помогают с поиском жилья.</p><p><b>Евгений Козак, senior фронтенд-разработчик компании With Intelligence, живёт в Лондоне, более 10 лет опыта работы за границей: </b></p><blockquote>Чтобы найти работу в Лондоне, я сотрудничал с международными и британскими рекрутинговыми агентствами — Hays, Harvey Nash и Michael Page. Примерно 50% предложений приходили именно от них. Эти агентства играют важную роль на IT-рынке и обладают широкой сетью контактов с работодателями по всей Европе. Они помогали мне в поиске подходящих позиций и сопровождали на всех этапах — от первичного отклика до собеседования и подписания оффера.</blockquote><h3>4. Получите визу и разрешение на работу</h3><p>Без визы и разрешения приступить к работе за границей не получится. Здесь доступны два варианта — Digital Nomad Visa или обычные рабочие визы.</p><p><b>Digital Nomad Visa.</b> Digital Nomad Visa или «виза цифрового кочевника» позволяет легально жить за рубежом, но при этом продолжать удалённо работать на родину. В отличие от туристической визы, Digital Nomad Visa даёт право длительно находиться в определённой стране, а в сравнении с рабочей визой — не требует трудоустройства на местном рынке.</p><p>Это не классическая рабочая виза. Она разрешает трудиться из разных частей мира, но с ней нельзя работать на компании из страны пребывания. Также не всегда можно перевести семью.</p><p>Чтобы получить визу цифрового кочевника, нужно подтвердить минимальный доход (чаще всего <a href="https://ep-advisory.com/ru/statii/digital-nomad-visa-zit-v-evrope-i-rabotat-udalenno/?ref=journal.zarplata.ru">не ниже 2000 евро в месяц</a>) и наличие медицинской страховки. Также может понадобиться трудовой договор или договор подряда, доказывающие, что вы работаете удалённо. Сейчас Digital Nomad Visa оформляют в<a href="https://www.globalcitizensolutions.com/digital-nomad-visa/"> 66 странах</a>, включая Португалию, Испанию, Эстонию, ОАЭ и Южную Корею.</p><p><b>Классические рабочие визы.</b> Это визы EU Blue Card или виза H‑1B.</p><ul><li>Голубая карта (EU Blue card) — виза для работы в Европе. Чтобы получить её, нужен диплом о высшем образовании (не ниже бакалавра) и оффер с зарплатой от 48 300 евро год (43 760 евро для IT‑специалистов) на срок минимум шесть месяцев. В случае одобрения выдаётся вид на жительство, действующий до четырёх лет с возможностью продления.</li></ul><ul><li>Виза H‑1B — виза для работы в США. Она также требует наличия высшего образования и оффера от местной компании. Но американское законодательство устанавливает лимит на выдачу H‑1B — 65 000 базовых и 20 000 дополнительных виз для специалистов с магистерской степенью из США. Всего 85 000 виз в год. Виза предоставляется максимум на три года с возможностью продления до шесть лет.</li></ul><p>Рабочие визы позволяют получить полноценный правовой статус резидента страны, в которую вы планируете переезжать, а вместе ним — все социальные гарантии: медстраховку, оплачиваемый отпуск, пенсионные отчисления.</p><h2>Официальное трудоустройство или фриланс</h2><h3>Удалённая работа на фрилансе</h3><p>Фриланс — самый простой способ начать работать с зарубежными компаниями без лишней бюрократии и сложностей с оформлением. Достаточно зарегистрироваться на зарубежную фриланс-платформах <a href="https://www.upwork.com/">Upwork</a> или <a href="https://www.fiverr.com/">Fiverr</a>, и можно сразу браться за международные проекты. Единственное, могут возникнуть трудности с оплатой, поэтому стоит завести себе иностранную банковскую карту.</p><p>Главные минусы фриланса — нет оплачиваемого отпуска и больничных, а доход крайне нестабилен.</p><h3>Официальное трудоустройство с релокацией</h3><p>Официальное трудоустройство гарантирует стабильную зарплату и полный соцпакет, а при релокации — помощь с переездом и адаптацией в новой стране.</p><p>Однако получить оффер с переводом в местный офис не так просто. Иностранные компании редко берут на себя расходы, связанные с релокацией российских специалистов и их семей. Чаще всего они нанимают тех, кто уже легально живёт за границей — например, по рабочей визе или с видом на жительство. В таком случае проще оформить перевод в местный офис или принять человека на работу через филиал в этой стране.</p><p>Максим Оганов, ментор, бизнес-консультант, автор проекта Oganov.Consulting:<b></b></p><blockquote>Найти работу будет проще, если вы уже находитесь в стране, и компании не придётся заниматься вашей релокацией. Поэтому хороший вариант — попробовать переехать самостоятельно, продолжая работать удалённо в российской компании или на фрилансе. У вас будет время присмотреться к стране, понять, подходит ли она вам. А если вы достаточно активны и коммуникабельны, можно будет попробовать найти вакансию через местные сообщества российских эмигрантов.</blockquote><p><b>Евгений Козак, senior фронтенд-разработчик компании With Intelligence, живёт в Лондоне, более 10 лет опыта работы за границей: </b></p><blockquote>В первую очередь, нужно убедиться, что у вас есть правовой статус или разрешение на работу в стране, где вы планируете трудоустроиться. Это значительно повышает ваши шансы на успех.</blockquote><h2>Какой уровень владения английским языком нужен</h2><p>Для оценки владения иностранными языками, включая английский, в Европе используют систему CEFR (Common European Framework of Reference). CEFR выделяет шесть уровней знания языка: A1, A2, B1, B2, C1, C2.</p><p>Чтобы успешно строить карьеру за границей, рекомендуется уровень не ниже B1-B2, который позволит понимать профессиональные тексты, участвовать во встречах и вести рабочую переписку.</p><p><b>Максим Оганов, ментор, бизнес-консультант, автор проекта Oganov.Consulting:</b></p><blockquote>Обязательное требование — свободное владение английским: например, в Португалии большинство сотрудников IT-компаний общаются на нём. Но иногда кандидату необходимо знание местных языков — так, если вы хотите переехать во Францию, шансы на трудоустройство без владения французским минимальны.</blockquote><p><b>Евгений Козак, senior фронтенд-разработчик компании With Intelligence, живёт в Лондоне, более 10 лет опыта работы за границей: </b></p><blockquote>Главной трудностью для меня был язык. Технический английский у меня на хорошем уровне, особенно когда речь идёт о собеседованиях, терминах и обсуждении архитектуры — в этом я чувствую себя уверенно. Однако повседневный английский, особенно неформальное общение, давался сложнее. Кроме того, структура интервью в других странах немного отличается, но к ней я быстро адаптировался. Повысить уровень языка и стать увереннее в повседневном общении мне помогли постоянная практика, разговоры с носителями языками и участие в командных митингах.</blockquote><h2>Коротко о главном</h2><ul><li>Иностранные компании активно используют Java, Python, SQL и нуждаются в программистах, умеющих писать на этих языках.</li><li>IT-специалисты особенно востребованы в Германии, Нидерландах, Канаде и США — странах с наиболее интенсивным ростом технологического сектора.</li><li>Проще всего уехать в Белоруссию, Казахстан, Турцию, Грузию и Китай.</li><li>Работать за границей можно официально или на фрилансе.</li><li>Чтобы получить оффер, следует зарегистрироваться на международных платформах для поиска работы, адаптировать резюме, оформить визу и, при необходимости, обратиться в агентство.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>10 библиотек Python, которые меняют карьеру</title>
      <link>https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru</link>
      <comments>https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru</guid>
      <description><![CDATA[<p>10 библиотек Python, которые помогут прокачаться в аналитике, ML и разработке. Как они работают и почему меняют карьеру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru">10 библиотек Python, которые меняют карьеру</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Jupyter Notebook]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Jul 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>У Python тысячи библиотек, но лишь немногие действительно меняют карьеру. Они помогают не просто решать задачи, а ускорять проекты, прокачивать навыки и выходить на следующий уровень в аналитике, машинном обучении и разработке. В этом материале мы собрали 10 библиотек, которые помогут зарабатывать на Python и развивать навыки.</p><h2>1. Pandas</h2><p>Pandas — библиотека для работы с данными в Python, позволяющая легко загружать, анализировать, очищать и преобразовывать числовую информацию в удобной табличной форме. По сути, это Excel, который смог, и позволяет делать всё автоматизировано и на порядки быстрее.</p><p>Библиотека строится вокруг двух ключевых структур: <b>Series</b> (одномерный массив с индексами); <b>DataFrame </b>(таблица с индексами и колонками).</p><h3>Какие задачи решает библиотека</h3><p>Pandas полезна для следующих задач:</p><ul><li>Сам анализ данных: можно быстро фильтровать, группировать, агрегировать и строить сводные таблицы.</li><li>Очистка данных: удаляем пустые строки, заменяем значения, приводим типы.</li><li>Загрузка данных из CSV, Excel, SQL.</li><li>Визуальная разведка данных (EDA) перед построением моделей.</li><li>Подготовка данных для ML и отчётов.</li><li>Автоматизация отчётов и ETL-пайплайнов.</li></ul><p>Благодаря Pandas аналитик превращается в инженера данных, а ML-специалист может сосредоточиться на моделях, а не на ручной подготовке датасетов.</p><h3>Как пользоваться</h3><p>Ниже разберём простейший кейс: нужно загрузить данные о зарплатах разработчиков из CSV, посчитать среднюю зарплату по языкам программирования и отобрать топ-5.</p><h3>Почему это меняет карьеру</h3><p>Работа с Pandas становится границей между знанием Python и умением решать задачи бизнеса. Для <b>джуна </b>это шанс сразу показать практическую пользу: выгрузки, отчёты и базовый анализ можно делать в десятки раз быстрее и аккуратнее, чем вручную в эксельке.</p><p>Для <b>аналитика</b> Pandas превращается в главный рабочий инструмент, позволяя не просто проверять гипотезы и делать сводные таблицы, а строить полноценные отчётные пайплайны, автоматизировать рутинные выгрузки и концентрироваться на сути данных, а не на правках ручками.</p><p>Для <b>ML-инженера</b> владеть Pandas — значит уметь готовить датасеты качественно; быстро очищать и приводить данные к нужному виду, что напрямую влияет на результат моделей. Без этого работа над проектами машинного обучения часто превращается в бесконечную возню с данными.</p><p>Наконец, даже для <b>разработчиков</b> Pandas может стать неожиданным бустом в карьере. Например, когда нужно автоматизировать отчёты для бизнеса или быстро анализировать логи и данные из БД без поднятия дашбордов — Pandas даёт гибкость и скорость, которые редко даёт что-то ещё в экосистеме Python.</p><h2>2. Django</h2><p>Django — фреймворк для веб-разработки на Python, который позволяет быстро создавать надежные и масштабируемые веб-приложения. Он следует принципам DRY (Don’t Repeat Yourself — не повторяй себя), предоставляя разработчику ORM, роутинг, систему авторизации, админку, работу с формами, шаблонами и инструментами безопасности из коробки.</p><p>Django подходит как стартапам, которым нужно быстро выйти на рынок, так и крупным проектам с миллионами пользователей. Это не просто библиотека, а полноценный каркас для построения и сопровождения веб-сервисов.</p><h3>Какие задачи решает библиотека</h3><p>Каркас, действительно, каркасный. Задачи следующие:</p><ul><li>Создание веб-приложений и API любой сложности.</li><li>Быстрая разработка MVP, прототипов и коммерческих проектов.</li><li>Упрощение работы с базами данных через ORM, без написания сырого SQL.</li><li>Построение административных панелей для управления данными без ручной разработки.</li><li>Гибкая маршрутизация и работа с формами, валидацией и шаблонами.</li><li>Реализация аутентификации, авторизации и защиты приложений.</li></ul><p>Django позволяет сосредоточиться на бизнес-логике и продукте, не тратить недели на настройку инфраструктуры.</p><h3>Как пользоваться</h3><p>Устанавливаем:</p><p>Создаем проект и приложение:</p><p>Пример модели:</p><p>Миграция базы данных:</p><p>Создание админки:</p><p>После этого можно запустить сервер:</p><p>И перейти по адресу http://127.0.0.1:8000/admin для управления записями через готовую админ-панель.</p><h2>3. PyTorch</h2><p>PyTorch — мощная библиотека Python. Она позволяет строить и обучать нейронные сети, проводить вычисления с автоматическим дифференцированием и работать с GPU для ускорения самих вычислений.</p><p>Главное отличие PyTorch от других ML-фреймворков — динамическая вычислительная графика (define-by-run): модель строится и изменяется во время выполнения кода, что даёт гибкость при создании и отладке сложных моделей.</p><p>Сегодня PyTorch используется в продакшен системах, научных исследованиях, компьютерном зрении, NLP и генеративных моделях, занимая ведущее место в индустрии.</p><h3>Какие задачи решает библиотека</h3><p>В функционал PyTorch входят:</p><ul><li>Построение нейронных сетей любой сложности (CNN, RNN, трансформеры);</li><li>Обучение и тестирование моделей на CPU и GPU;</li><li>Реализация кастомных слоёв и loss-функций;</li><li>Разработка и деплой ML/AI моделей в продакшен;</li><li>Быстрая итерация гипотез с удобной отладкой.</li></ul><p>С PyTorch можно начать с простых нейронных сетей, а затем перейти к реализации современных архитектур.</p><h3>Как пользоваться</h3><p>Установим PyTorch (на CPU, для GPU потребуется версия с CUDA):</p><p>Рассмотрим кейс обучения простой нейронной сети для классификации рукописных цифр MNIST.</p><p>После обучения можно использовать torch.save() для сохранения модели и torch.load() для загрузки в продакшн.</p><h3>Почему это меняет карьеру</h3><p>PyTorch — билет в мир современной разработки AI и машинного обучения. Владение инструментом даёт <b>разработчику</b> возможность уверенно войти в области, которые продолжают оставаться топовыми на рынке: искусственный интеллект, компьютерное зрение, NLP, генерация изображений и видео и т.д.</p><p>Для <b>начинающего ML/AI-специалиста </b>PyTorch помогает лучше понять, как устроены нейронные сети, и под капотом увидеть, как происходят вычисления. Это ускоряет рост навыков и делает разработчика востребованным в исследованиях и R&amp;D-проектах.</p><p>Для <b>дата-сайентистов</b> PyTorch позволяет превратить исследовательские ноутбуки в готовые к деплою модели, благодаря PyTorch Lightning, TorchScript и ONNX.</p><p>Для<b> разработчиков, которые хотят выйти на рынок AI</b>, PyTorch — это мастхев: проекты в стартапах и крупных компаниях всё чаще строятся вокруг него. Умение писать кастомные loss-функции, проектировать сложные пайплайны обучения, настраивать обучение на кластерах и GPU — компетенции, которые существенно бустят зарплату.</p><p>PyTorch в целом помогает расширять портфолио: с ним можно создавать генеративные модели, строить LLM, участвовать в соревнованиях и работать с самыми современными подходами в машинном обучении.</p><h2>4. Polars</h2><p>Polars — современная библиотека для обработки данных в Python, созданная как альтернатива Pandas. Она использует колоночную архитектуру и многопоточность, что позволяет работать с большими объёмами данных значительно быстрее и с меньшим потреблением памяти.</p><p>Polars вдохновлена Pandas, но её API оптимизировано для производительности и удобства, а также даёт разработчику возможность писать цепочки ленивых вычислений, которые оптимизируются перед выполнением. Это делает её отличным инструментом для аналитиков, дата-инженеров и дата-сайентистов, которым нужно обрабатывать данные быстро.</p><h3>Какие задачи решает библиотека</h3><p>Polars явно есть, чем гордиться:</p><ul><li>Загрузка, очистка и преобразование больших датасетов;</li><li>Анализ данных с использованием цепочек преобразований;</li><li>Быстрая агрегация и группировка данных;</li><li>Ленивые вычисления: построение пайплайнов преобразования данных, которые выполняются только при вызове collect().</li><li>Обработка данных, которые не помещаются в память, за счёт эффективности и колоночной архитектуры.</li></ul><p>Если Pandas начинает притормаживаться на данных в несколько гигабайт, Polars обычно продолжает работать быстро, позволяя без боли обрабатывать большие CSV.</p><h3>Как пользоваться</h3><p>Установка:</p><p>Давайте загрузим данные и проведем базовые трансформации:</p><p>А вот и пример ленивых вычислений:</p><p>В чем особенность:</p><ul><li>pl.read_csv загружает данные сразу.</li><li>pl.scan_csv создаёт план вычислений для последующей оптимизации.</li><li>Используются выражения (pl.col, .with_columns, .agg), которые композируются без создания промежуточных копий, это ускоряет процесс.</li></ul><h3>Почему это меняет карьеру</h3><p>Polars меняет карьеру, потому что даёт преимущество в скорости и эффективности при работе с данными. Там, где Pandas уже не справляется, полярный медведь приходит на помощь.</p><p>Для <b>дата-инженеров</b> Polars полезен при построении ETL и пайплайнов обработки данных, где важна скорость и предсказуемое потребление ресурсов. Его можно использовать в продакшен-скриптах, для подготовки данных к ML и для автоматизации отчётности.</p><p>Для <b>дата-сайентистов </b>Polars даёт возможность анализировать больше данных за меньшее время, быстро итерировать гипотезы и ускорять исследования. Его API достаточно близок к Pandas, поэтому переход не требует месяцев переучивания.</p><p>Освоение Polars показывает работодателям, что ты не просто знаешь стандартные инструменты, но умеешь выбирать оптимальные решения для реальных задач, повышая эффективность работы команды. В эпоху роста данных это критично для любого Python-разработчика, работающего с аналитикой и машинным обучением.</p><h2>5. FastAPI</h2><p>FastAPI — современный фреймворк для создания API на Python, заточенный под скорость, асинхронность и валидацию данных из коробки. Он построен на Starlette и Pydantic, автоматически создаёт OpenAPI-документацию, поддерживает асинхронное программирование и позволяет писать производительные REST и WebSocket API с минимальным количеством кода.</p><p>Вместо долгой настройки, как у Flask или Django, в FastAPI многое готово изначально: удобная работа с запросами и ответами, декларативная валидация, документация Swagger, асинхронность и высокая производительность без лишних усилий.</p><h3>Какие задачи решает</h3><p>Задач, действительно, много:</p><ul><li>Быстрая разработка REST API для мобильных и веб-приложений;</li><li>Создание бэкенда для ML/DS моделей (деплой моделей в виде API);</li><li>Построение микросервисов с хорошей производительностью;</li><li>Реализация websocket-серверов и асинхронных API;</li><li>Подготовка внутренних инструментов или бэкендов для MVP.</li></ul><p>FastAPI помогает быстро запускать API и уверенно масштабировать его в полевых условиях. Это один из немногих фреймворков Python, который по скорости работы сопоставим с Node.js и Go.</p><h3>Как пользоваться</h3><p>Во-первых, нужно установить FastAPI и Uvicorn (используем ASGI-сервер для запуска):</p><p>Простейший API-пример с эндпоинтом GET /:</p><p>Запускаем сам сервер:</p><p>После запуска API будет доступен по адресу http://127.0.0.1:8000/. Автоматически доступна интерактивная документация Swagger по адресу http://127.0.0.1:8000/docs.</p><p>FastAPI поддерживает валидацию параметров запроса, тел запросов и путей прямо через типы Python. Например, простой эндпоинт с параметром:</p><p>При вызове http://127.0.0.1:8000/items/10?q=test FastAPI автоматически проверит, что item_id — это число, и распарсит q как строку.</p><h3>Почему это меняет карьеру</h3><p>FastAPI — билет в мир бэкенда, где скорость и чистота кода имеют довольно высокое значение. Для <b>Python-разработчика </b>это возможность быстро освоить создание API и микросервисов, не увязнув в громоздкой настройке, как в Django, и при этом получить систему, готовую к продакшену.</p><p>Для <b>ML-специалиста</b> FastAPI становится инструментом для деплоя моделей: можно обернуть пайплайн предсказаний в API, подключить авторизацию или логирование и получить работающий сервис за считанные дни.</p><p>Вообще умение быстро поднимать и поддерживать API — навык, который ценят в бигтехе и стартапах. На разработчиков, которые владеют FastAPI, часто равняются: они умеют превращать идеи бизнеса в работающие сервисы за минимальное время.</p><h2>6. Typer</h2><p>Typer — современная библиотека для создания CLI-приложений на Python с минимальным количеством кода и автоматической генерацией документации. Автор библиотеки — Себастьян Рамирес, создатель FastAPI.</p><p>Главная особенность Typer — использование type hints для автоматического парсинга аргументов командной строки. Вы получаете удобную и читаемую CLI с поддержкой автодополнения и цветного вывода за считанные минуты.</p><h3>Какие задачи решает библиотека</h3><p>Список задач такой:</p><ul><li>Создание CLI-утилит любого уровня сложности.</li><li>Быстрое прототипирование и упаковка Python-скриптов в удобные инструменты для продакшена.</li><li>Генерация подробной справки (--help) и автодополнения команд.</li><li>Облегченная поддержка и масштабирование CLI за счёт структуры и читаемого кода.</li><li>Организация CLI с подкомандами, вложенными аргументами и обработкой ошибок.</li></ul><p>Typer использует аннотацию типов и минимум шаблонного кода.</p><h3>Как пользоваться</h3><p>Установка:</p><p>Пример минимальной CLI:</p><p>Теперь можно запустить из консоли:</p><p>Результат будет такой: Привет, Алиса! Тебе 25 лет.</p><h3>Почему это меняет карьеру</h3><p>Typer меняет карьеру тем, что открывает путь к созданию удобных CLI-инструментов, которые автоматизируют рутину и повышают продуктивность.</p><p>С Typer можно быстро превращать свои Python-скрипты в надежные утилиты, которыми удобно пользоваться и другим разработчикам, и сотрудникам из других отделов. CLI-приложения часто становятся клеем инфраструктуры: они позволяют автоматизировать деплой, миграции БД, сбор данных, интеграцию с внешними API и локальную разработку.</p><p>Если вы <b>Data Scientist или ML-инженер</b>, Typer позволяет оборачивать пайплайны в CLI, которые легко запускать из Jenkins, Airflow или вручную. Если вы <b>DevOps или Backend-инженер</b>, можете создавать CLI для работы с инфраструктурой и сервисами без сложных зависимостей.</p><p>Кроме того, работа с Typer улучшает навык структурирования кода, понимание CLI, использования type hints и разработки инструментов, которые делают работу проще для других. А это, очевидно, ценится в любой команде и повышает востребованность специалиста.</p><h2>7. Rich</h2><p>Rich — библиотека Python для красивого форматирования и интерактивного отображения информации в терминале. С её помощью можно выводить цветные таблицы, маркдаун, прогресс-бары, подсвеченный синтаксис кода, деревья каталогов и логирование в понятной и привлекательной форме.</p><p>Rich создана для того, чтобы «оживить» консоль Python, сделать логи удобными для восприятия, а CLI-инструменты — профессионально выглядящими без лишних усилий. Это библиотека, которая улучшает и UX, и DX.</p><h3>Какие задачи решает</h3><p>Про красоту не забываем! Задачи следующие:</p><ul><li>Цветное и структурированное логирование, понятное при чтении логов в реальном времени.</li><li>Отображение прогресс-баров для долгих операций.</li><li>Вывод таблиц, деревьев каталогов, JSON прямо в терминале.</li><li>Подсветка синтаксиса кода для CLI-инструментов.</li><li>Создание CLI-интерфейсов, которые выглядят профессионально и современно.</li><li>Улучшение читаемости при отладке скриптов.</li></ul><p>С помощью Rich можно быстро сделать понятными даже сложные данные при отладке или демонстрации.</p><h3>Как пользоваться</h3><p>Установка Rich:</p><p>Для примера выведем таблицу с подсветкой в консоли:</p><p>В результате в терминале получится цветная таблица, которая выглядит понятно и презентабельно.</p><h3>Почему это меняет карьеру</h3><p>Rich — это библиотека, которая помогает быстро повысить качество любого CLI-инструмента или дев-опыт в команде. <b>Разработчик</b>, который использует Rich, делает свои инструменты удобными не только для себя, но и для коллег: логирование становится понятным, а отладка скриптов — наглядной.</p><p>Во многих стартапах и продвинутых командах важна скорость обратной связи при тестировании пайплайнов и автоматизаций, и Rich помогает выводить ключевую информацию максимально читаемо.</p><p>Кроме того, Rich позволяет быстро создавать CLI-интерфейсы, которые выглядят как продакшен-продукты, даже если это внутренние инструменты. Руководство будет радоваться и думать о вас как о крутом разрабе.</p><p>Для <b>дата-инженеров и разработчиков DevOps</b> Rich полезна при создании админ-утилит и при мониторинге пайплайнов, для <b>Python-разработчиков</b> — при создании библиотек и фреймворков с CLI.</p><h2>8. LangChain</h2><p>LangChain — фреймворк для создания приложений на базе LLM, например, GPT, Claude, Mistral, Gemini. Он позволяет строить цепочки обработки запросов, интегрировать LLM с данными и инструментами, добавлять память и управление состояниями, а также связывать работу модели с внешними API и базами знаний.</p><p>LangChain предоставляет удобный слой абстракции над вызовами LLM и ускоряет разработку чат-ботов, RAG-приложений, агентов с инструментами, систем анализа документов и других AI-сервисов.</p><h3>Какие задачи решает</h3><p>Список внушительный:</p><ul><li>Интеграция LLM в Python-приложения без необходимости писать тот самый клеевой код вручную.</li><li>Построение цепочек с последовательной обработкой сообщений, включая преобразования и вызовы внешних функций.</li><li>Добавление памяти в чат-боты для сохранения истории общения и контекста.</li><li>Использование агентов для динамического вызова инструментов (веб-поиск, базы данных, API).</li><li>Создание RAG-систем с интеграцией LLM и векторных БД.</li><li>Быстрая сборка прототипов LLM-приложений, которые можно развернуть в продакшен.</li></ul><h3>Как пользоваться</h3><p>Установка:</p><p>Создадим простую цепочку с чатом GPT:</p><p>Благодаря единым абстракциям, можно гибко комбинировать цепочки, память и вызов внешних инструментов, не усложняя код.</p><h3>Почему это меняет карьеру</h3><p>LangChain меняет карьеру, потому что открывает новый пласт Python-разработки в AI и LLM-инженерии, быстро превращая пользователя GPT в создателя полноценных AI-приложений. Вместо того чтобы писать хаотичный клеевой код, вы начинаете системно проектировать цепочки запросов, учитесь строить продуманные промпты и объединять их с инструментами, памятью и внешними API.</p><p>Работа с LangChain погружает в практическую LLM-инженерию: вы начинаете создавать RAG-приложения, которые умеют искать и анализировать данные перед генерацией ответа и строить агентов. Это востребовано в продуктах, где нужно подключать ИИ к базам знаний, автоматизировать задачи и разрабатывать интерактивные системы, которые реально используют модели в продакшене.</p><p>LangChain позволяет быстро собирать и запускать MVP AI-продуктов, что дает конкурентное преимущество при создании стартапов или внутренних сервисов. А ещё учит мыслить структурами и проектировать масштабируемую архитектуру LLM-приложений и видеть, как генеративный ИИ можно превратить в рабочий инструмент.</p><h2>9. SQLAlchemy</h2><p>SQLAlchemy — это мощная ORM и toolkit для работы с базами данных в Python, позволяющая писать SQL-запросы декларативно, создавать модели таблиц и управлять транзакциями в Python-коде без ручного написания SQL.</p><p>Библиотека даёт разработчику два уровня контроля:</p><ul><li>Core: низкоуровневая работа с SQL выражениями и соединениями;</li><li>ORM: высокоуровневая декларативная работа с моделями, классами и связями между таблицами.</li></ul><p>SQLAlchemy поддерживает PostgreSQL, MySQL, SQLite, Oracle и другие СУБД, давая единую абстракцию, без привязки к конкретному движку.</p><h3>Какие задачи решает</h3><p>Пул задач следующий:</p><ul><li>Описание таблиц в виде Python-классов и управление ими через сессии;</li><li>Создание, чтение, обновление и удаление данных;</li><li>Миграция SQL на декларативный стиль без потери гибкости;</li><li>Полный контроль над транзакциями и выполнением запросов;</li><li>Работа с асинхронными приложениями при создании FastAPI/Django-приложений;</li><li>Экранирование параметров, которое снижает вероятность SQL-инъекций и ошибок.</li></ul><h3>Как пользоваться</h3><p>Создадим минимальный пример для SQLite с таблицей пользователей:</p><p>Этот код создаёт базу example.db, таблицу users, добавляет туда одного пользователя и выводит всех пользователей в базе. При необходимости можно использовать SQLAlchemy Core для написания гибких запросов вручную, если нужно работать ближе к SQL.</p><h3>Почему это меняет карьеру</h3><p>SQLAlchemy меняет карьеру <b>Python-разработчика</b> тем, что даёт понимание системной работы с данными, архитектуры приложений и взаимодействия с реальными базами данных. Вы учитесь строить продуманные бэкенды, которые работают с транзакциями, миграциями, связями между таблицами и сложными выборками.</p><p>Знание SQLAlchemy открывает дорогу в мир API, микросервисов и продуктов, где требуется качественное управление данными и гибкая логика работы с БД. Работа с SQL теперь совсем не страшная.</p><h2>10. Seaborn</h2><p>Seaborn — библиотека для визуализации данных на Python, построенная поверх Matplotlib и упрощающая создание информативных и стильных графиков с минимальным количеством кода.</p><p>Она автоматически заботится о красивых стилях, цветах, разметке графиков, легендах и позволяет легко строить распределения, линейные графики, тепловые карты и другие визуализации.</p><p>Библиотека тесно интегрируется с Pandas DataFrame, позволяя использовать колонки данных напрямую для построения графиков, что делает её идеальной для EDA (разведочного анализа данных) и подготовки визуализаций для отчётов и презентаций.</p><h2>Какие задачи решает</h2><p>Визуализация безумно важна, особенно в контексте дата-аналитики. Seaborn отвечает за:</p><ul><li>Быстрое построение информативных графиков для анализа данных и поиска инсайтов;</li><li>Автоматическую обработку ошибок отображения и масштабирования, что экономит время;</li><li>Поддержку сложных визуализаций по типу ящиков с усами или тепловых карт без десятков строк кода;</li><li>Стилизацию графиков без ручных настроек Matplotlib;</li><li>Возможность добавлять статистические элементы (линию регрессии, KDE, распределение);</li><li>Интеграцию с Jupyter Notebook для интерактивного анализа данных.</li></ul><h3>Как пользоваться</h3><p>Допустим, у нас есть датасет с данными о чаевых:</p><p>В три строки мы получаем чистый и читаемый ящик с усами, показывающий, как счет за ужин распределяется по дням недели.</p><p>Для построения более сложных графиков можно использовать диаграмму рассеяния:</p><p>Тут мы добавляем цветовую кодировку по полу, чтобы увидеть зависимости между переменными.</p><h3>Почему это меняет карьеру</h3><p>Seaborn меняет карьеру, потому что даёт навык визуального анализа данных, что критично в современной аналитике и дата-инженерии. Умение быстро строить графики и видеть аномалии, распределения и взаимосвязи между переменными превращает работу с данными из слепого копания в числах в структурный анализ.</p><p>Использование Seaborn в Python-стеке помогает выделиться среди разработчиков, которые ограничиваются Pandas и текстовыми логами, ведь визуализация часто позволяет быстрее заметить закономерности и убедить команду или заказчика в правильности гипотезы.</p><p>Seaborn также учит пониманию данных через визуальные паттерны, что улучшает навыки построения моделей машинного обучения (так понятнее, какие признаки важны), и помогает создавать наглядные отчёты для продуктовых решений, где результат анализа нужно доносить до людей не из айти-индустрии.</p><p><i>А какими библиотеками пользуетесь вы? Делитесь в комментариях!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Техлиды и продуктовые менеджеры — всё? Зачем нужны Technical Owner и Unit-лид в IT-командах</title>
      <link>https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah</link>
      <comments>https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah</guid>
      <description><![CDATA[<p>Что приходит на смену классическим техлидам и продакт-менеджерам в IT: рассказываем, зачем нужны Technical Owner и Unit-лид, какие проблемы они решают в реальной разработке и как меняются роли в командах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah">Техлиды и продуктовые менеджеры — всё? Зачем нужны Technical Owner и Unit-лид в IT-командах</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Jul 2025 10:24:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект выстрелил, команда растёт, но вместе с этим растёт и хаос. Интеграция с другим отделом не работает, бизнес хочет новую фичу, где надо впихнуть невпихуемое, а старый код висит на балансе неизвестно у кого.</p><p>Всё это — обычная история для быстрорастущих IT-компаний. Пока команда маленькая, хватает одного тимлида. Но когда людей становится больше, старые процессы начинают сбоить.</p><p>Здесь и появляются новые роли — Technical Owner и Unit-лид. Их задача — взять на себя куски ответственности, которые раньше выпадали из поля зрения команды.</p><blockquote>В российских компаниях эти роли пока не получили широкого распространения, особенно в небольших и средних организациях, где функции часто распределены между тимлидами, продакт-оунерами и проектными менеджерами. Однако в крупных IT-компаниях и продуктовых командах, таких как Avito и другие, Unit-лид и Technical Owner становятся всё более востребованными, поскольку помогают разграничить ответственность и повысить прозрачность управления сложными продуктами и командами.</blockquote><h2>Technical Owner: кто это и зачем нужен</h2><p>Представим ситуацию: компания разрабатывает маркетплейс на Python и React, всё вроде идёт по плану, пока менеджеры не просят срочно добавить новую систему оплаты. Они не вникают, что для этого придётся переделать схему платежей, разнести микросервисы, рискуя уронить старые заказы. Разработчики объясняют, что быстро не выйдет, но их не слышат — и в итоге проект зависает между требованиями бизнеса и возможностями команды. Именно в таких случаях нужен Technical Owner.</p><h3>Кто это такой</h3><p>У такого специалиста обычно есть технический бэкграунд, он хорошо понимает, что под капотом, и может общаться с командой разработки на одном языке. Также разбирается в бизнес-процессах, понимает дорожную карту развития продукта. За счёт этих особенностей технический владелец может переводить язык разработчиков на язык бизнеса и обратно, избегая недопониманий.</p><h3>Какие у него обязанности</h3><p>Вот примерный список того, что делает ТО:</p><ul><li>Консультирует заказчиков и владельцев по техническим вопросам.</li><li>Составляет дорожную карту развития проекта, с учётом требований к разработке.</li><li>Помогает с разработкой решений, начиная с архитектуры.</li><li>Участвует в расстановке приоритетов.</li><li>Поддерживает команды и отслеживает их зависимости.</li></ul><p>Это неполный список, и обязанности отличаются в разных компаниях, всё зависит от специфики продукта и процессов.</p><h3>Чем отличается от продуктового менеджера, техлида и архитектора</h3><p><b>Чем ТО отличается от продуктового менеджера</b></p><p>Продуктовый менеджер обычно больше фокусируется на управлении командой. Он отвечает за общее видение продукта, общение с клиентами, организацию и сроки. Но чем сложнее продукт и процессы, тем сильнее нужен человек, который сможет управлять и разработкой, и продуктом в целом. Для таких задач есть ТО, который, с одной стороны, понимает, куда движется продукт, какое его позиционирование, с другой — знает, какие нюансы в разработке могут возникнуть и как продукт лучше всего спроектировать.</p><p><b>Чем отличается от тимлида, техлида и архитектора</b></p><p>Тимлид, техлид — это руководители команды, которые отвечают только за её задачи. TO, хоть и глубоко понимает техническую сторону, но его роль шире —  он связывает технику с бизнесом и даже консультирует клиентов. Technical Owner отвечает за общее техническое и архитектурное видение продукта. Масштаб его ответственности больше.</p><p>В отличие от архитектора, технический владелец не только принимает участие в проектировании, но и доносит эти решения до клиентов и руководства.</p><blockquote>Technical Owner (Технический владелец) ответственен за долгосрочное здоровье и развитие конкретного компонента/системы/продукта. Фокус на технической стратегии, архитектуре, надёжности и поддержке в течение всего жизненного цикла.<br /><br />Техлид руководит командой, отвечающей за разработку. Фокус на распределении задач, наставничестве и решении технических проблем.<br /><br />Архитектор решений определяет технологический стек и взаимодействие компонентов. Фокус на общей структуре и дизайне решения.<br /><br />Технический владелец может делегировать задачи техлиду и руководствоваться архитектурой, предложенной архитектором, но конечная ответственность за успех компонента лежит на нём.</blockquote><h2>Сколько зарабатывает и какие нужны навыки, чтобы стать ТО</h2><p>Если мы сейчас пойдём на hh.ru и введём в поиск Technical Owner, то, в лучшем случае, найдём только пару вакансий. Technical Owner нужен для больших продуктов в крупных компаниях, поэтому должность встречается на рыке редко и пробиться туда сложно.</p><p>Зарплата и навыки зависят от конкретной компании, её процессов и задач. Обычно это что-то на уровне топ-менеджмента. Вот пример заработной платы в одной из <a href="https://getmatch.ru/vacancies/24808-technical-owner-disk">вакансий</a> от Яндекс 360:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/37fe6863-ca0d-432e-8285-fbb18098f941.jpg" alt="" /><figcaption>Пример зарплаты на вакансию Technical Owner от Яндекс 360</figcaption></figure><p>А вот так выглядят обязанности и необходимые навыки:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/ff7d27db-b585-4548-80c6-4432b0110a14.jpg" alt="" /><figcaption>Описание задач для Technical Owner</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/e680ef81-cb5c-4a13-8c73-02b17ec95ce3.jpg" alt="" /><figcaption>Требования к Technical Owner</figcaption></figure><p>Вот пример ещё одной такой <a href="https://volgograd.hh.ru/vacancy/121349277?query=Itransition+Technical+Owner&amp;hhtmFrom=vacancy_search_list">вакансии</a> от компании Itransition:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/c548e397-d04a-4bb1-9db5-8e6137079283.jpg" alt="" /><figcaption>Требования к Technical Owner в вакансии от Itransition</figcaption></figure><p>Как видно, здесь есть требования к опыту работы в качестве продуктового менеджера и аналитика, технической подкованности и определённому стеку.</p><p>Чтобы стать таким специалистом, нужно хорошо разбираться в разработке, подходить по стеку и иметь опыт управления командой.</p><h2>Кто такой Unit-лид, зачем он нужен</h2><h3>Кто это такой</h3><p>Юнит-лид — это руководитель, который возглавляет «юнит» – объединение нескольких команд (обычно 3-5), работающих над частью общего продукта или бизнес-направления. Он отвечает за стратегию и бизнес-результаты своего юнита.</p><blockquote>В последние полгода в нашей компании появилась новая управленческая роль — Unit Lead. Это ответственный руководитель,который координирует работу всего юнита: от стратегии до найма и развития сотрудников. Мы внедрили эту модель не просто ради структуры — она стала ответом на быстрый рост бизнеса и усложнение внутренних процессов.<br /><br />Что такое юнит? Это самостоятельный бизнес-модуль, включающий несколько стримов (направлений). Каждый стрим, в свою очередь, состоит из команд по 5-10 человек. Таким образом, один юнит может объединять от 5 до 12 команд, представляющих разные IT-направления: фронтенд, бэкенд, мобайл и др.</blockquote><h3>Какие у него обязанности</h3><p>Обязанности юнит-лида очень обширны и зависят от типа юнита:</p><p><b>Стратегическое развитие и планирование</b>: юнит-лид определяет общую стратегию развития своего юнита, составляет планы проектов, согласовывает их со стейкхолдерами.</p><p><b>Управление командами и сотрудниками</b>: управляет командами, например, аналитиков, разработчиков, QA-инженеров, занимается развитием их компетенций, формирует портфель проектов, следит, чтобы эти проекты были реализованы.</p><p><b>Взаимодействие со стейкхолдерами</b>: активно общается со множеством внутренних и внешних заказчиков, лидерами бизнеса и продукта, регулирующими органами и партнёрами. Он занимается привлечением и защитой необходимых ресурсов, которые нужны для продукта.</p><p><b>Ответственность за результаты</b>: вся ответственность за вектор развития и конечный результат юнита лежит на юнит-лиде. Иногда на нём висит даже отчётность по финансовым результатам.</p><p><b>Разработка и развитие продуктов/инструментов</b>: юнит-лиды могут адаптировать существующие инструменты, разрабатывать новые под потребности команд, а также создавать внутренние платформы и технически сложные продукты.</p><h3>Чем отличается от продуктового менеджера и тимлида</h3><p>Роль юнит-лида схожа с некоторыми другими позициями, но всё же от них отличается. Рассмотрим несколько таких отличий.</p><p><b>Что делает продуктовый менеджер</b></p><p>Продуктовый менеджер (PM или Product Owner) отвечает за конкретный продукт или его отдельные части. Его главная задача — понять, что нужно пользователям и бизнесу, сформировать требования и приоритеты, а затем воплотить эти требования в жизнь. PM постоянно держит руку на пульсе метрик, проводит A/B-тесты и собирает обратную связь.</p><p><b>Что делает тимлид</b></p><p>Тимлид — это руководитель разработки внутри одной команды. Он отвечает за техническое качество кода, выполнение задач в срок и развитие команды. Его основная забота — чтобы код был качественным, архитектура — адекватной, а команда справлялась с поставленными задачами без перегрузок и постоянных авралов.</p><p><b>Чем занимается юнит-лид</b></p><p>Юнит-лид работает на другом уровне. Если представить компанию как армию, то тимлид руководит взводом, продуктовый менеджер отвечает за успешность операции, а юнит-лид — полковник, который решает, какие операции вообще нужны, какими силами их проводить и как это повлияет на общую картину. Он отвечает за бюджет, координацию нескольких команд и стратегическое развитие целого направления.</p><p>Например, в Avito есть <a href="https://habr.com/ru/companies/avito/articles/885968/">аналитический юнит-лид</a>, который управляет одной командой аналитики и двумя техническими. Первая команда занимается ценами: изучает разные способы образования цен на услуги Avito, анализирует результаты изменения цен, оценивает эффективность промокампаний.</p><p>Две другие команды отдают цены в другие сервисы, организуют скидки, интегрируют новые категории товаров и услуг в систему.</p><blockquote>Unit-лид — это такая гибридная роль, которая объединяет менеджерские навыки с техническим пониманием. От тимлида он отличается тем, что не погружается в код-ревью и техническую детализацию спринтов, а больше занимается координацией между командами. <br /><br />В отличие от обычного проектного менеджера, Unit-лид разбирается в архитектурных решениях и может принимать технические решения сам, без долгих согласований. Он следит за тем, чтобы команда двигалась в рамках продуктовой стратегии, а не только закрывала текущие задачи по списку. Такой специалист становится связующим звеном между разными уровнями управления.<br /><br />В нашей практике в Юнисофт мы сталкивались с ситуацией, когда отсутствие такой роли приводило к хаосу и потере общего видения проекта.</blockquote><h3>Сколько зарабатывает unit-лид, какие нужны навыки и как им стать</h3><p>Наткнуться на вакансию юнит-лида на просторах hh.ru тоже непросто. Это новая роль, которая нужна только для сложных продуктов в крупных IT-компаниях.</p><p>С зарплатой и обязанностями всё индивидуально, зависит от компании. Вот пример одной из <a href="https://getmatch.ru/vacancies/14624-unit-lead">вакансий</a> от Купера:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/3d95de82-4238-4845-96c0-5026093fe9b4.jpg" alt="" /><figcaption>Пример зарплаты юнит-лида в Купере</figcaption></figure><p>Зарплата вполне на уровне топ-менеджмента. А вот обязанности и ожидания:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/fc1da5fa-ed76-47ee-a599-3339cee29908.jpg" alt="" /><figcaption>Обязанности и ожидания юнит-лида</figcaption></figure><p>Как видим, помимо менеджерских навыков здесь тоже нужно понимание стека. Но в отличие от Technical Owner, юнит-лид больше сфокусирован на управлении продуктом, чем на его технической составляющей.</p><p>А вот ещё один пример обязанностей и ожиданий в <a href="https://yandex.ru/jobs/vacancies/yunitlid-v-komandu-postavki-dannih-v-crm-31805">другой вакансии</a>, на этот раз от Яндекса:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/96ce7071-00ca-4bbe-ad2b-e660bad75e85.jpg" alt="" /><figcaption>Описание задач для юнит-лида</figcaption></figure><p>Как видно из обеих вакансий, для того чтобы стать юнит-лидом нужно иметь технический бэкграунд, но при этом обладать опытом управления командами, работать с процессами, ставить и выполнять задачи.</p><h2>Где и когда эти роли реально нужны (а где — нет)</h2><h3>Какие компании и проекты выигрывают от появления таких ролей</h3><p>Technical Owner и Unit-лид подходят не всем. В стартапах и небольших командах, где каждый знает свои задачи и зоны ответственности, эти позиции будут избыточными и просто усложнят работу.</p><p>Но в крупных компаниях и быстрорастущих проектах, которые уже переросли старые схемы управления, эти роли реально помогают. Если проект вырос до нескольких команд, которые работают над разными продуктами или направлениями, то Unit-лид поможет держать фокус на стратегических целях. Technical Owner пригодится, когда задачи настолько усложнились, что нужен человек, который свяжет технические решения и требования бизнеса, предотвращая недопонимания.</p><h3>Сигналы, что команде пора подумать о Technical Owner или Unit-лиде</h3><p>Есть несколько явных признаков, когда стоит задуматься о введении этих ролей:</p><ul><li>Постоянные споры о том, кто должен заниматься интеграциями, техническим долгом и сложными архитектурными вопросами.</li><li>Регулярные задержки и проблемы с релизами из-за несогласованности между командами.</li><li>Непонимание между менеджерами и разработчиками: одни требуют невозможного, другие объясняют технические сложности.</li><li>Наличие нескольких продуктовых направлений, для которых нужны люди, умеющие координировать работу сразу нескольких команд.</li></ul><blockquote>Создание этих ролей актуально, когда бизнес выходит за рамки одной команды и одного продукта. Если у компании несколько направлений, которые требуют отдельного фокуса и развития, то Unit-лид — необходимый управленец для децентрализации и роста. <br /><br />Technical Owner нужен, когда продукт становится достаточно сложным, и необходимо, чтобы один человек держал в фокусе его техническую эволюцию, а не просто оперативную реализацию. Это позволяет стратегически управлять качеством кода, архитектурой и техническими рисками<b>.</b></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Что по экологии? Сколько углеродного следа оставляет ваш код</title>
      <link>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</link>
      <comments>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</guid>
      <description><![CDATA[<p>Узнайте, сколько CO₂ генерирует ваш код в 2025 году и как снизить углеродный след в IT. Практические советы по оптимизации архитектуры, выбору «зеленых» технологий и реальные кейсы компаний. Экологичное программирование — новый тренд для разработчиков и бизнеса.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod">Что по экологии? Сколько углеродного следа оставляет ваш код</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году IT-индустрия потребляет больше энергии, чем крупная европейская страна  в 2010. <a href="https://www.iea.org/">По данным IEA</a> (International Energy Agency), дата-центры и телекоммуникационные сети уже отвечают за 3,7% глобальных выбросов CO₂ — это больше, чем производит авиация.</p><p>Казалось бы, код — это просто текст. Но каждый запрос к API, каждая компиляция и даже холостой цикл требуют энергии. Например, обучение GPT-4 в 2023 году «съело» столько же электричества, сколько 120 домохозяйств за год. А теперь представьте, что таких моделей тысячи, а серверов — миллионы.</p><p>Почему это важно? Во-первых, <a href="https://digital-strategy.ec.europa.eu/">регуляторы ужесточают требования</a>: в ЕС с 2025 года IT-компании обязаны раскрывать углеродный след своих продуктов. Во-вторых, инвесторы все чаще смотрят на ESG-рейтинги — показатели экологического и ответственного производства. В-третьих, оптимизация кода снижает затраты на инфраструктуру.</p><p>Эта статья — не манифест экоактивистов, а руководство для разработчиков, архитекторов и технических директоров компаний (СТО), которые стремятся более эффективные и экологичные проекты.</p><h2>Углеродный след кода: что скрывается за строчками</h2><p>Программное обеспечение — не виртуальный конструктор. Каждая операция требует электричества, а серверы, на которых работает код, часто питаются от невозобновимых источников энергии — например, угля и газа.</p><h3>Откуда берутся выбросы</h3><p>Когда мы говорим об углеродном следе ПО, важно понимать: код не существует в вакууме. Каждая строка, каждый запрос и каждая операция требуют физических ресурсов — электричества, серверного оборудования, систем охлаждения. В 2025 году эта цепочка стала еще сложнее из-за взрывного роста облачных вычислений и ИИ.</p><p>Прямые выбросы — это энергия, которую потребляют серверы при выполнении вашего кода. Например, один средний веб-сервер на AWS EC2 (тип t3.large) в год вырабатывает около 400 кг CO₂ — как небольшой автомобиль, проехавший 2000 км. При этом нагрузка на серверы постоянно растет: с 2020 по 2025 год энергопотребление дата-центров увеличилось на 35%.</p><p>Косвенные выбросы часто упускают из виду. Производство серверного оборудования — процесс крайне энергоемкий. Для создания одной только микросхемы памяти DDR5 требуется около 200 кВт⋅ч энергии — столько же, сколько средний холодильник потребляет за год. А после выхода оборудования из строя лишь 20% компонентов перерабатывается должным образом (<a href="https://globalewaste.org/">Global E-Waste Monitor 2024</a>).</p><p>Системы охлаждения — еще один скрытый источник выбросов. Современные дата-центры работают 24/7, и даже с использованием жидкостного охлаждения на поддержание температуры уходит до 40% всей потребляемой энергии. В жарких странах, ОАЭ или Сингапуре, этот показатель может достигать 50%.</p><p>Яркий пример — крупные языковые модели. Если в 2023 году обучение GPT-4 потребовало ~10 ГВт⋅ч (эквивалент годового потребления 120 домохозяйств), то к 2025 году из-за увеличения размеров моделей этот показатель вырос в 1,5 раза. Один запрос к такому ИИ теперь генерирует около 2 г CO₂ — как если бы вы проехали 10 метров на бензиновом автомобиле.</p><p>Но проблема не только в ИИ. Обычное веб-приложение с посещаемостью 100 000 пользователей в месяц может производить до 1 тонны CO₂ в год — и это без учета мобильных клиентов и API. При этом <a href="https://www.webpagetest.org/eco/">30% этой нагрузки приходится на неоптимизированный фронтенд</a>: тяжелые изображения, избыточные JavaScript-библиотеки и частые запросы к серверу.</p><p>Ситуацию усугубляет географический фактор. Дата-центр в Норвегии, где 98% энергии поступает от ГЭС, будет «чище», чем такой же центр в Польше, где угольные электростанции дают 70% энергии. <a href="https://app.electricitymaps.com/">Разница</a> в углеродном следе может быть 20-кратной для идентичных операций.</p><p>При этом стандарты измерения все еще остаются разрозненными. PUE (Power Usage Effectiveness), который используют Google и Microsoft, учитывает только эффективность инфраструктуры, но не источник энергии. Новый стандарт CUE (Carbon Usage Effectiveness), разработанный в 2024 году, уже включает эти данные, но его поддерживают менее 30% провайдеров.</p><h2>Где код тратит энергию впустую</h2><p>Некоторые части систем особенно вредны для экологии. Главные «пожиратели» ресурсов:</p><ul><li>Неоптимизированные алгоритмы. Сортировка пузырьком (O(n²)) на большом массиве данных может потреблять в 100 раз больше энергии, чем быстрая сортировка (O(n log n)).</li><li>Микросервисный хаос. Архитектура из сотен микросервисов увеличивает нагрузку на сеть. Каждый вызов API между сервисами — это дополнительные 0,5–1 Вт⋅ч.</li><li>Облачные провайдеры. Не все одинаково зеленые. AWS и Google используют 60–70% ВИЭ (возобновляемых источников энергии), но в Азии и Африке их дата-центры часто работают на угле.</li></ul><h3>Как измерить углеродный след</h3><p>В 2025 году появились инструменты, которые помогают оценить влияние кода:</p><ul><li>Cloud Carbon Footprint — анализирует выбросы AWS, GCP и Azure.</li><li>Scaphandre — мониторит энергопотребление серверов в реальном времени.</li><li>Greenframe.io — симулирует нагрузку на веб-приложение и считает CO₂.</li></ul><p>Климатические инициативы в IT больше не просто красивые слова в корпоративных отчетах. В 2025 году за неэффективный код можно получить не только порицание сообщества, но и вполне реальный штраф.</p><p>Европейский союз уже ввел санкции против пяти крупных SaaS-компаний за превышение углеродных квот, а Amazon Web Services выплатила 2,7 млн евро штрафа за неоптимизированные алгоритмы в своих сервисах.</p><h2>Как изменились подходы к разработке</h2><p>Эти тренды нацелены на долгосрочное действие и в перспективе должны полностью изменить текущую концепцию в разработке.</p><h3>Экологичный DevOps — новая реальность</h3><p>Современные системы автоматического масштабирования стали умнее. Kubernetes Horizontal Pod Autoscaler теперь учитывает не только нагрузку на CPU, но и текущий углеродный след дата-центра. Если в регионе пиковое потребление энергии и работают угольные электростанции, система сознательно ограничивает масштабирование.</p><p><a href="https://cloud.google.com/blog">Технология, разработанная Google</a> в партнерстве с WattTime, уже снижает выбросы CO₂ на 27-33% по сравнению с традиционным подходом.</p><p>CI/CD-цепочки тоже стали «зеленее». Вместо запуска полного набора тестов при каждом коммите, современные системы определяют, какие именно модули затронуты изменениями.</p><p><a href="https://carbonrunner.io/features/github-action-runners">GitHub Actions представил Carbon-Aware Runner</a>, который планирует выполнение задач на время максимальной доступности возобновляемой энергии в регионе. По данным Microsoft, это сокращает углеродный след тестирования на 40%.</p><h3>Языки программирования: война за эффективность</h3><p>Rust продолжает набирать популярность не только из-за безопасности, но и благодаря энергоэффективности. Тесты Benchmarks Game показывают, что один и тот же алгоритм обработки данных на Rust потребляет на 38-42% меньше энергии, чем на Python. В 2025 году Rust вошел в топ-5 языков для enterprise-решений, вытеснив Java в 17% крупных проектов.</p><p>Но настоящим открытием стал <a href="https://ziglang.org/documentation/master/">Zig </a>— язык, который сочетает производительность C с простотой синтаксиса. Его компилятор потребляет в 3 раза меньше ресурсов, чем LLVM-бэкенд Rust, что делает его идеальным выбором для встраиваемых систем.</p><h3>ИИ на грани: когда меньше значит лучше</h3><p>TinyML-революция набирает обороты. Современные нейросети для микроконтроллеров занимают менее 256 КБ памяти, но справляются с задачами, которые раньше требовали облачных вычислений.</p><p>Например, новые датчики Nest анализируют звук прямо на устройстве, определяя не только дым, но и тип возгорания. Это экономит до 150 МБ трафика в месяц на одно устройство.</p><p>На фронте больших языковых моделей тоже произошли изменения. Meta* выпустила LLaMA-3 Nano — модель с 500 млн параметров, которая работает на смартфоне и по качеству ответов не уступает GPT-3.5. Ее углеродный след при обучении в 1200 раз меньше, чем у GPT-4.</p><p><i>(*Компания запрещена в РФ)</i></p><h3>Новые правила игры: регуляторы и бизнес</h3><p>С января 2025 года в Евросоюзе действует Углеродный налог на цифровые продукты (Digital Carbon Border Tax). Теперь любое ПО, продающееся в ЕС, должно иметь сертификат углеродной эффективности.</p><p>Для крупных enterprise-решений максимально допустимый углеродный след составляет 500 г CO₂ на 1000 пользователей в месяц. Нарушители платят 7% от оборота продукта в регионе.</p><p>Венчурные фонды радикально изменили подход к инвестициям. <a href="https://www.pwc.com/gx/en/services/sustainability/publications.html">Согласно отчету PwC</a>, 43% фондов требуют ESG-отчетность перед заключением сделки, а 28% вообще не рассматривают стартапы без «зеленой» стратегии. В Кремниевой долине появился первый акселератор Carbon Neutral Startups, который дает бонусы в $50 000 проектам с нулевым углеродным следом.</p><p>Корпорации тоже не остались в стороне. <a href="https://www.microsoft.com/sustainability">Microsoft ввела внутренний углеродный налог</a> — теперь каждое подразделение платит $100 за каждую тонну CO₂, связанную с его продуктами. Эти деньги идут на развитие возобновляемой энергетики.</p><p>Но самое интересное происходит на рынке труда. Разработчики с навыками «зеленого» программирования получают на 15-20% больше предложений. Появилась появилась новая категория навыков — «Устойчивая разработка ПО», а спрос на таких специалистов вырос на 300% за последний год.</p><h2>Как писать «зеленый» код</h2><p>Каждая лишняя операция в коде — это не только миллисекунды процессорного времени, но и реальные граммы CO₂. В 2025 году энергоэффективность кода перестала быть теоретической концепцией и превратилась в конкретный навык, который влияет на карьеру разработчика. Рассмотрим три ключевых направления оптимизации.</p><h3>Оптимизация запросов к базе данных</h3><p>Типичный пример — использование SELECT * вместо явного перечисления полей. Когда приложение запрашивает все поля таблицы users (включая редко используемые avatar_blob или metadata_json), сервер БД тратит дополнительные ресурсы на чтение и передачу этих данных. В крупных системах с миллионами запросов в день это приводит к значительному перерасходу вычислительных ресурсов.</p><p>Современные ORM типа Prisma и Drizzle добавили автоматическую оптимизацию запросов. Теперь при использовании select() они анализируют, какие поля действительно нужны на клиенте, и генерируют оптимальный SQL. В тестах это снижает нагрузку на БД на 12-18%.</p><h3>Работа с циклами и алгоритмами</h3><p>Классическая ошибка — продолжать перебор массива после нахождения нужного элемента. В 2025 году статический анализатор кода в WebStorm и VS Code автоматически предупреждает о таких ситуациях. Особенно критично это для мобильных приложений: лишние итерации цикла на слабых устройствах увеличивают энергопотребление на 5-7%.</p><p>Новые версии JavaScript и TypeScript ввели оптимизированные методы для массивов. Например, array.findLast() работает в 1,5 раза эффективнее ручной реализации с циклом. Для сложных алгоритмов появились «зеленые» библиотеки вроде EcoCollections для Java, которые минимизируют энергопотребление при работе с структурами данных.</p><h3>Сжатие и передача данных</h3><p>Формат Brotli стал новым стандартом для API: он обеспечивает лучшее сжатие, чем gzip, особенно для JSON-ответов. Компания Cloudflare провела эксперимент: после перехода на новую версию Brotli нагрузка на их серверы снизилась на 18%, что эквивалентно годовому потреблению энергии 2000 домохозяйств.</p><p>Но сжатие — не панацея. Грамотное проектирование API может дать больший эффект. GraphQL-подход, где клиент запрашивает только нужные данные, в среднем почти вдвое уменьшает объем передаваемой информации по сравнению с REST. А технология Server-Sent Events (SSE) для реального времени потребляет в 3 раза меньше ресурсов, чем WebSockets, когда не нужна двусторонняя связь.</p><p>Современные фреймворки начали учитывать энергоэффективность. Next.js 15 <a href="https://nextjs.org/blog">представил «зеленый» режим компиляции</a>, который оптимизирует сборку под минимальное энергопотребление. В тестах это дало 8% экономии на процессоре при работе приложения. А Deno 2.0 автоматически кэширует зависимости на уровне ОС, сокращая число повторных загрузок.</p><p>Эти изменения кажутся мелкими, но в масштабах индустрии они имеют огромное значение. Если бы все репозитории на платформе применили базовые оптимизации, глобальное энергопотребление дата-центров сократилось бы на несколько процентов. Для отрасли, которая потребляет 700 ТВт⋅ч в год, это десятки миллионов долларов и тысячи тонн CO₂.</p><h2>Выбор технологий</h2><p>В 2025 году выбор стека технологий влияет не только на производительность, но и на экологичность проекта. Разберем ключевые аспекты, которые помогут снизить углеродный след вашего приложения.</p><h3>Языки программирования: баланс между скоростью и эффективностью</h3><p>Rust и Go продолжают доминировать в высоконагруженных системах. Тесты показывают, что веб-сервер на Rust потребляет на 35-40% меньше энергии при одинаковой нагрузке по сравнению с Node.js. Особенно заметна разница в облачных средах, где каждый ватт на счету.</p><p>C++ остается выбором для задач, где важна предсказуемая производительность. Новый стандарт C++26 добавил энергоэффективные режимы работы алгоритмов STL, что особенно важно для встраиваемых систем.</p><p>Python по-прежнему хорош для прототипирования, но в продакшене его лучше заменять на компилируемые языки. PyPy 8.0 сократил энергопотребление интерпретатора на 25%, но даже с этими улучшениями Python проигрывает Rust в 3-4 раза по эффективности.</p><h3>Базы данных: от малого к большему</h3><p>SQLite — идеальный выбор для небольших проектов и edge-устройств. Его новая версия 3.45 добавила режим «энергосбережения», который снижает потребление на 15% при фоновых операциях.</p><p><a href="https://www.postgresql.org/docs/17/release-17.html">PostgreSQL 17</a> сделал большой шаг в энергоэффективности. Функция автоматического партиционирования теперь учитывает не только производительность, но и энергопотребление. В тестах это дало 20% экономии на крупных аналитических запросах.</p><p>Для высоконагруженных систем появилась альтернатива — ScyllaDB 5.0. Эта Cassandra-совместимая СУБД потребляет втрое раза меньше энергии при аналогичной нагрузке, благодаря полному переписыванию на Rust.</p><h2>Кейсы: что работает, а что нет</h2><p>Российские компании тоже внедряют экологичные IT-решения. МТС разработала мобильное приложение, где пользователи получают бонусы за раздельный сбор мусора — их можно обменять на подписки или скидки. За первый год проект привлек 500 тысяч участников и сократил количество непереработанных отходов в регионах присутствия.</p><p>НИУ ВШЭ, совместно с Росприроднадзором, автоматизировал сбор экологической отчетности с помощью ИИ. Нейросеть анализирует данные с датчиков и заполняет формы вместо специалистов. Это сократило время обработки с 100 до 10 часов в месяц и уменьшило количество ошибок.</p><p>Некоторые архитектурные решения приносят больше вреда, чем пользы. Один московский стартап без необходимости разбил монолитную систему на 50 микросервисов — в результате затраты на инфраструктуру выросли в 3 раза, а углеродный след увеличился на 180%.</p><p>Проблемы возникают и на уровне зависимостей. История с left-pad повторилась в 2024 году, когда один npm-пакет потянул за собой 80 МБ ненужных библиотек. Теперь крупные компании проверяют каждую зависимость через Bundlephobia и устанавливают лимит на размер node_modules.</p><h2>Что нас ждет</h2><p>В 2025 году отрасль стоит на пороге радикальных изменений, которые перевернут наши представления о «зеленом» программировании.</p><p>Супероблака — следующий этап эволюции распределенных вычислений. В отличие от традиционных облачных провайдеров, эти системы автоматически переносят нагрузку между дата-центрами в зависимости от доступности возобновляемой энергии.</p><p><a href="https://cloud.google.com/sustainability">Google уже тестирует эту технологию</a> в Северной Европе: когда в Норвегии дует сильный ветер и ветряные электростанции работают на пике, система переносит вычисления именно туда. По предварительным оценкам, это снижает углеродный след на 18-22% по сравнению со статичным распределением.</p><p>Но настоящий прорыв ожидается в сегменте квантовых вычислений. Хотя современные квантовые компьютеры потребляют колоссальное количество энергии (система IBM Quantum System One требует около 25 кВт⋅ч для работы одного кубита), их потенциал для оптимизации классических алгоритмов огромен.</p><p>В 2024 году исследователи из ЦЕРНа <a href="https://www.nature.com/articles/s41534-024-00859-0">предложили квантовый алгоритм</a>, который сокращает время сложных расчетов в 1000 раз при той же точности. Когда такие решения станут массовыми (прогноз — 2028-2030 годы), энергопотребление дата-центров может сократиться на 30-40%.</p><p>Государственное регулирование становится строже. В 2025 году в силу вступает EU Digital Product Passport — требование указывать углеродный след для всего ПО, продающегося в Европе.</p><p>Компании, которые не смогут предоставить эти данные, столкнутся с дополнительными налогами до 7% от оборота. В ответ на это крупнейшие IT-корпорации создали Carbon Neutral Software Alliance — консорциум по разработке единых стандартов измерения.</p><p>Не отстает и аппаратная часть. Производители чипов переходят на новые техпроцессы: TSMC анонсировала 2-нм процесс, который на 30% энергоэффективнее предыдущего поколения. А стартапы вроде британской ZeroPoint Technologies разрабатывают память с нулевым энергопотреблением в режиме ожидания — технология может сократить энергопотребление серверов на 15%.</p><p><b>Но главный тренд </b>— децентрализация вычислений. Edge-устройства (от смартфонов до промышленных датчиков) становятся мощнее и берут на себя часть нагрузки. Например, новый алгоритм Apple для обработки фото на iPhone 16 выполняет 90% операций локально, а не в облаке. По оценкам компании, это экономит сотни тысяч тонн CO₂ в год только для пользователей в США.</p><p>Однако остаются и <b>проблемы</b>. Бум генеративного ИИ привел к взрывному росту энергопотребления: одна тренировка модели Gemini Ultra потребляет столько же энергии, сколько небольшой город за месяц. OpenAI и Anthropic уже работают над более эффективными архитектурами, но прорыва пока не случилось.</p><p>В ближайшие 3-5 лет нас ждет:</p><ul><li>массовый переход на углеродно-нейтральные дата-центры — к 2027 году их доля превысит 60%;</li><li>внедрение AI-оптимизаторов кода, которые автоматически сокращают энергопотребление;</li><li>появление «зеленых» рейтингов для приложений — аналог энергоэффективности для бытовой техники.</li></ul><p>Компании, внедрившие принципы устойчивого развития в IT, уже в 2025 году получают на больше инвестиций и быстрее проходят аудит регуляторов. Экологичность перестала быть затратой — теперь это конкурентное преимущество.</p><p>Технологии будущего уже здесь. Вопрос в том, насколько быстро мы сможем их адаптировать. Как сказал Дженсен Хуанг из NVIDIA на последней конференции GTC:</p><blockquote>«Следующее десятилетие определит, станет ли IT частью климатического решения или останется проблемой. Выбор за нами».</blockquote><h2>Итоги</h2><p>Экологичность в IT — не благотворительность и не актуальная повестка, а реальная экономия. Плюс работа на перспективу. Оптимизация кода снижает счета за облака и повышает производительность.</p><p>С чего начать? Начните с малого:</p><ol><li>Запустите аудит через Cloud Carbon Footprint.</li><li>Уберите «мусор» из зависимостей.</li><li>Выберите хостинг с ВИЭ.</li></ol><p>Как говорил Дональд Кнут, автор книги «Искусство программирования»:</p><blockquote>«Преждевременная оптимизация — корень всех зол. Но и запоздалая — тоже».</blockquote><p>В 2025 году это актуально как никогда.</p>]]></content:encoded>
    </item>
  </channel>
</rss>