<?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/mikro</link>
    <atom:link href="https://tproger.ru/tag/mikro/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Fri, 23 Oct 2026 23:25:09 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>Как я написал AI-бота на aiogram 3 с помощью нейросетей, выжил при 2500+ пользователей и почему SQLite "всё ещё торт"</title>
      <link>https://tproger.ru/articles/kak-ya-napisal-ai-bota-na-aiogram-3-s-pomoshhyu-nejrosetej-vyzhil-p</link>
      <comments>https://tproger.ru/articles/kak-ya-napisal-ai-bota-na-aiogram-3-s-pomoshhyu-nejrosetej-vyzhil-p?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Нуя]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-napisal-ai-bota-na-aiogram-3-s-pomoshhyu-nejrosetej-vyzhil-p</guid>
      <description><![CDATA[<p>Технический кейс создания Telegram-бота Щёлк-ГДЗ (ИИ-репетитор по фото). Разбор архитектуры на Python (aiogram 3, aiosqlite), работы с API Gemini и решения проблем под нагрузкой 2500+ пользователей. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-napisal-ai-bota-na-aiogram-3-s-pomoshhyu-nejrosetej-vyzhil-p">Как я написал AI-бота на aiogram 3 с помощью нейросетей, выжил при 2500+ пользователей и почему SQLite "всё ещё торт"</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Flash]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Маркетинг]]></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>Sun, 26 Jul 2026 15:47:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>На дворе 2026 год. Очередной постмортем микро-SaaS'а в Телеге.</p><p>Без маркетинга и успешного успеха. Только боль, костыли и суровый прод! Мой пет-проект - бот «Щёлк-ГДЗ». Это ИИ-помощник, который решает школьные задачки по фоткам, видео, гс, тг-кружкам и PDF. Под капотом <b>Python 3.12.3</b>, <b>aiogram 3</b>, <b>aiosqlite</b>,<b> апи OpenRouter </b>(модель Gemini 3.0 Flash) и <b>Робокасса</b>. Крутится всё это на дешёвом VPS в Нидерландах. Держит 2500+ пользователей и не падает.</p><p>В этой статье расскажу, как за 9 месяцев построил логичную архитектуру, победил ошибку FloodWait при стриминге ответа ИИ и почему в условиях 1 гига RAM обычная SQLite - отличное решение.</p><h2>Нейронка вместо джуна и Уроборос багов</h2><p>Сразу признаюсь... С нуля я это не писал :) Синтаксис мне генерили LLM-ки. Начинал с Gemini 2.5 Pro, затем перешел на 3.0 Pro, а сейчас использую 3.1 Pro.</p><p>Многие думают, что нейронка сама напишет проект "под ключ", но это миф. Я <b>никогда </b>не доверял ИИ проектирование архитектуры и использовал его как продвинутый<i> StackOverflow</i> (скармливал конкретную задачу (например, написать SQL-миграцию) и получал кусок кода).</p><p><i>ИИ — это не архитектор, а джун на спидах. </i></p><p>Как только логика усложнялась - гемини ловил <b>«Уроборос багов»</b>. Кидаешь баг <b>А</b> - он его фиксит, но появляется ошибка <b>Б</b>. Скармливаешь и её - фиксит, но возвращается баг <b>А</b>. Цикл замкнулся. Лечилось только созданием новых чатов, в которые я кидал код и писал запросы типа "Найди критические ошибки, логические дыры и баги".</p><p>Про продуктовую логику нейронка вообще не слышала. В первой версии рефералки был баг, где любой(если его аккаунта ещё нет в БД) мог написать в конце ссылки что любые 9 цифр (<i>?start=1234567890</i>) и получить бонусы.</p><p>Также были ошибки с гонкой состояний при оплатах и активациях промокодов, которые тоже фиксил запросами в новые чаты с ИИ. Так я исправил около 20 архитектурных дыр.</p><h2>Немного про архитектуру.</h2><p>Чтобы код не превратился в нечитаемую лапшу на 5000 строк, я жестко разбил всё на модули. Архитектура бота выглядит так:</p><figure><img src="https://media.tproger.ru/user-uploads/139416/2026-07-08/dfc8dd70-365f-4f70-bbbf-2b00b503bef4.webp" alt="" /></figure><p><b>main.py</b> - это точка входа с настройкой логгеров, коннетами aiohttp и запуском APScheduler</p><p><b>database.py</b> - вся работа с БД</p><p><b>neiro.py</b> - логика общения с апи OpenRouter (стриминг, сжатие фоток через Pillow, JSON-контекст)</p><p><b>states.py</b> - классы состояний aiogram.fsm.state (например, PaymentProcess, GdzMode)</p><p><b>utils.py</b> - легковесные утилиты. Например лок пользователей (защита от спама запросами):</p><p>Хэндлеры вынесены в отдельную папку handlers/:</p><p><b>handlers/common_handlers.py</b> - главное меню с обработкой /start (рефералки, utm-метки).</p><p><b>handlers/gdz_handlers.py</b> - сам процесс ИИ-решения (вход в GdzMode, прием фото, видео, кружочков).</p><p><b>handlers/pay_handlers.py</b> - это логика платежей (Robokassa) и "Умная корзина".</p><p><b>handlers/tasks_handlers.py</b> - квесты (выдача премиума за подписку на каналы спонсоров).</p><p>Сборку интерфейсов вынес в <b>all_def.py</b>. Не люблю, когда в хэндлерах генерится полотно текста с кнопками. Там же лежат функции склонения слов (1 запрос, 2 запроса, 5 запросов). А в <b>settings.py </b>лежат списки с рандомными ответами бота, чтоб казался живым.</p><p>Так же в <b>settings.py</b> я сделал кэширование картинок, тоесть при первом запуске бот грузит фото меню как <b>BufferedInputFile</b>, сохраняет <b>file_id</b> от Телеграма и дальше шлет картинки моментально по ID. Сервак говорит спасибо за сэкономленный трафик)</p><p>В <b>handlers/common_handlers.py</b> находится первичная маршрутизация. Вот так обрабатываются рефералки, переходы с сайта, с рекламы и другое при старте:</p><h2>Диета по токенам</h2><p>Хранить бесконечную историю диалогов дорого и бессмысленно. В бесплатной версии храню <b>10 последних сообщений</b> (5 пар вопрос-ответ), а в преме — <b>30. </b></p><p>Но фотки весят большое кол-во токенов. Если премиум-юзер закинет 30 фоток, OpenRouter выставит мне огромный счет. В итоге я прикрутил ограничение: Из <b>30 сообщений</b> ИИ видит только <b>10 последних картинок. </b></p><p>Старые фотки тупо вырезаю из JSON. Подменяю на системный промпт:</p><p>С довольно неплохой моделью (gemini 3.0 flash) это работает как часы (она честно признается, что забыла картинку, а не выдумывает что-то из воздуха).</p><h2>Стриминг, FloodWait и защита баланса</h2><p>Чтобы бот не выглядел тормозом, я сделал стриминг ответа от ИИ в <b>neiro.py</b>. Я обновляю сообщение в Телеграме чанками по мере получения их от ОпенРоутера.</p><p>Но если делать <b>message.edit_text </b>слишком часто, ловишь <b>FloodWait</b>. В итоге я выставил интервал в 0.7 секунд и обернул всё в жесткий<b> try/except</b>:</p><p>Стрим при этом не прерывается. Поспали и погнали дальше :) Если на этапе обработки файла или стриминга падает критическая ошибка - честно возвращаю юзеру запрос на баланс.</p><p>В <b>handlers/gdz_handlers.py</b> это выглядит так:</p><h2>SQLite тащит</h2><p>Почему не <b>Postgre</b>? Потому что для микро-SaaS с 2,5к пользователей<b> SQLite</b> хватает за глаза. Но в асинхронной среде она любит кидать ошибку <b>database is locked</b>.</p><p>Чтобы этого избежать, я включил <b>WAL-режим</b> при инициализации пула, разделил коннекты на <b>db_writer</b> и <b>db_reader</b>, а сложные операции доверил самому <b>SQL</b>.</p><p>Например, 00:00 запускается крон-таска, которая собирает огромную аналитику, начисляет всем активным юзерам +1 ежедневный запрос и сбрасывает просроченные подписки. И это всё это работает атомарно внутри <b>database.py</b>:</p><h2>Умная корзина на APScheduler</h2><p>Когда дело дошло до монетизации, всплыли две проблемы:</p><p>Первая: юзер оплатил, но забыл нажать кнопку <b>«✅ Я оплатил»</b> в боте. Бот ждет, юзер ждет, товар не выдается, поддержка кипит.</p><p>Вторая: юзер сформировал счёт и передумал ("брошенная корзина").</p><p>Вместе с LLM я с нуля изучил <b>apscheduler </b>и убил двух зайцев фоновыми задачами. Теперь в <b>handlers/pay_handlers.py </b>при генерации ссылки на оплату я создаю две отложенные таски:</p><h4>Как это работает?</h4><p>Через 5 минут срабатывает <b>async def auto_check_payment()</b>, которая тихо стучится в робокассу. Если статус<b> success</b> - бот сам начисляет запросы на баланс и радует клиента. Если статус <b>pending</b> - таска умирает, и в дело вступает 30-минутная таска.</p><p>Но она не шлёт спам вслепую, а лезит в БД и проверяет 3 бизнес-правила:</p><p>1. <b>await db.has_successful_payment_recently</b> - Не купил ли он другой товар за последние 3 часа?</p><p>2. <b>await db.get_latest_invoice_id</b> - А это точно самый последний сгенерированный им счет?</p><p>3. <b>await db.can_send_agitation</b> - Не присылали ли мы ему агитацию недавно?</p><p>Если проверки пройдены, то юзер получает сообщение: <i>"⏳ Домашка сама себя не решит! Ты начал оформлять покупку, но оплата так и не прошла..."</i>. Это поднимает конверсию оплат.</p><h2>Финал</h2><p>Почему я не использую <b>Redis </b>для стейтов? Ответ банален: мой дешевый VPS имеет всего 1 гб оперативки. Пул <b>aiohttp</b>, In-Memory стейты и асинхронные таски и так жрут 70% RAM. Редис тупо не влезет.</p><p>Как говорится, <i>работает — не трогай.</i></p><p>Сейчас проект обзавелся сайтом-витриной и продолжает развиваться. В планах - искать и чинить новые баги. Перееду на более мощное железо, когда сервак начнет физически задыхаться.</p><p>Готов ответить на вопросы по архитектуре и послушать советы в комментариях \(^^)/</p><p><i>P.s. вот ссылка на первую статью о моём проекте: </i></p><p>P.s. Если кто-то хочет потестить вживую(не реклама), то юз бота в тг <a>@gdzshchelk_bot</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Скрытый сбой идемпотентности в финтех-системе: разбор инцидента</title>
      <link>https://tproger.ru/articles/skrytyj-sboj-idempotentnosti-v-finteh-sisteme-razbor-incidenta</link>
      <comments>https://tproger.ru/articles/skrytyj-sboj-idempotentnosti-v-finteh-sisteme-razbor-incidenta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Москалюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/skrytyj-sboj-idempotentnosti-v-finteh-sisteme-razbor-incidenta</guid>
      <description><![CDATA[<p>Разбор реального production-инцидента в финтех-системе: почему ошибка HTTP 500 не остановила операцию создания карты и как сбой идемпотентности в API Gateway вызвал массовые дубликаты. Практический кейс о микросервисной архитектуре, distributed systems, request-id, API idempotency и техническом долге.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/skrytyj-sboj-idempotentnosti-v-finteh-sisteme-razbor-incidenta">Скрытый сбой идемпотентности в финтех-системе: разбор инцидента</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Микросервисы]]></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[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[faq]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 18 May 2026 04:55:17 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как все началось</h2><p>Всё началось с безобидного, почти рутинного тикета в саппорт:</p><p><i>«У меня тут несколько одинаковых карт создалось. Я вроде один раз нажимал, а их штук пять висит в приложении». </i></p><p>Для финтеха подобная фраза — не мелкая UI-аномалия, а сигнал тревоги высшего уровня. Когда речь идёт о платёжных инструментах, дубль сущности мгновенно переходит из разряда «странностей» в категорию «полноценный инцидент».</p><p>Поначалу казалось, что это просто один случай. Но на самом деле, проблема уже какое-то время была, хоть и скрытно: люди получали дубликаты своих банковских карт, но массово на это никто не жаловался. На уровне первой линии поддержки это ошибочно классифицировали как пользовательские ошибки</p><p>Настоящий шум поднялся не внутри компании, а уже в соцсетях. Один из клиентов выложил пост. Там была фотография посылки, а в ней — примерно сотня одинаковых карт. Пост очень быстро стал популярным, и вот тогда-то и возникли проблемы с репутацией, а команда разработчиков только тогда и узнала о случившемся. И особенно тревожно это звучало на фоне того, что мы считали что таких проблем быть не может - ведь считалось, что у  нас глобальная идемпотентность на все запросы.</p><p>Мы начали разбираться. Стандартный мониторинг показывал норму: дашборды зелёные, в логах тихо, метрики CPU и памяти без отклонений. При этом в базе обнаруживались дубликаты, которых быть не должно. И только тогда, когда мы внимательно посмотрели на коммунальный API Gateway, то поняли что одно изменение от другой команды поменяло идемпотентность работы endpoint-а.</p><p>Проблема была структурно невидима для тех, кто находился ближе всего к ней. Отсутствие видимой проблемы не равно отсутствию риска — система просто ждала подходящего момента.</p><h2>Что произошло: хронология инцидента</h2><p>Архитектура была классической: Клиент → API Gateway → микросервисы,.</p><p>Сценарий развивался почти незаметно для стандартных средств наблюдения:</p><p>1. Фронтенд: Пользователь нажимает кнопку «Выпустить карту».</p><p>2. Gateway: Запрос начинает обрабатываться в API Gateway.</p><p>3. Микросервис по созданию карт: честно выполняет работу: создаёт запись в БД и возвращает `200 OK` в Gateway.</p><p>4. Новый микросервис: API Gateway вызывает новый микросервис и получает HTTP 500 в ответ от него. Исключение возникает уже после успешного вызова нашего микросервиса, и это ключевая точка разрыва: Gateway считает весь запрос неудавшимся, а ответ нашего микросервиса теряется.</p><p>5. Клиент: получает HTTP 500</p><p>6. Реакция: Пользователь видит красную плашку ошибки и логично решает: «Не сработало, пробую снова». Более того, с точки зрения протокола HTTP - запросы, в ответ на которые пришла ошибка HTTP 500, можно пытаться отправлять опять.</p><p>7. Петля: Микросервис, ничего не зная о судьбе предыдущих ответов, послушно создавал карту за картой.</p><p>Круг замкнулся. Эпидемия началась.</p><p>В компании такого уровня это не было предусмотрено. И это такая обидная ошибка.</p><h2>Как так получилось?</h2><p>Вскрылось ошибочное предположение:</p><p><i>«В API Gateway вызов микросервиса создания карт всегда идет последним». </i></p><p>Таким образом идемпотентность достигалась «формально» - ведь если создание карты завершалось с ошибкой - это точно означало что и вызов API Gateway тоже завершится с ошибкой. Сработало ложное чувство безопасности.</p><p>Ответ на вопрос “почему так было сделано?” очень простой - это было осознанное упрощение на старте. Все знали об этом, но задача на фикс потерялась в недрах бэклога на очень долгое время. Это классический пример того, как архитектурное допущение и отложенный рефакторинг годами живут в проде, пока их не вскрывает редкая последовательность отказов.-</p><h2>Что потребовалось изменить</h2><p>Пришлось в срочном порядке внедрять полноценный механизм идемпотентности по request-id, который не зависел бы от порядка вызова downstream-сервисов. И это было достаточно тяжело, потому что окно для легкого внедрения закрывается в первый день продакшена: до этого момента нет ни живых пользователей, ни накопленных данных, ни клиентов старых версий, с которыми нужно сохранять обратную совместимость. Ниже — ответы на вопросы, которые мы получили от коллег, когда разбирали этот инцидент.</p><h2>FAQ: Часто задаваемые вопросы</h2><p><b>1. Почему нельзя просто заблокировать кнопку на фронте?</b></p><p>Блокировка кнопки решает проблему только при стабильной сети. Если запрос ушёл, сервер создал сущность, но ответ потерялся — кнопка разблокируется по таймауту, и пользователь нажмёт снова. Это не устраняет корневую причину, а лишь слегка снижает вероятность дубля.</p><p><b>2. Чем идемпотентность отличается от дедупликации в БД?</b></p><p>Дедупликация через уникальные индексы защищает от дублей в хранилище, но не решает проблему сайд-эффектов: повторный запрос всё равно вызовет отправку SMS, печать банковской карты, генерацию событий в шине или списание средств. Идемпотентность гарантирует, что вся цепочка выполнится ровно один раз — включая все внешние вызовы и побочные действия.</p><p><b>3. Как долго хранить ключи идемпотентности?</b></p><p>На практике мы хранили ключи в основной базе данных без ограничения срока — затраты на хранение UUID по всем сущностям оказались небольшими. В общем случае минимальный срок зависит от конкретных сценариев использования — кому-то хватит и  часа, а кому-то нужна неделя. В любом случае, окна должно быть достаточно, чтобы покрыть сценарии, когда пользователь возвращается к повтору запроса, например, на следующий день или когда клиентское приложение автоматически перезапускает отложенные запросы после восстановления сети. Бессрочное хранение не обязательно, но слишком короткий TTL создаёт риск дублей при длительных сетевых проблемах.</p><p><b>4. Что делать со старыми клиентами, которые не шлют request_id?</b></p><p>Мы сделали несколько версий API для создания карт — под разные версии приложения. Для новых клиентов работала полноценная идемпотентность с клиентским ключом. Для старых версий приходилось принимать риски и генерировать request_id на стороне сервера. Альтернативой может быть хэширование payload запроса, но это менее надежно и сложнее: таймстемпы и случайные поля могут отличаться от вызова к вызову. Поэтому мы выбрали  подход с генерацией ключа на сервере для устаревших клиентов: риски дублей на переходный период оказались меньше, чем сложность поддержки двух схем валидации одновременно.</p><p><b>5. Обязательно ли делать идемпотентность для всех методов API?</b></p><p>Идемпотентность требуется только для методов, которые изменяют состояние системы — POST, PUT, PATCH и иногда DELETE. Методы чтения (GET, HEAD, OPTIONS) не изменяют данные, поэтому считаются идемпотентными по умолчанию.</p><p><b>6. Как понять, что в вашей системе уже есть скрытая проблема с дублями?</b></p><p>Лучший способ — ввести метрики превентивно, не дожидаясь жалоб пользователей. Отслеживайте количество повторных вызовов с одинаковым ключом идемпотентности и сравнивайте его с общим числом запросов. Если метрики уже показывают ненулевое значение — проблема есть, даже если внешне всё работает незаметно.</p><p>Если метрик ещё нет, вот три косвенных признака, которые помогут заподозрить неладное:</p><ul><li>В базе данных периодически появляются записи с одинаковым содержимым, созданные с разницей в несколько секунд.</li><li>Пользователи жалуются на дубликаты карт, заказов или платежей, но вы не можете воспроизвести проблему локально, списываете на то, что пользователи что-то делают не так</li><li>В логах API Gateway периодически всплывают HTTP 500 ошибки, но downstream-сервисы при этом отрабатывают успешно.</li></ul><p>Если заметили хотя бы один из этих симптомов — простого решения уже не будет. Однако остаётся возможность исправить ситуацию до того, как проблему заметят пользователи. В нашем случае дубли проявлялись редко и стали массовыми только при повышении нагрузки. Если отложить решение, скрытая проблема перейдет на уровень, где её последствия станут заметны снаружи и потребуют значительно больших усилий.</p><h2>Итог</h2><p>Главный урок, который мы вынесли: идемпотентность — это общая ответственность всех команд разработки, и поломать её может быть проще, чем кажется. А добавить в уже работающую систему быстро и дёшево — почти невозможно.</p><p>Метрик на всплески повторных запросов у нас не было. А зря — это самый дешёвый способ увидеть проблему до того, как она обрушит продакшен. Системы, спроектированные на 10% нагрузки, ломаются на 60% — и обычно это становится неожиданностью для команды.</p><h2>Практический чек-лист: что проверить в своей системе уже сегодня</h2><ul><li>Убедитесь, что все критические мутирующие эндпоинты поддерживают ключ идемпотентности.</li><li>Настройте алерты на аномальное количество запросов на создание сущностей от одного пользователя за короткий промежуток времени.</li><li>Проверьте, как ваш API Gateway обрабатывает ошибки — не теряет ли он ответы downstream-сервисов.</li><li>Убедитесь, что фронтенд корректно обрабатывает не только 200, но и 500, 502, 504, не провоцируя пользователя на повторные клики без необходимости.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Адаптация открытого симулятора InferSim для оценки загрузки промышленных GPU</title>
      <link>https://tproger.ru/articles/adaptaciya-otkrytogo-simulyatora-infersim-dlya-ocenki-zagruzki-prom</link>
      <comments>https://tproger.ru/articles/adaptaciya-otkrytogo-simulyatora-infersim-dlya-ocenki-zagruzki-prom?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Ходыкин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/adaptaciya-otkrytogo-simulyatora-infersim-dlya-ocenki-zagruzki-prom</guid>
      <description><![CDATA[<p>Рассказываем, как доработали симулятор InferSim от Alibaba: добавили поддержку новых GPU (включая MetaX C500), расширили список моделей с гибридными архитектурами и сделали визуализацию на Streamlit. Инструмент позволяет оценивать задержки и требуемую память без запуска реального инференса и помогает избежать грубых ошибок при планировании закупок оборудования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/adaptaciya-otkrytogo-simulyatora-infersim-dlya-ocenki-zagruzki-prom">Адаптация открытого симулятора InferSim для оценки загрузки промышленных GPU</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[MIT]]></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, 04 May 2026 08:09:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Планирование аппаратных ресурсов под обслуживание больших языковых моделей — задача с высоким порогом ошибки. Потратишь лишнего — получишь неоправданные расходы. Сэкономишь — столкнёшься с деградацией пользовательского опыта. На российском рынке, где доступ к современным ускорителям ограничен, эта задача становится особенно острой.</p><p>Мы остановились на открытом симуляторе InferSim от Alibaba. Он умеет считать TTFT, TPOT и пропускную способность без запуска реального инференса. Но из коробки поддерживает только несколько топовых GPU и фиксированный набор моделей — для наших сценариев этого было недостаточно. Пришлось дорабатывать.</p><p><b>Как устроен InferSim</b></p><p>В основе симулятора — двухфазная схема. Сначала на целевом железе запускаются микро-бенчмарки: измеряется реальная производительность на типовых операциях внимания и матричных умножениях. Получается таблица коэффициентов Model FLOPs Utilization (MFU) — сколько процентов от теоретического максимума выдаёт конкретная карта на конкретной операции. Затем, уже без доступа к GPU, симулятор на основе этих MFU и аналитической модели вычисляет задержки. Именно такой подход даёт более точные предсказания, чем оценка по паспортной пропускной способности памяти.</p><p><b>Добавляем своё железо</b></p><p>Первым делом мы внесли в hardware/gpu.py поддержку MetaX C500 64GB. Характеристики добавляются через dataclass-экземпляры:</p><p>После этого c500 попадает в словарь gpu_map, и симулятор запускается с ключом --device-type C500 --world-size 2. Значения FLOPS и пропускной способности пришлось оценивать по косвенным источникам — производитель не публикует точных цифр. Позже планируем уточнить их через бенчмаркинг на реальном оборудовании. Таким же способом добавили Nvidia 1xH100 и A100.</p><p><b>Конфигурация моделей и одна болезненная ошибка</b></p><p>Симулятор ожидает стандартный config.json в формате Hugging Face. Для Qwen3-32B подготовили файл qwen3_32b_config.json:</p><p>Ключевой момент — правильное значение head_dim. У Qwen3-32B оно равно hidden_size / num_attention_heads = 5120 / 64 = 80. У нас ушло некоторое время, чтобы понять, почему симулятор выдаёт невалидные результаты: изначально в конфиге стояло значение 128. Пока не исправили — KV-кеш переоценивался, и метрики улетали в неадекватные цифры. После исправления всё встало на свои места.</p><p>Позже добавили поддержку Qwen3.5‑9B с её гибридной архитектурой, построенной на чередовании Gated DeltaNet и Gated Attention. Главная особенность модели в том, что около трёх четвертей слоёв не создают привычного KV‑кеша, а используют линейное внимание – компактное скрытое состояние, которое лишь обновляется с каждым новым токеном, не увеличиваясь в объёме. Это кардинально снижает расход памяти на длинных контекстах, но привносит и свою цену: на коротких дистанциях такая модель проигрывает в скорости Prefill, потому что Gated DeltaNet работает последовательно и хуже утилизирует матричные вычисления GPU.</p><p>Симулятор изначально не умел различать слои двух типов и считал весь KV‑кеш одинаково. Чтобы поддержать Qwen3.5, пришлось доработать расчёт задержек в классе HybridModel: теперь он отдельно обсчитывает full‑attention‑слои с полным кешем и linear‑attention‑слои без кеша, используя параметры num_full_attn_layers и num_linear_attn_layers из конфигурации. В директорию проекта models добавили hybrid_model.py, в котором сделали дополнительные расчёты:</p><p>Без такой дифференциации симулятор для Qwen3.5‑9B показывал E2E порядка 2 500 секунд вместо реальных нескольких секунд – та ошибка, которую мы долго отлавливали.</p><p><b>Визуализация и эксплуатация</b></p><figure><img src="https://media.tproger.ru/user-uploads/137657/2026-04-30/d68ad2ca-cbc0-4fe3-a4af-2f082a55ecdf.webp" alt="" /><figcaption>Пользовательский интерфейс на Streamlit</figcaption></figure><p>Чтобы не разбирать каждый раз текстовый вывод InferSim, сделали веб-интерфейс на Streamlit. Симулятор дёргается через subprocess, результаты парсятся из stdout и визуализируются:</p><ul><li>тепловые карты задержек (Prefill, Decode, E2E Total) для разных длин входных и выходных токенов;</li><li>анализ RPS с расчётом требуемой параллельности и сравнением с доступной памятью;</li><li>информация о занятой памяти в формате «X ГБ из Y ГБ».</li></ul><p>Кэширование через @st.cache_data позволило избежать повторных запусков симуляции при неизменных параметрах. Интерфейс получился достаточно удобным, чтобы даже коллеги без погружения в командную строку могли осмысленно сравнивать конфигурации.</p><p>Приложение упаковано в Docker и лежит в репозитории на <a href="https://github.com/DmitriyKhodykin/InferSim" rel="nofollow">GitHub</a>. Сервисы — сам Streamlit и Nginx в качестве обратного прокси с SSL-терминацией и базовой HTTP-аутентификацией. Деплой на VDS автоматизирован через GitHub Actions: собрали образ, отправили на сервер, перезапустили контейнеры. SSL-сертификаты Let's Encrypt обновляются по cron.</p><p><b>Что в итоге</b></p><p>Адаптированный InferSim не претендует на абсолютную точность — она ограничена качеством бенчмарков и коэффициентов MFU. Но инструмент позволяет избежать грубых ошибок при планировании, что в условиях ограниченного доступа к GPU и их высокой стоимости само по себе немало. Мы продолжаем калибровку симулятора и готовим обновлённые конфигурации для следующих моделей.</p><p>Репозиторий проекта открыт, будем рады замечаниям и предложениям от тех, кто решает схожие задачи.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ученые создали автономных микророботов размером с бактерию и ценой $0,01</title>
      <link>https://tproger.ru/news/uchenye-sozdali-avtonomnyh-mikrorobotov-razmerom-s-bakteriyu</link>
      <comments>https://tproger.ru/news/uchenye-sozdali-avtonomnyh-mikrorobotov-razmerom-s-bakteriyu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/uchenye-sozdali-avtonomnyh-mikrorobotov-razmerom-s-bakteriyu</guid>
      <description><![CDATA[<p>Ученые из США создали автономных микророботов размером с бактерию. Они плавают за счет ионной тяги, питаются светом и стоят около одного цента</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/uchenye-sozdali-avtonomnyh-mikrorobotov-razmerom-s-bakteriyu">Ученые создали автономных микророботов размером с бактерию и ценой $0,01</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Роботы]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Процессор]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Dec 2025 08:34:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>Исследователи из <b>University of Pennsylvania</b> и <b>University of Michigan</b> <a href="https://www.tomshardware.com/maker-stem/robot-kits/worlds-smallest-fully-programmable-autonomous-robots-are-smaller-than-a-grain-of-salt-cost-one-penny-apiece-researchers-expect-new-micron-scale-robots-to-be-used-in-medicine-microscale-manufacturing-and-other-areas">представили</a> автономных микророботов, которые <b>по размеру сопоставимы с бактериями</b>.</p><p>По словам авторов проекта, это самые маленькие полностью программируемые и автономные роботы, созданные на сегодняшний день. Каждый из них <b>стоит всего около $0,01</b>, что делает технологию потенциально отлично масштабируемой.</p><p>Разработчики рассчитывают, что такие микророботы найдут применение в медицине, микро-производстве и научных исследованиях, где обычные механические системы либо слишком крупные, либо слишком хрупкие.</p><h2>Как они устроены и почему у них нет «ног»</h2><p>Физическую часть роботов разработала команда <b>Penn Engineering</b>. Размер каждого устройства — примерно <b>200 × 300 × 50 микрометров</b>.</p><p>На таком масштабе привычные инженерные подходы перестают работать: трение и вязкость среды начинают доминировать, а любые движущиеся части становятся ненадежными.</p><p>Поэтому ученые отказались от механических элементов и придумали новую систему движения.</p><p>Роботы «плавают» за счет ионной тяги. То есть они буквально создают электрическое поле, которое сдвигает ионы в окружающей жидкости.</p><p>Меняя параметры этого поля, микророботы могут двигаться по сложным траекториям и даже координироваться друг с другом. Отсутствие движущихся частей делает их удивительно прочными — их можно поднимать микропипеткой без повреждений.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-29/d1898f37-0575-4ed6-a1b9-1a9239b80f44.jpeg" alt="" /></figure><h2>Питание от света и микроскопическая электроника</h2><p>Еще одна сложность — питание. Чтобы решить эту проблему, инженеры сделали ставку на солнечную энергию.</p><p>Фотоэлементы занимают большую часть поверхности робота, но даже при этом <b>вырабатывают всего около 75 нановатт</b>. Это наложило жесткие требования на энергоэффективность всей системы.</p><p>«Мозг» роботов разработала команда из Мичигана. Внутри — сверхэффективный процессор, память и сенсоры. Программирование происходит с помощью световых импульсов, которые одновременно служат и источником энергии.</p><p>Для передачи данных обратно, роботы используют необычный метод: они выполняют движения, напоминающие «виляющий танец» пчел, который считывается внешними системами.</p><h2>Зачем нужны такие микророботы</h2><p>Роботов можно запускать сотнями одновременно. Они способны работать автономно в течение месяцев, а набор сенсоров легко менять под конкретную задачу — в первых тестах использовался датчик температуры.</p>]]></content:encoded>
    </item>
    <item>
      <title>Энтузиаст поднял веб-сервер… на одноразовом вейпе</title>
      <link>https://tproger.ru/news/entuziast-podnyal-veb-server--na-odnorazovoj-vejpe</link>
      <comments>https://tproger.ru/news/entuziast-podnyal-veb-server--na-odnorazovoj-vejpe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/entuziast-podnyal-veb-server--na-odnorazovoj-vejpe</guid>
      <description><![CDATA[<p>Энтузиаст запустил веб-сервер на одноразовом вейпе: ARM Cortex-M0+ с 3 КБ ОЗУ поднял TCP/IP, HTTP и JSON-ответы без Wi-Fi и Ethernet</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/entuziast-podnyal-veb-server--na-odnorazovoj-vejpe">Энтузиаст поднял веб-сервер… на одноразовом вейпе</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Wi-Fi]]></category>
      <category><![CDATA[ARM]]></category>
      <category><![CDATA[TCP/IP]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Sep 2025 04:52:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Энтузиаст под ником BogdanTheGeek <a href="https://bogdanthegeek.github.io/blog/projects/vapeserver/">запустил</a> полноценный HTTP-сервер на микроконтроллере из одноразового вейпа. Причем сервер умеет обслуживать страницы, обрабатывать запросы и даже возвращает JSON-ответы.</p><p>Все это — на чипе с 3 КБ оперативной и 24 КБ флеш-памяти, без сетевого интерфейса, Wi-Fi или Ethernet.</p><h2>Откуда там вообще чип?</h2><p>Автор проекта рассказывает, что давно коллекционировал одноразовые вейпы, но со временем устройства начали попадаться с куда более интересной начинкой.</p><p>Вместо обычного черного эпоксидного «блоба» он обнаружил маркированный микроконтроллер PUYA C642F15, позже идентифицированный как PY32F002B с ARM Cortex-M0+ частотой 24 МГц.</p><p>Вейпы, по сути, оказались носителями полностью программируемых микроконтроллеров.</p><h2>Как он вывел это в сеть?</h2><p>Wi-Fi, Ethernet или даже Bluetooth в таких устройствах, разумеется, нет. Но автор воспользовался семихостингом — механизмом отладки, при котором отладчик может отправлять и принимать данные через подключенный JTAG/SWD интерфейс.</p><p>Далее он применил довольно хакерское решение: использовал pyOCD для создания telnet-порта с выходом семихостинга, затем через socat пробросил это в виртуальное TTY-устройство, поверх него поднял SLIP (Serial Line Internet Protocol). Да, тот самый, из эпохи dial-up.</p><p>После этого на Linux можно было поднять IP-интерфейс sl0 и назначить IP-адрес — теперь микроконтроллер был виден как узел локальной сети.</p><h2>А веб-сервер?</h2><p>В качестве TCP/IP-стека был выбран uIP — крайне легкий вариант от Contiki OS, специально рассчитанный на 8- и 16-битные микроконтроллеры.</p><p>Он же включает в себя минимальный HTTP-сервер. После небольшой адаптации под семихостинг и исправления проблем с выравниванием памяти на ARM все заработало.</p><p>Причем не просто «заработало», а заработало удивительно быстро: после оптимизации буферов и избавления от побайтной передачи, RTT упали до 20 мс, а загрузка страницы — до 160 мс.</p><p>Несмотря на сверхограниченные ресурсы (всего 3 КБ RAM, из которых почти половина уже занята сервером), автор сумел:</p><ul><li>организовать буферизацию и кольцевой буфер;</li><li>запустить TCP/IP-стек и веб-сервер;</li><li>реализовать подсчет посещений и возврат JSON-ответов;</li><li>полностью уместить все в оставшиеся ~20КБ флеша.</li></ul><p>Он даже добавил простую статистику: уникальный ID микроконтроллера и количество посещений со времени последнего «краша».</p><h2>Зачем это все?</h2><p>Как отмечает сам автор, цель была не в создании полезного веб-сервера, а в демонстрации возможностей предельно скромного «железа», которое в обычной жизни просто выбрасывается.</p><p>Иными словами — это искусство, хакерская эстетика и демонстрация инженерной изобретательности.</p>]]></content:encoded>
    </item>
    <item>
      <title>Максимально простое объяснение устройства микрофронтендов</title>
      <link>https://tproger.ru/articles/maksimalno-prostoe-obyasnenie-ustrojstva-mikrofrontendov</link>
      <comments>https://tproger.ru/articles/maksimalno-prostoe-obyasnenie-ustrojstva-mikrofrontendov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/maksimalno-prostoe-obyasnenie-ustrojstva-mikrofrontendov</guid>
      <description><![CDATA[<p>Что такое микрофронтенды простыми словами. Объясняем на примерах, что это такое и как используется.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/maksimalno-prostoe-obyasnenie-ustrojstva-mikrofrontendov">Максимально простое объяснение устройства микрофронтендов</a>»</p>]]></description>
      <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>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 27 Aug 2025 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Микрофронтенды</b> – это подход к разработке пользовательских интерфейсов, при котором фронтенд большого веб-приложения разбивается на набор небольших независимых приложений (модулей). По сути, это аналог концепции микросервисов,. Вместо одного монолитного клиентского приложения, весь интерфейс составляется из нескольких отдельных частей, каждая из которых автономно разрабатывается и деплоится.</p><p>Для конечного пользователя сайт выглядит как единое целое, хотя на деле это несколько сшитых друг с другом сайтов, интегрированных друг с другом. Каждый такой фрагмент отвечает за свою область функциональности (например, поиск, личный кабинет, страница товаров ) и может развиваться независимо от других. Эти мини приложения могут быть созданы на разных технологиях и фреймворках, общаться через чётко определённые интерфейсы. Вместе они образуют клиентское приложение для работы. Так как отдельные части фронта независимы друг от друга, то сбой или изменение в одном модуле не выводит из строя весь сайт.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-25/a9bb5228-5882-4ca1-95b8-00bee52cbd5b.png" alt="" /></figure><p>Пример Spotify, каждый раздел — это отдельные автономные приложения, склеенные в одном клиентском интерфейсе.</p><p>Рассмотрим такой подход с позиции менеджмента и разработки.</p><h2>Разработка веб-приложения</h2><p>Разберем особенности разработки веб-приложения с микрофронтендным подходом, узнаем, стоит ли продвигать его в своей работе.</p><h3>Проект придётся сшивать из отдельных частей</h3><p>Каждый микрофронтенд — это автономный проект с отдельным репозиторием и командой, что даёт гибкость в разработке и упрощает понимание кодовой базы той части, над которой предлагается работать. Но такой подход вынуждает постоянно согласовывать интеграции с другими командами, а ещё не факт, что в компании будет человек, который знает, как функционируют отдельные части. Если такого человека нет или он был и пропал, то разбираться придётся самостоятельно, а вникать в чужой код всегда долго и больно. Помочь избежать bus factor может хорошо составленная документация, а также соблюдение стандартов написания кода, единые для всех команд.</p><blockquote>Важно, что один из узлов должен отвечать за сбор как раз всех микрофронтендов и отображении их пользователю.</blockquote><h2>В проекте можно будет экспериментировать</h2><p>В микрофронтендах каждая команда может выбирать <a href="https://micro-frontends.org/">свой стек</a> под отдельные задачи — React, Vue, Angular или всё, что душе угодно . Это позволяет экспериментировать и постепенно внедрять новые технологии, не переписывая монолит. Но такая свобода — палка о двух концах: без строгих соглашений дизайн и UX могут стать разрозненными, а при запуске страницы — нагрузка дублирующихся библиотек будет бить по производительности.</p><p>Но всё-таки это даёт возможность разрабатывать и внедрять новые технологии и практики, независимо от легаси кода. Например, если приелось делать фронтенд на React, то отдельный компонент можно реализовать на Vue. Или, если в будущем существующие библиотеки будут неконкурентоспособны, не надо будет переделывать весь проект, а только проблемные компоненты.</p><h3>Проект будет сложнее деплоить</h3><p>Миркофронтендный подход позволяет разделить процесс разработки отдельных компонентов сайта, как и контроль версий каждого из них, для каждого большого компонента свой репозиторий и свой пайплайн деплоя. Например, если в проекте перестал работать поиск из-за бага на проде, откатывать надо будет только сервис поиска, а не весь проект.</p><p>Однако настройка CI/CD для множества микрофронтендов — это сотни конвейеров, репозиториев и интеграций, которые нужно синхронизировать и контролировать, что особенно тяжело для DevOps-инженеров, которым вместо того, чтобы один раз настроить пайплайн развёртывания для фронта, придётся делать это для каждой его части. К тому же добавляется ещё один этап развёртывания проекта - сбор фронтенда, под который нужно будет прописывать свои правила сборки.</p><h2>Как применять в проекте</h2><p>Для разработки сервисов на базе микрофронтендов есть несколько инструментов, основная задача которых отдельно рендерить компоненты и собирать их в единое приложение.</p><blockquote>Важно заранее предусмотреть падение одного из микрофронтендов и то как это обрабатывать, чтобы для пользователя это всё было единым и всегда стабильным сайтом.</blockquote><h3>Webpack Module Federation</h3><p>Module Federation — механизм, встроенный в Webpack 5, который позволяет одному фронтенду (host) динамически загружать модули из другого фронтенда (remote) во время выполнения. Это мощный инструмент для интеграции микрофронтендов: он поддерживает разделение кода, кэширование, совместное использование зависимостей (например, React или Vue) и независимую доставку каждого модуля. Module Federation работает без необходимости использовать iframe или перекомпиляции.</p><p><a href="https://webpack.js.org/concepts/module-federation/">Инструкция по использованию</a></p><h2>Менеджмент</h2><p>Рассмотрим особенности управления разработкой веб-приложения с микрофронтендным подходом, чтобы понять, когда имеет смысл использовать его подход для своих идей.</p><h2>Один проект превращается во множество</h2><p>Каждая часть интерфейса создаётся и поддерживается своей командой, нередко на разных технологиях, с собственным пайплайном, своим графиком релизов и приоритетами. С одной стороны, это ускоряет разработку, позволяет нанимать команды под конкретные зоны ответственности и гибко распределять ресурсы. С другой — мы получаем систему, собранную из разрозненных команд, где с ростом количества составляющих системы, придётся всё больше ресурсов тратить организацию разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-25/a804f4ab-b214-43a2-a07a-c97eb11ed4f4.png" alt="" /></figure><p>Конечное единое веб-приложение представляет собой склейку результатов работы нескольких независимо рендерящихся компонентов, каждый из которых может иметь свой бэк и по факту быть полностью независимым.</p><h3>Команды будут независимы  друг от друга</h3><p>Микрофронтенды позволяют разделить команды, которые параллельно разрабатывают свои компоненты отвечающие за работу ключевых функции. Такой подход повышает мотивацию, людям проще видеть результаты своего труда: они меньше от него отчуждены разбиение на маленькие команды позволяет бороться с <a href="https://ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%A0%D0%B8%D0%BD%D0%B3%D0%B5%D0%BB%D1%8C%D0%BC%D0%B0%D0%BD%D0%B0">эффектом Рингельмана</a> по мере роста команды. Но автономия  — это и изоляция: одна команда может принять техническое решение, которое затрудняет интеграцию с другими, а синхронизация между командами требует постоянных митов, созвонов или сотен сообщений.</p><p>Управлять несколькими созависимыми подразделениями сложнее, чем вести один проект с централизованным контролем.К тому же, если у одной из команд ушёл разраб, заменить его разрабом из другой не получится, технологии разные и навыки тоже.</p><h3>Команды получают поле для удачных и не очень экспериментов</h3><p>Команды могут внедрять новые технологии, не дожидаясь переписывания всего приложения: один микрофронтенд можно сделать на React, другой — на Vue или Svelte. Это даёт гибкость в найме, миграциях и экспериментах. Но чем больше технологий используется, тем сложнее следить за их использованием и труднее помнить их особенности.</p><p>В какой-то момент менеджер вместо одной технологической карты управляет целой экосистемой со своими внутренними правилами.</p><h3>Появляются FrontOps</h3><p>Микрофронтенды требуют дополнительных усилий по настройке и деплою, для этого понадобится расширять команду DevOps. Эта команда может расширяться настолько, что внутри неё придется выделить подгруппу DevOps, которая будут заниматься исключительно деплоем фронтов — называться они будут FrontOps.</p><h2>Вывод</h2><p>Микрофронтенды — это в первую очередь инструмент для масштабирования разработки. Если приложение действительно большое, команды автономны, а новые фичи выходят каждую неделю, разделение фронтенда на независимые модули ускорит релизы, снизит риски и позволит гибко внедрять технологии.</p><p>Однако мутант из разнородных сервисов быстро становится неуправляемым, если нет четкой и структурированной организации внутри его частей. Выбирайте микрофронтенды, когда бизнес‑скорость важнее архитектурной простоты, и у вас есть настроенная DevOps-инфраструктура. В остальных случаях монолит с хорошей модуляризацией и монорепозиторием может оказаться дешевле и надёжнее.</p><p>Синьор-фронтендер из ВК Маргарита Лукина, автор телеграм-канала <a href="https://t.me/frontend_kitchen">«Фронтенд кухня»</a> отмечает, что микрофронты — не всегда удачное решение:</p><p>«Микрофронтенды — хорошее решение, если команды действительно автономны. Я видела примеры, когда проект разделяли на микрофронтенды, но при этом одно приложение зависело от другого: чтобы добавить фичу, необходимо было делать изменения сначала в одном месте, а затем в другом. Это — верный знак, что что-то пошло не так: в этом случае процесс разработки усложнится, а сроки затянутся. Прежде чем переходить на микрофронтенды, попробуйте логически разделить ваш проект по директориям и убедиться, что для изменения одной фичи в проекте приходится редактировать код только в одной директории. Следующим шагом можно переходить на микрофронтенды».</p><p>Делитесь своим опытом работы с микрофронтендами в комментариях и не забывайте сохранять наши статьи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик изучал систему рекомендаций Netflix месяцами. Вот что скрывается внутри</title>
      <link>https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri</link>
      <comments>https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri</guid>
      <description><![CDATA[<p>Разработчик изучил рекомендательную систему Netflix: как алгоритмы и инфраструктура персонализируют контент и удерживают зрителей</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri">Разработчик изучал систему рекомендаций Netflix месяцами. Вот что скрывается внутри</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 14 Aug 2025 03:48:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Путь Netflix от сервиса проката DVD к стриминговому гиганту — это история о том, как данные превратились в главный актив компании.</p><p>Сегодня их рекомендательная система экономит более $1 млрд в год, удерживая подписчиков и увеличивая время просмотра. И именно ее решил <a href="https://beyondit.blog/blogs/Inside-Netflixs-1-Billion-Algorithm">изучить</a> разработчик на платформе BeyondIT.</p><p>В основе персонализации — анализ каждого клика, паузы, поиска и жанровых предпочтений. Алгоритм строит уникальный «профиль зрителя» и превращает библиотеку из тысяч фильмов в персональную витрину.</p><p>Такой подход помогает избежать «паралича выбора» и быстрее находить интересный контент.</p><h2>Сердце системы — матричная факторизация</h2><p>Ключевая технология, популяризованная ещё во времена конкурса Netflix Prize в 2006 году — матричная факторизация.</p><p>Она превращает гигантскую и разреженную таблицу «пользователь — фильм» в два компактных набора «скрытых факторов»: вкусов пользователя и характеристик фильмов.</p><p>Перемножив их, алгоритм предсказывает оценку, даже если зритель ещё не видел конкретный фильм. Обучение идёт методом стохастического градиентного спуска, с учётом смещений (bias terms) и регуляризации, чтобы модель не переобучалась.</p><h2>Больше, чем просто «похожие на вас»</h2><p>Современный Netflix учитывает десятки сигналов: от истории просмотров и пропусков до времени суток, устройства, локальных трендов и намерений поиска.</p><p>Интерфейс и обложки фильмов постоянно проходят A/B-тесты, чтобы максимизировать вовлечённость.</p><p>Помимо классического коллаборативного фильтра, используются модели глубокого обучения, такие как Neural Collaborative Filtering, способные находить сложные, нелинейные зависимости, и мультизадачное обучение.</p><p>Это нужно для баланса между точностью, разнообразием и новизной рекомендаций.</p><h2>Реакция в реальном времени</h2><p>Предпочтения меняются и Netflix реагирует на них за миллисекунды. Платформа а реальном времени обрабатывает миллионы событий в секунду, обновляя рекомендации на лету.</p><p>Инфраструктура включает Kafka, Spark, микросервисы в AWS, кэширование в памяти и edge-вычисления для минимальной задержки.</p><h2>Почему это важно</h2><p>Такой масштаб требует устойчивости, низкой задержки и отказоустойчивости. Рекомендательная система Netflix — это не только алгоритмы, но и мощная инженерная экосистема, в которой даже хэш-таблицы играют ключевую роль для мгновенного доступа к данным.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как 5-минутная привычка спасает разработчиков от выгорания</title>
      <link>https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya</link>
      <comments>https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya</guid>
      <description><![CDATA[<p>Что делать, если хочется бросить программирование? Разбираем, как выгорание подкрадывается к разработчикам, почему одна 5-минутная привычка может вернуть интерес к коду и почему не надо гнаться за продуктивностью, чтобы остаться в профессии.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya">Как 5-минутная привычка спасает разработчиков от выгорания</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Discord]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 Aug 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Выгорание в ИТ — не редкость. Оно подкрадывается незаметно: пет-проекты забрасываются, открывать редактор кода по выходным становится тяжело, даже чтение о новых технологиях вызывает усталость. В какой-то момент программирование, которое когда-то приносило радость, превращается в рутину. Для многих разработчиков это становится точкой, где проще уйти, чем продолжать.</p><p>Но что, если вместо ухода попробовать минимальное действие? Пятиминутная ежедневная привычка может стать спасением, вернув интерес к профессии без радикальных перемен. Поговорим о том, как выгорание захватывает разработчиков, почему бросить кажется легче, чем исправить, и как одна простая практика помогает восстановить связь с программированием.</p><p><i>P.s. Это <a href="https://medium.com/devlink-tips/burned-out-done-ready-to-quit-coding-but-a-5-minute-habit-changed-everything-a9fc77ab1a7b">перевод</a> зарубежной статьи. Предлагаем подискутировать о вопросе в комментариях.</i></p><h2>Как выгорание подкрадывается к разработчикам</h2><p>Через несколько месяцев после того, как вы почувствуете усталость, console.log() начнет казаться непосильной задачей, а баг, который обычно исправлялся за час, ломает изнутри.</p><p>Так выгорание медленно вытесняет любопытство апатией. Разработчик уже не испытывает злости, он просто устает. Становится проще уйти, чем продолжать.</p><p>И статистика это подтверждает: по данным Stack Overflow, 32% разработчиков несчастны на работе, а еще 47% выживают на автомате, не чувствуя вовлеченности. Это значит, что почти 80% специалистов находятся в зоне риска эмоционального выгорания, хотя снаружи всё выглядит стабильно.</p><p>Даже автоматическая генерация кода с помощью ИИ не помогает вернуть интерес: код продолжает работать, но человек — нет. В какой-то момент уход из профессии начинает казаться логичным выходом.</p><p>Но есть и другой путь. Иногда достаточно вернуть в день всего пять минут программирования без давления и ожиданий, чтобы постепенно вернуть ритм и интерес к работе. Маленькая привычка становится якорем, который помогает вспомнить, зачем всё это начиналось, и даёт пространство для восстановления.</p><h2>Пятиминутная привычка, которая меняет всё</h2><p>Чтобы преодолеть выгорание, не нужно переворачивать жизнь с ног на голову. Достаточно одной маленькой привычки — пяти минут в день, посвященных программированию без давления и ожиданий. Это может быть что угодно: написание нескольких строк кода, разбор простого алгоритма или чтение документации. Главное — последовательность.</p><p>Формула успеха звучит так: <b>Минимальные усилия → Последовательность → Идентичность → Восстановление связи</b>. Начав с малого, можно постепенно вернуть уверенность и интерес к профессии.</p><p><b>Как работает эта практика:</b></p><ol><li>Выберите простое действие: например, написать одну функцию или изучить один метод в документации.</li><li>Установите таймер на 5 минут: это снижает порог входа и делает задачу необременительной.</li><li>Делайте это каждый день: даже если результат минимален, регулярность формирует привычку.</li><li>Не ждите вдохновения: действие само по себе создает мотивацию.</li></ol><p>Микро-привычки эффективны, потому что опираются на принцип «атомарных изменений», описанный Джеймсом Клиром в книге «Атомные привычки». Маленькие действия требуют минимальной энергии, но со временем накапливаются, формируя новую идентичность. Для разработчика это означает переход от «я устал от кода» к «я человек, который каждый день делает шаг в программировании».</p><p>Исследования показывают, что регулярные небольшие усилия укрепляют нейронные связи, связанные с выполнением задачи, и снижают сопротивление к действию. Это особенно важно при выгорании, когда даже открытие редактора кода кажется неподъемным.</p><h2>Как вернуться к программированию и не выгореть снова</h2><p>Если хочется вернуться к программированию без риска снова выгореть, помогут простые принципы:</p><p><b>Опустите планку — и опустите её ещё раз. </b>Если на старт уходит больше минуты, задача слишком сложная.</p><p><b>Не отслеживайте результат.</b> Никаких счётчиков строк, коммитов и диаграмм продуктивности. Задача — восстановить доверие к себе, а не нарастить темп.</p><p><b>Избавьтесь от чувства вины</b>. Пропустили день? Не страшно. Один пропуск не должен превращаться в цикл стыда. Выход из выгорания — не марафон продуктивности.</p><p><b>Не ставьте цели слишком рано.</b> Позвольте любопытству проявиться. Работайте над чем-то странным или бесполезным. Там чаще всего и прячется вся соль.</p><p><b>Празднуйте даже маленький прогресс.</b> Открыли редактор — уже успех. Написали одну строку — отлично. Задача не в том, чтобы действовать как машина, а в том, чтобы снова почувствовать себя разработчиком.</p><h3>Инструменты и ресурсы для тех, кто выгорел и не знает, что с этим делать</h3><ul><li>Книги: «Атомные привычки» Джеймса Клира для понимания силы маленьких шагов.</li><li>Курсы: платформы вроде Codecademy или freeCodeCamp для легкого возвращения к основам.</li><li>Сообщества: нишевые Discord-серверы (например, по Python или Rust) или Reddit (r/learnprogramming).</li><li>Трекеры привычек: приложения вроде Habitica для отслеживания прогресса.</li></ul><h2>Вместо итогов</h2><p>Если однажды показалось, что с программированием покончено, и появилось желание уйти, важно помнить: вы не одиноки.</p><p>Многие разработчики знают, каково это — смотреть на редактор и не чувствовать ничего. И знают, сколько смелости требует простой шаг: попробовать снова.</p><p>Если вы уже прошли через это или проходите сейчас, расскажите, что помогло вернуться к работе. Какая привычка или маленькое изменение сыграли решающую роль? Если ответа пока нет — это тоже нормально.</p><p>Иногда именно пять минут дают больше, чем любой лайфхак продуктивности.</p><h2>Бонус от экспертов: как пережить выгорание и вернуться к работе</h2><p>Если вы узнаёте себя в описании из статьи — не переживайте, вы не одиноки. Мы попросили двух экспертов из индустрии поделиться личным опытом: как они справлялись с выгоранием, что для них сработало и какие вопросы помогают себе задать в непростые периоды.</p><p><i>Елизавета Якушева, тестировщик, автор тг-канала</i> <a href="https://t.me/izzalypu">Press F to Debug</a>:</p><blockquote>Для меня выгорание — самая большая и страшная проблема в карьере. Абсолютно всё зависит от неправильно выстроенных ожиданий</blockquote><p>Елизавета выделяет два разных типа выгорания:</p><ol><li>От самой работы — стресс, рутина, груз ответственности.</li><li>От постоянной учёбы и самосовершенствования — давление трендов, ощущение собственной «недостаточности», переизбыток бесполезной информации.</li></ol><p>На её взгляд, большинство советов работают только в рамках «программирования для себя», но они не решают главного — внутренней мотивации.</p><p>Чтобы справиться, она предлагает задать себе простой, но важный вопрос:</p><p>«<i>Зачем я это делаю? Что будет, если я перестану?</i>»</p><blockquote>Мы ходим на работу, чтобы получать деньги. Без этого мы не можем оплатить свои счета за ипотеку или продукты.<br /><br />Стресс от груза ответственности решается простой мыслью:
"Я здесь, чтобы выполнять работу так, как могу. Если я не успеваю что-то сделать вовремя, я умираю, у меня температура под 40, у меня отвалилась нога — вселенная не остановится, если ты возьмёшь тайм-аут в виде отпуска или day-off. Ракета не полетит в космос, и никто глобально не умрёт."</blockquote><p>Для пет-проектов помогает осознанность: понимание, зачем ты вообще этим занимаешься.</p><blockquote>Я веду образовательный ютуб-канал, чтобы люди могли узнать что-то новое и разобраться в сложной теме. Мне важно, чтобы человек нашёл своё комьюнити и мог прийти куда-то за советом. Мысль о глобальной помощи другим вдохновляет меня даже в самые тёмные моменты</blockquote><p><i>Анастасия Егорова, фронтенд-разработчик, автор канала «</i><a href="https://t.me/CosyFrontendNastia">Код и кофе</a><i>»:</i></p><p>Анастасия комментирует технику «5-минутных привычек», описанную в оригинальной статье, и делится, как адаптировала её под свой сложный ритм:</p><blockquote>У меня был период жизни, когда я полтора года работала на двух фуллтайм-работах… Иногда, просыпаясь зимним утром в 6:45, чтобы выйти на удалённый созвон в 7:00, я думала, что больше всего хочу уволиться со второй работы. Но нужно было работать.</blockquote><p>В такие моменты она договаривалась с собой: поработать всего 5 минут, а потом дать себе что-то приятное — сериал, эклер, отдых.</p><blockquote>Где-то на второй–третьей пятиминутке меня затягивало, и 5 минут превращались в полноценный час-два работы без переключения. Несколько таких подходов в течение дня — и к вечеру работа была сделана, а иногда ещё и сварен борщ, и приготовлены котлетки.</blockquote><p>Да, бывают и провальные дни — но даже тогда, по её словам, важно просто не бросить всё совсем.</p><blockquote>Я реально работала 5 минут, а потом 10 минут отдыхала… и к концу дня с помощью этих пятиминуток было сделано не так много. В такие дни я просто от себя отставала, радовалась, что я сделала хотя бы эти пятиминутные задачи, а не прокрастинировала весь день.</blockquote><p>Возможно, этот подход поможет и вам — особенно в моменты, когда ощущение выгорания слишком близко.</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему никто не читает пользовательские соглашения и что вы пропускаете: чем опасна цифровая слепота в 2025 году</title>
      <link>https://tproger.ru/articles/pochemu-nikto-ne-chitaet-polzovatelskie-soglaweniya-i-chto-vy-propuskaete--chem-opasna-cifrovaya-slepota-v-2025-godu</link>
      <comments>https://tproger.ru/articles/pochemu-nikto-ne-chitaet-polzovatelskie-soglaweniya-i-chto-vy-propuskaete--chem-opasna-cifrovaya-slepota-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-nikto-ne-chitaet-polzovatelskie-soglaweniya-i-chto-vy-propuskaete--chem-opasna-cifrovaya-slepota-v-2025-godu</guid>
      <description><![CDATA[<p>95% россиян принимают соглашения без чтения — узнайте, какие риски скрывают длинные тексты: от скрытого сбора данных до потери прав на контент. 🔒 Анализ UX-ловушек, опасных пунктов в документах VK, Яндекса и Ozon, и новые законы РФ. Практические советы: как защитить данные и читать договоры осознанно в 2025 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-nikto-ne-chitaet-polzovatelskie-soglaweniya-i-chto-vy-propuskaete--chem-opasna-cifrovaya-slepota-v-2025-godu">Почему никто не читает пользовательские соглашения и что вы пропускаете: чем опасна цифровая слепота в 2025 году</a>»</p>]]></description>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Роскомнадзор]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[Epic Games]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></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, 23 Jul 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы только что зарегистрировались в облачном хранилище, скачали новое приложение для контроля умного дома или подключили банковский сервис. Перед доступом к функционалу появляется экран с многостраничным текстом, который никто не читает. Вы тоже его не читаете, просто кликаете «Принять» и забываете.</p><p>Такая практика носит массовый характер: по данным <a href="https://iz.ru/1285198/roman-kildiushkin/plod-neznaniia-90-rossiian-ne-dochityvaiut-polzovatelskie-soglasheniia">исследований</a>, около 95% россиян принимают условия без изучения документа. При этом часть опрошенных вообще считает, что прочитать соглашение полностью физически невозможно (слишком много букв). Половина опрошенных даже не в курсе, о чем там написано.</p><p>Пользовательские соглашения — юридические документы, регулирующие права, обязанности и риски при использовании цифровых продуктов. Их игнорирование сравнимо с подписанием договора с закрытыми глазами. Почему это стало нормой? Какие «сюрпризы» скрываются за малопонятными формулировками? И как защитить свои данные в условиях российской цифровой экосистемы?</p><h2>Причины массового игнорирования: системные ловушки</h2><p>Проблема кроется не в лени пользователей (или не только в ней), а в продуманной системе, превратившей соглашения в формальность. Три ключевых барьера делают осознанное согласие практически недостижимым.</p><h3>Большой объем и языковой барьер</h3><p>Современные соглашения напоминают юридические трактаты. Средний документ российских сервисов содержит 16,800 слов. Роскомнадзор критикует избыточность текстов, но не публикует официальной статистики. Например, документация Ozon занимает 23,700 слов — это больше, чем повесть Чехова «Дуэль» (13,700 слов).  <a href="https://yandex.ru/legal/disk_termsofuse/ru/">Политика Яндекс.Диска</a> занимает 57 страниц, а условия СберБанк Онлайн — 43 страницы.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-07-21/ba4d45a5-5842-462f-b45c-4485fe4b7b91.png" alt="" /></figure><p>Главная проблема — язык. Юридические термины вроде «сублицензирование», «деперсонализация данных» или «арбитражная оговорка» требуют специальных знаний. Как показывает практика судебных споров и жалоб в Роскомнадзор, такие формулировки часто непонятны рядовым пользователям. Барьер усугубляется тем, что юридическая грамотность в РФ остается низкой: далеко не все россияне уверенно читают договоры.</p><blockquote>Ирония в том, что даже практикующие юристы часто соглашаются с
пользовательскими соглашениями, не читая их, — и причина не только в
профессиональной терминологии. Большинство таких документов перегружены
длинными абзацами, написаны мелким шрифтом и совершенно не приспособлены для
чтения на мобильных устройствах. В результате даже специалисту сложно вычленить
из текста то, что действительно важно. А еще и мучают вопросы: зачем и за что
это все мне? <br /><br />Но есть хорошие примеры. Скажем, один из крупных каршеринговых сервисов
предлагает не только полную версию соглашения, но и отдельное краткое саммари с
ключевыми условиями: ответственностью за штрафы, страховыми случаями,
особенностями оплаты и основными ограничениями. Такой подход позволяет быстро
понять, на что вы соглашаетесь, не тратя часы на чтение каждой строчки, и
действительно делает юридическую информацию доступной для всех.</blockquote><h3>UX-дизайн, провоцирующий спешку</h3><p>Современные интерфейсы часто проектируются так, что внимательное прочтение соглашений становится затруднительным. Кнопка «Принять» обычно выделяется контрастным цветом (например, зеленым или синим), а опция отказа скрывается:</p><ul><li>в приложениях отклонение условий требует перехода в «расширенные настройки» и сопровождается прочими сложностями;</li><li>кнопки «не соглашаюсь» выглядят менее заметными — например, серые на белом фоне.</li></ul><p>Такие паттерны усиливают «эффект туннельного зрения» — психологический феномен, при котором пользователь фокусируется на цели (быстром доступе к сервису), игнорируя второстепенные элементы. Дизайнеры дополнительно стимулируют это: например, используют таймеры обратного отсчета («Осталось 00:59»), чем создают искусственную спешку. Сообщения типа «99% пользователей уже приняли условия» формируют социальное давление.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-07-21/6e97fb92-dadf-4f2d-9b91-c2b5ddafcd53.png" alt="" /></figure><h3>Мнимый выбор в условиях монополий</h3><p>После блокировки зарубежных сервисов в 2023 году российский рынок заняли локальные альтернативы. Но переход к отечественным платформам не дал пользователям реальной свободы.</p><p>Почему выбор остаётся мнимым?  Попробуйте использовать СберБанк Онлайн без принятия политики обработки данных. Система выдаст ошибку: «Для продолжения необходимо согласиться с условиями». Аналогично в VK: отказ от соглашения означает потерю доступа к сообщениям и группам.</p><blockquote>Мнимый выбор — это не всегда подвох со стороны сервиса. Даже по новым
европейским правилам (Digital Services Act) платформы должны давать вам
«базовую версию» без персонализированной рекламы, но не обязаны работать вообще
без сбора данных. <br /><br />В России всё устроено схоже: если без ваших персональных данных сервис
просто не сможет функционировать (например, банк или мессенджер), отказ в
доступе — это не нарушение закона. <br /><br />Проблема начинается там, где сервис требует от вас избыточную информацию:
например, запрашивает паспорт для заказа еды или такси, требует согласие на
передачу ваших данных рекламным партнёрам ради просмотра видео или просит
доступ к вашим контактам и галерее там, где это не нужно для работы сервиса.
Вот такие запросы уже выходят за рамки необходимого и могут считаться
нарушением закона о персональных данных.</blockquote><p>Евросоюз в 2024 году ввел <a href="https://digital-strategy.ec.europa.eu/en/policies/digital-services-act-package">Digital Services Act</a>, обязывающий платформы предлагать базовую версию без сбора данных. В России аналогичные нормы в законе «О персональных данных» (152-ФЗ) начали работать только с 2025 года. У пользователя есть право отозвать согласие на обработку данных, но не все сервисы готовы сохранять функционал после отказа.</p><h2>Что скрывают соглашения: реалии цифрового мира</h2><p>Игнорируя пользовательские соглашения, пользователи невольно соглашаются на условия, иногда выходящие за рамки разумного сбора данных. Эти практики подтверждены регуляторными решениями, судебными кейсами и открытой документацией сервисов.</p><h3>Расширенный сбор данных под видом «аналитики»</h3><p>Яндекс.Карты сохраняют историю перемещений даже при деактивированном приложении. Сбор геоданных без явного уведомления при каждом запуске нарушает принцип минимальной достаточности (предоставление только необходимого для достижения цели). Это возможно, если в настройках устройства и приложения включена геолокация и история местоположений.</p><p>VK Музыка в пункте 4.3 пользовательского соглашения разрешает анализ аудиопотока через микрофон для идентификации фоновых треков. Технология активируется автоматически при первом запуске, без отдельного запроса на разрешение.</p><p>После ухода зарубежных сервисов российские платформы переняли спорные методы: например, VK Мессенджер хранит метаданные переписки (время отправки, IP-адреса, идентификаторы устройств) два года — дольше, чем это необходимо для операционной деятельности.</p><p>Закон требует удалять данные после достижения целей обработки, но не устанавливает жестких сроков. Этим пользуются сервисы. В политике конфиденциальности они указывают «хранение данных в течение срока, необходимого для выполнения бизнес-задач» — формулировка позволяет фактически бессрочно хранить адреса и телефоны пользователей.</p><blockquote>Формулировки про «хранение данных столько, сколько нужно для бизнеса» выглядят довольно расплывчато и, с юридической точки зрения, не могут считаться самостоятельной и достаточной целью: такая причина хранения вряд ли будет признана обоснованной при проверке. Тем не менее, именно за такими фразами иногда скрывают ссылку на так называемый законный интерес — этот механизм широко применяется в Европе по стандарту GDPR. В России, напротив, операторы редко ссылаются на законный интерес напрямую: это связано с тем, что у нас сложнее требования к обоснованию сроков и объёмов хранения данных, и риски для компании выше. <br /><br />В качестве примера можно привести ситуацию, когда оператор оставляет ваши контактные данные и историю заказов после завершения сделки, чтобы иметь возможность вернуть деньги или рассмотреть вашу жалобу. Или, например, хранит историю обращений для расследования мошенничества или предотвращения повторных атак (антифрод). <br /><br />Даже если такие обстоятельства действительно есть, компания обязана чётко объяснить, зачем ей по-прежнему нужны ваши данные и как долго они будут храниться. Если это не будет убедительно, регулятор может признать хранение избыточным.</blockquote><p>Умные колонки с голосовыми помощниками (такие как «Яндекс.Станция» или устройства Sber) постоянно анализируют звуковое окружение для активации по ключевым словам, что создает риск случайной записи приватных разговоров.</p><blockquote>Обезличенная статистика нужна бизнесу: знать, сколько пользователей на
сайте, когда пик нагрузки, какие разделы популярны. Закон такое разрешает, если
никто не может узнать, что это были именно вы. <br /><br />Но если сервис начинает собирать «поведенческие следы» — какие фильмы
смотрите, что ищете, на какие кнопки кликаете, и использует эти данные для
ваших персональных рекомендаций, это уже обработка персональных данных, даже
если вы не вводили свои ФИО. Современный подход — всплывающее окно с «переключателями»:
хотите только технические куки или соглашаетесь на аналитику и персонализацию.<br /><br />Отказаться от передачи данных должно быть так же
легко, как согласиться. Если же настройки глубоко спрятаны или их вообще нет —
это явное нарушение прав пользователя. Вы вправе знать, зачем сервис собирает
ваши данные, и контролировать этот процесс.</blockquote><p>Исследования подтверждают:</p><ul><li>Ложные срабатывания. Ассистенты <a href="https://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%83%D0%BC%D0%BD%D1%8B%D1%85_%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BE%D0%BA">активируются</a> до 19 раз в сутки из-за фоновой речи, слов-омофонов или аудиоконтента (например, при просмотре сериалов).</li><li>Технические уязвимости. Ученые <a href="https://4pda.to/2025/06/13/443283/uchyonye_nashli_sposob_proslushki_noutbukov_i_umnykh_kolonok/">обнаружили</a>, что MEMS-микрофоны в таких устройствах излучают радиосигналы, которые можно перехватить FM-приемником даже через бетонные стены.</li><li>Хранение данных. Записи голосовых команд сохраняются на серверах производителей неограниченное время. В 2019 году сотрудники Amazon <a href="https://www.bloomberg.com/news/articles/2019-04-10/is-anyone-listening-to-you-on-alexa-a-global-team-reviews-audio">признались</a> в прослушке аудио с Echo без ведома пользователей.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-07-21/0fb61fc0-b5b1-49a4-9e53-f8b5ef22bafb.png" alt="" /></figure><p>Как минимизировать угрозы:</p><ol><li>Отключайте микрофоны колонок физической кнопкой (если есть) при обсуждении конфиденциальных тем.</li><li>Откажитесь в настройках от «персонализированных ответов» и отправки аудиоданных для «улучшения сервиса».</li><li>Регулярно удаляйте историю запросов через приложение-компаньон (например, «Дом с Алисой»).</li></ol><p><i>Важно: Пользовательское соглашение «Яндекса» прямо разрешает обработку фонового аудио для «технического анализа», но не уточняет сроки хранения или алгоритмы фильтрации. Для устройств Sber аналогичные условия описаны в разделе «Данные голосового взаимодействия».</i></p><h3>Передача прав на контент</h3><p>Стандартная формулировка «неисключительная лицензия» в облачных сервисах имеет далеко идущие последствия. Политика Mail.ru Cloud прямо разрешает использовать загруженные файлы для обучения ИИ-алгоритмов. На практике это означает, что ваши фото могут стать частью тренировочных данных для нейросетей распознавания лиц.</p><p>Маркетплейс Ozon в разделе «Обмен информацией» своего соглашения допускает передачу истории покупок партнерам для таргетированной рекламы. Вряд ли пользователи добровольно согласились бы на такие условия, если бы прочли о них заранее.</p><h3>Автоматическое продление подписок</h3><p>Проблема скрытых списаний остается массовой. Пользователи массово жалуются на автоматическое продление подписок. Например:</p><ul><li>Сервис IVI продлевает платный доступ без отдельного подтверждения после пробного периода.</li><li>Яндекс.Плюс списывает средства за 3 дня до окончания расчетного цикла в случае, если юзер не отключил автопродление. Яндекс делает это, «чтобы обеспечить клиентам непрерывный доступ к сервису, даже если платеж задерживается».</li></ul><p>Особую опасность представляют детские приложения, где случайные покупки происходят из-за неочевидного интерфейса. В 2024 году Федеральная торговая комиссия США (FTC) <a href="https://ixbt.games/news/2024/12/10/epic-games-vernula-obmanutym-detyam-v-fortnite-72-milliona-dollarov.html">оштрафовала</a> Epic Games (американскую компанию по разработке игр и ПО) в общей сложности на $520 млн за сложную процедуру отмены несанкционированных платежей в Fortnite (кроссплатформенной формально бесплатной игре).</p><p>Российские сервисы могут использовать схожие паттерны:</p><ul><li>в обучающих приложениях кнопки покупок размещаются рядом с игровыми элементами;</li><li>отмена требует письменного заявления или звонка в поддержку.</li></ul><blockquote>Ещё несколько лет назад — и в зарубежных, и в российских сервисах — действовали более лояльные правила возврата: если пользователь забывал отменить подписку в течение льготного периода, деньги можно было вернуть. По данным на 2021 год, такую опцию предлагали и IVI, и Яндекс, и Okko. <br /><br />Сегодня ситуация изменилась: сервисы работают по модели абонентского договора, где достаточно предоставить саму возможность пользоваться услугой, а возврат за неиспользованный период не предусмотрен, даже если клиент не воспользовался подпиской. Ответственность за контроль и отключение подписки полностью ложится на пользователя. Однако информировать о правилах продления и списания сервис должен понятно и заранее.   Из большинства пользовательских соглашений следует, что возврат возможен только если услуга реально не оказана по вине сервиса — например, из-за технических проблем. <br /><br />При этом крупные сервисы, как Яндекс, в явном виде указывают: изменение или ограничение контента, региональные блокировки и другие изменения не считаются основанием для возврата средств. Но важно помнить: если недоступность контента становится существенным недостатком услуги, Закон о защите прав потребителей (ст. 29) сохраняет за пользователем право на возврат оплаты — независимо от того, что написано в соглашении.</blockquote><p><i>Роскомнадзор рекомендует родителям активировать родительский контроль, отключать сохранение платежных данных и регулярно проверять историю подписок.</i></p><h2>Как защитить себя: стратегии для 2025 года</h2><p>Полностью избежать пользовательских соглашений невозможно, но осознанное взаимодействие с ними снижает риски. Предлагаем конкретные шаги для двух групп: обычных пользователей и разработчиков.</p><h3>Для пользователей: цифровая гигиена</h3><p><b>Проверяйте репутацию сервиса перед согласием</b></p><p>Роскомнадзор ведёт открытый реестр нарушителей закона 152-ФЗ. Например, каршеринг «Делимобиль» был внесен в список после массовой утечки номеров телефонов.</p><p>На некоторых сервисах публикуются расшифровки соглашений популярных российских платформ: там же сообщают о возможности сервисов изменять условия без персонального уведомления пользователей.</p><p><b>Жёстко контролируйте разрешения</b></p><p>Современные ОС предлагают инструменты для защиты:</p><ul><li>в Android 14 функция «Одноразовый доступ» <a href="https://support.google.com/chrome/answer/2693767?hl=ru&amp;co=GENIE.Platform%253DAndroid">ограничивает</a> работу камеры/микрофона одним сеансом;</li><li>в iOS 18 «Детальный контроль» <a href="https://support.apple.com/en-us/102459">позволяет блокировать</a> фоновый сбор данных.</li></ul><p>Для браузеров установите <a href="https://github.com/gorhill/uBlock">uBlock Origin</a> — расширение блокирует скрытые трекеры, упомянутые в политиках конфиденциальности. В соцсетях отключайте «аналитику поведения» в настройках приватности — это снижает объем собираемой информации.</p><p><b>Требуйте отчёт о ваших данных</b></p><p>Статья 14 закона 152-ФЗ гарантирует право запросить у компании:</p><ul><li>полный список хранимых персональных данных;</li><li>историю их передачи третьим лицам;</li><li>правовые основания обработки.</li></ul><p>В случае отказа или неполного ответа подавайте жалобу через портал Роскомнадзора.</p><blockquote>Если вы хотите узнать, какие именно ваши персональные данные обрабатывает компания, просто напишите им запрос — укажите свои ФИО, паспортные данные (или иные, подтверждающие личность), и четко сформулируйте, что именно вы хотите узнать: какие данные у них есть, откуда они их получили, зачем обрабатывают и кому передают. Такой запрос можно отправить письменно или через электронную почту, если подпишете его электронной подписью. По закону компания обязана ответить вам в течение 10 рабочих дней. <br /><br />И если вас ответ не устроил, вы вправе требовать удаления ваших персональных данных - оператор обязан будет это сделать (кроме тех данных, которые он обязан хранить в силу закона). Правда, нередко это одновременно будет означать, что вы не сможете более пользоваться этим сервисом.</blockquote><h3>Для разработчиков: прозрачность как конкурентное преимущество</h3><p>Сокращайте и визуализируйте соглашения</p><p>Т-Банк провел редизайн пользовательского договора: заменил юридические термины простыми формулировками, добавил инфографику и чек-листы ключевых пунктов. Это снизило количество обращений в поддержку по вопросам непонятных условий.</p><p><b>Внедряйте градацию согласия</b></p><p>Разделите запросы на данные по категориям:</p><ul><li>базовые — необходимые для работы сервиса;</li><li>опциональные — аналитика, реклама, улучшение продукта.</li></ul><p>Европейский GDPR требует такой практики — например, при установке приложения Signal пользователь <a href="https://signal.org/legal/">отдельно разрешает</a> доступ к контактам и уведомлениям. В России подобный подход выделит ваш продукт на фоне конкурентов.</p><p><b>Добавьте «режим адвоката»</b></p><p>Встройте в интерфейс кнопку «Главные риски за 60 секунд»: краткую выжимку ключевых положений. Сервис ProtonMail <a href="https://protonmail.com/security-details">делает это</a> эффективно — на странице регистрации четко указано: «Мы не храним IP-адреса и не передаём данные третьим лицам».</p><h2>Будущее соглашений: нейросети и законодательство</h2><p>Эволюция пользовательских соглашений развивается по двум направлениям: технологические инструменты для упрощения понимания и ужесточение законодательных требований. Оба тренда активно проявляются в 2025 году.</p><h3>ИИ-ассистенты: возможности и ограничения</h3><p>Крупные IT-компании разрабатывают инструменты для анализа юридических документов. Яндекс.Помощник интегрировал функцию сканирования соглашений: система выделяет спорные пункты цветными маркерами и генерирует упрощенные пояснения.</p><p>Однако нейросети не заменяют юристов. ИИ-сервисы нередко пропускают скрытые условия в длинных документах.</p><p>Основные проблемы:</p><ul><li>неспособность интерпретировать двусмысленные формулировки;</li><li>игнорирование ссылок на внешние документы;</li><li>ошибки в трактовке арбитражных оговорок.</li></ul><h3>Законодательные изменения: новые требования</h3><p>В июне 2024 года принят Федеральный закон № 123-ФЗ, вносящий поправки в 152-ФЗ.</p><p>Ключевые новации:</p><ul><li>запрет автоматического продления платных подписок без отдельного подтверждения через SMS или email (ст. 15.4);</li><li>обязательное выделение условий сбора биометрических данных жирным шрифтом;</li><li>штрафы до 3% годового оборота за сокрытие практик передачи данных третьим лицам.</li></ul><p>Новые требования уже дают результаты.</p><h3>Перспективы: стандартизация и блокчейн</h3><p>ЕС <a href="https://data-privacy-office.com/ai-act-overview/">разрабатывает</a> AI Act — единый стандарт для ИИ-анализа соглашений. Эксперименты с блокчейн-реестрами условий проводят Сбербанк и Тинькофф: технология фиксирует версии документов и предотвращает скрытые изменения.</p><h2>Заключение: ваша цифровая подпись — это ответственность</h2><p>Пользовательские соглашения — не формальность, а юридически обязывающий документ. Их игнорирование в 2025 году связано со многими рисками. Каждый клик «Принять» несёт реальные последствия: от скрытой слежки до потери прав на контент.</p><p>Что делать сегодня? Начните с малого. Даже беглый просмотр разделов «Данные» и «Автоматическое продление» снижает риски. Не забывайте о законе 152-ФЗ. Если это необходимо, требуйте от компаний полный отчёт о ваших данных через форму на портале Роскомнадзора.</p><p>Голосуйте кошельком. Переходите на сервисы с прозрачными правилами. Осознанное согласие — не роскошь, а базовый навык цифровой эпохи. Ваши данные стоят тех 10 минут, которые вы потратите на чтение перед кликом «Принять».</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция сетей: от LAN 2003 года до 5G и дальше</title>
      <link>https://tproger.ru/articles/evolyuciya-setej--ot-lan-2003-goda-do-5g-i-dalwe</link>
      <comments>https://tproger.ru/articles/evolyuciya-setej--ot-lan-2003-goda-do-5g-i-dalwe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-setej--ot-lan-2003-goda-do-5g-i-dalwe</guid>
      <description><![CDATA[<p>Разбираем трансформацию сетевых технологий — от проводных LAN до беспроводных 5G и перспектив 6G. Узнайте, как роутеры, безопасность и скорость интернета изменились за 20 лет. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-setej--ot-lan-2003-goda-do-5g-i-dalwe">Эволюция сетей: от LAN 2003 года до 5G и дальше</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Wi-Fi]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[GTK]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[faq]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 23 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2003 году соединения между компьютерами представляли собой сложные и многоуровневые сплетения проводов. Ethernet-кабели опутывали жилые комнаты и офисы, а про беспроводные технологии многие только слышали. Dial-up-модемы еще не стали историей, хотя уже доживали последние дни. Локальные сети (LAN) строились на стандартах IEEE 802.3, обеспечивая скорость передачи данных до 100 Мбит/с — по тем временам это казалось фантастикой.</p><p>Первые Wi-Fi роутеры только начинали появляться на рынке, стоили дорого и требовали сложной настройки. Их антенны выглядели как нечто футуристическое, а радиус действия оставлял желать лучшего — сигнал часто не мог пробиться через одну-две стены. Сегодня, в 2025 году, ситуация кардинально изменилась. Беспроводные технологии 4-5G и mesh-сети превратили интернет в нечто невидимое, но повсеместное, как воздух.</p><p>Как технологии шагнули от проводных локальных сетей к глобальному беспроводному покрытию? Что стало действительно быстрее, а что мы, возможно, даже потеряли? Какие новые сложности принесли современные технологии? В этой статье мы проследим трансформацию сетевых технологий с 2003 по 2025 год.</p><h2>LAN 2003: эпоха проводов и первых беспроводных решений</h2><p>Начало 2000-х годов было временем, когда интернет в России становился массовым явлением, но оставался преимущественно проводным. Локальные вычислительные сети (LAN) продолжали активно развиваться, предоставляя возможность объединять компьютеры и другие устройства в пределах одного здания или офиса для обмена данными и совместного использования ресурсов.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-07-02/7256c664-f4d7-434c-97be-9a37ce0964c7.png" alt="" /></figure><p>В основе этих сетей лежала технология Ethernet, которая обеспечивала пропускную способность до 100 Мбит/с в наиболее распространенном варианте Fast Ethernet, а в продвинутых решениях — до 1000 Мбит/с (Gigabit Ethernet).</p><p>Для корпоративного сектора LAN играли ключевую роль в инфраструктуре предприятий, образуя основу для работы бизнес-приложений и обмена данными между сотрудниками. Активно использовались сетевые коммутаторы (switches), которые эффективно разделяли трафик и повышали производительность сети по сравнению с устаревшими концентраторами (hubs). Развитие Gigabit Ethernet и других сетевых технологий позволяло удовлетворить растущие потребности бизнеса в скорости передачи данных.</p><p>Для домашних пользователей это означало вполне конкретные особенности использования. Кабели витой пары протягивались по квартирам, создавая настоящие «паутины». Компьютеры соединялись физически, а провода приходилось аккуратно прокладывать вдоль плинтусов или даже сверлить стены для более аккуратной разводки.</p><p>Wi-Fi был редкой и дорогой опцией — первые роутеры вроде D-Link DI-604 стоили от $100 (что по курсу того времени составляло около 3000 рублей — немалые деньги для среднестатистического гражданина) и требовали сложной настройки через Internet Explorer.</p><p>Вопросы безопасности в те годы решались просто – точнее, почти никак. WEP-шифрование, использовавшееся в ранних стандартах Wi-Fi (802.11b/g), взламывалось за считанные минуты специальными программами, которые легко можно было найти в интернете. Многие пользователи вообще не заморачивались с паролями, оставляя свои сети открытыми, что приводило к частым случаям «халявного» использования соседского интернета.</p><p>Скорости передачи данных, которые сегодня кажутся смешными, тогда воспринимались как нечто революционное. Даже в продвинутых офисах гигабитные порты (1 Гбит/с) были редкостью. Загрузка фильма в HD-качестве (4–5 ГБ) могла занимать несколько часов, а о потоковом вещании в современном понимании и речи не шло.</p><p>Первые попытки внедрения беспроводных технологий наталкивались на серьезные ограничения. Радиус действия Wi-Fi редко превышал 30 метров, причем сигнал сильно ослабевал при прохождении через стены. Стабильность соединения оставляла желать лучшего — помехи от микроволновых печей, радиотелефонов и других бытовых приборов могли полностью убить беспроводную сеть.</p><p>Пример: Согласно исследованию аналитической компании J’son &amp; Partners за 2005 год, в Москве только 12% домохозяйств имели широкополосный доступ в интернет, а публичные точки Wi-Fi можно было пересчитать по пальцам. В основном они располагались в дорогих отелях и нескольких продвинутых кафе в центре города.</p><h2>Революция Wi-Fi и появление мобильного интернета</h2><p>К 2010-м годам ситуация начала кардинально меняться. Технология Wi-Fi, получившая новый импульс развития с появлением стандарта 802.11n (обеспечивающего скорость до 600 Мбит/с), стала по-настоящему массовой. Параллельно развитие мобильных сетей третьего поколения (3G) дало пользователям первую реальную свободу от проводов.</p><h3>Что конкретно изменилось в этот период</h3><p>Скорость передачи данных сделала качественный скачок. Если в начале 2000-х максимальная скорость Wi-Fi редко превышала 54 Мбит/с (по стандарту 802.11g), то с 2013 года, с появлением стандарта 802.11ac, в дома пришли гигабитные скорости. Например, популярный роутер ASUS RT-AC68U поддерживал скорость до 1,9 Гбит/с, что позволяло комфортно смотреть видео в 4K на нескольких устройствах одновременно.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-07-02/d6171314-d750-4e0a-8e6e-1c94939bd1eb.png" alt="" /></figure><p>Вопросы безопасности тоже вышли на новый уровень. Устаревший и ненадежный WEP сменился сначала WPA, а затем WPA2. В 2018 году был представлен WPA3 — новый стандарт безопасности, закрывший многие известные уязвимости. Однако технологии принесли и проблемы — участились случаи фишинга, а взломы через уязвимости в сетях стали настоящей головной болью для специалистов по кибербезопасности.</p><p>Проблема покрытия больших площадей нашла свое решение в mesh-системах. Пионером в этой области стала компания Google с ее системой Google Wifi, представленной в 2016 году. Такие системы позволяли покрыть Wi-Fi сигналом весь дом без «мертвых зон», используя несколько взаимодействующих между собой модулей.</p><p>Конкретные цифры: Согласно данным операторов и исследований, к 2021 году общее количество Wi-Fi точек в России (включая домашние роутеры) оценивалось в десятки миллионов, при этом проникновение широкополосного интернета в домохозяйства превысило 75%, а в Москве и крупных городах достигало 90%.</p><p>Технологический прогресс затронул и частотный диапазон. Перегруженность 2.4 ГГц стала серьезной проблемой — в час пик скорость могла падать до 5-10 Мбит/с. Это подтолкнуло переход на 5 ГГц, который предлагал более чистый эфир, но требовал нового оборудования.</p><p>Рынок Wi-Fi-решений активно развивался. К 2022 году его объем <a href="https://habr.com/ru/news/702456/">достиг 5.1 млрд рублей</a>. При этом средняя стоимость роутера упала, сделав технологию доступной массовому потребителю.</p><h2>4G и 5G: как мобильный интернет перевернул все</h2><p>Сети четвертого поколения (4G/LTE) совершили настоящую революцию в 2010-х годах, впервые обеспечив мобильный интернет со скоростями до 100-300 Мбит/с — быстрее, чем многие проводные домашние решения того времени.</p><p>Технология LTE стала основой для мобильного видеостриминга, такси-сервисов и других инноваций, изменивших повседневную жизнь. В России пик развития 4G пришелся на 2015-2018 годы, когда операторы развернули сети в большинстве городов-миллионников.</p><p>Однако настоящий технологический скачок произошел с появлением 5G, который предлагает не просто увеличение скорости, а качественно новые возможности.</p><p>Скорость передачи данных достигла невиданных ранее показателей. В тестовых замерах, <a href="https://www.kp.ru/expert/elektronika/5g-internet/">проведенных МТС в Москве в 2020 году</a>, 5G демонстрировал скорость до 1,2 Гбит/с. Для сравнения: средняя скорость 4G в тех же условиях составляет 100–300 Мбит/с. Это означает, что полнометражный фильм в 4K-качестве теперь можно скачать за считанные минуты.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-07-02/cb89cd92-e5fd-4f14-86a8-8ac9a04fd3ed.jpg" alt="" /></figure><p>Одним из ключевых преимуществ 5G стало радикальное снижение задержки (ping). Если в сетях 4G этот показатель обычно составляет 30–50 мс, то 5G сокращает его до 1–5 мс. Такие значения критически важны для технологий виртуальной реальности, телемедицины (особенно для удаленных операций) и облачного гейминга.</p><p>Однако внедрение 5G столкнулось с серьезными трудностями. Как <a href="https://www.kommersant.ru/doc/6608033">отмечал «Коммерсантъ» в 2024 году</a>, в России развертывание сетей пятого поколения значительно замедлилось из-за нехватки частотного спектра. Основные «чистые» частоты, используемые для 5G в других странах, в России были заняты спутниковой связью, военными и спецслужбами.</p><p>Есть и <a href="https://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%A7%D0%B0%D1%81%D1%82%D0%BE%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_5G_%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8#:~:text=%D0%92%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B%20%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%B2%D1%8F%D0%B7%D0%B8,%D0%B8%D1%85%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B2%20%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%B5%D1%82%D0%B8.">экономические ограничения</a>. Капитальные затраты на развертывание 5G в 2.5 раза выше, чем для 4G при текущих частотах. Окупаемость инфраструктуры только в Москве оценивается в 25-30 лет. Эти проблемы характерны не только для России — аналогичные сложности с окупаемостью 5G фиксируют операторы в Европе и США.</p><p>Правительство РФ утвердило поэтапный план внедрения 5G, согласно которому к 2030 году технология появится в 41 городе. В 2024 году сети развернули в трех мегаполисах, в 2025 — еще в семи, а к 2030 они охватят все крупные агломерации страны. На эти цели из федерального бюджета выделено 21,5 млрд рублей в рамках проекта «Цифровые технологии».</p><p>Главное ограничение — зависимость от импортного оборудования. Чтобы решить эту проблему, «Ростех» создает консорциум отечественных производителей телеком-оборудования. Первые серийные образцы российских базовых станций 5G ожидаются не раньше 2026 года, что может скорректировать график внедрения технологии в регионах.</p><p>Согласно статистике, сегодня почти половина мирового населения (45%) имеет доступ к среднечастотному 5G — оптимальному по сочетанию скорости и покрытия. Этот показатель продолжает стремительно расти: аналитики прогнозируют, что к 2030 году зона действия 5G охватит уже 85% жителей планеты.</p><p><i>Особенно впечатляют темпы внедрения в Азии. В Китае, где первые коммерческие сети 5G появились еще в 2019 году, технология сейчас доступна 92% населения. Индия, начавшая массовое развертывание позже, в 2022 году, уже обеспечила покрытие для 91% граждан благодаря агрессивной инфраструктурной программе. Эти две страны вместе добавляют около 1,5 миллиона новых 5G-пользователей ежемесячно, формируя основной драйвер глобального роста.</i></p><p><i>На начало 2025 года 5G-сети в России функционируют в ограниченном тестовом режиме. Технология доступна в отдельных районах Москвы, включая деловой центр Москва-Сити и территорию Сколково, Санкт-Петербурга (преимущественно в центральных районах), а также в инновационных кластерах — Иннополисе и томском IT-парке.</i></p><h2>6G и будущее: технологический прорыв следующего десятилетия</h2><p>Пока операторы в РФ и других странах только начинают разворачивать сети 5G, мировые технологические лидеры уже делают первые шаги в эпоху 6G.</p><p><a href="https://skillbox.ru/media/code/v-yaponii-ustanovili-mirovoy-rekord-po-skorosti-peredachi-dannykh-402-tbits/">Лабораторные испытания</a>, проведенные учеными из Национального института информационных и коммуникационных технологий Японии (NICT), и промышленные тесты ведущих телеком-компаний Китая демонстрируют скорости, превышающие 400 Тбит/с в контролируемых условиях. Технологий шестого поколения откроют новую главу в развитии беспроводных коммуникаций. Эти тесты показали, что 6G — не просто эволюция существующих стандартов, а качественный скачок в передаче данных.</p><h3>Технические особенности 6G</h3><p>Основное отличие 6G от предыдущих поколений — использование терагерцового диапазона частот (от 100 ГГц до 10 ТГц). Скоростей будет достаточно для передачи 8K-видео в реальном времени или загрузки полнометражного фильма в 4K за 3-5 секунд. Для сравнения: максимальная скорость 5G в идеальных условиях не превышает 10 Гбит/с.</p><h3>Интеграция с искусственным интеллектом</h3><p>6G разрабатывается как «умная» сеть, где ИИ будет управлять ресурсами в реальном времени.</p><p>Компания Nokia Bell Labs <a href="https://www.nokia.com/bell-labs/collaboration-opportunities/d-a-p/nokia-bell-labs-and-tu-dresden/">уже тестирует</a> алгоритмы, которые:</p><ul><li>автоматически перераспределяют нагрузку между базовыми станциями;</li><li>оптимизируют энергопотребление устройств;</li><li>прогнозируют перегрузки сети за 15-20 минут до их возникновения.</li></ul><h3>Безопасность и квантовые технологии</h3><p>Китайские исследователи из Шанхайского университета <a href="https://www.cnews.ru/news/top/2025-06-05_v_kitae_ispytali_zashchitu_ot">добились значительных успехов</a> в квантовом шифровании. В 2024-2025 годах им удалось установить защищенное соединение на расстоянии до 300 км, хотя скорость передачи оставалась низкой (порядка килобит в секунду). Эти достижения открывают перспективы для безопасной передачи данных особой важности.</p><h3>Российские перспективы</h3><p>По мнению экспертов, коммерческий запуск 6G в России возможен не ранее 2030 года.</p><p>Основные проблемы:</p><ul><li>отсутствие собственной элементной базы для терагерцового оборудования;</li><li>ограниченный доступ к международным исследовательским консорциумам;</li><li>необходимость разработки новых стандартов с нуля.</li></ul><h3>Потенциальные применения</h3><p>Разработки в области 6G открывают путь к принципиально новым сценариям использования сетей связи:</p><ul><li>Голографическое телеприсутствие может произвести революцию в дистанционном образовании и телемедицине, позволяя врачам «находиться» в операционной на другом континенте и действовать с точностью до микрона.</li><li>Тактильный интернет с задержкой менее 1 мс создаст основу для точного дистанционного управления промышленными роботами и беспилотной техникой в реальном времени.</li><li>Нейроинтерфейсы могут быть использованы для прямого подключения к облачным сервисам.</li></ul><p>Однако массовое внедрение этих технологий потребует не только развития сетевой инфраструктуры, но и решения сложных этических и регуляторных вопросов, связанных с безопасностью и приватностью пользователей.</p><h2>Что мы потеряли и что приобрели</h2><p>Подводя итоги 20-летней эволюции сетевых технологий, можно выделить несколько ключевых моментов.</p><p>Безусловные достижения:</p><ul><li>скорость передачи данных увеличилась в тысячи раз;</li><li>интернет стал по-настоящему мобильным и доступным практически везде;</li><li>появились совершенно новые сервисы и возможности, о которых в 2003 году можно было только мечтать.</li></ul><p>Потери и новые вызовы:</p><ul><li>современные сети стали сложнее в настройке и обслуживании для рядовых пользователей;</li><li>вопросы безопасности превратились в постоянную «гонку вооружений» между хакерами и разработчиками;</li><li>возросла зависимость от инфраструктуры и крупных провайдеров.</li></ul><p>Технологии действительно ушли от проводов к воздуху, но этот переход потребовал новых знаний и создал сложности. 6G обещает еще более революционные изменения — вопрос только в том, успеет ли за ними инфраструктура и регуляторная база.</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>Чиповые войны: как кризис железа озолотил программистов</title>
      <link>https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov</link>
      <comments>https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Михаил Сахаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov</guid>
      <description><![CDATA[<p>Разберемся, как дефицит кремния породил золотую лихорадку среди разработчиков и почему программисты стали дороже железа.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov">Чиповые войны: как кризис железа озолотил программистов</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[Samsung]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[Сбер]]></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>Mon, 14 Jul 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Два года назад GPU стоила как подержанная Camry. Сегодня за нее дают как за новую Tesla. Пока весь мир страдает от нехватки чипов, программисты неожиданно превратились в самый дорогой ресурс на планете. Когда железа не хватает, компании готовы платить любые деньги за тех, кто умеет выжимать максимум из ограниченных ресурсов.</p><p>В мае 2024 по всему миру <a href="https://www.embedded.com/how-the-chip-shortage-deepens-the-engineering-skills-crisis/">разлетелись</a> скриншоты писем от HR с внезапными повышениями зарплат на 40%. Текучка кадров в сфере производства полупроводников выросла с 40% до 53%, и теперь компании дерутся за каждого специалиста.</p><h2>Масштаб проблемы</h2><p>169 отраслей <a href="https://www.spglobal.com/mobility/en/research-analysis/briefcase-another-semiconductor-shortage-may-be-coming.html">пострадали</a> из-за дефицита чипов — от автомобилестроения до бытовой техники. Tesla и Volvo останавливали заводы, цены на подержанные автомобили <a href="https://www.embedded.com/engineering-shortage/">выросли</a> на 10% за квартал. Даже стиральные машины подорожали из-за недостатка микросхем.</p><p>Но настоящая битва кипит в кабинетах бигтехов. США заблокировали экспорт технологий в Китай, Европа <a href="https://www.techrepublic.com/article/global-chip-shortage-cheat-sheet/">запустила</a> программу на €43 миллиарда, а Азия <a href="https://www.embedded.com/how-the-chip-shortage-deepens-the-engineering-skills-crisis/">удерживает</a> 77% мирового производства чипов.</p><p>Технологическая война изменила ИТ-индустрию навсегда. Компании теперь не могут просто купить больше серверов — приходится искать тех, кто умеет делать софт быстрее и эффективнее. Apple создала собственные M1 и M2, Google разработал TPU, Amazon — процессоры Graviton. Каждый хочет стать независимым от поставок.</p><h2>Обрушение цепей поставок</h2><p>В 2020 автопроизводители массово отменили заказы чипов, думая, что спрос на машины упадет. Но случилось обратное — спрос на автомобили <a href="https://www.embedded.com/engineering-shortage/">восстановился</a> быстрее ожидаемого во второй половине года, а производственные линии уже переключились на потребительскую электронику.</p><p>Мир оказался в заложниках у нескольких азиатских гигантов. Тайвань <a href="https://www.embedded.com/how-the-chip-shortage-deepens-the-engineering-skills-crisis/">контролирует</a> 65% мирового рынка чипов, TSMC делает процессоры для Apple, AMD и NVIDIA. Samsung доминирует в производстве памяти и накопителей.</p><p>Различные отрасли посыпались, как домино. Время ожидания полупроводников Broadcom выросло до 22 недель против 12 недель в феврале 2020. Автоиндустрия потеряла миллионы машин, дата-центры замедлили расширение, даже PlayStation 5 стали дефицитом.</p><p>США первыми объявили технологическую войну. Пошлины уже изменили процессы производства у Nvidia, Intel и AMD. Китай ответил санкциями против Micron Technology.</p><p>Ключевые игроки <a href="https://news.ycombinator.com/item?id=33436834">разделились</a> на два лагеря. На стороне США — Intel, NVIDIA, AMD, Qualcomm. Китай развивает SMIC и вкладывает миллиарды в собственные технологии. TSMC и Samsung балансируют между сторонами, строя заводы и в Америке, и в Азии.</p><p>Национальные программы превратились в гонку вооружений. CHIPS Act выделил $50 миллиардов на американское производство. Европейская программа нацелена на производство 20% мировых чипов к 2030 году. Китай <a href="https://www.techrepublic.com/article/global-chip-shortage-cheat-sheet/">инвестирует</a> $143 миллиарда в полупроводники.</p><h2>Гонки в мире чипов</h2><p>Рынок AI-чипов взлетел в 15 раз за десятилетие. Компании <a href="https://www.marketsandmarkets.com/Market-Reports/artificial-intelligence-chipset-market-237558655.html">научились</a> делать процессоры умнее, но каждое новое поколение требует больше денег и экспертизы.</p><p>Техпроцессы сжимаются в размере. TSMC освоила 3-нанометровый процесс, Samsung догоняет. Каждый нанометр <a href="https://www.techtarget.com/searchDataCenter/tip/Top-AI-hardware-companies">стоит</a> миллиарды инвестиций и годы разработки. Apple M4 имеет Neural Engine в три раза быстрее M1, но производство одного такого чипа <a href="https://www.techtarget.com/searchDataCenter/tip/Top-AI-hardware-companies">требует</a> сотни инженеров.</p><p>AI-чипы стали новой золотой жилой. Intel <a href="https://www.rootsanalysis.com/ai-chip-market">запустила</a> Gaudi 3, который на 50% быстрее NVIDIA H100. NVIDIA ответила платформой Blackwell с 208 миллиардами транзисторов. Qualcomm Cloud AI 100 <a href="https://www.techtarget.com/searchDataCenter/tip/Top-AI-hardware-companies">обошел</a> H100 по энергоэффективности — 227 запросов на ватт против 108.</p><p>Квантовые технологии пока остаются в лабораториях, но IBM и Google уже тестируют прототипы. Нейроморфные чипы, которые имитируют работу мозга, обещают революцию в энергоэффективности.</p><p>Делать чипы стало сложнее и дороже. Современная фабрика стоит $20 миллиардов, срок окупаемости — 10 лет. Поэтому крупные компании строят собственные решения: Apple создала M-серию, Google — TPU, Amazon — Graviton.</p><p>Компании поменяли философию. Вместо покупки большего количества серверов они <a href="https://www.edge-ai-vision.com/2024/04/ai-chip-market-to-grow-10x-in-the-next-ten-years-and-become-a-300-billion-industry/">нанимают</a> инженеров для оптимизации кода. Netflix <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10186304/">использует</a> персонализированные рекомендации и алгоритмы ранжирования для оптимизации вычислений. Meta* оптимизировала машинное обучение и уменьшила количество GPU на 40%.</p><p>Массовый переход на ARM изменил рынок. Amazon перевела часть ресурсов на собственные процессоры. Microsoft адаптировала Windows под ARM-архитектуру. Даже Intel вынуждена выпускать подобные решения.</p><p>Россия также <a href="https://www.reuters.com/technology/russias-yandex-reports-record-annual-revenues-2024-2025-02-20/">планирует</a> наладить массовое производство 28 нм чипов к 2030 году. Росатом присоединился к разработке нейроморфных процессоров. Сбер тестировал отечественный Эльбрус-8С, но выявил проблемы с памятью и оптимизацией.</p><p>*– компания признана в РФ экстремистской и запрещена.</p><h2>Айтишники в центре шторма</h2><p>Зарплаты разработчиков взлетели вместе с ценами на чипы. Средняя зарплата embedded-инженера <a href="https://www.salary.com/research/salary/listing/performance-engineer-hourly-wages">выросла</a> до $153,383, а топовые специалисты получают до $175,000 в год. Performance-инженеры зарабатывают в среднем $100,522, но спрос превышает предложение. Оптимизация под ARM-архитектуру, разработка драйверов для AI-ускорителей, программирование FPGA — навыки, за которые компании готовы переплачивать. IT-зарплаты в Северной Америке выросли в среднем до $113,211.</p><p>Embedded-разработчики неожиданно стали востребованнее ML-инженеров. Когда Tesla не может купить нужные чипы, она нанимает программистов, которые выжмут из имеющихся процессоров максимум. Один такой специалист экономит компании миллионы долларов на железе.</p><p>География возможностей сместилась. Калифорния лидирует по зарплатам — $126,707 в Сан-Хосе, но спрос есть везде. Даже компании из Техаса и Флориды <a href="https://www.salary.com/research/salary/listing/embedded-software-engineer-salary">переманивают</a> embedded-разработчиков зарплатами в $120,000-150,000.</p><p>Системные администраторы, знающие Kubernetes и контейнеризацию, стали дефицитом. Компании переходят на микросервисы и edge-решения — нужны те, кто умеет управлять распределенной инфраструктурой.</p><p>Прогноз на ближайшие пять лет простой: спрос на оптимизацию будет только расти. Эра дешевого железа закончилась. Началась эра дорогих мозгов. Чем сложнее становятся чипы, тем больше нужно программистов, которые умеют с ними работать.</p><h2>Свет в конце туннеля</h2><p>Эксперты расходятся в прогнозах восстановления. CEO Intel Пат Гелсингер <a href="https://en.wikipedia.org/wiki/2020%E2%80%932023_global_chip_shortage">ожидал</a> дефицит до 2024 года, но рынок полупроводников уже показал рост на 15,2% в начале года. К 2023-му автоиндустрия в основном восстановилась, глобальное производство автомобилей выросло на 3%.</p><p>Новые фабрики меняют географию производства. Intel строит заводы в Аризоне за $20 миллиардов и расширяется в Огайо. TSMC открыла завод в Японии в феврале 2024 и планирует второй к 2027 году. Samsung инвестирует в производство в Техасе.</p><p>Европа также <a href="https://www.techrepublic.com/article/global-chip-shortage-cheat-sheet/">входит</a> в игру. European Chips Act нацелен на производство 20% мировых чипов к 2030 году с бюджетом €43 миллиарда. Intel проектирует заводы в Ирландии и Германии, Micron строит завод в Нью-Йорке, а GlobalFoundries расширяется на Мальте.</p><p>Будущее отрасли — в диверсификации. Тайвань по-прежнему контролирует 65% производства, но объемы будут снижаться. К 2030 году США планируют удвоить свою долю в мировом производстве чипов.</p><p>За четыре года индустрия изменилась больше, чем за предыдущее десятилетие. Компании научились строить собственные чипы, программисты — выжимать максимум из доступных ресурсов, а правительства — инвестировать в технологическую независимость.</p><p>Бигтехи готовы переплачивать за надежность поставок и «мозги». Программисты в выигрыше: чем сложнее становится производство чипов, тем больше нужно людей, которые умеют эффективно их использовать.</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/bezopasnoe-ispolnenie-nenadyozhnogo-koda</link>
      <comments>https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Межов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda</guid>
      <description><![CDATA[<p>Методы безопасного исполнения ненадёжного кода. Рассматриваются уровни изоляции кода, методы ограничения ресурсов процесса, проблемы жёсткого лимитирования и подходы к их решению. Обсуждаются вопросы управления песочницами, а также использование инструментов контейнеризации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda">Безопасное исполнение ненадёжного кода</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 06 Jul 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы привыкли к тому, что ведем разработку, используя лучшие инженерные практики, включая настройку CI/CD-конвейера. Сначала код проходит многоэтапные стадии проверки и тестирования, а только потом попадает в production-среду.</p><p>Давайте представим ситуацию, что нужно запустить код, минуя все эти стадии. Прям в production-среде. На первый взгляд — бред! Но если подумать, то на самом деле, не такая уж редкость. Например, некоторые системы предоставляют своим пользователям возможность расширять функциональность за счет прикладных скриптов. Наш любимый CI/CD-конвейер зачастую построен на пользовательских скриптах.</p><p>С одной стороны, для большинства подобная постановка вопроса — крайность. С другой, появляется возможность рассмотреть проблему с разных ракурсов. Уверен, что какие-то части общего решения, о котором пойдёт речь далее, могут быть использованы повторно и в других проектах.</p><p>Предлагаю по частям разобрать проблему безопасного исполнения ненадёжного кода. Последовательно рассмотрим вопросы, ответы на которые поворотные в выборе целевой архитектуры. Большая часть статьи касается разработки, но в конце сделаны важные акценты относительно администрирования и развертывания.</p><h2>Ненадёжный код</h2><p>Для начала определимся, что же считать ненадёжным кодом? На самом деле ответ зависит от решаемой задачи, правил и процессов, принятых в компании:</p><ul><li>Код, который не прошел CI, review и т.п.</li><li>Код из ненадёжного или неизвестного источника.</li><li>Закрытый (проприетарный) код.</li><li>Код, содержащий уязвимости.</li><li>Код, использующий запрещенные функции.</li><li>Любой код, который написал коллега:)</li></ul><p>Чтобы отделять код разрабатываемого приложения от ненадёжного, первый буду называть кодом приложения, а второй — <i>ненадёжным</i> или <i>внешним кодом</i>. Необходимость запуска ненадёжного кода в некоторых случаях буду называть <i>задачей</i>.</p><h2>Уровни изоляции кода</h2><p>Можно выделить три варианта запуска внешнего кода — три уровня изоляции. Каждый следующий увеличивает дистанцию между кодом приложения и запускаемым кодом. Чем выше уровень изоляции, тем меньше вероятность, что запускаемый код нанесет вред приложению и системе.</p><h3>Уровень 1: тот же процесс</h3><p>Запуск внешнего кода в адресном пространстве процесса приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/191fd454-6837-4e91-abbf-c6d4a1fb6121.png" alt="Запуск внешнего кода в адресном пространстве процесса приложения." /><figcaption>Запуск внешнего кода в адресном пространстве процесса приложения.</figcaption></figure><p>Такой способ определяет самый слабый уровень изоляции, поскольку запущенный код теоретически имеет доступ ко всему тому, к чему имеет доступ код самого приложения.</p><p>Примером может служить использование интерпретаторов скриптов (<a href="https://github.com/mozilla/rhino">Rhino</a>, <a href="https://github.com/IronLanguages/ironpython3">IronPython</a>, <a href="https://github.com/jython/jython">Jython</a> и т.п.), визуальных языков программирования (workflow-движков) или подключение модулей расширения (плагинов).</p><p>Способов защиты на этом уровне не так много. Пожалуй, самым эффективным выступает (self-sandboxing), при котором приложение делает самозапрет на доступ к некоторым ресурсам системы. Например, сразу после инициализации — самозапрет на доступ к файловой системе.</p><p>Дополнительно запускаемый код можно подвергать строгому (синтаксическому) анализу, запрещая использование определенных функций, модулей, пакетов и т.п. Некоторые интерпретаторы имеют точки расширения, которые позволяют контролировать процесс исполнения. Если такой возможности нет, можно воспользоваться одной из техник самоизоляции — <a href="https://www.kernel.org/doc/html/latest/userspace-api/seccomp_filter.html">фильтрацией системных вызовов</a>.</p><p>Что же касается плагинов, то они призваны расширять возможности приложения, поэтому их использование изначально не предполагает сильной изоляции. Здесь можно предложить усилить контроль взаимодействия на уровне контракта (API). В идеале — если плагины будут публиковаться в некоторый центральный репозиторий, которому вы доверяете и который может производить дополнительные проверки и тестирование до этапа запуска кода плагина.</p><h3>Уровень 2: отдельный процесс</h3><p>Запуск внешнего кода на той же машине, но в отдельном процессе ОС.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/e0bf62de-65a9-4370-9986-ed21c6e63b8e.png" alt="Запуск внешнего кода на той же машине, но в отдельном процессе ОС." /><figcaption>Запуск внешнего кода на той же машине, но в отдельном процессе ОС.</figcaption></figure><p>Поскольку и приложение, и внешний код взаимодействуют в рамках одного узла, используя локальные ресурсы ОС (оперативная память, файловая система и т.п.), скорость межпроцессного взаимодействия очень высокая.</p><p>Этот уровень изоляции предполагает использование широкого арсенала возможностей. Как минимум, внешний код может быть запущен от имени менее привилегированного пользователя, с ограниченным доступом к ресурсам ОС. Сильные способы изоляции ограничивают ресурсы с помощью средств ОС или инструментов контейнеризации. Однако, чем сильнее контроль, тем больше накладных расходов на запуск и исполнение процесса, что при решении некоторых задач неприемлемо дорого или неоправданно сложно.</p><h3>Уровень 3: отдельная машина</h3><p>Запуск внешнего кода на отдельной машине — песочнице.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/5e48bc50-75c9-4789-9dc7-3bbf2c1659a7.png" alt="Запуск внешнего кода на отдельной машине — песочнице." /><figcaption>Запуск внешнего кода на отдельной машине — песочнице.</figcaption></figure><p>Это максимальный уровень изоляции из всех возможных. Здесь появляется возможность ограничить ресурсы самой песочницы (CPU, память, дисковое пространство, доступ к сети и т.п.). Если в результате исполнения внешнего кода песочница выйдет из строя, приложение продолжит свою работу.</p><p>Самый главный недостаток этого подхода — необходимость сетевого взаимодействия между узлом, на котором работает приложение, и песочницей. Передача входных данных в песочницу, запуск процесса внутри, ожидание окончания его исполнения, получение выходных данных — всё это сетевые обращения. Так существенно замедляется процесс исполнения, а само взаимодействие подвержено сетевым сбоям, что ведёт к нестабильности системы и получаемых результатов.</p><h2>Использование песочницы</h2><p>Предположим, требуется максимальный уровень изоляции ненадёжного кода, следовательно, нужно остановиться на варианте запуска на отдельной машине. Если так, то для принятия последующих архитектурных решений нужно ответить на следующую пару вопросов.</p><h3>Пересоздание или переиспользование песочницы</h3><p>Песочницу требуется пересоздавать перед исполнением каждой задачи, если требуется особенное окружение (например, определенная версия ОС, пакетов или ресурсов) или идентичность этого окружения (для стабильности получаемых результатов). Схожие вопросы возникают, например, при интеграционном тестировании: каждому тесту нужны свои предустановки.</p><p>Переиспользование песочницы становится возможным, если задачи могут исполняться в одном окружении и не оказывают влияния друг на друга (предыдущая задача не портит результаты последующей). Продолжая аналогию с интеграционным тестированием: всем тестам нужны одинаковые предустановки, и тесты могут запускаться повторно на одном стенде, демонстрируя один и тот же результат.</p><p>Основным преимуществом пересоздания песочницы выступает стабильность получаемых результатов. К недостаткам относится медленный запуск и перерасход ресурсов. На пересоздание песочницы уходят десятки секунд или даже минут, следовательно, большая часть ресурсов будет тратиться именно на это. Существует множество техник ускорения пересоздания, благодаря которым можно сократить время запуска. Прежде всего, сюда можно отнести backup/restore (snapshot песочницы, базы данных и т.п.). Также если поток задач небольшой и ресурсы позволяют, можно попробовать организовать пул песочниц и создавать их заранее.</p><p>Ставка на переиспользование делается в случае, когда поток задач большой и нужно сократить время ожидания их запуска. При этом возрастает вероятность получения нестабильных результатов и, возможно, требуется производить какую-то очистку окружения до или после исполнения очередной задачи.</p><h3>Последовательное или параллельное исполнение</h3><p>Теперь осталось ответить на вопрос, как именно можно или нужно исполнять задачи: последовательно или параллельно. Последовательное исполнение требуется в следующих случаях:</p><ul><li>важен порядок следования и исполнения задач;</li><li>задачам нужен эксклюзивный доступ к определенному ресурсу;</li><li>задачи ёмкие и их совместное исполнение вызовет нехватку ресурсов;</li><li>задачи могут мешать исполнению друг друга из-за борьбы за ресурсы.</li></ul><p>Например, шаги установки и настройки ПО; шаги CI/CD-конвейера; рендеринг изображения на GPU; интенсивные вычисления. Все эти задачи, скорее всего, придётся исполнять <b>последовательно</b>.</p><p>В остальных случаях допустимо <b>параллельное исполнение</b>. Яркой аналогией может служить одна из лучших практик в тестировании: тесты не должны оказывать влияние друг на друга, а порядок их запуска не должен иметь значения.</p><p>Последовательное исполнение обеспечивает стабильность получаемых результатов, однако приводит к низкой пропускной способности и дороговизне масштабирования (песочница обходится дороже процесса ОС). Параллельное исполнение, напротив, увеличивает пропускную способность системы и улучшает утилизацию ресурсов песочницы, но одновременно повышает вероятность нестабильных результатов. Более того, при параллельном исполнении появляется шанс перегрузить песочницу или вывести её из строя таким образом, что приведет к увеличению времени исполнения всех запущенных задач или потере результатов их работы.</p><p>На практике было замечено, что при параллельном исполнении, несмотря на увеличенную общую пропускную способность, время исполнения каждой отдельной задачи увеличивается. Если уровень параллелизма становится больше числа CPU-ядер, время исполнения начинает деградировать намного сильней.</p><h2>Управление песочницами</h2><p>Допустим, переиспользование песочниц возможно. В таком случае необходимо определить способ управления ими. Можно выделить два подхода, основанные на принципах микросервисной архитектуры, но адаптированные к специфике рассматриваемой проблемы.</p><h3>Оркестрация</h3><p>Оркестрация предполагает, что приложение совмещает две роли: оркестратор исполнения и оператор песочниц. Оркестратор координирует процесс исполнения кода: выбор подходящей песочницы, загрузка в неё входных данных, запуск удалённого процесса, получение результатов его работы и т.п. Оператор, в свою очередь, отслеживает доступные песочницы и их состояние.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/93758cab-2542-4a80-b47a-d65b04ef4f14.png" alt="Оркестрация песочниц." /><figcaption>Оркестрация песочниц.</figcaption></figure><p>Основное преимущество оркестрации в контексте решаемой проблемы — её простота и ясность. Код легко читается и сосредоточен в одном месте. Однако у этого решения есть и недостатки. Рассмотрим их в порядке от простого к сложному.</p><ul><li><i>Синхронное взаимодействие.</i> Так или иначе, для результата приложение вынуждено ожидать окончания исполнения задачи. Для продуктивного использования ресурсов приходится прибегать к техникам асинхронного программирования: пока задача исполняется, приложение будет занято полезной работой. Это малозаметный недостаток в языках со встроенной поддержкой концепции асинхронного программирования. Для упрощения работы с асинхронным кодом в Java я создал небольшую вспомогательную библиотеку <a href="https://github.com/AlexMAS/asynchronizer">asynchronizer</a>, снабдив её подробной <a href="https://github.com/AlexMAS/asynchronizer/blob/main/docs/README.ru.md">документацией</a>.</li></ul><ul><li><i>Отслеживание доступности песочниц.</i> Поскольку хотелось бы, чтобы количество песочниц менялось в зависимости от нагрузки на систему, придётся отслеживать их доступность. Это прямая обязанность оператора песочниц, которую можно выделить в отдельный discovery-сервис (например, на базе <a href="https://github.com/spring-cloud/spring-cloud-netflix">Netflix Eureka</a>), либо реализовать как часть приложения с использованием инфраструктурных механизмов (например, <a href="https://github.com/fabric8io/kubernetes-client">Kubernetes API</a>). Важно отметить, что оператор песочниц не имеет отношения к бизнес-логике приложения.</li></ul><ul><li><i>Отслеживание загруженности песочниц.</i> Оркестратор исполнения должен выбрать подходящую <a href="https://samwho.dev/load-balancing/">стратегию балансировки</a>, основанную на состоянии песочниц, предоставляемых оператором. На практике наилучшую эффективность демонстрирует алгоритм Least connections, с помощью которого можно выбирать наименее загруженные песочницы. Для этого достаточно вести учёт количества задач, исполняемых каждой песочницей. Конечно, это не серебряная пуля, а лишь частное наблюдение, поэтому в идеале нужно предусмотреть несколько стратегий балансировки и выбрать наилучшую по результатам нагрузочного тестирования.</li></ul><ul><li><i>Неопределённость результата, если нет ответа от песочницы.</i> Песочница может быть недоступна по различным причинам, включая не только проблемы с сетью, но и падения песочницы из-за ненадёжного кода. К сожалению, в общем случае эта проблема не имеет решения, так как делать повторные запуски (retries) может быть опасно. Всё, что остаётся, это использовать таймауты и откладывать неуспешную задачу на потом.</li></ul><p>Ещё один существенный минус, который стоит упомянуть, это возможный побочный эффект, возникающий при масштабировании системы и проявляющийся в виде перегрузки песочниц. Для наглядности рассмотрим конкретный пример.</p><p>Для отслеживания нагрузки на песочницы экземпляр приложения ориентируется на количество задач в каждой из доступных песочниц. Предположим, что было принято решение увеличить количество экземпляров приложения. Этот экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой). Известно, что каждая песочница может вынести максимум 4 параллельных задачи.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/623f7e7c-71d0-41da-8681-731ef43d3716.png" alt="Экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой)." /><figcaption>Экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой).</figcaption></figure><p>Добавив новый экземпляр приложения, неизвестно, сколько задач исполняет каждая песочница. Такая ситуация может произойти по разным причинам.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/7131d310-7c0d-44b8-b031-055436bd64d8.png" alt="Новый экземпляр приложения не знает, сколько задач исполняет каждая песочница." /><figcaption>Новый экземпляр приложения не знает, сколько задач исполняет каждая песочница.</figcaption></figure><p>Вполне очевидно, что новый экземпляр приложения направит очередную задачу в первую попавшуюся песочницу, чем может спровоцировать её перегрузку. В итоге результат исполнения будет испорчен или потерян из-за падения песочницы.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/c65090e5-020f-4eff-826b-566d3dc6da5c.png" alt="Очередная задача направляется в первую песочницу и провоцирует её перегрузку." /><figcaption>Очередная задача направляется в первую песочницу и провоцирует её перегрузку.</figcaption></figure><p>В качестве решения можно предложить два способа, каждый из которых уменьшает вероятность возникновения перегрузок, но не избавляет от них.</p><ul><li><i>Для контроля количества исполняемых задач в песочнице использовать распределённый счётчик</i> (например, на базе Redis). Проблема в том, что распределённый счётчик имеет латентность и на момент запуска задач может выдать устаревшее значение. Кроме того, в системе появляется еще один инфраструктурный компонент, который не несёт бизнес-пользы.</li></ul><ul><li><i>Выделить каждому экземпляру приложения эксклюзивное подмножество песочниц.</i> Подобное решение существенно усложнит deployment-скрипты и процесс масштабирования, а также снизит степень утилизации выделенных ресурсов, ведь нет никаких гарантий того, что экземпляр приложения сможет хорошо нагрузить все выделенные ему песочницы.</li></ul><p>Кстати, после доклада на TechLeadConf 2025 мне задали интересный вопрос: <i>Можно ли при балансировке нагрузки на песочницы учитывать не только количество исполняемых задач, но и процент загрузки CPU, памяти и прочих ресурсов? </i>Если у кого-то возник такой же вопрос, то отвечу, что это не имеет смысла, поскольку ситуация в песочнице может поменяться мгновенно. Полученный практический опыт и нагрузочное тестирование показали, что простой подсчёт задач работает эффективно.</p><h3>Самоорганизация</h3><p>В микросервисной архитектуре подобный подход принято называть хореографией, однако чтобы не возникало неправильных ассоциаций, предлагаю использовать термин <i>самоорганизация</i>.</p><p>Ключевой момент в архитектуре — это появление двух очередей: очередь задач на исполнение (Task Queue) и очередь результата их исполнения (Result Queue). Все поступающие задачи приложение направляет в первую очередь, а результаты — во вторую. Дополнительно появляется роль агента — микросервиса, который исполняется в рамках узла песочницы и координирует исполнение поступающих задач.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/0d449846-e767-49bd-bd50-d1c77c49cf10.png" alt="Самоорганизация песочниц." /><figcaption>Самоорганизация песочниц.</figcaption></figure><p>Основной недостаток самоорганизации — распределённый процесс обработки задач. Учитывая простоту алгоритма обработки, это не так существенно. Стоит отметить преимущества этой архитектуры.</p><ul><li><i>Максимальная изоляция ненадёжного кода.</i> Ненадёжный код, как и в случае с оркестрацией, по-прежнему работает в песочнице в рамках отдельного процесса ОС.</li></ul><ul><li><i>Скорость и стабильность взаимодействия.</i> Никаких проблем с сетью  из-за локальности взаимодействия между агентом и песочницей.</li></ul><ul><li><i>Контролируемая нагрузка на песочницы.</i> Агент, выступая в роли консюмера очереди задач, может точно контролировать степень параллелизма и выбирать новые задачи только тогда, когда он закончил обрабатывать предыдущие.</li></ul><ul><li><i>Минимум инфраструктурного кода.</i> Очереди избавляют от необходимости иметь оператор песочниц, отслеживать их состояние и осуществлять балансировку нагрузки.</li></ul><ul><li><i>Простота масштабирования.</i> Приложение и песочницы масштабируются независимо друг от друга без негативных побочных эффектов.</li></ul><h2>Запуск процесса ОС</h2><p>К запуску процесса ОС, в рамках которого будет исполняться ненадёжный код, нужно подойти с особой осторожностью. Здесь важно ответить как минимум на три вопроса.</p><ul><li><i>Как ограничить права доступа к ресурсам.</i> Самое простое решение — запуск процесса от имени пользователя с ограниченными правами (на доступ к ресурсам ОС).</li></ul><ul><li><i>Как ограничить объем используемых ресурсов.</i> Для запускаемого процесса нужно определить доступные ресурсы и возможные действия.</li></ul><ul><li><i>Как осуществлять анализ поведения и результатов исполнения.</i> Наличие и решение этой проблемы целиком и полностью зависит от специфики проекта. Здесь невозможно предложить универсального решения.</li></ul><p>Рассмотрим варианты ограничения ресурсов процесса ОС.</p><h3>Ограничение ресурсов процесса</h3><p>Ресурсы процесса могут быть ограничены на трех уровнях:</p><ul><li><i>Лимиты узла.</i> Физические ограничения машины, на которой исполняется процесс. В частном случае можно говорить об инфраструктурных лимитах, определённых для Docker/Kubernetes контейнера.</li></ul><ul><li><i>Лимиты контейнера.</i> Программные лимиты, задаваемые выбранным инструментом контейнеризации (cgroup, Docker, <a href="https://dzen.ru/a/Z8sdaQvf5w96SRes">Bubblewrap</a>, <a href="https://github.com/AlexMAS/ProcessSandbox">ProcessSandbox</a> и т.п.).</li></ul><ul><li><i>Лимиты процесса.</i> Программные лимиты, задаваемые средствами ОС. На этом уровне можно осуществлять гибкую настройку вариантов запуска и исполнения.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/d11a1ee8-1780-4ca6-b826-a09d4d95ed0d.png" alt="Уровни лимитирования ресурсов процесса." /><figcaption>Уровни лимитирования ресурсов процесса.</figcaption></figure><p>Можно использовать все три уровня лимитирования, либо какой-то определенный.</p><p>Между тем, важно отметить некоторые трудности, которые могут возникнуть при использовании инструментов контейнеризации.</p><p>Например, для использования cgroup или Docker внутри Kubernetes-контейнера нужно эскалировать привилегии контейнера, что в общем случае небезопасно в контексте исполнения ненадёжного кода. Более того, практика показала, что легковесных rootless-средств, предоставляемых ОС, вполне достаточно, чтобы снять большую часть рисков. В частности, Linux API позволяет не только лимитировать CPU и память, но и блокировать доступ к некоторым возможностям самой ОС. Например, можно наложить фильтр, который запретит вызов определённых системных функций.</p><h3>Проблемы жёсткого лимитирования</h3><p>Рассмотренные выше способы лимитирования задают жёсткие границы (hard limit), нарушение которых замедляет исполнение процесса, либо приводит к его принудительному завершению. При этом поведение наблюдаемого процесса и системы сильно варьируется в зависимости от того, какой лимит был превышен. Например, превышение по использованию CPU может привести к троттлингу (throttling), приостановке работы или принудительному завершению; превышение по использованию памяти заканчивается принудительным завершением со стороны ОС (OOM Killer) либо самостоятельным падением процесса (с ошибкой Out Of Memory).</p><p>Подобная вариативность осложняет <i>анализ поведения и результатов исполнения.</i> В этом случае можно использовать подход с программной мягкой границей (watchdog limit). Суть заключается в запуске дополнительного следящего потока (или процесса) ОС, который контролирует поведение и расход ресурсов у наблюдаемого. Как только детектируется превышение одного из лимитов, производится принудительное завершение наблюдаемого процесса, но уже не со стороны ОС, а со стороны приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/e38eb138-04f3-439f-89b5-9b810f112a69.png" alt="Программная мягкая граница (watchdog limit)." /><figcaption>Программная мягкая граница (watchdog limit).</figcaption></figure><p>Такой подход имеет несколько преимуществ.</p><ul><li><i>Точное определение причин принудительного завершения.</i> Жёсткие лимиты чуть выше мягких, благодаря чему для исполняемого кода создаётся иллюзия отсутствия каких-либо лимитов. Между тем, если лимиты всё-таки нарушаются, процесс всё равно будет завершен (либо со стороны приложения, либо гарантированно со стороны ОС). Но подобный дополнительный контроль со стороны приложения оставляет для него гораздо больше шансов понять причину принудительного завершения наблюдаемого процесса.</li></ul><ul><li><i>Возможность гибкого лимитирования ресурсов.</i> Приложение (или агент), ответственное за запуск наблюдаемого процесса, может обратиться к средствам ОС (в частности, к Linux API) и гибко настроить параметры запуска и исполнения. Как минимум, жёстко определить лимиты по CPU и памяти; наложить ограничения на объем I/O; создать запрет на вызов некоторых системных функций (например, запрет использования сетевых операций или файловой системы) и т.п.</li></ul><p>Такой подход я назвал watchdog и в целях иллюстрации реализовал его в виде .NET-библиотеки <a href="https://github.com/AlexMAS/ProcessSandbox">ProcessSandbox</a>. Помимо прочего, на странице проекта подробно рассмотрена проблематика контроля и анализа поведения процесса ОС со стороны прикладного кода.</p><p>Итоговая схема лимитирования может выглядеть так, как показано на рисунке ниже. Вместо тяжеловесных инструментов контейнеризации используется легковесный rootless-инструмент (watchdog) на базе средств ОС и только.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/2c5e74e4-125b-467d-8b27-30b005364523.png" alt="Лимитирование ресурсов процесса с помощью watchdog." /><figcaption>Лимитирование ресурсов процесса с помощью watchdog.</figcaption></figure><p>Для задач, где не нужен анализ поведения процесса и тонкая настройка лимитов, можно воспользоваться готовым инструментом — утилитой.</p><h2>Многоконтейнерные поды</h2><p>Зная, что контейнеры одного Kubernetes-пода работают на одном и том же узле, можно попытаться решить проблему нестабильности сетевого взаимодействия приложения и песочницы, разместив их контейнеры в одном поде.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/62400b6a-9c5b-4285-bff8-b0adb5ac8868.png" alt="Размещение контейнера приложения и песочницы в одном Kubernetes-поде." /><figcaption>Размещение контейнера приложения и песочницы в одном Kubernetes-поде.</figcaption></figure><p>Несмотря на всю заманчивость данной идеи, она несёт ряд недостатков.</p><ul><li><i>Плохая масштабируемость.</i> Соотношение приложение-песочница всегда один к одному. Однако не исключено, что в некоторых случаях это вполне приемлемо.</li></ul><ul><li><i>Плохая утилизация ресурсов.</i> Сможет ли приложение достаточно нагрузить песочницу, если количество песочниц будет в избытке; и наоборот, нужно ли столько же экземпляров приложения, сколько и песочниц.</li></ul><ul><li><i>Возможность перегрузки песочницы.</i> В распоряжении экземпляра приложения только одна песочница, которая может не справиться с потоком задач, обрабатываемых приложением.</li></ul><ul><li><i>Риск нарушить работоспособность приложения.</i> Выход песочницы из строя скорее всего приведет к перезапуску всего пода. Более того, если приложение и песочница обмениваются файлами через общий раздел (<a href="https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/">shared volume</a>), это может стать уязвимым местом.</li></ul><h2>Образ для песочницы</h2><p>Основные моменты, которые следует учесть при создании (Docker) образов песочниц:</p><ul><li><i>Заменить init-процесс</i> на <a href="https://github.com/krallin/tini">tini</a>, чтобы не превысить лимит по PIDs.</li></ul><ul><li><i>Создать непривилегированного пользователя,</i> ограничив ему права на доступ к ресурсам.</li></ul><ul><li><i>Регулярно сканировать версии образов</i> и пакетов на наличие уязвимостей.</li></ul><h2>Инфраструктура исполнения</h2><p>Основные моменты, которые следует учесть при настройке инфраструктуры исполнения:</p><ul><li><i>Обеспечить быстрый (пере)запуск песочниц.</i> Нужно быть готовым к тому, что песочницы будут падать. Если речь идет о Kubernetes, то улучшить время запуска может подходящая настройка <a href="https://kubernetes.io/docs/concepts/containers/images/">Image Pull Policy</a>. При этом лучше не использовать тег `latest`, а указывать конкретную версию или хэш-код образа, чтобы не тратить время на попытки определения последней версии при каждом запуске.</li></ul><ul><li><i>Установить приемлемый <a href="https://kubernetes.io/docs/concepts/policy/pid-limiting/">лимит на PIDs</a>.</i> Необходимо контролировать число активных процессов в системе. Особо вредоносный код может попытаться создать очень много дочерних процессов, поэтому при отсутствии лимита на PIDs узел быстро будет выведен из строя. Важно отметить, что лимит задаётся для пользователя, а не для запускаемого процесса. По этой причине он должен быть разумно большим.</li></ul><ul><li><i>Установить <a href="https://kubernetes.io/docs/concepts/policy/resource-quotas/">лимиты на ресурсы узла</a>.</i> В Kubernetes для каждого контейнера нужно указать, как минимум, лимиты по CPU и памяти. Значения лимитов лучше всего определить в ходе нагрузочного тестирования или путём сбора метрик приложения.</li></ul><h2>Заключение</h2><p>Как можно заметить, задача исполнения ненадёжного кода всегда решается в комплексе, начиная с анализа, продолжая разработкой и заканчивая вопросами уровня DevOps. Думаю, что многие техники и инструменты применимы и к коду самого приложения.</p><p>Я постарался показать последовательность шагов по направлению к целевой архитектуре, которая будет отвечать требованиям бизнеса и справляться с ненадёжным кодом. <i>Если вам интересна данная тематика, подписывайтесь на мой Telegram-канал Архитектоника в ИТ (@arch_and_dev). Буду рад поделиться опытом. </i></p>]]></content:encoded>
    </item>
    <item>
      <title>Нас превращают в киборгов? Как нейроимпланты, протезы и ИИ становятся частью нашего тела уже сегодня</title>
      <link>https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya</link>
      <comments>https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya</guid>
      <description><![CDATA[<p>Рассмотрим, сколько людей в мире с нейроимплантами, что уже умеют современные нейроинтерфейсы с ИИ и какие новые проблемы это порождает.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya">Нас превращают в киборгов? Как нейроимпланты, протезы и ИИ становятся частью нашего тела уже сегодня</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Opera]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Нейрочип]]></category>
      <category><![CDATA[Neuralink]]></category>
      <category><![CDATA[Илон Маск]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 1960 году учёные Манфред Клайнс и Натаниэл С. Клайн <a href="http://www.medientheorie.com/doc/clynes_cyborgs.pdf">ввели </a>в обиход слово «киборг». Изначально термин описывал людей, которые могут выживать в космосе с помощью техники, встроенной прямо в тело. Со временем это понятие быстро расширилось: киборгом стали называть любого, кто использует технологии не только для экстремальных условий, но и для обычной жизни.</p><p>Сегодня к киборгам относят всех, у кого есть что-то технологичное внутри или на себе: кардиостимулятор, слуховой аппарат, нейроимплант или бионический протез. Даже смарт-часы и фитнес-браслет — простейшие примеры кибернетического дополнения.</p><h2>Сколько в мире людей с имплантами?</h2><p>Импланты и протезы становятся всё более привычной частью жизни во всём мире.</p><p><b>Протезы конечностей.</b> По оценке <a href="https://www.who.int/news-room/fact-sheets/detail/assistive-technology">ВОЗ</a>, в протезах и ортезах нуждаются от 35 до 40 миллионов человек по всему миру, но только один из десяти реально получает нужное устройство. В России, по <a href="https://www.rbc.ru/industries/news/65377d919a7947c1f7a2dd21">данным </a>Минтруда, протезы конечностей стоят у 200 тысяч человек. Мировой рынок биопротезов уже <a href="https://trends.rbc.ru/trends/industry/660ef9569a7947a72761db51">перевалил</a> за $1,5 млрд и, по прогнозам, вырастет почти вдвое к 2030 году.</p><p><b>Кардиостимуляторы.</b> Более <a href="https://www.ahajournals.org/doi/10.1161/01.cir.0000016183.07898.90">3 миллионов</a> людей в мире живут с кардиостимуляторами. Каждый год медики устанавливают ещё от 600 тыс. до миллиона новых устройств, и эта цифра стабильно растёт.</p><p><b>Кохлеарные импланты.</b> Более 1 млн человек по всему миру <a href="https://pubs.aip.org/asa/jel/article/2/7/077201/2844572/Celebrating-the-one-millionth-cochlear-implanta">получили </a>кохлеарные импланты — устройства, которые возвращают слух даже тем, кто не слышал с рождения.</p><p><b>Нейроинтерфейсы.</b> Это пока самая «экспериментальная» ниша: в мире насчитывается менее сотни человек с вживленными в мозг чипами, которые считывают сигналы и возвращают некоторые утраченные способности. Среди них — пациенты Neuralink, Synchron, Precision Neuroscience и других лабораторий.</p><p><b>Добровольно чипированные.</b> По оценкам <a href="https://www.govtech.com/blogs/lohrmann-on-cybersecurity/should-states-ban-mandatory-human-microchip-implants">Government Technology</a>, от 50 000 человек на планете добровольно вживили себе микрочипы — чаще всего для замены пропуска, банковской карты или электронного ключа. К примеру, американская компания Three Square Market (32M) в 2017 году <a href="https://www.computerra.ru/292329/chatgpt-podskazal-rossiyaninu-implantirovat-sebe-chip-v-ruku-eksperiment-auruma-kettunena/">вживила </a>50 сотрудникам NFC-чипы для замены пропуска и кредитки. Аналогично поступила шведская компания BioHax International в отношении 150 сотрудников.</p><p>В 2015 году менеджер российской компании Ericsson тоже <a href="https://vc.ru/flood/11234-kino-cut">вживил </a>себе NFC-чип и использует его как визитную карточку. Энтузиаст отмечает, что более современные чипы можно использовать для оплаты в магазине.</p><p>Как мы видим, импланты и протезы постепенно перестают быть диковинкой, набирают число носителей и выходят в массы, причем не только в сфере здравохранения, но и для бытовых задач.</p><h2>Что уже умеют современные импланты?</h2><p>Современные импланты умеют многое. Нейроинтерфейсы, благодаря связке с внешними устройствами, могут вернуть человеку возможность говорить, писать текст, сёрфить в интернете. Бионические протезы по функциональности становятся всё ближе к полноценным конечностям. Вот несколько историй пациентов, которым технологии дали новые возможности:</p><h3>Нолан Арбо: парализованный, который играет в Civilization VI</h3><p>В 2016 году Нолан Арбо получил тяжёлую травму позвоночника, он оказался парализован.</p><p>В январе 2024 года Нолану <a href="https://www.forbes.ru/tekhnologii/513387-pervyj-pacient-s-cipom-neuralink-rasskazal-o-zizni-posle-operacii">вживили </a>чип Neuralink, компании Илона Маска. Специальный робот-хирург вскрыл небольшой участок черепа и установил там нейроимплант. Сам чип — это миниатюрный диск чуть меньше монеты, к нему подходят полторы тысячи тонких электродов, которые вводятся прямо в кору мозга. Такой подход даёт максимальную пропускную способность: электроды фиксируют мельчайшие импульсы нейронов и более точно конвертируют их в команды.</p><p>Всего через неделю после операции Нолан смог снова общаться с миром. Он управляет курсором силой мысли, сёрфит в интернете, переписывается с друзьями, играет в Civilization VI. Всё это — без движения рук.</p><p>Чип Neuralink <a href="https://blog.skillfactory.ru/chip-ilona-maska/">связывает мозг и внешние устройства</a>. Электроды фиксируют сигналы мозга, чип распознаёт их, отправляет по Bluetooth на внешний модуль. Далее алгоритм интерпретирует эти сигналы для каждой команды и выполняет действие: сдвинуть курсор, выбрать приложение, напечатать текст.</p><p>Из недостатков: чип нужно заряжать каждый день, зарядка происходит беспроводным способом.</p><h3>Филип О’Киф: пациент с БАС, который снова в сети</h3><p>Филип О’Киф — бывший банковский работник, отец семейства. В 2015 году он начал замечать слабость в руках и ногах, ему стало сложно выполнять привычные действия — писать, одеваться, работать за компьютером. Постепенно болезнь прогрессировала: Филип стал терять подвижность, речь — менее чёткая. Врачи поставили диагноз — боковой амиотрофический склероз (БАС), при котором постепенно отмирают моторные нейроны, и человек теряет возможность двигаться и говорить. Через несколько лет Филип оказался почти полностью парализованным.</p><p>Вместо сложной нейрохирургии врачи <a href="https://translated.turbopages.org/proxy_u/en-ru.ru.b4bb4b7d-684bd845-43c64ae1-74722d776562/https/www.dailymail.co.uk/news/article-10348257/Paralysed-man-person-tweet-message-using-MIND-thanks-tiny-brain-implant.html">использовали </a>чип Stentrode от американской компании Synchron. Его ввели через вену на шее: чип сам «дошёл» до нужной зоны мозга и раскрылся там в виде сеточки с 16 контактами. Второй модуль вживили под кожу на груди — он передаёт сигналы наружу. Оба устройства связали тонким проводом.</p><p>Через несколько дней пациент <a href="https://www.indiatimes.com/technology/news/brain-chip-paralysed-man-tweet-thoughts-557863.html">начал</a> заново писать сообщения, сидеть в соцсетях, отвечать на письма. Недавно другой пользователь с тем же чипом <a href="https://hightech.fm/2024/08/01/bci-vision-pro">смог работать</a> с гарнитурой Apple Vision Pro. Это стало возможно благодаря интеграции в чип системы управления зрением.</p><p>Stentrode <a href="https://synchron.com/technology">фиксирует </a>электрическую активность моторной коры — зону мозга, отвечающую за движения. <a href="https://reports.mountsinai.org/article/neuro2022-10-stentrode-research">Сигналы идут</a> по проводам к подгрудному модулю, а дальше — по беспроводу к компьютеру. Алгоритмы ИИ учатся на примерах пользователя, отличают команду «нажать» от «двинуть» и со временем становятся точнее. Для операции не требуются сложные хирургические вмешательства — человек возвращается домой через пару дней.</p><h3>Андрей Марсаков — программист с механическим протезом руки</h3><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/6f8f9e75-cf84-4ee2-a0bc-cfa310b0a9ba.jpg" alt="" /><figcaption>Андрей Марсаков. Источник — Комсомольская Правда</figcaption></figure><p><a href="https://www.ural.kp.ru/daily/27652/5003518/">Андрей Марсаков</a> — 26-летний программист из Екатеринбурга. Он родился без правой кисти (врождённая аплазия) и с детства привык делать всё одной рукой. Однажды решил попробовать «другую жизнь» с протезом — чтобы упростить повседневные задачи и получить новый опыт.</p><p>В конце 2023 года Андрей получил активный механический протез кисти от компании «Моторика». Ожидание устройства заняло почти полгода, стоимость составила примерно 200 тыс. рублей. Кстати, есть <a href="https://rg.ru/2024/11/18/nadezhnaia-podderzhka.html?utm_source=chatgpt.com">госпрограмма</a>, которая позволяет получить такие протезы.</p><p>Протез управляется системой тросов: при движении мышц культи энергия передаётся на ладонь, и та выполняет простые движения. Нет электроники, батарей, сенсоров или обратной связи — это чистая механика.</p><p>Сначала было сложно разобраться, как с ним работать, но через какое-то время Андрей смог пользоваться протезом. К примеру, он использует шейкер и разливает по бокалам коктейли. Писать код второй рукой тоже можно, но слишком медленно, поэтому работает он по-прежнему одной.</p><h3>Устройство от Cortical Labs: компьютер из схем и клеток человеческого мозга</h3><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/6b5a8942-06e0-415b-acaf-09ead744b4c0.jpg" alt="" /><figcaption>Скриншот изображения компьютера с corticallabs.com</figcaption></figure><p>В 2025 году австралийский стартап Cortical Labs <a href="https://spectrum.ieee.org/biological-computer-for-sale">представил </a>первый коммерческий биокомпьютер CL1. Учёные вырастили в лаборатории 800 тысяч человеческих нейронов и соединили их с обычной микросхемой. Получился гибрид: нейроны могут учиться и адаптироваться как живой мозг, а микросхема передаёт сигналы в цифровом виде.</p><p>CL1 используют для тестирования лекарств, исследований искусственного интеллекта и даже создания новых типов нейроинтерфейсов. Живые нейроны быстрее обучаются, а сама система потребляет в десятки раз меньше энергии, чем классический ИИ на кремнии.</p><p>Нейроны располагаются на специальном субстрате, к ним подключены сенсоры, которые фиксируют активность и передают в компьютер. Учёные могут отправлять сигналы напрямую в нейронную сеть, а биокомпьютер — отвечать в реальном времени. CL1 уже продаётся лабораториям по всему миру, а доступ к устройству можно получить даже удалённо, через облако.</p><p>Авторы проекта открыто заявляют: в будущем такие биокомпьютеры станут основой для продвинутых нейроинтерфейсов и гибридных ИИ — на стыке биологии и математики.</p><h2>Животные киборги: чипированные свиньи, обезьяна-телепат и мыши на радиоуправлении</h2><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/b6641801-e4a9-4dac-abbb-e62f47a3ce0c.jpg" alt="" /><figcaption>Скриншот новости про эксперимент Маска с Lenta.ru</figcaption></figure><p>Не только людям устанавливают импланты. Часто обладателями новых технологий становятся и животные. С одной стороны, это целесообразно с точки зрения клинических испытаний, с другой стороны, позволяет минимизировать присутствие человека в некоторых опасных сценариях, например, при поиске пострадавших под завалами. Вот несколько историй с чипированными животными:</p><p><b>Свиньи Neuralink.</b> В 2020 году Илон Маск <a href="https://www.teslarati.com/elon-musk-neuralink-smartwatch-features-implant-robot-live-demo-video/">показал </a>миру свиней с нейрочипами Neuralink. После операции животные быстро восстановились и вернулись к обычной жизни. Один из чипов даже успешно извлекли — и никаких побочных эффектов не было. Эти эксперименты доказали, что мозговой имплант можно не только внедрить, но и безопасно достать. Это важно с точки зрения обслуживания и возможных обновлений.</p><p><b>Обезьяна, играющая в Pong.</b> В 2021 году Neuralink <a href="https://www.theverge.com/2021/4/8/22374749/elon-musk-neuralink-monkey-pong-brain-interface">внедрили </a>свой чип обезьяне по кличке Pager. После короткого курса обучения она смогла сыграть в аркадную видеоигру Pong: не джойстиком, а мысленным управлением. Чип фиксировал всплески нейронной активности, ИИ-алгоритмы расшифровывали их и передавали команды на экран.</p><p><b>Мыши и крысы в BCI-лабораториях.</b> Одна из самых известных работ — <a href="https://www.sciencedaily.com/releases/2002/05/020503080514.htm">эксперименты исследователей</a> из медицинского центра Downstate в Нью-Йорке. Учёные в начале 2000-х вживили крысам три электрода: один стимулировал «лево», другой «право», а третий — зону удовольствия. Управляя этими сигналами с компьютера по радиоканалу, исследователи заставляли крыс проходить по сложному лабиринту строго по заданной траектории — получились радиоуправляемые животные.</p><h2>Как ИИ помогает людям с имплантами и протезами?</h2><h3>Узкоспециализированные ИИ</h3><p><b>ИИ для протезов ноги</b></p><p>ИИ — отличное дополнение для протезов. У разных компаний есть свои узкоспециализированные разработки в этой области. К примеру, в системах <a href="https://spa-prod-commerce.cep.ottobock.com/medias/5040276.pdf?attachment=true&amp;context=bWFzdGVyfHJvb3R8MTgwNjA5NXxhcHBsaWNhdGlvbi9wZGZ8aDA4L2hiMS85NDE1MDExNTk4MzY2LnBkZnxlNzg4YWUzNWZhZDFkZTY5OTViOGU1ZTQ5M2YwNzFlNzAxYmIyOTYxNDQ4NWJkNTQyZDE0MDJmYTkzNGJlZTI2">Ottobock </a>и <a href="https://accessprosthetics.com/wp-content/uploads/2017/06/rheo-instructions-for-use.pdf">Össur</a> есть ИИ, который до 100 раз в секунду сравнивает движения, оценивает положение тела и заранее регулирует сопротивление в коленном суставе. Как итог, человеку комфортнее ходить даже по неровным поверхностям.</p><p><b>ИИ для улучшения моторики рук</b></p><p>С руками — та же история. Российская «Моторика» <a href="https://ai-russia.ru/library/motorika?utm_source=chatgpt.com">внедряет </a>нейросети, которые ловят электрический шум мышц и «видят» реальные сокращения в тканях. ИИ <a href="https://www.stimul.online/articles/kompaniya/protez-na-osnove-ii/">понимает</a>, какой палец должен двигаться, какой — оставаться на месте, а какой — мягко удерживать хрупкий предмет. Пока что эта технология находится в разработке в виде прототипа. С её помощью в будущем пользователи смогут выполнять сложные движения — наливать чай или нарезать овощи.</p><h3>LLM в теле человека</h3><p>Neuralink от Илона Маска <a href="https://futurism.com/nonverbal-neuralink-patient-grok-answers">использует</a> Grok для работы чипа. С помощью нейроинтерфейса человек мысленно набирает текст, а модель Grok в связке с ElevenLabs воспроизводит речь. Причем ИИ обучен на старых записях разговоров пациента. Человек «думает» фразу, а Grok озвучивает.</p><p>Компания Synchron, конкурент Neuralink, <a href="https://www.businesswire.com/news/home/20240711493318/en/Synchron-Announces-Brain-Computer-Interface-Chat-Feature-Powered-by-OpenAI">встроила</a> в свой нейроинтерфейс чат-бота на базе ChatGPT. Система предлагает парализованному пользователю варианты фраз и слов, позволяя силой мысли быстро создавать осмысленные предложения для общения.</p><h2>Основные проблемы нейроинтерфейсов, протезов и имплантов</h2><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/f6a257cd-ffba-4306-aa20-706f9a99523a.jpg" alt="" /></figure><h3>Стоимость и поддержка</h3><p>Самая очевидная проблема индустрии — сложные и дорогие операции. Здесь нужны хирурги, а любые сбои устройств могут навредить здоровью. Не все чипы работают стабильно: были случаи, когда пациенты теряли связь с имплантом или не могли его обслужить из-за банкротства производителя.</p><p>Например, в 2019 году компания Second Sight заявила о поэтапном прекращении работы и в итоге <a href="https://rusbankrot.ru/bankruptcy-and-liquidation/proizvoditel-bionicheskikh-glaz-obankrotilsya-ostaviv-patsientov-bez-tekhpodderzhki/">обанкротилась</a>. Компания предлагала свою продукцию слепым и слабовидящим. Стоимость одного импланта составляла $150 тыс. Пациенты после операции начинали лучше видеть, самостоятельно ходили в магазин, катались на лыжах. Однако, оказалось, что компания неправильно оценила затраты и работала в убыток, даже при таком высоком чеке. В результате она закрылась, а 350 пациентов с имплантами остались без поддержки.</p><h3>Риск утечки конфиденциальных данных из «мозга»</h3><p>Другая проблема — безопасность данных. Нейроинтерфейс может теоретически стать «точкой входа» для утечки личной информации.</p><p>В 2012 году группа ученых из Оксфордского и Калифорнийского университетов в Беркли провела <a href="https://www.wired.com/2012/08/brainwave-hacking">эксперимент</a>, продемонстрировавший уязвимость коммерческих нейроинтерфейсов. Добровольцам, на головы которых были надеты простые ЭЭГ-гарнитуры, показывали на экране ряд изображений: цифры, логотипы банков, карты местности. Сами участники не совершали никаких действий, просто смотрели.</p><p>Ученые анализировали P300-волны, которые возникают, когда человек видит что-то значимое или узнаваемое. Исследователи смогли определить личную информацию испытуемых. Точность угадывания первого знака в PIN-коде составила 20%; до 30% увеличилась точность определения банка и города испытуемого. Это, конечно, не 50% и даже не 100%, но всё равно высокий показатель.</p><p>Пока что это только эксперимент и реальных случаев таких взломов не было, но теоретически — возможно. Что, если злоумышленник сможет перехватывать сигналы от нейрочипа к внешнему компьютеру или подменить их?</p><h3>Медицинские риски</h3><p>Операции по установке имплантов и нейроинтерфейсов часто связаны с серьёзными рисками: инфекциями, кровоизлияниями, повреждением тканей мозга, формированием рубцов, которые мешают работе электродов. Даже спустя месяцы после операции может возникнуть воспаление или отторжение устройства. В случае поломки или износа потребуется новая операция, и никто не даст гарантий, что всё пройдет без осложнений.</p><p>К примеру, DBS-импланты используют для борьбы с болезнью Паркинсона. Операции по их внедрению могут длиться несколько часов. Это сложная и болезненная процедура, которую, в случае неудачи, придётся повторять.</p><p>Технологии вживления нейроинтерфейсов ещё недостаточно хорошо обкатана, это одна из причин, почему ей сложно вырваться в массы. Однако она становится всё более популярной и прогресс не стоит на месте. Люди с чипами или умными имплантами уже реальность, с которой мы будем сталкиваться чаще.</p><p>ИИ уже среди нас, и надо быть в курсе событий. Поэтому скорее подписывайтесь на наш <a href="https://t.me/+49dMRkhiJeRlZTNi">Нейроканал</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Архитектура BFF (Backend for Frontend): зачем нужна прослойка</title>
      <link>https://tproger.ru/articles/arhitektura-bff--backend-for-frontend---zachem-nuzhna-proslojka</link>
      <comments>https://tproger.ru/articles/arhitektura-bff--backend-for-frontend---zachem-nuzhna-proslojka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/arhitektura-bff--backend-for-frontend---zachem-nuzhna-proslojka</guid>
      <description><![CDATA[<p>Что такое архитектура BFF. Показываем, зачем нужна прослойка Backend for Frontend. Рассматриваем преимущества и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/arhitektura-bff--backend-for-frontend---zachem-nuzhna-proslojka">Архитектура BFF (Backend for Frontend): зачем нужна прослойка</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[App Store]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Spotify]]></category>
      <category><![CDATA[CSR]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[NFT]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте ситуацию: ваш REST API для CRM-системы отлично работает с веб-версией. Создаёте мобильное приложение для курьеров и упираетесь в стену. Эндпоинт заказов тащит 40 лишних полей с финансовой отчётностью, а нужной геолокации складов нет.</p><p>Может плодить новые эндпоинты или заставлять мобилку делать несколько запросов вместо одного? Каждый запрос жрёт трафик и батарею!</p><p>Элегантное решение — <b>архитектура Backend for Frontend (BFF)</b>. Это прослойка между клиентскими приложениями и основным API, которая адаптирует данные под потребности конкретного клиента.</p><h2>Основная идея backend for frontend</h2><p>Один API не может эффективно обслуживать разные типы клиентов. Сайт, приложение для iOS, Android, умные часы — у каждого свои потребности в данных, ограничения по производительности и особенности интерфейса.</p><p>Монолитный API создают с расчётом на универсальность — на практике это приводит к компромиссам. Веб-версии нужны данные для сортировки, мобильному приложению — минимальный набор для экономии трафика.</p><p><b>Следуя архитектуре BFF, вы можете создать логику для каждого типа клиента и не засорять основной API.</b> Вместо одного эндпоинта <i>/api/products</i>, который пытается угодить всем, появляются слои:</p><ul><li>один — оптимизирует данные для веба,</li><li>второй — для мобильных устройств,</li><li>третий — для умных часов.</li></ul><p>Обычно данные приходят в неудобном виде: несколько связанных сущностей нужно запрашивать отдельно и склеивать на клиенте. BFF берёт эту работу на себя.</p><p>Прослойка знает, что мобильному приложению нужны цены в рублях с округлением до целых, а веб-версии — точные значения в долларах. Для списка товаров мобилке достаточно названия и цены, а десктопной версии нужны ещё категории, рейтинги и количество отзывов.</p><p><b>Каждый клиент получает данные в том виде, в котором может их сразу отобразить</b>. Вместо загрузки 50 полей, из которых используется 5, BFF отдаёт только нужные данные.</p><p>«Можете добавить поле user_avatar в ответ?»</p><p>—<i> «Это сломает мобилку».</i></p><p>«Тогда сделайте отдельный эндпоинт».</p><p>—<i> «У нас нет времени».</i></p><p>С BFF этого диалога нет. Фронтенд-команда получает свой API и крутит его, как хочет.</p><p>Мобильное приложение съедает 10к запросов в секунду? Пишите BFF на Go. Веб-версию делает стажёр, который знает только JavaScript? Ставьте Node.js. Никто не заставляет выбирать одну технологию на все случаи жизни.</p><h2>Как работает backend for frontend (BFF)</h2><p>BFF размещается между клиентскими приложениями и основными бэкенд-сервисами, выполняя роль посредника. В отличие от API Gateway, который просто перенаправляет запросы, BFF трансформирует данные.</p><h3>Архитектура взаимодействия</h3><p>Классическая схема выглядит так: мобильное приложение обращается к своему BFF, веб-приложение — к своему, умные часы — к третьему. Каждый BFF знает особенности своего клиента и общается с основными сервисами на их «языке».</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/a765d5ae-2c66-4a1a-83fd-2f977ac31fa2.jpg" alt="" /><figcaption>Прослойка между клиентами и API</figcaption></figure><p>Когда мобильное приложение запрашивает список заказов, его BFF делает несколько вызовов к микросервисам:</p><ul><li>берёт базовую информацию о заказах,</li><li>подтягивает данные о товарах,</li><li>получает статусы доставки.</li></ul><p>Затем склеивает всё в один ответ, отбрасывая ненужные поля и добавляя вычисляемые значения.</p><p>Веб-версия для того же списка заказов получит расширенную информацию: подробные описания товаров, историю изменений статусов, данные для аналитики.</p><h3>Обработка и агрегация данных</h3><p>BFF не просто перекладывает данные из одного формата в другой. Он выполняет бизнес-логику.</p><p><i>Например, мобильный BFF может кешировать часто запрашиваемые данные, чтобы уменьшить количество сетевых запросов.</i></p><p>Если API возвращает цены в центах, мобильный BFF конвертирует их в рубли и округляет для отображения. Веб-версия получает точные значения с копейками для расчётов.</p><h3>Независимость и масштабирование</h3><p>Когда нагрузка на приложение растёт, масштабируется только его BFF. Проблемы с веб-версией не влияют на работу мобильных клиентов.</p><h2>4 ключевых преимущества BFF</h2><h3>Оптимизация передачи данных</h3><p>Самое очевидное преимущество — экономия трафика. Приложение не тащит 2 МБ JSON с полным каталогом товаров на мобильное устройство? BFF отдаёт только нужные поля.</p><p>Количество запросов тоже сокращается. Например, чтобы показать профиль пользователя, фронтенд делает 5 запросов:</p><ul><li>за основными данными,</li><li>аватаром,</li><li>списком друзей,</li><li>последними постами,</li><li>настройками приватности.</li></ul><p>BFF объединяет всё в один запрос, получая данные параллельно от разных сервисов.</p><h3>Упрощение фронтенда</h3><p>Половина фронтенд-кода уходит на трансформацию ответов API:</p><ul><li>парсинг дат,</li><li>группировку массивов,</li><li>вычисление производных значений.</li></ul><p>BFF может взять эту работу на себя.</p><h3>Безопасность через изоляцию</h3><p>BFF создаёт барьер между клиентами и сервисами. Мобильное приложение никогда напрямую не обращается к БД пользователей или платёжке — только через свой BFF.</p><p>Можно настроить разные уровни доступа:</p><ul><li>мобильный BFF видит только публичные данные,</li><li>API для партнёров работает в песочнице.</li></ul><p>Если мобильное приложение скомпрометировано, злоумышленник не получит доступ к внутренним сервисам.</p><h3>Независимое масштабирование</h3><p>Когда приложение попадает в топ App Store, нагрузка взлетает в разы. Но страдает только мобильный BFF — веб-версия продолжает работать стабильно. Можно быстро поднять дополнительные серверы только для мобильного трафика.</p><p>Появляется возможность экспериментировать с технологиями без риска. Хотите попробовать GraphQL для веб-версии? Внедряйте в один BFF. Тестируете новую базу данных? Подключайте к экспериментальной прослойке, не трогая продакшн.</p><h2>Когда стоит использовать backend for frontend</h2><p>BFF — инструмент для конкретных ситуаций.</p><h3>Когда интерфейсы кардинально отличаются</h3><p>Если ловите себя на мысли: <i>«этот эндпоинт нужен только для веба»</i> или <i>«мобилка использует 10% полей из ответа»</i>, — пора задуматься о BFF.</p><p>Красный флаг — когда фронтенд-разработчики начинают писать костыли для обработки «неудобных» данных. Если половина JavaScript-кода занимается парсингом и трансформацией ответов API, что-то пошло не так.</p><h3>Когда интерфейсы эволюционируют быстрее джунов</h3><p>Стартапы и продукты в активной фазе развития меняют интерфейсы каждую неделю.</p><p>Классическая проблема: дизайнеры придумали новый способ отображения товаров в каталоге. Теперь нужны дополнительные поля, другая группировка, новые фильтры.</p><p>Без BFF это означает изменения в основном API, которые могут сломать другие клиенты. С BFF — правки только в одном месте.</p><h3>Когда команды работают независимо</h3><p>Если у вас несколько фронтенд-команд, которые постоянно конфликтуют из-за API, BFF даст им свободу.</p><p>Команды получат свой API, который смогут развивать в нужном темпе. Это важно в больших компаниях, где бэкенд не успевает обрабатывать запросы от всех фронтендеров.</p><p>BFF распределяет ответственность: каждая команда поддерживает свой слой.</p><h3>Когда НЕ стоит использовать BFF</h3><p>Если у вас простое приложение с одним клиентом, BFF добавит лишнюю сложность. Если API уже идеально подходит всем клиентам, зачем что-то менять?</p><h2>3 типичные ошибки при внедрении BFF</h2><h3>Дублирование логики</h3><p>Начинается незаметно: мобильный и веб BFF нуждаются в одинаковой валидации пользователей. Разработчик копирует функцию из одного проекта в другой. Через полгода одинаковый код валидации живёт в четырёх местах, и каждое изменение превращается в квест.</p><p>Хуже, когда дублируется бизнес-логика. Расчёт скидок, обработка промокодов, правила доступа — это должно жить в основных сервисах, а не размазываться по BFF-слоям.</p><h3>Избыточная сложность вместо упрощения</h3><p>Пример: команда создаёт «универсальный BFF-фреймворк» с конфигурацией через YAML, поддержкой плагинов и собственным DSL. В итоге простое добавление поля в ответ требует изучения документации на 50 страниц.</p><p>Другая крайность — микро-BFF для каждой мелочи. Отдельный слой для авторизации, отдельный для форматирования дат, отдельный для валидации.</p><h3>Неправильная гранулярность</h3><p>Один BFF на все мобильные платформы может быть слишком общим: iOS и Android имеют разные особенности интерфейса. Но отдельный BFF для каждой версии приложения — явный перебор.</p><p>Частая ошибка — создание BFF по организационному принципу, а не по техническому. У нас три фронтенд-команды, значит нужно три прослойки. Но если все команды работают с похожими данными и интерфейсами, логичнее объединить усилия.</p><h2>Практические примеры использования BFF</h2><h3>Netflix</h3><p>Компания <a href="https://netflixtechblog.com/seamlessly-swapping-the-api-backend-of-the-netflix-android-app-3d4317155187">сделала</a> разные API для веб-версии, мобильных приложений, Smart TV и игровых консолей. Каждый BFF оптимизирован под особенности устройства, например, TV-версия предзагружает больше контента из-за медленной навигации пультом.</p><h3>Spotify</h3><p><a href="https://developer.spotify.com/documentation/web-api">Используют</a> BFF для разных клиентов: веб-плеер, мобильные приложения, десктопное приложение. Мобильный BFF агрессивно кеширует данные для офлайн-режима, веб-версия работает в реальном времени.</p><h3>SoundCloud</h3><p>Публично <a href="https://developers.soundcloud.com/blog/service-architecture-1">описывали</a> переход на BFF-архитектуру. У них отдельные слои для веб-версии и мобильных приложений, которые по-разному обрабатывают аудиопотоки и метаданные треков.</p><h2>Заключение</h2><p>Страдают все, когда один API пытается обслуживать веб-версию, мобилки и что-то ещё. Фронтенд получает неудобные данные, бэкенд обрастает костылями, пользователи — медленными приложениями.</p><p>Backend for Frontend создаёт слой между клиентами и основными сервисами. Каждый тип устройства получает API, заточенный под его потребности.</p><p>Внедряйте BFF, когда интерфейсы кардинально отличаются, продукт быстро развивается, а текущий API снижает производительность.</p><p>Ты уже программист, если читаешь это! Больше про кодинг — <a href="https://t.me/+a1v-IRDDUqI0MDhi">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Микросервисная архитектура: от монолита к гибкой системе</title>
      <link>https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme</link>
      <comments>https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme</guid>
      <description><![CDATA[<p>«Монолит или микросервисы» — вопрос, который до сих пор вызывает споры в IT. СТО Сервисной цифровой платформы в Газпромбанке делится личным опытом перехода к микросервисной архитектуре, разбирает реальные кейсы и объясняет, почему однозначного ответа не существует.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme">Микросервисная архитектура: от монолита к гибкой системе</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Ретро]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Jun 2025 08:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Меня зовут Андрей Бирюков, я СTO Сервисной цифровой платформы в Газпромбанке. За свою карьеру поработал в нескольких компаниях — от стартапов до крупных корпораций — и видел разные архитектурные подходы.</p><p>И вот начала копиться усталость от обсуждения, что использовать — монолиты или микросервисы. Этот вопрос стал преследовать меня на конференциях, в офисе, в личных сообщениях. Я потратил столько времени на обсуждение этой темы, что иногда хочется просто распечатать какой-нибудь емкий ответ на футболке и ходить в ней на все митапы.</p><p>Шутки шутками, но тема действительно важная. Я прошел путь от классических монолитных приложений до сложных микросервисных, проектировал системы, которые работают под большой нагрузкой, и пришел к выводу, что однозначного ответа здесь не существует. И вообще, «монолит или микросервисы» — это неправильная постановка вопроса.</p><p>Недавно сходил с Витей на запись <a href="https://vkvideo.ru/video-145457488_456239831">подкаста</a> на эту тему и настолько преисполнился, что решил в текстовом виде формализировать свое отношение к теме (я гнался за вами три дня, чтобы сказать, как вы мне безразличны, ага), обобщить то, о чем говорили, и попытаться дать ответ на вопрос «когда микросервисы действительно помогают и как не сойти с ума, если вы с ними работаете». Порассуждаю о проектировании, поддержке, DevOps-культуре и попробую немного заглянуть в микросервисную архитектуру.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-27/98a19000-c584-440e-bf7a-af36d4409a2a.png" alt="" /><figcaption>Подкаст «Техно.Логично»</figcaption></figure><h2>Микросервисы: зачем они нужны и в чем их плюсы</h2><h3>Архитектура приложений: немного базы</h3><p>Под капотом современных приложений обычно скрываются три основные части:</p><ul><li>множество библиотек и зависимостей;</li><li>единый store, в котором живут состояние и данные;</li><li>компоненты, которые нужно собрать, чтобы сделать из них приложение.</li></ul><p>Собрать это все можно по-разному. Можно сложить в монолит, а можно попробовать модульный подход.</p><p>Монолитное приложение — старое доброе приложение, которое, как правило, создают один или несколько разработчиков, потом его дорабатывает армия джунов, синьоров и всех, кто оказался рядом. Каждый «чуть-чуть поправил», и вот уже никто не понимает, почему оно работает, — но трогать страшно. Монолиты пишут и сейчас — все зависит от бизнеса. Если нужно приложение для небольшого проекта, микросервисы могут и не понадобиться.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-27/02011912-2de9-4c86-9de2-44865eb93fab.png" alt="" /><figcaption>Как выглядит монолит</figcaption></figure><p>Однако наступает момент, когда бизнес расширяется, аудитория растет, нагрузка увеличивается — а масштабировать монолит становится все сложнее. Тогда и приходят на помощь микросервисы.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-27/739de2ec-05c4-4f68-bf1a-356380611028.png" alt="" /><figcaption>А вот приложение с микросервисной архитектурой</figcaption></figure><p>Масштабировать можно и монолиты, но у них всегда остается какая-то единая точка отказа — например, база данных. Особенно если это реляционная СУБД, завязанная на Oracle или PostgreSQL. Когда база достигает сотен гигабайт или даже терабайт, масштабировать такую штуку становится дорого, больно и ненадежно.</p><h3>Микросервисы — панацея? Не совсем</h3><p>Тренд на микросервисный подход появился в начале 2010-х годов, вместе с проникновением интернета в широкие слои населения. Первый iPhone вышел в 2007 году, люди стали гораздо ближе к интернету, к данным, к информации. Бизнес захотел дотянуться до этой аудитории, и тогда началась диджитализация, сложность систем стала повышаться. Особенно остро это почувствовали крупные организации вроде банков: функциональность увеличивалась, и монолит начал «трещать» не только технически по инфраструктуре, но и по возможностям команд разработки, которые с ним работали.</p><p>Плюсы микросервисов очевидны: масштабируемость, независимая разработка, изоляция компонентов. Но вместе с этим пришли новые проблемы — усложнились мониторинг и поддержка, стали требоваться все новые инструменты, чтобы обеспечивать работу огромной инфраструктуры. Так появился DevOps.</p><h2>Распространение DevOps-культуры и инструменты оркестрации</h2><p>Раньше разработчик писал код, собирал артефакт и перекидывал его через забор в поддержку. Коллеги за забором его деплоили, запускали — и разработчику можно было больше не думать про плоды своей работы.</p><p>В новой реальности количество артефактов, которые нужно перекидывать через забор, кратно выросло. Вместе с этим появилась и стала распространяться DevOps-культура: понимание, что за качественную раскатку в проде отвечает не только команда поддержки, но и разработчики.</p><p>Важно учитывать еще и то, что сложность поддержки кратно увеличилась. Если монолит можно было отдебажить, просто заглянув в логи, то с сотней микросервисов так не получится. Поэтому появились такие инструменты, как централизованное логирование, распределенный трейсинг — и сотни, если не тысячи других, связанных в первую очередь с observability. В таких обстоятельствах DevOps-культура стала особенно важна.</p><h2>Проектируем микросервисы без боли: от стандартов до DDD</h2><h3>Стандартизация — наше все</h3><p>Если каждый микросервис пишет логи в своем формате и использует свои библиотеки, получается зоопарк. Нужно, чтобы были выровнены стек и CI/CD pipeline, существовали одинаковые библиотеки логирования и формат.Микросервисы дают свободу писать на разных языках, но с ней приходит и ответственность: под каждый язык придется придумывать и поддерживать разные инструменты. А это приведет к еще большему увеличению сложности. Так что с языком тоже лучше соблюдать стандартизацию: если пишете на Java, то и решать все проблемы стоит с помощью этого языка.</p><p>При этом иногда другой язык вполне оправдан. Например, просто потому, что Java не может работать с такой высокой скоростью, какая нужна. В некоторых случаях даже на Java приходится писать особым образом, либо можно использовать C++, Go или Rust. Но это скорее исключение из правила.</p><p>Инженеры — натуры увлекающиеся и любят паттерн CV driven development, когда хочется новую технологию потрогать и внедрить у себя. А потом похвастаться этим на каком-нибудь ивенте по принципу «just because I can» («просто потому что могу»). При этом может оказаться, что бизнесу технология особо и не была нужна. Чтобы избегать таких ситуаций, необходим технологический радар — список того, что можно использовать в компании, а что нет. И исключения из такого радара должны приниматься и допускаться очень взвешенно.</p><h2>DDD: как правильно нарезать сервисы</h2><p>Одна из опасностей при проектировании микросервисов — скатиться в очень мелкую гранулярность, когда логика нарезается чуть ли не по отдельной функции на микросервис (на отдельный deployment unit). Это может привести к такой сложности, которой потом будет очень трудно управлять. Такая проблема была, например, у Uber в начале их пути, и им пришлось пересматривать свою архитектуру. Избежать этого помогает Domain-driven design (DDD) — предметно-ориентированное проектирование.</p><p>Вместо того чтобы пилить отдельные сервисы для авторизации, логирования и уведомлений, команда может подумать вот над чем: все это части одного бизнес-контекста — пользовательского доступа. И целесообразно оставить их в одном сервисе. Это и есть DDD в действии.</p><p>Существует и еще одна проблема, с которой DDD помогает справиться, — неправильная нарезка сервисов с точки зрения бизнесовой функциональности. Если не понимать бизнес-контекста, можно получить «распределенный монолит»: будет много отдельно стоящих сервисов, но профита никакого, только все сложности микросервисов плюс проблемы монолита с масштабируемой базой данных. Особенно остро это проявляется, когда изменения в одной части бизнес-процесса (в одном сервисе) влекут за собой изменения еще в трех-четырех-пяти других сервисах.</p><p>DDD помогает выделить bounded context — согласованные по бизнесу участки. Они позволяют более или менее правильно нарезать большой бизнес-функционал на отдельные части.</p><p>Еще один важный принцип правильной архитектуры микросервисов — у каждого микросервиса должна быть своя независимая маленькая база данных (если она вообще нужна).</p><p><b>Два эмпирических правила, которые касаются размера сервисов и помогают понять, правильно ли они спроектированы:</b></p><ul><li>Если вы не можете переписать сервис за две недели, значит, возможно, он неправильно нарезан, и его нужно декомпозировать.</li><li>Если вам страшно браться за переписывание сервиса, значит, он точно кандидат на декомпозицию.</li></ul><p>Внедрение микросервисов: с чего начать?</p><p>С микросервисным подходом есть проблема — нет четкого ответа, куда идти и что делать, чтобы научиться его создавать. Это одна из главных сложностей микросервисной архитектуры, особенно когда только начинаешь с ней работать. Если хочется изучить Spring или Oracle, можно почитать официальную документацию. А к такой большой и необъятной теме, как микросервисы, даже и непонятно, с какой стороны подступиться. Туториала к ней нет, есть только куча статей, подходов и практик. Причем одни практики подойдут конкретной команде, а другие — нет.</p><p>И вот тут возникает реальная сложность, особенно когда вы только начинаете, — глаза разбегаются. Здесь Kubernetes, здесь ELK, здесь Grafana, здесь observability, здесь всякие паттерны отказоустойчивости, CAP-теорема и прочее. Непонятно, куда бежать. И каждый день появляются новые инструменты, которые так или иначе упрощают жизнь.</p><p>Совет: задавайте себе вопрос о каждом инструменте, который вы хотите внедрить (будь то Kubernetes, OpenTelemetry с Jaeger или любой другой) — какую проблему мы решаем, втаскивая его в свою инфраструктуру? Ответ на этот простой вопрос может дать много инсайтов и просветлений.</p><p>Чтобы в первом приближении ознакомиться с темой, можно почитать материалы <a href="https://sre.google/books/">SRE</a> от Google, также будут полезны статьи и книги в<a href="https://martinfowler.com/"> блоге</a> Мартина Фаулера, в том числе <a href="https://martinfowler.com/microservices/">Microservices Guide</a>. Если вам нужна практика, можно попробовать пойти на тот же Udemy, где есть множество курсов по микросервисной архитектуре с хорошими рейтингами и отзывами.</p><p>И вот что важно: при проектировании и внедрении микросервисов лучше избегать «велосипедостроения». Если индустрия уже решила проблему, нет смысла изобретать новое логирование или оркестрацию. Собственное решение вряд ли будет работать лучше, а сил, времени ресурсов на него можно потратить очень много.</p><h2>Поддержка микросервисной архитектуры</h2><p>Мы каждый день используем разные приложения — например, мобильный банк. Если в магазине длинная очередь, а на кассе у вас вдруг вылетает ошибка, — это раздражает. Поэтому у бизнеса нет права на ошибку: мониторинг должен срабатывать раньше, чем клиент успеет заметить, а инциденты необходимо устранять за минуты.</p><p>В крупных организациях микросервисов могут быть сотни: например, в некоторых системах насчитывается почти 700 микросервисов на продакшене. Каждый инстанс еще масштабирован — это тысячи подов, которые постоянно обрабатывают клиентский трафик. И при этом в современных условиях нужно стремиться к доступности системы на уровне четырех девяток (99,99%), то есть к простою всего в несколько минут в год.</p><p>Если вы хотите достичь того, чтобы простой вашего приложения был минимальным, приходится продумывать много разных подходов, приемов и инструментов.</p><h3>Паттерны отказоустойчивости</h3><p>Микросервисы — это не про «разбили монолит», это про то, что сбой одного сервиса не должен валить весь продукт. Поэтому если какой-то важный сервис упал, то максимум, который нужно сделать, — чтобы клиент не увидел упавший кусочек функционала приложения.</p><p>Еще один хороший вопрос: как мониторить аварии? Необходимо очень быстро находить точку отказа. Для этого, собственно, и нужен observability-подход, трейсинг. Нужно смотреть, где какой RPS (число запросов в секунду), не произошло ли резкого скачка трафика, важно следить за latency (задержками).</p><p>Бывали случаи, когда из-за бага в мобильном приложении трафик внезапно удваивался, и системы не выдерживали такой нагрузки. Любая малейшая задержка в самом незначительном компоненте может привести к тому, что по цепочке пойдет отказ, — будут копиться потоки, соединения, и рано или поздно упадет вообще все. Чтобы подготовиться к таким ситуациям, важно изучить хотя бы <a href="https://sre.google/sre-book/monitoring-distributed-systems/">четыре «золотых сигнала» мониторинга</a> из SRE от Google.</p><p>Совет: возьмите на вооружение парадигму проектирования на отказ. Исходите из того, что в любой момент что угодно может пойти не так. Сеть будет нестабильной, железо начнет падать, интеграции станут работать неправильно. Если изначально придерживаться этого принципа, вы здорово подстрахуете себя завтрашнего. Это всегда спасает, особенно когда получаешь по наследству что-то, что не было спроектировано с учетом этого принципа.</p><p>Сейчас часто используют паттерны, которые помогают поддерживать отказоустойчивость системы:</p><ul><li><b>Circuit Breaker</b> — если сервис спамит ошибками, лучше временно прекратить попытки до него достучаться. Для клиента ничего не изменится, он как получал ошибки, так и будет получать. Но, по крайней мере, можно дать системе возможность восстановиться. А еще лучше — позволить ей переключиться на какой-то резервный канал, например сходить в кэш с неактуальными данными.</li><li><b>Rate Limiter</b> — абсолютно банальная, но необходимая вещь. Нужно ограничивать входящий поток на примерно максимальном уровне от того, который ожидается. Чтобы все не развалилось, если произойдет резкий скачок трафика.</li><li><b>Blue-Green Deployment</b> — значительно снижают на продакшене количество аварий и проблем, связанных с кривыми релизами. Можно не раскатывать новую фичу сразу на все 100 подов, а выкатить ее только на 1% трафика и проверить.</li></ul><p>И это только малая часть паттернов.</p><p>Все это must have для абсолютно любой системы. Даже если у вас низкая нагрузка, она когда-нибудь увеличится. Лучше вовремя предусмотреть это, заранее потратив чуть больше времени и реализовав эти паттерны.</p><h3>Как эффективно работать с инцидентами</h3><p>Начало всех начал в траблшутинге — мониторинг. Здорово, когда разработчики понимают, как устроена их система, и уже вложились в мониторинг: есть дашборд, где можно посмотреть по уровням абстракций основные точки отказа.</p><p>Первый уровень — это application-слой, сами сервисы, которые в подах крутятся в Kubernetes. Нужно проверить, все ли у них хорошо по точкам интеграции — нет ли тайм-аутов. Все ли в порядке у них по железу — по CPU, по памяти, по дискам.</p><p>Если на первом уровне все нормально, нужно опуститься на уровень ниже — либо на виртуалки, на которых Kubernetes развернут, либо на железки, если он развернут на Bare-metal. Недавно мы столкнулись с интересным случаем: виртуалка показывала нормальную загрузку CPU, но физический гипервизор, на котором она крутилась, был загружен на 99%. Естественно, виртуалка страдала, но уровнем выше этого не было видно.</p><p>Совет: если вы вдруг нашли что-то, что еще не мониторится, — это повод поскорее добавить эту метрику, начать ее мониторить и ретроспективно отслеживать.</p><p>Еще одна важная вещь в работе с инцидентами — культура постмортемов. Ретроспективы по каждой аварии пишутся не просто так — их можно свести по категориям и понять, из-за чего чаще всего происходят аварии: например, из-за протухших сертификатов либо человеческого фактора в конфигурации. Категорий причин отказа обычно не так много. С постмортемами проще выработать стратегию технического инженерного развития.</p><p>Вообще, человеческий фактор — это отдельная боль. Все привыкли менять что-нибудь руками: заходить в виртуалки, поправлять конфиг. Чтобы такого было как можно меньше, важно вкладываться в infrastructure as a code и даже everything as a code. В идеале следует стремиться к zero access production — нулевому доступу к продакшену — и все раскатывать через Git, через конфигурации, включая политики безопасности.</p><h2>Культура ответственности и изменение ролей в команде</h2><p>Представим, что происходит инцидент — падают 15 микросервисов. Как должна быть устроена система, которая позволит оперативно справляться с авариями?</p><p>Организационно все достаточно просто — хотя не так просто на земле, при устранении инцидента. Все сервисы должны быть каталогизированы, сгруппированы по командам или продуктовым стримам. Необходима матрица эскалации, позволяющая найти по зоне ответственности человека, которому можно позвонить и попросить подключить необходимых инженеров.</p><p>Подобную конструкцию важно поддерживать в актуальном состоянии. Это часть процесса непрерывности, и в нее надо вкладываться. В крупных компаниях этим занимаются целые отделы, в небольших организациях — отдельный человек, но такая информация всегда должна быть в общем доступе. Иначе время «отскока» после инцидента увеличится кратно.</p><p>Желательно, чтобы в компании был специальный ситуационный центр, в котором сразу можно создать конференцию, если случилась авария, и поделиться информацией, чтобы все подключились к решению проблемы.</p><p>Однако эти организационные моменты еще не гарантируют быстрого решения проблемы. Ключевой фактор — культура компании. На людей часто нападает отстраненность — авария случилась, и все думают: «Кто-нибудь другой разрулит. Я разработчик, ну, что я там сделаю?»</p><p>Многие привыкли жить по старой парадигме: написали код, потестировали, отдали поддержке и забыли. Но культура в команде должна дорасти до такого уровня, когда каждый понимает: я не только разрабатываю или тестирую код, но еще и отвечаю за него на продакшене.</p><p>Из-за этого разрыва в осознании между командами поддержки и разработки возникают конфликты. У каждой разные цели, и зачастую одна команда не понимает, чего хочет другая. Чтобы лучше понять природу этих конфликтов, важно вспомнить про DevOps-культуру и SRE. В их парадигме разработчики не только пишут код, но и деплоят в продакшен.</p><p>Проще говоря, есть два варианта взаимодействия с поддержкой: классический, когда она административно отделена, и SRE-подобный, когда сотрудники «второй линии» прямо интегрированы в команду разработки. Могу сказать, что второй эффективнее.</p><p>При этом не обязательно сливать всех в одну плоскую структуру на уровне административного деления. Достаточно, чтобы люди, даже находясь в разных административных юнитах, работали как команда и коммуницировали постоянно, а не от случая к случаю. Важно, чтобы все были проактивными — если что-то случилось, сразу подрывались и по инструкции пытались устранить проблему.</p><p>Это то самое SRE, о котором пишет Google. Но людей нужно долго обучать такой культуре — это не дело одного месяца. Благодаря такому подходу инженеры, которые раньше были просто разработчиками или аналитиками, глубже осознают свою ответственность за стабильность продакшена. И это действительно правильное направление развития. Потому что и DevOps, и SRE — это в первую очередь культура, а уже во вторую — набор инструментов.</p><h3>Будущее микросервисов: тренд на AI Ops</h3><p>Разработчики уже используют AI как copilot — и это очень мощный инструмент в умелых руках. Он не заменяет инженера, но сильно экономит ему время. Эту помощь от нейросетей очень хочется растянуть и на инфраструктуру, и на эксплуатацию, чтобы получить крутой AI Ops.</p><p>Нейросеть будет находить протухшие сертификаты внутри инфраструктуры, работать инструментом для early warning, подсвечивать риски.Кажется, что все инструменты для этого есть уже сейчас. Надо только, чтобы кто-то сложил этот пазл в рабочее решение.</p><p>Есть прототипы — например, Big Panda или Moocsoft (который был недавно куплен Dell), но пока это точечные решения. Возможно, на горизонте 5–7 лет (скорее 5, чем 10) они станут серьезной частью индустрии и очень мощным прорывом, который упростит разработчикам жизнь.Кроме того, важно, чтобы развивались и более «приземленные» технологии: инструменты контейнеризации, оркестрации, observability, а также APM — Application Performance Monitoring.</p><h3>Инженер остается в центре всего</h3><p>Никакие микросервисы, Kubernetes и AI Ops не спасут, если за системой не стоит инженер, который думает головой, правильно работает руками и отвечает за результат. Важны его навыки, кругозор и культура работы. Именно такие люди превращают набор сервисов в работающий продукт. Все остальное — только инструменты.</p><p>P. S. Если интересно, как мы решаем эти задачи на практике, <a href="https://technologichno.mave.digital/">слушайте </a>(и <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fvkvideo.ru%2Fvideo-145457488_456239831&amp;postId=1982175">смотрите</a>) наш подкаст «Техно.Логично» — там регулярно обсуждаем самое актуальное в IT-сфере.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мы строим агрегатор финансовых продуктов в Казахстане: история Finance.kz</title>
      <link>https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz</link>
      <comments>https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Жандос Байдильденов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz</guid>
      <description><![CDATA[<p>Как из обычного сайта-витрины вырастить финтех-продукт? Расскажу, как строится агрегатор финансовых продуктов в Казахстане.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz">Как мы строим агрегатор финансовых продуктов в Казахстане: история Finance.kz</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Техподдержка]]></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>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 22 Jun 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я — Жандос, руководитель проекта <a href="https://finance.kz">Finance.kz</a>. Последний год активно развиваем агрегатор финансовых продуктов в Казахстане, и за это время рынок изменился кардинально. Хочу поделиться опытом создания финтех-решения с нуля и рассказать, как мы конкурируем с зарубежными игроками за счёт глубокой локализации.</p><h2>Откуда началось: мой путь в финтех</h2><p>До Finance.kz я работал в казахстанских финтех-проектах — bai.kz и finbee.kz. Там понял, что рынок агрегаторов в Казахстане находится в зачаточном состоянии. Пользователи мучились, сравнивая предложения банков вручную, а сами финансовые организации не умели эффективно работать с цифровыми каналами привлечения клиентов.</p><p>Finance.kz существовал уже более 3 лет, но работал как классический сайт-витрина. Когда я пришёл в проект год назад, стало ясно: нужно полностью переосмыслить подход и создать технологическое решение нового поколения.</p><h2>Состояние рынка: от монополии к жёсткой конкуренции</h2><p>Казахстанский рынок агрегаторов финансовых продуктов переживает бум. Ещё два года назад здесь было 2-3 локальных игрока с простейшим функционалом. Сегодня ситуация кардинально изменилась — зашли зарубежные команды: vbr.kz, fintree.kz, moneypanda.com и другие.</p><p>Эти компании привозят готовые решения, которые хорошо работали в России или других рынках. На первый взгляд их продукты выглядят более зрелыми — красивые интерфейсы, отработанные воронки конверсии. Но у импортных решений есть критический недостаток: они плохо адаптированы под специфику казахстанского рынка.</p><h2>Технологические вызовы: интеграция с госсервисами и банками</h2><p>Главная боль при разработке агрегатора в Казахстане — это интеграции. В отличие от рынков СНГ, здесь нельзя обойтись простым партнёрским трафиком. Пользователи хотят получить продукт онлайн, полностью, без походов в офисы.</p><h3>API-интеграции с банками и МФО</h3><p>За год мы реализовали прямые API-интеграции с крупнейшими игроками рынка. Это означает, что пользователь может не просто сравнить условия кредитов, но и подать заявку, пройти скоринг и получить одобрение, не покидая наш сайт.</p><p>Техническая сложность — в разнородности API. Каждый банк использует собственные протоколы, форматы данных и методы аутентификации. Пришлось создать унифицированный слой-адаптер, который «переводит» наши запросы в формат, понятный конкретной финансовой организации.</p><h3>Интеграция с госорганами</h3><p>Finance.kz интегрируется с государственными сервисами eGov и Палаты предпринимателей (ПКБ). Это позволяет автоматически подтягивать справки о доходах, данные о трудоустройстве и другие документы, необходимые для получения кредита.</p><p>Работа с госAPI — отдельная история. Протоколы меняются, документация часто устаревает, а техподдержка работает в режиме «как получится». Но результат того стоит: время оформления кредита сокращается с нескольких дней до 15-30 минут.</p><h2>Архитектура продукта: ставка на микросервисы</h2><p>При проектировании архитектуры Finance.kz мы отказались от монолитного подхода в пользу микросервисов. Это решение диктовалось спецификой агрегатора — нам нужно было обеспечить высокую доступность при интеграции с десятками внешних систем.</p><h3>Backend</h3><p>Основные сервисы написаны на Node.js с использованием Express.js. Для работы с базами данных используем PostgreSQL для транзакционных данных и Redis для кэширования. Очереди сообщений реализованы через RabbitMQ — это критично для обработки заявок пользователей.</p><p>Отдельно выделили сервис интеграций, который отвечает за взаимодействие с внешними API. Он построен по принципу circuit breaker — если один из банков не отвечает, это не ломает работу всего агрегатора.</p><h3>Frontend</h3><p>Фронтенд построен на React с использованием Next.js для серверной отрисовки. Это важно для SEO — львиная доля трафика приходит из поисковых систем по запросам типа «кредит онлайн».</p><h2>Стратегия «единого окна»: от поиска до получения</h2><p>Наша главная идея — превратить агрегатор из витрины в полноценный финтех-сервис. Пользователь должен получить продукт полностью онлайн: от сравнения условий до перечисления денег на карту.</p><p>Для этого мы реализовали несколько ключевых функций:</p><ul><li>Умный подбор продуктов на основе данных пользователя и машинного обучения</li><li>Предварительный скоринг для оценки вероятности одобрения ещё до подачи заявки</li><li>Автоматическое заполнение анкет с подтягиванием данных из госсервисов</li><li>Отслеживание статуса заявки в реальном времени</li></ul><h2>Монетизация: CPS как основа устойчивого бизнеса</h2><p>Мы работаем по модели CPS (Cost Per Sale) — получаем комиссию только за успешно выданные продукты. Для кредитов это 2% от суммы, для микрозаймов — фиксированная сумма от 7 до 15 тысяч тенге.</p><p>Такая модель выгодна всем участникам: банки платят только за результат, пользователи получают продукт бесплатно, а мы мотивированы повышать качество трафика и конверсию.</p><h2>Конкурентные преимущества: локализация против красивых интерфейсов</h2><p>Главное отличие Finance.kz от зарубежных конкурентов — интеграция в казахстанскую финтех-экосистему. Пока они тратят месяцы на адаптацию готовых решений, мы изначально строили продукт под местную специфику.</p><h3>Что даёт локальный подход:</h3><ul><li>Знание рынка: мы понимаем особенности работы казахстанских банков и МФО</li><li>Связи с регуляторами: легче договариваться об интеграциях с госорганами</li><li>Техническая экспертиза: наша команда уже прошла путь интеграции с местными API</li><li>Гибкая настройка продукта под изменения законодательства и требований ЦБ</li></ul><h3>Результаты и метрики</h3><p>За год активного развития мы достигли:</p><ul><li>150 000 уникальных пользователей в месяц</li><li>Интеграция с 15+ финансовыми организациями</li><li>Конверсия заявка-выдача на уровне 35-40% (против 15-20% у конкурентов)</li><li>Средний чек по кредитам — 1,2 млн тенге, по микрозаймам — 85 тысяч</li></ul><h2>Планы на будущее: от агрегатора к экосистеме</h2><p>Ближайшие 1-2 года будут критичными для всего рынка. Мы видим несколько ключевых направлений развития:</p><h3>Расширение продуктовой линейки</h3><p>Планируем добавить страхование, депозиты и инвестиционные продукты. Цель — стать единой точкой входа для всех финансовых потребностей пользователя.</p><h3>Внедрение ИИ и машинного обучения</h3><p>Работаем над персонализацией предложений и предиктивной аналитикой. Хотим научиться предлагать продукты до того, как пользователь их осознанно найдет.</p><h3>Международная экспансия</h3><p>Рассматриваем возможность выхода на рынки Узбекистана и Кыргызстана. Наша технологическая платформа легко масштабируется на соседние рынки.</p><h3>Собственные финансовые продукты</h3><p>В долгосрочной перспективе планируем получить лицензию МФО и предлагать собственные займы наиболее качественным клиентам.</p><h2>Уроки и выводы</h2><p>Главный урок последнего года: в финтехе побеждает не тот, у кого красивее интерфейс, а тот, кто лучше решает реальные проблемы пользователей. Красивый дизайн можно скопировать за месяц, а на создание качественной технологической интеграции уходят годы.</p><p>Второй важный момент — команда решает всё. Мы собрали людей, которые понимают как технологии, так и специфику финансового рынка. Это даёт нам фору перед конкурентами, которые пытаются адаптировать готовые решения силами удалённых команд.</p><p>Рынок агрегаторов в Казахстане только формируется, и впереди ещё много интересных вызовов. Уверен, что следующие два года покажут, кто готов строить долгосрочный бизнес, а кто просто пытается заработать на хайпе.</p>]]></content:encoded>
    </item>
    <item>
      <title>Зачем нам свои сети, если ими никто не пользуется? Насколько все плохо с российскими SDN</title>
      <link>https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn</link>
      <comments>https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn</guid>
      <description><![CDATA[<p>Российские сети SDN — что с ними не так и почему инфраструктура так медленно развивается. Экспертный обзор ситуации на рынке</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn">Зачем нам свои сети, если ими никто не пользуется? Насколько все плохо с российскими SDN</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[VMware]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 20 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году программно-определяемые сети (SDN) — это не тренд, а жизненная необходимость. Мировой рынок SDN растет на 13–22% в год, а в России его объем уже превысил 15 млрд рублей. Но вот в чем подвох: пока мир переходит на «сети из кода», российские компании до сих пор настраивают VLAN вручную или цепляются за устаревшие решения VMware, американского разработчика ПО для виртуализации.</p><p>Почему так? В 2024–2025 годах США ужесточили ограничения: VMware NSX и Cisco ACI официально заблокированы. Казалось бы, идеальный момент для отечественных решений вроде Basis SDN от «Базиса». Но сегодня их доля на рынке — не выше 3%.</p><p>Выясним, почему российские SDN, несмотря на импортозамещение, пока так и не стали массовыми, и что мешает бизнесу переходить на отечественные продукты — от дефицита специалистов до проблем с legacy-инфраструктурой. Только факты, кейсы внедрений и прогнозы на 2026–2030 годы с опорой на отчеты Ростелекома, аналитику <a href="https://www.6wresearch.com/industry-report/russia-software-defined-anything-market">6Wresearch</a> и документы <a href="https://www.archivemarketresearch.com/reports/sdn-system-43385">OFAC</a>.</p><h2>SDN в России-2025: почему мир перешел на «сети из кода», а мы настраиваем маршрутизаторы вручную</h2><p>SDN (Software-defined networking) — это когда сетью управляют не железки, а код. Представьте, что вместо того, чтобы вручную прописывать правила на каждом коммутаторе, вы просто пишете скрипт, и сеть мгновенно перестраивается под ваши задачи. Контроллер SDN решает, куда направить трафик, как распределить нагрузку и какие политики безопасности применить. Все это — без манипуляций с командной строкой и конфигурационных файлов.</p><h3>Мировой контекст: SDN как новая норма</h3><p>Глобальный рынок SDN к 2025 году оценивается в $12+ млрд, а темпы роста превышают 18% в год. Причины просты:</p><ul><li>Облака и гибридные инфраструктуры требуют гибкости, которую традиционные сети дать не могут.</li><li>Киберугрозы теперь атакуют не отдельные устройства, а всю сеть. SDN позволяет изолировать зараженные сегменты за секунды — например, отрезать атакованный филиал до того, как он заразит головной офис.</li><li>5G и IoT без SDN просто не работают. Виртуальные срезы сети (network slicing) — единственный способ гарантировать приоритет критичному трафику, будь то телемедицина или беспилотники.</li></ul><p>Но главный драйвер — экономика. <a href="https://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%93%D0%BB%D0%B0%D0%B2%D0%BD%D1%8B%D0%B5_%D1%82%D0%B5%D0%BD%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B8_%D0%BD%D0%B0_%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BC_%D1%80%D1%8B%D0%BD%D0%BA%D0%B5_%D0%B4%D0%B0%D1%82%D0%B0-%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%BE%D0%B2">Компании устали переплачивать за «умное» железо</a> Cisco и Juniper, когда всю логику можно перенести в софт. К 2025 году 70% корпоративных сетей в ЕС и США управляются через SDN-контроллеры — просто потому, что это дешевле и быстрее.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-12/45a4e2ba-6d0d-4766-9673-120dca5836f6.png" alt="" /></figure><h3>Россия: технологический суверенитет vs. реальность</h3><p>В 2024–2025 годах санкции добили то, что не успели в 2022-м:</p><ul><li>VMware NSX официально заблокирован для российских компаний.</li><li>Cisco ACI и Huawei CloudFabric доступны только через «серые» схемы, но их поддержка практически не работает.</li><li>Оборудование попало под прямые ограничения: даже нейтральные производители вроде Arista отказываются поставлять коммутаторы из-за риска вторичных санкций.</li></ul><p>Казалось бы, идеальный момент для российских SDN-решений. Но доля отечественных продуктов на рынке — единицы. Причины такой ситуации вполне объективны:</p><ul><li>«Железная» зависимость. Большинство российских SDN работают только с оборудованием конкретных вендоров — YADRO, Aquarius, «Бифорком». Если у компании инфраструктура на старых Cisco или Huawei, миграция потребует полной замены «железа».</li><li>Функциональные пробелы. Тот же Basis SDN декларирует 80% функционала VMware NSX, но ключевые фичи вроде автоматического восстановления после сбоев (self-healing) или глубокой аналитики трафика через ИИ пока в разработке.</li><li>Дефицит экспертов. В России менее 1000 сертифицированных специалистов по SDN — против 25 000 в США и ЕС. Обучение нового инженера с нуля занимает 1.5–2 года — бизнес не готов ждать.</li></ul><h3>Спрос есть, но внедрять некому</h3><p>Опросы специализированных изданий показали, что более трети крупных отечественных компаний хотели бы перейти на отечественные SDN, но многие из них не верят в стабильность российских решений, не готовы инвестировать в замену инфраструктуры, не могут найти подрядчика с нужной экспертизой.</p><p>При этом Basis SDN — единственное решение, которое хоть как-то закрывает дыру. Его пилоты запустили Ростелеком, СберТех и несколько госструктур. Но даже они признают: продукту не хватает открытости API и поддержки мультивендорных сред.</p><p>Вывод: мир уже живет в эпоху «сетей как кода», а Россия только учится настраивать контроллеры. Без массовых инвестиций в R&amp;D (Research and Development, научные исследования и разработки) и образование разрыв будет расти. К 2030 году мы рискуем остаться с SDN «на бумаге», пока глобальные игроки перейдут на следующую ступень — IBN (intent-based networking) — сеть, основанную на намерениях с полной автономией ИИ.</p><h2>Свои SDN: роскошь или необходимость?</h2><p>Блокировки лишили российские компании доступа к обновлениям и техподдержке. Санкции против YADRO и других производителей сетевого оборудования усугубили проблему: даже если «железо» физически есть, его нельзя масштабировать без лицензий. Сложность в том, что технологический суверенитет нельзя купить — его нужно строить.</p><h3>Технологический суверенитет — не лозунг, а вынужденная мера</h3><p>В 2025 году термин «импортозамещение» уже не вызывает иронии. Сегодня российский бизнес столкнулся с простым фактом: зарубежные SDN-решения либо недоступны, либо работают с перебоями.</p><p>Компании, которые в 2024-м надеялись на «серые» поставки VMware NSX, теперь тратят на 40% больше на поддержку устаревших версий.</p><p>Basis SDN — пока единственная рабочая альтернатива. Разработка «Базиса» и Angie Software изначально создавалась под санкционные реалии:</p><ul><li>полная независимость от зарубежного ПО — даже гипервизор работает на KVM;</li><li>поддержка российского «железа» (YADRO, Aquarius) без необходимости доработок;</li><li>цена ниже VMware NSX до его ухода с рынка.</li></ul><p>Но главное — это не просто клон VMware, а адаптация под российские условия. Например, здесь изначально заложена поддержка требований ФСТЭК к шифрованию трафика, что для госсектора критично.</p><h2>Преимущества, которые оценит даже скептик</h2><p>Рассмотрим подробно плюсы перехода на отечественные программно-определяемые сети.</p><h3>Централизованное управление: оптимизация времени и расходов</h3><p>Вместо настройки каждого коммутатора вручную вы управляете всей сетью через одну веб-панель. Нужно изменить политику безопасности для филиала? Все делается элементарно: не надо ехать на место или объяснять по телефону — правила применяются мгновенно.</p><p>Так работает Basis SDN:</p><ul><li>единый контроллер заменяет десятки разрозненных консолей Cisco Prime или Huawei eSight;</li><li>автоматизация рутинных задач — например, выделение VLAN под новый отдел занимает минуты вместо часов;</li><li>мониторинг в реальном времени — аномалии трафика (DDoS, утечки) система обнаруживает сама и предлагает решения.</li></ul><h3>Микросегментация: безопасность без головной боли</h3><p>В 2025 году кибератаки стали точечными: злоумышленники не ломают всю сеть, а ищут слабые звенья — бухгалтерию, базы данных, IoT-устройства.</p><p>SDN позволяет изолировать критичные сегменты без физического разделения:</p><ul><li>финансовые системы можно отрезать от общего трафика, даже если они используют те же коммутаторы;</li><li>доступ к данным регулируется не только логинами, но и контекстными правилами (например, запрет копирования файлов после 18:00);</li><li>в случае атаки зараженный сегмент автоматически блокируется — без остановки всей сети.</li></ul><h2>Совместимость: работает здесь и сейчас</h2><p>Типичная претензия к российскому ПО — «а вот у Cisco…». Но Basis SDN уже сегодня поддерживает:</p><ul><li>Astra Linux и «Альт» — без костылей в виде дополнительных драйверов;</li><li>оборудование YADRO, БСТ, Aquarius — с гарантией обновлений;</li><li>облачные платформы на базе KVM и отечественных гипервизоров.</li></ul><p>При этом система не требует полного отказа от legacy-инфраструктуры. Например, можно оставить старые коммутаторы Cisco, но управлять ими через SDN-контроллер — это вдвое дешевле, чем менять все железо.</p><h2>Рыночные перспективы: куда движется отрасль</h2><p>Объем рынка SDN в России пока относительно невелик, но к 2031-му прогнозируют его рост до 32 млрд.</p><p>Основные драйверы:</p><ul><li>Госсектор: с 2024 года все госкомпании обязаны использовать «третьи ключи шифрования» — без SDN это нереализуемо.</li><li>Телеком: Ростелеком и МТС тестируют SDN для 5G-сетей — ручное управление таким трафиком уже невозможно.</li><li>Средний бизнес: облачные CRM и ERP требуют гибких сетей, а аренда VMware NSX теперь недоступна.</li></ul><h3>Вывод: свои SDN — это про выживание</h3><p>В 2025 году вопрос уже не в том, «зачем свои SDN», а в том, как быстро компании смогут перейти на них. Ожидать возвращения VMware бессмысленно и нерационально.</p><p>При этом:</p><ul><li>Basis SDN — не идеален, но это практически единственное рабочее решение;</li><li>без микросегментации скоро не получится пройти даже базовый аудит ФСТЭК;</li><li>гибридные облака без SDN превращаются в кошмар админа.</li></ul><p>Те, кто внедрит российские SDN сейчас, через 2–3 года получат снижение затрат на 25–40% по сравнению с теми, кто цепляется за «серые» Cisco и Huawei. Остальные рискуют остаться с сетью, которую некому и нечем администрировать.</p><h2>Проблемы отечественных SDN: почему российские «сети из кода» пока не взлетели</h2><p>Однако в 2025 году российские SDN-решения пока далеки от совершенства. Basis SDN от «Базиса» и аналоги от VK Tech («Спрут») — первые ласточки, но их внедрение сталкивается с тремя группами проблем: технологическими, экономическими и рыночными. Разберем каждую.</p><h3>Технологические вызовы: когда железа много, а экспертов нет</h3><p>Эта  группа проблем наиболее показательна для отечественных решений.</p><p><b>Дефицит экспертизы.</b> Для разработки конкурентоспособного SDN нужны специалисты высшего уровня, которых в РФ катастрофически не хватает.</p><p><b>Функциональные пробелы.</b> Basis SDN декларирует 80% функционала VMware NSX, но критичные фичи вроде автономного восстановления после сбоев или глубокой аналитики трафика через ИИ появятся <a href="https://ict-online.ru/news/Basis-SDN-pervoye-setevoye-resheniye-klassa-SDN-sozdannoye-pod-rossiiskikh-zakazchikov-310789">не раньше 2026 года</a>. Для корпоративных клиентов это риск: например, без self-healing атака на один сегмент может парализовать всю сеть.</p><p><b>Совместимость с legacy-инфраструктурой.</b> Большинство российских SDN работают с оборудованием YADRO, Aquarius или «Бифорком». Если у компании стоят старые Cisco или Huawei, миграция потребует полной замены «железа» — а это +30–50% к бюджету проекта.</p><p><i>Пример: В 2024 году Ростелеком-ЦОД пытался интегрировать Basis SDN с унаследованными коммутаторами Juniper. Проект забуксовал — пришлось докупать российские аналоги, что увеличило сроки внедрения на 4 месяца.</i></p><h3>Экономические и регуляторные барьеры: санкции vs. окупаемость</h3><p><b>Высокая стоимость разработки.</b> Создание Basis SDN обошлось в сотни миллионов рублей. Для сравнения: бюджет VMware NSX превышает $1 млрд, но его распределяют на глобальный рынок. Российским вендорам приходится компенсировать затраты за счет узкой локальной аудитории.</p><p><b>Давление санкций.</b> С июня 2024 года США запретили ИТ-консалтинг и облачные услуги для российских компаний. Это ударило по поддержке гибридных инфраструктур. Стало невозможно заказывать аудит сети у зарубежных вендоров, а облачные платформы вроде VMware Cloud Foundation недоступны даже через «серые» схемы.</p><p><b>Долгая окупаемость.</b> По прогнозам «Базиса», Basis SDN окупится за 2–3 года. Но малый бизнес не готов ждать — ему нужны решения здесь и сейчас.</p><h3>Рыночное недоверие: почему бизнес не верит в свои SDN</h3><p>Культ «проверенных» зарубежных решений. Даже санкционные Cisco ACI и VMware NSX остаются в топе запросов у российских интеграторов.</p><p>Причины:</p><ul><li>Документация. У Cisco — 500+ страниц детальных мануалов, у Basis SDN — 80, и половина на уровне «как включить контроллер».</li><li>Сообщество. Для VMware NSX есть 1000+ готовых скриптов на GitHub, для Basis SDN — меньше 50.</li></ul><p>Низкая осведомленность малого бизнеса. Опрос бизнес-лаборатории «КРОК» показал: 60% компаний с оборотом до 1 млрд руб. считают SDN «дорогой игрушкой для корпораций». При этом они не знают, что микросегментация в Basis SDN снижает риски утечек на 40% — но об этом не пишут в СМИ.</p><p>Российские SDN не смогут конкурировать с зарубежными, пока:</p><ul><li>не сократится разрыв в экспертизе — нужны образовательные программы уровня Cisco Networking Academy;</li><li>не появятся гарантии долгосрочной поддержки — например, госсубсидий на 5–10 лет;</li><li>не изменится восприятие рынка — тут нужны кейсы уровня «Сбербанк полностью перешел на Basis SDN».</li></ul><p>Сейчас Basis SDN остается нишевым продуктом для госсектора и Ростелекома.</p><h2>Кейсы и перспективы: где российские SDN уже работают и куда движутся</h2><p>В 2025 году российские SDN-решения перестали быть лабораторными проектами — они постепенно внедряются в реальную инфраструктуру. Но масштабы пока несопоставимы с зарубежными аналогами.</p><p>Разберем, где Basis SDN и другие решения уже доказали свою жизнеспособность, какие рынки могут стать для них перспективными и что мешает ускорить развитие.</p><h3>Basis SDN: первый крупный кейс — «Ростелеком-ЦОД»</h3><p>В мае 2025 года «Базис» <a href="https://www.cnews.ru/news/line/2025-05-28_bazis_predstavila_basis_sdn">завершил пилотное внедрение</a> своего SDN-решения в дата-центрах Ростелекома.</p><p>Проект показал:</p><ul><li>Сокращение времени настройки VLAN с 4 часов до 15 минут за счет централизованного управления.</li><li>Микросегментация финансовых сервисов — изоляция платежных систем снизила риски атак на 40% по данным внутреннего аудита.</li><li>Совместимость с оборудованием: 70% старых коммутаторов Cisco удалось интегрировать через шлюзы на базе KVM, хотя изначально Basis SDN разрабатывался для российского «железа» YADRO и Aquarius.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-12/d64df88f-43a2-4a51-967e-4e5f3967e1d5.png" alt="" /></figure><h2>Потенциальные рынки: где российские SDN могут закрепиться</h2><p>В июне 2025 года «Базис» анонсировал партнерство с телеком-оператором в ЮАР.</p><p>Причины интереса:</p><ul><li>Цена: $15 000 за контроллер против $30 000 у VMware NSX.</li><li>Санкционная нейтральность: в Африке нет давления на использование российского ПО, а китайские аналоги (например, ZTE SDN) проигрывают в функционале.</li></ul><p>Планируются поставки в Бразилию (интеграция с облачной платформой на базе OpenStack) и Казахстан (совместный проект с «Казтелеком»).</p><p><a href="https://www.moneytimes.ru/news/rynok-sdn-rossiya-2024/56918/#:~:text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA%20SDN%20%D0%BD%D0%B5%20%D1%80%D0%B0%D1%81%D1%82%D0%B5%D1%82%2C%20%D0%BD%D0%BE%20%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BE%D0%B1%D0%B5%D1%89%D0%B0%D1%8E%D1%82%20%D0%B2%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D0%BE%D0%B9%20%D1%80%D0%BE%D1%81%D1%82%20%D0%BA%202031%20%D0%B3%D0%BE%D0%B4%D1%83&amp;text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA%20SDN%20%D0%BD%D0%B5%20%D1%80%D0%B0%D1%81%D1%82%D0%B5%D1%82%2C%20%D0%BD%D0%BE%20%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BE%D0%B1%D0%B5%D1%89%D0%B0%D1%8E%D1%82%20%D0%B2%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D0%BE%D0%B9%20%D1%80%D0%BE%D1%81%D1%82%20%D0%BA%202031%20%D0%B3%D0%BE%D0%B4%D1%83&amp;text=%D0%9F%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D1%8B%20iKS%2DConsulting%20%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%20%D0%BD%D0%B0%20%D1%82%D0%BE%2C%20%D1%87%D1%82%D0%BE%20%D0%BA,%D1%8D%D1%82%D0%BE%D0%BC%20%D0%B4%D0%BE%D0%BB%D1%8F%20%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B3%D0%BD%D0%B5%D1%82%2044%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82%D0%BE%D0%B2.">Согласно прогнозам</a>, к 2031 году объем рынка SDN в РФ вырастет в 2-3 раза, но 80% спроса будет приходиться на госсектор и госкомпании.</p><p>Малый бизнес пока остается в стороне. Проблема в том, что Basis SDN ориентирован на крупные внедрения. Для малого бизнеса нет «облегченных» версий — аналогов Cisco ACI Essentials.</p><h2>Рекомендации: как сделать российские SDN массовыми</h2><p>Российские SDN-решения доказали свою жизнеспособность, но для перехода из нишевого сегмента в массовый нужны системные изменения. Рассмотрим ключевые направления, без которых не обойтись.</p><p>Кадры — основа всего. Чтобы ускорить подготовку специалистов, нужно:</p><ul><li>ввести грантовые программы по типу «Цифровых профессий», но с фокусом на сетевые технологии;</li><li>интегрировать модули по SDN в вузовские программы — пока лишь единицы технических университетов включают их в учебные планы.</li></ul><p>Без этих шагов бизнес будет сталкиваться с той же проблемой, что и сейчас: даже купив Basis SDN, компании не смогут его эффективно использовать из-за нехватки компетенций.</p><p>Госсектор стал основным драйвером спроса на отечественные SDN, но для массового внедрения нужны меры, стимулирующие переход коммерческих компаний. Опыт Китая показывает, что субсидии на 50% затрат при миграции с VMware/Cisco резко увеличивают долю локальных решений.</p><p>Кроме того, стоит рассмотреть налоговые каникулы для стартапов в области сетевой виртуализации и заняться софинансированием пилотных проектов в среднем бизнесе — например, через Фонд развития цифровой экономики.</p><p>Одна из главных претензий к Basis SDN — слабая интеграция со сторонними платформами. Для сравнения: VMware NSX поддерживал свыше 200 приложений, а у российского аналога их на порядки меньше.</p><p>Без этого Basis SDN так и останется «закрытым» продуктом для узкого круга заказчиков. Российские SDN не станут массовыми сами по себе — нужна скоординированная работа бизнеса, образовательных учреждений и регуляторов.</p><h2>Итоги: отечественные SDN требуют долгосрочной стратегии</h2><p>Российские решения вроде Basis SDN доказали, что могут работать в реальных условиях. Но чтобы конкурировать глобально, нужно:</p><ul><li>увеличить долю рынка внутри страны — пока она менее 5%;</li><li>снизить порог входа для малого бизнеса;</li><li>выйти за пределы госзаказов — иначе продукт останется нишевым.</li></ul><p>Жизнеспособность у проекта есть. Basis SDN закрывает 80% базовых потребностей бизнеса: микросегментация, централизованное управление, совместимость с российским «железом». Но критичные функции вроде автономного восстановления сетей появятся только к 2026 году.</p><p>Аналитики предсказывают рост рынка SDN в России, но это произойдет только если появятся новые фичи: например, интеграция с ИИ для прогнозирования сетевых аномалий, снизится порог входа и вырастет число специалистов.</p><p>Что может сделать каждый:</p><ul><li><b>Тестировать.</b> «Базис» активно привлекает IT-комьюнити к доработке Basis SDN. Участие в пилотах — способ повлиять на развитие продукта.</li><li><b>Развивать open-source.</b> Проекты вроде OpenDaylight и OpenStack — основа для российских SDN. Чем больше контрибьюторов, тем быстрее сократится разрыв с зарубежными аналогами.</li><li>Требовать документирования. Одна из главных претензий к Basis SDN — скудные мануалы. Если разработчики увидят запрос от сообщества на детальные гайды, они быстрее их выпустят</li></ul><p>Главный вывод: SDN — не просто технология, а новая сетевая парадигма. Россия может занять в ней свое место, но для этого нужны не точечные успехи, а системные изменения.</p><p>Больше инфоповодов — в нашем <a href="https://t.me/+WYtyV4-XYmdhZTMy">тг-канале.</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Почему ваше приложение тормозит: архитектурные bottlenecks, которые никто не замечает</title>
      <link>https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet</link>
      <comments>https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet</guid>
      <description><![CDATA[<p>Как найти и устранить архитектурные bottleneck'и: причины тормозов, типовые ошибки и пошаговая методика диагностики.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet">Почему ваше приложение тормозит: архитектурные bottlenecks, которые никто не замечает</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[Микросервисы]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 19 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваше приложение тормозит, хотя сервер мощный, код вроде нормальный, а метрики — не очень-то и загружены? Возможно, вы столкнулись с архитектурным bottleneck'ом — скрытым ограничением, которое убивает производительность под нагрузкой. Вместе с Никитой Ульшиным, тимлидом команды разработки архитектурных инструментов в Т-Банк и автором тг-каналов <a href="https://t.me/ulshinblog">Никита Ульшин про IT</a> и <a href="https://t.me/tech_fit">ТехнофITнес | Никита Ульшин</a>, разбираем типовые узкие места в системах, от неэффективной аллокации до однопоточных участков, и показываем пошаговый подход к их поиску и устранению.</p><h2>Почему «тормоза» — это не всегда про код</h2><p>Когда пользователь жалуется на «медленное приложение», большинство разработчиков по привычке лезет в код. Профилируем, ищем неэффективные циклы, оптимизируем до запятых. Но в реальности причина часто не в логике, а в том, что её окружает.</p><p>Современное приложение — это сложный организм: десятки микросервисов, базы данных, кэши, брокеры, сети. И тормозить может любой из этих компонентов. А ты в это время профилируешь ни в чём не виноватый for.</p><p>Вот что тормозит, когда код ни при чём:</p><p><b>Архитектура</b></p><ul><li>Цепочки вызовов: каждый хоп — +latency.</li><li>Синхронные зависимости: завис один сервис — тормозят все.</li><li>Общие ресурсы: shared state, глобальные очереди, блокировки.</li></ul><p><b>Базы данных</b></p><ul><li>Нет индексов или плохой план запроса.</li><li>N+1-запросы — особенно при неосторожной ORM.</li><li>Частый доступ к одним таблицам — гонка за IO и блоки.</li><li>Нет шардинга или репликации в масштабируемой нагрузке.</li></ul><p><b>Сеть</b></p><ul><li>Высокая задержка между регионами (особенно multi-cloud).</li><li>Потери пакетов, DNS-проблемы, нестабильность.</li><li>Отсутствие connection reuse: TLS-handshake на каждый вызов.</li></ul><p><b>Очереди и брокеры</b></p><ul><li>Один медленный потребитель тормозит всех.</li><li>Нет защиты от от backpressure или дедупликации.</li><li>Неправильные batch- и ack-настройки.</li></ul><p><b>Аллокаторы и GC</b></p><ul><li>Фрагментация памяти, нагрузка на GC.</li><li>Финалайзеры, слабые ссылки, плохо настроенный heap.</li></ul><p><b>Конфигурации</b></p><ul><li>Маленький пул соединений — пул заканчивается, запросы ждут.</li><li>Агрессивные retry-политики — система перегружается.</li><li>CPU throttling в Kubernetes — контейнеру не хватает ресурсов.</li></ul><p><b>Сериализация и форматы</b></p><ul><li>Перегруженные JSON/Protobuf.</li><li>Вложенные base64 + gzip + JSON — боли сериализации.</li></ul><h3>Почему bottlenecks остаются невидимыми до продакшена</h3><p>Многие из них —  не баги, а последствия архитектурных решений. В дев-среде всё летает, потому что:</p><ul><li>мало данных,</li><li>нет конкуренции за ресурсы,</li><li>нет распределённой нагрузки.</li></ul><p>В проде начинается хаос. Рассмотрим на конкретных примерах:</p><ul><li>На деве — 2 запроса в секунду, в проде — миллион. Кто-то запустил маркетинговую рассылку, аналитик тащит big report, а клиент ретраит ошибки.</li><li>Архитектура «в лоб»: всё синхронно, каждый сервис вызывает по цепочке десяток других. Пока нагрузка мала — все живет. Как только одно звено не выдерживает — перестает жить.</li><li>Иллюзия масштабируемости: до 100 пользователей —  всё окей, на 1000 — каскадная деградация.</li><li>«Невидимая боль» между сервисами: каждый по отдельности быстрый, но блокирует друг друга на базе.</li></ul><h2>Слои архитектуры и где в них зарыты проблемы</h2><p>Когда приложение тормозит, мы часто копаемся в отдельных компонентах — фронте, бэке, базе. Но bottleneck может быть не внутри компонента, а между ними: в конфигурации, связях, сетевых задержках, очередях вызовов.</p><p>Чтобы понять, где искать узкое место, нужно пройтись по всей цепочке — от клиента до внешних сервисов.</p><h3>На уровне клиента</h3><ul><li>Тяжёлые бандлы. Огромный JS, куча аналитики, трекеры — и вот страница загружается 8 секунд на старом телефоне.</li></ul><ul><li>Чрезмерные запросы. После загрузки — 10 fetch в секунду. API захлёбывается, браузер — тоже.</li></ul><ul><li>Нет кеша. Даже статичные справочники каждый раз грузятся заново.</li></ul><ul><li>Лаги рендеринга. Бэкенд дал ответ за 100ms, но интерфейс лагает — сложные таблицы, графики, reflow.</li></ul><h3>На уровне API Gateway / BFF</h3><ul><li>Непрозрачная маршрутизация —  скрытые таймауты, ошибки ретраев.</li><li>Сборка ответов из микросервисов — цепочка из 5 вызовов на каждый клиентский запрос.</li><li>Синхронные вызовы без деградации — если один микросервис недоступен, падает весь endpoint.</li></ul><h3>На уровне Backend / бизнес-логики</h3><ul><li>Цепочки вызовов. Один сервис вызывает другой, тот — ещё один… И так далее.</li><li>Ограниченный пул соединений —  сервис готов работать, но все worker-ы ждут ресурсы.</li><li>Логика в цикле по данным —  N+1-запросы, сериализация, дублирование работы.</li></ul><h3>На уровне базы данных / кэша</h3><ul><li>Full table scan. Работает быстро на 1000 строках. Умирает на 10 миллионах.</li></ul><ul><li>Локи и гонка за ресурсы. Один UPDATE лочит строку, остальные ждут.</li></ul><ul><li>Кэш не промахивается, но и не помогает —  stale данные, повторные чтения, инвалидация не работают, как ожидалось.</li></ul><p><b>На уровне внешних сервисов (API, брокеры, платёжки)</b></p><ul><li>Без timeout и fallback. Внешний API залип — вы вместе с ним.</li><li>QPS-лимиты. Вы не знали, а вас уже зарейт-лимитили.</li><li>Нестабильная сеть. DNS тормозит, соединения рвутся, задержки скачут между регионами.</li></ul><p>Оптимизация кода важна. Но если система тормозит, искать нужно по всей цепочке —  от кнопки на фронте до брокера в соседнем дата-центре.</p><blockquote>Есть архитектурные паттерны риска, которые часто приводят к тормозам через полгода. Во-первых, общий ресурс на всех: один Redis, один Kafka-топик, одна таблица. Пока нагрузка маленькая — ок. Потом начинается бойня за доступ. Во-вторых, микросервисный монолит: формально разделены, но живут как один. Масштабировать невозможно. В-третьих, цепочки вызовов: 5–6 сервисов на путь одного запроса. Один подвис — и вся цепочка тормозит.</blockquote><h2>Базы данных: когда даже SELECT тормозит всё</h2><p>В бэкенде одна из самых коварных фраз — «ну это же просто SELECT, что с ним будет». Ответ — сначала ничего. Но со временем появляется 10 миллионов строк, и ваш innocuous SELECT превращается в full scan, который лочит диск, ест CPU и тормозит всё, что движется.</p><p>Типичная ситуация: в таблицу пишут JSONB без нормализации и индексов. Пока строк мало — жить можно. Но при росте объёмов каждый запрос превращается в медленное последовательное чтение. Это не просто «долго», а начинает мешать соседним транзакциям: подгружаются stale данные, вытесняется кэш, система начинает проседать вся — вплоть до API.</p><p>Отдельная ловушка — смешение OLTP и OLAP нагрузки. Днём — INSERT и UPDATE от клиентов, ночью — фоновая аналитика, высчитывающая отчёт за год с десятком JOIN и чтением всей таблицы. Если все запросы идут в один инстанс, происходит конкуренция за ресурсы: аналитика сбивает кеш, вызывает блокировки, а продакшн-метрики начинают сыпаться.</p><h3>Как понять, что тормоза идут из базы, а не из бэкенда?</h3><p>Вот несколько типичных признаков:</p><ul><li>Бэкенд «висит» на запросах к базе — в логах видно, что приложение ждёт результат запроса (долгий await, query(), findMany() и т. д.).</li></ul><ul><li>Latency растёт, а CPU и память в норме — сервис сам по себе не перегружен, но ответ приходит медленно.</li></ul><ul><li>В базе фиксируются медленные запросы — например, SELECT или JOIN занимают секунды, хотя раньше проходили за миллисекунды.</li></ul><p>Чтобы подтвердить гипотезу, можно:</p><ul><li>Включить логирование SQL-запросов с таймингом;</li><li>Посмотреть трейс: если шаг DB заметно длиннее остальных — это тревожный сигнал;</li><li>Запустить EXPLAIN ANALYZE на типовые запросы и проверить, где зарыта сложность.</li></ul><h3>Архитектура доступа к данным: как закладываются тормоза</h3><p>Архитектура доступа к данным — фундамент, на котором держится производительность всей системы. Даже идеальный алгоритм или быстрый backend не спасут, если данные извлекаются медленно, неэффективно или избыточно.</p><p>На что здесь стоит обратить внимание:</p><ul><li><b>Количество и характер обращений. </b>Один пользовательский запрос не должен порождать десятки обращений к базе. Планирование кэшей, агрегаций, prefetch, нормализация — всё это часть архитектуры.</li><li><b>Уровень абстракции над данными.</b> ORM может быть удобным, но часто скрывает десятки неэффективных SELECT’ов. Нужно понимать, какие запросы реально идут в базу, и не превращать каждый use case в потенциальный bottleneck.</li><li><b>Стратегия хранения и агрегаций.</b> Если вы пытаетесь на лету агрегировать 100 миллионов строк без шардинга и партиционирования — тормоза неизбежны. Архитектура должна учитывать нагрузку, частоту агрегаций, структуру данных.</li></ul><h2>Очереди и событийные системы: скрытые замедления</h2><p>Событийные архитектуры и очереди вроде Kafka или RabbitMQ часто воспринимаются как универсальное средство от всех проблем: «Сделаем асинхронно — и всё полетит». Но это не серебряная пуля. Очередь не решает проблему — она её откладывает. А иногда сама становится bottleneck’ом.</p><p>Типовые ситуации, когда очередь тормозит систему:</p><ul><li><b>Медленные консьюмеры.</b> Очередь принимает сообщения с высокой скоростью, но обработчики не успевают, и начинается накопление беклога. В результате задержки накапливаются, SLA летит, а вы только недоумеваете, почему всё так тормозит.</li><li><b>Неправильный размер batch’ей.</b> В Kafka и аналогах размер и частота batch'ей критичны. Слишком большие — ждём, пока соберётся партия. Слишком маленькие — тратим ресурсы на лишнюю загрузку и пересылку. В итоге получаем либо высокую задержку, либо низкую производительность.</li><li><b>Неравномерное партиционирование</b>. Если сообщения распределяются по партициям неравномерно, то часть узлов будет простаивать, а часть захлёбываться под нагрузкой. Одна горячая партиция может стать bottleneck’ом всей системы.</li><li><b>Проблемы с retry.</b> Если нет чёткой стратегии повторных попыток, логирования и DLQ (dead-letter queue), битое событие может крутиться в системе бесконечно, тормозя всё остальное. Также если что-то пошло не так и включились retry-механизмы, задержка может вырасти в разы. Особенно если есть backoff или дедлоки.</li></ul><h3>Почему «асинхронно» ≠ «мгновенно»</h3><p>Асинхронность — это не про скорость, а про отложенность. Событие отправлено — но когда оно будет обработано, никто не знает. Через секунду, через минуту, через час?</p><p>Типичные причины задержек в асинхронной обработке:</p><ul><li>Очередь перегружена, и событие просто стоит в хвосте.</li><li>Обработчик падает или рестартится, и событие ждёт.</li><li>Политики повторной обработки не настроены — событие крутится бесконечно.</li><li>Слишком много этапов внутри одного воркера: валидация, запись в БД, вызов API — всё это задержки, которые суммируются.</li></ul><h3>Что происходит, когда очередь переполнена — и почему это тяжело заметить</h3><p>Когда очередь переполняется, события в ней начинают задерживаться или теряться, в зависимости от конфигурации. Но хуже всего то, что это происходит тихо. Формально система работает: события принимаются, воркеры их обрабатывают. Но обработка начинает всё сильнее и сильнее отставать.</p><p>Очередь продолжает принимать события, но обрабатываются они с огромным отставанием. Новое сообщение встаёт в хвост и ждёт своей очереди десятки секунд или минут. Такую ситуацию легко не заметить, если у вас не настроен грамотный мониторинг.</p><p>Для защиты от переполнения очереди нужно мониторить несколько важных показателей:</p><ul><li>Глубина очереди (в Kafka — consumer lag, в RabbitMQ — queue.messages_ready или queue.messages): показывает, сколько сообщений накопилось и ждёт обработки.</li><li>Publish rate: сколько сообщений в секунду публикуется.</li><li>Processing rate: сколько сообщений в секунду обрабатывается.</li><li>Утилизация ресурсов воркеров (CPU, memory, I/O).</li><li>End-to-end latency: сколько времени проходит от публикации события до его обработки.</li></ul><blockquote>Есть самые частые причины накопления сообщений:<br /><br />1) Медленные потребители, которые не успевают обработать весь поток сообщений. <br />2) Шумная архитектура: 10 сообщений там, где можно было обойтись и одним. <br />3) Неправильное масштабирование брокера (например, неправильно выбранный ключ партиционирования в Kafka).</blockquote><h2>API и микросервисы: где тормозит взаимодействие</h2><p>Микросервисная архитектура на бумаге выглядит идеально: каждый сервис автономен, команды независимы, масштабирование прозрачно. Но на практике все часто превращается в болото синхронных вызовов, где каждый сервис делает запросы в пять других.</p><h3>Что тормозит в микросервисах?</h3><p><b>Много лишних вызовов</b></p><p>Один пользовательский запрос вызывает лавину внутренних HTTP/gRPC-запросов. Каждый из них — это:</p><ul><li>сетевые задержки (latency),</li><li>сериализация/десериализация данных,</li><li>ретраи при сбоях,</li><li>риск таймаутов и обрывов.</li></ul><p>Если таких вызовов много, задержка накапливается каскадом.</p><p><b>Цепочка зависимостей</b></p><p>Классика жанра: заказ зависит от оплаты, оплата — от биллинга, биллинг — ещё от трёх микросервисов.</p><p>Если тормозит хотя бы один, сыплется всё. Получается эффект домино и каскадные отказы, где неполадка в одном звене рвёт всю цепочку.</p><p><b>Нет fallback'а и таймаутов</b></p><p>Если вызов к нужному сервису не отвечает, а у вас нет fallback'а или таймаута — всё встаёт. Особенно плохо, если вызов синхронный и блокирует поток.</p><p><b>Наносервисы</b></p><p>Иногда архитекторы увлекаются и дробят сервисы до абсурда. Начинается с «давайте переиспользуем», а заканчивается 10 API-вызовами ради одного действия.</p><p>Вместо бизнес-логики система начинает заниматься оркестрацией — координирует сама себя.</p><h2>Кэш и CDN: почему «ускорители» тоже могут тормозить</h2><p>Кэш традиционно считается палочкой-выручалочкой для производительности. «Добавим кэш — и всё полетит», — думают команды, особенно под нагрузкой. Но в реальности кэш может не только не ускорить, но и наоборот — замедлить или даже уронить систему, если использовать его без понимания.</p><p>Вот несколько типичных ошибок, которые приводят к деградации производительности:</p><h3>Невалидные или слишком агрессивные стратегии</h3><p>Если кэш живёт слишком долго — пользователи получают устаревшие данные. Если обновляется слишком часто — создаются лишняя нагрузка на базу и почти постоянные «промахи».</p><p>А если кэш сбрасывается при каждом изменении, он вообще не успевает выполнять свою роль.
В итоге: нестабильное поведение, непредсказуемая производительность и раздражённые пользователи.</p><h3>Перегрузка кэша</h3><p>Когда кэш настолько загружен, что сам по себе начинает тормозить — это уже не помощь, а вред. Такое часто случается с Redis, Memcached или in-memory решениями, особенно если они:</p><ul><li>работают на одной машине без шардинга;</li><li>содержат тяжёлые объекты;</li><li>используются как универсальный ответ на все проблемы.</li></ul><p>В таких случаях кэш из «ускорителя» может падать под нагрузкой быстрее, чем база данных.</p><h3>Кэш-миссы и лавины запросов</h3><p>Классическая проблема: TTL у популярных ключей истекает одновременно, и тысячи запросов идут мимо кэша в базу.
Это может случиться после деплоя, сброса кэша или при пиковой нагрузке.</p><p>Вместо одного запроса вы получаете 10 000, и тормозит всё. Особенно критично это для систем с CDN, где внезапное истечение кэша популярных страниц может вызвать DDoS-подобную нагрузку.</p><h3>Несогласованность кэшей</h3><p>Если в системе несколько уровней кэширования (CDN, фронтовый кэш, Redis) и они обновляются по-разному, возникает несогласованность. Один пользователь видит новые данные, другой — старые. Один сервис работает с актуальной версией, другой — с устаревшей. Начинается охота за фантомами: баги вроде есть, но не у всех.</p><h2>Вычисления и память: что не так с аллокацией</h2><p>Почему мощные сервера с десятками ядер и гигабайтами памяти тормозят? Потому что производительность упирается не в «железо», а в то, как именно это железо используется. От плохого управления памятью до блокирующих операций — в системе может быть множество узких мест, которые незаметно душат throughput.</p><h3>Частые и крупные аллокации</h3><p>Каждый раз, когда создаётся новый объект, память выделяется из кучи. При интенсивной работе (например, при парсинге JSON или обработке больших структур) это может происходить слишком часто, и тогда запускается сборщик мусора (GC).</p><p>Сборка мусора — это не бесплатная операция: она останавливает выполнение программы. Частые GC-паузы создают «плавающую» производительность, когда всё работает быстро, но время от времени подвисает даже на секунду.</p><h3>GC-паузы</h3><p>Автоматическое управление памятью — благо, но оно же и ловушка. В языках вроде Go, Java или Python невозможно точно контролировать, когда сработает сборщик. Даже задержка в 50 миллисекунд может ощутимо ударить по RPS или нарушить real-time обработку.</p><p>Некоторые компании придумывают обходные пути. Так, в Twitch <a href="https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap/">использовали</a> технику memory ballast для Go-приложений, чтобы стабилизировать поведение GC и избежать всплесков пауз.</p><h3>Синхронные и блокирующие операции</h3><p>Если операции с файлами, сетью или базой данных выполняются синхронно, поток блокируется — и в это время не может обрабатывать другие задачи. Это особенно критично, если такой поток обслуживает пользовательские запросы.</p><p>Классический пример — однопоточный web-сервер, который просто ждёт ответ от другой системы. Или библиотека, использующая mutex.Lock() в горячем участке, из-за чего десятки горутин встают в очередь.</p><h3>Ограниченные ресурсы и очереди</h3><p>Даже в многопоточном приложении можно легко создать узкое место. Например:</p><ul><li>доступ к объекту синхронизирован через mutex или RW-lock;</li></ul><ul><li>пул соединений имеет жёсткий лимит;</li></ul><ul><li>очередь задач не может масштабироваться под нагрузку.</li></ul><p>В таких случаях нагрузка растёт, а пропускная способность — нет. Всё упирается в искусственное ограничение, введённое «на всякий случай».</p><h3>Однопоточные горячие участки</h3><p>Даже в многопоточной архитектуре может оказаться, что 80% времени тратится в одном месте, которое не масштабируется — например, в процессе сериализации, расчёта или шифрования. Иногда этот участок реализован однопоточно (особенно в Node.js, Python или старом Go-коде) и становится главным тормозом системы. Под высокой нагрузкой это становится особенно заметно.</p><h2>Что делать: подход к поиску и устранению bottlenecks</h2><p>Когда система тормозит, возникает соблазн сразу «что-то сделать» — добавить кэш, увеличить ресурсы, ускорить базу. Но без системного подхода можно попасть в замкнутый круг, где проблема будет возвращаться снова и снова. Чтобы избежать этого, лучше использовать пошаговую стратегию: зафиксировать симптомы, локализовать проблему, подтвердить и только потом оптимизировать.</p><h3>Шаг 1. Зафиксировать симптомы и контекст</h3><p>Важно понять, что именно «тормозит» и в каких условиях. Типовые вопросы:</p><ul><li>Когда проявляется проблема: под нагрузкой, в пиковые часы, у конкретных пользователей?</li><li>Что именно работает медленно: API, отчёты, фоновая обработка?</li><li>Как это влияет на систему: задержки, таймауты, ошибки?</li></ul><p>Пример: пользователи жалуются, что отчёты стали строиться дольше. Вчера — 5 секунд, сегодня — 20.</p><h3>Шаг 2. Проверить очевидные метрики</h3><p>Начинаем с того, что уже доступно в мониторинге:</p><ul><li>латентность API (p50, p95, p99);</li><li>загрузка CPU, использование памяти и диска;</li><li>глубина очередей и backlog;</li><li>паузы GC;</li><li>кэш hit/miss ratio.</li></ul><p>Если латентность растёт, а CPU загружен на 20%, это может указывать на проблемы в синхронных вызовах, аллокации или неэффективной работе кэша.</p><h3>Шаг 3. Сузить область через трейсинг и логирование</h3><p>Чтобы выяснить, не «тормозит» ли другой сервис, используйте распределённый трейсинг (Jaeger, OpenTelemetry, Sentry Performance) или логирование таймингов внутри запроса.</p><p>Пример (Go, обёртка для http.RoundTripper):</p><p>Так можно увидеть, что, например, сторонний сервис отвечает 3 секунды, или Redis стал отдавать ответ за 300 мс вместо обычных 3 мс.</p><h3>Шаг 4. Воспроизвести нагрузку</h3><p>Если проблема зависит от объёма данных, воспроизведите реальный сценарий или нагрузку:</p><ul><li>используйте инструменты вроде k6, Locust, Artillery;</li><li>проверьте реальные условия (например, отчёт за 30 дней, а не за 3).</li></ul><p>Если латентность растёт нелинейно, это может быть признаком N+1-запросов, неоптимального SQL или проблем с аллокацией.</p><h3>Шаг 5. Подтвердить проблему профилированием</h3><p>Если есть подозрение на перегрузку CPU или утечку памяти, используйте профилировщики:</p><ul><li>Go — pprof;</li></ul><ul><li>Java — JFR, VisualVM;</li></ul><ul><li>Node.js — clinic.js, chrome://inspect.</li></ul><p>Пример (Go, локальный pprof):</p><p>Профиль покажет, где тратится CPU, как распределяются аллокации, как часто запускается GC и в каком коде.</p><h3>Шаг 6. Оптимизировать, перепроверить и зафиксировать</h3><p>После подтверждения проблемы можно переходить к исправлениям:</p><ul><li>кэшировать внешний вызов;</li></ul><ul><li>заменить тяжёлую сериализацию (например, на easyjson в Go);</li></ul><ul><li>убрать блокирующую операцию;</li></ul><ul><li>перейти на batch-обработку.</li></ul><p>После изменений обязательно перепроверьте метрики, чтобы убедиться, что оптимизация действительно дала эффект — и не добавила новых узких мест.</p><h2>Итоги: как не попасть в архитектурную ловушку</h2><p>Bottleneck’и возникают даже в самых технологичных проектах. Это не всегда следствие «плохого кода» — куда чаще они появляются из-за архитектурных просчётов: недооценили нагрузку, не предусмотрели масштабирование, сделали ставку на неправильное решение.</p><p>Главная проблема в том, что узкие места проявляются не сразу, а под нагрузкой. В разработке и тестах всё летает, потому что ресурсов хватает. А вот в проде — особенно при росте аудитории — на поверхность всплывает всё, что не выдерживает реального объёма данных или конкуренции за ресурсы.</p><p>Чтобы избежать таких проблем, важно не просто писать чистый код, а мыслить системно: проектировать архитектуру так, чтобы она могла жить под давлением. Вот несколько принципов, которые помогут.</p><h3>Думайте об объёмах и росте</h3><p>Архитектура должна выдерживать не только текущую нагрузку, но и разумный рост. Строить систему на «миллиард пользователей» с первого дня — избыточно. Но если вы рассчитываете, что пользователей станет в 5 раз больше через год — закладывайте это сейчас. Узкие места не любят сюрпризов.</p><h3>Настраивайте метрики с первого дня</h3><p>Без данных вы работаете вслепую. Любой анализ будет превращаться в гадание: виноват код или Redis, где тормозит — непонятно. С самого начала следите за ключевыми метриками: latency, очереди, GC, hit/miss в кэше, ошибки. Это не «доработка потом», а часть живой системы.</p><h3>Проектируйте с учётом деградации</h3><p>Любая система может начать тормозить — вопрос в том, как она себя при этом поведёт. Важно предусмотреть мягкую деградацию: таймауты, очереди, резервные сценарии, ограничение входящего трафика.</p><h3>Не усложняйте архитектуру без повода</h3><p>Микросервисы, шины, очереди, event-driven — всё это мощные инструменты. Но сложность должна быть оправданной. Простая, понятная архитектура с мониторингом и масштабируемыми точками зачастую выигрывает у перегруженной модульной схемы, которую никто не может отладить.</p><p>Bottleneck’и — это не баг, а симптом. И хороший архитектор — это не тот, кто устраняет тормоза, а тот, кто их не допускает.</p><p>Больше боли коддеров — <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Неизбежность эволюции программных систем</title>
      <link>https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem</link>
      <comments>https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Межов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem</guid>
      <description><![CDATA[<p>На старте проекта хочется сделать что-то уникальное — но вместо сложной архитектуры лучше выбрать простоту и гибкость. Почему зрелые системы вырастают из минималистичных решений, когда можно позволить себе усложнение — и как понять, что пришло время для следующего шага?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem">Неизбежность эволюции программных систем</a>»</p>]]></description>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 15 Jun 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие считают, что новый проект стоит начинать с простого: быстрее сделать MVP, собрать первую обратную связь, не тратить ресурсы впустую. И это разумно — зачем строить космический корабль, если он может так и не вылететь из ангара, а на его обслуживание не хватит ни людей, ни бюджета. Но почти у каждого разработчика внутри живёт желание создать что-то по-настоящему оригинальное. Так почему бы не дать волю этому порыву? Как понять, что проект созрел для нестандартных решений — и настал момент рискнуть?</p><p>На самом деле подобная постановка вопроса некорректна. Практически любое решение никогда не бывает финальным, тем более сразу. Об этом пишут многие заслуженные авторы, но самой яркая цитата, пожалуй, <a href="https://en.wikipedia.org/wiki/John_Gall_(author)#Gall's_law">закон Голла</a>.</p><blockquote>Любая работающая сложная система неизменно оказывается производной простой работающей системы.</blockquote><p>Позволю себе внести важные уточнения.</p><ul><li><i>Простота системы</i> означает не примитивизм, а наличие ограниченного числа взаимодействующих между собой элементов с понятными и прослеживаемыми связями между ними.</li><li><i>Сложность системы</i> означает не трудность организации самой системы, а её зрелость, точность модели предметной области.</li></ul><p>Таким образом, если принять неизбежность эволюционного развития систем, тогда <i>гораздо более важным аспектом выступает возможность самой эволюции.</i> Для этого нужно обеспечить, как минимум, два условия.</p><p>Во-первых, поскольку на начальных стадиях слишком много неопределенности, нужно как можно дольше сохранять свободу выбора направления развития. Во-вторых, принимаемые решения должны уточнять вектор движения для развития в желаемом направлении. Именно в этом контексте речь идет о гибкости архитектуры.</p><p><i>Гибкость архитектуры</i> — понятие ортогональное к простоте и сложности, означающее степень готовности системы к изменениям. Простая — не значит гибкая, обратное также справедливо. Гибкость становится возможной, в том числе, если система не зависит от специфических возможностей составляющих её элементов или особенностей взаимодействия между ними. Например, гибкость снижается, если появляется зависимость от уникальных особенностей определенной базы данных или зависимость этой базы данных от определённого окружения. Между тем, слишком гибкое решение — бесформенное, рыхлое, оно не может задавать структуру, обрекая весь проект на провал.</p><p>Такие размышления — не откровение, об этом давно и много говорят. Я лишь хочу подчеркнуть: задача архитектора — не просто принять логичное решение, но и просчитать его развитие. Важно думать на несколько шагов вперёд, сохраняя при этом простоту и гибкость архитектуры как можно дольше. Это, пожалуй, и есть лучший ориентир в выборе времени и уместности тех или иных решений. Каждый шаг должен вести к цели, закладывать основу для следующего и помогать точнее видеть направление движения. Если всё это соблюдается — значит, пора действовать.</p><p>Именно с такой перспективы стоит подходить к обоснованию архитектурных решений. Поэтому некоторые «аргументы», о которых пойдёт речь ниже, стоит отбрасывать сразу — несмотря на их комичность, в практике они встречаются до сих пор.</p><ul><li>Выбор технологии на основе только её популярности. («Так принято в лучших домах!», «Kafka справится с любой задачей» и т.п.)</li><li>Ориентация на скорость, обоснованная амбициями или ощущениями. («Некогда думать — надо действовать!», «Мир сам себя не захватит!»)</li><li>Неоправданное и/или преждевременное усложнение. («У меня нет задач, нужно придумать что-то интересненькое», «У меня скучные задачи, нужно добавить драйва», «Я предусмотрел обработчик на случай вторжения инопланетян!» и т.п.)</li><li>Неоправданное расширение технологического стека. («CV-Driving Development», «Решил попробовать», «Мне так удобней» и т.п.)</li></ul><p>Принимая неизбежность эволюционного развития систем, важность гибкости архитектуры на ранних стадиях, а также необходимость постоянной корректировки направления развития (стратегии), люди задают вопрос, почему кто-то начинает не с простых вещей. Почему кто-то сразу начинает с гексагональных архитектур или микросервисов?</p><p>Согласен, что иногда это и есть преждевременное усложнение. Однако, если архитектор или разработчик достаточно опытный, он может позволить себе «срезать углы», действуя на опережение. В данном случае он должен осознавать и указывать на все риски подобных действий, в том числе понимать, кто будет поддерживать и сопровождать такой продукт. Тут можно вернуться к метафоре с «космическим кораблём»: нужен ли он на старте, есть ли у вас подходящая команда, инфраструктура, ресурсы?</p><p>Я постарался описать тактику принятия решений, которой стараюсь пользоваться в работе. Было бы интересно узнать, как вы справляетесь с соблазнами несвоевременного применения понравившегося решения.</p><p><i>P.s. Если вам интересна данная тематика, присоединяйтесь к моей новостной ленте в Telegram или здесь. Буду рад поделиться опытом. 😉</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Как я развернул сайт на Java Spring Boot + Angular SSR с Docker и Nginx: личный опыт</title>
      <link>https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt</link>
      <comments>https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тюрин ]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt</guid>
      <description><![CDATA[<p>Как развернуть сайт на Spring Boot и Angular с SSR, Docker и Nginx: пошаговый опыт настройки, устранения ошибок, подключения HTTPS и защиты от ботов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt">Как я развернул сайт на Java Spring Boot + Angular SSR с Docker и Nginx: личный опыт</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 31 May 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект представляет
собой веб-приложение на Spring Boot и Angular.
Первоначально я выбрал простую монолитную
архитектуру, но по мере роста требований
и целей пришлось перейти на микросервисный
подход. Здесь я расскажу, как это
происходило: с конфигурациями, ошибками
и решениями.</p><h2>Монолитная архитектура</h2><p>Исходная схема:</p><ul><li>Backend: Spring Boot</li><li>Frontend:
	Angular</li></ul><p>Так как у меня уже
был арендованный VDS, я зарегистрировал
домен у одного известного провайдера,
а хостил сайт уже на VDS сервере.
Для простоты интегрировал Angular-сборку
в Spring Boot как статику через
frontend-maven-plugin.
Всё собиралось в один JAR. Почему так?
Ранее уже был такой опыт, и я решил пойти
этим путем.</p><p>После регистрации
домена необходимо подождать, чтобы ввести доменное имя.
Значит есть время для запуска и настройки
приложения. Однако при тестировании
проявились ключевые недостатки:</p><ul><li>Отсутствие SSR в
	Angular негативно влияло на SEO;</li><li>Ошибка в Angular ломала Maven-сборку;</li><li>Сложно поддерживать и масштабировать.</li></ul><h2>Переход на микросервисы</h2><p>Было принято решение
разделить фронтенд и бэкенд на отдельные
сервисы и использовать микросервисный
подход с SSR для Angular:</p><p>Новая структура:</p><ul><li>Backend: Spring Boot</li><li>Frontend:
	Angular Universal (SSR)</li><li>Инфраструктура:
	Docker Compose, Nginx, HTTPS</li></ul><h3>Docker, Nginx и запуск</h3><p>Создана базовая
структура docker-compose.yml:</p><p>И соответствующий
Nginx:</p><p>После запуска проект
открывался по IP, но появилось множество
проблем:</p><ul><li>Дублирование
	API-префиксов: /api/api/endpoint
→
	Решение: корректировка proxy_pass
	и URL в Angular</li><li>Редиректы
	на POST: Spring добавлял лишние слеши
→
	Решение: правильные аннотации и настройка
	Nginx</li><li>405
	Method Not Allowed
→ Решение: использовать
	@PostMapping</li><li>Docker-сети
→
	Решение: задать общую сеть в
	docker-compose.yml</li></ul><h3>Безопасность: HTTPS, SSL, CORS</h3><p>Чтобы сайт открывался
по имени с панели провайдера для моего
домена, значения DNS-сервера оставил без
изменений (провайдер предоставляет их
бесплатно), а для ресурсной записи @ и
www указал ip адрес своего хостинга. Так
как провайдер домена бесплатно
предоставил SSL-сертификаты (Let's Encrypt), то
как я их интегрировал:</p><p>Скачал с панели
провайдера и перенес на хостинг такие
файлы:</p><p>domain.crt — сертификат</p><p>domain.key — приватный
ключ</p><p>ca_bundle.crt — цепочка
доверия</p><p>Добавил
в Nginx такую запись для HTTPS:</p><p>Но при обращении к сайту по https конечно же возникли ошибки.
А именно: в логах Nginx были ошибки на
SSL_CTX_use_PrivateKey_file.
Оказалось формат был PKCS#7, а
требовался PEM. Конвертировал через
OpenSSL:</p><p>Так
как сертификаты имеют срок действия,
не стоит забывать об их продлении и
обновлении.</p><p>К
тому же всегда следует проверять логи
Nginx (error.log), там могут находится ответы
на вопросы, почему сайт не работает.</p><p>На стороне Spring Boot
были CORS-проблемы, решено так:</p><h3>Атаки ботов и защита</h3><p>После запуска сайта
в логах Nginx стали появляться тысячи
запросов от ботов, ищущих уязвимости
WordPress, PHPMyAdmin и других популярных утилит,
хотя мой сайт работает на Java/Angular. Пример
лога:</p><p><i>45.155.205.213
- - [01/Jan/2023:04:12:11 +0000] "GET /wp-login.php HTTP/1.1"
404 153</i></p><p>Добавлен фильтр в
nginx.conf:</p><h3>Финальная конфигурация</h3><p>После
всех настроек мой сайт
работает и полностью функционирует.
Конфигурация сильно изменена по сравнению
с первоначальной. Вот как они выглядят
сейчас.</p><p><i>docker-compose.yml</i></p><p><i>
nginx.conf</i></p><p><i>
Dockerfile backend</i></p><p><i>
Dockerfile frontend</i></p><p>Разделение сервисов
улучшило поддержку и масштабируемость, к тому же, я получил ценные знания. Надеюсь,
статья будет полезна тем, кто разворачивает
подобные конфигурации на Java и Angular.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cборка мусора в Java Highload</title>
      <link>https://tproger.ru/articles/cborka-musora-v-java-highload</link>
      <comments>https://tproger.ru/articles/cborka-musora-v-java-highload?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Artem M.]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/cborka-musora-v-java-highload</guid>
      <description><![CDATA[<p>Как мы убили 400ms лаги в банке и выжали из Java 55k транзакций/сек: хардкор про GC и адреналин</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/cborka-musora-v-java-highload">Cборка мусора в Java Highload</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 24 May 2025 09:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Несколько лет работаю Java инженером в финтехе. Недавно вывели на рынок очередное HL-решение со строгим SLA по RPS и Latency. Хотел бы кратко описать проблемы и путь их решения.</p><p>Когда бизнес затребовал систему для обработки транзакций в реальном времени с пиковой нагрузкой в 50 тысяч операций в секунду, я понял, что серые будни enterprise инженера наконец станут весельем. Наш сервис должен был не просто работать — он должен был дышать под давлением, сохраняя отклик в пределах 10 мс. Не все проблемы в мире можно решить горизонтальным масштабированием, и одним из камней преткновения стала Java, а точнее — её «мусор».</p><h2>Выбор GC: G1, Shenandoah или ZGC?</h2><p>Первое, с чем столкнулась наша команда, — продолжительные STW-прерывания при нагрузке. Изначально использовали G1GC как «дефолтный» выбор для баланса между latency и throughput. Но под нагрузкой 80% CPU даже G1 не справлялся: пиковые паузы достигали 400 мс, что для платежей было неприемлемо.</p><p>Мы устроили мозговой штурм с performance-инженерами. Варианты:</p><p>1. Shenandoah — низкие паузы, но требуется больше CPU.</p><p>2. ZGC — субмиллисекундные паузы даже на терабайтных хипах, но тогда (на старте проекта) он был экспериментальным в OpenJDK 11.</p><p>3. Ручная настройка G1 — максимизировать предсказуемость через MaxGCPauseMillis и InitiatingHeapOccupancyPercen.</p><p>После недели тестов на стенде с имитацией пиковой нагрузки (JMeter + Gatling) и профилирования через async-profiler, выбор пал на ZGC. Его паузы не превышали 2 мс даже при 32 ГБ куче, а алгоритм «цветных указателей» позволял масштабироваться без блокировок. Риск? Да. ZGC был новым, но его поддержка в последних LTS-версиях и тесты убедили нас.</p><h2>Тонкая настройка и проклятие «тихих» утечек</h2><p>С ZGC мы выставили:</p><p>1. -Xmx48g (с запасом для избежания частых аллокаций),</p><p>2. -XX:SoftMaxHeapSize=40g (чтобы ZGC активнее возвращал память ОС),</p><p>3. -XX:+UseLargePages (снижение overhead на page faults).</p><p>Но через месяц нагрузочного тестирования обнаружили «ползучее» увеличение потребления памяти. Performance-команда, анализируя дампы через Eclipse MAT, нашла проблему: кэш данных транзакций в Apache Ignite не учитывал soft-ссылки, накапливая объекты. Вместо ConcurrentHashMap перешли на `Caffeine` с политикой expiry после 10 секунд, что снизило давление на GC.</p><h2>Команда performance-инженеров: алхимики метрик</h2><p>Работа с perfomance-инженерами напоминала лабораторию безумных ученых. Каждый параметр JVM, каждый HTTP-эндпоинт тестировался через JMH, а Grafana-дашборды визуализировали следующее:</p><p>1. GC pauses (ZGC собирал статистику через -Xlog:gc*),</p><p>2. Allocation rate (до 1.5 ГБ/сек в пиках),</p><p>3. CPU utilization (наши самописные RateLimiter’ы съедали 15% ресурсов).</p><p>Совместно мы написали скрипты на Python, которые автоматически подбирали -XX:ConcGCThreads и -XX:ParallelGCThreads в зависимости от нагрузки на CI/CD стендах. Это сократило время настройки на 70%.</p><h3>Продакшн: огненное крещение</h3><p>После релиза первые дни мы мониторили всё: New Relic для трейсинга медленных методов, Prometheus для сбора JVM-метрик. ZGC не подвел — 99-й перцентиль отклика оставался на уровне 12 мс. Но однажды ночью мы получили алерты по потреблению CPU. Оказалось, фоновый процесс генерации отчетов создавал миллионы временных объектов. Решение: выделили его в отдельный микросервис с выделенным пулом памяти и CMS (ему хватало).</p><h2>Итоги</h2><p>Через полгода система обрабатывала 55k операций/сек с пиковыми паузами GC в 1.8 мс. Главные уроки:</p><p>1. GC — не серебряная пуля. Даже ZGC требует понимания аллокаций в коде.</p><p>2. Performance-инженеры — ваши лучшие союзники. Их взгляд со стороны JVM спас нас десятки раз.</p><p>3. Документировать всё. Наши конфиги и скрипты настройки GC стали стандартом для других команд банка.</p><p>Теперь, когда я вижу, как сервис работает без перебоев, вспоминаю те бессонные недели с дампами и тестами… и понимаю: это того стоило. Ведь в мире highload каждая миллисекунда — это деньги. Или, как говорят у нас в банке, «миллисекунда — миллион».</p>]]></content:encoded>
    </item>
    <item>
      <title>CD, флоппи и кассеты: как мы хранили данные до флешек и облаков</title>
      <link>https://tproger.ru/articles/cd--floppi-i-kassety--kak-my-hranili-dannye-do-flewek-i-oblakov</link>
      <comments>https://tproger.ru/articles/cd--floppi-i-kassety--kak-my-hranili-dannye-do-flewek-i-oblakov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/cd--floppi-i-kassety--kak-my-hranili-dannye-do-flewek-i-oblakov</guid>
      <description><![CDATA[<p>Эволюция носителей данных от дискет и магнитных лент до облачных сервисов. Прошлое и будущее способов хранения и воспроизведения информации. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/cd--floppi-i-kassety--kak-my-hranili-dannye-do-flewek-i-oblakov">CD, флоппи и кассеты: как мы хранили данные до флешек и облаков</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Ретро]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Фильмы]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Sony]]></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[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Стриминговые сервисы]]></category>
      <category><![CDATA[Steam]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 16 May 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня, когда терабайты информации умещаются в кармане, а облачные хранилища доступны в два клика, трудно представить, что всего 30 лет назад люди осторожно вставляли в компьютер хрупкие пластиковые квадратики с объемом в 1,4 Мб, надеясь, что дискета не «съест» важные файлы.</p><p>Для поколения Z и альфа дискеты, кассеты и CD — такая же архаика, как патефон для миллениалов. Но именно эти носители стали мостом между эпохой аналоговых технологий и цифровой революцией. Некоторые до сих пор помнят скрежет модема, загружающего игру с аудиокассеты, или волнение при записи первого CD — этот ритуал требовал идеального буфера в Nero и молитв, чтобы электричество не отключили в процессе.</p><p>Вспомним, какими были носители данных до эры флешек и облаков. Это не просто история технологий — это рассказ о том, как мы научились ценить каждый мегабайт и почему современные удобства сделали нас немного ностальгирующими гиками.</p><h2>Носители информации: эволюция</h2><p>Сегодня данные окружают нас, как воздух — невидимые, но жизненно важные. В наших смартфонах — навигаторы, приложения для заказа еды, интернет-банкинг, весь Лев Толстой в текстовом или аудиоформате. Фотографии автоматически загружаются в облако, рабочие документы синхронизируются между устройствами, а музыка и фильмы доступны по первому требованию без необходимости записывать что-либо на пленку или вставлять диск в дисковод.</p><p>Мы живем в эпоху, когда информация стала нематериальной, а ее хранение — виртуальной услугой, за которую ежемесячно платят подпиской. При этом цена за удовольствия, информацию и духовную пищу (музыка, кино, книги и т.д.) несоизмеримо ниже, чем несколько десятилетий назад.</p><p>Но так было не всегда. Было время, когда никто не доверял интернет-хранилищам — да их и не было в том виде, к которому мы сегодня привыкли. Важные файлы хранили на чем-то осязаемом — дискетах, дисках, пленках. Данные были привязаны к физическим объектам, которые можно было потерять, сломать или случайно очистить.</p><p>История носителей — это история компромиссов между объемом, скоростью и надежностью. Каждая эпоха выбирала свой формат, исходя из технологических возможностей и потребностей пользователей, будь то ученые, музыканты или просто те, кто очень хотел сохранить свою коллекцию пиксельных картинок.</p><p>Первые носители информации были аналоговыми и требовали физического контакта. Бумага, перфокарты, магнитная лента — все это работало по принципу «записал один раз и следи, чтобы не испортилось». Но с появлением продвинутой техники понадобилось что-то более гибкое, что позволило бы не только хранить, но и быстро перезаписывать данные. Так началась эра магнитных носителей.</p><p>Магнитные кассеты использовались не только для записи и воспроизведения музыки, но и стали первым массовым способом хранения цифровой информации для домашних компьютеров. Пользователи писали на пленку игры типа Pacman или Dizzy, а также  прикладные программы для компьютеров АТМ Турбо и Spectrum.</p><p>Кассеты были дешевы, доступны, но обладали низкой скоростью доступа. Загрузка программы с кассеты занимала несколько минут: один сбой — и данные отправлялись в небытие. Тем не менее для своего времени это был прорыв: в отличие от перфокарт, кассеты позволяли перезаписывать информацию, а их компактность делала этот способ удобным для домашнего использования.</p><p>Затем пришли дискеты, и мир узнал, что такое «портативность» в цифровом смысле. Если кассеты были еще слегка похожи на предыдущее поколение (массивные бобины), то флоппи-диски уже вполне выглядели как технология из будущего. Первые модели хранили жалкие 80 КБ, но к 1980-м емкость выросла до 1.44 МБ — достаточно для текстовых документов и простейших программ. Правда, надежность оставляла желать лучшего: магнитные диски боялись пыли, влаги и просто времени.</p><p>Оптические носители, такие как CD и DVD, стали следующим шагом. Они предлагали куда больший объем (от 700 МБ до 4.7 ГБ) и теоретически — вечное хранение данных. Правда, на практике царапины, солнечный свет и некачественные болванки приводили к быстрому обнулению файлов. Но главный минус — эти диски нельзя было просто так перезаписать. CD-RW и DVD-RW решили проблему, но их распространение было медленным: люди уже начали привыкать к тому, что данные можно копировать бесконечно.</p><p>Конец XX века принес еще несколько любопытных форматов вроде ZIP-дисков, которые пытались заменить флоппи, но проиграли войну, поскольку оказались слишком дорогими и неудобными.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/71eb328d-a19d-48f3-8864-b798c77cd662.jpg" alt="" /></figure><p>Эволюция носителей — это вопрос не только технологий, но и человеческих привычек. Мы перешли от кассет, которые нужно было перематывать, к дискам, которые нельзя было поцарапать, а затем — к флеш-памяти, где вообще не было движущихся частей. Каждый новый формат убивал предыдущий, поскольку делал хранение данных проще, надежнее, быстрее и дешевле. О том, как это происходило на практике, читайте далее.</p><h2>Как хранили и передавали информацию до флешек и облаков</h2><p>Ненадежные, но безальтернативные дискеты, вмещавшие меньше, чем сегодняшний снимок экрана; кассеты с уязвимой магнитной пленкой; CD с их обманчивым обещанием «вечного хранения». Все эти носители в свое время считались если не революционными, то прогрессивными и передовыми. Нынешнему поколению будет полезно узнать, где хранили музыку, видео, софт и другие данные их родители и почему эти волшебные изобретения больше не используются массово.</p><h3>Аудио и видеокассеты: не забудьте перемотать на начало</h3><p>До того как видеохостинги и стриминговые сервисы стали нормой, люди обменивались музыкой и фильмами при помощи хрупких пластиковых коробочек с магнитной лентой внутри. Аудио- и видеокассеты были не просто носителями — они стали культурным феноменом, символом эпохи, когда контент нельзя было получить мгновенно, зато можно было легко испортить — поместить рядом с магнитом или «зажевать» в некачественном проигрывателе.</p><p>Магнитная лента появилась задолго до кассет — первые бобинные магнитофоны использовались еще в 1940-х, но они были громоздкими и дорогими. Все изменилось в 1963 году, когда компания Philips представила компакт-кассету — небольшой, удобный и, что важно, дешевый формат. В отличие от винила, кассеты можно было записывать повторно, носить с собой и даже ронять без катастрофических последствий.</p><p>К 80-м годам кассеты стали основным способом слушать музыку. Их продажи в США достигли пика в 442 миллиона штук в 1990 году, но затем началось стремительное падение — CD-диски предлагали лучшее качество звука и отсутствие изматывающей перемотки. Однако кассеты не исчезли полностью: даже в 2012 году в Штатах продали 13 миллионов штук, в основном благодаря автолюбителям, чьи старые машины были оборудованы кассетными магнитолами. В России формат держался примерно до середины 2000-х, после чего кассеты почти исчезли из обихода.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/aff42e02-398c-4f5e-a1f0-ff8fc0074ca5.png" alt="" /></figure><p>Пока аудиокассеты правили балом в музыке, VHS делал то же самое с видео. Этот формат, появившийся в 1970-х, быстро вытеснил конкурентов (например, Betamax от Sony) благодаря простоте и доступности. Видеомагнитофон стал почти обязательным устройством в каждом доме, а прокат кассет — целой индустрией.</p><p>Но у VHS были свои причуды:</p><ul><li>Длинный фильм на двухчасовой кассете мог закончиться в самый напряженный момент, заставляя зрителя в недоумении хлопать глазами.</li><li>Качество изображения ухудшалось с каждой перезаписью, превращая картинку, над которой так трудилась съемочная группа, в движения размытых или крупнозернистых силуэтов.</li><li>Размагничивание, скручивание ленты и вечная борьба со «снегом» и полосами на экране — все было неотъемлемой частью пользовательского опыта.</li></ul><p>Несмотря на это, VHS формат продержался до начала 2000-х, пока его не вытеснили DVD, а затем и стриминговые сервисы.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/c0d5e69c-ad0d-46ac-8a66-9a759df9c1ef.png" alt="" /></figure><p>Магнитная лента использовалась не только для музыки и фильмов — в 1980-х она стала первым массовым носителем данных для домашних компьютеров. Владельцы ZX Spectrum и Commodore 64 загружали программы с аудиокассет, подключив магнитофон к компьютеру. Процесс напоминал шаманский ритуал: нужно было выставить правильный уровень громкости, надеяться, что маг не зажует ленту, и ждать несколько минут, пока игра загрузится (если, конечно, в середине не возникала ошибка, заставляющая начинать все сначала).</p><p>Перезапись данных на кассетах была рискованным делом — старую информацию можно было случайно стереть, а новая не всегда записывалась корректно. Тем не менее, это был прорыв: в отличие от дискет, кассеты были дешевы и доступны, что делало их идеальным вариантом для домашнего использования.</p><p>Казалось бы, эпоха магнитной ленты бесповоротно миновала, но это не совсем так. В дата-центрах до сих пор используют ленточные библиотеки (например, LTO), потому что они дешевы, энергоэффективны и отлично подходят для долгосрочного хранения больших объемов данных. Современные картриджи LTO-9 вмещают до 45 ТБ информации — это в тысячи раз больше, чем могла предложить кассета 1980-х.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/37a1c3a2-95fb-4168-a30d-ff61432a9618.png" alt="" /></figure><p>Кассеты утратили актуальность, но их наследие живет, как и ностальгия по аналоговой эре. Они напоминают нам о времени, когда контент нельзя было получить мгновенно, зато сам процесс — запись, перемотка, даже борьба с зажеванной лентой — был частью ритуала.</p><h3>Флоппи-диски (дискеты): 1,4 Мб славы</h3><p>В эпоху, когда облачные хранилища предлагают терабайты пространства за несколько сотен рублей в месяц, трудно представить, что всего 30 лет назад люди хранили данные на квадратных кусочках пластика, которые могли вместить меньше, чем сегодняшнее селфи в хорошем качестве.</p><p>Флоппи-диски, или просто дискеты, стали символом компьютерной революции 1980-1990-х: они были везде, их боялись потерять, ими обменивались, как сейчас ссылками, и их регулярно проклинали, когда на экране возникало сообщение «Диск не отформатирован».</p><p>Первая дискета, представленная IBM в 1971 году, была 8-дюймовой и вмещала смехотворные по современным меркам 80 КБ данных. Она создавалась как альтернатива перфокартам — более надежная и удобная, но по-прежнему громоздкая. К середине 1980-х индустрия перешла на 5,25-дюймовые гибкие диски, а затем и на 3,5-дюймовые, которые стали стандартом. Последние, кстати, были не такими уж «гибкими» — прочный пластиковый корпус защищал магнитный диск внутри, хотя слово «флоппи» (от английского floppy — «гибкий») так и осталось в названии.</p><p>Объем памяти рос медленно: если в 1984 году дискета на 3,5 дюйма хранила 720 КБ, то к 1987-му — уже 1,44 МБ. Этого хватало для текстовых документов, простых программ и даже некоторых игр. Microsoft Word 2.0, выпущенный в 1991 году, умещался на одной дискете, а его современный аналог требует около 4 ГБ — в 3000 раз больше.</p><p>Дискеты были удобны и одновременно ужасно ненадежны. Они боялись магнитов, пыли, влаги, перепадов температуры и даже слишком резкого извлечения из дисковода. Классическая ситуация: вы вставляете дискету в компьютер, слышите характерный скрежет, а через пару секунд получаете роковое сообщение о том, что носитель не читается. Иногда помогало «продувание» — буквально дыхание на магнитную поверхность в надежде, что влага временно восстановит контакт.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/13c5b2b5-7ec4-4706-bb05-aeb757d1d9e1.png" alt="" /></figure><p>Еще одна проблема — ограниченный срок жизни. Даже идеально хранимая дискета могла потерять данные через 5-10 лет из-за размагничивания. Архивы на флоппи требовали регулярного перезаписывания, что превращало хранение информации в постоянную головную боль.</p><p>В 1980-х развернулась настоящая битва форматов. Компания Apple сделала ставку на 3,5-дюймовые дискеты, в то время как IBM и другие производители первое время держались за 5,25 дюймов. Победил, как известно, меньший размер — отчасти благодаря тому, что новые носители были прочнее и компактнее.</p><p>Любопытно, что следы дискетной эпохи до сих пор встречаются в цифровом мире. Буква «A:\» в Windows, которая изначально обозначала дисковод, осталась в системе как дань традиции. Иконка «Сохранить» во многих программах до сих пор изображает флоппи-диск, хотя большинство современных пользователей и в руках-то его никогда не держали.</p><p>К началу 2000-х дискеты начали стремительно исчезать. В 2011 году компания Sony, последний крупный производитель, прекратила их выпуск. Но, как это часто бывает, технология не умерла полностью.</p><p>Оказалось, что множество промышленных станков, медицинского оборудования и даже некоторых банковских систем до сих пор используют флоппи-диски. В 2018 году выяснилось, что американские ядерные силы все еще управляются с помощью 8-дюймовых дискет (хотя позже систему все же модернизировали).</p><p>На вторичном рынке дискеты до сих пор в ходу. Предприниматель Том Перски в 2010 году скупил около миллиона 3,5-дюймовых флоппи и создал целый бизнес по их продаже. Основные клиенты — владельцы старого промышленного оборудования, для которого переход на современные носители оказался слишком дорогим.</p><p>Флоппи-диски — это не просто архаичный способ хранения данных. Они были важным этапом в эволюции персональных компьютеров, сделавшим информацию по-настоящему мобильной. Сегодня, когда мы можем переносить терабайты данных в кармане, стоит вспомнить, с чего все начиналось — с хрупких квадратиков, которые нужно было беречь от магнитов и всегда переворачивать правильной стороной.</p><h3>Сиди и Дивиди: эпоха лазерного ренессанса</h3><p>В конце 1990-х дискеты уже выглядели архаично, а облачных хранилищ еще не существовало. На сцену вышли оптические диски — сначала скромные CD на 700 МБ, после — DVD на 4,7 ГБ, а затем и Blu-ray с их 50 ГБ. В определенный период записать фильм на болванку считалось технологическим подвигом. Нужно было также красиво написать название на внешней стороне специальным маркером.</p><p>Изначально компакт-диски создавались для музыки — первый коммерческий CD выпустили в 1982 году с записью альбома ABBA «The Visitors». Объем в 650 МБ (74 минуты аудио) выбрали не случайно: разработчики из Sony и Philips хотели, чтобы на один диск целиком поместилась Девятая симфония Бетховена. К концу восьмидесятых большинство звукозаписывающих компаний перешли на CD-формат.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/66eb6312-1cc6-43f5-9cc2-3d039bd65987.png" alt="" /></figure><p>Когда технологию адаптировали для компьютеров (CD-ROM), эти же 700 МБ стали стандартом для софта, игр и даже операционных систем, например, Windows 95.</p><p>Запись CD представляла собой сложную процедуру . Программа Nero Burning ROM с ее интерфейсом, напоминающим кабину пилота, требовала идеально настроенного буфера записи. Ошибка «Buffer underrun» означала, что диск испорчен, а 30-50 рублей за болванку (по меркам 2000-х — немалая сумма) летели в мусорку.</p><p>Когда в 1996 году появились DVD, их емкость в 4,7 ГБ казалась фантастической. Почему не 5? Все просто: инженеры Sony и Philips изначально планировали 5 ГБ, но пришлось пожертвовать частью объема ради совместимости с форматом CD. Впрочем, даже 4,7 ГБ хватало для фильмов в приличном качестве — пиратские копии расходились быстрее, чем студии успевали считать убытки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-06/d4563ec9-5237-4a75-8fc1-b23b54e53576.png" alt="" /></figure><p>Киноиндустрия быстро поняла угрозу и начала войну с пиратством. На диски добавляли защиту вроде SecuROM и StarForce, которая не только мешала копированию, но и могла вывести из строя дисковод. Пользователи в ответ придумывали хитрости: от скотча на краю диска до специальных программ, которые «прожигали» защитные сектора.</p><p>В середине 2000-х разгорелась война форматов высокой четкости: Blu-ray от Sony и HD DVD от Toshiba. Технически Blu-ray был лучше — большая емкость (50 ГБ против 30 ГБ у HD DVD), но исход противостояния решил не этот фактор. Sony, которая владела киностудией Columbia Pictures, обеспечила Blu-ray эксклюзивными релизами. А когда за синий формат неожиданно выступила индустрия фильмов для взрослых (на тот момент — один из главных драйверов продаж любых носителей), судьба HD DVD была предрешена.</p><p>К 2010-м оптические диски начали сдавать позиции. Скорость интернета росла, стриминговые сервисы набирали популярность, а производители ноутбуков массово отказывались от дисководов. Последний гвоздь в крышку гроба забила Apple, выпустив в 2012 году MacBook Pro без CD-привода — тогда это казалось смелым шагом, а сегодня воспринимается как норма.</p><p>Но диски не исчезли полностью. Blu-ray до сих пор используют для фильмов в 4К, а некоторые госструктуры предпочитают архивные DVD — они дешевы и, в отличие от флешек, не подвержены спонтанному размагничиванию. Да и любители ретро-техники продолжают охотиться за редкими релизами игр на CD — например, оригинальная Half-Life на диске сегодня стоит дороже, чем в Steam.</p><p>Оптические диски стали переходным звеном между эрой физических носителей и современным цифровым миром. Они научили нас терпению (установка игры была ответственным мероприятием), бережливости (царапина на диске означала существенные финансовые потери) и даже стратегическому мышлению (когда приходилось решать, что удалить с жесткого диска ради места под новый фильм). Сегодня, когда любой контент доступен по клику, эти ритуалы кажутся странными — но именно они сделали нас теми пользователями, которыми мы стали.</p><h2>Почему все это исчезло</h2><p>Кассеты, дискеты и оптические диски не просто ушли в прошлое — они проиграли войну за удобство. В мире, где гигабайты данных передаются за секунды, а облачные хранилища доступны с любого устройства, физические носители оказались слишком медленными, хрупкими и ограниченными. Но их исчезновение — это не просто история технологического прогресса. Это урок о том, как мы перестали ценить сам процесс хранения информации.</p><p>Три причины краха:</p><ul><li>Первая и главная — объем. В 1990-х 1,44 МБ дискеты хватало для текстовых документов, но уже к началу 2000-х этого было недостаточно даже для одной MP3-песни. CD на 700 МБ казались спасением, но и они быстро устарели, когда размеры софта перевалили за гигабайты. Современные игры и видеофайлы просто не поместились бы на десятках дисков, которые пришлось бы таскать с собой.</li><li>Вторая причина — скорость. Загрузка программы с кассеты занимала минуты, запись DVD — десятки минут, а копирование файлов с дискеты напоминало медитацию. Когда на смену пришли USB-накопители с их мгновенным доступом к данным, терпеть эти задержки стало невозможно.</li><li>Наконец, надежность. Магнитные ленты размагничивались, дискеты боялись кофе и магнитов, а царапины на CD превращали их в елочные украшения. Потерять данные было проще, чем сохранить — особенно если учесть, что резервные копии требовали такого же ненадежного носителя.</li></ul><p>Некоторые архаичные носители до сих пор используются там, где важнее стабильность, а не прогресс. В авиации, например, часть бортовых систем Boeing 747 до недавнего времени обновлялась через 3,5-дюймовые дискеты — потому что проверенная временем технология надежнее экспериментальных решений.</p><p>Промышленные станки, медицинское оборудование и даже банковские системы иногда работают на технологиях 1980-х просто потому, что их модернизация стоит дороже, чем покупка партии старых дискет на eBay. А энтузиасты ретро-компьютеров сознательно используют кассеты и флоппи-диски — для них это не просто носители, а часть культурного кода.</p><h2>Что мы потеряли и что приобрели</h2><p>Физические носители учили нас ценить данные. Когда файл нельзя было скопировать в два клика, а каждый мегабайт занимал место, люди тщательнее подходили к хранению информации. Переписка кассет требовала времени, коллекцию CD бережно держали на книжных полках, стирая пыль с футляров, а игры на 10 дискетах устанавливали с замиранием сердца — вдруг последняя окажется битой.</p><p>Сегодня данные стали абстрактными. Мы не держим их в руках, не боимся потерять из-за царапины и даже зачастую не знаем, на каком именно сервере они лежат. Это удобно, но лишает нас того самого «тактильного» отношения к информации.</p><p>История кассет, дискет и дисков показывает: технологии умирают, но информация остается. Мы сменили десятки форматов, но по-прежнему хотим того же — быстрого, надежного и простого доступа к своим файлам. Разница лишь в том, что теперь для этого не нужен магнитофон или дисковод — достаточно облака и быстрого интернета.</p><h2>Флешки, SD-карты и облака: вы находитесь здесь — что дальше</h2><p>Флешки, которые еще недавно казались чудом технологий, уже выглядят архаично на фоне облачных хранилищ. SD-карты, вмещающие терабайты информации, размером не больше ногтя на мизинце. Но что дальше?</p><p>Твердотельные накопители, основанные на кремниевых чипах, приближаются к физическим пределам. Производители научились упаковывать данные невероятно плотно — современные 3D NAND-чипы содержат до 200 слоев памяти. Однако закон Мура (формулирующий неизбежность технологического прогресса) хотя и универсален, имеет определенные физические ограничения: стоимость новых фабрик по производству микросхем измеряется десятками миллиардов долларов.</p><p>Параллельно растет спрос на хранение информации: только за 2023 год человечество создало больше данных, чем за всю предыдущую историю. Архивы научных исследований, нейросетевые модели, медицинские записи — все это требует новых решений.</p><p>Будущее, которое уже тестируют в лабораториях:</p><ul><li>ДНК-хранилища. В 2017 году гарвардские ученые записали на ДНК кишечной палочки GIF-анимацию и изображение. Технология CRISPR позволяет редактировать геном, превращая его в биологический жесткий диск. Пока процесс дорогой и медленный, но потенциал огромен: один грамм ДНК может хранить 215 петабайт данных — эквивалент 14 тысяч современных SSD.</li><li>Молекулярные диски. Исследователи из Университета Брауна (Провиденс, США) создали прототип накопителя, где информация кодируется органическими молекулами. Метод напоминает древние глиняные таблички, только вместо клинописи — бинарный код из присутствия или отсутствия конкретных молекул.</li><li>Кварцевые кристаллы. Технология «5D-памяти» использует фемтосекундные лазеры для записи данных в кварцевое стекло. Такие носители выдерживают температуру до 1000°C и могут хранить информацию миллиарды лет. В 2018 году Илон Маск отправил в космос Tesla с кварцевым диском, содержащим трилогию А. Азимова «Основание».</li><li>Арктические архивы. На Шпицбергене уже работает «Арктический мировой архив», где данные хранятся на специальной пленке в стальных контейнерах. Туда поместили исходники GitHub, цифровое искусство и даже конституции некоторых стран — на случай глобальной катастрофы.</li></ul><p>Парадоксально, но будущее может вернуть нас к чему-то очень древнему: подобно тому, как египтяне высекали иероглифы в камне, мы будем записывать информацию в молекулы и кристаллы — носители, которые переживут не только нас, но и предположительно саму человеческую цивилизацию.</p><p>Ты точно программист, если читаешь это! Больше мемов, инсайтов и боли кодеров <a href="https://t.me/+ajgz7pDecB4xZTI6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Большой гайд по инструментам для разработчиков от Tproger: фреймворки, базы, AI и DevOps в одной подборке</title>
      <link>https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke</link>
      <comments>https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke</guid>
      <description><![CDATA[<p>Подборка топовых инструментов и технологий для разработчиков: от Elixir и DevOps-платформ до no-code, AI-инструментов и новых фреймворков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">Большой гайд по инструментам для разработчиков от Tproger: фреймворки, базы, AI и DevOps в одной подборке</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></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[PostgreSQL]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 04 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы собрали для вас огромную подборку наших статей про самые полезные инструменты, технологии и практики.
Если вы хотите работать быстрее, чище и с кайфом — сохраняйте себе этот гайд, чтобы не искать потом по всему интернету. Внутри — топовые фреймворки, AI-помощники, базы данных, лайфхаки и советы от практиков.</p><h2>Основные инструменты и технологии</h2><p>Статьи, с которых стоит начать, если хочется обновить стек или разобраться в новых подходах:</p><p><a href="https://tproger.ru/articles/top-60-luchwih-instrumentov-dlya-razrabotki-po-v-2025">ТОП 60 лучших инструментов для разработки ПО в 2025</a> — Собрали шестьдесят лучших инструментов для разработки программного обеспечения в 2025 году. От трекеров и редакторов до библиотек и фреймворков.</p><p><a href="https://tproger.ru/articles/top-11-trendov--kotorye-nuzhny-ajtiwniku-v-2025-godu">Топ 11 трендов, которые нужны айтишнику в 2025 году</a> — Представляем одиннадцать ключевых трендов в IT, которые будут актуальны в 2025 году. Краткий гид по технологиям, которые будут на слуху.</p><p><a href="https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki">Фреймворки, меняющие игру: выбираем идеальный инструмент для ваших веб-проектов</a> — Обзор современных веб-фреймворков, которые могут изменить подход к разработке ваших проектов.</p><p><a href="https://tproger.ru/articles/instrumenty-i-frejmvorki-qa--kotorye--ne--nuzhno-znat">Инструменты и фреймворки QA, которые (не) нужно знать</a> — о том, что реально используется в тестировании.</p><p><a href="https://tproger.ru/articles/chto-izuchat-nachinashhemu-razrabotchiku-na-c-">Что изучать начинающему разработчику на C#</a> — рассматриваем  языки, среды и подходы, которые пригодятся новичкам. Рекомендуем, с чего начать изучение C# и какие темы освоить в первую очередь.</p><p><a href="https://tproger.ru/articles/reactjs-na-izi--chto-realno-nuzhno-znat-frontend-razrabotchiku-v-2025-godu">ReactJS на изи: что реально нужно знать фронтенд-разработчику в 2025 году</a> — Краткий гайд по ключевым знаниям и навыкам, необходимым для работы с ReactJS в 2025 году.</p><h2>Базы, API, DevOps и CI/CD</h2><p>Набор инструментов и практик, которые помогут масштабироваться и не выгорать:</p><p><a href="https://tproger.ru/articles/top-10-instrumentov-devops--kotorye-uprostyat-vawu-zhizn-i-izbavyat-ot-nochnyh-relizov">Топ-10 инструментов DevOps, которые упростят вашу жизнь и избавят от ночных релизов</a> — must-have решения для DevOps-команд.</p><p><a href="https://tproger.ru/articles/postgresql-vs--clickhouse-vs--duckdb--kakuyu-opensors-bazu-vybrat-dlya-analitiki-v-2025-godu-">PostgreSQL vs. ClickHouse vs. DuckDB: какую опенсорс базу выбрать для аналитики в 2025 году?</a> — Сравниваем три популярные опенсорс СУБД для аналитики: возможности, производительность и кейсы использования.</p><p><a href="https://tproger.ru/articles/10-api--kotorye-sokratyat-vam-nedeli-razrabotki">Семь API, которые сократят вам недели разработки</a> — Подборка решений, которые можно быстро внедрить.</p><p><a href="https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov">Разворачиваем инструменты CI/CD: практики от DevOps-инженеров</a> — Делимся практическими советами по развертыванию инструментов CI/CD от профессионалов.</p><p><a href="https://tproger.ru/articles/kak-avtomatizirovat-prostye-zadachi-s-pomoshhyu-skriptov-">Как автоматизировать простые задачи с помощью скриптов?</a> — Гайд по быстрой автоматизации без боли.</p><p><a href="https://tproger.ru/articles/luchwie-praktiki-dlya-raboty-s-komandnoj-strokoj">Лучшие практики для работы с командной строкой</a> — Рассказываем, что такое командная строка. Рассматриваем пошаговую инструкцию по использованию.</p><h2>AI-инструменты и нейросети</h2><p>Что может помочь вам уже сейчас — от подсказок до генерации кода:</p><p><a href="https://tproger.ru/articles/top-5-ii-instrumentov-dlya-programmistov-v-2025">Топ-5 ИИ-инструментов для программистов в 2025 году</a> — Самые полезные AI-ассистенты по мнению редакции.</p><p><a href="https://tproger.ru/articles/deepseek-ili-claude--kakaya-nejroset-napiwet-kod--za-kotoryj-ne-stydno-">DeepSeek или Claude: какая нейросеть напишет код, за который не стыдно?</a> — Сравниваем возможности нейросетей DeepSeek и Claude в контексте генерации качественного кода.</p><p><a href="https://tproger.ru/articles/edge-ai--kak-rabotayut-nejroseti-na-ustrojstvah-s-ogranichennymi-resursami">Edge AI: как работают нейросети на устройствах с ограниченными ресурсами</a> — Объясняем, как нейросети работают на устройствах с ограниченными ресурсами и где это применимо.</p><p><a href="https://tproger.ru/articles/10-sposobov-zarabotat-na-iskusstvennom-intellekte-v-2025">10 способов заработать на искусственном интеллекте в 2025</a> — Рассказываем о десяти способах монетизации искусственного интеллекта в 2025 году.</p><h2>Утилиты, лайфхаки и неожиданно полезные штуки</h2><p>То, что экономит время, силы и нервы:</p><p><a href="https://tproger.ru/articles/sobral-11-sajtov--ekonomyashhih-vremya--kotorye-nuzhny-kazhdomu-razrabotchiku">11 сайтов, экономящих время, которые нужны каждому разработчику</a> — Подборка must-have ресурсов.</p><p><a href="https://tproger.ru/articles/luchwie-biblioteki-dlya-animacij-na-react">7 библиотек для анимаций на React</a> — Обзор популярных библиотек для создания анимаций в React: от простых эффектов до сложных переходов.</p><p><a href="https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu">30 самых полезных библиотек Python для веб-разработки в 2024 году</a>  — Подборка тридцати полезных библиотек Python, которые пригодятся веб-разработчикам в 2025 году.</p><p><a href="https://tproger.ru/articles/7-programm-dlya-wifrovaniya-dannyh">7 программ для шифрования данных</a> —  Базовая кибер-гигиена для всех, кто работает с пользовательскими данными.</p><p><a href="https://tproger.ru/articles/top-samyh-poleznyh-magicheskih-komand-dlya-zavsegdataev-colab">Топ самых полезных магических команд для завсегдатаев Colab</a> — Рассказываем, как использовать магические команды в Colab, чтобы ускорить работу с данными и кодом.</p><p><a href="https://tproger.ru/articles/otkryvaem-cikl-statej-etl-dlya-zooparka-botov">5 ETL для обработки данных из Python-ботов</a> — Представляем пять ETL-инструментов, которые помогут автоматизировать сбор, трансформацию и загрузку данных от Python-ботов</p><p><a href="https://tproger.ru/articles/rabota-s-excel-gde-on-primenyaetsya-chem-polezen-i-gde-osvoit-etot-navyk-erid-ljn8klxkn">Работа с Excel: где он применяется, чем полезен и где освоить этот навык</a> — Объясняем, где и как используется Excel, почему он важен для аналитиков и где научиться работать с ним.</p><h2>Немного философии</h2><p>Когда хочется не просто выбрать инструмент, а понять, зачем он вам нужен:</p><p><a href="https://tproger.ru/articles/yazyk-elixir-i-funkcionalnoe-programmirovanie--chto-eto-za-zver-i-pochemu-on-horow-dlya-otkazoustojchivyh-sistem">Язык Elixir и функциональное программирование: что это за зверь и почему он хорош для отказоустойчивых систем</a> — Знакомим пользователей с Elixir и его применением.</p><p><a href="https://tproger.ru/articles/pochemu-mikroservisy-ne-nuzhny--antihajpovyj-razbor">Почему микросервисы не нужны: антихайповый разбор</a> — Анализируем случаи, когда микросервисная архитектура может быть излишней и неэффективной.</p><p><a href="https://tproger.ru/articles/10-luchwih-platform-dlya-sozdaniya-prilozhenij-bez-edinoj-strochki-koda">10 лучших платформ для создания приложений без единой строчки кода</a> — Обзор десяти лучших no-code платформ, позволяющих создавать приложения без программирования.</p><p>Скорее пользуйтесь нашим гайдом и читайте предыдущие. Вот, например, по <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильной разработке</a> и <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Почему микросервисы не нужны: антихайповый разбор</title>
      <link>https://tproger.ru/articles/pochemu-mikroservisy-ne-nuzhny--antihajpovyj-razbor</link>
      <comments>https://tproger.ru/articles/pochemu-mikroservisy-ne-nuzhny--antihajpovyj-razbor?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-mikroservisy-ne-nuzhny--antihajpovyj-razbor</guid>
      <description><![CDATA[<p>Почему микросервисная архитектура нужна не во всех случаях. Причины популярности микросервисов — маркетинг, хайп и законы рынка. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-mikroservisy-ne-nuzhny--antihajpovyj-razbor">Почему микросервисы не нужны: антихайповый разбор</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Spotify]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 19 Apr 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Микросервисы действительно ускоряют разработку и обладают массой других достоинств. Netflix и Amazon построили на них свои гигантские системы — это на самом деле гибко, современно и обеспечивает проекту масштабирование.</p><p>Но правда в том, что это решение подходит далеко не всем компаниям. В 90% ситуаций микросервисная архитектура (она же MSA) — избыточность, а не необходимость. Это не просто сложно, а очень сложно. Микросервисы требуют мощной инфраструктуры, глубоких знаний DevOps, тонкой настройки мониторинга и отказоустойчивости. И самое главное — они редко нужны на старте проекта.</p><p>Если ваш сервис пока обслуживает десятки и сотни, а не миллионы пользователей, если у вас маленькая команда и ограниченный бюджет, если вы просто хотите сделать   работающий продукт, забудьте про микросервисы — они вам не нужны. И мы подробно расскажем, почему. Статья основана на опыте сотен разработчиков, которые в свое время наступали на одни и те же грабли. Материал поможет избежать их ошибок и убережет от лишних трат.</p><h2>Почему все говорят про микросервисы</h2><p>Архитектура микросервисов — прогрессивная модель для создания ПО, при которой приложение состоит из автономных, почти не связанных друг с другом модулей. Это упрощает разработку проектов и управление ими, поэтому подход применяют известные крупные бренды типа PayPal и Netflix.</p><p>Если вы погружены в ИТ-тематику, интересуетесь вакансиями для специалистов, читаете каналы и блоги программистов, у вас может сложиться впечатление, что микросервисы — волшебная кнопка для разработчиков, без которой не обойтись. Но это не так: популярность этой темы — результат нескольких причин. О них — ниже.</p><h3>Маркетинг на волне хайпа</h3><p>Разработчики инструментов в этой сфере хорошо зарабатывают на своих продуктах.</p><p>Микросервисы — не просто архитектура, это целая индустрия. Компании вроде Google и AWS активно продвигают Kubernetes, Istio и прочие сложные инструменты. Им это выгодно: чем больше людей верят, что без этого стека нельзя, тем больше подписок, лицензий и консультаций продаются.</p><p>Реальность более прозаична. Вам говорят, что «Kubernetes нужен всем», но для стартапа из трех-пяти человек это слишком дорогое удовольствие. Половина постов и кейсов про «успешный переход на микросервисы» спонсирована компаниями, которые продают инструменты для этого перехода.</p><h2>Ориентированность на резюме</h2><p>Многие разработчики (особенно начинающие) учат микросервисы не потому, что столкнулись с их необходимостью, а потому, что это круто звучит. В итоге в вакансиях пишут «знание Docker/K8s — огромный плюс», а на собеседованиях спрашивают про «опыт работы с распределенными системами», даже если у компании всего лишь сайт-визитка.</p><p>Это создает порочный круг:</p><ul><li>новички учат Kubernetes, потому что это востребовано;</li><li>компании требуют Kubernetes, потому что так делают конкуренты;</li><li>в итоге люди тратят месяцы на сложные технологии, которые никогда не применят.</li></ul><p>Факт. Несмотря на универсальность микросервисов, далеко не все гиганты перешли на такой формат работы. Например, GitLab и Spotify до сих пор работают на монолитах.</p><h3>Завышенные ожидания по проекту</h3><p>Создатели стандартного проекта искренне считают, что он слишком сложен для монолита. Начинающие разработчики часто переоценивают масштаб своих задач. Они внимательно читают доклады Netflix про архитектуру и решают, что их pet-проект тоже нуждается в распределенной системе.</p><p>Что происходит на практике:</p><ul><li>Вместо одного приложения — 10 сервисов, которые падают вразнобой.</li><li>Вместо локальной отладки — часы борьба с сетью и синхронизацией данных.</li><li>Вместо «гибкости» — множество лишних элементов.</li></ul><p>В итоге пока вы разбираетесь с Istio и мониторингом, ваш конкурент уже запустит тот же функционал на монолите и получит первых клиентов.</p><h2>Нужны ли вашему проекту микросервисы</h2><p>Прежде чем принимать решение о переходе на микросервисную архитектуру, необходимо трезво оценить текущие и прогнозируемые потребности вашего проекта. Микросервисы — это не универсальное решение, а архитектурный подход со строго определенной областью применения. Его внедрение должно быть обосновано конкретными техническими и бизнес-требованиями, а не модными тенденциями в разработке.</p><p>Чтобы понять, стоит ли внедрять в ваш проект микросервисы, ответьте на три важных вопроса.</p><h3>Действительно ли ваш проект настолько масштабен?</h3><p>Микросервисы — это не разделение кода на части, это создание независимых продуктовых единиц, каждая из которых могла бы работать как отдельное приложение.</p><p>Сразу проверьте себя:</p><ul><li>Если ваш сервис — это один API, который обслуживает 5 конечных адресов, микросервисы вам не нужны.</li><li>Если вы не можете четко объяснить, какие части системы могут жить автономно (например, платежи без каталога товаров), значит, у вас монолит. И это нормально.</li></ul><p>Монолит — низкие начальные затраты, но с ростом кода поддержка становится дороже. Микросервисы — огромные стартовые вложения (DevOps, оркестрация, мониторинг), зато потом система масштабируется с меньшими расходами. Второй вариант выгоднее лишь в том случае, если у вас миллионы пользователей и десятки команд. До этой точки монолит — более целесообразное решение.</p><p>Далеко не все приложения достаточно масштабны, чтобы разбить их на более мелкие составные части. Но даже в случае, если на начальной стадии запуска сложно оценить потенциал продукта, лучше начать с монолита. А грамотный код всегда можно перевести на микросервисы, когда это понадобится.</p><h3>Действительно ли вам необходимо масштабировать части приложения автономно?</h3><p>Типичный аргумент за микросервисы: «У нас нагрузка только на платежи, а не на каталог — выгодно масштабировать их по отдельности». На самом деле 99% стартапов никогда не сталкиваются с такой нагрузкой, где это критично. Кроме того, современные облака (AWS, GCP) умеют масштабировать отдельные модули монолита.</p><p>Пример. Команда разбила HR-систему на 10 микросервисов. В итоге форма подачи заявок зависела от сервиса сотрудников, который в свою очередь зависел от сервиса отделов. При пиковой нагрузке (раз в месяц) все равно масштабировали все сервисы сразу.</p><p>Если вы не Amazon — вам, скорее всего, хватит вертикального масштабирования (+1 сервер) или модульного монолита.</p><h3>Есть ли у вас услуги, связанные с транзакциями?</h3><p>В монолите транзакция — это пара строк кода. В микросервисах — сложный квест.</p><p>Вот как это выглядит:</p><ol><li>Платежный сервис списал деньги.</li><li>Инвентарный сервис не ответил (упал или залагал).</li><li>Теперь у пользователя списаны деньги, но заказ не создан.</li></ol><p>Микросервисы создают проблемы согласованности. В монолите вы обновляете данные одной транзакцией, в MSA это стоит в 10 раз дороже.</p><h2>7 причин не лезть в микросервисы</h2><p>Значительная часть начинающих прогеров по умолчанию считает, что микросервисы — это прогрессивно и круто. Но они просто не видят подводных камней. На самом деле MSA — это компромисс со сложностью, деньгами и нервами. И не нужно считать, что монолит — это отсталая технология. Решения, касающиеся архитектуры продукта, нужно принимать, основываясь на объективных данных, а не хайпе.</p><p>Рассмотрим главные причины, по которым вам не стоит связываться с микросервисами.</p><h3>Сложность съедает пользу</h3><p>Итак, ваша небольшая команда из 5-10 человек решила перейти на микросервисы с расчетом на гибкость, масштабируемость и прочие фишки новой архитектуры.</p><p>На практике получается следующее:</p><ul><li>Kubernetes (или иной подобный инструмент) становится источником проблем. Вместо написания кода вы теперь разбираетесь, почему поды (базовые строительные блоки) не стартуют, настраиваете контроллеры, обновляете Helm-чарты. Это занимает 30-50% рабочего времени.</li></ul><ul><li>Раньше логи были в одном файле, теперь размазаны по 15 сервисам, хранятся в разных форматах, требуют сложной агрегации. Чтобы найти одну ошибку, приходится тратить кучу времени.</li><li>Проблемы с сетевым взаимодействием. Каждый вызов между сервисами — это таймауты, повторные запросы, непонятные ошибки.</li></ul><p>Команда тратит полгода на переход. Но сервис получает те же 100 запросов в секунду. Только теперь он становится медленнее, сложнее в поддержке, дороже в эксплуатации.</p><p>Сложность ради сложности — это точно не про эффективность. Прежде чем переходить на микросервисы, подумайте — готовы ли вы тратить половину времени не на продукт, а на борьбу с инфраструктурой?</p><h3>Микросервисы не лечат плохой код</h3><p>У вас есть монолит — большой, тяжелый, с запутанными зависимостями. И вот вы решаете: «Давайте разобьем это на микросервисы!» В теории звучит отлично: каждый сервис — маленький, независимый, аккуратный.</p><p>Но на практике оказывается, что вы просто взяли ваш запутанный код и разделили его на несколько сервисов, не устранив существующие зависимости. Они не исчезают, а лишь меняют форму: вместо вызовов методов внутри одного приложения появляются HTTP-запросы между сервисами. Это не решение проблемы неорганизованного кода, вы создаете новую зависимость — сетевые взаимодействия.</p><p>Микросервисы не улучшают плохой код, они лишь усложняют его структуру. Если архитектура изначально плохо организована, сначала необходимо устранить хаос, и только затем рассматривать вопросы масштабирования. Для этого требуется квалифицированная команда специалистов</p><h3>Нужна подготовленная команда</h3><p>Микросервисами нужно умело управлять. В теории все выглядит красиво — независимые сервисы, гибкое масштабирование, быстрые обновления. Но на практике оказывается, что для такой архитектуры нужны особые люди и процессы, которых у большинства команд просто нет:</p><ul><li>Без полноценного DevOps или SRE-инженера вы быстро утонете в бесконечной настройке и мониторинге. Это не та работа, которую можно взвалить на бэкендера — она требует специфических знаний и постоянного внимания.</li><li>Когда сервисов становится много, появляется новая головная боль — согласование контрактов между командами. Кто за что отвечает? Как тестировать изменения? Что делать, если один сервис ломает другой? Без четких договоренностей и CI/CD-культуры это превращается в хаос.</li><li>В большинстве стартапов два бэкендера, один стажер и горящие сроки. Они едва успевают пилить фичи, не то что разбираться с продвинутыми практиками DevOps.</li></ul><p>В таких условиях попытка внедрить микросервисы чаще всего заканчивается тем, что команда тратит 80% времени на поддержку инфраструктуры вместо разработки продукта.</p><h3>Деньги тратятся быстрее</h3><p>Когда речь заходит о микросервисах, многие почему-то забывают простую истину — за все надо платить:</p><ul><li>Без профессионального DevOps-инженера (а хорошие специалисты стоят дорого) ваш «распределенный рай» быстро превратится в ад. Кто будет настраивать Kubernetes, разбираться с падающими подами и оркестрировать логи?</li><li>Базовый мониторинг вроде Prometheus + Grafana — это только начало. Когда сервисов станет много, вам понадобятся системы трассировки и еще десяток инструментов, каждый из которых требует времени и денег.</li><li>Главная скрытая цена микросервисов — время инженеров. В монолите проверка занимает минуты. В мире микросервисов вам сначала придётся поднять пол-инфраструктуры, чтобы просто удостовериться, что код вообще работает.</li></ul><p>Для проектов с нагрузкой меньше 100k пользователей микросервисы обходятся в 2-3 раза дороже монолита. И это без учета скрытых затрат — нервов, задержек и упущенных возможностей.</p><h3>Отладка микросервисов — это головная боль</h3><p>Отладка в микросервисной архитектуре требует серьезных затрат времени и финансов. В монолите все просто — есть трассировка стеков (список вызовов), есть логи, и обычно проблема лежит где-то между ними.</p><p>Но в мире микросервисов ошибка может прятаться где угодно: в сервисе А, который не так ответил сервису Б, который передал кривые данные сервису В, а тот и вовсе решил ничего не отвечать. И все это с таймаутами, повторными запросами и загадочными HTTP-статусами.</p><p>Можно потратить целый день, чтобы понять, почему падает система. В итоге окажется, что проблема была в том, что два сервиса по-разному интерпретируют дату. В монолите такая ошибка обнаружилась бы за 5 минут. В микросервисах — это полноценное расследование с изучением логов каждого участника цепочки.</p><p>Если вы не готовы к тому, что поиск каждой ошибки будет напоминать путешествие с непредсказуемым пунктом назначения, возможно, микросервисы — не ваш выбор. Ведь время, потраченное на отладку — это время, которого не хватило на создание новых возможностей для вашего продукта.</p><h3>Легкого масштабирования не будет</h3><p>Многие думают, что стоит только разбить приложение на микросервисы, и масштабирование станет решением всех проблем. В реальности все не так просто. Микросервисы — это не автоматическое масштабирование по щелчку пальцев, а сложный механизм, который требует тщательной настройки.</p><p>Для эффективного масштабирования вам понадобятся четкие границы и детально продуманные контракты между сервисами, иначе вы получите клубок зависимостей.</p><p>Без этого масштабирование не сработает. Вместо того чтобы увеличивать только перегруженный сервис, вам придется масштабировать весь кластер целиком. Так что прежде чем разбивать систему, подумайте: действительно ли ваша нагрузка требует таких сложных решений?</p><h2>Когда микросервисы все же нужны</h2><p>Иногда микросервисная архитектура действительно необходима. Но точно не тогда, когда об этом кричат маркетологи или модные блогеры.</p><p>Вот три реальных ситуации, когда MSA имеет смысл.</p><h3>Независимые продукты под одной крышей</h3><p>Типичный пример — Яндекс. Это не просто такси, но и доставка еды, и грузоперевозки. Абсолютно разные бизнес-процессы, которые разрабатываются отдельными командами, используют разные технологии, масштабируются независимо.</p><p>Здесь микросервисы — не прихоть, а необходимость.</p><h3>Огромные масштабы</h3><p>Если у вас одновременно работают 100+ разработчиков, миллионы запросов в секунду, десятки дата-центров по всему миру, монолит просто не выдержит такой нагрузки. Но обратите внимание — мы говорим про реальных гигантов уровня Amazon.</p><h3>Технический стек из разных компонентов</h3><p>Иногда часть системы логичнее писать на Go (где важна скорость), часть на Python (для ML), а часть оставить на JVM (для legacy).</p><p>Микросервисы позволяют:</p><ul><li>использовать оптимальный язык для каждой задачи;</li><li>обновлять компоненты независимо;</li><li>не тащить в проект лишние зависимости</li></ul><p>Все эти случаи объединяет одно: микросервисы решают конкретные проблемы, а не внедряются «на всякий случай». Если ваш проект не подпадает под эти критерии — возможно, стоит еще раз подумать. Использовать микросервисы без необходимости — это неоправданная роскошь.</p><h2>Итоги</h2><p>Микросервисы обрели свой культовый статус вполне заслуженно — в свое время они решили множество проблем, которые ранее считались в индустрии почти неразрешимыми. Истории Uber, SoundCloud и других гигантов индустрии стали для нового поколения программистов источниками вдохновения.</p><p>Однако сегодня ясно, что безосновательное внедрение этой архитектуры ведет к непредсказуемым затратам и последствиям. Стоит учесть все факторы — от  масштаба проекта до его бюджета — прежде чем считать микросервисы самым эффективным решением по умолчанию.</p><p>А если хочешь писать код, который не стыдно показывать, собрали всё для фронтендеров и бэкендеров в <a href="https://t.me/+c6lPaQBXLvE4YmMy">одном месте</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Семь API, которые сократят вам недели разработки</title>
      <link>https://tproger.ru/articles/10-api--kotorye-sokratyat-vam-nedeli-razrabotki</link>
      <comments>https://tproger.ru/articles/10-api--kotorye-sokratyat-vam-nedeli-razrabotki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-api--kotorye-sokratyat-vam-nedeli-razrabotki</guid>
      <description><![CDATA[<p>В этом списке — семь мощных API, которые помогут вам ускорить разработку, автоматизировать рутинные задачи и без лишних усилий добавить крутые функции. От баз данных книг до парсинга сайтов и анализа пользовательских данных</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-api--kotorye-sokratyat-vam-nedeli-razrabotki">Семь API, которые сократят вам недели разработки</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фронтенд]]></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>Fri, 04 Apr 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте, что вам нужно встроить в своё приложение поиск книг, анализ геоданных или генерацию случайных пользователей. Вы могли бы писать код с нуля, разбираться с источниками, тестировать и отлаживать… или просто воспользоваться готовыми API, которые сделают всю работу за вас. Сегодня о них и поговорим.</p><h2>Shodan API: Поиск уязвимостей в интернете за минуты</h2><p><a href="https://developer.shodan.io/">Shodan</a> — поисковая система для интернет-устройств. В отличие от Google, который индексирует веб-страницы, Shodan сканирует открытые порты, сервисы и устройства, подключённые к интернету. Это делает его мощным инструментом для исследователей безопасности, разработчиков и системных администраторов.</p><p>Shodan API позволяет автоматизировать поиск уязвимых серверов, камер наблюдения, баз данных и других интернет-ресурсов. Может анализировать их конфигурации и даже отслеживать инциденты безопасности в реальном времени.</p><h2>Как Shodan API экономит время разработчикам?</h2><p>Ручной аудит серверов и интернет-устройств может занять недели, а то и месяцы, но Shodan API позволяет:</p><ul><li>Быстро находить уязвимые устройства и сервисы</li><li>Проверять, какие технологии и версии ПО используются на серверах</li><li>Получать статистику по открытым портам, SSL-сертификатам и угрозам</li><li>Отслеживать новые уязвимости в реальном времени</li></ul><p>Для DevOps, SOC-аналитиков и специалистов по информационной безопасности это возможность автоматизировать рутинные проверки и защитить инфраструктуру от потенциальных атак.</p><h2>Как использовать Shodan API?</h2><p>Shodan API предоставляет удобные методы для работы с данными через REST-запросы. Рассмотрим основные возможности.</p><h4>Поиск открытых сервисов и устройств</h4><p>Shodan позволяет находить устройства, доступные по определённым портам, IP-адресам или географическим координатам. Например, запрос всех открытых баз данных MongoDB:</p><p>Ответ покажет список IP-адресов, страну расположения серверов и используемые версии ПО.</p><h4>Получение информации об IP-адресе</h4><p>Допустим, вы хотите узнать, какие сервисы запущены на конкретном IP. Используем команду:</p><p>Ответ будет содержать список открытых портов, заголовки HTTP-ответов и используемые технологии.</p><h4>Поиск устройств по версии ПО</h4><p>Чтобы найти все серверы с устаревшей версией OpenSSH, можно выполнить запрос:</p><p>Это полезно для поиска серверов, подверженных атакам из-за старых версий ПО.</p><p>Важно понимать, что Shodan не предназначен для хакерских атак. Использование API для несанкционированного сканирования чужих серверов может быть незаконным. Поэтому рекомендуется работать только с теми системами, на которые у вас есть разрешение.</p><h2>Abstract API: Быстрая проверка IP, валидация email и работа с геоданными</h2><p><a href="https://www.abstractapi.com/">Abstract API</a> — сервис, предлагающий набор API для работы с IP-адресами, валидацией email, проверкой телефона, распознаванием валют и многим другим. Это универсальный инструмент для веб-разработчиков, аналитиков и специалистов по безопасности.</p><h3>Как Abstract API экономит время разработчикам?</h3><p>Вместо того чтобы искать разные API для работы с геоданными, email-валидацией и IP-адресами, можно использовать Abstract API. Это экономит часы на интеграцию и позволяет быстро решать задачи, такие как:</p><ul><li>Определение страны и города пользователя по IP</li></ul><ul><li>Проверка подлинности email перед регистрацией</li></ul><ul><li>Конвертация валют в реальном времени</li></ul><ul><li>Валидация телефонных номеров</li></ul><p>Abstract API помогает автоматически фильтровать спам-регистрации, защищать системы от ботов и улучшать пользовательский опыт.</p><h3>Как использовать Abstract API?</h3><p>API работает через REST-запросы и доступно для бесплатного использования с ограничениями.</p><h4>Определение геолокации по IP</h4><p>Можно быстро определить страну, город и провайдера пользователя:</p><h4>Валидация email-адреса</h4><p>Проверяем, является ли email настоящим, одноразовым или корпоративным:</p><p>Что нужно помнить? Бесплатная версия ограничена числом запросов в месяц. А данные по IP-геолокации иногда могут быть неточными (зависит от провайдера).</p><h2>Zyte API: Интеллектуальный ротационный прокси для веб-скрейпинга без блокировок</h2><p><a href="https://www.zyte.com/smart-proxy-manager/">Zyte API</a> — мощный API для веб-скрейпинга, который не только обходит блокировки и капчи, но и автоматически структурирует полученные данные. Он объединяет в себе прокси-серверы, обработку JavaScript-страниц и инструменты парсинга, что делает его одним из самых удобных решений для сбора данных с веб-ресурсов.</p><h2>Как Zyte API экономит время?</h2><p>Вместо того чтобы вручную разрабатывать сложные парсеры и бороться с защитами сайтов, Zyte API позволяет получить уже готовые структурированные данные:</p><ul><li>Автоматическая обработка JavaScript-страниц (открывает динамически загружаемые сайты, как Selenium).</li></ul><ul><li>Обход капч и блокировок (использует интеллектуальные прокси).</li></ul><ul><li>Автоматическое структурирование данных (не просто HTML, а уже готовая JSON-структура).</li></ul><ul><li>Интеграция с Python и REST API (работает с любыми языками программирования).</li></ul><p>API идеально подходит для разработчиков, аналитиков, маркетологов и исследователей данных.</p><h2>Как использовать Zyte API?</h2><p>Он работает как обычный прокси: достаточно настроить его в коде, и все запросы к сайтам будут проходить через интеллектуальную систему ротации IP.</p><h4>Использование Zyte в curl</h4><p>Допустим, нужно скачать HTML-страницу сайта example.com:</p><p>Что нам ответят:</p><h4>Интеграция с Python</h4><p>Для начала нужно установить клиент:</p><p>Код для парсинга и получения данных:</p><h4>Автоматический парсинг данных</h4><p>Zyte API умеет не только загружать HTML, но и автоматически извлекать полезные данные. Например, спарсить цену, название и описание кроссовок в интернет-магазине (ну или любого другого товара).</p><p>Из минусов — нет бесплатного доступа (лишь пробный период). Также некоторые страницы требуют больше времени для обхода ограничений (может понадобиться доп.настройка).</p><h2>Common Crawl API: Бесплатная база данных для веб-скрейпинга и анализа интернета</h2><p><a href="https://commoncrawl.org/">Common Crawl</a> — не просто API, а целый архив интернета, содержащий огромные объемы веб-данных, собранных с 2008 года. В отличие от стандартных API для веб-скрейпинга, Common Crawl предоставляет доступ к готовым копиям страниц, что значительно ускоряет анализ веб-контента и снижает нагрузку на исходные сайты.</p><h3>Как Common Crawl API экономит время?</h3><p>Вместо того чтобы разрабатывать сложные парсеры и загружать миллионы страниц вручную, Common Crawl позволяет быстро находить нужную информацию в готовых архивах:</p><ul><li>Бесплатный доступ к огромной базе веб-страниц (петабайты данных, обновляемых ежемесячно).</li></ul><ul><li>Исторические данные (можно анализировать, как изменялся контент сайтов за годы).</li></ul><ul><li>Отсутствие блокировок и капч (данные уже собраны, вам не нужно бороться с защитами сайтов).</li></ul><ul><li>Возможность массового анализа веба (идеально для NLP, машинного обучения и SEO-исследований).</li></ul><p>API и данные Common Crawl полезны для исследователей, дата-аналитиков, SEO-специалистов и разработчиков.</p><h3>Как использовать Common Crawl API?</h3><p>Common Crawl предоставляет данные в формате WARC (архивные копии страниц) и WET (чистый текст без HTML). Доступ осуществляется через Amazon S3, но также можно использовать API Common Crawl Index для поиска нужных URL.</p><h4>Поиск веб-страниц через API</h4><p>Допустим, нам нужны все страницы, содержащие example.com:</p><p>Вот такой ответ может быть:</p><h4>Получение текста страницы из архива</h4><p>После получения ссылки на WARC-файл можно скачать его и распаковать:</p><p>Ну и затем извлечь текст:</p><h4>Анализ больших объемов данных с AWS</h4><p>Если вам нужны миллионы страниц, можно использовать AWS Athena для обработки данных прямо в облаке.</p><p>Пример SQL-запроса в AWS Athena для поиска страниц с «machine learning»:</p><p>Важно отметить, что данные предоставляются в сыром виде и их нужно дополнительно обрабатывать. Плюс нет гарантии, что конкретная страница будет в архиве.</p><h2>GitHub API: автоматизация работы с репозиториями, пользователями и кодом</h2><p><a href="https://docs.github.com/en/rest">GitHub API</a> — интерфейс для взаимодействия с кодом, репозиториями, пользователями и организациями на платформе GitHub. Он позволяет автоматизировать задачи, получать аналитику, управлять репозиториями, отслеживать запросы на вытягивание, коммиты и многое другое.</p><h3>Как GitHub API экономит время?</h3><p>Вместо ручного управления репозиториями и кодом через интерфейс GitHub можно автоматизировать эти процессы с помощью API:</p><ul><li>Автоматизация деплоя и CI/CD (создание и управление GitHub Actions).</li></ul><ul><li>Мониторинг активности в репозиториях (новые коммиты, запросы на вытягивание, проблемы).</li></ul><ul><li>Управление пользователями и организациями (добавление разработчиков, управление доступом).</li></ul><ul><li>Анализ кода и метрик (подсчёт строк кода, статистика участников).</li></ul><ul><li>Поиск по репозиториям и файлам (быстрое извлечение нужной информации).</li></ul><p>GitHub API полезен для DevOps-инженеров, разработчиков, владельцев проектов и аналитиков.</p><h3>Как использовать GitHub API?</h3><p>GitHub API работает через REST-запросы и возвращает данные в формате JSON. Для авторизации можно использовать токен личного доступа (PAT) или OAuth.</p><h4>Получение информации о пользователе GitHub</h4><p>Допустим, мы хотим узнать данные о пользователе natasharostova:</p><p>Как нам могут ответить:</p><h4>Создание нового репозитория через API</h4><p>После выполнения запроса появится новый репозиторий new-repo.</p><h4>Поиск репозиториев по ключевому слову</h4><p>Допустим, мы хотим найти репозитории, содержащие код на Python, связанный с машинным обучением:</p><p>Нужно понимать, что есть ограничение в 5000 API-запросов в час для авторизованных пользователей. Для некоторых функций требуется версия GitHub Enterprise.</p><h2>MuleSoft API: Универсальный коннектор для интеграции сервисов</h2><p><a href="https://openlibrary.org/developers/api"></a><a href="https://www.mulesoft.com/">MuleSoft API</a> — платформа для интеграции различных систем, сервисов и приложений. Она позволяет соединять облачные и локальные системы, автоматизировать обмен данными и управлять API. MuleSoft широко используется в корпоративных средах для построения сложных интеграционных решений.</p><h3>Как MuleSoft API экономит время?</h3><p>Вместо того чтобы разрабатывать интеграции с нуля, MuleSoft API предлагает готовые коннекторы, которые позволяют:</p><ul><li>Интегрировать разные системы (CRM, ERP, базы данных, облачные сервисы) без сложного кодинга.</li></ul><ul><li>Автоматизировать обмен данными между приложениями (например, между Salesforce и SAP).</li></ul><ul><li>Обеспечивать безопасность API с помощью встроенных инструментов управления доступом.</li></ul><ul><li>Создавать микросервисную архитектуру, где API работают как модули.</li></ul><p>API полезен для DevOps-инженеров, архитекторов ПО, разработчиков корпоративных решений и интеграторов.</p><h3>Как использовать MuleSoft API?</h3><p>MuleSoft поддерживает REST и SOAP API, а также интеграцию через готовые коннекторы.</p><h4>Создание API с помощью Anypoint Platform</h4><p>Anypoint Platform — облачная среда MuleSoft, в которой можно управлять API.</p><p>Пример запроса к API через MuleSoft:</p><h4>Подключение к базе данных через DataWeave</h4><p>DataWeave — это язык MuleSoft для трансформации данных. Он позволяет легко преобразовываться в нужные форматы.</p><p><i>Это правило конвертирует XML-ответ базы данных в JSON.</i></p><p>Важно помнить, что бесплатные возможности платформы ограничены. Также сервис требует обучения: для работы с DataWeave и Anypoint Platform нужно разбираться в интеграции API.</p><h2>JSONPlaceholder API: бесплатный фиктивный REST API для тестирования и создания прототипов</h2><p><a href="https://jsonplaceholder.typicode.com/">JSONPlaceholder API</a> — бесплатный REST API, предназначенный для тестирования, создания прототипов и обучения разработчиков. Он предоставляет фиктивные данные (пользователей, публикаций, комментариев и т. д.), которые можно использовать при разработке клиентских и серверных приложений без необходимости развёртывать собственный бэкенд.</p><h3>Как JSONPlaceholder API экономит время?</h3><p>Разработчикам часто нужно тестировать фронтенд или отлаживать API-запросы, но не всегда есть готовый бэкенд. JSONPlaceholder API решает эту проблему:</p><ul><li>Позволяет мгновенно получать тестовые данные без развертывания сервера.</li></ul><ul><li>Не требует регистрации или API-ключа.</li></ul><ul><li>Поддерживает стандартные HTTP-методы (GET, POST, PUT, DELETE).</li></ul><ul><li>Полностью совместим с популярными библиотеками и фреймворками (Axios, Fetch API, jQuery и др.).</li></ul><p>API полезен для фронтенд-разработчиков, тестировщиков, студентов и преподавателей программирования.</p><h3>Как использовать JSONPlaceholder API?</h3><p>JSONPlaceholder предоставляет несколько ресурсов, которые можно запрашивать с помощью HTTP-запросов.</p><h4>Получение списка пользователей</h4><p>Простейший GET-запрос возвращает список тестовых пользователей:</p><h4>Получение списка постов</h4><p>Можно запросить список фиктивных публикаций:</p><h4>Добавление нового поста</h4><p>Можно отправить POST-запрос, чтобы имитировать создание записи:</p><h4>Обновление записи</h4><p>Для изменения существующей записи можно использовать PUT-запрос:</p><p>Что нужно помнить? Данные статичны — они не сохраняются между запросами. Запросы POST, PUT и DELETE не изменяют реальные данные. А само API предназначено только для тестирования, а не для использования в рабочей среде.</p>]]></content:encoded>
    </item>
    <item>
      <title>Модульность кода: как не утонуть в миллионной строке и писать масштабируемые проекты</title>
      <link>https://tproger.ru/articles/modulnost-koda--kak-ne-utonut-v-millionnoj-stroke-i-pisat-maswtabiruemye-proekty</link>
      <comments>https://tproger.ru/articles/modulnost-koda--kak-ne-utonut-v-millionnoj-stroke-i-pisat-maswtabiruemye-proekty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/modulnost-koda--kak-ne-utonut-v-millionnoj-stroke-i-pisat-maswtabiruemye-proekty</guid>
      <description><![CDATA[<p>Узнайте, что такое модульность кода, почему она критически важна для масштабируемости проектов. Разбираем ключевые принципы, ошибки и лучшие практики модульного программирования. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/modulnost-koda--kak-ne-utonut-v-millionnoj-stroke-i-pisat-maswtabiruemye-proekty">Модульность кода: как не утонуть в миллионной строке и писать масштабируемые проекты</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Mar 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современная разработка ПО уже давно вышла за рамки небольших скриптов и монолитных приложений. Сегодня кодовая база большинства проектов измеряется сотнями тысяч или даже миллионами строк, а без продуманной структуры работа превращается в хаос. Поэтому программисты и архитекторы ПО уделяют внимание модульности — принципу, который помогает сохранить порядок, упростить поддержку и снизить количество багов. Сегодня разберем, что это за термин, и как его применять в своих проектах.</p><h2>Почему модульность кода — не тренд, а необходимость</h2><p>Модульность — фундаментальный принцип, который упрощает сопровождение кода и делает его адаптивным к изменениям. Давайте разберёмся, почему без модульности крупные проекты просто не выживают.</p><h3>Без модульности всё разваливается</h3><p>Начинающий разработчик может не задумываться о модульности — когда у тебя небольшой скрипт на Python или несколько файлов с кодом веб-приложения, кажется, что всё под контролем. Но по мере роста проекта возникают новые проблемы:</p><ul><li>Код становится слишком большим, чтобы его можно было легко понять. Если в начале у вас был один файл на 500 строк, то через год в проекте уже тысячи файлов, десятки зависимостей, а изменение одной строчки может вызвать неожиданный каскад ошибок.</li><li>Любые изменения могут нарушить работу всего, что угодно. Монолитный код, в котором всё взаимосвязано, делает проект хрупким: добавляя новый функционал, разработчик может случайно затронуть совершенно неожиданные части.</li><li>Тестирование становится сложнее. Если компоненты системы зависят друг от друга, их невозможно тестировать по отдельности, а значит, каждая ошибка требует длительного анализа.</li><li>Новые разработчики тратят недели на разбор чужого кода. Чем больше в коде скрытых взаимосвязей, тем дольше человеку приходится разбираться, как что работает.</li></ul><h3>Модульность решает множество проблем</h3><p>Когда проект только начинается, кажется, что модульность — излишнее усложнение. Но чем больше развивается кодовая база, тем очевиднее становится, что без чёткой структуры работать невозможно. Модульность решает сразу несколько критических проблем разработки, каких?</p><h4>Упрощает сопровождение кода</h4><p>В коде без модульности даже небольшое изменение может превратиться в кошмар. Представьте, что вам нужно исправить баг, но код настолько запутан, что затрагивает десятки файлов и зависимостей. Из-за этого разработчик тратит часы (а то и дни), чтобы понять, где именно вносить правки.</p><p>При модульном подходе каждая часть системы отвечает за свою функциональность и слабо связана с остальными. Это означает, что:</p><ul><li>Разработчики смогут изменять один модуль, не боясь сломать остальную систему;</li><li>Новый человек в команде быстрее разберётся в коде, так как модули работают автономно;</li><li>Логика кода станет прозрачнее: у каждого модуля чётко определённые границы ответственности.</li></ul><h4>Снижает количество багов, связанных с зависимостями</h4><p>Когда кодовая база сильно связана, малейшее изменение в одном месте может вызвать каскад ошибок в других частях системы. Например, если функция обработки данных напрямую взаимодействует с интерфейсом, изменения в логике могут неожиданно нарушить отображение информации на фронтенде.</p><p>Модульность решает эту проблему за счёт принципа низкой связанности и высокой когезии (о них поговорим позже).</p><p>Допустим, в проекте есть модуль, отвечающий за отправку электронных писем. Если он спроектирован правильно, то любые изменения в бизнес-логике приложения (например, добавление нового типа транзакций) не затронут этот модуль.</p><h4>Делает тестирование проще и быстрее</h4><p>Когда код представляет собой единый монолит, его сложно тестировать: чтобы проверить одну функцию, приходится запускать весь проект.</p><p>При модульной архитектуре каждый компонент можно тестировать отдельно:</p><ul><li>Юнит-тесты проверяют конкретные модули без запуска всей системы;</li><li>Интеграционные тесты оценивают взаимодействие между модулями;</li><li>Тестирование становится параллельным — можно одновременно проверять разные модули.</li></ul><h2>Основные принципы модульного кода</h2><h3>Принцип единой ответственности (SRP): каждый модуль выполняет ровно одну задачу</h3><p>Одна из самых распространённых проблем в коде — комбайны, или перегруженные модули, которые выполняют сразу несколько несвязанных задач. Такой код сложно понимать, тестировать и изменять.</p><p>Принцип единой ответственности говорит о том, что каждый модуль (класс, функция, компонент) должен решать только одну задачу. Это делает код чище, понятнее и проще в сопровождении.</p><p>Если один модуль отвечает сразу за несколько задач, это приводит к нескольким проблемам:</p><ol><li>Любые правки могут затронуть совершенно несвязанные части кода;</li><li>Покрыть тестами такой модуль становится сложно, потому что у него слишком много точек отказа;</li><li>Если модуль выполняет несколько задач, его трудно переиспользовать в других частях системы.</li></ol><p><b>Если нарушить SRP:</b></p><p>Допустим, у нас есть класс OrderProcessor, который должен обработать заказ. Но вместо этого он делает слишком многое:</p><ul><li>Валидирует данные заказа;</li><li>Вычисляет стоимость;</li><li>Обрабатывает оплату;</li><li>Отправляет email-подтверждение.</li></ul><p>Что произойдёт, если нам нужно изменить процесс оплаты? Мы рискуем сломать логику валидации или отправки email, потому что всё завязано в одном месте.</p><p>Решение простое: разделить обязанности. Мы выносим каждую отдельную задачу в свой модуль или класс:</p><p>Теперь каждый класс отвечает только за свою задачу. Изменения в логике оплаты не затронут валидацию или отправку email, а тестировать каждый модуль можно отдельно.</p><p>SRP особенно полезен в ситуациях, где код часто меняется и развивается:</p><ul><li>В API и микросервисах — каждый сервис выполняет одну задачу, что упрощает поддержку;</li><li>В UI-компонентах — разделение логики интерфейса (рендеринг, обработка данных) помогает избежать громоздких компонентов;</li><li>В бизнес-логике — SRP делает код более гибким и адаптируемым под новые требования.</li></ul><h3>Слабая связность и высокая когезия: модули взаимодействуют минимально, но логика внутри них цельная</h3><p>Один из главных принципов хорошей модульной архитектуры — минимальная связность между модулями и максимальная цельность внутри каждого.</p><p><b>Связность (coupling)</b> — степень зависимости одного модуля от другого. Что происходит при высокой связности?</p><ol><li>Любые изменения ведут к каскадным поломкам — обновление одной части кода требует изменений во множестве других мест.</li><li>Тестирование становится сложным — чтобы протестировать один модуль, нужно учитывать все его зависимости.</li><li>Повторное использование затруднено — если модуль слишком тесно связан с кодом, его трудно применять в других проектах.</li></ol><p>Пример плохой высокой связности:</p><p>Здесь OrderProcessor напрямую создаёт экземпляр PaymentProcessor, что делает их жёстко связанными. Если нам понадобится заменить Пеймент на другую реализацию (например, добавить поддержку PayPal), возникнут трудности.</p><p>Но как уменьшить связность? Нужно использовать инъекцию зависимостей (Dependency Injection) и разделять интерфейсы и реализации:</p><p>Теперь OrderProcessor не зависит от конкретной реализации PaymentProcessor. Можно легко подставить другую реализацию, например, PayPalPaymentProcessor или StripePaymentProcessor, без изменений в основном коде.</p><p>Перейдем к<b> когезии (cohesion)</b>. Это степень связанности логики внутри одного модуля. Если модуль выполняет слишком много разрозненных задач, его сложно понимать и поддерживать. Что происходит при низкой когезии?</p><ol><li>Код выглядит хаотично — внутри одного модуля встречается разнородная логика, которая не должна быть связана.</li><li>Повышенный риск багов — разные части модуля зависят от несвязанных данных, что усложняет отладку.</li><li>Сложность изменений — разработчику приходится разбираться в неочевидных взаимосвязях.</li></ol><p>Например:</p><p>Этот класс отвечает за регистрацию, восстановление пароля и маркетинговые email-рассылки, хотя последние никак не связаны с первой парой функций. Как повысить когезию?</p><ul><li>Разделить модули по логическим зонам ответственности;</li><li>Выносить несвязанные задачи в отдельные сервисы.</li></ul><p>Пример высокой когезии:</p><p>Теперь UserManager отвечает только за управление пользователями, а EmailService занимается отправкой писем. Логика каждого модуля цельная и легко расширяется.</p><h4>Как достичь слабой связности и высокой когезии?</h4><ul><li>Используйте интерфейсы и абстракции вместо жёстких зависимостей;</li><li>Делите модули по логическим границам, а не по техническому признаку;</li><li>Изолируйте изменяемые части системы и старайтесь, чтобы модули менялись независимо;</li><li>Разрабатывайте чистые интерфейсы, которые скрывают детали реализации и позволяют легко заменять компоненты.</li></ul><h2>Чистые интерфейсы и контрактное программирование: API модулей должны быть понятными и стабильными</h2><p>Когда модули взаимодействуют между собой, их API должны быть чистыми, стабильными и интуитивно понятными. Если интерфейсы плохо спроектированы, это ведёт к хрупкому коду, сложному рефакторингу и куче неожиданных багов.</p><p><b>Чистый интерфейс </b>— это API модуля, которое:</p><ul><li>Не требует заглядывать в реализацию, чтобы понять, как использовать;</li></ul><ul><li>Не перегружено лишними методами;</li></ul><ul><li>Стабильное — изменения API минимально затрагивают пользователей.</li></ul><p>Плохой пример:</p><p>Этот метод делает слишком много:</p><ul><li>Сохраняет пользователя,</li><li>Отправляет email,</li><li>Логирует активность,</li><li>Обрабатывает override от администратора.</li></ul><p>Такой API трудно использовать: программисту придётся разбираться, какие параметры нужны, а какие — нет.</p><p>Пример чистого API:</p><p>Теперь каждая функция выполняет только одну задачу, а API остаётся предсказуемым и удобным.</p><p><b>Контрактное программирование</b> же означает, что каждый модуль:</p><ul><li>Ясно определяет, какие входные данные он принимает;</li><li>Гарантирует ожидаемый результат;</li><li>Защищается от некорректных данных.</li></ul><p>Пример контракта в коде:</p><p>Здесь чётко определено:</p><ul><li>Если сумма заказа ≤ 0, метод выбросит ошибку.</li></ul><ul><li>Если плата прошла успешно, метод вернёт PaymentResult.Success = true.</li></ul><h4>Как проектировать чистые интерфейсы?</h4><ul><li>API должен быть понятен без чтения документации;</li></ul><ul><li>Чем меньше точек входа, тем проще сопровождать код;</li></ul><ul><li>Если метод принимает bool-флаги, вероятно, его стоит разбить на несколько методов;</li></ul><ul><li>Лучше сделать API чуть менее удобным, но не ломающим обратную совместимость.</li></ul><h3>Простота в тестировании: возможность заменить модули заглушками и писать юнит-тесты</h3><p>Одна из главных причин, почему модульность критически важна — простота тестирования. Хорошо спроектированные модули позволяют легко изолировать отдельные компоненты и тестировать их независимо друг от друга.</p><p>Когда код монолитный и сильно связан, тестирование становится головной болью:</p><ul><li>Один тест может затрагивать десятки зависимостей;</li></ul><ul><li>Невозможно протестировать отдельную функцию без запуска всего приложения;</li></ul><ul><li>Каждый новый баг ломает кучу тестов, потому что код слишком взаимозависимый.</li></ul><p>Но как модульность помогает тестировать код?</p><h4>Можно заменять реальные модули заглушками (моками, стабами, фейками)</h4><p>Если модули слабо связаны, их можно легко подменять тестовыми заглушками. Это позволяет тестировать поведение кода без зависимостей от внешних сервисов или базы данных.</p><p>Пример без модульности:</p><p>Здесь OrderService жёстко завязан на PaymentProcessor, и в тесте мы не сможем подменить его заглушкой.</p><p>Пример с модульностью:</p><p>Теперь мы можем подменять IPaymentProcessor тестовой заглушкой:</p><p>В тесте вместо реального PaymentProcessor подставляем FakePaymentProcessor</p><h4>Легко писать юнит-тесты для отдельных частей кода</h4><p>Когда модули независимы, можно тестировать их по отдельности, не задействуя всю систему.</p><p>Пример юнит-теста с моками:</p><p>Здесь мы проверяем, был ли вызван метод ProcessPayment(), но не запускаем реальную оплату.</p><h4>Можно легко писать интеграционные тесты, используя только нужные связки</h4><p>Модульность позволяет запускать только нужные части системы. Например, можно тестировать API без базы данных, заменяя её на memory-версию.</p><p>Пример тестирования API без реальной базы:</p><p>Здесь TestDbContext — in-memory база, которая не трогает продовые данные.</p><p>Чем лучше организованы модули, тем быстрее можно покрыть код тестами, находить баги и поддерживать систему в рабочем состоянии.</p><h2>Как правильно разбивать код на модули?</h2><p>Окей, мы разобрались, что модульность полезна. Но как её грамотно внедрить? Если просто начать «резать» код на части без продуманной структуры, можно создать хаос вместо удобной системы. В этом разделе разберёмся, как правильно организовать модули, чтобы они реально упростили поддержку проекта.</p><h3>Думайте о модулях с самого начала</h3><p>Ошибку многих разработчиков можно описать так: сначала пишем код как получится, а потом пытаемся нарезать его на модули. Это плохая стратегия — в реальности проще сразу спроектировать систему модульной. Что важно продумать на старте?</p><ul><li>Какие ключевые бизнес-объекты в проекте (например, «Пользователи», «Заказы», «Оплата»);</li><li>Какие у них чёткие границы (UserModule не должен отвечать за Payments);</li><li>Какие взаимодействия между ними (какие API вызывают друг друга).</li></ul><p><b>Пример проектирования модульной системы (возьмем e-commerce):</b></p><p>В интернет-магазине можно выделить такие модули:</p><ul><li>UserModule — управление пользователями;</li><li>CatalogModule — товары и категории;</li><li>CartModule — корзина покупок;</li><li>OrderModule — оформление заказов;</li><li>PaymentModule — платежи.</li></ul><p>Каждый модуль должен иметь своё API и не лезть в чужие данные напрямую.</p><p>Как делать НЕ надо:</p><p>Здесь OrderService вмешивается в чужие модули (работает с UserRepository и PaymentService). Это создаёт жёсткую связанность.</p><p>Как надо:</p><p>Теперь OrderService не лезет внутрь других модулей, а взаимодействует с ними через интерфейсы. Это делает код более гибким и удобным для тестирования.</p><h3>Выделяйте независимые модули по принципу «Один модуль = одна ответственность»</h3><p>Следующий шаг — определить логические единицы, которые можно вынести в модули. Плохая практика — модули по слоям (например, один модуль для всех контроллеров, другой для всех сервисов). Это создаёт горизонтальные зависимости, из-за которых код сложно изменять.</p><p>Хорошая практика — модули по бизнес-областям (например, UserModule, OrderModule, PaymentModule)</p><p>Пример:</p><p>Каждый модуль самодостаточен:</p><ul><li>В user хранятся все файлы, связанные с пользователями;</li><li>В order — всё, что касается заказов;</li><li>В payment — логика работы с платежами.</li></ul><h3>Минимизируйте связи между модулями: слабая связанность и чёткие контракты</h3><p>Главная цель модульности — сделать систему гибкой и расширяемой. Поэтому между модулями должны быть чёткие контракты, а не хаотичные вызовы методов. Как правильно?</p><ul><li>Каждый модуль предоставляет API для взаимодействия;</li><li>Взаимодействие между модулями происходит через интерфейсы или события;</li><li>Модули не лезут друг другу в базы данных.</li></ul><p>Пример с хорошими контрактами:</p><p>Теперь модули работают только через API, а их внутреннюю реализацию можно менять без влияния на другие части системы.</p><h3>Не усложняйте: модульность ≠ миллион мелких файлов</h3><p>Ошибка многих разработчиков: разбить код на слишком много маленьких модулей. В результате каждая задача требует работы с десятками зависимостей, что делает поддержку сложнее.</p><p>Как НЕ надо:</p><p>Зачем так делать? Теперь, чтобы просто добавить новый API-метод, нужно создавать новый файл.</p><p>Как лучше:</p><p>Модуль должен быть логически целостным, а не разрезанным на микросервисы внутри проекта.</p><p>Разбить код на модули — это не просто про удобство. Это про гибкость, тестируемость и возможность развития проекта. Удачи с модульностью!</p>]]></content:encoded>
    </item>
    <item>
      <title>Event loop для чайников: простыми словами о сложном механизме браузера</title>
      <link>https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera</link>
      <comments>https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Дудченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera</guid>
      <description><![CDATA[<p>Event Loop — это сердце асинхронности в JavaScript. В этой статье простыми словами разберем, как работает цикл событий в браузере, что такое макрозадачи и микрозадачи, и как они влияют на выполнение кода. С примерами, схемами и лайфхаками для лучшего понимания.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera">Event loop для чайников: простыми словами о сложном механизме браузера</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 04 Feb 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Салют, народ! 👋</p><p>Это моя первая проба пера, так что не судите строго. Сегодня мы разберем одну из самых интересных и, на первый взгляд, сложных тем в JavaScript — Event Loop (или цикл событий). Если вы когда-нибудь задумывались, как браузер умудряется выполнять множество задач одновременно, не зависая при этом, то вы попали по адресу.</p><p>Event Loop — механизм, который управляет асинхронными операциями в JavaScript. Он позволяет обрабатывать задачи, не блокируя основной поток выполнения программы. Это особенно важно для создания отзывчивых интерфейсов пользователя и эффективной работы серверов.</p><p>Интересно, что Event Loop работает как в браузере, так и в Node.js, но с некоторыми отличиями. В этой статье мы сосредоточимся на том, как это происходит в браузере, и постараемся объяснить всё максимально просто, даже если вы только начинаете свой путь в программировании.</p><p>Поехали! 🚀</p><h2>Как работает Event Loop и из чего состоит</h2><h3>Структура Event Loop</h3><p>Основная цель Event Loop — циклическое выполнение задач, которые делятся на две категории:</p><ol><li>Синхронные задачи — выполняются немедленно;</li><li>Асинхронные задачи — добавляются в очередь и выполняются позже.</li></ol><h4>Макрозадачи и микрозадачи</h4><p>Одним из ключевых аспектов работы event loop выступают макрозадачи (macrotasks) и микрозадачи (microtasks). Они представляют собой две очереди задач, которые имеют различный приоритет выполнения.</p><ul><li>Макрозадачи. Выполняются после завершения текущей синхронной задачи. Примеры:Синхронный код; таймеры (setTimeout, setInterval); события пользовательского интерфейса (например, клики мыши); сетевые запросы (например, fetch или XMLHttpRequest).</li><li>Микрозадачи. Выполняются сразу после завершения текущей синхронной задачи, но перед началом следующей макрозадачи. Примеры:Промисы (Promise.resolve(), Promise.reject()).MutationObserver.async/await).</li></ul><p>В Node.js также есть event loop, но с небольшими различиями. Например, там используются дополнительные очереди для работы с файловой системой и сетью.</p><p>Схема приоритетов выполнения:</p><ol><li>Сначала выполняется текущий синхронный код;</li><li>Затем выполняются все микрозадачи в очереди Microtask queue до тех пор, пока очередь не станет пустой;</li><li>После этого выполняется следующая макрозадача из очереди Macrotask queue и т.д.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/111827/2025-02-03/84079167-ab47-4e02-ba5d-05ba8196e8c9.gif" alt="" /></figure><h2>Как поведет себя Event Loop в реальной жизни: разбираем код</h2><p>Схемы это конечно хорошо, но всегда лучше изучать на примерах кода. Далее посмотрим куски, которые могут встретиться во время работы или на собеседованиях.</p><h3>Вложенные промисы и микрозадачи</h3><p>Порядок вывода:</p><ol><li>Start</li><li>First promise</li><li>Second promise</li><li>Timeout 1</li><li>Promise in timeout</li></ol><p>Объяснение:</p><ul><li>Сначала выполняется синхронный код (console.log('Start')).</li><li>Затем выполняются микрозадачи (микротаски) — это цепочки промисов.</li><li>После завершения всех микрозадач выполняются макрозадачи (например, setTimeout).</li></ul><h3>Асинхронные функции и генераторы</h3><p>Порядок вывода:</p><ol><li>Async start</li><li>Main thread</li><li>Generator timeout</li><li>After generator</li></ol><p>Объяснение:</p><ul><li>Функция asyncFunction начинает выполнение, но останавливается на await, пока не завершится промис, созданный генератором.</li><li>Синхронный код продолжает выполняться (console.log('Main thread')).</li><li>Когда таймер завершается, event loop обрабатывает завершение промиса и продолжает выполнение asyncFunction.</li></ul><h3>Взаимодействие с DOM и таймерами</h3><p>Порядок вывода:</p><ol><li>Initial timeout</li><li>Button clicked</li><li>Timeout after click</li></ol><p>Объяснение:</p><ul><li>Первый таймер добавляет событие клика на кнопку.</li><li>После выполнения первого таймера происходит имитация клика на кнопку.</li><li>Event loop обрабатывает событие клика и устанавливает второй таймер.</li><li>После завершения всех синхронных задач выполняются все установленные таймеры.</li></ul><h3>Рекурсивные промисы и рекурсия</h3><p>Порядок вывода:</p><ol><li>Outside recursion</li><li>Recursive 3</li><li>Recursive 2</li><li>Recursive 1</li></ol><p>Объяснение:</p><ul><li>Вызов recursivePromise(3) запускает цепочку промисов и таймеров.</li><li>Синхронный код (console.log('Outside recursion')) выполняется первым.</li><li>Event loop последовательно обрабатывает каждый вызов рекурсии, начиная с самого глубокого уровня.</li></ul><h3>Параллельные сетевые запросы и обработка результатов</h3><p>Порядок вывода:</p><ol><li>Starting fetches</li><li>Fetched data from ... (в случайном порядке)</li><li>All data fetched: [...]</li></ol><p>Объяснение:</p><ul><li>Все сетевые запросы начинаются параллельно, но завершаются в разное время из-за случайной задержки.</li><li>Event loop обрабатывает завершение каждого запроса по мере их выполнения.</li><li>После завершения всех запросов выполняется обработчик Promise.all.</li></ul><p>Эти примеры показывают, как event loop управляет асинхронными операциями и как важно понимать порядок выполнения кода для правильного написания асинхронных приложений.</p><h2>Лайфхаки для понимания Event Loop</h2><h3>Используйте визуализацию</h3><p>Используйте инструменты вроде Chrome DevTools или онлайн-симуляторов Event Loop, чтобы видеть порядок выполнения задач.</p><h3>Создайте шаблоны</h3><p>Создайте шаблонные ситуации и попробуйте изменять их, чтобы лучше понять влияние различных элементов.</p><h3>Регулярно практикуйтесь</h3><p>Регулярно решайте задачи и пишите код, связанный с асинхронностью, чтобы закрепить знания.</p><h3>Изучите документацию</h3><p>Изучите официальную документацию по JavaScript и спецификации ECMAScript для более глубокого понимания.</p><p>Сегодня мы получили базовое представление о том, как работает Event Loop, его особенности и возможные подводные камни. Практикуйтесь и экспериментируйте, чтобы лучше понять этот важный механизм.</p>]]></content:encoded>
    </item>
    <item>
      <title>Гарантированное получение данных через REST API: Подходы и библиотеки для Java</title>
      <link>https://tproger.ru/articles/garantirovannoe-poluchenie-dannyh-cherez-rest-api--podhody-i-biblioteki-dlya-java</link>
      <comments>https://tproger.ru/articles/garantirovannoe-poluchenie-dannyh-cherez-rest-api--podhody-i-biblioteki-dlya-java?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тюрин ]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/garantirovannoe-poluchenie-dannyh-cherez-rest-api--podhody-i-biblioteki-dlya-java</guid>
      <description><![CDATA[<p>Как реализовать надежное взаимодействие с API в Java. Примеры кода, механизм retry и рекомендации для повышения отказоустойчивости системы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/garantirovannoe-poluchenie-dannyh-cherez-rest-api--podhody-i-biblioteki-dlya-java">Гарантированное получение данных через REST API: Подходы и библиотеки для Java</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 02 Feb 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В крупном Java-проекте с множеством внешних и внутренних API-сервисов, одной из ключевых задач становится надежное получение данных, даже если происходят временные сбои. При активном росте системы и усложнении её архитектуры разработчики используют различные подходы к работе с веб-API — от RestTemplate до GRPC . Однако при таком разнообразии инструментов возникает необходимость внедрить универсальный механизм повторного вызова (retry), который позволяет автоматически повторять запросы в случае ошибок, увеличивая интервал между попытками.</p><p>В этой статье мы разберём основные подходы к работе с REST API в Java и рассмотрим популярные библиотеки для реализации retry-механизмов. Я также поделюсь собственным опытом внедрения повторных вызовов с экспоненциальным увеличением задержки между попытками.</p><p>Стоит отметить, что далеко не во всех проектах требуется retry, но в нашей системе высокая надёжность — приоритетная задача. Мы работали в распределённой среде, где сервисы активно взаимодействовали друг с другом, а кратковременные сбои в сети могли приводить к сбоям в работе. В таких условиях механизм retry позволял минимизировать потери данных и повысить отказоустойчивость.</p><p>Какие ошибки можно решить с помощью retry? В первую очередь, это кратковременные сбои сети и таймауты при ожидании ответа от сервиса. Однако важно понимать, что если сервис перегружен, повторные запросы могут лишь усугубить проблему. В таких случаях необходимо оптимизировать сам сервис, а не полагаться исключительно на retry.</p><p>Далее мы рассмотрим, какие библиотеки позволяют реализовать retry в Java, какие стратегии повторных вызовов существуют и как их правильно применять в продакшн-системах.</p><h2>Использование RetryTemplate с RestTemplate в Spring</h2><p>RestTemplate — удобный HTTP-клиент в Spring Framework. Хотя он считается устаревшим, его всё ещё активно используют в существующих проектах. Чтобы повысить отказоустойчивость запросов, можно добавить механизм повторных попыток (retry) с использованием RetryTemplate из Spring Retry.</p><p>Пример: RestTemplate + RetryTemplate</p><h2>Использование WebClient с механизмом повторных попыток (retry)</h2><p>WebClient — современный HTTP-клиент в Spring WebFlux, который поддерживает асинхронные запросы и реактивные потоки. В отличие от RestTemplate, он рассчитан на неблокирующую работу и уже имеет встроенный механизм повторных вызовов.</p><p>Пример: WebClient + retryWhen</p><h2>Использование HttpClient (Java 11+) с механизмом повторных попыток</h2><p>Начиная с Java 11, стандартная библиотека HttpClient предоставляет мощные возможности для отправки HTTP-запросов, включая асинхронную обработку и гибкие настройки повторных попыток (retry).</p><p>Пример: HttpClient с механизмом повторных вызовов</p><h2>Реализация механизма повторных вызовов (Retry) в gRPC</h2><p>В проекте, где активно используется gRPC наряду с REST API, также возникает необходимость реализовать retry. К счастью, gRPC предоставляет встроенные механизмы обработки повторных запросов, что делает его удобным для высокой надежности системы.</p><p>gRPC — высокопроизводительный RPC-фреймворк от Google, основанный на HTTP/2 и использующий бинарный формат данных (Protocol Buffers). Он поддерживает стриминг, асинхронные вызовы и механизмы автоматического повторного запроса при сбоях.</p><p>В gRPC механизм retry можно настроить с помощью параметров retryPolicy, передаваемых в ServiceConfig:</p><p>Использование gRPC с retry повышает устойчивость микросервисов и делает систему более отказоустойчивой.</p><p>Мы рассмотрели несколько популярных подходов для гарантированного получения данных через REST API с использованием Java. Каждый из методов имеет свои преимущества и недостатки, а выбор подходящего решения зависит от конкретных требований проекта. Но стоит помнить, что при применении частых повторных вызовов нагрузка на сервис увеличивается, а ваш проект страдает.</p>]]></content:encoded>
    </item>
    <item>
      <title>Хочешь перейти из программиста в менеджеры? Вот твой план</title>
      <link>https://tproger.ru/articles/hochew-perejti-iz-programmista-v-menedzhery--vot-tvoj-plan-253833</link>
      <comments>https://tproger.ru/articles/hochew-perejti-iz-programmista-v-menedzhery--vot-tvoj-plan-253833?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/hochew-perejti-iz-programmista-v-menedzhery--vot-tvoj-plan-253833</guid>
      <description><![CDATA[<p>Как перейти из программиста в менеджеры. Показываем основные навыки, которыми должен обладать менеджер. Рассматриваем пошаговую инструкцию </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/hochew-perejti-iz-programmista-v-menedzhery--vot-tvoj-plan-253833">Хочешь перейти из программиста в менеджеры? Вот твой план</a>»</p>]]></description>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Agile]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 21 Jan 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Программист решает стать менеджером по разным причинам. Одному надоело копаться в коде — хочется видеть, как продукт живёт и дышит, а не бросать его на финальной отладке. Другой хочет власти. Третий — просто проверить, потянет ли. Но в любом случае это не про смену должности, а про смену головы. Алгоритмы, схемы, стек технологий — всё это остаётся в прошлом. Теперь придётся разбираться в людях, деньгах и дедлайнах.</p><p>Вместе с <a href="https://h.careers/curators/akim-savvin">Акимом Саввиным</a>, тимлидом команды бэкенда в ВСК, ментором Эйч Навыки и автором <a href="https://t.me/savvin_thoughts">телеграм-канала</a> о разработке и менеджменте, разбираемся, как программисту вырасти в руководителя и не пожалеть, какие навыки нужно развивать, чему учиться и как строить план перехода на новую должность.</p><h2>Шаг 1. Определяем цели и мотивацию</h2><p>Переход разработчика в руководители проекта может оказаться сложнее, чем кажется на первый взгляд. У программистов другой склад ума — такие специалисты, как правило, имеют узкий фронт ответственности и не всегда воспринимают рабочий процесс на уровне всей организации.</p><p>Поэтому программисту, который решил переквалифицироваться в руководители, стоит правдиво и подробно ответить себе на ряд вопросов:</p><ul><li>Готов ли я к кардинальной смене профиля деятельности психологически и физически?</li><li>Нацелен ли на развитие команды и компании в целом?</li><li>Готов ли серьезно работать над собой, развивать новые навыки, менять подход к решению проблем?</li></ul><p>Если на большинство вопросов ответ положительный, и при этом вы уверены в своих силах и обладаете необходимым запасом свободного времени и энергии, вам определенно стоит попробовать.</p><blockquote>Разработчику, который хочет стать менеджером, в первую очередь важно развить эмоциональный интеллект. Теперь его работа связана не столько с кодом, сколько с людьми: управление мотивацией, разрешение конфликтов, донесение ценности задач до команды. Еще одно серьезное испытание — неопределенность. Многие разработчики не готовы к тому, что теперь именно они должны разбираться с хаосом, а не ждать четких задач. Чтобы справляться с этим, нужно научиться правильно распределять приоритеты и делегировать работу.</blockquote><p>Кроме того, менеджеру важно уметь мыслить стратегически, держать в голове множество задач и быстро адаптироваться к изменениям. В роли руководителя придется думать о ресурсах, сроках, людях и бизнес-целях.</p><p>Какие качества развивать для перехода в менеджмент:</p><ul><li><b>Эмоциональный интеллек</b>т — управлять своими эмоциями и понимать команду.</li><li><b>Умение работать с неопределенностью</b> — теперь хаос и нестабильность станут частью вашей работы.</li><li><b>Стратегическое мышление </b>— фокус на общей картине, а не на отдельных задачах.</li><li><b>Стрессоустойчивость и самоконтроль</b> — слова и действия менеджера влияют на команду, и важно не разрушить её.</li><li><b>Бизнес-подход</b> — умение работать с ресурсами и добиваться результата, а не просто выполнять задачи.<br /></li></ul><h2>Шаг 2. Развиваем навыки</h2><p>Как правило, на позицию управленца претендуют сотрудники, которые уже освоили hard skills и хотят двигаться дальше. В сфере ИТ-менеджмента база — знание процессов разработки и понимание общей архитектуры.</p><p>Программист, переходящий в менеджеры, должен разбираться в ключевых этапах создания продукта: аналитика, дизайн, разработка, тестирование, отладка. Если в каких-то аспектах есть пробелы, их стоит восполнить. Однако знание технической части – лишь часть задачи.</p><p>Куда сложнее развить soft skills, которые для многих разработчиков остаются слабым местом. Их работа не предполагает активного взаимодействия с людьми: многие специалисты годами работают в изоляции и почти не контактируют с коллегами, а их коммуникация ограничивается техническими обсуждениями. Но в роли менеджера без этого не обойтись.</p><blockquote>Частая ошибка — думать, что хороший менеджер должен быть лучшим в техническом плане. На самом деле, soft skills для него важнее, чем hard skills. Если в разработке это вспомогательный навык, то в управлении — ключевой. Нужно развивать эмоциональный интеллект, бизнес-мышление и навыки управления людьми. Без этого даже самый опытный разработчик вряд ли станет эффективным руководителем.<br /></blockquote><p>Чтобы быстрее адаптироваться, стоит практиковаться в коммуникации: больше взаимодействовать с коллегами, участвовать в обсуждениях, пробовать себя в роли тимлида или ментора. Полезно изучать основы менеджмента, читать книги по лидерству и пробовать различные инструменты управления командой.</p><p>Рассмотрим ключевые софты, которые стоит развить.</p><h3>Коммуникация</h3><p>Умение вести переговоры помогает решать большинство проблем, возникающих в процессе работы над проектом. Менеджер координирует интересы сразу нескольких сторон:</p><ul><li>команды, которая хочет избежать переработок и сохранить баланс между работой и отдыхом;</li><li>руководства, которое следит за бюджетом и маржинальностью проекта;</li><li>заказчика, для которого важны сроки, качество и дополнительные бонусы.<br /></li></ul><p>Ошибки на любом этапе разработки неизбежно проходят через менеджера. Чтобы минимизировать их последствия, важно выстраивать доверительные отношения с командой и заказчиком. Разработчики — прежде всего люди, у них могут быть личные и профессиональные проблемы. Если учитывать интересы, можно рассчитывать на взаимопонимание.</p><blockquote>Главное в коммуникации – понимать, чего хочет собеседник. Если заказчику важен результат, он не будет вникать в технические детали, его нужно просто успокоить и дать четкое понимание сроков. Если в команде кто-то выгорел, возможно, стоит пересмотреть его задачи или дать передышку. Конфликты лучше решать без эмоций: обозначить проблему, найти ее источник и предложить компромисс.</blockquote><p>Хорошие переговорные навыки позволяют менеджеру защитить команду от неоправданных требований, избежать штрафов и подписания невыгодных соглашений. А главное — они сглаживают традиционные «углы», например, перенос сроков.</p><h4>Как преодолеть барьеры в общении?</h4><p>Разработчикам, особенно интровертам, может быть сложно адаптироваться к новой роли. Но чем больше практики, тем легче становится. Полезно освоить технику активного слушания — внимательно относиться к собеседнику и анализировать его слова. Развитие эмпатии также помогает в переговорах, так как понимание эмоций других людей облегчает поиск решений.</p><p>Со временем общение перестает быть сложностью и превращается в увлекательный процесс, который помогает лучше понимать людей, их мотивацию и точки роста.</p><h3>Ответственность</h3><p>Если менеджер что-то обещает, он должен это выполнить. Только так формируется доверие. Главное — не скрывать проблемы. Если сроки сдвигаются, важно заранее предупредить всех участников процесса.</p><p>Ключ к управлению ожиданиями — давать каждому то, что ему нужно. Заказчику не важны технические детали, ему важно понимать, как проделанная работа повлияет на бизнес. Если обновление ускорит дальнейшую разработку или снизит риски багов, нужно донести именно эту ценность. Внутри команды важно показывать, что вклад участников имеет значение.</p><blockquote>Мы используем гибкие методологии, но главный принцип – давать людям то, что им нужно. Заказчику – уверенность в результате. Ему не интересны технические детали вроде новых микросервисов и покрытых тестами API, ему важно понимать, какую бизнес-ценность это несет. Если изменение неочевидно, важно объяснить его эффект: например, шаблон микросервиса ускорит будущие разработки, а e2e-тесты снизят риски багов.<br /></blockquote><p>Для команды важно видеть смысл своей работы. Разработчик не просто пишет код – он меняет мир. Иногда даже стоит немного преувеличить значимость проделанной работы, чтобы люди чувствовали свою ценность.</p><h3>Пунктуальность</h3><p>Ответственный менеджер не опаздывает и грамотно планирует встречи. Регулярные срывы созвонов и просроченные дедлайны становятся нормой для команды, если сам руководитель подает такой пример.</p><blockquote>Один из полезных инструментов тайм-менеджмента — матрица Эйзенхауэра. Даже если не использовать ее постоянно, стоит понимать базовые принципы приоритизации задач. Также важно завести удобный личный календарь — это ваш основной рабочий инструмент.</blockquote><p>Каждая встреча должна быть структурированной: четкая повестка, конкретные вопросы и ожидаемые результаты. А чтобы поддерживать продуктивность, не забывайте про качественный отдых. Да, переработки неизбежны, но если они становятся системой, это ведет к выгоранию и снижению эффективности.</p><h3>Проактивность</h3><p>Умение предвидеть возможные сложности и действовать на опережение — ключевой навык менеджера. Если проект зависит от вовремя предоставленных клиентом документов или доступов, запрашивать их нужно заранее, а не в последний момент. Опытный координатор понимает, что в любой момент могут возникнуть задержки, поэтому планирует все заранее и минимизирует возможные риски.</p><p>Полностью предусмотреть все риски невозможно — неожиданные проблемы всегда будут возникать. Главное — учиться анализировать ошибки и извлекать из них уроки, чтобы не допускать повторения в будущем. Полезный инструмент для этого —   техника roaming’а рисков. Она помогает не просто фиксировать проблемы, а выявлять их первопричины.</p><blockquote>В нашей компании мы столкнулись с нестабильностью Redis и нехваткой экспертизы по его администрированию. Учитывая этот риск, мы используем инструмент только в тех случаях, когда возможная потеря производительности или данных не критична. Такой подход позволяет минимизировать потенциальные сбои и заранее учитывать слабые места инфраструктуры.</blockquote><h3>Другие навыки и умения</h3><p>Помимо перечисленного, менеджеру нужно прокачать следующие способности:</p><ul><li><b>Оценивать задачи по уровню сложности.</b> Необходимо понимать, сколько времени займет выполнение, справится ли с ней один специалист или ему потребуется помощь. Понимаете специфики поможет узнать, не тянет ли исполнитель время и не запрашивает ли слишком высокую цену за свою работу.</li><li><b>Просчитывать риски. </b>Рабочий процесс редко идет как по маслу. Специалисты могут заболеть, облениться, уволиться. Закладывайте сроки с учетом задержек в исполнении, особенно если задачи нетиповые.</li><li><b>Уметь контролировать эмоции.</b> Менеджер, который выходит из себя по поводу и без не способен эффективно управлять. Научиться спокойствию непросто, но это ценный навык, который идет на пользу всему рабочему процессу.</li><li><b>Делегировать.</b> Фигура высшего пилотажа — умение распределять задачи таким образом, чтобы все сотрудники развивали свой потенциал и выдавали максимальный результат. Самому руководителю стоит сосредоточиться на стратегическом развитии.</li></ul><h2>Шаг 3. Обучаемся менеджменту</h2><p>Должности тимлида придется учиться с нуля. В управлении важны сроки и результат, а не стремление к совершенству. Руководитель отвечает не только за свои, но и за чужие ошибки. Давить на подчиненных авторитетом, которого еще нет, не получится. В лучшем случае давление станет взаимным со стороны команды. Так можно «доруководиться» до саботажа.</p><p>Параллельно с развитием софтов, начните читать тематическую литературу. Если не хватает времени, слушайте аудиоверсии, но базовый пакет знаний получить необходимо.</p><p>Это примерный список для ориентира:</p><ul><li><b>«Эффективный руководитель»</b> — Питер Друкер. Книга рассказывает о том, как и чем должен заниматься руководитель, какие правила соблюдать, чтобы добиваться результата в любом деле.</li><li><b>«45 татуировок менеджера» </b>—  Максим Батырев. В формате жизненных историй и конфликтных ситуаций рассказывает о том, как сформировать характер и личность руководителя.</li><li><b>«Привычка работать вместе»</b> — Твайла Тарп. Опыт успешной коммуникации в команде на примерах из разных сфер.</li><li><b>«Пять пороков команды» </b>— Патрик Ленсиони. Книга о том, как преодолеть недоверие, безответственность и безразличие к результату работы.</li><li><b>«Мотивация» </b>— Макс Эггерт. Ценный справочник, полный советов и инструментов, необходимых в работе менеджера.</li><li><b>«Карьера менеджера IT-проекта»</b> — Гэйл Лакман Макдауэлл и Джеки Баваро. Практическое руководство по ведению проектов и подготовке к собеседованию на позицию ИТ-менеджера.</li></ul><p>Полезными будут и онлайн-курсы и тренинги по менеджменту. В числе самых известных — Agile Project Management, интенсив-тренинг для начинающих руководителей. Методология Agile — эффективный подход к реализации проектов с планированием, разбивкой на этапы и активным сотрудничеством всех участников.</p><p><a href="https://www.atlassian.com/ru/agile/scrum">Scrum</a> — метод гибкого управления проектами, который поможет управленцу и команде структурировать свою деятельность и координировать ее с помощью набора практик. Методология часто применяется при разработке приложений и других ИТ-проектов. Scrum — одновременно платформа с инструментами и практиками для гибкого управления проектами.</p><p>Однако инструментов и курсов недостаточно — нужны практические навыки, которые проще всего получить под руководством опытного ментора. Чтобы реализовать эту цель, придется действовать напрямую. А именно: найти самого толкового менеджера в компании, где вы работаете, и предложить ему всестороннюю помощь в работе.</p><h2>Шаг 4. Переходим на желаемую должность</h2><p>Советуем следовать конкретному плану:</p><ol><li><b>Установите сроки.</b> Переход в менеджеры — дело не одного дня. Процесс займет несколько месяцев, при этом форсировать события точно не стоит.</li><li><b>Согласуйте переход в менеджеры с руководством компании.</b> Если в вашей фирме не заинтересованы в подобной инициативе, поищите вакансии в других организациях. В целом хорошие управленцы в ИТ-отрасли нужны всегда.</li><li><b>Определите свои сильные и слабые стороны.</b> Подумайте, что можно сделать, чтобы нивелировать недостатки и выработать качества, без которых руководителю не обойтись.</li><li><b>Найдите ментора из числа опытных управленцев вашей компании. </b>Научитесь у него всему, что он знает, особенно в плане взаимодействия с исполнителями и руководством.</li><li><b>Договоритесь о собеседовании на позицию менеджера.</b> Если вы действуете внутри компании, вести беседу будет гораздо проще. Помните главное: собеседование — не экзамен, работодатель не делает вам одолжений, а тоже заинтересован в ответственных и активных работниках.</li></ol><p>Не стоит при переходе занимать позицию джуна (новичка без опыта). У вас уже есть навыки работы в ИТ, вы знаете, как создаются продукты, знакомы со спецификой и нюансами. Называйте себя мидлом и позиционируйте соответствующим образом.</p><h2>Шаг 5. Работаем над вызовами</h2><p>Начав работу в должности менеджера, бывшие разработчики сталкиваются со множеством новых вызовов. Главное, не воспринимать такие ситуации как катастрофу — большинство проблем типичны для любого проекта и вполне разрешимы:</p><ul><li><b>Длительные согласования.</b> Чем больше заинтересованных в проекте сторон (стейкхолдеров), тем сложнее. Готовьте документы, инструкции и самого клиента заранее. Все, что нужно предоставить с вашей стороны, должно быть предоставлено. Помогайте заказчику всем, чем можете, и будьте на связи, чтобы в любой момент ответить на вопросы.</li><li><b>Частые переносы встреч.</b> Клиенты бывают занятыми и иногда откладывают встречи. Проблему можно решить только одним способом — договориться, выбрав нужные слова, и вежливый, но решительный тон.</li><li><b>Предложение от заказчика переделать функционал.</b> То есть по сути обнулить результат уже проделанной работы. Задача менеджера в такой ситуации — оценить целесообразность решения. Возможно клиент руководствуется пользовательским опытом, но может быть и так, что это его сугубо личное мнение. В последнем случае придется собрать фактический материал и спокойно объяснить заказчику, с какими издержками придется столкнуться.</li></ul><p>Менее значительные трудности устраняются универсальными решениями. Используйте делегирование, если замечаете, что не справляетесь с текущими задачами. Не бойтесь говорить правду. Лучше сразу сказать клиенту, что задача не сделана, чем скрываться от него. Общайтесь с коллегами, не стесняйтесь обращаться за помощью в профессиональные сообщества. Будьте готовы меняться и адаптироваться, ибо стабильность — это иллюзия.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ужасный код: если бы злодеи хорроров стали программистами</title>
      <link>https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami</link>
      <comments>https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami</guid>
      <description><![CDATA[<p>Мы погрузились в мрачный мир фантазий и представили, какие языки программирования и роли могли бы выбрать самые известные злодеи хоррор-фильмов, если бы они ворвались в IT. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami">Ужасный код: если бы злодеи хорроров стали программистами</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 31 Oct 2024 09:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ночь Хэллоуина сгущается, тьма окутывает мир, и из самых глубоких уголков кинематографа выходят наши любимые кошмары. Но представьте, если бы эти жуткие персонажи сменили свое оружие на клавиатуру и монитор? Что, если бы Норман Бейтс автоматизировал свой мотель с помощью Python, а Пеннивайз заманивал пользователей в свои веб-ловушки на JavaScript?</p><h2>1. Норман Бейтс («Психо»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/6951c6b4-9e2b-4498-94aa-7700063929f1.jpg" alt="" /></figure><h2>Почему Python?</h2><p>Норман — сотрудник с раздвоением личности. Python для него как второй Норман: гибкий, мощный и позволяет быстро автоматизировать все, что только можно. Идеально подходит для человека, который ведет двойную жизнь и хочет держать все под контролем, не привлекая лишнего внимания.</p><h2>Его путь в IT</h2><p>Норман начинал как сисадмин в семейном мотеле "Бейтс". Ручное управление серверами быстро ему надоело — ну сколько можно делать одно и то же? Он начал писать скрипты на Python, автоматизируя бэкапы, мониторинг и деплой. Затем подсел на Docker и Kubernetes, завернул всю инфраструктуру в контейнеры и настроил CI/CD пайплайны.</p><p>Однажды Норман без уведомления команды внес критические изменения в продакшен-серверы ночью, когда никого не было на месте. Это привело к сбою системы на несколько часов. Когда коллеги попытались разобраться, он отрицал свою причастность, ссылаясь на проблемы с автоматизацией.</p><p>Но позже выяснилось, что он сделал это под влиянием своего "второго я", не осознавая последствий.</p><h2>2. Майкл Майерс («Хэллоуин»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/2edbbf8b-1b3f-47ba-af52-d973ac93c0cc.jpg" alt="" /></figure><h2>Почему C?</h2><p>Майкл — молчаливый и непробиваемый. C для него — идеальный язык: никаких лишних абстракций, полный контроль над железом. Ему не нужны навороты и фреймворки — только чистый код и абсолютная власть над системой.</p><h2>Его путь в IT</h2><p>С детства Майкл разбирал и собирал механизмы, пытаясь понять, как все работает изнутри. Начал с ассемблера, но перешел на C, когда понял, что так можно быть эффективнее, не теряя контроля. Работал над прошивками для микроконтроллеров, системами реального времени, где каждая миллисекунда на счету. Его код запускает медицинское оборудование и авионику — там, где ошибки не прощаются.</p><p>Однажды Майкл взялся за разработку критически важного модуля в одиночку, отказавшись от помощи и код-ревью. Когда модуль был интегрирован, система дала сбой, что привело к остановке производства.</p><p>Майкл любитель действовать в одиночку, игнорируя окружающих, на работе его нежелание сотрудничать может привести к серьезным проблемам.</p><h2>3. Пеннивайз («Оно»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/3672c708-3a03-446b-be8c-4cb2aa300c53.jpg" alt="" /></figure><h2>Почему JavaScript?</h2><p>Пеннивайз — мастер иллюзий и обмана. JavaScript для него — как волшебная палочка: можно творить что угодно и где угодно. Он любит удивлять пользователей неожиданными эффектами и нестандартными решениями. Вездесущность JS позволяет ему быть везде и сразу, играя с восприятием и ожиданиями.</p><h2>Его путь в IT</h2><p>Начал с создания веб-сайтов, которые завораживали и одновременно пугали пользователей своей необычностью. Быстро освоил все популярные фреймворки, переключаясь между React и Vue. Решил, что одной клиентской магии мало, и ушел в бэкенд.</p><p>Однажды Пеннивайз внедрил в продакшен нестабильную экспериментальную функцию без согласования. Пользователи были шокированы неожиданными изменениями интерфейса, что привело к массовому оттоку клиентов.</p><p>Раньше он появлялся и пугал детей, теперь на работе его неожиданные решения могут привести к убыткам компании и увольнению одним днем.</p><h2>4. Гостфейс («Крик»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/402925e7-3402-42e4-bdb4-36cc95b258aa.jpg" alt="" /></figure><h2>Почему Ruby?</h2><p>Гостфейс обожает интриги и игры разума. Ruby, по его мнению, идеально подходит для хакинга. Ему нравится быть на шаг впереди и всегда оставаться в тени. Ruby дает ему возможность быстро писать скрипты для поиска уязвимостей и эксплойтов.</p><h2>Его путь в IT</h2><p>Сначала был обычным админом, но быстро заскучал без адреналина. Погрузился в мир кибербезопасности, специализируясь на пентестах и социальной инженерии. Может украсить пароль у кого угодно, используя социальную инженерию и хитрость. В компании он тот, кто проводит внутренние проверки безопасности, и никто не знает, когда ждать следующего сюрприза.</p><p>На прошлой неделе Гостфейс решил проверить бдительность коллег и организовал фишинговую атаку внутри компании без предупреждения руководства. Это вызвало панику и недоверие среди сотрудников. Но лучше так, чем терроризировать жертв звонками, хотя...</p><h2>5. Кожаное лицо («Техасская резня бензопилой»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/6b8107b6-df04-4239-9fcf-e2bdc89ca177.jpg" alt="" /></figure><h2>Почему C++?</h2><p>Кожаное лицо любит работать с железом напрямую. C++ дает ему мощь и гибкость, позволяя писать эффективный код для микроконтроллеров. Он ценит контроль над памятью и возможность выжать максимум из ресурсов. Для него код — это инструмент, как и бензопила, которым он мастерски владеет.</p><h2>Его путь в IT</h2><p>С юных лет мастерил устройства из подручных материалов. Когда открыл для себя программирование микроконтроллеров, понял, что это его стихия. Создает прошивки для IoT-устройств, умных гаджетов и даже для самодельных девайсов. Его разработки надежны и устойчивы к любым условиям — будь то жара Техаса или суровая зима.</p><p>Коллеги знают: если нужно что-то спаять, запрограммировать и заставить работать — это к нему. Хотя он не особо разговорчив и может показаться грубоватым.</p><p>Во время стресса из-за сжатых сроков Кожаное лицо повредил дорогостоящее оборудование в лаборатории, пытаясь "улучшить" его без согласования.</p><h2>6. Акула («Челюсти»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/dbc0f930-5c93-49e9-a00e-836b47b26d6c.jpg" alt="" /></figure><h2>Почему Go?</h2><p>Акула — воплощение скорости и эффективности. Go для нее — идеальный инструмент для создания высокопроизводительных сервисов. Простота синтаксиса и мощные возможности конкурентности позволяют ей строить системы, которые не тонут под нагрузкой. Go — это язык для хищников, которые не терпят рутинных задач.</p><h2>Ее путь в IT</h2><p>Начинала с Java, но быстро поняла, что Go лучше подходит для ее целей. Стала экспертом в микросервисной архитектуре, разворачивая кластеры, способные обрабатывать миллионы запросов в секунду. Ее код оптимизирован на все 100%, как и она сама в погоне за добычей.</p><p>Коллеги уважают ее за способность быстро решать сложные задачи и держать систему на плаву. Но однажды в попытках улучшить производительность, Акула самостоятельно изменила настройки кластера, что привело к потере данных. Ей сложно перестроиться от бесконтрольных атак, поэтому на работе ее агрессивные действия могут причинить ущерб. Будьте осторожны.</p><h2>7. Существа из «Тихое место»</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/76c6e40d-6b9e-4077-b55d-f300f7cd357d.jpg" alt="" /></figure><h2>Почему Rust?</h2><p>Существа ценят тишину и надежность. Rust дает им безопасность и высокую производительность, предотвращая ошибки еще на этапе компиляции. Они создают системы, которые работают без сбоев и не требуют вмешательства — все тихо и гладко. Rust — идеальный язык для тех, кто предпочитает оставаться в тени, обеспечивая стабильность.</p><h2>Их путь в IT</h2><p>Начали как системные администраторы, но быстро поняли, что могут сделать больше. Освоили Rust для разработки внутренних инструментов и сервисов мониторинга. Настроили инфраструктуру так, что пользователи даже не подозревают о ее существовании — все работает как по маслу, без лишнего шума.</p><p>Недавно их чрезмерная реакция на мелкие проблемы привела к полной остановке системы. Маленький баг был воспринят как критическая угроза, и они отключили сервисы для "предотвращения катастрофы". Помните, они нападают на любой звук, на работе их гиперчувствительность может нанести вред.</p><h2>8. Сара Фир («Улица страха»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/68b9ede1-3c9c-46a8-b7c8-4d5c22e73a5c.jpg" alt="" /></figure><h2>Почему Kotlin?</h2><p>Сара видит то, что скрыто от других. Kotlin дает ей мощь и гибкость для создания масштабируемых приложений. Он современный и лаконичный, позволяющий писать чистый и понятный код. В сочетании с ML она строит модели, которые могут предсказывать будущее.</p><h2>Ее путь в IT</h2><p>Начинала как аналитик данных, копаясь в цифрах и выявляя закономерности. Освоила Kotlin, чтобы писать эффективные приложения для обработки больших данных.  Руководит командой Data Science, создавая алгоритмы, которые помогают компании быть на шаг впереди конкурентов.</p><p>Убежденная в своей правоте, Сара обновила новую модель без тестирования. Это привело к неверным прогнозам и финансовым потерям. Стоит сказать CTO, что на работе ее уверенность может обернуться против компании.</p><h2>9. Джейсон Вурхиз («Пятница, 13-е»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/d3194107-8621-4d13-a422-7c047cd60ee9.jpg" alt="" /></figure><h2>Почему Java?</h2><p>Джейсон — вечный, как сама Java. Java для него — символ стабильности и надежности. Он ценит проверенные временем технологии и масштабируемость, которую предоставляет язык. Его код такой же прочный, как и он сам, выдерживает любые нагрузки и атаки.</p><h2>Его путь в IT</h2><p>Начал с разработки для банков и крупных корпораций, где ошибка может стоить миллионов. Специализируется на системах, где отказоустойчивость и безопасность на первом месте. С помощью Spring и Hibernate строит архитектуры, которые работают годами без сбоев.</p><p>Было и такое, что Джейсон отказался от обновления технологий и продолжал использовать устаревшие версии, что сделало систему уязвимой для атак. Уверенность в стабильных решениях — это хорошо, но на работе его сопротивление изменениям может навредить безопасности компании.</p><p>Вот такие айтишные персонажи могли бы получиться из наших любимых хоррор-злодеев! У каждого свой уникальный стиль, подход к работе и, конечно же, свой любимый язык программирования.</p>]]></content:encoded>
    </item>
    <item>
      <title>Поиск данных в таблице. SQL - это просто</title>
      <link>https://tproger.ru/articles/poisk-dannyh-v-tablice--sql---eto-prosto-</link>
      <comments>https://tproger.ru/articles/poisk-dannyh-v-tablice--sql---eto-prosto-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Slava Rozhnev]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/poisk-dannyh-v-tablice--sql---eto-prosto-</guid>
      <description><![CDATA[<p>Выучим слово WHERE в SQL, позволяющее извлекать из таблицы не все данные подряд, а только те которые нам нужны.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/poisk-dannyh-v-tablice--sql---eto-prosto-">Поиск данных в таблице. SQL - это просто</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Feb 2024 13:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это четвёртый мини урок для начинающих изучать SQL. Список всех уроков вы можете найти <a href="https://tproger.ru/author/75407">здесь</a>. На предыдущих уроках мы выучили магические заклинания позволяющие извлекать данные из таблиц в заданном порядке и при необходимости ограничивать выдачу нужным количеством строк.</p><p>Сейчас мы выучим ещё одно волшебное слово позволяющее извлекать из таблицы не все данные подряд а только те которые нам нужны. Это слово <b>WHERE </b>(в переводе с английского – где).</p><p>При помощи этого слова мы можем выбрать из таблицы только те строки <b>ГДЕ</b> выполняется определённое условие. Например выбрать из нашей таблицы только отличников. По русски этот запрос будет звучать так:</p><p>ВЫБЕРИ имена студентов ГДЕ оценка равна пяти.</p><p>Переведём на английский (SQL):</p><p>Давайте напишем запрос для поиска тех у кого оценка ниже пятёрки:</p><p>Таким образом вы можете выбирать данные соответствующие заданному условию. Для написания условий можно использовать следующие операции:</p><ul><li>=  (равно)</li><li>&lt; (меньше)</li><li>&gt; (больше)</li><li>&lt;&gt; (не равно)</li></ul><p>Сравнивать можно не только числа но и любые данные в таблице. Например следующий запрос выберет всех студентов кроме историков:</p><p>Часто вам может понадобиться выбрать строки отвечающие нескольким условиям одновременно. Для этого нужно запомнить ещё одно слово на английском – AND. Это слово переводится как союз И и может применяться для объединения условий. Например для того чтобы найти отличников по физике нужно в запросе объединить два условия score = 5 и course = ‘Физика’.</p><p>Если нам достаточно выполнения одного из нескольких условий то их нужно соединить союзом ИЛИ – по английски OR. Например чтобы найти студентов изучающих одну из точных наук (физику или математику) напишем запрос:</p><p>В сложных случаях может понадобиться комбинация более чем двух условий и тогда нам могут понадобиться скобки для указания приоритета операций (как в математике) но этот материал мы рассмотрим позже.</p><p>На этом мы закончим наш микро-урок. Проверьте себя и выполните<a href="https://sqltest.online/ru/sakila/11"> этот тест </a>а потом переходите к следующему уроку</p>]]></content:encoded>
    </item>
    <item>
      <title>Как выбрать данные в SQL. SQL — это просто</title>
      <link>https://tproger.ru/articles/sql---eto-prosto--chast-pervaya--vybiraem-</link>
      <comments>https://tproger.ru/articles/sql---eto-prosto--chast-pervaya--vybiraem-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Slava Rozhnev]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sql---eto-prosto--chast-pervaya--vybiraem-</guid>
      <description><![CDATA[<p>Как выбрать данные из базы при помощи SQL, какие запросы для этого необходимо сделать и как работать с командой SELECT. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sql---eto-prosto--chast-pervaya--vybiraem-">Как выбрать данные в SQL. SQL — это просто</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 05 Feb 2024 11:00:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этом цикле микро-статей я хочу рассказать вам, что написание запросов к реляционным базам данных на языке SQL – это просто.</p><p>В большинстве языков программирования, при написании программы, вам нужно описать в коде алгоритм (то есть порядок действий), который должен выполнить компьютер для достижения результата. Такие языки называются императивными. В отличие от них, SQL является декларативным. Он устроен так, что вам не нужно указывать компьютеру, что он должен сделать для получения нужного вам результата. Вместо этого вам нужно описать желаемый результат и предоставить компьютеру самому найти подходящий алгоритм действий для его достижения.</p><p>Все, что вам нужно для получения результата – это умение описать его при помощи набора ключевых команд. Такое описание называется запросом к базе данных, а все эти команды являются обычными словами английского (так уж повелось) языка, и если вы знаете английский, то написание простого запроса не должно вызвать у вас затруднений. Если же нет, то вам придется заучить несколько слов.</p><p>Первые два из этих слов это <b>SELECT</b><b> (ВЫБЕРИ)</b> и <b>FROM (ИЗ)</b>.</p><p>Таким образом если вы запомнили два этих слова вы уже можете написать запрос и получить данные хранящиеся в базе. Напомню что все данные в реляционных базах хранятся в таблицах. Каждая запись в таблице называется строкой и состоит из одних и тех же полей с именами заданными именами колонок.</p><p>Для примера рассмотрим таблицу студентов (students) из трёх колонок: имя студента (name), курс на котором он занимается (course) и оценка (score).</p><figure><img src="https://media.tproger.ru/user-uploads/75407/2024-02-01/7fb8190f-740d-48a6-8f07-98c29a9acb95.png" alt="" /><figcaption>Образец данных в таблице students</figcaption></figure><p>Допустим, нам нужно выбрать все имена из таблицы студентов. Просто переведем наш запрос на английский язык, используя ключевые слова:</p><p>В результате выполнения этого запроса мы получим следующий результат:</p><p>Допустим, нам нужно выбрать не только имена студентов, но и курсы, на которых они занимаются. Опять переведем наше требование на язык запросов SQL (английский) и получим запрос:</p><p>Попросим базу данных выполнить его и получим результат:</p><p>Ну и если нам нужно получить данные из всех столбцов таблицы мы конечно можем перечислить их всех через запятую:</p><p>а можем просто использовать символ * вместо списка колонок:</p><p>В обоих случаях мы получим одинаковый результат:</p><p>Итак если вы дочитали до конца эту статью вы уже можете написать простейший запрос на языке SQL и пройти первые два теста на сайте <a href="https://sqltest.online/ru/sakila/1">SQLtest.online</a> и затем прейти к <a href="https://tproger.ru/articles/sql---eto-prosto--chast-vtoraya--sortiruem-">следующему мини-уроку</a> этого курса.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 архитектурных ошибок, которые мы совершаем на старте проектов</title>
      <link>https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov</link>
      <comments>https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov</guid>
      <description><![CDATA[<p>Какие архитектурные ошибки чаще всего совершают разработчики при запуске проектов и как их избежать? Разбираем пять критичных промахов, которые мешают продукту масштабироваться и усложняют поддержку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov">5 архитектурных ошибок, которые мы совершаем на старте проектов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 14 Jul 2023 12:10:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Можно запустить MVP за пару недель, но потом годами разгребать архитектурные долги. Ошибки на старте проекта легко не заметить: код вроде бы работает, фичи выкатываются, пользователи приходят. Но когда продукт растёт, каждая непродуманная деталь в архитектуре оборачивается багами. Разбираем пять ключевых ошибок, которые разработчики совершают чаще всего, и объясняем, как их избежать.</p><h2>Ошибка 1. Нет четких границ между слоями приложения</h2><p>На старте проекта код часто пишется «в лоб»: контроллеры ходят в базу напрямую, внутри функций появляются бизнес-правила и расчёты, а валидация размазывается по коду. Это кажется удобным, пока приложение небольшое. Но при росте команды и количества фич изменения начинают ломать соседние части кода, баги растут, а скорость разработки падает.</p><p>Можно выделить три базовых уровня:</p><ul><li>Контроллеры (или хэндлеры) принимают запросы, проводят базовую валидацию (например, через pydantic-схемы) и передают данные дальше.</li><li>Слой бизнес-логики реализует правила работы приложения: транзакции, расчёты скидок, проверку лимитов, работу с несколькими сервисами.</li><li>Слой доступа к данным отвечает за запросы к базе и возвращает данные в удобной для бизнес-логики форме.</li></ul><p>Например, в FastAPI проще начать с хэндлеров, которые сразу ходят в SQLAlchemy-модель. Но если сразу заложить сервисный слой, расчёты комиссий и проверку бизнес-правил можно будет тестировать изолированно, не поднимая всю API. Слой репозиториев позволяет в будущем легко заменить Postgres на другую базу или добавить кэш, не переписывая логику приложения.</p><p>Чёткое разделение позволяет быстро находить, где живёт бизнес-логика, где происходит доступ к данным и куда добавлять новые фичи. Продукт растёт, а код остается предсказуемым, удобным для изменений и масштабирования.</p><h2>Ошибка 2. Игнор масштабирования с первого дня</h2><p>Когда проект только запускается, кажется, что про масштабирование можно подумать потом. Приложение обслуживает сотню пользователей, запросы проходят быстро, всё работает. Но как только запускается маркетинг или приходит первый крупный клиент, внезапно всё начинает тормозить, а в коде нет ни одной зацепки, куда безопасно вставить кэш или вынести тяжёлые операции в фон.</p><p>Важно сразу закладывать в архитектуру точки роста, даже если пока они не нужны на каждый день.</p><p>Например:</p><ul><li>Добавить очереди и фоновые задачи через Celery или RQ, если есть риск появления тяжёлых операций (генерация отчётов, массовая рассылка).</li><li>Разносить чтение и запись: даже простое разделение на эндпоинты, где читающие операции не блокируются длительными транзакциями, уже помогает при росте нагрузки.</li><li>Придумать, как кэшировать самые тяжелые запросы: например, использовать Redis, чтобы хранить агрегированные данные, а не считать их каждый раз.</li><li>Закладывать возможность горизонтального масштабирования: не привязывать логику к локальному состоянию приложения, использовать хранилище с возможностью разделения нагрузки, не писать монолит, который нельзя будет разбить на части при росте.</li></ul><p>На практике проект растёт быстрее, чем кажется. Сначала в API добавляется массовая выгрузка CSV, потом приходят интеграции с другими сервисами, а затем накатывается нагрузка от новых пользователей. Если архитектура не подготовлена, команде приходится ставить костыли, переписывать эндпоинты под фоновые задачи или внедрять кэш в экстренном порядке, исправляя баги в проде.</p><p>Закладывая масштабирование в архитектуру с первого дня,  команда экономит себе месяцы переработок и спасается от бесконечных хотфиксов. Это инвестиция, которая позволяет команде развивать продукт спокойно.</p><h2>Ошибка 3. Преждевременное усложнение архитектуры</h2><p>Многие разработчики боятся, что проект не выдержит нагрузку, поэтому с самого старта закладывают сложные паттерны, микросервисы, брокеры событий и сразу три уровня кэширования. Но пока в системе нет ни пользователей, ни подтверждённой бизнес-модели, такие решения снижают скорость разработки и приводят к куче багов.</p><p>Рядовой пример — проект сразу запускается на Kubernetes с несколькими сервисами, которые обмениваются сообщениями через Kafka. В реальности такие проекты вначале требуют десятков часов на поддержание инфраструктуры, а баги приходится искать сразу в нескольких сервисах, между которыми гуляют события. При этом единственная реальная задача в начале — быстро проверить гипотезы и получить первых пользователей.</p><p>Упрощённая архитектура на старте позволяет команде сосредоточиться на продукте: монолит с чёткими слоями (контроллеры, сервисы, репозитории) куда быстрее дорабатывается и легче деплоится, чем микросервисы с отдельными контурами.</p><p>Что можно делать:</p><ul><li>Запускать монолит на FastAPI или Django, а не дробить на микросервисы до появления реальных узких мест.</li><li>Использовать Postgres без брокеров событий, пока не появятся требования к масштабированию.</li><li>Добавлять кэш Redis точечно, когда видна реальная нагрузка, а не вслепую кэшировать каждый запрос.</li></ul><p>Сложные архитектуры требуют времени на поддержку и экспертизу, чтобы не допустить критичных ошибок (например, потерю событий в брокере или гонки данных между сервисами). Поэтому вложения в сложную архитектуру оправданы, когда проект достигает уровня, где без этого уже не обойтись.</p><p>Если команда делает стартап или MVP, преждевременное усложнение архитектуры только тормозит развитие продукта. Гораздо эффективнее заложить возможности для масштабирования (очереди, фоновые задачи, кэш), но держать архитектуру простой до тех пор, пока проект не начнёт расти и не появятся реальные вещи, требующие изменений.</p><h2>Ошибка 4. Непродуманная работа с зависимостями</h2><p>В начале проекта обычно кажется, что зависимости — это просто. Но со временем проект разрастается, зависимости множатся, версии начинают конфликтовать, а обновление одной библиотеки ломает другую.</p><p>Эта ошибка обычно проявляется в нескольких местах. Например, в проект могут без разбора ставиться зависимости про запас или ради одной строчки удобной функции, хотя можно обойтись стандартной библиотекой. Ещё одна частая проблема — зависимости фиксируются слишком жестко, что не дает обновляться безопасно, или наоборот, версии не фиксируются вовсе, и проект начинает падать после автоматического обновления библиотек.</p><p>Чтобы избежать проблем, важно с самого начала заложить порядок в работе с зависимостями:</p><ul><li>Использовать инструмент управления зависимостями, который позволяет контролировать версии и изолировать окружения.</li><li>Разделять зависимости для разработки и продакшена.</li><li>Периодически обновлять зависимости, чтобы не закапываться в старые версии, но делать это контролируемо и с прогоном тестов.</li></ul><p>Например, при работе с Python удобным подходом будет использование Poetry: можно зафиксировать версии зависимостей в pyproject.toml, автоматически создавать lock-файл, следить за актуальностью библиотек и легко пересоздавать окружение. Если проект запускается на CI/CD, можно установить точные версии и сразу выявить, где обновление ломает тесты.</p><p>В длинных проектах непродуманная работа с зависимостями множится в геометрической прогрессии. Любой новый разработчик тратит время на настройку окружения, зависимости конфликтуют, часть библиотек остаётся неиспользованной. Порядок с зависимостями экономит часы и дни, снижает риск падений в проде и влияет на развитие проекта.</p><h2>Ошибка 5. Нет стратегии управления состоянием</h2><p>Состояние — это данные, которые хранятся между запросами или действиями пользователя: корзина, прогресс пользователя, кэшированные результаты запроса, состояние WebSocket-подключений. Если не продумать, как эти данные хранятся, обновляются и синхронизируются, приложение быстро начинает вести себя непредсказуемо.</p><p>На старте часто используют облегченный подход: данные передаются по цепочке вызовов, хранятся в сессии или глобальных переменных, кэшируются в памяти процесса. Это удобно, пока пользователей мало и сервер один. Но при росте нагрузки и масштабировании начинаются проблемы: сессии теряются между инстансами, кэш расходится, данные теряются при перезапуске приложения.</p><p>Чтобы избежать хаоса, управление состоянием нужно продумать заранее:</p><ul><li>Выяснить, какие данные должны храниться между запросами и как долго.</li><li>Решить, где хранить состояние: в базе данных, Redis, сторонних сервисах.</li><li>Сразу заложить сериализацию и валидацию состояния, чтобы избежать рассинхронизации форматов.</li></ul><p>Например, хранение кэша в памяти может подойти для небольших проектов, но если приложение начинает горизонтально масштабироваться, лучше вынести кэш в Redis, чтобы все инстансы работали с единым источником. Для сессий пользователей можно использовать JWT, если нужно масштабирование без общего состояния, или централизованное хранилище сессий, если требуется возможность их отзыва.</p><p>При работе с фронтендом стратегия управления состоянием не менее важна. Например, при использовании React или Vue проект может сначала обходиться локальным состоянием компонентов, но при росте сложности приложение начинает сыпаться из-за рассинхрона между компонентами. Важно заранее заложить подход с централизованным состоянием, а также понять, какие данные держать в состоянии клиента, а какие запрашивать заново.</p><p>Без стратегии управления состоянием проект становится сложным в отладке и поддержке. Грамотное управление состоянием ускоряет разработку и снижает количество багов в будущем.</p><p>А какие ошибки допускаете вы? Делитесь в комментариях или в тг-канале <a href="https://t.me/+a1v-IRDDUqI0MDhi">Веб-страница</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>