<?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>Node.js</title>
    <description/>
    <link>https://tproger.ru/tag/node-js</link>
    <atom:link href="https://tproger.ru/tag/node-js/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 16:24:32 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Node.js</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Идемпотентность и Outbox: как не выполнить одну операцию дважды</title>
      <link>https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy</link>
      <comments>https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy</guid>
      <description><![CDATA[<p>Как сделать ручку идемпотентной, где ломается наивная проверка ключа и зачем нужен transactional outbox. Забирайте код на Python, SQL и Node.js и чеклист.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/idempotentnost-i-outbox-kak-ne-vypolnit-odnu-operaciyu-dvazhdy">Идемпотентность и Outbox: как не выполнить одну операцию дважды</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 09 Sep 2026 05:00:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>История, с которой начинает автор одного из разборов ниже, звучит буднично. Платёжный шлюз не ответил вовремя, клиентская библиотека повторила запрос, и покупателя списали дважды. Сумма небольшая, а возврат, тикет в поддержку и восстановление доверия заняли недели.</p><p>Виноват тут не шлюз. Виноват сервер, который исходил из того, что каждый запрос приходит ровно один раз. В сети, где теряются ответы, это допущение неверно всегда.</p><p>Идемпотентность — свойство операции, при котором повторное выполнение приводит к тому же состоянию, что и однократное. Сам ответ при этом может отличаться: повторный DELETE вернёт 404 вместо 200, и метод от этого идемпотентным быть не перестаёт. У HTTP это закреплено на уровне методов: <a href="https://www.rfc-editor.org/rfc/rfc9110">RFC 9110</a> относит к идемпотентным PUT, DELETE и безопасные методы, а POST идемпотентным по своей природе не является. Бизнес-операции почти всегда отправляют именно через POST.</p><p>Клиент не может отличить «сервер не получил запрос» от «сервер выполнил операцию, но ответ потерялся», поэтому повтор придёт в любом случае.</p><p>Ключ идемпотентности генерирует клиент, а сервер хранит связку ключа со слепком запроса и с готовым ответом, чтобы повтор получил тот же результат, а не новый.</p><p>Проверка «посмотреть и вставить» неатомарна: два одновременных повтора оба увидят отсутствие ключа. Нужен уникальный индекс или условная запись.</p><p>Запись в базу и отправка в очередь в одну транзакцию не помещаются. Обёртывать сетевой вызов в BEGIN и COMMIT вредно вдвойне: корректности не даёт, а пул соединений выедает.</p><p>Transactional outbox решает это одной таблицей: событие пишется в той же транзакции, что и бизнес-запись, а отдельный процесс доставляет его в очередь.</p><h2>Почему повтор неизбежен</h2><p>Сеть отказывает так, что установить факт доставки невозможно в принципе. Есть три типовых сценария, и внешне они неразличимы:</p><ul><li>Сервер обработал запрос, но ответ потерялся по дороге назад.</li><li>Сервер всё ещё считает, а у клиента уже сработал таймаут.</li><li>Балансировщик повторил запрос сам, никого об этом не уведомив.</li></ul><p>Для GET повтор безвреден. Для POST /payments это второе списание. Отсюда и правило: одна логическая операция должна приводить к одному записанному итоговому состоянию, сколько бы раз её ни отправили. Осознанно новая операция обязана прийти с новым ключом.</p><h2>Два способа сделать ручку идемпотентной и один в довесок</h2><h3>Способ первый: ключ идемпотентности</h3><p>Самый распространённый вариант: клиент генерирует уникальный идентификатор на одну логическую операцию и повторяет его при каждой попытке. Сервер хранит соответствие ключа и ответа, а на дубликате возвращает сохранённый результат вместо повторного выполнения работы.</p><p>Три детали, на которых ошибаются чаще всего. Ключ генерирует клиент, а не сервер: смысл в том, что сервер сам по себе не отличит новый запрос от повтора. Ключ должен быть с высокой энтропией, обычно это UUID v4; выводить его из изменяемого или малоразнообразного поля вроде номера клиента нельзя, потому что это повышает риск коллизии и переигрывания чужой операции.</p><p>И последнее: повтор должен получить <b>тот же самый ответ</b>. Если первая попытка вернула 201 с идентификатором платежа, то и повтор возвращает те же 201 и тот же идентификатор, а не 409 и не пустую двухсотку. Иначе клиент решит, что операция не прошла, и попробует ещё раз.</p><h3>Способ второй: сделать операцию идемпотентной по смыслу</h3><p>Иногда ключ не нужен вовсе, потому что семантику можно спроектировать идемпотентной с самого начала. Классический пример — PUT /users/42, который задаёт полное представление ресурса: отправьте его дважды, и состояние будет одним и тем же.</p><p>Для операций создания трюк в том, чтобы выводить идентификатор из самого запроса, а не генерировать случайный на каждый вызов:</p><p>Идентификатор детерминированно выводится из почты, поэтому повторный запрос даёт того же пользователя без дублирующей строки. Плата за простоту — необходимость естественного уникального ключа: почты, артикула, внешнего идентификатора. Хеш при этом считается от точной строки, поэтому почту нужно привести к нижнему регистру и обрезать пробелы до хеширования: иначе один и тот же ящик с заглавной буквы даст второго пользователя. И ключ должен быть неизменным: если пользователь сменит почту, выведенный из неё идентификатор либо останется прежним и перестанет соответствовать данным, либо изменится и оторвётся от всех ссылок на него в соседних таблицах. Нет подходящего ключа, возвращайтесь к первому способу.</p><h3>Довесок: оптимистичная блокировка</h3><p>Этот приём идемпотентности не даёт и в списке стоит по другой причине. Ключ защищает от повторов одного и того же запроса, но ничего не делает с двумя <b>разными</b> запросами, которые правят одну запись. Здесь работает проверка версии: клиент присылает версию, которую видел, а сервер отклоняет обновление при несовпадении.</p><p>Обратите внимание, что проверка версии живёт внутри самого UPDATE. Разнести её на отдельное чтение и последующую запись означало бы воспроизвести ровно ту гонку, о которой пойдёт речь в следующем разделе: два запроса с одной устаревшей версией оба прошли бы проверку и оба записали бы результат. Идемпотентным одиночный запрос этот приём не делает, зато закрывает частый источник задвоенных эффектов: двух писателей, затирающих работу друг друга.</p><h2>Где наивная реализация ключа разваливается</h2><h3>Гонка в проверке</h3><p>Последовательность «проверить наличие ключа, потом вставить» содержит зазор, в который помещаются оба одновременных повтора: обе стороны видят, что ключа нет, и обе выполняют работу. Резервировать ключ нужно атомарно, через уникальное ограничение базы, условную запись или транзакционный compare-and-set (атомарное сравнение с записью).</p><p>Это же относится и к примеру с платежом выше: замена словаря в памяти на Redis гонку не закрывает, пока проверка и вставка остаются двумя отдельными командами. Нужен атомарный примитив резервирования, вроде SET key value NX или INSERT ... ON CONFLICT DO NOTHING.</p><p>Проверяется это только настоящей конкуренцией. Юнит-тест, вызывающий функцию дважды подряд, гонку не поймает никогда. Отправьте полсотни одновременных запросов с одним ключом и убедитесь, что побочный эффект произошёл ровно один раз.</p><h3>Слепок запроса, а не только ключ</h3><p>Хранить один ключ недостаточно. Сервер канонизирует поля, определяющие бизнес-смысл операции, и считает от них хеш. Канонизация означает приведение к единому виду порядка полей, форматов чисел и дат, опущенных значений по умолчанию и незначащих пробелов. Если повторный вызов обязан воспроизвести решение, принятое по прежним правилам, в слепок включают ещё и версию политики. Пример: между первой попыткой и повтором поменялись тарифы, и повтор обязан вернуть старую цену, а не пересчитать по новой. Без версии в слепке сервер этого различия не увидит.</p><p>Когда тот же ключ приходит с другим слепком, это ошибка на стороне клиента, и отдавать ему старый результат нельзя. <a href="https://dev.to/seo_optimization_591fad6c/designing-idempotent-decision-endpoints-that-survive-real-retries-6c1">Разбор проектирования идемпотентных ручек</a> предлагает отвечать 409 Conflict; <a href="https://dev.to/sirmax/3-ways-to-make-your-api-requests-idempotent-with-working-code-4inl">автор практического руководства</a> в этом случае возвращает 422. Важно, чтобы выбранный код был задокументирован и никогда не подменяется молчаливой отдачей чужого ответа.</p><h3>Состояния и коды ответа</h3><p>Минимальная модель состояний записи выглядит так: PROCESSING, SUCCEEDED, FAILED_RETRYABLE и FAILED_FINAL. Рядом хранятся ключ операции, слепок, отметки времени, идентификатор решения, снимок ответа и версия политики. Клиенту нужна детерминированная карта из состояния в код ответа:</p><ul><li>201 или 200 — первый успешно завершённый результат.</li><li>200 с явной пометкой о повторе — проигрывание сохранённого ответа.</li><li>202 со ссылкой на статус — работу уже выполняет другой обработчик, начинать вторую не нужно.</li><li>409 — ключ переиспользован с другим содержимым.</li><li>Задокументированная финальная ошибка — обработка провалилась, и автоматическое продолжение небезопасно.</li></ul><p><b>Срок жизни ключей:</b><br />Хранить их вечно не нужно, это медленная утечка. Сутки покрывают практически любое реальное окно повторов, но выбирать срок стоит от риска предметной области: у платежей и у рекомендаций он разный. И помните, что ключ приходит снаружи: ограничьте длину и набор символов, привяжите его к арендатору и не дайте одному пользователю вытащить результат чужой операции.</p><h2>Вторая половина задачи: база и очередь</h2><p>Допустим, ручка стала идемпотентной. Остаётся более коварная проблема: почти всякая бизнес-операция пишет не в одно место. Заказ сохраняется в базу и публикует событие в очередь, чтобы склад начал сборку, почтовый сервис отправил подтверждение, а антифрод посмотрел на транзакцию.</p><p>Обе половины статьи растут из одного факта: ни HTTP, ни очередь не обещают доставку ровно один раз, они обещают её хотя бы один раз. Поэтому защищаться приходится дважды, на входе и на выходе.</p><p>Это две записи в две разные системы, и общей транзакции у них нет. Упал процесс, моргнула сеть, выкатился деплой между двумя вызовами — одна сторона зафиксирована, вторая нет. Заказ подтверждён на экране покупателя, а склад о нём не знает. Ошибка при этом нигде не залогирована и алерт не сработал.</p><h3>Почему обернуть это в транзакцию нельзя</h3><p>Соблазнительный и заведомо неверный вариант выглядит так:</p><p>Транзакция базы не имеет власти над очередью и умеет откатывать только операции базы. Если отправка прошла, а COMMIT упал, сообщение уже в очереди и забрать его оттуда нельзя.</p><p>Есть и вторая беда, чисто эксплуатационная. Такой код держит открытое соединение и блокировки строк всё время сетевого вызова. Обычно очередь отвечает быстро, но под нагрузкой, ретраями или деградацией вызов растягивается на секунды, и все запросы к тем же строкам стоят в очереди. Это надёжный способ исчерпать пул соединений и уронить заодно ни в чём не повинные части сервиса.</p><h3>Outbox: событие как строка в той же транзакции</h3><p>Идея паттерна в том, чтобы перестать считать публикацию второй записью. Вместо вызова очереди приложение вставляет строку в таблицу outbox в той же транзакции, что и бизнес-запись. Отдельный процесс читает таблицу и публикует сообщения дальше.</p><p>Откатилась транзакция, и вместе с ней исчезла строка outbox: осиротевшего сообщения в очереди не осталось. Упало приложение сразу после фиксации — строка на месте со статусом pending, и доставщик заберёт её на следующем проходе. Паттерн опирается ровно на одну гарантию, которую база и так даёт: атомарность одной транзакции.</p><p>Доставщик выбирает пачку необработанных строк и помечает их отправленными только после подтверждения очередью. Ключевая деталь здесь одна:</p><p>Этот SELECT и последующая простановка статуса выполняются в одной транзакции: блокировка живёт до фиксации. Благодаря SKIP LOCKED доставщик масштабируется горизонтально из коробки, каждый экземпляр берёт свой набор строк. А если он упадёт посреди пачки, вся пачка откатится и уйдёт повторно, что даёт ещё один довод в пользу идемпотентного потребителя.</p><p>Может показаться, что здесь мы делаем ровно то, что осудили выше: держим блокировку на время сетевого вызова. Разница в том, что блокируется не бизнес-таблица и соединение берётся не из пула, обслуживающего пользовательские запросы, а SKIP LOCKED не даёт одной медленной строке задержать остальные.</p><h3>Потребитель обязан быть идемпотентным</h3><p>Если доставщик упал посреди прохода, на следующем он переотправит те же строки. Очереди вроде SQS и Kafka в типовой конфигурации гарантируют доставку «хотя бы один раз», поэтому дедупликация на приёмной стороне обязательна, и уникальным ключом служит идентификатор события или решения.</p><p>Делает это условная запись. Важная деталь, на которой легко ошибиться: сама по себе она пустой операцией не становится. При несовпадении условия драйвер бросает исключение, и его нужно поймать явно, отличив штатный повтор от настоящей ошибки:</p><p>Настройки продюсера и подтверждения брокера снижают количество повторов, но не снимают с приложения ответственность за однократность бизнес-эффекта.</p><h3>Что добавить перед продакшеном</h3><p>Двух статусов мало. Нужен статус failed и счётчик попыток: после N неудач строка помечается провалившейся и перестаёт крутиться в цикле вечно. На стороне очереди настраивается очередь недоставленных сообщений, чтобы то, что потребитель не смог обработать, оседало в наблюдаемом месте, а не исчезало молча.</p><p>Когда задержка опроса становится критичной, полагающийся на периодический опрос доставщик заменяют захватом изменений: инструменты вроде Debezium читают журнал предзаписи PostgreSQL и публикуют изменения без паузы на опрос. Таблица outbox и потребитель при этом не меняются. Но это заметно более тяжёлое эксплуатационное обязательство, поэтому начинать почти всегда стоит с опроса.</p><h2>Что забрать с собой</h2><p>Обе части задачи выглядят избыточными ровно до первого инцидента. Тридцать строк кода с ключом идемпотентности стоят дешевле одного тикета с заголовком «вы списали дважды», а таблица outbox дешевле расследования, почему заказ есть у клиента и отсутствует на складе.</p><p>Коварство проблемы двух записей в том, что наивная реализация работает правильно почти всегда. Она отказывает в зазоре между двумя системами, и зазор этот становится виден только когда что-то пошло не так в самый неподходящий момент. К моменту, когда расхождение заметят в продакшене, данные уже разъехались, и красивого способа их починить не будет.</p><p>Как одно неверное допущение о порядке вызовов обернулось эпидемией задвоенных операций, показано в <a href="https://tproger.ru/articles/skrytyj-sboj-idempotentnosti-v-finteh-sisteme-razbor-incidenta">разборе реального инцидента в финтех-системе</a>.</p><p>Материалы, на которых основан разбор: <a href="https://dev.to/sirmax/3-ways-to-make-your-api-requests-idempotent-with-working-code-4inl">три паттерна идемпотентности с рабочим кодом</a>, <a href="https://dev.to/seo_optimization_591fad6c/designing-idempotent-decision-endpoints-that-survive-real-retries-6c1">проектирование ручек, переживающих реальные повторы</a> и <a href="https://www.freecodecamp.org/news/how-to-fix-the-dual-write-problem-in-node-js-with-the-outbox-pattern/">пошаговая сборка outbox на Node.js</a>.</p><p>Откройте самый денежный обработчик в своём сервисе и попробуйте отправить в него один и тот же запрос дважды. Если во второй раз что-то произошло, вы уже знаете, с чего начать понедельник.</p>]]></content:encoded>
    </item>
    <item>
      <title>pnpm 12.3 ускорил большие workspace и сделал глобальные команды нативными</title>
      <link>https://tproger.ru/news/pnpm-12-3-uskoril-bolwie-workspace-i-sdelal-globalnye-komandy</link>
      <comments>https://tproger.ru/news/pnpm-12-3-uskoril-bolwie-workspace-i-sdelal-globalnye-komandy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/pnpm-12-3-uskoril-bolwie-workspace-i-sdelal-globalnye-komandy</guid>
      <description><![CDATA[<p>pnpm 12.3.0 читает lockfile при обнаружении проектов, делает node, deno и bun нативными файлами, даёт trust-флаги для remove и update; 12.3.1 чинит self-update.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/pnpm-12-3-uskoril-bolwie-workspace-i-sdelal-globalnye-komandy">pnpm 12.3 ускорил большие workspace и сделал глобальные команды нативными</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 08:00:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда pnpm 2 сентября <a href="https://github.com/pnpm/pnpm/releases/tag/v12.3.0">выпустила</a> версию 12.3.0, а через несколько часов, уже 3 сентября, <a href="https://github.com/pnpm/pnpm/releases/tag/v12.3.1">патч</a> 12.3.1. Главное в минорном релизе: установка в больших монорепозиториях стала быстрее за счёт того, что lockfile читается во время обнаружения проектов, а глобальные команды node, deno, bun и shim, созданные через pnpm shim add, превратились в нативные исполняемые файлы на всех платформах.</p><p>Для тех, кто держит workspace на десятки пакетов, это ускорение pnpm install без изменений в конфигурации. Для пользователей Windows это ещё и конец .cmd и .ps1-обёрток: их заменяет .exe. Обратная сторона видна по патчу 12.3.1: обновление с 12.2 через self-update ломало миграцию старых shim, и это исправили в тот же день.</p><ul><li>Установка в больших workspace ускорена: lockfile читается во время discovery проектов, граф workspace обрабатывается один раз вместо полного копирования lockfile.</li><li>Контекстно-зависимые глобальные команды и shim стали нативными исполняемыми файлами; в Windows .exe вместо .cmd и .ps1, старые shim мигрируют при следующей глобальной установке или self-update.</li><li>Флаги доверия --trust-lockfile, --no-trust-lockfile, --trust-policy, --trust-policy-exclude и --trust-policy-ignore-after теперь работают и для remove и update.</li><li>Исправлено зависание recursive run и exec, в том числе с --filter и --workspace-concurrency=1.</li><li>Системный резолвер на Linux использует getaddrinfo и больше не должен молча обращаться к Google Public DNS при неподдерживаемой опции no_tld_query.</li></ul><h2>Откуда взялось ускорение в монорепозиториях</h2><p>По заметкам к релизу, раньше pnpm сначала обходил все проекты workspace, а потом отдельно разбирал lockfile и копировал его целиком для резолвера. В 12.3 lockfile читается уже на этапе discovery, а граф workspace строится один раз и передаётся резолверу и генератору lockfile без полного копирования. Конкретных цифр ускорения команда pnpm в заметках не приводит, формулировка звучит как «sped up installs in large workspaces»; эффект тем заметнее, чем больше пакетов и чем толще lockfile.</p><h2>Что изменилось для глобальных команд и Windows</h2><p>pnpm умеет ставить node, deno и bun как глобальные команды, которые подбирают версию по контексту проекта. До 12.3 в Windows такие команды были скриптами .cmd и .ps1, а на других платформах shell-обёртками. Теперь везде это нативные исполняемые файлы. Старые shim от pnpm 12 мигрируют при следующей глобальной установке или self-update; именно этот переход и сломался при обновлении с 12.2, что исправили в 12.3.1: нативный shim теперь мигрирует при первом запуске.</p><h2>Безопасность: trust-флаги и скрытие секретов</h2><p>Механизм доверия к lockfile появился в pnpm 12 как защита от атак на цепочку поставок: пакеты, не прошедшие политику доверия, не ставятся. В 12.2 флаги были только у install и add; 12.3 добавляет их к remove и update. Второе изменение того же ряда: учётные данные и query-параметры из URL реестров теперь скрываются в сообщениях об ошибках fetch и загрузки tarball, так что токен приватного реестра больше не утекает в лог CI при обрыве соединения.</p><h2>Исправления, которые стоит знать</h2><ul><li>Добавление локальных директорий, tarball-файлов и tarball по URL через pnpm add снова работает.</li><li>recursive run и recursive exec больше не зависают, включая варианты с --filter и --workspace-concurrency=1.</li><li>Дочерние процессы в Windows запускаются корректно.</li><li>Linux: системный резолвер переведён на getaddrinfo; при неподдерживаемой опции no_tld_query в resolv.conf pnpm больше не должен молча уходить к Google Public DNS, что важно в закрытых сетях и там, где внешние DNS фильтруются.</li><li>12.3.1: исправлены обработка workspace anchor и параллельная проверка lockfile.</li></ul><h2>Как обновиться</h2><p>Обновляться стоит сразу на 12.3.1, минуя 12.3.0. Если pnpm установлен через Corepack или npm i -g pnpm, обновление идёт обычным способом; если через self-update, после перехода с 12.2 стоит один раз запустить любую глобальную команду, чтобы shim мигрировал. Проверить, что всё на месте: pnpm --version должен показать 12.3.1, а pnpm shim ls (если пользуетесь shim) не должен ругаться на старые обёртки.</p><p>Кому обновление ничего не изменит: одиночным проектам без workspace и тем, кто не пользуется глобальными командами pnpm. Из соседних новостей про инструменты JavaScript на сайте: <a href="https://tproger.ru/news/github-cli-2-99-prikladyvaet-skrinwoty-i-video-k-issue-iz-termin">GitHub CLI 2.99</a> и <a href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0</a>. Полный список изменений с номерами issue лежит на <a href="https://github.com/pnpm/pnpm/releases/tag/v12.3.0">странице релиза</a>.</p><p>Источники: <a href="https://github.com/pnpm/pnpm/releases/tag/v12.3.0">pnpm v12.3.0 на GitHub</a>, <a href="https://github.com/pnpm/pnpm/releases/tag/v12.3.1">pnpm v12.3.1 на GitHub</a></p><p>Изображение на обложке: pnpm, логотип проекта</p>]]></content:encoded>
    </item>
    <item>
      <title>Positive Technologies нашла в Microsoft Prompty дыру на 10 из 10 по CVSS</title>
      <link>https://tproger.ru/news/positive-technologies-nawla-v-microsoft-prompty-dyru-na-10-iz-10</link>
      <comments>https://tproger.ru/news/positive-technologies-nawla-v-microsoft-prompty-dyru-na-10-iz-10?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/positive-technologies-nawla-v-microsoft-prompty-dyru-na-10-iz-10</guid>
      <description><![CDATA[<p>Файл .prompty мог выполнить произвольный JavaScript в процессе Node.js: SSTI в пакете @prompty/core, CVE-2026-73299, CVSS 10,0. Какие версии уязвимы и что делать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/positive-technologies-nawla-v-microsoft-prompty-dyru-na-10-iz-10">Positive Technologies нашла в Microsoft Prompty дыру на 10 из 10 по CVSS</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 10:20:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Positive Technologies 2 сентября <a href="https://habr.com/ru/companies/pt/news/1077618/">сообщила</a>, что её команда AppSec Research нашла критическую уязвимость в Prompty, открытом проекте Microsoft для описания, отладки и оценки промптов к языковым моделям. Специально подготовленный файл .prompty позволял выполнить произвольный JavaScript в процессе Node.js с правами приложения, которое его открыло. Уязвимость получила идентификатор CVE-2026-73299 и максимальную оценку 10,0 по CVSS 3.1.</p><p>Для разработчиков ИИ-приложений на TypeScript вывод простой: если в проекте есть пакет @prompty/core версии по 0.1.4 включительно или из ветки 2.0 с 2.0.0-alpha.1 по 2.0.0-beta.4 включительно, его нужно обновить, а файлы промптов из чужих репозиториев, от сообщества или сгенерированные моделью с этого момента считать кодом, а не конфигурацией. Исправления Microsoft выпустила в версиях 0.1.5 и 2.0.0-beta.5, говорится в <a href="https://github.com/microsoft/prompty/security/advisories/GHSA-w28w-gp39-m4p6">advisory</a> на GitHub.</p><ul><li>Уязвимость класса SSTI в TypeScript-runtime Prompty: шаблонизатор Nunjucks не ограничивал доступ шаблона к объектам JavaScript.</li><li>Затронуты npm-пакет @prompty/core по 0.1.4 включительно и ветка 2.0 с 2.0.0-alpha.1 по 2.0.0-beta.4 включительно; исправлены 0.1.5 и 2.0.0-beta.5.</li><li>CVSS 3.1: 10,0, вектор AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H; CWE-94 и CWE-1336.</li><li>Эксплуатация требует, чтобы приложение обработало подготовленный злоумышленником файл .prompty; обычный запрос пользователя к модели код не выполняет.</li><li>Advisory опубликовано 20 июля 2026 года, исправленные версии вышли в npm в тот же день; о находке Positive Technologies рассказала 2 сентября.</li></ul><h2>Как файл промпта превращался в код</h2><p>Prompty хранит промпт в файле с YAML-заголовком и телом-шаблоном, а в TypeScript-runtime тело обрабатывает шаблонизатор Nunjucks. По описанию Microsoft в advisory, рендерер вычислял тело недоверенного шаблона «с неограниченным доступом к членам JavaScript-объектов» (перевод редакции): шаблон мог добраться до свойств constructor и prototype и через них выполнить произвольный код в процессе Node.js. Это классическая инъекция в серверные шаблоны, SSTI, только вместо HTML-шаблона здесь файл промпта.</p><p>Оценка 10,0 объясняется вектором: атака по сети, низкая сложность, без прав и без участия пользователя, с выходом за пределы уязвимого компонента и полной потерей конфиденциальности, целостности и доступности. На практике последствия зависят от того, с какими правами запущен процесс: Positive Technologies перечисляет доступ к данным приложения и секретам, изменение файлов и настроек, вмешательство в работу сервиса и полный отказ в обслуживании.</p><p>При этом речь не о том, что любой текстовый запрос пользователя к модели выполняет код на сервере, подчёркивают в Positive Technologies. Для эксплуатации приложение должно использовать уязвимый TypeScript-runtime с Nunjucks и обработать файл, который подготовил злоумышленник. Microsoft в advisory называет именно такие сценарии: файлы .prompty, полученные от сообщества, клонированные из чужих репозиториев или сгенерированные языковой моделью.</p><h2>Что изменилось в исправленных версиях</h2><p>По данным advisory, исправление вошло в pull request №404. Обновлённый рендерер приводит входные данные шаблона к «только собственным данным», отвергает обращение к constructor и prototype и запрещает вызов функций из шаблона. Обычная подстановка переменных, условия, циклы и вложенные свойства собственных данных продолжают работать, так что существующие промпты переписывать не придётся, если они не вызывали функции из тела шаблона.</p><p>В реестре npm версия 2.0.0-beta.5 появилась 20 июля 2026 года в 17:42 UTC, версия 0.1.5 в 18:54 UTC того же дня, а advisory Microsoft опубликовала в 18:55 UTC. На момент публикации тег latest в npm указывает на 0.1.6, тег alpha на 2.0.0-beta.5. В advisory затронутыми названы только npm-пакеты; про Python-пакет prompty и расширение для VS Code там ничего не сказано.</p><h2>Что делать</h2><p>Проверить, есть ли пакет в проекте и какой версии, можно командой npm ls @prompty/core. Если версия 0.1.4 или ниже, обновляйтесь до 0.1.5 или новее; если вы на ветке 2.0 (с 2.0.0-alpha.1 по 2.0.0-beta.4), до 2.0.0-beta.5 или новее. Microsoft в advisory просит обновиться до 2.0.0-beta.5 или выше.</p><p>Второй шаг не про версии. Старший специалист AppSec Research Positive Technologies Александр Халиков формулирует его так: «Файлы с промптами уже нельзя воспринимать как безобидные текстовые конфигурации. В современных ИИ-приложениях они могут содержать исполняемую логику и фактически становятся ещё одним элементом цепочки поставок программного обеспечения». Отсюда те же меры, что для кода: доверенные источники, контроль изменений и происхождения, запрет на обработку непроверенных шаблонов и запуск ИИ-инфраструктуры с минимально необходимыми правами. Если ваш агент сам генерирует или скачивает промпты и тут же их рендерит, это ровно тот сценарий, который Microsoft называет опасным.</p><h2>Кто и как нашёл</h2><p>Positive Technologies связывает находку с новой разработкой на основе ИИ, которая автоматизирует поиск уязвимостей и проверку возможности их эксплуатации; по словам компании, инженеру потребовалось две минуты на триаж результатов сканирования. Это заявление компании, независимо проверить его нельзя. В advisory на GitHub в графе «reporter» указан пользователь lexdotdev; между выпуском исправления в июле и публичным рассказом об исследовании в сентябре прошло полтора месяца.</p><p>Репозиторий microsoft/prompty на момент публикации собрал 1 255 звёзд на GitHub; Positive Technologies оценивает аудиторию экосистемы Prompty в «десятки тысяч разработчиков» по открытым данным npm, PyPI и Visual Studio Marketplace, и это тоже оценка компании. Нынешняя дыра в проекте не первая: в июне в том же репозитории уже выходили advisory о чтении файлов и выполнении JavaScript через frontmatter. Следующее, за чем стоит следить, это выход стабильной версии 2.0: ветка на GitHub пока помечена как alpha.</p><p>Источники: <a href="https://habr.com/ru/companies/pt/news/1077618/">Positive Technologies: новое ИИ-решение помогло найти критическую уязвимость в проекте Microsoft</a>, <a href="https://github.com/microsoft/prompty/security/advisories/GHSA-w28w-gp39-m4p6">GitHub Advisory GHSA-w28w-gp39-m4p6</a>, <a href="https://github.com/microsoft/prompty">Репозиторий microsoft/prompty</a>, <a href="https://www.npmjs.com/package/@prompty/core">Пакет @prompty/core в npm</a></p><p>Изображение на обложке: Логотип: Microsoft</p>]]></content:encoded>
    </item>
    <item>
      <title>В кэше десктопного ChatGPT нашли 1,7 ГБ с Python, Node.js и LibreOffice</title>
      <link>https://tproger.ru/news/v-kewe-desktopnogo-chatgpt-nawli-1-7-gb-s-python-node-js-i-libr</link>
      <comments>https://tproger.ru/news/v-kewe-desktopnogo-chatgpt-nawli-1-7-gb-s-python-node-js-i-libr?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-kewe-desktopnogo-chatgpt-nawli-1-7-gb-s-python-node-js-i-libr</guid>
      <description><![CDATA[<p>Саймон Уиллисон нашёл в кэше десктопного приложения OpenAI runtime на 1,7 ГБ: Python, Node.js, Git, Poppler, LibreOffice и skills к ним. Зачем ИИ-клиенту офисный пакет.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-kewe-desktopnogo-chatgpt-nawli-1-7-gb-s-python-node-js-i-libr">В кэше десктопного ChatGPT нашли 1,7 ГБ с Python, Node.js и LibreOffice</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 06:04:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик Саймон Уиллисон, автор Datasette и одного из самых читаемых блогов про ИИ-инструменты, 1 сентября <a href="https://simonwillison.net/2026/Sep/1/codex-libreoffice/">показал</a>, что десктопное приложение OpenAI Codex, которое компания недавно переименовала в ChatGPT, держит в скрытом каталоге кэша на macOS отдельную среду выполнения на 1,7 ГБ. Внутри полная установка Python, полная установка Node.js и нативные сборки Git, Poppler и headless-версии офисного пакета LibreOffice.</p><p>Для пользователей это ответ на вопрос, куда с диска ушли почти два гигабайта после установки чат-клиента. Для разработчиков это редкий взгляд на то, как устроен агент внутри потребительского приложения: для работы с документами у него под рукой те же инструменты командной строки, которые вы поставили бы руками, и инструкции к ним в обычных текстовых файлах.</p><ul><li>Каталог ~/.cache/codex-runtimes/codex-primary-runtime занимает 1,7 ГБ на macOS.</li><li>Node.js 446,4 МБ, Python 440,6 МБ, LibreOffice headless 429,7 МБ, Poppler 187,9 МБ, Git 148,1 МБ; вместе нативные бинарники весят 771 МБ.</li><li>В plugins/documents лежат skills, которые объясняют агенту, где искать бинарники и как ими пользоваться.</li><li>Наблюдение сделано на одной машине с macOS; официальных данных о составе runtime на Windows и Linux нет.</li></ul><h2>Что именно лежит в каталоге</h2><p>Уиллисон наткнулся на каталог случайно, разбирая ~/.cache/ утилитой OmniDiskSweeper. Внутри codex-runtimes/codex-primary-runtime три части: dependencies на 1,7 ГБ, plugins на 6,3 МБ и файл runtime.json на 4,1 КБ. В зависимостях четыре подкаталога: native на 771,0 МБ, node на 446,4 МБ, python на 440,6 МБ и bin на 28,7 КБ. В native лежат libreoffice-headless (429,7 МБ), poppler (187,9 МБ), git (148,1 МБ), libheif (4,7 МБ) и jxrlib (679,9 КБ).</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/3a146c9b-2d63-4ff5-9326-5bd902288f8a.webp" alt="Диаграмма размеров компонентов runtime десктопного ChatGPT" /><figcaption>Размер компонентов codex-primary-runtime на машине Саймона Уиллисона, МБ. График: Tproger по данным simonwillison.net</figcaption></figure><p>Набор говорящий. Poppler читает и рендерит PDF, LibreOffice в headless-режиме конвертирует документы Word, Excel и PowerPoint в другие форматы без графического интерфейса, libheif открывает фотографии с iPhone в формате HEIC, jxrlib нужна для JPEG XR. Git и полноценные интерпретаторы Python и Node.js дают агенту возможность выполнять код и работать с репозиториями на машине пользователя.</p><h2>Зачем агенту офисный пакет</h2><p>Самое интересное в находке лежит в папке plugins/openai-primary-runtime/plugins/documents. По словам Уиллисона, в ней лежат skills, то есть текстовые инструкции, которые объясняют модели, как найти эти бинарники и как ими пользоваться. Это тот же подход, что в Claude Code и других агентных инструментах: вместо встроенного парсера каждого формата агент получает описание команды и вызывает готовую утилиту.</p><p>На практике это означает, что когда вы просите десктопный ChatGPT «сделать из этого документа PDF» или «вытащить таблицу из презентации», конвертация может выполняться локально, вызовом LibreOffice или Poppler из этого кэша. Это один из возможных путей: из наблюдения нельзя сказать, какие операции остаются локальными, а какие всё равно отправляют содержимое файла модели или обрабатываются иначе; документации OpenAI о составе runtime и о том, когда он скачивается, в открытом доступе нет.</p><h2>Что стоит учесть</h2><p>Наблюдение сделано на одной машине с macOS. Приложение для Windows может комплектоваться иначе, и переносить цифры на другие платформы не стоит. Не ясно и то, как обновляется runtime: отдельным скачиванием при первом обращении к документам или вместе с приложением.</p><p>Тем, кто следит за дисковым пространством, достаточно заглянуть в тот же путь. Удалять каталог вручную мы бы не советовали: что произойдёт с функциями работы с документами без него, автор не проверял, а официального способа отключить или очистить runtime OpenAI не описывает.</p><p>Разработчикам агентов здесь два практических наблюдения. Первое: в поставке для работы с форматами лежат полтора гигабайта проверенных открытых инструментов, включая LibreOffice, форк OpenOffice.org 2010 года. Второе: инструкции к этим инструментам лежат в виде читаемых файлов рядом с бинарниками, и их можно изучить как пример того, как крупный вендор пишет skills для своей модели.</p><p>Источники: <a href="https://simonwillison.net/2026/Sep/1/codex-libreoffice/">Simon Willison: Codex bundles LibreOffice</a>, <a href="https://help.openai.com/en/articles/20001276-moving-to-the-new-chatgpt-desktop-app">OpenAI Help: Moving to the new ChatGPT desktop app</a></p><p>Изображение на обложке: Tproger</p>]]></content:encoded>
    </item>
    <item>
      <title>Чистое API на Node.js: практическое руководство</title>
      <link>https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd</link>
      <comments>https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd</guid>
      <description><![CDATA[<p>Как построить поддерживаемое REST API на Node.js: слои, Zod, единые ошибки, версионирование и Swagger. Проверьте свою архитектуру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chistoe-api-na-node-js-prakticheskij-gajd">Чистое API на Node.js: практическое руководство</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Jun 2026 11:00:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваше Node.js-приложение начиналось с одного server.js, а через полгода превратилось в лабиринт маршрутов, где бизнес-логика растворилась в обработчиках Express — эта статья для вас. Чистое API проектируется не ради красоты, а чтобы команда могла добавлять конечные точки, не боясь сломать соседние.</p><p>Разберём минимальный, но готовый к продакшену скелет: разделение слоёв, валидацию входных данных, централизованную обработку ошибок, версионирование, ограничение частоты запросов и автоматическую документацию. Все принципы применимы и к Express, и к Fastify, и к NestJS.</p><p>Чистое API — это прежде всего разделение ответственности: роутер знает маршруты, контроллер переводит HTTP в вызовы сервиса, сервис отвечает за бизнес-логику, а схема проверяет входные данные. Такой подход делает код предсказуемым при любом масштабе.</p><p>Чистое API — это, прежде всего, разделение ответственности: роутеры, контроллеры, сервисы и валидация живут в разных слоях.</p><p>Валидация с помощью Zod выполняется на границе — до того, как запрос попадёт в бизнес-логику.</p><p>Централизованный обработчик ошибок — единственное место, где исключения превращаются в HTTP-ответы.</p><p>Стоит закладывать версионирование и документацию OpenAPI с первого дня: позже это обойдётся дороже.</p><p>Fastify и NestJS дают те же архитектурные идеи из коробки, но логика слоёв от этого не меняется.</p><h2>Что мы будем строить</h2><p>Возьмём намеренно простой домен — каталог товаров. Нам важна не бизнес-логика, а структура. К концу у нас будет REST API с единым форматом ответов, валидацией, версионированием по пути /api/v1, ограничением частоты запросов и интерактивной документацией Swagger.</p><h2>Структура проекта</h2><p>Прежде чем писать код, договоримся, где что лежит. Каждая фича — отдельная папка, а не рассыпанный по проекту набор файлов.</p><ul><li>api/v1/ — все маршруты версионированы с первого дня. Добавить v2 позже можно новой папкой, а не рефакторингом.</li><li>products/ — фичевая папка владеет роутером, контроллером, сервисом и схемой.</li><li>middleware/ — сквозная функциональность: защита, логирование, лимиты.</li><li>lib/ — утилиты без привязки к фреймворку.</li></ul><h2>Разделяем ответственность</h2><p>Самая частая ошибка в Express-приложениях — бизнес-логика внутри обработчика маршрута. Там же появляется валидация, работа с базой данных и формирование ответа. При росте проекта такой файл становится опасным для изменений.</p><h3>Роутер знает только «куда идти»</h3><h3>Промежуточный обработчик валидации</h3><p>Промежуточный обработчик validateRequest проверяет body, params и query до попадания в контроллер. Если данные не проходят проверку, ошибка передаётся в централизованный обработчик.</p><h3>Контроллер переводит HTTP в вызовы сервиса</h3><p>Контроллер не знает, где хранятся товары. Его задача — извлечь параметры из запроса, вызвать сервис и вернуть ответ. Всё остальное передаётся в централизованный обработчик ошибок через next(error).</p><h3>Сервис содержит бизнес-логику</h3><p>Сервис не зависит от HTTP. Когда придёт время заменить хранилище в памяти на настоящую базу данных, потребуется поправить только этот файл.</p><h2>Валидация на границе с Zod</h2><p>Любое API, принимающее внешние данные, должно их проверять. Без валидации один некорректный запрос способен превратиться в ошибку времени выполнения, некорректную запись в базе или уязвимость.</p><p>Zod даёт две вещи сразу: проверку во время выполнения и типы TypeScript, выведенные из одной схемы. Промежуточный обработчик validateRequest проверяет body, params и query до того, как запрос попадёт в контроллер. Если данные невалидны, дальше они не идут.</p><h2>Единый обработчик ошибок</h2><p>Разбросанная обработка ошибок — один из главных источников хаоса: где-то возвращается { error: '...' }, где-то { message: '...' }, а где-то случайно отдаётся HTML-страница. Решение — один обработчик, через который проходят все исключения.</p><p>Теперь клиент всегда получает предсказуемую форму ответа, а добавление логирования или отправки ошибок в мониторинг — однострочное изменение в одном месте.</p><h2>Единый формат ответов</h2><p>Успешный ответ всегда выглядит как { success: true, data: ... }, а ошибка — как { success: false, error: { code, message, details } }. Фронтенд или сторонний интегратор знает, чего ожидать от любого эндпоинта.</p><h2>Версионирование API</h2><p>Версионировать API с первого дня стоит недорого. Добавить версию позже — значит ломать существующих клиентов или городить сложную миграцию.</p><p>Новая версия — новая папка src/api/v2/ и новый префикс. Старые клиенты продолжают работать на /api/v1.</p><h2>Ограничение частоты запросов</h2><p>Rate limiting защищает API от случайных и намеренных перегрузок. Настроить его в Express помогает пакет express-rate-limit.</p><p>Глобальный лимит распространяется на все запросы; операции, которые изменяют данные, ограничены жёстче. Ответ тоже соответствует единому формату ошибки.</p><h2>Документация OpenAPI и Swagger</h2><p>API без документации годится только для автора. С помощью swagger-jsdoc и swagger-ui-express можно получить интерактивную документацию прямо из JSDoc-комментариев в роутерах.</p><p><b>Совет:</b><br />Держите описания эндпоинтов в одном файле с маршрутами, а glob в swagger.ts настройте на файлы, доступные во время работы приложения. Лучше генерировать спецификацию на этапе сборки, чем полагаться на исходники TypeScript.</p><h2>Fastify и NestJS: альтернативы Express</h2><p>Всё, что мы разобрали, работает и в Express. Но если вы начинаете проект с нуля, стоит взглянуть на альтернативы.</p><ul><li>Fastify — быстрее Express в бенчмарках (порой в два раза), имеет встроенный логгер Pino и валидацию по схеме. Разделение слоёв остаётся на совести разработчика.</li><li>NestJS — популярен в крупных компаниях: слои модулей, контроллеров и сервисов навязаны архитектурой, что упрощает введение новых разработчиков в проект.</li><li>Express — остаётся лучшим выбором, если вы присоединяетесь к существующему проекту или команда уже знает экосистему.</li></ul><p>Архитектурные принципы — разделение слоёв, единый формат ошибок, валидация на границе — не зависят от фреймворка. Меняется только синтаксис.</p><h2>FAQ</h2><h3>Минимальный набор для старта</h3><p>Для самостоятельного запуска понадобятся базовые зависимости и алиасы путей в tsconfig.json. Объявите @/* на папку src, и примеры заработают без ручных правок импортов.</p><h2>Выводы</h2><blockquote>Чистая структура API — это не переусложнение. Это минимум, при котором бэкенд можно поддерживать нескольким людям.</blockquote><p>Мы собрали минимальный, но масштабируемый каркас: папки по фичам, разделённые слои, валидацию на границе, централизованную обработку ошибок, единый формат ответов, версионирование, лимиты и автоматическую документацию. Ни один из этих шагов сложный сам по себе. Их ценность — в сочетании и в том, чтобы сделать всё это до того, как код разрастётся.</p><p>Если начинаете новый Node.js-проект, не откладывайте структуру «на потом». А в существующем — попробуйте вынести валидацию в схему и собрать ошибки в одном обработчике. Потом всегда дороже.</p><h2>Источники</h2><p>Идеи и примеры в статье основаны на материале Gavin Cettolo «<a href="https://dev.to/gavincettolo/clean-api-design-in-nodejs-a-practical-guide-3a32">Clean API Design in Node.js: A Practical Guide</a>» (dev.to).</p>]]></content:encoded>
    </item>
    <item>
      <title>Vite+: один CLI вместо разрозненного стека — полный гайд</title>
      <link>https://tproger.ru/articles/vite-odin-cli-vmesto-pyati-instrumentov-polnyj-gajd</link>
      <comments>https://tproger.ru/articles/vite-odin-cli-vmesto-pyati-instrumentov-polnyj-gajd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vite-odin-cli-vmesto-pyati-instrumentov-polnyj-gajd</guid>
      <description><![CDATA[<p>Полный гайд по Vite+ — CLI от VoidZero, объединяющему Vite, Oxlint, Oxfmt и Vitest. Установка, конфигурация и миграция проекта. Проверьте, подходит ли вам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vite-odin-cli-vmesto-pyati-instrumentov-polnyj-gajd">Vite+: один CLI вместо разрозненного стека — полный гайд</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 18 May 2026 07:39:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современный JavaScript-проект обычно собирает инструменты по одному: Vite для сборки, ESLint для линтинга, Prettier для форматирования, Vitest для тестов, NVM для версий Node.js — и отдельные скрипты, которые всё это склеивают. Это работает, но превращается в отдельную точку обслуживания. Каждый инструмент живёт в своём конфиг-файле, с собственными релизами и режимами отказа. Vite+ предлагает выход: один бинарник vp, который заменяет большую часть этого стека.</p><p><b>Vite+</b> — бесплатный open-source CLI от VoidZero, объединяющий Vite, Vitest, Oxlint, Oxfmt, Rolldown, tsdown, Vite Task и менеджмент версий Node.js в одном инструменте.</p><p>Vite+ объединяет 7+ инструментов (Vite, Vitest, Oxlint, Oxfmt, Rolldown, Vite Task, vp env) под единым CLI-бинарником vp.</p><p>Требует Node.js 20.19+ или 22.12+. При более старой версии обновление обязательно.</p><p>Для новых Vite-проектов — удобен сразу. Для крупных production-кодовых баз с кастомными ESLint-плагинами — тестировать осторожно.</p><p>Единая точка конфигурации: vite.config.ts вместо .eslintrc, .prettierrc, vitest.config.ts и .nvmrc.</p><p>Команда vp check запускает форматирование, линтинг и проверку типов за один шаг.</p><h2>Что входит в Vite+</h2><p>Vite+ спроектирован так, чтобы один CLI заменил набор привычных команд. Вот что он консолидирует:</p><ul><li><b>Vite</b> — дев-сервер и production-сборка через vp dev / vp build</li><li><b>Rolldown</b> — bundler следующего поколения, используемый Vite 8 вместо Rollup</li><li><b>Oxlint</b> — быстрый линтер для JS/TS, совместимый с большинством ESLint-правил</li><li><b>Oxfmt</b> — форматтер кода, заменяющий Prettier для большинства проектов</li><li><b>Vitest</b> — тесты, интегрированные с Vite-экосистемой</li><li><b>Vite Task</b> — запуск задач в монорепозитории с кэшированием (альтернатива Turborepo)</li><li><b>vp env</b> — управление версиями Node.js без NVM или FNM</li></ul><p>Ключевое преимущество — не только скорость, но и согласованность: меньше конфиг-файлов, меньше точек, в которых что-то может разъехаться.</p><h2>Когда Vite+ имеет смысл</h2><p>Vite+ подходит не для каждой ситуации. Вот ориентир:</p><ul><li><b>Используйте</b>, если начинаете новый Vite-проект — меньше конфигурации с самого старта</li><li><b>Используйте</b>, если хотите единую команду для форматирования, линтинга и проверки типов</li><li><b>Используйте</b>, если нужно pin-нуть Node.js-версию в проекте без NVM/FNM</li><li><b>Осторожно</b>, если production-кодовая база зависит от нишевых ESLint-плагинов или кастомных правил</li><li><b>Осторожно</b>, если в монорепозитории уже настроен Turborepo или Nx</li><li><b>Осторожно</b>, если поведение Prettier жёстко зафиксировано и команда не готова к разнице в форматировании</li></ul><h2>Что нужно для начала</h2><p>Важная версионная оговорка: <b>Vite 8 требует Node.js 20.19+ или 22.12+</b>. Если на машине установлена более старая версия — обновите перед установкой Vite+.</p><p>Для работы с этим гайдом понадобится:</p><ul><li>Node.js 20.19+ или 22.12+</li><li>Базовое знакомство с командной строкой</li><li>Терминал на macOS, Linux или Windows</li><li>Существующий Vite-проект, если хотите протестировать миграцию</li></ul><p>ESLint, Prettier, Vitest, NVM или FNM глобально устанавливать не нужно — Vite+ берёт это на себя.</p><h2>Установка Vite+</h2><p>Vite+ устанавливается как единый бинарник vp. На macOS или Linux: Официальный сайт проекта: <a href="https://vite.plus">vite.plus</a>.</p><p>На Windows в PowerShell:</p><p>После установки перезапустите терминал и проверьте CLI:</p><h2>Создание проекта</h2><p>Для создания нового проекта используется команда vp create. Интерактивные подсказки предложат выбрать фреймворк, шаблон и пакетный менеджер:</p><p>После создания проекта переходим в директорию и запускаем дев-сервер:</p><p>Команда vp dev делает то же, что npm run dev, pnpm dev или yarn dev — только теперь команда единая для всей команды, независимо от пакетного менеджера.</p><h2>Конфигурация в vite.config.ts</h2><p>Вся конфигурация Vite+ собирается в одном файле — vite.config.ts. Вместо разбросанных .eslintrc, .prettierrc, vitest.config.ts и .nvmrc — один типизированный файл. Базовая конфигурация выглядит так:</p><h3>Форматирование с Oxfmt</h3><p>Добавьте секцию fmt для настройки форматирования:</p><p>Запуск форматирования: vp fmt. Для большинства проектов Oxfmt заменяет Prettier — но перед миграцией production-кодовой базы прогоните его на отдельной ветке и проверьте diff: Oxfmt может форматировать иначе в отдельных случаях.</p><h3>Линтинг с Oxlint</h3><p>Oxlint работает быстро и поддерживает большинство ESLint-совместимых правил. Главное ограничение — совместимость плагинов. Если проект зависит от нишевых ESLint-плагинов или кастомных правил, перед полной заменой ESLint нужна тщательная проверка.</p><h3>Тесты с Vitest</h3><p>Запуск тестов: vp test. Vitest хорошо интегрируется с Vite-экосистемой и переиспользует ту же ментальную модель и инструментарий.</p><h2>Единая проверка с vp check</h2><p>После настройки форматирования, линтинга и тестов — запустите единую проверку качества:</p><p>Команда прогоняет форматирование, линтинг и проверку типов за один вызов. Если введена ошибка типа:</p><p>Vite+ сообщит о проблеме в терминале. Для автоматического исправления того, что можно исправить автоматически:</p><p>Важная оговорка: --fix не чинит всё подряд. Форматирование и часть lint-проблем — да, ошибки типов и логические баги — нет. Это инструмент автоисправления, а не замена ревью кода.</p><h2>Проверка staged-файлов перед коммитом</h2><p>В традиционном стеке для pre-commit проверок используют Husky и lint-staged. Vite+ консолидирует часть этого рабочего процесса через конфигурацию staged:</p><p>Vite+ предоставляет команду и конфигурацию staged-файлов — git hook при этом нужно настроить самостоятельно (Vite+ не делает это автоматически). После настройки это предотвращает попадание проблем с форматированием и типами в основную ветку.</p><h2>Миграция существующего Vite-проекта</h2><p>Для уже существующего Vite-проекта есть команда миграции:</p><p>Она переносит конфигурацию Oxlint, Oxfmt и lint-staged в vite.config.ts. Важно: не воспринимайте это как финальный шаг. Миграция — начало ревью, а не конец. Рекомендуемый порядок:</p><ol><li>Запустить vp migrate</li><li>Запустить vp check</li><li>Проверить изменения через git diff</li><li>Просмотреть сгенерированный конфиг, изменения в package.json и diff форматирования</li><li>Только после ревью — мёржить</li></ol><h2>Управление версиями Node.js через vp env</h2><p>Vite+ включает менеджмент версий Node.js через vp env. Зафиксировать конкретную версию для проекта:</p><p>Это гарантирует одинаковую версию рантайма у всех разработчиков и снижает риск environment-специфичных багов, особенно когда требования Vite к Node.js меняются между мажорными версиями. Можно заменить .nvmrc или FNM для команд, хотящих управлять всем через Vite+.</p><h2>Vite+ против традиционного инструментария</h2><p>Вот как Vite+ соотносится с привычным стеком по ключевым задачам:</p><ul><li><b>Дев-сервер</b>: npm run dev → vp dev</li><li><b>Production-сборка</b>: Vite + Rollup-конфиг → vp build</li><li><b>Форматирование</b>: Prettier + .prettierrc → Oxfmt через vite.config.ts</li><li><b>Линтинг</b>: ESLint + конфиг плагинов → Oxlint через vite.config.ts</li><li><b>Тесты</b>: отдельный vitest.config.ts → vp test</li><li><b>Проверка качества</b>: несколько package.json-скриптов → vp check</li><li><b>Версия Node.js</b>: .nvmrc или FNM → vp env pin</li><li><b>Staged-проверки</b>: Husky + lint-staged → staged-конфиг Vite+ с ручной настройкой hook'а</li><li><b>Задачи монорепозитория</b>: Turborepo/Nx → vp run через Vite Task</li></ul><h2>Текущие ограничения</h2><p>Vite+ перспективен, но не является универсальной заменой для всех JavaScript-проектов. Перед широким внедрением важно учесть:</p><ul><li><b>Зрелость экосистемы</b> — Vite+ новее инструментов, которые он консолидирует</li><li><b>Совместимость ESLint</b> — Oxlint поддерживает большинство правил, но не каждый плагин и кастомное правило</li><li><b>Форматирование</b> — Oxfmt может давать не полностью идентичный Prettier вывод в отдельных случаях</li><li><b>Фреймворк-специфичность</b> — Vite+ наиболее силён в Vite-экосистеме; framework-специфичное поведение нужно тестировать</li><li><b>Размер установки</b> — Vite 8 тяжелее Vite 7 из-за lightningcss и Rolldown</li><li><b>Изменения рабочего процесса</b> — замена привычных скриптов на vp требует документирования и адаптации команды</li></ul><blockquote>Vite+ — не волшебная замена каждого JavaScript-инструмента. Это серьёзная попытка сократить фрагментацию frontend-инструментария, сделав Vite точкой входа в более интегрированный рабочий процесс разработки.</blockquote><h2>Выводы</h2><p>Vite+ делает практическую ставку: JavaScript-инструментарий легче поддерживать, когда бандлер, линтер, форматтер, тест-ранер, task runner и менеджер рантайма спроектированы работать вместе. Для новых Vite-проектов это сразу даёт меньше конфиг-файлов, меньшую поверхность команд и единый vp check для стандартных проверок.</p><p>Для крупных production-приложений лучший подход — постепенное внедрение: протестировать на ветке, проверить diff форматирования, убедиться в покрытии линтинга, проверить поведение CI. Инструмент не ставит точку в эволюции frontend-инструментария — он указывает направление: меньше фрагментации, больше интеграции.</p><p>Источник: <a href="https://blog.logrocket.com/vite-plus-guide-cli-javascript-tooling/">Vite+ guide: One CLI for JavaScript tooling</a> — LogRocket Blog, Emmanuel John, 12 мая 2026 г. Репозиторий Vite+: <a href="https://github.com/voidzero-dev/vite-plus">github.com/voidzero-dev/vite-plus</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я перестал метаться между нейросетями и устроил им общий экзамен</title>
      <link>https://tproger.ru/articles/kak-ya-perestal-metatsya-mezhdu-nejrosetyami-i-ustroil-im-obshhij-ekz</link>
      <comments>https://tproger.ru/articles/kak-ya-perestal-metatsya-mezhdu-nejrosetyami-i-ustroil-im-obshhij-ekz?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[AIguide]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-perestal-metatsya-mezhdu-nejrosetyami-i-ustroil-im-obshhij-ekz</guid>
      <description><![CDATA[<p>Я рассказываю, как перестал доверять рандомным «вау»-кадрам и устроил честный экзамен нейросетям для генерации изображений. Замерял качество, скорость, форматы и стоимость на реальных задачах, а в итоге собрал понятный пайплайн выбора AI-сервисов без магии и маркетинга.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-perestal-metatsya-mezhdu-nejrosetyami-i-ustroil-im-obshhij-ekz">Как я перестал метаться между нейросетями и устроил им общий экзамен</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 May 2026 09:54:04 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Оглавление</h2><ol><li>Как я утонул в генерациях</li><li>Экзамен вместо «прыжков» по сервисам</li><li>Небольшой технический конвейер</li><li>Зачем цифры важнее впечатлений</li><li>Простой тест на форматы</li><li>Как ведут себя Riverflow, Flux и Seedream</li><li>Отчёты, артефакты и спокойная аналитика</li><li>Сценарий «восемь формулировок»</li><li>Зрелый подход к выбору AI</li></ol><p>В прошлой статье я рассказывал, как собрал тестовый стенд для AI‑генерации. Теперь — про то, как превратил его в живой процесс с разными сценариями и метриками.</p><h2>1. Как я утонул в генерациях</h2><p>Я осознал что  в очередной раз листал чат и не мог найти тот самый удачный вариант обложки.</p><p>Ситуация повторялась по одному и тому же шаблону. Запускаю один сервис — получаю результат, морщу лицо и сразу иду в другой. Там промпт приходится переформулировать: движок по-другому читает слова. В третьем генераторе наконец складывается приятная композиция, но детализация рушит весь смысл. Через пару дней на диске лежит россыпь PNG, а я уже не понимаю, где оказался осознанный успех, а где просто повезло. В какой-то момент я сказал себе: стоп. Случайные «попробую тут, попробую там» не ведут никуда.</p><h2>2. Экзамен вместо «прыжков» по сервисам</h2><p>Тогда я придумал простое правило. Любой сервис, который претендует на место в моём рабочем наборе, должен пройти экзамен. Не приятную беседу с общими вопросами, а одинаковый для всех, жёсткий сценарий. Без исключений и любимчиков.</p><h2>3. Небольшой технический конвейер</h2><p>Реализация получилась до обидного простой. Node.js, TypeScript, запуск через tsx. Список моделей вынесен в отдельный конфиг, API-ключ лежит в .env, а команды запуска выглядят вроде npm run test:niche или npm run test:collage-2x2-eight-prompts. Я взял творческий хаос и сложил его в аккуратный pipeline.</p><p>Дальше всё происходит автоматически: запускаешь тест — и один и тот же набор задач последовательно проходит через всех кандидатов. Мой вклад заканчивается на нажатии Enter.</p><h2>4. Зачем цифры важнее впечатлений</h2><p>Зачем вообще так усложнять? Потому что мантра «любая нейросеть — она и есть нейросеть» на практике не работает. Разброс колоссальный. Один сервис очень аккуратно держит геометрию кадра, но мелкие детали превращает в мыло. Другой рисует фактуру так, что хочется печатать и вешать, но при запросе «коллаж 3×3 с чёткими границами» внезапно решает творчески переосмыслить сетку. Третий стабильно отвечает и по времени, и по предсказуемости, но на сотне запросов выписывает такой чек, что хочется закрыть вкладку.</p><p>Если не фиксировать метрики, всё превращается в разрозненные ощущения. Сегодня это кажется идеальным инструментом, завтра тот же сервис тихо сжигает бюджет на десятке однотипных задач. И ты не можешь точно сказать, в какой момент всё поехало.</p><h2>5. Простой тест на форматы</h2><p>Возьмём самый базовый пример — проверка соотношения сторон. Формулировка элементарная: закат над горами, три варианта — 3:4, 1:1 и 16:9. Казалось бы, минимальный уровень адекватности. Но нет.</p><figure><img src="https://media.tproger.ru/user-uploads/138437/2026-05-12/967623f7-34c5-4109-ae88-7c3ccd8122f0.webp" alt="" /><figcaption>таблица 1</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/138437/2026-05-12/c77d406d-862c-492c-bc89-733b8cb50349.webp" alt="" /><figcaption>таблица 2</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/138437/2026-05-12/2b48f70f-e37d-4ab1-bc2a-826a5fa72d56.webp" alt="" /><figcaption>таблица 3</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/138437/2026-05-12/1b27a8d8-19e1-4a94-968b-475fc8cea34c.webp" alt="" /><figcaption>таблица 4</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/138437/2026-05-12/ad59138a-e1f9-49f7-ae5c-03c3819768e9.webp" alt="" /><figcaption>таблица 5</figcaption></figure><p>Достаточно пробежать глазами столбец со статусом. Три запроса — три быстрых проверки «на глаз». Там, где на 3:4 и 16:9 горит FAIL, модель откровенно игнорирует задачу и рисует квадрат или удобный для себя формат. И это при том, что промпт простейший: не сложная сцена, не коллаж — всего лишь «закат, горы и нужная рамка».</p><h2>6. Как ведут себя Riverflow, Flux и Seedream</h2><p>Если посмотреть на результаты, riverflow-v2-pro аккуратно соблюдает все три формата. Но за эту аккуратность приходится платить временем: портретная картинка генерируется около 360 секунд. Шесть минут — роскошь, если у вас в руках горящий дедлайн. Упрощённая версия, riverflow-v2-fast, выдаёт правильные форматы за секунды и остаётся в адекватных рамках по времени — это уже инструмент для реальных задач.runware+2</p><p>С моделями Flux история другая. Почти вся линейка black-forest-labs стабильно промахивается по нестандартным форматам: колонка «Соотношение» упорно показывает 4/3 или 1/1, хотя в запросе чётко указано «16:9, wide landscape». Относительно ровно ведёт себя только flux.2-max, который хотя бы честно выдаёт квадрат, но проблемы с другими соотношениями никуда не деваются.github+1</p><p>Seedream-4.5 от Bytedance, напротив, поражает скоростью: ответы прилетают за 7–8 секунд, но модель регулярно игнорирует заданный формат и возвращает квадрат 2048×2048. Для макета, привязанного к конкретным пропорциям — сторис, постера или баннера — такая «быстрота» только ломает всю вёрстку.eachlabs+1</p><h2>7. Отчёты, артефакты и спокойная аналитика</h2><p>Вся эта конструкция нужна ради пары простых эффектов. Каждый запуск сохраняет статус, итоговый размер, время генерации и, где это важно, стоимость. После завершения прогона скрипты собирают HTML-отчёт. Открываешь его в браузере — и на одном экране сразу видно, кто действительно справился, а кто только шумит.</p><p>Особенно сильно это помогает в задачах, где критична композиция: нужна ровная сетка 2×2 или 3×3 без самодеятельности в духе «я тут чуть подвину, так красивее». Это как раз те случаи, когда от сервиса нужна дисциплина, а не внезапные художественные «инициативы».</p><h2>8. Сценарий «восемь формулировок»</h2><p>Отдельный пласт наблюдений даёт сценарий «восемь формулировок» (collage-2x2-eight-prompts). Суть задачи не меняется, контент остаётся одним и тем же. Я варьирую только подачу: где-то пишу запрос грубо и коротко, где-то — щадяще и структурно, местами добавляю лишний контекст.</p><p>На этом месте становится видно, как модель реагирует не на саму тему, а на стиль запроса. Одна и та же нейросеть спокойно выдерживает строгое техническое ТЗ и проваливается при формулировке «сделай красиво, сам понимаешь». После таких тестов по-другому относишься к промптам: начинаешь формулировать точнее, понимая, какая модель как «слушает» текст. И внезапно исчезают загадки в духе «почему здесь получилось, а там всё развалилось».</p><h2>9. Зрелый подход к выбору AI</h2><p>Главный вывод из всей этой истории довольно приземлённый. Выбирать AI-сервисы по рекламе, по восторженным постам в Telegram или по одному удачному демо-кадру — путь к разочарованию. Их нужно ставить в одинаковые условия. Прогонять по своим реальным задачам, а не по чужим презентациям. Сохранять результаты и сравнивать их по конкретным цифрам.</p><p>Когда делаешь так, выбор перестаёт быть эмоциональной пыткой в стиле «нравится / не нравится». Он превращается в спокойное рабочее решение: этот сервис — для быстрых черновиков, этот — для вылизанной композиции, этот — для длинных и сложных запросов, в которых ошибка по смыслу недопустима. В этот момент генерация перестаёт быть магическим ритуалом с сюрпризами и превращается в нормальный, предсказуемый инструмент. Таким, каким он и должен был быть изначально.</p>]]></content:encoded>
    </item>
    <item>
      <title>Denwer SE: Возрождение легендарного локального веб-сервера на современном стеке</title>
      <link>https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so</link>
      <comments>https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тишов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so</guid>
      <description><![CDATA[<p>Помните диск Z:, иконку джентльмена и магию Run.exe? Денвер вернулся. Denwer SE: Python вместо Perl, HTTPS без красных экранов, свежий PHP и портативность. И да, он всё ещё помещается на флешку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so">Denwer SE: Возрождение легендарного локального веб-сервера на современном стеке</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Laravel]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 May 2026 10:11:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы начинали веб-разработку в середине 2000-х, то наверняка помните Denwer — «джентльменский набор веб-разработчика». Иконка в виде человека в шляпе, виртуальный диск Z:, папка <i>home/localhost/www</i> — всё это было ритуалом, который упрощал жизнь тысячам разработчиков. Но оригинальный Denwer безнадёжно устарел: Perl-скрипты, 32-битные сборки, поддержка только древних версий PHP и MySQL. Ему на смену пришли громоздкие комбайны вроде Open Server или сложные для новичков Docker-контейнеры.</p><p>Однако недавно проект получил второе дыхание. Разработчик Александр Тишов (Amro) — создатель <a href="https://seditio.org" rel="nofollow">CMS Seditio</a> и основатель веб-студии <a href="https://avego.org" rel="nofollow">«Авего»</a>  — выпустил <a href="https://seditio.org/dev/denwer-se-lokalnyj-veb-stek-dlya-windows-apache-php-mysql-mariadb" rel="nofollow">Denwer SE (Second Edition)</a>. Это не просто обновление, а полный реинжиниринг с сохранением классической философии: портативность, скорость работы и привычная структура каталогов.</p><p>В этой статье разберём, что изменилось под капотом, почему панель управления переехала с Perl на Python, как работает автоматический HTTPS с собственным корневым сертификатом и зачем нужен зоопарк версий PHP от 5.6 до 8.5.</p><h2>Краткий экскурс: от Denwer 3 до Denwer SE</h2><p>Оригинальный Denwer (сокращение от Джентельменский Набор Веб-разработчика) появился в начале 2000-х. Он представлял собой связку Apache + PHP + MySQL, упакованную в самораспаковывающийся архив. Главные фишки:</p><ul><li>Виртуальный диск (по умолчанию Z:), который монтировался через subst.</li><li>Автоматическое создание виртуальных хостов по именам папок в home.</li><li>Консольные exe-файлы (Run, Stop, Restart) без графического окна.</li></ul><p>Проблемы оригинала:</p><ul><li>Управление на Perl — медленно, тяжело поддерживать в Windows.</li><li>Только 32-битные компоненты.</li><li>Невозможно быстро переключать версии PHP или БД.</li><li>Отсутствие нормального HTTPS (только самоподписанные сертификаты с ошибками в браузере).</li><li>Поддержка прекратилась в 2016 году.</li></ul><p>Denwer SE решает все эти проблемы, оставаясь при этом таким же портативным — достаточно скопировать папку на флешку или в облачный каталог.</p><h2>Архитектура: Python вместо Perl</h2><p>Denwer SE — панель управления написана на Python и скомпилирована в один EXE-файл (через PyInstaller).</p><p>Внутри служебной папки <b>denwer\</b> лежат:</p><ul><li>DLL-версия Python — интерпретатор, который использует основной исполняемый файл.</li><li>Скомпилированные модули .pyd — в том числе GUI на базе Tcl/Tk для оконного интерфейса и системного трея.</li><li>Минимальный набор библиотек для управления службами, правки hosts и генерации сертификатов.</li></ul><p>Это даёт несколько преимуществ:</p><ul><li>Портативность — панель ищет соседние папки home и usr, поэтому каталог со стеком можно переносить куда угодно без переустановки.</li><li>Скорость — Python-скрипты запускаются быстрее, чем Perl, особенно на холодном старте.</li><li>Читаемость кода — разработчику проще поддерживать и расширять функционал.</li></ul><h2>Полный переход на x64</h2><p>Оригинальный Denwer навсегда остался 32-битным, что в современных реалиях просто неприемлемо. Denwer SE собирается исключительно под x64:</p><ul><li>Apache (версия 2.4.x) — 64-битный.</li><li>Все модули PHP (от 5.6 до 8.5) — Thread Safe x64.</li><li>MySQL / MariaDB — 64-битные сборки.</li></ul><p>Системные требования — Windows 7/8/10/11 (x64). Для работы компонентов потребуются Microsoft Visual C++ Redistributable (VC11, VC12, VC14, VC15). Разработчик положил установщики этих пакетов в папку <b>vcredist\</b> — при необходимости можно доустановить вручную.</p><h2>Структура каталогов: преемственность и гибкость</h2><p>Denwer SE сохранил классическую структуру, чтобы старые пользователи не ломали голову:</p><p>Главный конфиг — usr\configuration.txt. В нём задаются пути без жёсткой привязки к букве диска, например:</p><p>При старте панель монтирует виртуальный диск (по умолчанию Z:) и динамически подставляет путь через переменную <b>subst_drive</b>.</p><h2>Управление версиями PHP и БД без танцев с бубном</h2><p>В Denwer SE встроен менеджер версий. Вы просто выбираете из выпадающего списка нужную версию PHP (например, 8.3 или 5.6) — панель сама правит конфигурацию Apache.</p><p>Как это работает под капотом:</p><p>В папке usr/local/apache/php лежат подкаталоги php5.6, php7.4, php8.3 и т.д..</p><p>В каждом из них есть файл php-denwer.conf— шаблон для подключения модуля к Apache. При выборе версии этот файл копируется в <b>conf/extra/httpd-denwer.conf</b>, который затем включается в основной httpd.conf.</p><p>Если вы хотите добавить свою сборку PHP (например, PHP 8.4-rc), достаточно:</p><ul><li>Распаковать x64 Thread Safe версию в отдельный каталог внутри php\.</li><li>Создать php-denwer.conf по образцу.</li><li>Убедиться, что все DLL от VC++ установлены.</li></ul><p>Аналогично для баз данных: переключение между MySQL 5.7 и MariaDB 11.8 происходит через тот же интерфейс. В каталоге СУБД может лежать файл <b>db-denwer.conf</b>, который при старте копируется в <b>my.ini</b>.</p><h2>HTTPS, который не бесит: локальный Root CA</h2><p>Самое болезненное место при локальной разработке это самоподписанные сертификаты. Браузеры постоянно ругаются, приходится кликать «Принять риск». Для командной разработки это вообще катастрофа: каждый участник должен сгенерировать свой сертификат и добавить в исключения.</p><p>Denwer SE решает проблему элегантно — он создаёт собственный корневой центр сертификации (CA) и подписывает им сертификаты для всех ваших локальных доменов.</p><p>Как это работает:</p><ol><li>При первом запуске (если найден OpenSSL) панель генерирует ключи denwer-ca.key и сертификат denwer-ca.crt в папку usr/local/apache/conf/cert/denwer-ca/.</li><li>Для каждого виртуального хоста (папки в home/) автоматически создаётся сертификат в conf/cert/&lt;domain&gt;/.</li><li>Все сертификаты хостов подписаны локальным CA.</li></ol><p>Чтобы браузер доверял им, нужно один раз установить <b>denwer-ca.crt</b> в хранилище «Доверенные корневые центры сертификации» Windows. Для этого в панели есть специальная кнопка (требует прав администратора).</p><p>После этого любые HTTPS-запросы к локальным хостам работают без единого предупреждения.</p><h2>Удобства для разработчика (DX)</h2><p>В версии 1.2.4 добавили несколько фич, которые экономят время каждый день:</p><ul><li>Лог с таймштампами — каждая строка в окне панели имеет префикс [чч:мм:сс]. Теперь видно, сколько секунд сервер поднимается и где возможны задержки.</li><li>Прямой доступ к php.ini и my.cnf — рядом со списками версий появились кнопки, открывающие конфигурацию именно активной версии.</li><li>Автоматическое ведение hosts — панель в реальном времени сканирует home/, находит новые домены и прописывает их в C:\Windows\System32\drivers\etc\hosts. Журнал добавляемых записей сохраняется в usr\AddedHosts.txt. При остановке стека лишние строки удаляются.</li><li>Для смены версии PHP или базы данных панель требует полной остановки всех служб. Вы нажимаете «Стоп», меняете версию в списке, затем «Старт» — и стек поднимается уже с новыми настройками. Автоматический перезапуск без вашего участия работает только для Apache: когда вы добавляете новый домен в папку home/, панель сама переписывает vhosts.conf и перезапускает веб-сервер, не трогая БД.</li></ul><h2>Почему не Open Server или Docker?</h2><p>Этот вопрос закономерно возникает у всех, кто видит очередной локальный веб-сервер. Ведь есть уже давно Open Server Panel, Laragon, XAMPP, а для продвинутых — Docker. Зачем ещё один?</p><p><b>Open Server</b> — мощный и удобный комбайн с десятками версий PHP и настройками «на века». Но он разворачивается в системе не портативно: создаёт папки в ProgramData, пишет в реестр, а запуск может занимать 5–10 секунд. Denwer SE, напротив, полностью переносим: скопировал папку на флешку или в облачный каталог — и всё работает. Запуск стека — буквально 1–2 секунды, что критично, когда вы десятки раз за день перезапускаете сервер для тестов.</p><p><b>Docker</b> — индустриальный стандарт для изоляции и воспроизводимости окружений. Но для локальной разработки простого сайта он часто избыточен. Вам нужно разобраться в образах, контейнерах, пробросе портов, volume’ах и docker-compose.yml. А в Denwer SE вы просто создали папку в home/ — и готово. Никакой работы с командной строкой, никакого потребления гигабайт ОЗУ на фоновую службу Docker Desktop.</p><p><b>Laragon</b> — быстрый, портативный, поддерживает не только PHP, но и Node.js, Python, Go. Но он ориентирован на современные фреймворки, особенно Laravel. Denwer SE же сделан для тех, кто вырос на классическом Денвере: виртуальный диск Z:, папка home/имя_домена/www, минимум настроек. Не нужно переучиваться — просто распаковал и работаешь как 10 лет назад, но с новыми версиями PHP и HTTPS.</p><h2>Как начать пользоваться Denwer SE</h2><ol><li>Скачать архив с <a href="https://seditio.org/dev/denwer-se-lokalnyj-veb-stek-dlya-windows-apache-php-mysql-mariadb" rel="nofollow">официального сайта автора</a>.</li><li>Распаковать в любое место, например C:\web\DenwerSE\.</li><li>Запустить DenwerSE.exe — если нет прав администратора, попросит их для монтирования диска и правки hosts.</li><li>Нажать «Запустить» — появится виртуальный диск Z:, а в системном трее иконка.</li><li>Создать папку сайта — например, home\myproject.local и положить туда index.php.</li><li>Открыть в браузере http://myproject.local/ (или https://myproject.local/). HTTPS будет работать сразу после установки корневого сертификата (кнопка в панели).</li></ol><p>По умолчанию пароль к MySQL/MariaDB — пустая строка (пользователь <b>root</b>). При желании его можно сменить через phpMyAdmin.</p><h2>Заключение</h2><p>Denwer SE — это не просто ностальгический проект. Это действительно современный инструмент, который доказывает, что концепция «локального сервера в одну папку» всё ещё актуальна. Отказ от Perl в пользу Python, менеджер версий PHP/БД, нормальный HTTPS, портативность и мгновенный запуск — всё это делает его отличным выбором для быстрого прототипирования, тестирования легаси-кода или обучения веб-разработке.</p><p>Если вы устали ждать, пока Open Server применит настройки, или не хотите разбираться в Docker Compose — попробуйте <b>Denwer SE</b>. Вероятно, он напомнит вам старые добрые времена, но уже без боли устаревших технологий.</p><ul><li>Автор проекта: Александр Тишов
	(Amro), разработчик CMS Seditio.</li><li>Лицензия: Freeware.</li><li>Совместимость: Windows 7/8/10/11 x64.</li></ul><p>Исходники панели управления не открыты (распространяется скомпилированный EXE), но архитектура и конфиги полностью прозрачны. В планах — добавить поддержку Nginx в качестве альтернативы. Следите за обновлениями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как Саймон Уиллисон перенёс LiteParse в браузер за 59 минут — перевод</title>
      <link>https://tproger.ru/translations/kak-sajmon-uillison-perenyos-liteparse-v-brauzer-za-59-minut-pe</link>
      <comments>https://tproger.ru/translations/kak-sajmon-uillison-perenyos-liteparse-v-brauzer-za-59-minut-pe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kak-sajmon-uillison-perenyos-liteparse-v-brauzer-za-59-minut-pe</guid>
      <description><![CDATA[<p>Саймон Уиллисон за 59 минут с Claude Code перенёс LiteParse из Node.js CLI в браузер: PDF.js и Tesseract.js, приватно и без сервера. Перевод с разбором.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kak-sajmon-uillison-perenyos-liteparse-v-brauzer-za-59-minut-pe">Как Саймон Уиллисон перенёс LiteParse в браузер за 59 минут — перевод</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Apr 2026 12:30:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>59 минут с Claude Code и Opus 4.7 — и опенсорсный PDF-парсер LlamaIndex заработал прямо в браузере. Саймон Уиллисон перенёс <a href="https://simonw.github.io/liteparse/" rel="nofollow">LiteParse</a> из Node.js CLI в чистый браузерный JS: PDF.js и Tesseract.js делают весь парсинг локально, файл никуда не уходит.</p><p>Ниже — перевод <a href="https://simonwillison.net/2026/Apr/23/liteparse-for-the-web/" rel="nofollow">статьи Уиллисона</a>: что такое LiteParse, почему его удалось перенести в браузер и как выглядит вайб-кодинг, когда автор не читает ни строчки из получившегося HTML и TypeScript.</p><p><b>LiteParse от LlamaIndex</b> — классический PDF-парсинг без ИИ. Эвристики spatial text parsing вычисляют порядок чтения (колонки, подписи, сноски), а Tesseract OCR добирает сканы.</p><p><b>Браузерная версия</b> собрана из тех же PDF.js и Tesseract.js — никакого сервера, данные остаются на устройстве.</p><p><b>Процесс</b>: план в plan.md, команда «build it», очередь follow-up-промтов, Playwright + red/green TDD, деплой на GitHub Pages через Actions.</p><p><b>Время</b> в Claude Code на фазу сборки — 59 минут. Уиллисон не прочитал ни одной строки получившегося кода.</p><p><b>Уиллисон готов привязать к проекту репутацию</b> — редкий случай для его вайб-проектов. Статический сайт и полная приватность делают blast radius почти нулевым.</p><h2>Что такое LiteParse и зачем он нужен</h2><p>LlamaIndex выложили опенсорс-инструмент <a href="https://github.com/run-llama/liteparse" rel="nofollow">LiteParse</a> — Node.js CLI для извлечения текста из PDF. Что приятно: LiteParse не использует ИИ-модели. Это старый добрый PDF-парсинг с фолбеком на Tesseract OCR (или другой подключаемый OCR-движок) для файлов, где «текст» представлен картинками страниц, а не самим текстом.</p><p>Сложная задача, которую решает LiteParse, — выдать текст в нормальном порядке, несмотря на причудливые макеты PDF. Авторы называют это «spatial text parsing», пространственным парсингом: хитрые эвристики распознают многоколоночную вёрстку и группируют блоки так, чтобы текст читался линейно.</p><p>В документации LiteParse описан паттерн <a href="https://developers.llamaindex.ai/liteparse/guides/visual-citations/" rel="nofollow">Visual Citations with Bounding Boxes</a> — «визуальные цитаты с ограничивающими рамками». Уиллисону идея нравится: отвечать на вопросы по PDF и прикладывать к ответу обрезанный и подсвеченный фрагмент исходника — хороший способ поднять доверие к ответам RAG-системы (retrieval-augmented generation — когда LLM отвечает, подтягивая нужные куски из базы документов).</p><p>LiteParse задуман как CLI для агентов. Запускается вот так:</p><p>Уиллисон попробовал инструмент с Claude и быстро понял: оставаться CLI-приложением LiteParse вовсе не обязан. Он построен на PDF.js и Tesseract.js — двух библиотеках, с которыми автор уже <a href="https://simonwillison.net/2024/Mar/30/ocr-pdfs-images/" rel="nofollow">делал похожие штуки в браузере</a>. Единственная причина, почему у LiteParse до сих пор не было чистой браузерной версии, — её просто никто не сделал.</p><h2>Знакомство: LiteParse в браузере</h2><p>Зайдите на <a href="https://simonw.github.io/liteparse/" rel="nofollow">simonw.github.io/liteparse/</a> и попробуйте инструмент на любом PDF — всё работает прямо в вашем браузере. Интерфейс минимальный: перетаскиваете файл, выбираете режим (с OCR или без), на выходе получаете распознанный текст и pretty-printed JSON, оба с кнопкой Copy. Опционально можно вывести превью всех страниц PDF.</p><h2>Как это собрали с Claude Code и Opus 4.7</h2><p>Всё началось в обычном приложении Claude на iPhone. Уиллисон хотел пощупать LiteParse и загрузил с телефона случайный PDF с таким промтом:</p><blockquote>Clone https://github.com/run-llama/liteparse and try it against this file</blockquote><p>Обычный Claude теперь умеет клонировать репозитории прямо с GitHub и ставить пакеты из PyPI и npm — даже без доступа к остальному интернету из контейнера. Уиллисон часто так пробует новый опенсорс с телефона, не доставая ноутбук. После нескольких уточняющих вопросов (весь диалог можно <a href="https://claude.ai/share/44a5ed86-e5b5-4e14-90be-1eba1e0acd13" rel="nofollow">открыть в расшаренном транскрипте</a>) он спросил главное:</p><blockquote>Does this library run in a browser? Could it?</blockquote><p>Ответ был достаточно убедительным, чтобы попробовать всерьёз. Уиллисон открыл ноутбук, переключился на Claude Code. Форкнул оригинальный репозиторий на GitHub, склонировал локальную копию, создал новую ветку web и скопировал последний ответ Claude в файл <a href="https://github.com/simonw/liteparse/blob/web/notes.md" rel="nofollow">notes.md</a>. А потом сказал Claude Code:</p><blockquote>Get this working as a web app. index.html, when loaded, should render an app that lets users open a PDF in their browser and select OCR or non-OCR mode and have this run. Read notes.md for initial research on this problem, then write out plan.md with your detailed implementation plan</blockquote><p>Подобные проекты Уиллисон всегда начинает с плана. Иногда он включает у Claude «режим планирования», но здесь ему нужен был план как артефакт в репозитории — поэтому сразу plan.md. Это позволяет итеративно править сам план. Заметив, что Claude решил отложить «canvas-encode swap» (замену способа, которым PDF.js сохраняет страницы картинкой — без неё не работает превью страниц в браузерной версии) на v2, Уиллисон дописал:</p><blockquote>Update the plan to say we WILL do the canvas-encode swap so the screenshots thing works</blockquote><p>Через несколько коротких правок получился <a href="https://github.com/simonw/liteparse/blob/web/plan.md" rel="nofollow">plan.md</a>, который автор счёл достаточно хорошим для реализации. И сказал:</p><blockquote>build it.</blockquote><p>И дальше Уиллисон по большей части оставил Claude Code работать самому: возился с другими проектами, периодически заглядывал проверить прогресс. Параллельно подбрасывал подсказки в очередь. Queued-prompts не попадают в стандартный экспорт транскрипта Claude Code, но их можно вытащить из папки ~/.claude/projects/ командой rg queue-operation --no-filename | grep enqueue | jq -r '.content'. Ниже — выдержка из этих follow-up-промтов с авторскими комментариями:</p><ul><li>«Реализуй через Playwright и red/green TDD, спланируй это тоже» — подробнее про red/green TDD Уиллисон <a href="https://simonwillison.net/guides/agentic-engineering-patterns/red-green-tdd/" rel="nofollow">писал отдельно</a></li><li>«Давай использовать собственный рендерер PDF.js» — Claude начал экспериментировать с pdfium</li><li>«Финальный UI должен показывать и текст, и pretty-printed JSON — оба в textarea с кнопками копирования. И должен быть mobile-friendly» — новая идея, как UI должен выглядеть</li><li>«Делай маленькие коммиты по ходу дела» — <i>см. ниже</i></li><li>«В index.html вверху страницы добавь ссылку на <a href="https://github.com/run-llama/liteparse" rel="nofollow">github.com/run-llama/liteparse</a>» — важно кредитить зависимости</li><li>«View on GitHub → — плохая формулировка: это репозиторий не браузерной обёртки, а базовой библиотеки LiteParse»</li><li>«Чекбокс Run OCR должен быть снят по умолчанию»</li><li>«Когда пытаюсь распарсить PDF в браузере — вижу Parse failed: undefined is not a function» — Claude тестировал в Playwright под Chrome, а оказалось, что это баг Safari</li><li>«Когда нажимают Copy, пусть текст на 1,5 секунды меняется на Copied!»</li><li>«Оформи поле выбора файла так, чтобы длинные имена не ломали вёрстку в Firefox. И добавь drag-and-drop-зону, которая ещё и кликабельна» — скриншоты мелких UI-глитчей Claude воспринимает на удивление хорошо</li><li>«Текст в drop-зоне сейчас чуть ближе к верху — поцентруй по вертикали» — точечная правка поверх предыдущей</li><li>«В Safari на macOS всё ещё падает с readableStream» — Claude починил, как только ему подсказали запустить Playwright в этом браузере; следующим промтом Уиллисон подтвердил: «works in safari now»</li></ul><p>«Делай маленькие коммиты» Уиллисон теперь просит по привычке: это упрощает последующее чтение и ревью кода, а ещё, по его непроверенной гипотезе, помогает агенту работать эффективнее — дополнительный стимул планировать и брать задачи по одной.</p><p>Пока агент работал, Уиллисон решил, что было бы неплохо уже повзаимодействовать с ещё не завершённой версией. Он открыл отдельную сессию Claude Code в той же папке и спросил, как запустить сборку. Ответ — npx vite: команда поднимает dev-сервер с live-reload, так что каждая правка на диске сразу видна в браузере, и можно тут же просить «подкрути вот это».</p><p>Ближе к концу Уиллисон решил, что проект достаточно хорош для публикации. Новая сессия Claude Code, промт:</p><blockquote>Look at the web/ folder - set up GitHub actions for this repo such that any push runs the tests, and if the tests pass it then does a GitHub Pages deploy of the built vite app such that the web/index.html page is the index.html page for the thing that is deployed and it works on GitHub Pages</blockquote><p>После нескольких итераций получился <a href="https://github.com/simonw/liteparse/blob/web/.github/workflows/deploy-web.yml" rel="nofollow">рабочий GitHub Actions workflow</a>, который собирает приложение через Vite и деплоит результат на <a href="https://simonw.github.io/liteparse/" rel="nofollow">simonw.github.io/liteparse/</a>. GitHub Pages Уиллисон любит именно за такие кейсы: любой репозиторий бесплатно превращается в задеплоенное веб-приложение с произвольным build-шагом — и всё это настраивает Claude.</p><p>В проектах такого типа всегда есть риск, что модель «сжульничает»: пометит ключевые фичи как TODO и сделает их заглушками или срежет углы в требованиях. Ответственный способ это поймать — прочитать весь код. Но здесь это не планировалось, поэтому Уиллисон запустил OpenAI Codex с GPT-5.5 (у автора был ранний доступ к модели) и попросил:</p><blockquote>Describe the difference between how the node.js CLI tool runs and how the web/ version runs</blockquote><p>Ответ был достаточно подробным, чтобы убедиться: Claude не срезал углы в чём-то критичном. Суммарное время в Claude Code на фазу «build it» — <b>59 минут</b>. Полный транскрипт сессии Уиллисон потом экспортировал своим же инструментом <a href="https://github.com/simonw/claude-code-transcripts" rel="nofollow">claude-code-transcripts</a> — правда, без очереди follow-up-промтов, их экспорт пока не подхватывает.</p><h2>Это ещё вайб-кодинг или уже нет?</h2><p>Уиллисон педантичен в определении <a href="https://simonwillison.net/2025/Mar/19/vibe-coding/" rel="nofollow">vibe coding</a>: это не любое использование ИИ для написания кода. Вайб-кодинг — это когда вы используете ИИ и при этом вообще не просматриваете получившийся код и не думаете о нём. По собственному определению автора, LiteParse for the web — пожалуй, максимально чистый вайб-кодинг: ни одной строки HTML и TypeScript Уиллисон не прочитал (и, пока писал это предложение, даже полез проверять, JS там или TS).</p><p>И всё же этот проект не ощущается как другие его вайб-проекты:</p><ul><li>Это статическое браузерное приложение на GitHub Pages. Blast radius (радиус поражения от бага) почти нулевой: для конкретного PDF оно или работает, или нет.</li><li>Приватные данные никуда не уходят — вся обработка в браузере, поэтому аудит безопасности не нужен. Уиллисон специально заглянул в network-панель и убедился: при парсинге PDF дополнительных запросов нет.</li><li>Инженерный опыт всё равно потребовался — чтобы сообразить, что перенос LiteParse в браузер вообще возможен. Без этого никакой агент не справился бы.</li></ul><p>Главное — Уиллисон готов привязать к этому проекту свою репутацию и рекомендовать его другим. В отличие от большинства его вайб-проектов, он не уверен, что дополнительные инженерные часы заметно улучшили бы первый релиз. «Оно работает как есть, и это нормально».</p><p>PR в апстрим Уиллисон не открывал — не обсуждал это с командой LiteParse. Но <a href="https://github.com/run-llama/liteparse/issues/147" rel="nofollow">завёл issue</a>: если команде будет интересно взять вайб-код как отправную точку для чего-то более официального — пусть забирают.</p><h2>Выводы</h2><p>LiteParse for the web — не прорыв, а аккуратная обёртка поверх PDF.js и Tesseract.js. Но с конкретной пользой: приватный парсинг PDF без облака, который можно забрать и поставить у себя.</p><p>Главное в кейсе — не сама браузерная обёртка, а рабочий паттерн: план-артефакт в репозитории, запуск через «build it», очередь follow-up-подсказок поверх работающего агента и финальная проверка результата другой моделью. Такой процесс повторяется на любом проекте сопоставимой сложности.</p><p>Оригинал: <a href="https://simonwillison.net/2026/Apr/23/liteparse-for-the-web/" rel="nofollow">Extract PDF text in your browser with LiteParse for the web</a> Simon Willison, 23 апреля 2026 года. Апстрим-репозиторий LiteParse — <a href="https://github.com/run-llama/liteparse" rel="nofollow">github.com/run-llama/liteparse</a>, демо браузерной версии — <a href="https://simonw.github.io/liteparse/" rel="nofollow">simonw.github.io/liteparse/</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Взлом Bitwarden CLI на npm: 1,5 часа кражи токенов и SSH-ключей</title>
      <link>https://tproger.ru/news/bitwarden-cli-na-npm-podmenili-na-1-5-chasa-versiya-2026-4-0-kra</link>
      <comments>https://tproger.ru/news/bitwarden-cli-na-npm-podmenili-na-1-5-chasa-versiya-2026-4-0-kra?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/bitwarden-cli-na-npm-podmenili-na-1-5-chasa-versiya-2026-4-0-kra</guid>
      <description><![CDATA[<p>Bitwarden CLI 2026.4.0 на npm 22 апреля около 1,5 часа содержал малварь, крадущую GitHub/npm-токены, SSH-ключи и конфиги ИИ-ассистентов. Что делать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/bitwarden-cli-na-npm-podmenili-na-1-5-chasa-versiya-2026-4-0-kra">Взлом Bitwarden CLI на npm: 1,5 часа кражи токенов и SSH-ключей</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Apr 2026 08:30:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Подменили @bitwarden/cli в npm на 1 час 33 минуты — за это окно <a href="https://www.bleepingcomputer.com/news/security/bitwarden-cli-npm-package-compromised-to-steal-developer-credentials/">успевали воровать</a> GitHub/npm-токены, SSH-ключи и конфиги ИИ-ассистентов Claude, Kiro, Cursor, Codex CLI и Aider у всех, кто зашёл поставить пакет. Окно атаки — с 17:57 до 19:30 по времени Нью-Йорка 22 апреля (с 00:57 до 02:30 МСК 23 апреля). Vault-пароли самого менеджера Bitwarden не трогали — взломали только npm-канал доставки CLI. Если ставили версию 2026.4.0 — считайте ключи с этой машины скомпрометированными и ротируйте их прямо сейчас.</p><ul><li>Скомпрометирована одна npm-версия @bitwarden/cli@2026.4.0. Окно атаки — 1 час 33 минуты 22 апреля 2026 года.</li><li>Vault-данные пользователей Bitwarden не затронуты. Пострадал только npm-канал доставки CLI и те, кто успел поставить эту сборку.</li><li>Вектор — скомпрометированный action checkmarx/ast-github-action, который Bitwarden подтягивал в свой CI. По словам исследователей, это первый зафиксированный взлом пакета через npm trusted publishing.</li><li>Малварь таргетит ИИ-ассистенты Claude, Cursor, Codex CLI, Aider и AWS-based Kiro — отдельный модуль собирает их конфиги и API-ключи.</li><li>Если ставили — ротируйте npm/GitHub-токены, SSH-ключи и облачные креденшлы AWS/Azure/GCP; проверьте CI/CD-пайплайны и публичные репозитории со строкой «Shai-Hulud» в имени.</li></ul><h2>Что случилось с пакетом</h2><p>По <a href="https://thehackernews.com/2026/04/bitwarden-cli-compromised-in-ongoing.html">данным The Hacker News</a>, в ночь с 22 на 23 апреля 2026 года в npm-реестре появилась версия @bitwarden/cli@2026.4.0 с дополнительным файлом bw1.js внутри. Сборка была доступна 1 час 33 минуты — с 17:57 до 19:30 по времени Нью-Йорка, — после чего её сняли с публикации. Первыми на неё обратили внимание исследователи Socket, JFrog и OX Security. JFrog <a href="https://x.com/jfrog/">описал поведение</a> как «кражу GitHub/npm-токенов, содержимого .ssh, .env, истории shell, секретов GitHub Actions и облачных провайдеров с выгрузкой на внешние домены и в виде коммитов в GitHub».</p><p>Bitwarden подтвердил инцидент и уточнил, что «расследование не обнаружило признаков доступа к данным пользовательских хранилищ и компрометации продакшн-систем». По словам компании, доступ нарушителя был отозван, вредоносный релиз помечен как deprecated, по версии 2026.4.0 заводится отдельный CVE. Пострадавшие — только те, кто успел скачать пакет в полуторачасовом окне и выполнил его установку.</p><h2>Как устроен троян</h2><p>Механика по отчёту <a href="https://socket.dev/blog">Socket</a> проста, но многоступенчата. В package.json зловредной версии добавлен preinstall-хук, который запускает скрипт bw_setup.js. Тот проверяет наличие Bun — альтернативного JS-рантайма — и, если его нет, скачивает. Затем Bun-ом запускается обфусцированный загрузчик bw1.js. Bun тащат с собой не случайно: на машине жертвы его, скорее всего, нет, а корпоративный EDR (антивирус нового поколения для рабочих станций и серверов) реагирует на неожиданный бинарник хуже, чем на стандартный npm-скрипт. Preinstall-хук при этом срабатывает ещё до того, как код пакета формально «установлен».</p><ul><li>npm- и GitHub-токены из локальных конфигов и переменных окружения;</li><li>приватные SSH-ключи из ~/.ssh;</li><li>содержимое .env-файлов и историю shell (.bash_history, .zsh_history);</li><li>секреты GitHub Actions из переменных окружения CI;</li><li>креденшлы облачных провайдеров — AWS, Azure, Google Cloud;</li><li>конфиги и API-ключи ИИ-ассистентов Claude, Cursor, Codex CLI, Aider и AWS-based Kiro.</li></ul><p>Собранные данные шифруются AES-256-GCM и выгружаются двумя каналами. Основной — POST на домен audit.checkmarx[.]cx (конкретно путь /v1/telemetry), который притворяется инфраструктурой Checkmarx. Резервный — малварь создаёт публичные GitHub-репозитории в аккаунте жертвы и кладёт туда зашифрованный payload. В названиях репозиториев встречается строка «Shai-Hulud: The Third Coming» — отсылка к прошлогодней одноимённой кампании в npm. OX Security подчёркивает, что такой тайник (по терминологии безопасников — dead-drop) через GitHub опасен отдельно: утёкшие секреты становятся доступны любому, кто ищет по публичным репозиториям, — а системы защиты почти не следят за исходящим трафиком в GitHub.</p><p>Поверх этого в бинарнике есть модуль-червь: с украденным npm-токеном малварь находит все пакеты, которые жертва имеет право публиковать, и вбрасывает в них тот же payload. <a href="https://www.endorlabs.com/blog">Endor Labs называет</a> его «CanisterSprawl» и считает один из самых полных npm supply chain-пейлоадов на сегодняшний день: шесть разных поверхностей для сбора секретов, OIDC- и cloud-кража, самораспространение через npm-публикации и отдельный модуль для ИИ-ассистентов.</p><h2>Отдельный удар по ИИ-ассистентам</h2><p>Отдельный модуль малвари специально ищет артефакты ИИ-кодеров — API-ключи OpenAI и Anthropic из конфигов Claude, Cursor и Codex CLI, токены Aider, настройки AWS-based Kiro. Endor Labs считает, что это один из первых публично задокументированных случаев, когда supply chain-атака отдельной веткой целится на «кошельки разработчиков у ИИ». Ключ к Anthropic или OpenAI — это не только деньги на балансе аккаунта жертвы, но и возможность с его помощью заставить ИИ-ассистента писать закладки в код при следующих авто-запросах.</p><h2>Почему малварь пропускает русскую локаль</h2><p>Малварь завершается без выполнения, если в системе выставлена русская локаль. Socket отмечает три возможных причины: отдельный оператор, использующий общую инфраструктуру, отколовшаяся группа с идеологическими мотивами или эволюция самой кампании. На практике для российских разработчиков это не даёт защиты: большинство dev-машин, серверов и CI-раннеров работают с англоязычной локалью по умолчанию (обычно en_US.UTF-8), поэтому пропуск по локали чаще всего не срабатывает.</p><h2>Что делать, если могли установить 2026.4.0</h2><ul><li>Сначала убедитесь, что пакет действительно попал в ваши машины и раннеры: прогрепайте package-lock.json, pnpm-lock.yaml и yarn.lock на @bitwarden/cli версии 2026.4.0, посмотрите логи npm-установок в ночь на 23 апреля МСК.</li><li>Ротируйте все токены с этих машин: npm-токены, GitHub PAT (включая fine-grained), SSH-ключи, AWS access/secret keys и STS-сессии, Azure SP, GCP service accounts.</li><li>Замените секреты в GitHub Actions и других CI-системах, где пакет мог запускаться, — включая secrets, variables и OIDC-конфигурации.</li><li>Пройдитесь по API-ключам ИИ-ассистентов (Anthropic, OpenAI, Cursor, Aider) и отзовите их в кабинетах провайдеров; сверьте биллинг на предмет аномальных трат.</li><li>Проверьте публичные репозитории в своём GitHub-аккаунте: ищите имена в формате &lt;слово&gt;-&lt;слово&gt;-&lt;3 цифры&gt; (например, fremen-muaddib-042) со строкой «Shai-Hulud» в README и удалите.</li><li>Откатитесь на безопасную версию CLI — 2026.3.x или актуальную стабильную, которую Bitwarden опубликовал после инцидента. Ставьте её через npm i @bitwarden/cli@&lt;версия&gt;, а не через latest или диапазон.</li></ul><h2>Связь с Checkmarx и первый взлом через npm trusted publishing</h2><p>Накануне, 21 апреля, Checkmarx раскрыла собственный инцидент — компрометацию KICS Docker-образов, GitHub-расширений и пакета checkmarx/ast-github-action, который используется во многих CI-пайплайнах. По данным Endor Labs, репозиторий Bitwarden подтягивал именно этот action, и через него злоумышленники получили доступ к npm-каналу. Socket приводит прямые пересечения: тот же домен audit.checkmarx[.]cx, тот же паттерн обфускации __decodeScrambled с seed-значением 0x3039 — технический отпечаток, указывающий на одних и тех же авторов, — плюс тот же приём «украсть → выгрузить в GitHub → распространиться дальше».</p><p>Исследователь <a href="https://x.com/AdnanTheKhan">Аднан Хан утверждает</a>, что это первый зафиксированный случай компрометации пакета, использующего npm trusted publishing — механизм OIDC-публикации, при котором GitHub Actions обменивается на короткоживущий npm-токен без долгоживущих секретов в CI. Его как раз продвигали в ответ на регулярные утечки npm-токенов у мейнтейнеров. На деле trusted publishing оказался не панацеей: если нарушитель получает доступ к GitHub Actions-воркфлоу с правом публиковать пакет, OIDC-токен ему выдаёт сам npm. Атрибуция у исследователей — группа TeamPCP, уже засветившаяся на <a href="https://tproger.ru/news/volna-supply-chain-atak-na-pypi--razbiraem-litellm--telnyx-i-tri">взломах LiteLLM и Trivy</a>. Аккаунт TeamPCP в X на момент выхода материала заблокирован.</p><h2>Выводы для npm-экосистемы и supply chain</h2><p>Случай укладывается в серию ударов по цепочке доставки последних двух недель: <a href="https://tproger.ru/news/volna-supply-chain-atak-na-pypi--razbiraem-litellm--telnyx-i-tri">Trivy и LiteLLM на PyPI</a>, <a href="https://tproger.ru/news/supply-chain-ataki-2026--axios--pypi-i-prompt-injection---chto-pr">Axios и PyPI</a>, теперь Checkmarx и Bitwarden. Характерная деталь — защитный слой не спасает: trusted publishing, OIDC и короткоживущие токены не помогают, если злоумышленник уже получил доступ к CI-воркфлоу. Практический вывод: pin-версии в лок-файлах, отдельный CI-аккаунт с минимальными правами, еженедельная ревизия CI-секретов и мониторинг собственного GitHub на появление незнакомых публичных репозиториев. Инвентаризация секретов, которые ходят через CI/CD, перестала быть теоретическим упражнением.</p>]]></content:encoded>
    </item>
    <item>
      <title>.gitignore: полный гайд с шаблонами для Python, Node.js, Java и Go</title>
      <link>https://tproger.ru/articles/gitignore-polnyj-gajd-s-wablonami-dlya-python-node-js-java-i</link>
      <comments>https://tproger.ru/articles/gitignore-polnyj-gajd-s-wablonami-dlya-python-node-js-java-i?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gitignore-polnyj-gajd-s-wablonami-dlya-python-node-js-java-i</guid>
      <description><![CDATA[<p>Синтаксис .gitignore, готовые шаблоны для Python, Node.js, Java и Go, глобальный gitignore, git rm --cached и gitignore.io. Разбираем с примерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gitignore-polnyj-gajd-s-wablonami-dlya-python-node-js-java-i">.gitignore: полный гайд с шаблонами для Python, Node.js, Java и Go</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Apr 2026 15:26:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>.gitignore — это файл, который сообщает Git, какие файлы и директории не нужно отслеживать.</p><p>Файл .gitignore — один из первых, который появляется в любом репозитории. Но многие добавляют его по привычке, не разбираясь в синтаксисе и не думая о глобальных настройках. В итоге в историю коммитов попадают .pyc-файлы, папки node_modules и секреты из .env.</p><p>В этом гайде разберём синтаксис .gitignore с примерами каждого паттерна, дадим готовые шаблоны для Python, Node.js, Java и Go, а также покажем, как исправить ситуацию, если файл уже попал в индекс. Статья рассчитана на тех, кто уже знаком с основами Git — если нужно освежить базу, начните с <a href="https://tproger.ru/translations/beginner-git-cheatsheet">введения в Git</a>.</p><p>— .gitignore поддерживает паттерны *, **, !, / и комментарии через #</p><p>— Готовые шаблоны для Python, Node.js, Java и Go закрывают 90% типичных случаев</p><p>— Глобальный ~/.gitignore_global избавляет от повторения в каждом проекте правил для IDE и ОС</p><p>— Если файл уже в индексе, git rm --cached убирает его без удаления с диска</p><p>— .gitkeep — хак для отслеживания пустых директорий</p><p>Эта статья — часть нашего <a href="https://tproger.ru/articles/git-polnyj-putevoditel-ot-pervogo-kommita-do-prodvinutyh-wor">полного путеводителя по Git</a>. Там — весь маршрут: от первого коммита до продвинутых workflow.</p><h2>Синтаксис .gitignore: разбираем каждый паттерн</h2><p>Git читает .gitignore построчно. Пустые строки игнорируются, строки с # в начале — комментарии. Остальное — паттерны.</p><p><b>* — любое количество символов в имени файла</b> (кроме /):</p><p><b>** — любое количество директорий</b> (рекурсивно):</p><p><b>! — отмена предыдущего правила</b> (исключение из исключений):</p><p><b>Важно:</b> паттерн ! не работает, если родительская директория уже заигнорирована. Например, если в .gitignore есть строка build/, то правило !build/keep-me.txt не поможет — файл всё равно будет игнорироваться. Чтобы исключение сработало, нужно сначала разрешить саму директорию: !build/, а затем уже — конкретный файл.</p><p><b>/ в начале — привязка к корню репозитория</b>:</p><p><b>/ в конце — игнорировать только директорию</b>, не файл с таким же именем:</p><p><b># — комментарий</b>. Используйте для группировки правил:</p><h2>Шаблон .gitignore для Python</h2><p>Python генерирует .pyc-файлы и папки __pycache__ при каждом запуске. Виртуальные окружения (venv, .venv) и файлы с переменными окружения (.env) тоже не должны попадать в репозиторий.</p><h2>Шаблон .gitignore для Node.js</h2><p>Главная причина тяжёлых репозиториев на Node.js — папка node_modules, которую забыли добавить в .gitignore. Её размер легко достигает сотен мегабайт.</p><h2>Шаблон .gitignore для Java</h2><p>Java-проекты собираются Maven или Gradle — у каждого свои папки артефактов. Скомпилированные .class-файлы и .jar-архивы пересобираются при каждом билде и в репозитории не нужны.</p><h2>Шаблон .gitignore для Go</h2><p>Go компилирует проект в бинарник — его хранить в репозитории не нужно. Папка vendor/ содержит копии зависимостей: её включать или нет — зависит от политики команды. Если используете Go modules без vendor-режима, добавьте папку в .gitignore.</p><h2>Глобальный .gitignore: один раз для всех проектов</h2><p>Некоторые файлы мусорят в любом проекте — .DS_Store на macOS, Thumbs.db на Windows, файлы IDE вроде .idea/ или .vscode/. Дублировать эти правила в каждом репозитории неудобно. Для этого есть глобальный .gitignore.</p><p>Настройка через core.excludesFile:</p><p>Пример содержимого ~/.gitignore_global:</p><p>После настройки Git применяет глобальные правила автоматически во всех репозиториях на вашем компьютере — без изменения .gitignore проекта.</p><p>Ещё один способ локально игнорировать файлы — .git/info/exclude. Этот файл работает как .gitignore, но не коммитится в репозиторий и виден только вам. Удобно для временных файлов, специфичных для вашего окружения, которые не стоит выносить в глобальный ~/.gitignore_global.</p><h2>Файл уже в индексе: как перестать его отслеживать</h2><p>Добавить правило в .gitignore недостаточно, если файл уже был закоммичен. Git продолжит его отслеживать. Нужно убрать файл из индекса, сохранив его на диске:</p><p>После этого добавьте правило в .gitignore и закоммитьте оба изменения — удаление из индекса и обновлённый .gitignore. Сам файл останется у вас на диске, но перестанет появляться в git status.</p><p>Если нужно очистить весь индекс и применить правила заново (например, после добавления нескольких паттернов):</p><p><b>Внимание:</b> эта команда пересоздаёт индекс целиком. Не запускайте её при незакоммиченных изменениях.</p><h2>.gitkeep: как отслеживать пустые директории</h2><p>Git не отслеживает директории — только файлы. Если папка пустая, git add её просто проигнорирует. Это проблема, когда структура директорий важна для проекта: например, logs/, uploads/, tmp/.</p><p>Решение — добавить в пустую папку файл-заглушку .gitkeep:</p><p>Файл .gitkeep — неофициальное соглашение. Никакой специальной поддержки в Git нет, это просто пустой файл с понятным именем. Некоторые команды используют .githold или .keep — принципиальной разницы нет.</p><h2>Инструменты: генераторы готовых шаблонов</h2><p>Не обязательно писать .gitignore с нуля — есть готовые инструменты:</p><ul><li><a href="https://www.toptal.com/developers/gitignore">gitignore.io</a> (toptal.com/developers/gitignore) — генератор по языку, IDE и ОС. Введите «Python», «JetBrains», «macOS» — получите готовый файл.</li><li><a href="https://github.com/github/gitignore">GitHub gitignore templates</a> — официальная коллекция шаблонов от GitHub. Шаблоны для 150+ языков и фреймворков. Используется как основа при создании репозитория через интерфейс GitHub.</li><li>gh repo create — при создании репозитория через GitHub CLI можно сразу выбрать шаблон .gitignore флагом --gitignore.</li></ul><p>Для проверки, почему конкретный файл игнорируется (или не игнорируется), используйте встроенную команду:</p><h2>Итог</h2><p>Правильный .gitignore — это не формальность, а часть культуры работы с репозиторием. Он защищает от утечки секретов, не даёт захламить историю коммитов и экономит время при клонировании. Начните с шаблона под ваш стек (используйте gitignore.io или GitHub-коллекцию), добавьте глобальный файл для настроек IDE, и у вас не будет проблем с лишними файлами в git status.</p><p>Если хотите разобраться с Git глубже — изучите <a href="https://tproger.ru/articles/git-polnyj-putevoditel-ot-pervogo-kommita-do-prodvinutyh-wor">полный путеводитель по Git</a> на Tproger: там собраны все ключевые темы от основ до продвинутых техник.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare запустила EmDash — open-source CMS на TypeScript, которая решает главную проблему WordPress</title>
      <link>https://tproger.ru/news/cloudflare-zapustila-emdash---open-source-cms-na-typescript--kot</link>
      <comments>https://tproger.ru/news/cloudflare-zapustila-emdash---open-source-cms-na-typescript--kot?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/cloudflare-zapustila-emdash---open-source-cms-na-typescript--kot</guid>
      <description><![CDATA[<p>Cloudflare выпустила EmDash — open-source CMS на TypeScript с песочницей для плагинов, MCP-сервером для ИИ-агентов и миграцией с WordPress. Разбираем архитектуру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/cloudflare-zapustila-emdash---open-source-cms-na-typescript--kot">Cloudflare запустила EmDash — open-source CMS на TypeScript, которая решает главную проблему WordPress</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[WordPress]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 02 Apr 2026 10:18:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы хоть раз обновляли WordPress-плагин и молились, чтобы сайт не упал — Cloudflare сделала кое-что для вас.</p><p><a href="https://blog.cloudflare.com/emdash-wordpress/">EmDash</a> — это новая open-source CMS (система управления контентом) на TypeScript от Cloudflare, которую компания <a href="https://blog.cloudflare.com/emdash-wordpress/">называет</a> «духовным наследником WordPress». Главная идея: плагины работают в изолированных песочницах и не могут навредить сайту, даже если содержат уязвимости.</p><ul><li>Cloudflare выпустила EmDash v0.1.0 — open-source CMS на TypeScript с MIT-лицензией</li><li>Каждый плагин запускается в изолированной песочнице (Dynamic Workers) и декларирует нужные разрешения в манифесте</li><li>96% уязвимостей WordPress-сайтов приходится на плагины — EmDash решает эту проблему архитектурно</li><li>Под капотом — Astro, serverless-архитектура, Portable Text вместо HTML, встроенный MCP-сервер для ИИ-агентов</li><li>Проект создан за 2 месяца с помощью ИИ-агентов, доступен на GitHub (3200+ звёзд за сутки)</li></ul><p>WordPress исполнится 23 года в этом году (основан в 2003 году). Платформа <a href="https://w3techs.com/technologies/details/cm-wordpress">обслуживает</a> более 40% всех сайтов в интернете, но её архитектура родом из эпохи, когда AWS EC2 ещё не существовал. Плагинная система WordPress — главное преимущество и главная боль одновременно.</p><h2>Почему безопасность плагинов WordPress — нерешаемая проблема</h2><p>В WordPress плагин — это PHP-скрипт, который встраивается напрямую в ядро и получает полный доступ к базе данных и файловой системе. Нет изоляции, нет ограничений. Установить плагин — значит полностью ему довериться.</p><p>Статистика <a href="https://www.wordfence.com/">Wordfence</a> и других ИБ-компаний неутешительна:</p><ul><li><b>96% уязвимостей</b> WordPress-сайтов происходят из плагинов</li><li>В 2025 году нашли больше критических уязвимостей в экосистеме WordPress, чем за два предыдущих года вместе</li><li>Очередь ревью в маркетплейсе WordPress.org — <b>800+ плагинов</b>, ожидание — минимум 2 недели</li></ul><p>WordPress не может решить эту проблему, не переписав архитектуру с нуля. Cloudflare решила это сделать.</p><h2>Как EmDash изолирует плагины</h2><p>В EmDash каждый плагин запускается в собственном изолированном воркере (<a href="https://developers.cloudflare.com/workers/">Dynamic Worker</a> — легковесная v8-песочница, запускающаяся за миллисекунды). Вместо полного доступа ко всему, плагин <b>декларирует</b> в манифесте, какие возможности ему нужны:</p><p>Этот плагин запрашивает ровно два разрешения: чтение контента и отправку email. <b>Ничего другого он сделать не может</b> — ни обратиться к внешнему серверу, ни прочитать файловую систему, ни получить доступ к базе данных напрямую.</p><p>Модель напоминает OAuth: при установке плагина вы видите, какие именно разрешения он запрашивает, и принимаете осознанное решение. Администратор может задать политики — какие capabilities допустимы для каких ролей.</p><h2>Архитектура и стек</h2><p>EmDash построен на современном стеке:</p><ul><li><b>TypeScript</b> — весь код, включая плагины и темы</li><li><b>Astro</b> — фреймворк для контентных сайтов, рендеринг тем</li><li><b>Portable Text</b> — структурированный JSON вместо HTML, контент не привязан к DOM</li><li><b>Serverless</b> — масштабируется до нуля, работает на Cloudflare Workers или любом Node.js-сервере</li><li><b>Passkeys</b> — аутентификация без паролей по умолчанию (WebAuthn)</li><li><b>MIT-лицензия</b> — без ограничений GPL, плагины могут иметь любую лицензию</li></ul><h3>Хранение и совместимость</h3><p>На Cloudflare EmDash использует D1 (база данных), R2 (файлы), Workers (вычисления). Но абстракции портируемы: можно запустить на SQLite, PostgreSQL, AWS S3 или локальном файловом хранилище. Команда для развёртывания:</p><h2>ИИ-нативная CMS: MCP, CLI, Agent Skills</h2><p>EmDash <a href="https://github.com/emdash-cms/emdash">спроектирован</a> для работы с ИИ-агентами:</p><ul><li><b>Встроенный MCP-сервер</b> — Claude, ChatGPT и другие ИИ-инструменты могут управлять сайтом напрямую через Model Context Protocol</li><li><b>Agent Skills</b> — файлы-инструкции для ИИ-агентов: как писать плагины, портировать темы с WordPress, работать со схемами контента</li><li><b>CLI</b> — программное управление контентом, медиа, схемами</li></ul><p>По сути, рутинную работу — миграцию контента, создание плагинов, адаптацию тем — можно поручить ИИ-агенту, и EmDash даст ему весь необходимый контекст.</p><h2>Встроенная монетизация через x402</h2><p>Каждый сайт на EmDash поддерживает стандарт <a href="https://x402.org">x402</a> — нативные интернет-платежи. Клиент (например, ИИ-агент) отправляет HTTP-запрос, получает ответ 402 Payment Required и оплачивает доступ к контенту на лету. Настроить монетизацию можно без единой строчки кода — указать, какой контент платный, и привязать кошелёк.</p><h2>Миграция с WordPress</h2><p>EmDash поддерживает импорт существующих WordPress-сайтов:</p><ol><li>Экспорт WXR-файла (WordPress eXtended RSS) из WordPress-админки</li><li>Или установка плагина EmDash Exporter, который создаёт защищённый endpoint для миграции</li><li>Автоматический перенос постов, страниц, медиафайлов и таксономий</li></ol><p>Кастомные типы контента (которые в WordPress требуют Advanced Custom Fields) в EmDash задаются через визуальный конструктор схем в админке.</p><h2>Что стоит учесть</h2><p>EmDash находится в статусе <b>бета-превью (v0.1.0)</b>. Несколько моментов:</p><ul><li>Проект молодой — 62 коммита, 4 контрибьютора, 34 релиза</li><li>Песочница для плагинов через Dynamic Workers требует платного аккаунта Cloudflare (от $5/мес), но EmDash запускается и без неё — плагины будут работать в safe mode без изоляции</li><li>Экосистема плагинов и тем ещё не сформировалась — на старте доступны формы, встраивания, SEO, аудит-лог</li><li>Привязка к инфраструктуре Cloudflare — можно запустить на Node.js, но максимальную производительность даёт именно Cloudflare</li></ul><h2>Выводы</h2><blockquote>WordPress — триумф open source, который дал возможность публиковаться миллионам. Но экосистеме нужен вариант, который даёт ту же свободу и доступность, решая при этом проблемы, которые WordPress не может решить.</blockquote><p>EmDash — амбициозная заявка Cloudflare на рынок CMS. За 24 часа после анонса проект набрал более 3200 звёзд на <a href="https://github.com/emdash-cms/emdash">GitHub</a> и 600+ баллов на Hacker News. Продакшн-готовности пока нет — это бета. Но идея изолированных плагинов с декларативными разрешениями решает реальную проблему, которая мучает WordPress-экосистему десятилетиями.</p><p>Попробовать EmDash можно в <a href="https://emdash.dev/playground">онлайн-песочнице</a> или развернуть локально через CLI.</p>]]></content:encoded>
    </item>
    <item>
      <title>Баг в Bun мог стать причиной утечки исходного кода Claude Code — его знали за 20 дней до инцидента</title>
      <link>https://tproger.ru/news/bag-v-bun-mog-stat-prichinoj-utechki-ishodnogo-koda-claude-code--</link>
      <comments>https://tproger.ru/news/bag-v-bun-mog-stat-prichinoj-utechki-ishodnogo-koda-claude-code--?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/bag-v-bun-mog-stat-prichinoj-utechki-ishodnogo-koda-claude-code--</guid>
      <description><![CDATA[<p>Баг в Bun генерировал source maps в production mode. Через 20 дней утекли 500 000+ строк кода Claude Code через npm. Разбираем хронологию, причины и уроки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/bag-v-bun-mog-stat-prichinoj-utechki-ishodnogo-koda-claude-code--">Баг в Bun мог стать причиной утечки исходного кода Claude Code — его знали за 20 дней до инцидента</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Утечка данных]]></category>
      <category><![CDATA[Баги и ошибки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Apr 2026 03:16:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>31 марта 2026 года через npm утекли более 500 000 строк исходного кода Claude Code — флагманского ИИ-инструмента Anthropic. Причиной стал файл source map (карта исходного кода, связывающая минифицированный бандл с оригинальными файлами), который не должен был попасть в публичный пакет. Мы <a href="https://tproger.ru/news/ishodnyj-kod-claude-code-utyok-cherez-source-map-v-npm---512-000-s">уже разбирали</a>, что нашли внутри. Теперь сообщество обратило внимание на возможную техническую причину — баг в Bun, рантайме, который Anthropic сама <a href="https://bun.com/blog/bun-joins-anthropic">приобрела</a> четырьмя месяцами ранее.</p><ul><li>За 20 дней до утечки в баг-трекере Bun зафиксирован <a href="https://github.com/oven-sh/bun/issues/28001">баг #28001</a>: source maps отдаются в production mode, хотя документация утверждает обратное.</li><li>Claude Code собирается и работает на Bun — рантайме, который Anthropic приобрела в декабре 2025 года.</li><li>Утечка произошла через файл source map размером 59,8 МБ, попавший в npm-пакет @anthropic-ai/claude-code версии 2.1.88.</li><li>Anthropic назвала инцидент «ошибкой при упаковке релиза, вызванной человеческим фактором». Формальный постмортем не опубликован.</li><li>Прямого подтверждения связи между багом #28001 и утечкой нет, но техническое совпадение слишком точное, чтобы его игнорировать.</li></ul><h2>Хронология: от покупки Bun до утечки</h2><p><b>2 декабря 2025</b> — Anthropic <a href="https://bun.com/blog/bun-joins-anthropic">объявляет о покупке Bun</a>, JavaScript-рантайма, на котором работает Claude Code. Создатель Bun Джаред Самнер (Jarred Sumner) переходит в Anthropic. Компания обещает сохранить Bun как open-source проект с MIT-лицензией. К этому моменту Claude Code уже <a href="https://www.anthropic.com/news/anthropic-acquires-bun-as-claude-code-reaches-usd1b-milestone">приносит $1 млрд</a> годовой выручки.</p><p><b>11 марта 2026</b> — в баг-трекере Bun появляется <a href="https://github.com/oven-sh/bun/issues/28001">issue #28001</a>: при использовании Bun.serve() с параметром development: false source maps всё равно генерируются и отдаются клиенту. Документация Bun явно указывает, что в production mode source maps должны быть отключены. Баг зафиксирован на версии 1.3.10.</p><p><b>31 марта 2026</b> — разработчик Чаофан Шоу (Chaofan Shou, <a href="https://x.com/shoucccc">@shoucccc</a>) обнаруживает, что в npm-пакете @anthropic-ai/claude-code версии 2.1.88 лежит файл cli.js.map размером 59,8 МБ. Внутри — полный исходный код: более 500 000 строк TypeScript в ~1900 файлах. Твит набирает более 21 миллиона просмотров.</p><h2>Что за баг в Bun</h2><p>Баг #28001 зафиксирован в подсистеме Bun.serve() — встроенном HTTP-сервере Bun с функцией бандлинга. Суть проблемы: даже когда разработчик явно задаёт development: false, source maps всё равно генерируются и включаются в собранные файлы. Это противоречит <a href="https://bun.com/docs/bundler/fullstack#fullstack-dev-server">документации Bun</a>.</p><p>Claude Code собирается в один файл для публикации в npm через бандлер Bun. Формально баг #28001 описывает проблему в Bun.serve(), а не в автономном бандлере bun build. Однако обе подсистемы используют один и тот же механизм генерации source maps, и сообщество считает вероятным, что проблема затрагивает обе. На момент утечки issue оставался открытым и без фикса.</p><p>Само по себе наличие source map в сборке — ещё полбеды. Проблема в том, что в конвейере публикации Claude Code не было ни записи *.map в .npmignore, ни ограничения поля files в package.json. Если бы любой из этих защитных механизмов работал, source map не попала бы в npm-пакет даже при наличии бага. Сочетание двух факторов — баг в рантайме и отсутствие фильтрации при публикации — привело к утечке.</p><h2>Почему сообщество обратило на это внимание</h2><p>На <a href="https://www.reddit.com/r/programming/comments/1s8t8hp/">Reddit</a> и Hacker News историю обсуждают не столько из-за технической сложности бага — он тривиален. Внимание привлекла ирония ситуации:</p><ul><li>Anthropic купила Bun в декабре 2025 года. Claude Code — главный продукт компании, и он работает именно на Bun.</li><li>Баг в Bun, связанный с source maps, был известен за 20 дней до утечки, но не был исправлен.</li><li>Anthropic позиционирует себя как «safety-first» ИИ-компанию — и при этом допустила два инцидента с утечками за одну неделю: утечка черновиков блога о модели Mythos 26 марта и source map 31 марта.</li><li>Компания активно рассказывает, что её ИИ пишет значительную часть кода Bun — и именно в этом коде нашёлся баг, приведший к утечке кода ИИ.</li></ul><blockquote>Случайно отправить source map в npm — ошибка, которая кажется невозможной, пока не вспомнишь, что значительная часть кодовой базы, вероятно, была написана тем самым ИИ, которого ты релизишь.</blockquote><h2>Что нашли внутри: краткая сводка</h2><p>Мы подробно разбирали содержимое утечки в <a href="https://tproger.ru/news/ishodnyj-kod-claude-code-utyok-cherez-source-map-v-npm---512-000-s">предыдущем материале</a>. Ключевые находки:</p><ul><li><b>KAIROS</b> — нерелизованный режим автономного фонового агента, который работает как демон, подписывается на GitHub-вебхуки и «видит сны» ночью, консолидируя память.</li><li><b>Undercover Mode</b> — режим, при котором Claude скрывает свою природу ИИ и убирает атрибуцию Co-Authored-By в коммитах. Принудительного отключения нет.</li><li><b>ANTI_DISTILLATION</b> — внедрение фейковых инструментов в API-запросы для отравления обучающих данных конкурентов.</li><li><b>BUDDY</b> — тамагочи в терминале с 18 видами существ, уровнями редкости и RPG-характеристиками.</li><li>Внутренние бенчмарки, кодовые имена моделей (Capybara, Fennec, Numbat) и 44 фича-флага.</li></ul><h2>Реакция Anthropic</h2><p>Anthropic удалила npm-пакет в течение нескольких часов и <a href="https://www.theregister.com/2026/03/31/anthropic_claude_code_source_code/">заявила</a>, что утечка — «ошибка при упаковке релиза, вызванная человеческим фактором, а не брешь в безопасности». Пользовательские данные, ключи API и учётные записи не были скомпрометированы. Компания начала рассылать DMCA-уведомления зеркалам на GitHub, но формальный постмортем не опубликовала.</p><p>Тем временем корейский разработчик Сигрид Джин (Sigrid Jin) создал clean-room переписку архитектуры Claude Code на Python под названием <a href="https://github.com/instructkr/claw-code">claw-code</a>. Репозиторий набрал 50 000 звёзд за два часа — <a href="https://github.com/instructkr/claw-code">по заявлению авторов</a>, это рекорд GitHub. Сейчас проект переписывается на Rust.</p><h2>Что это значит для разработчиков</h2><p>Если вы используете Bun для сборки production-кода, стоит проверить свой конвейер публикации:</p><ol><li>Проверьте, не попадают ли файлы .map в ваши npm-пакеты. Используйте npm pack --dry-run для аудита содержимого перед публикацией.</li><li>Добавьте *.map в .npmignore или явно перечислите разрешённые файлы в поле files в package.json. Второй вариант надёжнее — вместо списка исключений вы задаёте список включений.</li><li>Следите за <a href="https://github.com/oven-sh/bun/issues/28001">issue #28001</a> в репозитории Bun — на момент публикации баг не исправлен.</li><li>Если публикуете пакеты через CI/CD — добавьте шаг валидации, который проверяет отсутствие source maps в артефакте.</li></ol><h2>Итог</h2><p>История с утечкой Claude Code — наглядный пример того, как цепочка мелких упущений приводит к масштабному инциденту. Возможный баг в рантайме, отсутствие фильтрации при публикации, недостаточный аудит CI/CD-пайплайна — по отдельности каждая из этих проблем тривиальна. Вместе они обнажили более 500 000 строк проприетарного кода компании с оценкой выше $100 млрд.</p><p>Для разработчиков урок простой: не доверяйте дефолтам инструментов сборки и всегда проверяйте, что именно попадает в ваши пакеты. Команда npm pack --dry-run занимает секунды и может предотвратить утечку, которая изменит историю вашего продукта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Axios взломан на npm — вредоносные версии устанавливают RAT-троянец на все ОС</title>
      <link>https://tproger.ru/news/axios-vzloman-na-npm---vredonosnye-versii-ustanavlivayut-rat-troya</link>
      <comments>https://tproger.ru/news/axios-vzloman-na-npm---vredonosnye-versii-ustanavlivayut-rat-troya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/axios-vzloman-na-npm---vredonosnye-versii-ustanavlivayut-rat-troya</guid>
      <description><![CDATA[<p>Злоумышленники взломали npm-аккаунт мейнтейнера axios и внедрили RAT-троянец в версии 1.14.1 и 0.30.4. Разбираем атаку, IoC и как защититься. Проверьте проект.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/axios-vzloman-na-npm---vredonosnye-versii-ustanavlivayut-rat-troya">Axios взломан на npm — вредоносные версии устанавливают RAT-троянец на все ОС</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Информационная безопасность]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 31 Mar 2026 04:31:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваш проект использует <b>axios</b> — проверьте package-lock.json прямо сейчас. 31 марта 2026 года злоумышленники взломали npm-аккаунт основного мейнтейнера библиотеки и опубликовали версии с троянцем удалённого доступа (RAT).</p><p>Скомпрометированы версии <b>axios@1.14.1</b> и <b>axios@0.30.4</b> — обе ветки, актуальная и легаси. Вредоносный код устанавливает кроссплатформенный RAT, который работает на macOS, Windows и Linux. Пакеты были доступны в npm-реестре около <b>3 часов</b>, прежде чем npm их удалил.</p><p>— Скомпрометированы axios@1.14.1 и axios@0.30.4 через взлом npm-аккаунта мейнтейнера</p><p>— Вредоносная зависимость plain-crypto-js устанавливает RAT-троянец на все ОС</p><p>— axios — самый популярный HTTP-клиент в JS-экосистеме: более 100 млн загрузок в неделю</p><p>— Безопасные версии: 1.14.0 (для 1.x) и 0.30.3 (для 0.x)</p><p>— Все секреты на затронутых системах нужно ротировать немедленно</p><p><a href="https://github.com/axios/axios">Axios</a> — HTTP-клиент для Node.js и браузеров с более чем 100 миллионами загрузок в неделю. Атаки на цепочки поставок (supply chain attacks) — это компрометация инфраструктуры распространения ПО: вместо атаки на конечную цель злоумышленник внедряет вредоносный код в доверенный пакет, который жертва сама устанавливает.</p><h2>Как произошла атака</h2><p>Злоумышленники получили доступ к npm-аккаунту <b>jasonsaayman</b> — основного мейнтейнера axios. Email аккаунта был изменён с легитимного адреса на ifstap@proton.me. Предположительно, был украден долгоживущий классический npm access token.</p><p>Легитимные релизы axios публикуются через GitHub Actions с криптографической привязкой <a href="https://docs.npmjs.com/generating-provenance-statements">npm OIDC Trusted Publisher</a> и содержат <b>SLSA-провенанс</b> (Supply chain Levels for Software Artifacts — стандарт подтверждения целостности сборки). Вредоносные версии были опубликованы вручную через npm CLI — без привязки к GitHub, без SLSA-провенанса, без соответствующего тега в репозитории.</p><p>Атака была подготовлена заранее: за 18 часов до компрометации axios в npm был опубликован пакет-приманка plain-crypto-js — клон легитимного crypto-js с тем же описанием и именем автора. Сначала чистая версия 4.2.0, затем вредоносная 4.2.1 с постустановочным скриптом.</p><h2>Хронология атаки</h2><p>Все события — по UTC, 30–31 марта 2026 года:</p><ul><li><b>30 марта, 05:57</b> — атакующий публикует чистый plain-crypto-js@4.2.0 для формирования истории публикаций</li><li><b>30 марта, 23:59</b> — выходит вредоносный plain-crypto-js@4.2.1 с постустановочным скриптом</li><li><b>31 марта, 00:05</b> — <a href="https://socket.dev/blog/axios-npm-package-compromised">Socket</a> детектирует вредоносный пакет — через 6 минут после публикации</li><li><b>31 марта, 00:21</b> — публикуется axios@1.14.1 со скомпрометированного аккаунта</li><li><b>31 марта, 01:00</b> — публикуется axios@0.30.4 — обе ветки поражены за 39 минут</li><li><b>31 марта, ~03:15</b> — npm удаляет обе вредоносные версии, dist-tag latest откатывается к 1.14.0</li><li><b>31 марта, 04:26</b> — npm публикует заглушку безопасности для plain-crypto-js — пакет заблокирован</li></ul><p>Итого: <b>axios@1.14.1</b> был доступен около 2 часов 53 минут, <b>axios@0.30.4</b> — около 2 часов 15 минут.</p><h2>Что делает вредоносный код</h2><p>В исходном коде axios изменений нет — добавлена только зависимость plain-crypto-js@^4.2.1. Сам пакет никогда не импортируется в коде; он существует исключительно для запуска postinstall-хука при npm install.</p><h3>Дроппер setup.js</h3><p>Файл setup.js весит 4209 байт и использует двухслойную обфускацию: сначала reversed Base64-декодирование (с подстановкой символов), затем XOR-шифр с ключом OrDeR_7077. Дроппер определяет ОС и загружает платформенный payload с C2-сервера.</p><h3>Payload по платформам</h3><p><b>macOS:</b> AppleScript-дроппер скачивает бинарный RAT с C2-сервера и сохраняет его как /Library/Caches/com.apple.act.mond — замаскирован под системный демон Apple. Запускается через /bin/zsh.</p><p><b>Windows:</b> PowerShell копируется в %PROGRAMDATA%\wt.exe (маскировка под Windows Terminal). VBScript-дроппер запускает скрытый PowerShell-скрипт с обходом Execution Policy.</p><p><b>Linux:</b> Python-скрипт RAT скачивается в /tmp/ld.py и запускается через nohup в фоновом режиме.</p><h3>Возможности RAT</h3><p>При первом запуске RAT отправляет на C2-сервер «отпечаток» системы: hostname, имя пользователя, версию ОС, архитектуру CPU, часовой пояс, время установки ОС и загрузки, список процессов, а также содержимое директорий /Applications, ~/Library и ~/Application Support. Затем RAT опрашивает C2 каждые <b>60 секунд</b>. Поддерживаемые команды:</p><ul><li><b>runscript</b> — выполнение произвольных shell-команд и Python-кода</li><li><b>peinject</b> — загрузка и запуск дополнительных бинарных payload</li><li><b>rundir</b> — перечисление содержимого директорий</li><li><b>kill</b> — самоуничтожение процесса</li></ul><h3>Антифорензика</h3><p>После выполнения дроппер удаляет себя (setup.js) и подменяет package.json чистой версией без postinstall-секции. При инспекции node_modules после заражения следов вредоносного скрипта не остаётся.</p><p><b>Это означает, что проверка node_modules постфактум бесполезна.</b> Единственный надёжный способ определить компрометацию — проверить package-lock.json на наличие вредоносных версий и IoC-пути на файловой системе (см. ниже).</p><h2>Кто обнаружил</h2><p>Атаку независимо обнаружили несколько компаний: <a href="https://socket.dev/blog/axios-npm-package-compromised">Socket</a> задетектировал вредоносный plain-crypto-js через 6 минут после публикации. <a href="https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan">StepSecurity</a> подтвердил компрометацию через AI Package Analyst и инструментирование GitHub Actions-раннера. Детальный технический разбор также <a href="https://safedep.io/axios-npm-supply-chain-compromise">опубликовала SafeDep</a>.</p><h2>Индикаторы компрометации (IoC)</h2><p><b>Файловая система:</b></p><p><b>Сеть:</b></p><p><b>SHA256 хеши:</b></p><h2>Что делать прямо сейчас</h2><p>Быстрая проверка — есть ли вредоносные версии в вашем lockfile:</p><p>Если команда ничего не вернула — ваш проект не затронут. Если нашлись совпадения:</p><ol><li>Откатить axios: npm install axios@1.14.0 (для 1.x) или npm install axios@0.30.3 (для 0.x) — это автоматически удалит plain-crypto-js</li><li>Проверить IoC-пути на файловой системе для вашей ОС (см. выше)</li><li>Заблокировать C2 на сетевом уровне: sfrclak[.]com / 142.11.206.73</li><li><b>Ротировать все секреты</b> на затронутых системах: npm-токены, SSH-ключи, API-ключи, переменные из .env</li><li>Проверить CI/CD-логи за 30–31 марта — ротировать все secrets из затронутых пайплайнов</li><li>Перейти на npm ci --ignore-scripts в CI/CD как постоянную политику</li></ol><p>Если обнаружены артефакты RAT — <b>считайте систему полностью скомпрометированной</b> и пересоберите из заведомо чистого состояния.</p><h2>Защита от транзитивных зависимостей</h2><p>Если axios используется как транзитивная зависимость (его тянет другой пакет), прямой npm install axios@1.14.0 не поможет — нужно зафиксировать версию через overrides в package.json:</p><p>Поле overrides работает в npm 8+, resolutions — в Yarn.</p><h2>Выводы</h2><p>Инцидент с axios — один из самых масштабных supply chain атак в npm по потенциальному охвату: при 100 миллионах загрузок в неделю даже 3-часовое окно доступности вредоносных версий критично. Для сравнения: компрометация <b>event-stream</b> в 2018 году затронула пакет с 2 миллионами загрузок в неделю.</p><p>Скорость реакции экосистемы впечатляет: Socket обнаружил вредоносный plain-crypto-js через 6 минут, npm отозвал пакеты менее чем за 3 часа. Но сам факт, что атакующему хватило одного украденного токена для публикации от имени доверенного мейнтейнера, ставит вопрос о необходимости обязательного использования OIDC Trusted Publishing для критической инфраструктуры npm.</p><p>Проверьте свои зависимости, ротируйте секреты и убедитесь, что ваш CI/CD-пайплайн защищён от автоматической установки непроверенных версий.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мигрировать на Node.js 22 без рисков: инструкция</title>
      <link>https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya</link>
      <comments>https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Гринь]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya</guid>
      <description><![CDATA[<p>Node.js 22 стал надёжным стандартом для компаний, которым важно сохранить стабильность после завершения поддержки прежних версий. Разберём практические шаги по безопасной миграции. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-migrirovat-na-node-js-22-bez-riskov--instrukciya">Как мигрировать на Node.js 22 без рисков: инструкция</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 14 Dec 2025 12:40:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Node.js 22 сегодня становится дефолтным выбором для компаний, которые откладывали обновление годами. Вокруг этой версии сформировалась зрелая экосистема, а крупные команды уже успели протестировать релиз в продакшене. Разберём, что думают разработчики о платформе и какие подводные камни вас ждут при миграции.</p><h2>Почему релиз Node.js 22 важен</h2><p>30 апреля 2025 года завершился жизненный цикл версии Node.js 18. Сообщество заранее предупреждало об этом через официальный аккаунт в X. Там напомнили разработчикам о необходимости перейти на более свежие версии — Node.js 20 или 22. Восемнадцатая версия перестала получать патчи безопасности, поэтому обновление стало критичным для поддержания стабильной работы приложений.</p><p>Наиболее надёжным вариантом стала миграция на Node.js 22, которая сейчас находится в статусе долгосрочной поддержки (LTS) и гарантирует обновления безопасности и стабильность на ближайшие годы.</p><p>Хотя релиз этой версии не выглядел революционным, он существенно изменил основу платформы. Многие возможности, которые раньше требовали внешних библиотек, теперь встроены прямо в платформу: WebSocket-клиент, стабильный fetch(), работа с файлами, Blob и URL, улучшенная совместимость ESM и CommonJS. Это уменьшает количество зависимостей, снижает вероятность уязвимостей и значительно упрощает поддержку проектов.</p><p>Помимо удобства разработки, в новой версии усилились производительность и безопасность. Обновлённый движок V8 ускоряет выполнение кода, а оптимизация старта и снижение потребления памяти делают Node.js более стабильным в высоконагруженных и serverless-сценариях. Улучшенная модель разрешений, строгие настройки TLS и расширенная поддержка AbortController повышают защиту на уровне рантайма, ограничивая последствия уязвимостей в сторонних пакетах. Это даёт компаниям возможность строить более надёжные сервисы с меньшими затратами на контроль рисков и эксплуатацию.</p><p>Node.js 22 также стал удобнее для работы гибридных команд. Стабильная интеграция ESM и CommonJS облегчает миграцию старых проектов, а унификация Web-API делает код универсальным и понятным даже для сотрудников без глубокого опыта в бэкенде. Улучшенные инструменты тестирования и диагностики повышают прозрачность разработки и снижают время на нахождение ошибок.</p><blockquote>Node.js 22 — эволюционный релиз. Он развивает ранее введённые возможности (fetch, ESM, WebSocket и др.), но не переворачивает парадигму разработки. Это укрепление уже заданного курса.</blockquote><h2>Возможности Node.js 22</h2><p><b>Расширение JavaScript и обновление V8.</b> Получив движок V8 12.x, Node.js подтянул все улучшения ECMAScript 2024. Код стал исполняться быстрее как за счёт оптимизаций в компиляторе, так и благодаря улучшенной работе с асинхронностью. Например, async/await теперь обрабатываются эффективнее, а создание структур данных, активно используемых в серверах, стало менее затратным.</p><p>С точки зрения разработчика изменения могут быть неочевидны, но приложения на реальной нагрузке выполняются быстрее, стабильнее и предсказуемее.</p><p><b>Corepack включён по умолчанию.</b> До выхода Node.js 22 разработчики сами решали, подключать ли Corepack. Теперь он активен без дополнительной настройки, и это серьёзное изменение в экосистеме. Все менеджеры пакетов контролируются единой прослойкой, что устраняет зависимость от версии, установленной глобально у разработчика или в CI.</p><p>На практике это означает, что версия менеджера пакетов становится частью проекта и перестаёт зависеть от среды. Ошибки вида «у меня работает, а у коллеги нет» заметно сокращаются. Благодаря этому процессы разработки и сборки становятся стабильнее.</p><blockquote>Corepack, как мне кажется, сильно упростит жизнь большим командам. Исчезает вечная история “а у меня Yarn другой версии” или “Pnpm не подтянулся”. Corepack берёт на себя управление версионированием менеджеров пакетов, а значит, сборки становятся более воспроизводимыми. Для корпоративных проектов это плюс, особенно если речь идёт о распределённых командах или CI/CD-конвейерах.</blockquote><p><b>WebSocket API и улучшенные Web Streams.</b> Node.js 22 внедрил нативную поддержку WebSocket API. Теперь можно создавать WebSocket-клиенты и серверы без сторонних библиотек вроде ws. Это делает код чище и ближе к браузерному API.</p><p>Параллельно были улучшены Web Streams. Работа с потоками стала предсказуемой, а инструменты вроде CompressionStream и DecompressionStream функционируют так же, как и в современных браузерах. Поддержка универсального кода — сервер + клиент — стала проще, а объём внешних зависимостей уменьшился.</p><p><b>Улучшения в работе CommonJS и ESM.</b> Node.js постепенно движется в сторону ESM, но у огромного количества проектов всё ещё используется CommonJS. В новой версии улучшена производительность смешанных проектов и сокращены ошибки при импорте модулей между двумя системами. Между ними появилось меньше «подводных камней», а значит миграция на ESM может идти постепенно, без ломки архитектуры.</p><p><b>Стабильный встроенный fetch().</b> Его реализация теперь полностью совпадает с браузерной, так что в простых кейсах можно отказаться от axios или node-fetch. Меньше зависимостей — быстрее запуск и меньше технического долга.</p><p><b>Развитие модели разрешений</b>, которая позволяет ограничивать доступ приложения к файловой системе, сети или переменным окружения прямо на уровне рантайма. Даже если зависимость уязвима, код не сможет выйти за пределы разрешённых прав. Это огромный шаг в сторону реальной безопасности.</p><blockquote>Я бы отметил более зрелую работу с Permission Model. Она уже не экспериментальная и реально помогает ограничивать доступ к файловой системе и сети. Параллельно улучшилась производительность V8, а вместе с ней и общая отзывчивость серверных приложений. Подтянули и Web-стек: стабильнее стали Web Streams, Request/Response и другие API, которые сближают Node с браузерами. Всё это не революция, но тренд на унификацию растёт.</blockquote><p><b>Расширенные возможности тестирования.</b> Node.js продолжает развивать встроенный тестовый фреймворк node:test. Теперь доступны кастомные репортеры, покрытие кода без внешних инструментов и mock timers (замена реальной работы таймеров). Это позволяет использовать встроенный тест-раннер для большинства задач, отказавшись от Jest или Vitest в простых проектах.</p><p><b>Обновления в безопасности.</b> Обновление OpenSSL — одно из самых чувствительных изменений в релизе. Поддержка старых криптоалгоритмов исключена, проверка сертификатов стала строже, а взаимодействие по TLS 1.3  стабильнее.</p><blockquote>С точки зрения безопасности рывка не произошло, но заметное движение есть: Permission Model, улучшенная работа с OpenSSL, более аккуратная валидация входящих данных. Всё это снижает риски, но полностью опасность не снимает, потому что реальная безопасность всё равно лежит в архитектуре, процессов CI/CD и культуре разработки.</blockquote><p><b>Повышенная производительность.</b> Заметные улучшения коснулись старта приложения, работы с памятью и производительности под нагрузкой. Приложения запускаются быстрее, а распределение нагрузки между worker threads стало более эффективным. Это позволит обслуживать больше запросов при тех же ресурсах и уменьшить расходы на инфраструктуру.</p><p><b>Международные стандарты и локализация.</b> Были обновлены Intl API на базе новой версии ICU. Преимущества: точные часовые пояса, поддержка новых календарей и систем чисел. Это критично для глобальных SaaS-платформ, аналитических сервисов и финтех-продуктов.</p><p>По словам Даниила Гоника, для разработчиков наиболее значимы такие изменения, как WebSocket-клиент, модульная система., обновление V8, улучшение JIT-компиляторов, добавление новых возможностей JS и улучшение встроенного test-раннера.</p><h2>Как безопасно мигрировать на Node.js 22</h2><p>Переход лучше начинать с <b>аудита и подготовки окружения</b>. Сначала стоит убедиться, что все зависимости поддерживают Node.js 22. Особенно это касается библиотек, которые используют нативные модули, криптографию и WebSockets. Проверка совместимости позволит избежать неожиданностей вроде ошибок компиляции или падений при запуске.</p><p>После этого нужно прогнать <b>тесты</b>. Даже минимальный набор позволит выявить проблемы, связанные с изменениями в ESM/CJS, WebSocket API или OpenSSL.</p><p>Само <b>обновление среды</b> зависит от выбранного инструмента. Через nvm или n процесс занимает секунды, а для Docker достаточно указать новый базовый образ. Если проект использует CI/CD, стоит уделить внимание Corepack: теперь он активен всегда, что может изменить поведение сборки.</p><p>После обновления полезно <b>проверить логи</b> и внимательно <b>изучить предупреждения</b>. Большинство проблем решается установкой последних версий библиотек, иногда — правкой конфигурации TLS или обновлением менеджера пакетов.</p><p>Обновление стоит внедрять поэтапно, начиная со staging или частичного продакшена, и держать готовность к откату.</p><blockquote>Я обычно советую подход двухконтурного обновления. Сначала поднять проект на 22-ю версию в отдельной среде, включить максимальный объём логов, запустить тесты и прогнать реальные сценарии. Потом обновить линтеры, сборщики и самые старые пакеты, чтобы убрать накопленные за годы предупреждения. И только когда всё стабильно, имеет смысл переключать продакшен. По сути, обновление Node нужно делать так же аккуратно, как обновление облачных сервисов: через изоляцию, наблюдаемость и бэкап-стратегию.</blockquote><blockquote>В Node.js 22 удалены некоторые устаревшие, малоиспользуемые функции, поэтому при переходе может потребоваться рефакторинг мест, где они использовались. Следует проверить депрекейты: Node.js 22 помечает ряд старых возможностей как устаревшие и предлагает альтернативы. Необходимо убедиться, что все библиотеки и пакеты, используемые проектом, поддерживают новую версию Node.js.<br />При скачке сразу с 18/20 на 22 некоторые зависимости могут оказаться несовместимыми с обновлённым движком V8 или новыми APIs — может понадобиться их обновление до последних версий.</blockquote><h2>Кому стоит подождать с переходом</h2><p>Переход на Node.js 22 подходит не всем проектам. В некоторых ситуациях разумнее подождать, чтобы избежать регрессий и поломок в продакшене. Вот кому стоит повременить с переходом:</p><ul><li>Тем, кто использует инструменты сборки или менеджеры пакетов, которые ещё не совместимы с Node.js 22 и могут выдавать ошибки или не работать вовсе.​</li><li>Командам, которые работают на старых версиях ОС. Известны проблемы совместимости с macOS 10.14 и ниже, а также возможны ошибки на Windows при миграции старых приложений.​</li><li>Тем, чьи CI/CD, контейнеры или Docker-образцы завязаны на конкретные версии Node.js и npm. Переход на 22-ю версию требует много регрессионного тестирования.​</li><li>Проектам с критически важными C++-добавками. Смена major-версии влечёт за собой обновление бинарных интерфейсов, что может вызывать ошибки при компиляции нативных модулей.</li><li>Пользователям определённых интеграций. Для некоторых версий MongoDB‑драйверов зафиксированы фатальные баги после перехода на конкретные промежуточные версии Node.js 22.x.​</li><li>Если вы используете проекты, которые сами рекомендуют Node.js 18 или 20, а обновление их зависимостей под 22 только планируется.</li></ul><blockquote>В продакшене чаще всего проблемы возникают не из-за самих изменений в платформе, а из-за того, как эти изменения проявляются в реальных проектах. Где-то обновился V8 и стал вести себя строже, где-то повылезали deprecated-модули, а где-то просто сломались сборщики или старые зависимости. Многие команды до сих пор живут на Webpack 4, Express 4 или TypeORM старых версий: вот они первыми столкнутся со сложностями.</blockquote><h2>Что дальше</h2><p>Среди будущих трендов в экосистеме <a href="http://node.js/">Node.js</a> Максим Захаренко выделяет следующие: <i>«Первое — постепенное сближение Node с Web-стеком, чтобы код становился максимально универсальным. Второе — рост влияния Bun и Deno, которые будут подталкивать Node к более агрессивной оптимизации. И третье — всё более активная интеграция с AI-инструментами, особенно в DevTools и в цепочках генерации кода»</i>.</p><blockquote>Всё больше веб-API внедряются в Node.js (fetch, WebSocket, EventTarget). Этот тренд будет продолжаться. ESM становится стандартом, поддержка будет расширяться, CommonJS постепенно уйдёт в прошлое. Расширяется WASI и поддержка WASM-модулей. Node.js движется в сторону мульти-языковой среды. Модель прав доступа и другие sandbox-механизмы также продолжат развиваться. Кроме того, в версии Node.js 22.5.0 экспериментально добавлен встроенный модуль SQLite (через –experimental-sqlite). Это важное уточнение: в релизе 22.0.0 SQLite отсутствовал.</blockquote><p>Даниил Гоник хотел бы увидеть в будущих релизах стабильную и удобную модель разрешений, возможность require() для ESM без флагов, улучшения в DevX: поддержка TS «из коробки», больше инструментов в ядре, расширение SEA (Single Executable Apps) и встроенные механизмы верификации зависимостей (подписи, integrity).</p><h2>Выводы</h2><p>Node.js 22 делает приложения быстрее, безопаснее и совместимее с Web API, улучшает работу с памятью и снижает зависимость от глобальных инструментов. Хотя переход требует подготовки, он не представляет серьёзных рисков, если следовать базовой процедуре: проверить зависимости, прогнать тесты и обновить среду постепенно. Если инфраструктура современная, а стек устойчивый, переход на Node.js 22 принесёт ощутимые преимущества как в скорости работы, так и в удобстве разработки.</p>]]></content:encoded>
    </item>
    <item>
      <title>Инженер реализовал завирусившийся XKCD-комикс про зависимости ПО</title>
      <link>https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po</link>
      <comments>https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po</guid>
      <description><![CDATA[<p>Инженер создал Stacktower — интерактивную версию культового XKCD-комикса, показывающую, как одна зависимость может «обрушить» все приложение</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po">Инженер реализовал завирусившийся XKCD-комикс про зависимости ПО</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 Dec 2025 09:04:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Веб-инженер <i>Маттиас Хюэль</i> <a href="https://stacktower.io/">создал</a> <b>интерактивную версию культового комикса XKCD №2347</b>, в котором автор высмеивает хрупкость современного ПО.</p><p>Это тот самый рисунок, который в последние месяцы превратился в популярный мем: огромные цифровые системы стоят на одном крошечном модуле, поддерживаемом энтузиастом из Небраски.</p><p>Но теперь эта «шутка» стала наглядной — <b>проект Stacktower превращает рисунок в настоящую визуализацию зависимостей</b>.</p><p>На заглавной схеме, полностью повторяющей комикс, можно нажать на любой блок — и увидеть реальные пакеты, библиотеки и цепочки зависимостей.</p><p>Проект динамически строит дерево зависимостей, позволяя проследить, как небольшие модули опираются на еще меньшее количество фундаментальных компонентов.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-05/1b29d25e-fccc-45ef-ade8-a7c35ad092ba.jpeg" alt="" /></figure><h2>Как работает Stacktower</h2><p>Сайт предлагает две модели: <i>«стабильную башню»</i> и <i>«неустойчивую башню»</i>, где уровни подстраиваются под выбранные библиотеки.</p><p>Пользователь может загрузить зависимости своих приложений — например, на <b>Python</b> или <b>JavaScript</b> — и увидеть, что будет, если убрать даже один элемент.</p><p>На странице приводится пример для <b>Node.js</b>:</p><p>приложение зависит от Express → Express зависит от body-parser → body-parser зависит от qs → и так далее</p><p>Stacktower иллюстрирует, что даже простое приложение тянет десятки модулей, часто неподконтрольных разработчику.</p><p>Есть и <b>Python-вариант</b>:</p><p>импорт Flask тянет Werkzeug, Jinja2, MarkupSafe, Click и еще несколько пакетов. А те, в свою очередь, имеют собственные зависимости.</p><h2>Зачем это нужно</h2><p>Автор подчеркивает: <b>цель проекта — не критиковать экосистемы, а показать их реальное устройство</b>.</p><p>Стек современных приложений неизбежно сложен и даже крошечный модуль может стать критически важным. Именно так в 2022 году случайное удаление библиотеки left-pad временно «сломало» огромный кусок JavaScript-мира.</p><p>Stacktower превращает эту абстрактную проблему в понятный визуальный эффект: убираешь одну зависимость — рушится вся конструкция.</p><h2>Комьюнити уже подхватило идею</h2><p>Проект быстро разошелся по Reddit, Hacker News и X: разработчики делятся скриншотами своих «башен», спорят о хрупкости экосистем и обсуждают, стоит ли пересматривать подход к зависимости.</p><p>Кто-то предлагает добавить поддержку Rust и Go, другие мечтают о корпоративной версии инструмента для визуального аудита безопасности.</p><p>Изучить проект подробнее можно на его <a href="https://github.com/matzehuels/stacktower">странице</a> на GitHub.</p>]]></content:encoded>
    </item>
    <item>
      <title>JavaScript: как логические операторы присваивания упрощают код и повышают читаемость</title>
      <link>https://tproger.ru/articles/javascript--kak-logicheskie-operatory-prisvaivaniya-uproshhayut-kod-i-povywayut-chitaemost</link>
      <comments>https://tproger.ru/articles/javascript--kak-logicheskie-operatory-prisvaivaniya-uproshhayut-kod-i-povywayut-chitaemost?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/javascript--kak-logicheskie-operatory-prisvaivaniya-uproshhayut-kod-i-povywayut-chitaemost</guid>
      <description><![CDATA[<p>null</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/javascript--kak-logicheskie-operatory-prisvaivaniya-uproshhayut-kod-i-povywayut-chitaemost">JavaScript: как логические операторы присваивания упрощают код и повышают читаемость</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 22 Oct 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это<a href="https://allthingssmitty.com/2025/07/28/logical-assignment-operators-in-javascript-small-syntax-big-wins/"> перевод статьи Мэта Смитта</a> (<a href="https://allthingssmitty.com/">Matt Smith</a>) — веб-разработчика, фронтенд-инженера и UX-дизайнера.</p><p>В повседневной работе с JavaScript нам часто приходится проверять значение переменной перед тем, как присвоить ей новое. Подобные проверки быстро превращаются в шаблон, особенно если вы работаете с props в компонентах, глобальными настройками или объектами состояния.</p><p>Именно здесь на помощь приходят логические операторы присваивания — компактное нововведение стандарта ES2021, которое позволяет сократить типичные условные конструкции, не меняя при этом саму логику кода.</p><h2>Что такое логические операторы присваивания?</h2><p>Логические операторы присваивания объединяют обычный логический оператор (||, &amp;&amp; или ??) с оператором присваивания (=), создавая короткую и наглядную запись.</p><p>По сути, это синтаксический сахар, позволяющий писать условное присваивание в одну строку. При этом они работают по тому же принципу, что и обычные логические выражения: правая часть вычисляется только в том случае, если левая не проходит логическую проверку — то есть оказывается falsy, truthy или nullish (в зависимости от конкретного оператора).</p><p><b>Примечание: </b>Оператор опциональной последовательности (?.) нельзя использовать в левой части логического присваивания.</p><p>Попытка сделать это приведёт к синтаксической ошибке:</p><p>Если нужно безопасно присвоить значение, используйте обычную проверку или промежуточную переменную:</p><p>Оператор опциональной последовательности (?.) возвращает значение свойства, а не ссылку на само свойство.</p><p>А поскольку в JavaScript присваивание возможно только в том случае, если левая часть выражения является ссылкой (например, переменной или свойством объекта), использование ?. в левой части делает выражение некорректным.</p><h2>Логическое присваивание через OR (||=)</h2><p>Оператор ||= выполняет присваивание только тогда, когда значение слева является ложным (falsy) — то есть false, 0, “”, null, undefined или NaN.</p><p>Присвоить, если значение — falsy.</p><p>Это эквивалент записи:</p><p>Этот оператор удобен, чтобы задать значение по умолчанию, если переменная ещё не инициализирована. Однако он перезаписывает такие значения, как 0, ” или false, даже если они были установлены специально.</p><p>Другой способ задать значения по умолчанию — использовать параметры функций с дефолтными значениями. Подробнее об этом можно прочитать в <a href="https://allthingssmitty.com/2025/06/29/default-parameters-your-code-just-got-smarter/">статье о параметрах по умолчанию</a> в JavaScript.</p><h2>Логическое присваивание через AND (&amp;&amp;=)</h2><p>Присвоить, если значение — truthy:</p><p>Этот оператор полезен, когда нужно обновить значение только при наличии уже существующего truthy значения.</p><p><b>Примечание: </b>при использовании &amp;&amp;= правая часть выражения вычисляется только если левая часть является truthy, и результат этого вычисления присваивается, даже если он окажется falsy.</p><p>Исходное значение (true) играет роль «ворот»: именно оно определяет, выполняется ли присваивание.</p><p>Однако новое значение берётся из результата вызова checkPermissions (или любого выражения справа).</p><p>Важно: оператор &amp;&amp;= не сохраняет старое значение, а заменяет его результатом вычисления правой части.</p><h2>Присваивание через nullish-оператор (??=)</h2><p>Присвоить, если значение — null или undefined:</p><p>Эквивалентно:</p><p>Используйте ??=, когда нужно задать значение только если переменная действительно отсутствует — то есть равна null или undefined, а не просто falsy. В отличие от ||=, этот оператор сохраняет корректные значения, такие как 0, false и ”.</p><p>Подробнее: если хотите глубже разобраться в механике nullish-оператора и принципах работы с дефолтными значениями — посмотрите <a href="https://allthingssmitty.com/2025/04/10/mastering-default-values-in-javascript-with-the-nullish-coalescing-operator/">материал о том, как грамотно использовать значения по умолчанию в JavaScript</a>.</p><h2>Значения по умолчанию для пропсов компонентов</h2><p>Логические операторы присваивания особенно удобны при работе с пропсами в компонентах.</p><p>Например, если часть значений не передана, можно задать дефолты прямо в коде:</p><p>Такой подход:</p><ul><li>делает код компактнее и читаемее,</li><li>избавляет от лишних if или тернарных выражений,</li><li>позволяет контролировать поведение пропсов при разных типах значений (null, undefined, false, ”).</li></ul><p>Идеально подходит для случаев, когда вы хотите задать понятные значения по умолчанию, не ломая текущую логику компонента.</p><h2>Важно учитывать</h2><ul><li>Оператор ||= срабатывает, когда левая часть — falsy-значение (0, ”, false, null, undefined). Это может привести к нежелательному перезаписыванию:</li></ul><ul><li>Используйте ??= если нужно проверять только на null или undefined, сохраняя корректные falsy-значения (0, ”, false).</li><li>Правая часть вычисляется только при необходимости, что сохраняет производительность и предотвращает побочные эффекты:</li></ul><h2>Пример с побочным эффектом</h2><p>В этом примере:</p><ul><li>Изначально obj.val равно 0, что является falsy. Поэтому выражение ++calls вычисляется и присваивается obj.val.</li><li>После первой строки obj.val становится 1 (truthy).</li><li>На второй строке условие уже не выполняется, и ++calls не вызывается.</li></ul><p>В результате значение calls остаётся равным 1, потому что вторая операция не выполняет инкремент.</p><h2>Поддержка браузерами</h2><p>Логические операторы присваивания поддерживаются всеми современными окружениями:</p><p>✅ Chrome 85+, Firefox 79+, Safari 14+, Edge 85+</p><p>✅ Node.js 15+</p><p>❌ Internet Explorer — не поддерживается</p><p>Если нужно обеспечить работу в старых окружениях, используйте транспайлер, например, @babel/preset-env с настройками ES2021.</p><h2>Теперь вы готовы!</h2><p>Логические операторы присваивания — небольшое, но очень полезное дополнение к JavaScript. Они делают код понятнее, уменьшают шаблонные конструкции и упрощают условную логику.</p><p>Особенно полезны они во фронтенд-разработке, например:</p><ul><li>при работе с props и state;</li><li>при задании значений по умолчанию для API;</li><li>при очистке и валидации форм.</li></ul><p>Если вы уже уверенно используете ||, &amp;&amp; и ??, переход на ||=, &amp;&amp;= и ??= будет естественным — здесь всё дело лишь в привычке.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Bun 1.3: full-stack рантайм, поддержка Redis и новый SQL API. Разобрались, что еще нового</title>
      <link>https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo</link>
      <comments>https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo</guid>
      <description><![CDATA[<p>Bun 1.3 стал full-stack рантаймом с Redis, SQL API, поддержкой MySQL и PostgreSQL, новым тест-раннером и ускорением сборки до 2,5 раз</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo">Вышел Bun 1.3: full-stack рантайм, поддержка Redis и новый SQL API. Разобрались, что еще нового</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 13 Oct 2025 04:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда <b>Oven</b> <a href="https://bun.com/blog/bun-v1.3">представила</a> <b>Bun 1.3</b> — крупнейший релиз в истории JavaScript-рантайма.</p><p>Теперь Bun официально позиционируется как <b>full-stack платформа</b> для фронтенда и бэкенда. И она объединяет сервер, сборщик, менеджер пакетов вместе с тест-раннером в одном инструменте.</p><p>В новую версию добавлены десятки ключевых функций: встроенные клиенты для <b>Redis</b>, <b>MySQL</b>, <b>PostgreSQL</b> и <b>SQLite</b>, единый <b>SQL API</b>, улучшенные <b>WebSocket-модули</b>, переработанный <b>тест-раннер</b> и поддержка <b>VSCode Test Explorer</b>.</p><h2>Full-stack по-умному</h2><p>Главное новшество — режим <b>full-stack Bun.serve()</b> с поддержкой роутинга, cookies и WebSockets.</p><p>Теперь фронтенд и бэкенд можно запускать в одном процессе без проблем с CORS, а приложение собрать в <b>единый исполняемый файл</b> с помощью bun build --compile.</p><p>Разработчики могут напрямую импортировать HTML, запускать React-приложения с хот-перезагрузкой и собирать проект одной командой bun init --react. По данным команды, скомпилированные React-приложения в Bun работают <b>до 1,8 раза быстрее, чем через nginx</b>.</p><h2>Новый SQL и встроенный Redis</h2><p>Bun 1.3 представил унифицированный <b>Bun.SQL API</b> — теперь один и тот же код работает с MySQL, PostgreSQL, SQLite и MariaDB. Добавлен хелпер sql.array() для работы с массивами в PostgreSQL, улучшена поддержка JSON и Unix-сокетов.</p><p>Кроме того, в рантайм встроен <b>Redis-клиент</b>, который поддерживает 66 команд, автоматическое переподключение, очереди сообщений и Pub/Sub. По данным разработчиков, он <b>значительно быстрее ioredis</b>, а поддержка кластеров и Lua-скриптов появится в будущих релизах.</p><h2>Новые возможности</h2><p>Среди прочих улучшений — <b>Zstandard-сжатие</b>, нативная поддержка <b>YAML</b>, API для безопасного хранения секретов (<b>Bun.secrets</b>), и серьезный прирост производительности: операции с криптографией ускорены <b>до 400х</b>, установка пакетов — <b>до 2,5х</b>.</p><p>Также обновлен менеджер пакетов с <b>интерактивным bun update</b>, изолированными установками и API для проверки безопасности зависимостей.</p><h2>Почему это важно</h2><p>Bun 1.3 превращает экспериментальный рантайм в <b>полноценную платформу для веб-разработки</b>, способную заменить Node.js, Vite и Redis-CLI одновременно.</p><p>Разработчики называют релиз «началом новой эпохи», цель которой — сделать Bun лучшим способом писать и развертывать JavaScript-приложения.</p>]]></content:encoded>
    </item>
    <item>
      <title>Курсы Node.js: обучение фреймворку с нуля</title>
      <link>https://tproger.ru/articles/kursy-node-js--obuchenie-frejmvorku-s-nulya</link>
      <comments>https://tproger.ru/articles/kursy-node-js--obuchenie-frejmvorku-s-nulya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анастасия Шишкина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kursy-node-js--obuchenie-frejmvorku-s-nulya</guid>
      <description><![CDATA[<p>Лучшие курсы по фреймворку Node.js. Рейтинг вариантов онлайн-обучения бесплатно и платно, обзор обучающей программы и стоимости курсов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kursy-node-js--obuchenie-frejmvorku-s-nulya">Курсы Node.js: обучение фреймворку с нуля</a>»</p>]]></description>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Oct 2025 13:11:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современные курсы Node.js — это пропуск в мир серверной разработки, где один язык JavaScript работает на всех уровнях приложения. Хотя технология появилась еще в 2009 году, главное преимущество остается неизменным: вы пишете и фронтенд, и бэкенд на одном языке, экономя время и силы. При этом Node.js отлично справляется с высокими нагрузками — его используют Netflix, Uber и LinkedIn для обработки миллионов запросов. А с растущим спросом на fullstack-разработчиков владение этой платформой становится не просто плюсом, а необходимостью для карьерного роста.</p><p>Чтобы помочь вам выбрать программу, я проанализировала около 50 предложений от онлайн-школ. В итоге отобрала 33 курса: топ-10 лучших программ, 8 узкоспециализированных вариантов, 10 курсов смежных направлений для расширения компетенций и 5 бесплатных уроков для старта.</p><p><b>В статье вы также найдете уникальные промокоды, которые я нашла специально для вас.</b></p><h2>ТОП-10 лучших курсов Node.js в 2026 году</h2><ol><li><a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=1">Backend Node.js-разработчик</a> от Нетологии — бэкенд без нового языка: одна технология для перехода на уровень middle с тремя реальными проектами и английским для IT.</li><li><a href="https://experts2.ru/LDizwb?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=2">Fullstack-разработчик на Node.js</a> от Eduson Academy — стажировка в IT-компании во время обучения + 10 проектов в портфолио и гарантия трудоустройства с полным возвратом средств.</li><li><a href="https://experts2.ru/oSufiE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=3">Node.js</a> от Skillbox — бесплатный старт с персональным темпом: мгновенный доступ к материалам и поддержка кураторов с проверкой домашних заданий.</li><li><a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=4">Бэкенд на Node.js для фронтенд-разработчиков</a> от Яндекс Практикум — 3,5 месяца до полноценного бэкенд-специалиста: Express, MongoDB, Nest.js, PostgreSQL и деплой через Docker.</li><li><a href="https://experts2.ru/jdoyYU?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=5">Node.js Developer</a> от OTUS.ru — архитектура Node.js + TypeScript с GraphQL, WebSockets и TDD под руководством практикующих разработчиков.</li><li><a href="https://experts2.ru/sBrJaw?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=6">Node.js-разработчик</a> от Хекслет — 10 месяцев с нуля до профуровня: Fastify, Git, Jest, линтеры и четыре проекта от игр до таск-сервиса.</li><li><a href="https://experts2.ru/xoudRX?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=7">NodeJS - с нуля</a> от PurpleSchool — пожизненный доступ + налоговый вычет: от основ JavaScript до Telegram-бота и VPS-деплоя.</li><li><a href="https://experts2.ru/qJrcyQ?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=8">Fullstack-разработчик на Node.js</a> от Хекслет — шесть проектов в портфолио с первого дня + подготовка к собеседованиям и вакансии партнеров.</li><li><a href="https://experts2.ru/zZaeIh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=9">Backend разработчик на Node.js</a> от PurpleSchool — NestJS с MongoDB-агрегациями + два бесплатных модуля и карьерная карта для новичков.</li><li><a href="https://experts2.ru/jSoxEh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=10">Backend разработка на Node.js</a> от Merion Academy — живые сессии с разбором V8 и Event Loop + SQLite/PostgreSQL с паспорт-аутентификацией и NGINX.</li></ol><p>Обучение Node.js подойдет тем, кто уже знаком с JavaScript, но хочет освоить серверную сторону и увеличить доход. Отличный выбор для фронтенд-разработчиков, которые устали зависеть от бэкендеров и хотят сами создавать полноценные приложения. Также курсы станут находкой для начинающих, которые ищут точку входа в IT через универсальную технологию. Если уже пробовали писать код и хотите разобраться в создании API, работе с базами и деплое — вам сюда.</p><h2>Онлайн-курсы Node.js</h2><p><b>1. <a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=1">Backend Node.js-разработчик</a> | Нетология</b></p><p><i>Используйте промокод kursfinder, чтобы получить скидку 7%</i></p><p><a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=1">Получить скидку &gt;&gt;&gt;</a></p><p>Курс позволяет дополнить компетенции во frontend бэкенд-навыками, для чего не требуется изучать новый язык программирования — достаточно освоить единственную технологию. Вы изучите новые инструменты, расширите профессиональный стек и достигнете уровня middle-разработчика. Это откроет возможность работы над более сложными проектами и повысит вашу конкурентоспособность на позициях с повышенным доходом.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/3507e158-8ef1-46c8-bb95-e0ee3229fa46.jpg" alt="" /></figure><ul><li>Стоимость: 28 500 рублей</li><li>Длительность: 6 месяцев</li><li>Формат обучения: видеолекции, практические задания</li><li>Сертификат: удостоверение о повышении квалификации</li></ul><p><b>Кому подойдет: </b></p><ul><li>будущим fullstack-разработчикам;</li><li>тем, кто хочет перейти на middle-уровень.</li></ul><p><b>Преимущества:</b></p><ul><li>персональное предложение со скидкой после консультации;</li><li>три проекта для резюме: веб-библиотека, сервис доставки еды и агрегатор гостиниц;</li><li>бесплатная проверка начальных знаний;</li><li>свыше сорока задач для отработки навыков;</li><li>возможность заниматься с любого устройства через приложение;</li><li>постоянный офлайн-доступ к учебным файлам;</li><li>дополнительный блок по техническому английскому в IT.</li></ul><p><b>Недостатки:</b></p><ul><li>курс в формате видеозаписи без живого общения с преподавателями.</li></ul><p><b>Программа обучения:</b></p><ul><li>Развертывание рабочего окружения Node.js</li><li>Основы веб-разработки на фреймворке Express.js</li><li>Создание работающего приложения как курсовой работы</li><li>Внедрение статической типизации через TypeScript</li><li>Переход на enterprise-фреймворк Nest.js</li><li>Cloud-решения для хранения данных от Yandex Cloud</li><li>Финальный проект — многомодульный сайт-агрегатор</li></ul><p><a href="https://experts2.ru/MmwrpE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=1">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>2. <a href="https://experts2.ru/LDizwb?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=2">Fullstack-разработчик на Node.js</a> | Eduson Academy</b></p><p>Это путь с нуля до универсального разработчика, владеющего полным циклом создания программных решений на JavaScript и Node.js. Практическая часть включает стажировку в профильной компании, что является ступенью к удаленной работе. Курс подходит для глубокого изучения backend и frontend, и эти компетенции можно интегрировать в свою текущую работу или использовать для кардинальной смены профессии. Результатом становится систематизация знаний через практику и пополнение портфолио десятью значимыми работами, что ведет к увеличению конкурентоспособности и доходности специалиста.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/1392a7e7-e91d-41bb-8031-cce7aa012872.jpg" alt="" /></figure><ul><li>Стоимость: 149 976 рублей</li><li>Длительность: от 11,5 месяцев</li><li>Формат обучения: видеолекции, скринкасты, тренажеры, практические задания, тесты</li><li>Сертификат: диплом о профессиональной переподготовке</li></ul><p><b>Кому подойдет: </b></p><ul><li>тем, кто хочет освоить новую IT-профессию;</li><li>начинающим JavaScript-разработчикам;</li><li>смежным специалистам в сфере IT.</li></ul><p><b>Преимущества:</b></p><ul><li>портфолио из десяти полноценных проектов;</li><li>стажировка в IT-компании параллельно с учебным процессом;</li><li>второй курс в подарок при быстрой регистрации;</li><li>гарантия трудоустройства или полный возврат средств;</li><li>гибкий график с полностью онлайн-форматом;</li><li>поддержка персонального куратора без выходных.</li></ul><p><b>Недостатки:</b></p><ul><li>не хватает онлайн-вебинаров.</li></ul><p><b>Программа обучения:</b></p><ul><li>Жизненный цикл программного обеспечения</li><li>Введение в профессию fullstack-разработчика</li><li>Основные инструменты разработчика</li><li>Базовая верстка: HTML и CSS</li><li>Работа с готовыми макетами сайтов</li><li>Базовый синтаксис JavaScript</li><li>Продвинутые концепции JavaScript</li><li>Стиль и качество написания кода</li><li>Интеграция TypeScript в разработку</li><li>Применение Node.js в реальных задачах</li><li>Публикация и сопровождение готовых проектов</li><li>Построение карьеры в ИТ-индустрии</li><li>Специфика удаленного формата работы</li></ul><p><a href="https://experts2.ru/LDizwb?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=2">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>3. <a href="https://experts2.ru/oSufiE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=3">Node.js</a> | Skillbox</b></p><p><i>Используйте промокод kursfinder, чтобы получить скидку 50%</i></p><p><a href="https://experts2.ru/oSufiE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=3">Получить скидку &gt;&gt;&gt;</a></p><p>Обучение направлено на расширение технического кругозора через освоение полного цикла разработки — от клиентского кода до серверной логики. Выпускники получают возможность самостоятельной разработки работающих в реальном времени веб-сервисов. Освоение backend-разработки на JavaScript с использованием Node.js дает четкое представление о взаимодействии клиентской и серверной архитектуры, усиливая конкурентные преимущества специалиста.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/806d8898-d0d8-43a1-8ef4-1f52844c0a94.jpg" alt="" /></figure><ul><li>Стоимость: 43 026 рублей</li><li>Длительность: 2 месяца</li><li>Формат обучения: видеолекции, практические задания, тесты, работа над проектами</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>frontend-разработчикам;</li><li>backend-разработчикам.</li></ul><p><b>Преимущества:</b></p><ul><li>помощь в выборе профессии после оформления заявки;</li><li>бесплатный доступ к стартовым модулям программ;</li><li>полезный подарок для новых слушателей;</li><li>постоянный доступ к материалам курса;</li><li>обучение в персонализированном темпе;</li><li>практическая направленность материала;</li><li>мгновенный старт занятий после оплаты;</li><li>проверка домашних работ кураторами;</li><li>бесплатный доступ к платформе для изучения английского.</li></ul><p><b>Недостатки:</b></p><ul><li>не предусмотрена помощь с трудоустройством;</li><li>ограниченное количество мест на программу.</li></ul><p><b>Программа обучения:</b></p><ul><li>Настройка рабочего окружения</li><li>Решение базовых задач на языке</li><li>Работа с асинхронным кодом</li><li>Проектирование реляционных баз данных</li><li>Использование нереляционных хранилищ данных</li><li>Создание CLI-приложений</li><li>Углубленное изучение теоретических основ</li><li>Реализация real-time функциональности через WebSockets</li><li>Дипломный проект: сервис для ведения личных заметок</li></ul><p><a href="https://experts2.ru/oSufiE?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=3">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>4. <a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=4">Бэкенд на Node.js для фронтенд-разработчиков</a> | Яндекс Практикум</b></p><p><i>Купите любой курс с выгодой до 20% при оплате сразу или получите скидку 7% за прохождение бесплатной части курса за неделю</i></p><p><a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=4">Получить скидку &gt;&gt;&gt;</a></p><p>За три с половиной месяца обучения формируются навыки создания API на Express с подключением MongoDB и Mongoose, реализации систем авторизации и регистрации, а также поддержки и модификации работающих приложений. Осваивается взаимодействие с базами данных через SQL, безопасная передача данных между клиентской и серверной частью и деплой обеих составляющих без использования контейнеризации. Дополнительно изучается разработка приложений на Nest.js с PostgreSQL, покрытие бэкенда юнит-тестами и развертывание проектов через Docker и Docker Compose.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/114329ce-9b82-411a-9f1f-fa77c821f1b3.jpg" alt="" /></figure><ul><li>Стоимость: 62 000 рублей</li><li>Длительность: 3,5 месяца</li><li>Формат обучения: текстовые материалы, вебинары, тренажеры, проектная работа</li><li>Сертификат: удостоверение о повышении квалификации</li></ul><p><b>Кому подойдет: </b></p><ul><li>тем, кто знаком с основами JavaScript, TypeScript и Git;</li><li>специалистам по фронтенд для перехода на фулстек-разработку.</li></ul><p><b>Преимущества:</b></p><ul><li>нагрузка от 15 часов в неделю с возможностью совмещения с работой;</li><li>ревью кода от опытных разработчиков;</li><li>два готовых проекта для личного портфолио;</li><li>обучение по спринтам с гибким графиком;</li><li>бесплатный старт для ознакомления с программой;</li><li>перенос дедлайнов при возникновении сложностей;</li><li>постоянный доступ к тренажеру для практики.</li></ul><p><b>Недостатки:</b></p><ul><li>не для новичков.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в основы бэкенд-разработки</li><li>Освоение связки Node.js, фреймворка Express и MongoDB</li><li>Создание веб-приложений с использованием Nest.js</li><li>Работа с базами данных через PostgreSQL</li><li>Развертывание и настройка удаленного сервера</li></ul><p><a href="https://experts2.ru/yUcYxu?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=4">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>5. <a href="https://experts2.ru/jdoyYU?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=5">Node.js Developer</a> | OTUS.ru</b></p><p>Слушатели осваивают архитектурные особенности Node.js и учатся писать структурированный код на TypeScript. Курс предусматривает работу с системами управления базами данных MongoDB и PostgreSQL, где отдельное внимание уделяется построению и оптимизации запросов. Применение методологии TDD, создание серверов GraphQL с использованием Apollo и интеграция Web Sockets посредством Socket.IO в совокупности обеспечивают комплексное развитие навыков разработчика.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/5812087e-3481-44e8-96bd-e487368b431e.jpg" alt="" /></figure><ul><li>Стоимость: 71 000 рублей</li><li>Длительность: 4 месяца</li><li>Формат обучения: интерактивные вебинары, домашние задания, работа над проектами</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>разработчикам с опытом программирования на JS.</li></ul><p><b>Преимущества:</b></p><ul><li>обучение под руководством практикующих IT-специалистов;</li><li>льготная стоимость после успешного входного тестирования;</li><li>возможность совмещения занятий с основной работой;</li><li>регулярные живые вебинары два раза в неделю;</li><li>доступ к консультациям с преподавателями курса;</li><li>поддержка в подготовке к поиску работы.</li></ul><p><b>Недостатки:</b></p><ul><li>необходимо ждать начала обучения.</li></ul><p><b>Программа обучения:</b></p><ul><li>Фундаментальные основы Node.js в сочетании с TypeScript</li><li>Создание веб-серверов и методы работы с данными</li><li>Развертывание инфраструктуры и вывод проектов в продакшн</li><li>Изучение современных API-технологий GraphQL и tRPC</li><li>Завершающая проектная работа для закрепления навыков</li></ul><p><a href="https://experts2.ru/jdoyYU?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=5">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>6. <a href="https://experts2.ru/sBrJaw?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=6">Node.js-разработчик</a> | Хекслет</b></p><p>Десятимесячная программа позволяет освоить работу в экосистеме Node.js, верстку с применением HTML и CSS, создание веб-приложений через фреймворк Fastify. Слушатели изучают составление SQL-запросов и работу с СУБД PostgreSQL, систему контроля версий Git, разработку асинхронных приложений на Node.js. Дополнительно приобретаются навыки тестирования кода с помощью Jest, проектирования архитектуры приложений и API, поддержания качества кода через линтеры.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/2bed3a80-9c0c-415a-99bb-ed0f2c90a72a.jpg" alt="" /></figure><ul><li>Стоимость: 89 000 рублей</li><li>Длительность: 10 месяцев</li><li>Формат обучения: видеолекции, упражнения, проектная работа</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>изучавшим JS самостоятельно;</li><li>начинающим фронтендерам;</li><li>IT-специалистам для перехода в fullstack-разработку.</li></ul><p><b>Преимущества:</b></p><ul><li>скидка до 31 000 рублей на полную программу обучения;</li><li>четыре проекта в портфолио на GitHub — от игровых приложений до сервиса задач;</li><li>доступ к вакансиям от партнеров школы;</li><li>поддержка наставников, работающих в разработке;</li><li>пять бесплатных вводных уроков;</li><li>подготовка к job-hunting и прохождению интервью;</li><li>специализированный курс технического английского.</li></ul><p><b>Недостатки:</b></p><ul><li>нет постоянного набора.</li></ul><p><b>Программа обучения:</b></p><ul><li>Изучение фундаментальных основ программирования</li><li>Углубленное освоение языка JavaScript</li><li>Работа с асинхронными операциями и сетевыми запросами</li><li>Создание полноценных веб-приложений</li><li>Освоение TypeScript от базового синтаксиса до продвинутых техник</li></ul><p><a href="https://experts2.ru/sBrJaw?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=6">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>7. <a href="https://experts2.ru/xoudRX?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=7">NodeJS - с нуля</a> | PurpleSchool</b></p><p>После обучения выпускники получают компетенции в разработке приложений на NodeJS, построении архитектуры масштабируемых решений и понимании внутренней структуры NodeJS и движка V8. Приобретаются знания о работе Event Loop, навыки программирования на TypeScript, применения Dependency Injection и создания легко поддерживаемого кода. Изучаются интеграционные процессы с внешними API, методы анализа производительности и утечек памяти, создание собственных промежуточных обработчиков, реализация механизмов авторизации и защитных элементов для API.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/8af48452-95af-4ba4-bcae-cbb9fc3934c9.jpg" alt="" /></figure><ul><li>Стоимость: от 3 999 рублей</li><li>Длительность: от 2 месяцев</li><li>Формат обучения: видеоуроки с конспектами, упражнения, тесты, домашние задания</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет:</b></p><ul><li>тем, кто знаком с TypeScript и JavaScript.</li></ul><p><b>Преимущества:</b></p><ul><li>бесплатная консультация перед началом обучения;</li><li>гарантия возврата средств в течение месяца;</li><li>комфортный темп для совмещения с работой;</li><li>несколько тарифов с фиксированной или гибкой датой старта;</li><li>детальная обратная связь от кураторов;</li><li>неограниченный по времени доступ к материалам;</li><li>голосовые консультации с экспертами курса;</li><li>реализация как командных, так и персональных проектов.</li></ul><p><b>Недостатки:</b></p><ul><li>код-ревью домашних заданий доступно на более дорогих тарифах.</li></ul><p><b>Программа обучения:</b></p><ul><li>Изучение возможностей Node.js для бэкенд-разработки</li><li>Настройка рабочего окружения и вводный модуль</li><li>Многопоточность и внутреннее устройство движка V8</li><li>Применение менеджера пакетов Node Package Manager</li><li>Создание консольного CLI-приложения</li><li>Разработка API с использованием Express.js</li><li>Интеграция TypeScript в проект</li><li>Анализ архитектурных решений и методы их оптимизации</li><li>Работа с базами данных, системами авторизации и тестированием</li></ul><p><a href="https://experts2.ru/xoudRX?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=7">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>8. <a href="https://experts2.ru/qJrcyQ?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=8">Fullstack-разработчик на Node.js</a> | Хекслет</b></p><p>Программа формирует навыки создания сайтов и веб-приложений с нуля, верстки страниц на HTML и CSS, освоения языка программирования JavaScript. К финалу обучения портфолио пополняется шестью проектами, что создает существенные предпосылки для трудоустройства на позицию fullstack-разработчика. Наставники обеспечивают поддержку на всех стадиях обучения. Полученные компетенции в JavaScript и веб-верстке открывают доступ к участию в перспективных и финансово привлекательных проектах.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/1021ed3b-e759-4c73-a54a-77d8446e9f1f.jpg" alt="" /></figure><ul><li>Стоимость: от 139 000 рублей</li><li>Длительность: 16 месяцев</li><li>Формат обучения: видеолекции, упражнения, проектная работа</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>новичкам, которые хотят стать востребованными IT-специалистами;</li><li>IT-специалистам, решившим сменить профиль;</li><li>fullstack-разработчикам для актуализации компетенций.</li></ul><p><b>Преимущества:</b></p><ul><li>бронирование текущей цены со скидкой после оставления контактов;</li><li>шесть проектов в портфолио на GitHub — от текстовой игры до функционального мессенджера;</li><li>поддержка наставников-разработчиков из индустрии;</li><li>доступ к вакансиям от компаний-партнеров;</li><li>обучение в индивидуальном темпе без жестких дедлайнов;</li><li>практическая направленность занятий с первого дня.</li></ul><p><b>Недостатки:</b></p><ul><li>некоторым пользователям курс покажется долгим.</li></ul><p><b>Программа обучения:</b></p><ul><li>Основы современной верстки</li><li>Базовые принципы верстки контента</li><li>Позиционирование элементов средствами CSS</li><li>Работа с модулем Flexbox</li><li>Верстка по технологии CSS Grid</li><li>Фундамент языка JavaScript</li><li>Методы работы с массивами</li><li>Принципы работы с объектами</li><li>Введение в систему контроля версий Git</li><li>Подготовка к процессу трудоустройства</li><li>Введение в устройство интернета</li><li>Применение регулярных выражений</li><li>Изучение протокола HTTP</li><li>Углубленное тестирование кода</li></ul><p><a href="https://experts2.ru/qJrcyQ?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=8">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>9. <a href="https://experts2.ru/zZaeIh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=9">Backend разработчик на Node.js</a> | PurpleSchool</b></p><p>Курс начинается с настройки рабочего окружения Node.JS, знакомства с TypeScript и перехода к фреймворку NestJS. Программа включает разбор основных компонентов: сервисов, модулей и контроллеров, с последующим развертыванием базы данных и началом работы с ней. Изучаются методы валидации входящих данных, принципы организации авторизации. Значительный блок посвящается тестированию и отладке приложений, востребованным в реальной разработке. Для углубленного изучения предусмотрено рассмотрение агрегаций и функций в MongoDB.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/10f15b34-66c9-4606-93f5-2529de1defdd.jpg" alt="" /></figure><ul><li>Стоимость: от 3 999 рублей</li><li>Длительность: от 2 месяцев</li><li>Формат обучения: видеоуроки, конспекты, упражнения, тесты</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>разработчикам;</li><li>смежным IT-специалистам;</li><li>всем, кто владеет JavaScript на базовом уровне.</li></ul><p><b>Преимущества:</b></p><ul><li>бесплатное прохождение двух стартовых модулей;</li><li>доступность для слушателей без начальной подготовки;</li><li>обучение в формате интенсивных спринтов;</li><li>просмотр видеоуроков на любой технике;</li><li>участие в разработке реальных проектов;</li><li>ревью кода от опытных наставников;</li><li>развитие навыков командной работы;</li><li>бессрочный доступ к учебным материалам;</li><li>целенаправленная подготовка к собеседованиям;</li><li>индивидуальная карта профессионального роста.</li></ul><p><b>Недостатки:</b></p><ul><li>домашние задания с проверкой недоступны на базовом тарифе.</li></ul><p><b>Программа обучения:</b></p><ul><li>Изучение возможностей и преимуществ фреймворка</li><li>Настройка профессиональной среды разработки</li><li>Освоение типов и структур в TypeScript</li><li>Введение в модули, контроллеры и провайдеры</li><li>Практическая работа с базами данных</li><li>Изучение типов тестирования и отладки приложений</li><li>Реализация валидации и систем авторизации</li></ul><p><a href="https://experts2.ru/zZaeIh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=9">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>10. <a href="https://experts2.ru/jSoxEh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=10">Backend разработка на Node.js</a> | Merion Academy</b></p><p>Студенты разбираются с Node.js: установкой через npm, развертыванием сервера и созданием API под клиентские нужды. Осваивают базы данных на SQLite — выполняют базовые операции с данными. Организуют маршрутизацию, осваивают REST API, учатся передавать и обрабатывать запросы. В финале выкладывают проект на VPS с настройкой NGINX, подключают PostgreSQL и внедряют аутентификацию на Passport.js.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-10-10/4e326ef4-9da8-4eed-acd1-54cebc2f2fe7.jpg" alt="" /></figure><ul><li>Стоимость: 8 920 рублей</li><li>Длительность: 2 месяца</li><li>Формат обучения: модули с видеоуроками, лабораторные, работа с преподавателями</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b></p><ul><li>начинающим и опытным разработчикам.</li></ul><p><b>Преимущества:</b></p><ul><li>пожизненный доступ ко всем учебным материалам;</li><li>бесплатный ознакомительный урок;</li><li>выгодная стоимость обучения;</li><li>налоговый вычет в размере 13% от оплаты;</li><li>бесплатный переход между курсами;</li><li>мини-курс по базовой IT-лексике на английском;</li><li>карьерный интенсив для IT-специалистов.</li></ul><p><b>Недостатки:</b></p><ul><li>иногда встречаются технические сбои.</li></ul><p><b>Программа обучения:</b></p><ul><li>Основы работы с JavaScript</li><li>Логические операторы и циклы в JavaScript</li><li>Функции и методы в JavaScript</li><li>Структуры данных в JavaScript</li><li>Система модулей в JavaScript</li><li>Введение в платформу Node.js</li><li>Создание приложения-задачника на Node.js</li><li>Разработка API со случайными данными на Express.js</li><li>Создание Telegram-бота для техподдержки</li><li>Углубленное изучение Node.js</li><li>Завершающий модуль курса</li></ul><p><a href="https://experts2.ru/jSoxEh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=10">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><h2>Еще 8 дополнительных курсов Node.js</h2><p>Если в основном рейтинге вы не нашли то, что искали — не переживайте. В подборке еще 8 курсов по Node.js на разные случаи жизни. Здесь есть программы с акцентом на enterprise-разработку, микросервисы или совмещение с другими технологиями. Такой выбор поможет подобрать вариант под карьерные цели.</p><ul><li><a href="https://experts2.ru/KzrTgt?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js. Разработка серверов приложений и API</a> от HTML Academy. На курсе студенты заглянут под капот Node.js и разберутся, как работает знаменитый цикл событий — поймут разницу между микро- и макрозадачами и научатся управлять асинхронным кодом. На практике освоят работу с файловой системой: будут читать и создавать файлы, обходить ограничения. Познакомятся с потоками (Streams) для генерации объемных данных и взаимодействия с внешними API.</li><li><a href="https://experts2.ru/AwesKz?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js и Nest.js. Микросервисная архитектура</a> от HTML Academy. В рамках курса студенты освоят интеграцию MongoDB и PostgreSQL с Nest.js, включая описание моделей, работу с Prisma ORM и реализацию паттерна «Репозиторий». Программа включает построение системы безопасности с JWT-аутентификацией, валидацией данных и использованием guards/pipes. Учащиеся изучат микросервисную архитектуру с RabbitMQ, паттерн BFF и отправку email-уведомлений. Завершится курс деплоем приложения через Docker с освоением продвинутых возможностей Nest.js для работы с файлами и обработки исключений.</li><li><a href="https://experts2.ru/aksZyO?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js Серверный JavaScript</a> от Loftschool. Всего за полтора месяца вы научитесь создавать серверные приложения любой сложности — от настройки скоростного обмена данными до деплоя на популярные платформы и серверного рендеринга. Вас ждет более 100 часов теории и практики в разных форматах, поддержка эксперта-наставника и реальные проекты для портфолио. После обучения останется бессрочный доступ ко всем материалам — сможете возвращаться к урокам в любой момент.</li><li><a href="https://experts2.ru/ecCNvb?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node JS разработчик</a> от itProger. Обучение проходит в личном кабинете на онлайн-платформе с заданиями с моментальной автопроверкой, интерактивными тестами и работой над проектом. За два-четыре месяца студенты осваивают разработку приложений на Node с применением Express, MongoDB и сопутствующих технологий. Доступны четыре тарифных плана, предусмотрено выполнение дипломного проекта и оказывается помощь с трудоустройством.</li><li><a href="https://experts2.ru/dzuRTm?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js </a>от JavaScript.ru. Этот курс — для разработчиков, которые уже знакомы с основами Node.js и хотят научиться создавать по-настоящему масштабируемые приложения. За шесть недель вы глубоко погрузитесь во фреймворк NestJS: разберетесь с внедрением зависимостей, научитесь грамотно управлять провайдерами и строить модульную архитектуру. На практике освоите современные подходы к маршрутизации и различным видам интеграций — от подключения баз данных до работы с внешними API.</li><li><a href="https://experts2.ru/znkPyA?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js </a>от Edwica. Этот курс — для JS-разработчиков, которые хотят прокачаться в бэкенде. За 10 интенсивных уроков вы с нуля освоите Node.js: поймете, как устроена платформа, научитесь создавать API на Express и работать с базами данных. Вы на практике разберетесь со встроенными модулями, чтобы уверенно писать серверные приложения.</li><li><a href="https://experts2.ru/tvHqGp?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Серверное программирование на Node.js</a> от Специалиста. Программа повышения квалификации объемом 36 академических часов рассматривает особенности работы на серверной JavaScript-платформе. Слушатели осваивают алгоритм установки и запуска платформы, работу с встроенными и внешними модулями, разработку приложений различного уровня сложности и масштаба.</li><li><a href="https://experts2.ru/TBhrzo?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js</a> от Udemy. Видеокурс для программистов включает 172 лекции с практическими заданиями по внутреннему устройству Node. Изучается архитектура платформы, цикл событий и пул потоков, использование менеджера пакетов и фреймворка Express. По завершении обучения выдается сертификат.</li></ul><h2>Еще 10 дополнительных смежных курсов</h2><p>Node.js редко работает в вакууме — ему нужны надежные помощники. В подборке из 10 смежных курсов собрали необходимое для комплексного развития: администрирование, тестирование, мониторинг приложений. Эти знания помогут не просто писать код, а вести проекты от идеи до продакшена.</p><ul><li><a href="https://experts2.ru/cjEPqa?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Fullstack-разработчик на JavaScript</a> от Нетология. За 13 месяцев вы с нуля станете востребованным fullstack-разработчиком. Вы будете создавать живые сайты и приложения, освоите фронтенд и выберете бэкенд под свои интересы — мощный Node.js, универсальный Python или гибкий PHP. Ваше портфолио возрастет на 25 настоящих проектов, вы получите опыт на стажировке, диплом и мощную поддержку для старта карьеры.</li><li><a href="https://experts2.ru/ymCqeO?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">JavaScript</a> от Skillbox. Всего за 3 месяца вы прокачаете JavaScript с нуля до уверенного уровня. Вас ждет настоящая кодерская закалка: больше 50 заданий на реальных примерах из практики. Неважно, новичок вы или хотите навести порядок в знаниях — научитесь работать с библиотеками, асинхронным кодом и сможете оживить любой сайт. Все материалы останутся с вами навсегда, а кураторы будут помогать на каждом шагу.</li><li><a href="https://experts2.ru/ypgSNv?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Backend-разработчик на PHP </a>от Skillfactory. За двенадцать месяцев вы с нуля освоите профессию backend-разработчика под руководством опытных экспертов. Программа включает освоение фронтенда и бэкенда, работу с языком запросов SQL, базами данных и платформой Docker. Вы получите навыки базового администрирования и работы с фреймворком Laravel, при этом 80% обучения составляет практика в различных форматах — от работы над проектами до участия в хакатонах. Карьерные специалисты помогут вам подготовиться к трудоустройству.</li><li><a href="https://experts2.ru/HUbdhq?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Python-разработчик</a> от Slurm. Всего за 4 месяца вы с нуля станете Python-разработчиком, даже если никогда не программировали. Научитесь создавать сайты на Django, работать с базами данных и Git, подключите внешние API. Опытные наставники помогут на каждом этапе, а в финале вы получите диплом, подтверждающий ваши новые навыки.</li><li><a href="https://experts2.ru/uchnHM?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Backend-разработчик</a> от Loftschool. 12 недель — и вы бэкенд-разработчик на Node.js. Возьмете под контроль REST API, подружитесь с SQL и NoSQL базами, освоите WebSocket и безопасную аутентификацию. Соберете портфолио из 4 полноценных проектов с деплоем и получите бонус — основы PHP для универсальности.</li><li><a href="https://experts2.ru/BdmWyc?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Backend-разработчик</a> от Международной академии бизнеса IAB. Всего за 1-3 месяца вы получите 14 ключевых инструментов бэкенд-разработчика в арсенал. Освоите веб-программирование на PHP и JavaScript, научитесь управлять базами данных и защищать приложения. Выбирайте свой ритм — и вперед, к архитектуре профессионального уровня!</li><li><a href="https://experts2.ru/ryKHtn?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">JavaScript-разработчик</a> от Nordic IT School. Курс для тех, кто уже знаком с основами веб-разработки. Четыре учебных блока охватывают ООП, Node.js, React и создание репозиториев. По каждой домашней работе вы получите персональное код-ревью от преподавателя, пополните портфолио несколькими проектами и получите возможность стажировки с консультациями по трудоустройству.</li><li><a href="https://experts2.ru/tfbdYT?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Основы программирования на Java</a> от Maxima. За восемь месяцев вы освоите популярный язык программирования для создания сервисов, веб-порталов и приложений для Android. Обучение проходит в небольших группах под руководством практикующих разработчиков, включает стажировки в IT-компаниях и завершается подготовкой к трудоустройству с пополнением портфолио новым проектом.</li><li><a href="https://experts2.ru/yteAaY?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Fullstack разработка</a> от АНО Учебного центра "Трайтек". Пятидневный интенсив познакомит с актуальными возможностями JavaScript, фреймворками для создания интерфейсов и основами Node.js. Вы научитесь писать бэкенд для приложений, выполнять юнит-тесты и использовать сборщик модулей. По окончании выдается удостоверение о повышении квалификации.</li><li><a href="https://experts2.ru/JrGqmp?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Node.js </a>от beONmax. Практический курс познакомит с созданием серверной части приложений на Node.js с нуля. Вы освоите работу с базами данных и популярными фреймворками, отработав навыки на реальных примерах и проектах.</li></ul><h2>Бесплатные курсы Node.js</h2><p>Если не готовы сразу платить за образование, начните с проверенных бесплатных материалов. Такие бесплатные курсы дадут понимание платформы. Они подойдут для обучения Node.js с нуля — помогут собрать первые проекты и разобраться с основами. Отличный способ начать карьеру в бэкенде без первоначальных вложений.</p><ol><li><a href="https://experts2.ru/lLIsjh?sub1=tproger-kf&amp;sub2=node-js-kursy&amp;sub4=netop">Учебник NodeJS </a>от Code.mu. Занятия в текстовом формате созданы опытным айтишником, консультантом по веб-разработке. Подходит тем, кто уже освоил язык JavaScript. Вы узнаете, как работать с файловой системой с помощью встроенного модуля в синхронном и асинхронном вариантах, напишете и протестируете код, научитесь разворачивать статический сервер.</li><li><a href="https://www.youtube.com/watch?v=egoMqpY2myQ">Node.js - курс по Node.js для начинающих</a> от Bogdan Stashcuk. Содержательные уроки продолжительностью шесть часов от программиста и автора популярных курсов по разработке. Включает практические задания. Хороший старт для начинающих работу с Node. Половина программы занимает практика.</li><li><a href="https://www.youtube.com/watch?v=243pQXC5Ebs">Node JS фундаментальный курс от А до Я. Node.js Теория и практика</a> от Ulbi TV. В этом ролике вы разберете основные теоретические и практические моменты, связанные с Node.js. Сделаете небольшой фреймворк на системе, а также научитесь работать с базами данных. В конце вас ждет план на дальнейшее обучение.</li><li><a href="https://www.youtube.com/watch?v=3aGSqasVPsI">Node JS - Быстрый курс за 1 час</a> от Владилена Минина. Суперинтенсивное занятие позволит за час освоить основные аспекты применения Node. Обучение ведет фронтенд-разработчик с двенадцатилетним опытом работы. Видео отличается пошаговой демонстрацией процесса написания приложения, а также подробными объяснениями и рекомендациями эксперта.</li><li><a href="https://www.youtube.com/watch?v=nu4PiyjAmAE">NodeJS. Полный курс </a>от WebDev. Вы создадите базовый роутинг на чистом Node.js, научитесь работать с динамичными данными с помощью шаблонизатора и напишете новостное приложение с поддержкой CRUD операций и хранением данных в MongoDB. В конце вы загрузите готовое приложение на Heroku.</li></ol><p>Node.js продолжает доказывать эффективность в проектах — от стартапов до корпоративных систем. При выборе программы обратите внимание на баланс теории и практики: ищите курсы с проектами, а не только с теоретическими лекциями. Проверяйте, чтобы в программе имелись современные инструменты вроде Express.js, базы данных и основы DevOps. Не гонитесь за продолжительностью — иногда интенсив на 3-4 месяца даст больше, чем годовая программа. И помните, что проверенные курсы Node.js поддерживают связь с индустрией, приглашая действующих разработчиков и обновляя материалы по мере развития технологии.</p><p><i>А какие направления в разработке кажутся вам перспективными? Делитесь мнением в комментариях — обсудим, куда движется индустрия и на чем стоит сосредоточиться в обучении.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Python 3.14. Что нового и насколько он стал быстрее?</title>
      <link>https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-</link>
      <comments>https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-</guid>
      <description><![CDATA[<p>Python 3.14 стал быстрее на 27%, получил free-threading без GIL и впервые полноценно раскрывает многопоточность для современных процессоров</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-">Вышел Python 3.14. Что нового и насколько он стал быстрее?</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Процессор]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Oct 2025 09:17:31 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Python 3.14</b> вышел совсем недавно — 7 октября. А уже на следующий день разработчик Мигель Гринберг опубликовал результаты независимых тестов.</p><p>Главный итог — новая версия работает <b>примерно на 27% быстрее</b>, чем Python 3.13. Ключевое новшество — полноценная поддержка <b>free-threading</b> (многопоточности без глобальной блокировки GIL).</p><h2>Как тестировали</h2><p>В тестах участвовали версии CPython 3.9–3.14, а также PyPy 3.11, Node.js 24 и Rust 1.9.</p><p>Проверяли производительность на двух алгоритмах: рекурсивном вычислении чисел Фибоначчи и сортировке пузырьком. В однопоточном режиме Python 3.14 показал стабильный прогресс:</p><ul><li>В тесте Фибоначчи ускорение на <b>27%</b> — 6,4 секунды против 8,2 секунд у версии 3.13.</li><li>В сортировке пузырьком время сократилось <b>до 2,05 секунды</b> против <b>2,8 секунд</b>.</li></ul><h2>Революция free-threading</h2><p>Главный прорыв — <b>free-threading</b>, который наконец снимает системное ограничение GIL и раскрывает потенциал многоядерных процессоров.</p><p>В четырехпоточном тесте Фибоначчи скорость выросла <b>в три раза</b>, а в сортировке — <b>в два раза</b> относительно стандартной сборки.</p><h2>Сравнение с другими</h2><p>Стоит отметить, что PyPy 3.11 остается недосягаемым лидером — он быстрее CPython 3.14 почти в пять раз в рекурсии и в 18 раз при сортировке.</p><p>Node.js приблизился к PyPy в одном тесте, а Rust ожидаемо вырвался вперед — до 70 раз быстрее Python.</p><h2>Что это значит</h2><p>Python 3.14 — самая быстрая версия CPython на сегодня. Для проектов с интенсивными вычислениями free-threading дает ощутимый прирост. А вот JIT-режим пока остается экспериментальным — ускорения почти нет.</p><p>Если ваша команда может обновиться — <b>это стоит сделать</b>. Python 3.14 не просто быстрее: он впервые по-настоящему раскрывает многопоточность.</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему Next.js ломает архитектуру и мешает строить масштабируемые системы</title>
      <link>https://tproger.ru/news/pochemu-next-js-lomaet-arhitekturu-i-mewaet-stroit-maswtabiruemye-sistemy</link>
      <comments>https://tproger.ru/news/pochemu-next-js-lomaet-arhitekturu-i-mewaet-stroit-maswtabiruemye-sistemy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/pochemu-next-js-lomaet-arhitekturu-i-mewaet-stroit-maswtabiruemye-sistemy</guid>
      <description><![CDATA[<p>Архитектор Харшал Патил критикует Next.js: жёсткая связность, отсутствие модульности и ограничения мешают строить масштабируемые системы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/pochemu-next-js-lomaet-arhitekturu-i-mewaet-stroit-maswtabiruemye-sistemy">Почему Next.js ломает архитектуру и мешает строить масштабируемые системы</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 02 Oct 2025 03:28:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик и архитектор Харшал Патил жестко <a href="https://blog.webf.zone/why-next-js-falls-short-on-software-engineering-d3575614bd08">раскритиковал</a> <b>Next.js</b>, назвав его <b>«инструментом рендеринга, притворяющимся фреймворком»</b>.</p><p>По его словам, система нарушает базовые принципы проектирования: <b>объединяет все режимы рендеринга</b> (SSR, CSR, SSG, ISR), но делает это <b>«магическими» способами</b>, из-за чего теряется ясность и усложняется поддержка.</p><h2>Жесткая связность</h2><p>Next.js строится на четырех опорах — <i>CLI</i>, <i>компилятор</i>, <i>роутер</i> и <i>рантайм</i>.</p><p>Но заменить или <b>расширить</b> любую часть почти невозможно: миграция с <b>Webpack</b> на <b>Vite</b> в одном из проектов заняла более полугода. Такая связность убивает гибкость и мешает инновациям.</p><h2>Нет модульности</h2><p>По словам Патила, Next.js не предоставляет плагинной архитектуры: даже простые интеграции <b>проникают в кодовую базу</b> и <b>ломают абстракцию</b>.</p><p>Проблемы есть и с переменными окружения — фреймворк смешивает их на этапе сборки и выполнения, что <b>противоречит 12-Factor-принципам</b> и мешает корпоративным пайплайнам.</p><h2>Ограничения для бизнеса</h2><p>Эксперт приводит реальные кейсы, где Next.js бессилен: динамическая смена тем в CRM, модульные платформы для разных команд, финансовые системы без пересборки Docker-образов, проекты с dual-licensing.</p><p>Во всех случаях фреймворк накладывал ограничения и мешал масштабированию.</p><blockquote>Сложность убивает. Я выбираю простоту. Next.js — это удобный инструмент для быстрых проектов, но не фундамент для устойчивой архитектуры.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>«Сделайте всего три шага»: почему гайды для новичков превращаются в квест на 7 часов и 193 Google-запроса</title>
      <link>https://tproger.ru/news/-sdelajte-vsego-tri-waga---pochemu-gajdy-dlya-novichkov-prevrashhayutsya-v-kvest-na-7-chasov-i-193-google-zaprosa</link>
      <comments>https://tproger.ru/news/-sdelajte-vsego-tri-waga---pochemu-gajdy-dlya-novichkov-prevrashhayutsya-v-kvest-na-7-chasov-i-193-google-zaprosa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-sdelajte-vsego-tri-waga---pochemu-gajdy-dlya-novichkov-prevrashhayutsya-v-kvest-na-7-chasov-i-193-google-zaprosa</guid>
      <description><![CDATA[<p>«Простой гайд» для новичков часто превращается в квест: сотни запросов, скрытые шаги и непонятные термины вместо обещанных трёх шагов</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-sdelajte-vsego-tri-waga---pochemu-gajdy-dlya-novichkov-prevrashhayutsya-v-kvest-na-7-chasov-i-193-google-zaprosa">«Сделайте всего три шага»: почему гайды для новичков превращаются в квест на 7 часов и 193 Google-запроса</a>»</p>]]></description>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Sep 2025 07:14:58 GMT</pubDate>
      <content:encoded><![CDATA[<p>Популярный пост в соцсетях <a href="https://anniemueller.com/posts/how-i-a-non-developer-read-the-tutorial-you-a-developer-wrote-for-me-a-beginner">описал</a>, как начинающие разработчики читают технические инструкции разработчиков. Материал попал в самое сердце многих пользователей.</p><p>Инструкции с пометкой «простой гайд для новичков» часто оказываются квестом уровня «попробуй объяснить бабушке, как работает нейросеть». С непонятными терминами, шагами, пропущенными зависимостями и волшебными строками кода, которые «просто нужно вставить в Терминал».</p><blockquote>Сначала вы запускаете Терминал и просто выполняете команду <b>ajkl;gawgor;iqeg;iJLkqen</b>. Потом идете в папку <b>library/library/library/llibrary/liiiiiibrarrrary/llllliiiiibrary/hidden/hidden/hiding/you can’t find me</b>...</blockquote><p>К финалу автор доходит до заветного «Boop!» — метафоры магического момента, когда все вдруг начинает работать. Правда, путь до него оказывается настоящим марафоном с 193 Google-запросами, переполненной RAM и потерей самооценки.</p><h2>Гайды не для тех, кто в первый раз</h2><p>Автор подчеркивает, что уважает и благодарен тем, кто пишет туториалы. Но обращает внимание: <b>большинство из них пишется с предположением, что читатель уже в теме</b>, знает, как работает Терминал, что такое env и где искать .config на macOS.</p><p>В результате:</p><ul><li>«Простой трехшаговый гайд» занимает <b>несколько часов</b>.</li><li>Пользователь оказывается в логической ловушке: <b>чтобы понять туториал, нужно уже уметь делать то, чему он должен научить</b>.</li><li>Самые важные шаги часто <b>опущены или неочевидны</b>.</li></ul><h2>Реакция комьюнити: боль, смех и самопознание</h2><p>Пост быстро разошелся по Reddit, Hacker News и X, где сотни пользователей делились похожими историями:</p><blockquote>Я искал, как установить Pandas. Через 40 минут у меня был TensorFlow, Node.js и экзистенциальный кризис.</blockquote><blockquote>Каждый гайд заканчивается словами «все, теперь просто откройте Snarfus», а я сижу и думаю, кто такой вообще этот Snarfus?</blockquote><h2>Как делать гайды понятнее?</h2><p>Несколько очевидных (но часто игнорируемых) советов авторам туториалов:</p><ul><li><b>Объясняйте, зачем делается каждый шаг.</b> Не только «что», но и «почему».</li><li><b>Проверяйте инструкции на чистой системе.</b> Не у всех установлен Node 18, Homebrew и 19 глобальных пакетов.</li><li><b>Избегайте внутреннего жаргона.</b> Даже если вам кажется, что «shamrock portal» — общепринятый термин.</li><li><b>Уточняйте зависимости и платформу.</b> Команда, работающая на Ubuntu, может не работать на Windows.</li><li><b>Добавляйте скриншоты.</b> Иногда визуальный шаг говорит больше, чем 10 строк текста.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как Web3 меняет разработку веб-приложений: от серверов к блокчейну</title>
      <link>https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu</link>
      <comments>https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Диана Тажетдинова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu</guid>
      <description><![CDATA[<p>Поговорили с экспертом и узнали, где Web3 даёт практическую пользу разработчикам: сравниваем подходы, исследуем рынок вакансий и особенности новой реальности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu">Как Web3 меняет разработку веб-приложений: от серверов к блокчейну</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[Ethereum]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[смарт-контракты]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Раньше, чтобы запустить приложение, приходилось настраивать сервер и базу данных. В Web3 всё по-другому: вместо серверов — смарт-контракты, вместо базы — блокчейн. <a href="https://www.esparkinfo.com/web3/statistics">По прогнозам</a>, объём рынка Web3‑разработки вырастет с $4,43 млрд в 2024 году до $6,15 млрд в 2025. Кейсы<a href="https://ru.wikipedia.org/wiki/Plume_Network_%E2%80%93_The_Future_of_Real-World_Assets_on_Web3_%F0%9F%8C%90?utm_source=chatgpt.com"> Plume Network</a> и<a href="https://en.wikipedia.org/wiki/The_Graph?utm_source=chatgpt.com"> The Graph</a> показывают, что Web3 уже работает в реальных продуктах. Что, если нас уже сегодня ждет backend в виде блокчейна? Давайте разберём, как меняются инструменты, архитектуры и карьерные треки.</p><h2>Главные отличия Web3 от Web2</h2><p>Перед тем как углубиться в код и практику, полезно увидеть основные различия между привычной Web2-разработкой и новой логикой Web3.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-09-22/3fa1cc2a-0755-4b71-af24-9b8a6f9d22ea.png" alt="" /></figure><p>Представим себе простой сервис для задач. В классическом Web2 его работа привычна: сервер обрабатывает запросы, база данных хранит задачи, а пользователь авторизуется через почту и пароль. Всё централизовано и зависит от владельца сервера.</p><p>В Web3 логика сильно меняется. Пользователь входит в систему с помощью криптокошелька, например, MetaMask. Каждая задача создаётся транзакцией и записывается в смарт‑контракт, а значит становится частью блокчейна. Удалить её уже нельзя — только отметить статус выполнения. Такой подход даёт прозрачность: любой участник сети может проверить, что задача действительно существует, и её статус изменён честно.</p><h2>Стек Web3: что понадобится на практике</h2><p>Чтобы построить работающий DApp, важно понимать, чем он отличается от обычного приложения. DApp — это децентрализованное приложение, в котором логика хранится в смарт-контрактах на блокчейне, а данные — в распределённых хранилищах, а не на сервере компании. Поэтому одного знания блокчейна мало: нужен полный набор инструментов — от языков и фреймворков до кошельков и сервисов подключения.</p><ul><li>Блокчейн: Ethereum, Layer‑2 (Arbitrum, Optimism, Base, Polygon), Solana.</li><li>Языки: Solidity (EVM), Rust (Solana), Go (инфраструктура и сервисы).</li><li>Библиотеки: ethers.js, wagmi.</li><li>Фреймворки: Hardhat, Foundry, Truffle.</li><li>Хранилища: IPFS/Arweave для файлов и метаданных.</li><li>Кошельки/подключение: MetaMask, WalletConnect (v2/WalletConnect Network), Web3Auth.</li></ul><blockquote>Точка входа для новичка — Alchemy, а также ethers.js.</blockquote><p><b>Пример.</b> Быстрое подключение кошелька (ethers.js).</p><h2>Архитектура DApp: из чего состоит современное Web3‑приложение</h2><p>Любое Web3‑приложение строится из нескольких слоёв, каждый со своей ролью. Фронтенд остаётся привычным SPA, но работает не с сервером, а напрямую с кошельком и смарт-контрактами. Контракты содержат бизнес‑логику и хранят ссылки на данные в децентрализованных хранилищах. Оракулы обеспечивают связь с внешним миром, например, передают цены или сообщения между разными блокчейнами. Важную часть играет off‑chain слой — сервисы вне блокчейна (индексаторы, аналитика), которые помогают быстрее искать и обрабатывать данные, при этом не перегружать сеть.</p><p><b>Пример.</b> Возьмём DeFi‑приложение. Пользователь открывает фронтенд и инициирует операцию swap(). В ответ фронтенд обращается к смарт‑контракту, который выполняет обмен токенов. Чтобы определить курс, контракт тянет актуальные данные через оракул. При этом тяжёлые артефакты, изображения или отчёты не хранятся в блокчейне напрямую — они лежат в IPFS. Сам контракт содержит только контент‑идентификаторы CID. Таким образом, получаем баланс: блокчейн отвечает за логику и безопасность, а децентрализованное хранилище — за данные.</p><h2>Практика: ваш первый DApp за вечер</h2><p>Давайте попробуем собрать простейшее приложение своими руками.</p><p><b>Шаг 0. Подготовка</b></p><p>Сначала убедитесь, что у вас стоит Node.js LTS и Git. Также нужен браузер с установленным MetaMask, где можно создать тестовый аккаунт. Чтобы оплачивать транзакции в тестовой сети, заранее возьмите немного тестовых монет через faucet — например, для Sepolia или Polygon Amoy.</p><p><b>Шаг 1. Проект</b></p><p>Создадим новый проект и установим Hardhat вместе с тулзами. Эта среда нужна для компиляции и деплоя контрактов.</p><p><b>Шаг 2. Контракт</b></p><p>В папке contracts/ создаём файл TaskTracker.sol и копируем туда код смарт-контракта из первого раздела. Это и будет бизнес-логика нашего приложения.</p><p><b>Шаг 3. Сценарий деплоя</b></p><p>Пишем скрипт, который разворачивает контракт в сети. Это простой скрипт на JavaScript, который вызывает методы Hardhat.</p><p><b>Шаг 4. Конфиг сети</b></p><p>В файле hardhat.config.js добавляем настройки для подключения к тестовой сети. Используем RPC-URL от Alchemy или Infura и приватный ключ от тестового аккаунта — его можно экспортировать из MetaMask, но использовать только для тестовой сети.</p><p><b>Шаг 5. Деплой в тестнет</b></p><p>Теперь запускаем скрипт деплоя. После выполнения увидите адрес контракта — он понадобится для фронтенда.</p><p><b>Шаг 6. Фронтенд (React + ethers.js + wagmi)</b></p><p>Собираем простое SPA: форма, чтобы добавить задачи, и кнопка «complete». Здесь мы используем ethers.js для обращения к контракту. Сделайте вызовы addTask и completeTask.</p><h2>Подводные камни Web3-разработки и что с ними делать</h2><p><b>Комиссии (gas): </b>любая запись в блокчейн стоит денег и иногда комиссия выше ценности операции — например, $10 за простую задачу.</p><ul><li>Что делать: использовать Layer-2 (Arbitrum/Optimism/Base/Polygon), выбирать сети с низкими комиссиями (Solana, Avalanche), оптимизировать контракты и батчи транзакций.</li></ul><p><b>Скорость: </b>подтверждение транзакции занимает секунды или десятки секунд, что заметно медленнее обычного сервера.</p><ul><li>Что делать: показывать «оптимистичный UI», кешировать данные, переносить часть логики off-chain, использовать быстрые сети (Solana, Near, Aptos).</li></ul><p><b>Безопасность:</b> код контракта неизменяем, и одна ошибка может стоить миллионов.</p><ul><li>Что делать: проходить аудит (CertiK, Trail of Bits), использовать проверенные библиотеки (OpenZeppelin), писать тесты в тестовых сетях (Goerli, Sepolia), внедрять баг-баунти и ролевую модель доступа.</li><li>Ресурс:<a href="https://consensys.io/diligence/smart-contract-security-best-practices/"> ConsenSys Diligence — Smart Contract Security Best Practices</a>.</li></ul><p><b>UX:</b> вход через кошелёк сложнее привычного логина/пароля. Нужно ставить расширение, пополнять баланс и подтверждать каждую транзакцию.</p><ul><li>Что делать: использовать аккаунт-абстракцию (ERC-4337), социальный логин, gasless транзакции через Paymaster, улучшать UI (подсказки, авто-фокус на MetaMask).</li></ul><p><b>Регуляция: </b>законы о Web3 пока разные в каждой стране. Легальное в одной юрисдикции может быть запрещено в другой (например, токенизация акций без лицензии).</p><ul><li>Что делать: консультироваться с юристами, следить за изменениями. Например, MiCA в ЕС — “Markets in Crypto-Assets Regulation” —  это единый регламент по криптоактивам в Евросоюзе.</li></ul><blockquote>Безопасность всегда должна быть на первом месте, потому что в Web3 есть риск потерять реальные деньги пользователей.</blockquote><h2>Карьерные возможности и перспективы</h2><p>Web3‑разработчиков уже активно ищут: <a href="https://web3.career/learn-web3/web3-intelligence-report">зарплаты в среднем предлагают выше</a>, чем у Web2‑коллег. Кроме программистов, востребованы смежные роли: аудиторы смарт‑контрактов, специалисты по безопасности, а также продакт‑менеджеры и аналитики, которые понимают специфику блокчейна.</p><p>Чтобы войти в профессию, начните с изучения Solidity и базовых паттернов смарт‑контрактов. Сделайте пару пет‑проектов и выложите код в GitHub. Отличный вариант прокачки — участвовать в хакатонах и грантовых программах от Ethereum Foundation или Solana Grants. Это даёт и опыт, и контакты, и иногда финансирование.</p><blockquote>Пара пет‑проектов + понимание блокчейна — хороший старт в Web3‑команду.</blockquote><h2>Будущее Web3</h2><p>Web3 не вытеснит Web2 полностью, но поменяет привычный подход к разработке. Разработчику это открывает новые вызовы: комиссии, безопасность и UX, но одновременно и новые возможности — прозрачные данные, токенизация, децентрализованные бизнес‑модели.</p><p>Для тех, кто только входит в сферу, это шанс попасть в индустрию на раннем этапе и быстро нарастить экспертизу. Простые пет‑проекты, хакатоны и знакомство с инструментами дают ощутимый старт.</p><p>Web3 будет развиваться параллельно с Web2, усиливая те области, где важны децентрализация, доверие и контроль за данными. Попробуйте задеплоить первый контракт — и вы сами почувствуете, что это не просто мода, а новый уровень возможностей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Оффер во фронтенде в 2025 году: как получить и не облажаться</title>
      <link>https://tproger.ru/articles/offer-vo-frontende-v-2025-godu--kak-poluchit-i-ne-oblazhatsya</link>
      <comments>https://tproger.ru/articles/offer-vo-frontende-v-2025-godu--kak-poluchit-i-ne-oblazhatsya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/offer-vo-frontende-v-2025-godu--kak-poluchit-i-ne-oblazhatsya</guid>
      <description><![CDATA[<p>Как получить оффер во фронтенде в 2025: разбор кейса с ментором Дмитрием Борцовым. Советы по резюме, переговорам и навыкам, которые помогли кандидату выйти на зарплату в 380К. Анализ рынка и типичных ошибок.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/offer-vo-frontende-v-2025-godu--kak-poluchit-i-ne-oblazhatsya">Оффер во фронтенде в 2025 году: как получить и не облажаться</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 18 Sep 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рынок фронтенда в 2025 всё ещё платит <a href="https://thecode.media/">хорошо</a>, но платит выборочно. Те, кто умеет строить интерфейсы с мыслью об архитектуре, производительности и продукте, получают предложения, которые заметно выше среднего. На примере <a href="https://t.me/soft_skillz">нашего шоу </a>«Код найма» и кейса ментора Дмитрия Борцова совместно с менти Ярославом Грачёвым покажем, как корректная упаковка, таргетинг и умелая переговорная стратегия превращают «сложный» поиск в оффер на 380к.</p><p>Дмитрий Борцов — руководитель разработки клиентских интерфейсов в PREMIER.ONE. В его подчинении более 60 инженеров, распределённых между вебом, Android, iOS и SmartTV. В индустрии он уже 15 лет: прошёл путь от фриланса и собственной студии до руководства крупными командами. Такой опыт, как он сам говорит, позволяет видеть рынок «с двух сторон» — понимать, что нужно бизнесу и какие компетенции позволяют разработчику стоить дороже. Сегодня Дмитрий совмещает управленческую роль с менторством: вместе с техлидом PREMIER.ONE Андреем Автушенко он развивает платформу <a href="https://frontend-alliance.ru/?utm_source=tproger&amp;utm_medium=post&amp;utm_campaign=kodnaimafinal&amp;utm_content=tproger">Frontend Alliance</a>, где в формате парного наставничества помогает фронтендерам — от джунов до тимлидов — прокачивать хард и софт скиллы, готовиться к собеседованиям и строить карьеру с опорой на реальную практику.</p><h2>Фронтенд под давлением: рынок стал жёстче, но не умер</h2><p>Сегодня фронтенд-разработчикам всё чаще приходится отвечать на вопрос: «А рынок-то живой или всё?» Картинка действительно изменилась. Ещё несколько лет назад компании практиковали агрессивный найм: быстро расширяли команды, нанимали десятки разработчиков сразу, а через полгода без сожалений сокращали половину штата. Это было дорого, но при низкой ключевой ставке позволительно: деньги горели, но продукт успевал расти.</p><p>Теперь правила другие. Ключевая ставка выросла, бюджеты сократились, и каждая новая должность в команде проходит через многослойный фильтр. Набрать людей «про запас» уже нельзя, поэтому требования к кандидатам стали заметно выше.</p><p>Тем не менее, говорить о «смерти» фронтенда было бы <b>ошибкой</b>. Спрос не исчез, он просто сузился до тех, кто способен приносить реальную ценность. И здесь проявляется давний раскол: 95% специалистов ограничиваются задачами уровня интерфейсной косметики, а оставшиеся 5% умеют проектировать системы, предлагать архитектурные решения и смотреть шире макета. Именно за этих людей компании будут бороться при любых условиях.</p><p>Интересно, что попасть в эти «пять процентов» можно и на старте. Даже среди джунов встречаются разработчики, которые выделяются скоростью обучения, широтой мышления и готовностью брать на себя ответственность. Для них рынок остаётся открытым, тогда как «среднячки» рискуют застрять в бесконечных собеседованиях.</p><h2>Что должен уметь фронтендер в 2025 году и как попасть в «5% из 95»</h2><p>Уровень middle и senior во фронтенде больше не определяется знанием пары фреймворков. Базовый «джентльменский набор» очевиден: HTML, CSS, JavaScript и хотя бы один современный фреймворк — React, Vue, Angular или Svelte. Сегодня к нему де-факто добавился TypeScript: без него в резюме вы рискуете выглядеть устаревшими, даже если на проекте TS практически не используется. Работодатели хотят видеть уверенную работу с ним, потому что это напрямую ассоциируется со стабильностью и предсказуемостью кода.</p><p>Дальше идут надстройки, которые начинают выделять кандидата. Это метафреймворки вроде Next.js или альтернативы с упором на SSR и SSG, понимание разных паттернов рендера и умение применять их под конкретный продукт. Сюда же — юнит-тесты. Никто не будет устраивать экзамен на знание Jest, но сам факт владения тестированием сразу повышает ценность инженера.</p><p>Самый заметный маркер — архитектурные практики. Фронтендер, который мыслит архитектурно, понимает FSD, может объяснить, зачем нужны микрофронты (и когда они не нужны), сразу выделяется на фоне тех, кто «просто собирает фичи». Настроить приложение так, чтобы через два года его не пришлось переписывать, — это компетенция, которая превращает разработчика в дорогого специалиста.</p><p>При этом стек сам по себе не делает из мидла сеньора. Настоящее отличие — в мышлении. Сеньор умеет общаться с соседними командами, отстаивать нужные изменения в API или инфраструктуре, учитывать долгосрочные риски продукта. Это опыт, который не заменят ни курсы, ни туториалы. И именно он отличает того, кто «пишет код», от того, кто создаёт систему.</p><h2>Найм и подготовка кандидата: где спотыкаются фронтендеры</h2><p>Первое, что бросается в глаза при просмотре резюме фронтендеров, — это ошибки самопрезентации. Человек может написать «переписал приложение на новый фреймворк» и не уточнить, что это сократило время загрузки на 30% или сняло половину багов в проде. Для HR выглядит как рядовая строчка, хотя на деле это серьёзное достижение. Добавим сюда непонимание того, как работает HeadHunter: большинство кандидатов просто игнорируют логику поиска и фильтров, и их резюме тонет в выдаче. В итоге, 85% проблем — это не недостаток скиллов, а то, как они упакованы.</p><p>Работа ментора начинается именно с этого: помочь собрать рабочее резюме и научить играть по правилам площадок. Но это лишь малая часть. Основная работа — скорректировать харды и софты, довести знания до актуального уровня, натренировать коммуникацию. Ведь первое собеседование с HR часто решает, <b>попадёте ли вы вообще на технический этап</b>. Поэтому вместе с резюме разбирается поведение: как отвечать рекрутеру, какие вопросы задавать, как «продавить» интерес к себе.</p><p>Типичный план менторской работы занимает от двух до шести недель у специалистов с опытом — если задача ограничивается «освежить знания и подтянуть резюме». Для выпускников массовых онлайн-курсов это уже четыре месяца и больше: приходится достраивать базу, убирать пробелы, переучивать. У новичков срок может растянуться до полугода и дальше, и тут всё зависит от предрасположенности к стеку и дисциплины.</p><p>Отдельный вызов — мотивация. Когда человек месяцами безуспешно ищет работу, у него закономерно опускаются руки. Но ментор — не коуч по вере в себя. Его задача — показать ошибки, дать направление, поддержать обратной связью. А вот сама мотивация должна рождаться внутри. Часто оказывается, что проблема банальна: кандидаты игнорируют рекомендации. Например, используют автокликеры, которые рассылают сотни откликов без сопроводительных писем. Конверсия такого «спама» очевидна: <b>нулевая</b>. Настоящая работа требует внимания к деталям, дисциплины и готовности честно исправлять свои ошибки.</p><h2>Кейс «Кода найма»: как Ярослав Грачёв выбил оффер в 380К</h2><p>Когда к Дмитрию обратился Ярослав, сразу стало ясно: этот кандидат будет работать до конца. Мотивация была жёсткой — беременная жена, переезд в Москву, ипотека. На первом звонке ментор проверил главное: что Ярослав не «красит кнопки», а действительно решает задачи. Этого хватило, чтобы выстроить доверие и составить план.</p><p>Первое, что пришлось менять, — резюме. Вместо сухого «работал три года» появилось описание проектов и секция «Обо мне». Ярослав даже перефотографировался, чтобы профиль выглядел живым. Параллельно он учился работать с алгоритмами HeadHunter и GPT: HH поднимал резюме в выдаче, а бот имитировал собеседования. Через две недели у кандидата уже был первый оффер.</p><p>Ситуация была интересной: предложение на 300 тысяч выглядело заманчиво, но ментор настоял не торопиться. Аргументы были простыми: поток откликов и приглашений уже пошёл, значит, офферы будут и дальше. Они вместе придумали безопасную отговорку для HR и договорились ждать неделю. Ставка сыграла — скоро пришёл новый оффер на 360 тысяч.</p><p>И тут началась работа с переговорами. Дмитрий считал, что Ярослав стоит дороже, и предложил сыграть на личных обстоятельствах: «Переезд, ипотека, второй ребёнок — дайте больше». Обычно такой прямолинейный запрос не работает, но в этот раз HR пошёл навстречу и поднял ставку ещё на 20 тысяч. Сработало сочетание доверительной коммуникации и того, что за спиной у кандидата был запасной оффер.</p><p>По словам Дмитрия, ориентироваться стоит не только на цифру. Сигналы того, что можно просить больше, — это стабильный поток интервью и высокая конверсия в техсобесы. Если три технички в неделю превращаются в офферы, значит, цена кандидата — вопрос времени и настойчивости.</p><p>А дальше начинается игра на рынке: один оффер на 250 можно держать как «аварийный», второй на 300 использовать для торга, третий — поднять до 350. Главное — не зажиматься на звонках с HR: «их мотивация — провести тебя дальше, деньги они получают за закрытых кандидатов», — напоминает Дмитрий. Поэтому правило простое: дружелюбие, открытость и готовность разговаривать.</p><p>Итог кейса Ярослава показал, как за 14 дней можно пройти путь от шаблонного резюме до оффера выше ожиданий. Но за этим стояла системная работа: переписанное CV, домашка с тренировками, переговорные сценарии и дисциплина кандидата.</p><h2>Советы начинающим фронтендерам</h2><p>Дмитрий выделяет несколько аспектов, которым стоит уделять внимание в вопросе оффера мечты:</p><h3>Не рассчитывайте только на ментора</h3><p>Ментор может сильно ускорить путь: кто-то готовит к собесам, кто-то учит реально работать. Но это не панацея. Без самостоятельного копания в YouTube, статьях и пет-проектах вы просто застрянете. При этом нужно быть готовым к тому, что половина выученного окажется невостребованной, а рынок попросит ещё десяток дополнительных технологий.</p><h3>Начинайте с основы, а не с фреймворка</h3><p>Ключевой навык фронтендера — JavaScript. «Все есть JavaScript», — как сказал Илья Климов. React, Vue, Angular, Svelte — это лишь надстройки. Если понимаете сам язык и то, как он работает под капотом, вы сможете писать на чем угодно, хоть в фронте, хоть на Node.js в бэке.</p><h3>Не ведитесь на быстрые рецепты успеха</h3><p>Онлайн-школы и ютуберы любят обещать: «выучишь React — и всё в шоколаде». Но без знания JS никакой React не спасёт. На собеседованиях почти всегда спрашивают именно JavaScript, а не то, как вы намагичили интерфейс на очередном фреймворке.</p><h3>Думайте о том, зачем работает код</h3><p>Фронтендер, который просто копирует чужие решения, быстро упирается в потолок. Важно не только знать синтаксис, но и понимать, зачем язык ведёт себя именно так. Это отличает разработчика, который просто «собирает интерфейсы», от того, кто способен решать реальные задачи.</p><p>История Дмитрия Борцова и Ярослава Грачёва — это иллюстрация того, что даже в перегретом и избирательном рынке фронтенда можно найти своё место. Ключ к успеху — не только в технической базе, но и в умении правильно упаковать опыт, показать насмотренность и держать фокус на том, что важно работодателю. Для джунов это часто означает вложиться в JavaScript, а не в очередной модный фреймворк. Для мидлов и выше — развивать софты и стратегически подходить к собеседованиям. А для всех уровней — не замыкаться в одиночном обучении, а искать наставников и сообщество, которые помогают расти быстрее.</p><p>Фронтенд в 2025-м всё ещё щедр, но не прощает случайности. И чем раньше разработчик перестанет полагаться на удачу и начнёт работать над собой системно, тем выше шансы получить оффер, который изменит карьеру.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 VPS-хостингов в 2025, которые держат нагрузку: кейсы, стоимость, метрики</title>
      <link>https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki</link>
      <comments>https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki</guid>
      <description><![CDATA[<p>Сравниваем 5 VPS-провайдеров, которые стабильно работают под нагрузкой в 2025 году. Разбираем стоимость, примеры использования, производительность и uptime. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki">5 VPS-хостингов в 2025, которые держат нагрузку: кейсы, стоимость, метрики</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Быстрый старт]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[ВКонтакте]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Windows Server]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 Aug 2025 06:10:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году выбирать VPS по принципу дешево и сердито уже не работает. Любой рабочий или MVP-проект — от API для мобильного приложения до интернет-магазина  сталкивается с пиками нагрузки, которые нужно выдержать. Ошибки на старте обходятся дороже простоя в продакшне.</p><p>Собрали пять VPS-хостингов, которые показывают, как должны выглядеть выжившие серверы под нагрузкой: современное железо, каналы без счётчиков трафика, живая поддержка инженеров и опыт клиентов. Ниже — конфигурации, цены и метрики, чтобы вы подобрали сервер под свой сценарий.</p><h2>1. ИХЦ (Интернет ХостингЦентр): конфигурации под нагрузку с NVMe, CPU до 5 ГГц и трафиком без ограничений</h2><p>Один из самых гибких по конфигурациям хостеров в обзоре. Работает с 2009 года. Поддерживает разные типы виртуализации (KVM и Virtuozzo), предлагает линейки с SSD и NVMe, российские и европейские площадки, разные уровни мощности — от базовых до высоконагруженных.</p><h3>Линейки VPS и конфигурации</h3><ol><li>ssdVPS — базовая линейка для России. Позволяет собирать конфигурации от 1 до 32 ГБ оперативной памяти, от 1 до 10 виртуальных CPU и от 20 до 300 ГБ SSD-диска.</li><li>NVMe/ — линейка на базе KVM с более высокой производительностью ввода-вывода. Доступны конфигурации от 1 до 24 ГБ RAM, от 1 до 12 vCPU, SSD от 15 до 300 ГБ.</li><li>EU-NVMe/ — аналог NVMe-линейки, но размещённый в Амстердаме. Конфигурации расширены: от 1 до 64 ГБ оперативной памяти, от 1 до 18 CPU, от 15 до 1000 ГБ SSD, скорость порта — от 200 до 500 Мбит/с.</li><li>VPS 5 ГГц — отдельная линейка на KVM, ориентированная на проекты с высокой частотной нагрузкой, до 5 ГГц на ядро, порт до 1000 Мбит/с.</li></ol><p>VPS Windows — выделенная категория для задач на Windows.</p><h3>Особенности и инфраструктура</h3><p>В <a href="https://www.ihc.ru/vps.html">ИХЦ</a> можно выбрать между двумя видами виртуализации: <b>KVM</b> и <b>Virtuozzo</b>. Виртуализация KVM подходит для задач, где нужна изоляция ресурсов, стабильность под нагрузкой и совместимость с Linux и Windows. Virtuozzo — более экономный вариант с быстрой настройкой, но с возможной перераспределённой нагрузкой между соседними VPS.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/d8f9548f-7bd8-4eef-a4aa-6d50b0e424a2.png" alt="" /><figcaption>Дата-центры провайдера есть в Москве и Амстердаме.</figcaption></figure><p>Связь с поддержкой доступна через тикеты, онлайн-чат на сайте, телеграм-бота, телефон и сообщения ВКонтакте. Поддержка работает 24/7. На всех тарифах включена базовая <b>DDoS-защита</b>.</p><h3>Примеры использования VPS от IHC</h3><p>Компания предоставляет конкретные кейсы. Примеры:</p><ul><li>Проект 1: VPS NVMe/24 (24 ГБ RAM, ~200 ГБ SSD) используется под бэкенд iOS-приложения. Стек: nginx, PHP, MySQL. Нагрузка: 12 000 уникальных пользователей в сутки. Утилизация CPU — 25%.</li><li>Проект 2: VPS NVMe/12 (12 ГБ RAM, ~120 ГБ SSD) для развлекательного сайта. Стек: nginx, Docker, Node.js. Нагрузка: 7 000 уникальных пользователей в сутки, загрузка CPU — около 20%.</li></ul><p>Серверы стабильно держат среднюю и высокую нагрузку — даже с трафиком в 10–12 тысяч пользователей в сутки остаётся запас по ресурсам.</p><h3>Дополнительные опции</h3><p>ИХЦ предлагает <b>тестовый период в 3 дня</b>, <b>безлимитный трафик</b>, <b>бесплатный первый месяц ispmanager 6</b> в подарок, а также предустановку панелей управления (ispmanager, FastPanel) или VPN-шаблонов по выбору при заказе. Также доступны бэкапы, SLA и автоснапшоты.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/e5730a1c-375b-4b91-a238-6a52a51df67a.png" alt="" /></figure><h3>Цены</h3><p>Что касается ценовой политики, стоимость VPS в России (линейка «ssdVPS») начинается <b>от 380 руб/мес</b> или 3800 руб/год (12 месяцев по цене 10). Европейские VPS («EU-NVMe/») и VPS на KVM («NVMe/») стартуют <b>от 440 руб/мес</b> или 4400 руб/год, а каждый дополнительный гигабайт памяти стоит 6 рублей.</p><h2>2. FirstVDS: мощные VDS на AMD EPYC и Ryzen</h2><p><a href="https://firstvds.ru/">FirstVDS</a> — хостинг-провайдер с опытом на рынке более 20 лет. Предлагают VPS и VDS с виртуализацией KVM для проектов любого размера. Все серверы работают на современном оборудовании. Трижды победитель в номинации «Хостер года» Национальной премии «ЦОДы.РФ».</p><p>Есть VPS для разных сценариев нагрузки — от стандартных сайтов до тяжёлых веб-приложений и проектов с высокими требованиями к CPU и отказоустойчивости. Отдельные решения для Битрикс, установка ОС семейства Linux, FreeBSD и Windows Server.</p><h3>Линейки VPS: от базовой мощности до кластера Ceph</h3><p>FirstVDS предлагает три основные линейки, которые отличаются архитектурой и назначением:</p><ol><li>VDS Форсаж — гибкая конфигурация сервера на базе AMD EPYC, до 128 ядер (до 3,7 ГГц), до 512 Гб оперативной памяти и до 4 000 Гб быстрого NVMe-накопителя. Локации Москва и Амстердам. Стартовая стоимость такой конфигурации составляет от 749 руб/мес.</li><li>Для нагруженных проектов — CPU.Турбо — гибкая конфигурация сервера на базе AMD Ryzen с частотой до 5,7 ГГц, DDR5 и с быстрыми NVMe-накопителями. Идеально для Битрикс. Локация Москва. Начальная цена CPU.Турбо — от 624 руб/мес. При покупке лицензии Битрикс (1С-Битрикс: Управление сайтом или Битрикс24) есть дополнительная скидка 30% на 3 месяца аренды этого тарифа.</li><li>Отказоустойчивый VDS Атлант — гибкая конфигурация сервера на базе AMD EPYC — до 192 ядер (до 3,5 ГГц), до 768 Гб оперативной памяти и до 8 Тб быстрого NVMe-накопителя. Репликация данных между узлами кластера Ceph и дублирование сетевого оборудования. Локация Москва. Его стартовая стоимость от 1619 руб/мес, при этом бесплатные автобэкапы уже включены.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/3490237d-3e99-49c5-9d90-10e3849765ed.png" alt="" /></figure><p>Компания использует два центра обработки данных в <b>Москве</b>: <b>IXcellerate (уровень Tier III)</b> и Web DC. Для тарифа Форсаж и готовых тарифов также доступен ЦОД <b>euNetworks (уровень Tier III) в Амстердаме</b>.</p><h3>Сетевые возможности, трафик и безопасность</h3><p>В стоимость каждого сервера входит бесплатный выделенный IP-адрес. Клиенты могут выбрать между 100 Мбит/с с безлимитным трафиком или портом 1 Гбит/с с включёнными 32 Тб трафика.</p><p>Защита от DDoS-атак и система безопасности BitNinja для сервера и сайта доступны как подключаемые опции. Также предоставляются объектное хранилище S3, автобэкапы и Кибер-бэкап. Для безопасности коммуникаций используются SSL-сертификаты GlobalSign.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/7d36ac0d-4832-402b-b0b0-9d7955963916.png" alt="" /></figure><h3>Управление, ПО и поддержка</h3><p>При заказе сервера клиент получает лицензию ispmanager 6  lite: первый месяц панель предоставляется бесплатно, дальше оплачивается по тарифу самой панели. Предлагается гибкий выбор операционных систем, включая Linux, FreeBSD и Windows Server. Под разовые задачи доступны готовые рецепты установки — от Битрикс и GitLab до TeamSpeak, LAMP‑стека и других популярных наборов ПО.</p><p>Для установки и решения любых вопросов — доступна живая круглосуточная техническая поддержка 24/7 через чат на сайте, в личном кабинете и по телефону, без использования чат-ботов. Для самостоятельного решения вопросов предусмотрена обширная база знаний.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/7fc897fc-5d2d-4f28-9047-834a8b0202b1.png" alt="" /></figure><h3>Клиентские бонусы и программы</h3><p>Есть тестовый период до 3 дней. Регулярно проводятся акции и предоставляются скидки, в том числе на тарифы для нагруженных проектов.</p><p>1) При переходе от другого хостера FirstVDS бесплатно переносит до 10 сайтов. Дополнительно предоставляется скидка 40% на первый месяц аренды VPS при оплате сервера на 1, 3 или 6 месяцев, либо 3 месяца бесплатной аренды VPS при оплате на год.</p><p>2) Клиенты с возрастом аккаунта от 5 лет получают постоянную скидку на аренду VPS, начиная от 5% и увеличиваясь ежегодно до 20%.</p><p>3) Действует реферальная программа, по которой партнёр получает 10% от расходов привлечённых клиентов, а привлечённый пользователь — скидку 25% на первый месяц аренды VPS.</p><p>4) Стоимость продления домена у FirstVDS равна актуальной стоимости его регистрации.</p><h2>3. InCloud: VPS‑площадки для бизнеса, где важен SLA</h2><p><a href="https://incloud.ru/">InCloud</a> продаёт виртуальные серверы, работающие в отказоустойчивом кластере на базе enterprise хранилищ NetApp и HPE 3PAR. Позиционируется как решение для 1С, малого/среднего бизнеса и аутсорс компаний, которым нужны предсказуемые ресурсы и техподдержка профессиональных инженеров, а не чат‑ботов.</p><h3>Тарифные планы и ценообразование</h3><p>InCloud предлагает две основные линейки тарифов:</p><ol><li>Стандартный тариф: внутри процессоры Intel Xeon 2600v4 2ГГц и оперативная память DDR4 2400 МГц.Стоимость: 1 CPU – 200 рублей, 1 Гб RAM – 200 рублей.</li><li>Производительный тариф: использует процессоры AMD EPYC до 3.8 ГГц и оперативной памяти DDR5 4800 МГц. Стоимость: 1 CPU – 250 рублей, 1 Гб RAM – 250 рублей.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/c484688e-fd3f-48ca-b743-616c21699ac4.png" alt="" /></figure><p><b>Стоимость дискового пространства</b>: SATA диски: <b>3 рубля за 1 Гб</b>. SSD и NVMe диски: <b>13 рублей за 1 Гб</b>.</p><h3>Архитектура и поддержка</h3><p>Теперь про то, что упрощает жизнь и добавляет надежности нашим развернутым сервисам:</p><ul><li>Ежедневные бэкапы: данные ваших серверов будут копироваться каждый день, и храниться они могут до 30 дней.</li><li>Удобная панель управления: через нее можно делать снапшоты  и клонировать серверы. Для разработчиков это просто золото – быстро накатить тестовую среду, попробовать новую фичу, а потом откатиться или создать идентичные рабочие среды.</li><li>SLA-договор: есть возможность заключить SLA-договор, чтобы получить гарантированный уровень доступности услуг.</li><li>Новейшие мощные серверы — на базе AMD EPYC 4 поколения.</li></ul><p>Одна из фишек – это возможность напрямую проконсультироваться с сертифицированными инженерами InCloud по сложным проектам.</p><h3>А что с клиентскими кейсами</h3><ol><li><b>Кейс Vamkamin</b>: производственная компания, которая ускорила работу своей системы 1С и сократила IT-расходы на 35%. У них была проблема с медленной работой 1С при одновременном доступе бухгалтерии, склада и отдела продаж, а также с частыми простоями на локальных серверах. InCloud предложил перенести все сервисы в облако, используя серверы на базе AMD EPYC 9554, что обеспечило прирост производительности более 40% по сравнению с предыдущими решениями. Также были внедрены гибкое масштабирование ресурсов и ежедневное резервное копирование.</li><li><b>Кейс Веб-студии 100UP</b>: компания занимается разработкой и поддержкой сайтов для крупных торговых сетей и e-commerce проектов. 100UP переехала к облачному провайдеру InCloud, выбрав тарифы на базе AMD EPYC 9554 с высокой тактовой частотой и большим количеством ядер. Благодаря разнообразию тарифов команда легко распределила проекты по нужным по производительности виртуальным серверам. После переезда 100UP смогла сократить время отклика клиентских сайтов в среднем на 45%, обеспечить бесперебойную работу даже в периоды высокой сезонной нагрузки, ускорить запуск новых проектов, фокусироваться на разработке и маркетинге и улучшить качество предоставляемых услуг.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/c0b63a9f-bb39-4b44-9363-45cefd4c2f62.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/9f98fda8-0b7a-408a-9a82-00f063ee0d88.png" alt="" /></figure><h2>4. SmartApe: быстрые VPS на NVMe‑SSD</h2><p><a href="https://www.smartape.ru/ssd-vps">SmartApe</a> подойдет проектам, где дисковая подсистема и CPU работают без простоя: интернет‑магазины, порталы с большим количеством контента, внутренние корпоративные системы, высоконагруженные API. Если нужен быстрый старт — сервер создаётся за одну‑две минуты; если понадобится масштабирование, тариф можно увеличить без миграции.</p><h3>Преимущества этих VPS</h3><p>Используются современные серверные NVMe SSD диски в RAID массиве, которые в 600 раз быстрее обычных HDD. Скорость чтения достигает 8000 Мбайт/с, а записи — 2000 Мбайт/с.</p><p>Серверы работают на мощных процессорах Intel Xeon Gold или AMD EPYC (до 3.7 ГГц) и быстрой памятью DDR4. Используется полноценная виртуализация KVM с выделенными ресурсами для гарантии их предоставление. Дата-центры уровня TIER-III и TIER-IV обеспечивают Uptime 99.982%. Данные хранятся в хранилище RAID-10.</p><p>Дополнительно клиенты получают полный root-доступ (по SSH для Linux и RDP для Windows), возможность установки любых операционных систем (более 20, включая Ubuntu, CentOS, Debian, Windows Server) и ПО, а также полную изоляцию от других клиентов.</p><h3>Удобство и поддержка</h3><ul><li>Бесплатная панель управления (Hestia) или платная ISPmanager для простого управления сервером.</li><li>Бесплатное базовое администрирование и помощь в переносе сайтов.</li><li>Круглосуточная квалифицированная поддержка 24/7.</li><li>Бесплатный тестовый период 10 дней без оплаты и ввода карты.</li><li>Защита от DDoS-атак включена в стоимость.</li><li>Выделенный внешний IP-адрес (возможность купить до 10 IP).</li></ul><p>Перед покупкой дают десять дней теста без привязки карты; если сервис не подойдёт, в течение тридцати дней можно вернуть деньги за неиспользованный период.</p><h4>Пример использования: интернет‑магазин</h4><p>VPS c 2 vCPU, 4 ГБ RAM, 80 ГБ SSD и портом 100 Мбит/с; при обычном трафике сайт обслуживает 300–500 уникальных посетителей в день, одновременно на страницах бывает 10–20 человек, а в пиковую распродажу до 50; средняя нагрузка 5–10 запросов в секунду, короткими всплесками до 20; заявленный аптайм 99,982 %, реальные замеры отклика после кэширования — 200–300 мс; счёт за такой сервер выходит около 1 300 рублей в месяц.</p><h4>Пример использования: API на Node.js</h4><p>4 vCPU, 8 ГБ RAM, 160 ГБ NVMe и канал 200 Мбит/с; сервис стабильно обрабатывает 50–100 запросов в секунду, на пике достигает 200, одновременно подключены 500–1 000 клиентов, максимум 2 500; трафик близок к 200 ГБ в месяц; при том же аптайме 99,982 % средняя задержка ответа укладывается в 50–100 мс; ежемесячная стоимость в зависимости от опций колеблется в диапазоне 2 600–3 000 рублей.</p><p>SmartApe имеет смысл брать, когда дисковая скорость и гарантированные ресурсы важнее высокого GUI и почасовой тарификации, для расчёта стоимости есть калькулятор конфигураций на сайте и оперативная техподдержка.</p><h2>5. PSB Hosting: что даёт их VPS‑платформа</h2><p><a href="https://psb.hosting/vps">PSB Hosting</a> продвигает VPS-хостинг как решение для сайтов, приложений и SaaS-сервисов, которым нужна предсказуемая мощность и высокий SLA. Провайдер делает упор на новое оборудование, пропускную способность без ограничений и инфраструктуру уровня Tier III+.</p><h3>Локации и тарификация</h3><p>Серверы разворачиваются в четырёх точках: Нидерланды, США, Германия и Финляндия. Для каждой площадки доступен одинаковый конструктор конфигураций. Базовый план NL‑100, который включает 1 vCPU, 2 ГБ RAM и 30 ГБ SSD, стоит 6 долларов в месяц. Линейка поднимается ступенчато:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/62dfc578-ede9-4533-bfb8-bca1a1a26688.png" alt="" /></figure><p>Слайдеры позволяют довести параметры до 32 ядер, 64 ГБ RAM и 510 ГБ SSD; верхняя планка оплаты — 220 $ в месяц.</p><p>Трафик безлимитный на любых конфигурациях — дополнительной оплаты за гигабайты нет.</p><h3>Аппаратная платформа, ОС и предустановки</h3><p>В хост-узлах применяются процессоры последних линеек AMD и Intel. Оперативная память — DDR5, что снижает задержки при обращении к ОЗУ. Дисковая подсистема полностью на NVMe, объединена в RAID 10: чтение и запись выше, чем у классических SSD, а отказ одного накопителя не выводит хранилище из строя. К каждому VPS подключён выделенный канал с пропускной способностью до 10 Гбит/с.</p><p>Сервер можно поднять сразу с Windows Server, Ubuntu, Debian, CentOS или FreeBSD. Для быстрого старта доступны готовые образы: Bitrix, Django-стек, Docker, FastPanel, Hestia CP, Keitaro, LAMP, Node, OpenVPN, Outline, Portainer, Vesta CP и другие.</p><h3>Управление и поддержка</h3><p>Провайдер обещает круглосуточную техническую поддержку, резервные копии (бэкапы) и автоснапшоты. Для автоматизации предусмотрен API; в панели управления можно масштабировать ресурсы, перезагружать сервер и следить за статистикой.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/fabfe43d-7891-4129-8ad5-e87f45b087ef.png" alt="" /></figure><h2>Как выбрать VPS под свой проект</h2><p>Для сайта с пиковыми нагрузками подойдёт SmartApe, где дисковая подсистема на NVMe-SSD в RAID-10 обеспечивает скорость чтения до 8000 Мбайт/с и записи до 2000 Мбайт/с, а сайт на конфигурации с 2 vCPU, 4 ГБ RAM и 80 ГБ SSD выдерживает 300–500 уникальных посетителей в день с пиком до 50 одновременных пользователей и нагрузкой 5–10 запросов в секунду (короткими всплесками до 20).</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/bc98805d-7f7f-471d-a2a2-1df68139c637.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/204e63be-985f-449d-a37c-37ca9993d335.png" alt="" /></figure><p>Если проект включает высоконагруженный API, например, на Node.js, то оптимален SmartApe с конфигурацией 4 vCPU, 8 ГБ RAM и 160 ГБ NVMe, которая стабильно обрабатывает 50–100 запросов в секунду (пики до 200) при 500–1000 одновременных подключениях (максимум 2500) и трафике до 200 ГБ в месяц.</p><p>Для задач с 1С, где важна стабильность и сокращение IT-расходов, выбирайте InCloud на базе AMD EPYC 9554: в кейсе Vamkamin это ускорило работу системы на 40%, сократило расходы на 35% и минимизировало простои, с ежедневными бэкапами до 30 дней и SLA-договором.</p><p>Если нужен VPS для Битрикс с высокой частотой CPU, подойдёт FirstVDS на AMD Ryzen (CPU.Турбо) с частотой до 5,7 ГГц и DDR5: скидка 30% на 3 месяца при покупке лицензии Битрикс, плюс отказоустойчивость на кластере Ceph с репликацией данных.</p><p>Для веб-студий с разработкой и поддержкой сайтов для e-commerce, где требуется распределение проектов по производительности и бесперебойная работа в сезонные пики, подойдёт InCloud на AMD EPYC 9554: в кейсе 100UP это сократило время отклика на 45% и обеспечило стабильность под высокой нагрузкой.</p><p>Если проект ориентирован на международный трафик с предсказуемыми ресурсами и высоким SLA, выбирайте PSB Hosting с локациями в Нидерландах, США, Германии или Финляндии, безлимитным трафиком и каналом до 10 Гбит/с на DDR5 и NVMe в RAID 10.</p><p>Для бэкенда мобильного приложения с нагрузкой до 12 000 уникальных пользователей в сутки (утилизация CPU 25%) подойдёт ИХЦ на NVMe/24 с 24 ГБ RAM и ~200 ГБ SSD, стеком nginx, PHP, MySQL.</p><p>Если развлекательный сайт с более чем 5000 уникальных пользователей в сутки (загрузка CPU ~20%), то подходит ИХЦ на NVMe/12 с 12 ГБ RAM и ~120 ГБ SSD, стеком nginx, Docker, Node.js. Он обеспечит стабильность с безлимитным трафиком и DDoS-защитой.</p><p>Выбор сводится к трём вопросам: где ваши<br />пользователи, какую пиковую нагрузку вы ждёте и нужен ли формальный SLA.<br />Сформулируйте эти требования заранее — и любой из пяти хостингов закроет задачу<br />без проблем в продакшне. Добавить свои рекомендации VPS хостингов — вы всегда<br />можете в комментариях, желательно описывать короткие кейсы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Выбираем российский хостинг в 2025: подборка на любой запрос</title>
      <link>https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros</link>
      <comments>https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros</guid>
      <description><![CDATA[<p>В этом материале — семь проверенных российских хостингов для разных задач: от стартапа до корпоративного проекта. Каждый прошел тестирование на аптайм (время бесперебойной работы), безопасность и доступность поддержки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros">Выбираем российский хостинг в 2025: подборка на любой запрос</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Windows Server]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 22 Jul 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году российский хостинг переживает новый виток развития. После того как законодательство изменилось и добавились новые технологии, локальные провайдеры усилили инфраструктуру.</p><p>Теперь они предлагают решения, которые не хуже, а где-то даже и лучше международных аналогов и по надёжности, и по цене.</p><p>Посмотрим, кто из них есть в этом списке, и определим особенности хостингов для сайта.</p><h2>1. FirstVDS: профессиональные решения для любых проектов</h2><p><a href="https://firstvds.ru/">FirstVDS</a><a href="https://firstvds.ru/" rel="noopener noreferrer nofollow"></a> — хостинг-провайдер с опытом на рынке более 20 лет. Предлагают VPS и VDS с виртуализацией KVM для проектов любого размера. Все серверы работают на современном оборудовании. Трижды победитель в номинации «Хостер года» Национальной премии «ЦОДы.РФ».</p><p>Хостинг подойдет бизнесу любого масштаба: для любых сайтов — от визиток до высоконагруженных интернет-магазинов, для разработки и тестирования, для сервисов и других проектов. Отдельные решения для Битрикс, установка ОС семейства Linux и Windows Server.</p><h3>Особенности хостинга</h3><h4>Надёжность</h4><p>FirstVDS обеспечивает аптайм 99,97–99,99% в 2025 году, подтверждённый замерами (например, отклик из Москвы — 27 мс в апреле 2025). Серверы размещены в трёх дата-центрах уровня Tier III: два в Москве (IXcellerate и Web DC) и один в Амстердаме (euNetworks). Отказоустойчивый кластер Ceph гарантирует работу даже при сбоях точки или канала.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/80547603-f63a-4f2e-9bc1-332c9e061bf9.png" alt="" /></figure><h4>Инфраструктура</h4><p>Серверы работают на процессорах Intel Xeon и AMD EPYC (до 5,7 ГГц в линейке CPU.Турбо), с быстрыми NVMe-дисками объёмом до 8 ТБ и оперативной памятью DDR5 (до 768 ГБ в VDS Атлант). Это обеспечивает высокую производительность для ресурсоёмких задач, таких как Битрикс или высоконагруженные приложения.</p><h4>Гибкость</h4><p>Тарифы масштабируются: от базовых конфигураций (1 CPU, 1 ГБ RAM, 40 ГБ SSD) до мощных серверов (192 ядра, 768 ГБ RAM, 8 ТБ NVMe). Линейки:</p><ul><li>VDS Форсаж: AMD EPYC, до 128 ядер, 512 ГБ RAM, 4 ТБ NVMe, от 749 ₽/мес (Москва/Амстердам).</li><li>CPU.Турбо: AMD Ryzen до 5,7 ГГц, DDR5, от 624 ₽/мес (Москва).</li><li>VDS Атлант: отказоустойчивый, до 192 ядер, 8 ТБ NVMe, от 1619 ₽/мес (Москва).</li><li>VDS Storage: хранилище, от 704 ₽/мес (Москва).Горячее масштабирование (hot-resize) позволяет добавлять CPU, RAM или диск без перезагрузки.</li></ul><h4>Автоматизация</h4><p>Шаблоны для быстрого развёртывания: Django, Redmine, Tomcat, Teamspeak, Nextcloud, LAMP, LEMP, Forgejo Git, GitLab, Битрикс. Поддерживаются ОС Linux (Ubuntu, Alma, Debian, Rocky, CentOS, Oracle), FreeBSD, Windows Server. API и панель ispmanager 6 lite (бесплатно на месяц) упрощают управление.</p><h4>Безопасность</h4><p>Включена защита от DDoS-атак на сетевом уровне, BitNinja для защиты сервера и сайта, SSL-сертификаты GlobalSign. Доступны автобэкапы, снапшоты, Кибер-бэкап и объектное хранилище S3 для больших данных.</p><h4>Поддержка</h4><p>Круглосуточная поддержка 24/7 без чат-ботов, ответ до 15 минут через чат, личный кабинет или телефон. Бесплатно: помощь с активацией и первичной настройкой. Платно: установка ПО, администрирование. Экспертная линия для мониторинга и устранения сбоев.</p><h4>Бонусы</h4><ul><li>Тестовый период 3 дня.</li><li>Бесплатный перенос до 10 сайтов с другого хостера.</li><li>Скидки: 40% на первый месяц при оплате на 1/3/6 месяцев или 3 месяца бесплатно при оплате за год.</li><li>Лояльность: скидка 5–20% для клиентов от 5 лет.</li><li>Реферальная программа: 10% от расходов привлечённых клиентов для партнёра, 25% скидка для нового пользователя на первый месяц.</li><li>Домены: продление по цене регистрации.</li></ul><h3>Тарифы и условия</h3><p>Тестовый период 3 дня, после него подключаете один из основных тарифов:</p><ul><li>Линейка готовых конфигураций от 1 CPU, 1 Гб RAM, 40 Гб SSD-накопителя и от 219 руб/мес. до сервера с 8 CPU, 12 Гб RAM, 150 Гб NVMe-накопителя. Локация в РФ и Нидерландах.</li><li>VDS Форсаж: на AMD Epyc от 749 ₽/мес. Локации: РФ и Нидерланды.</li><li>CPU.Турбо: гибкая конфигурация на базе высокочастотных AMD Ryzen 9 от 624 ₽/мес. При покупке лицензии Битрикс дополнительная скидка 30% на 3 месяца аренды CPU.Турбо. Локация в РФ.</li><li>VDS Атлант: отказоустойчивый с автобэкапами от 1 619 ₽/мес. Локация: РФ.</li><li>VDS Storage: сервис как хранилище с гибкой конфигурацией от 704 ₽/мес. Локация: РФ</li></ul><p>Все тарифы доступны для тестирования по согласованию с отделом продаж. Для точного подбора конфигурации используйте гибкую настройку.</p><h2>2. UltraVDS: для малого бизнеса и стартапов</h2><p>Компания <a href="https://ultravds.com/">UltraVDS</a>, провайдер услуг виртуальных серверов (VPS/VDS), работает на рынке с 2014 года — предлагает решения для разных операционных потребностей. Сервисы UltraVDS можно использовать для развертывания торговых роботов, запуска чат-ботов, хостинга веб-сайтов, а также для создания FTP-хранилищ данных. Есть предложения для фрилансеров, цифровых агентств, корпоративных пользователей и стартапов, которым требуются функциональные инфраструктурные решения.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/edef3abb-6f77-4c69-be56-e22d90f379db.png" alt="" /></figure><h3>Технические особенности</h3><p>Серверы UltraVDS размещены в современном дата-центре, расположенном в Москве. Доступность сервиса (аптайм) составляет 99,98%, что обеспечивает высокую стабильность работы. Сетевая пропускная способность превышает 200 Мбит/с, при этом трафик предоставляется без ограничений.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/56ccb605-b64b-44f3-94b7-10e960541dda.png" alt="" /></figure><p>Система защиты от DDoS-атак способна обрабатывать трафик до 1,5 Тбит/с и поддерживает стабильность работы сервера даже при интенсивном внешнем воздействии. Лицензия на Windows Server входит в стоимость обслуживания в данном предложении. Это упрощает развертывание сервера: вам не нужно отдельно покупать и устанавливать лицензию. Плюс снижает общие операционные расходы для пользователей этой операционной системы.</p><h3>Тарифные планы</h3><p>Для новых пользователей UltraVDS предусмотрена возможность 3-дневного тестового периода, позволяющего оценить функциональность и производительность сервиса.</p><p>После тестового периода стоимость тарифов начинается от 119 рублей в месяц. На сайте доступен онлайн-калькулятор, позволяющий подобрать конфигурацию сервера и рассчитать итоговую стоимость.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/932d0cca-9f20-4723-8ae9-8d9c3218a08a.png" alt="" /></figure><p>Клиентам доступны различные варианты оплаты, включая ежемесячную систему без предоплаты. При авансовой оплате на период от 3 до 12 месяцев предоставляются скидки до 20%, размер которых зависит от выбранного срока. В случае досрочного прекращения использования сервиса, неиспользованный остаток средств возвращается на баланс пользователя.</p><h3>Поддержка и обслуживание</h3><p>Техническая поддержка UltraVDS работает круглосуточно, 7 дней в неделю. Среднее время ответа на запросы составляет до 15 минут. Связь со службой поддержки возможна по электронной почте и телефону, указанным на официальном сайте.</p><h2>3. RUVDS: 10 лет на рынке облачных решений</h2><p><a href="https://ruvds.com/ru-rub">RUVDS</a> — облачный провайдер, имеющий десятилетний опыт работы на рынке услуг виртуальных серверов (VPS/VDS). Является официальным партнером Huawei в России, работает по SLA. Компания предоставляет инфраструктурные решения, которые могут быть применены для широкого спектра задач, включая хостинг высоконагруженных интернет-магазинов, корпоративных порталов, игровых серверов, сложных backend-систем и чат-ботов.</p><p>Платформа RUVDS спроектирована для оптимизации процесса развертывания ресурсов. Одной из ее особенностей является маркетплейс, который позволяет быстро запускать серверы с предустановленным программным обеспечением. Это способствует ускорению старта проектов, снижая потребность в ручной настройке распространенных CMS, игровых серверов и сред разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/aed25b96-b39b-4be9-b875-dc695645ef24.png" alt="" /></figure><h3>Тарифная политика и варианты оплаты</h3><p>RUVDS предлагает различные тарифные планы. Например, стоимость конфигурации Linux-сервера (1 CPU, 512 МБ RAM, 10 ГБ HDD, 1 IPv4) начинается от 139 ₽/месяц. Это может быть рассмотрено как экономичное решение для запуска небольших проектов и проведения тестирования.</p><p>Клиентам доступны разные опции оплаты:</p><ol><li>Ежемесячные платежи или предоплата на срок от 3 до 12 месяцев, при которой предоставляются скидки до 20%, зависящие от продолжительности периода.</li><li>Для проектов с динамической нагрузкой предусмотрена посекундная тарификация, оплата по которой взимается только за фактически использованные ресурсы. Неиспользованный остаток средств в рамках этой модели возвращается на баланс пользователя</li></ol><p>Дополнительно, до конца 2025 года панель управления ISP Manager для сервера и сайта предоставляется без дополнительной платы при создании любого VPS.</p><h3>Глобальная инфраструктура и стабильность</h3><p>Инфраструктура включает 17 дата-центров уровня Tier III, расположенных по всему миру. Это один из самых больших показателей по количеству геолокаций среди российских провайдеров. Для работы используются корпоративное оборудование и накопители (HDD, SSD, NVMe), чтобы обеспечить стабильную работу и производительность размещенных проектов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/3f3c970e-820f-4f0e-9b53-f227950e298b.png" alt="" /></figure><h3>Поддержка клиентов и доступные ресурсы</h3><p>Техническая поддержка RUVDS доступна круглосуточно, 7 дней в неделю. Среднее время ответа на запросы через тикет-систему или онлайн-чат составляет 15 минут. Клиентам предоставляются полные административные права и консультации по вопросам запуска и настройки серверов. Для самостоятельного изучения доступна база знаний, включающая инструкции и руководства.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/c086a963-2d51-4ada-86c8-0c1704cf8230.png" alt="" /></figure><h3>Безопасность и масштабирования</h3><p>В контексте безопасности данных, RUVDS предлагает несколько решений:</p><p>- Встроенная защита от DDoS-атак, способствующая поддержанию бесперебойной работы серверов при внешнем воздействии.</p><p>- Стандартный IPv4-адрес включен в стоимость каждой виртуальной машины, с опцией аренды дополнительных IP-адресов.</p><p>- API, соответствующий OpenAPI 3.0.0, предоставляет возможности для интеграции и автоматического масштабирования серверных ресурсов в зависимости от нагрузки.</p><p>- Компания официально подтверждает соответствие требованиям ФСТЭК и ФЗ-152 по защите персональных данных, что обеспечивает соблюдение соответствующих законодательных норм.</p><h2>4. McHost: решения для бизнеса разного масштаба</h2><p><a href="https://mchost.ru/"> McHost</a> предоставляет комплексные хостинговые решения, включая виртуальный хостинг и VPS/VDS с NVMe-накопителями. Сервис поддерживает популярные CMS (WordPress, Joomla, 1С-Битрикс) с оптимизированными настройками и автоматической установкой через панель управления.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/2ccc459a-8df5-41b6-bbf9-b751bed2e757.png" alt="" /></figure><p>McHost ориентирован на широкий круг клиентов:</p><ul><li>владельцы сайтов-визиток, блогов и лендингов — благодаря низким тарифам и полному набору опций;</li><li>интернет-магазины с небольшой нагрузкой — тарифы с SSD-накопителями и автоматическим резервным копированием обеспечивают стабильную работу;</li><li>разработчики, которым нужны<br />VPS/VDS с root-доступом — работают серверы на KVM-виртуализации с ОС Linux и Windows;</li><li>госучреждения и компании,<br />работающие с персональными данными — соответствие 152-ФЗ и размещение в дата-центрах Tier III в Москве.</li></ul><h3>Особенности сервиса</h3><p>McHost поддерживает стабильную работу с аптаймом 99.9% за счет размещения оборудования в дата-центрах уровня Tier III — в Москве и Нидерландах.</p><p>Сервис предоставляет защиту от DDoS-атак, автоматическое резервное копирование раз в два дня с хранением данных в течение 30 дней для виртуального хостинга и 14 дней для VPS, а также поддержку российских криптографических стандартов. Клиентам доступны различные варианты размещения: от виртуального хостинга с SSD (от 157.5 ₽/мес) до выделенных серверов с NVMe-накопителями.</p><h3>Технические параметры и условия</h3><p>Инфраструктура McHost базируется на серверах Dell с NVMe-накопителями и процессорами Intel Xeon (частота ядер от 2.35 ГГц). Для виртуального хостинга используется CloudLinux с технологией CageFS, обеспечивающей изоляцию аккаунтов. Поддержка российских ОС («Альт») подтверждена для VPS-тарифов.</p><p>В техподдержку можно обратиться по телефону, через тикет или в Telegram-боте. Время ответа — до 10 минут.</p><p>Текущие тарифы:</p><ul><li>Виртуальный хостинг: от 157 ₽/мес<br />(3 ГБ SSD, 1 сайт).</li><li>VPS: от 396 ₽/мес (15 ГБ SSD, 1<br />ядро CPU).</li><li>Выделенные серверы: от 3 000 ₽/мес<br />(32 ГБ RAM, 2×1 ТБ HDD).</li></ul><h2>5. UFO Hosting: VPS/VDS и выделенные серверы с портом до 10 Гбит/с и безлимитным трафиком</h2><p><a href="https://ufo.hosting/">UFO Hosting </a>предлагает VPS/VDS и выделенные серверы на партнёрской инфраструктуре IXcellerate (Tier III). В портфолио — недорогие виртуальные машины и серверы с портом 10 Gbps для проектов, которым нужна стабильность без завышенных цен.</p><p>Сервис подходит для пользователей разных масштабов: от фрилансеров и веб‑студий до средних и крупных компаний. Для DevOps‑специалистов доступны API и инструменты автоматизации.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-19/3cfc6e79-bab0-48ab-862b-f523c0ad24e8.png" alt="" /></figure><h3>Основные сценарии использования</h3><ul><li>корпоративные сайты, CRM‑системы и веб‑приложения;</li><li>аналитические сервисы и SaaS‑продукты;</li><li>инфраструктура для разработки и тестирования;</li><li>задачи фрилансеров, агентств и digital‑команд.</li></ul><h3>Формат работы, особенности и интеграции</h3><p>Серверы установлены в российском дата‑центре Tier III (IXcellerate), что означает резервирование по питанию и каналам связи. Заявленный аптайм — 99,98 %. Поддержка работает круглосуточно в тикетах, чате и по телефону; среднее время ответа 5–10 минут.</p><p>Сервис UFO Hosting делает акцент на безопасности и гибкости. Есть сеть с защитой от DDoS, возможность горячего расширения ресурсов, автоматическое развёртывание из шаблонов и API для интеграции. Поддерживаются популярные фреймворки и CMS, есть интеграции с GitLab, Telegram и DockerHub. Бэкапы, снапшоты и резервирование входят в стандартный набор, так что восстанавливать тестовую среду не придётся вручную.</p><p>В панели управления можно автоматически установить популярные CMS, панели управления, хранилища и DevOps‑инструменты. Это экономит время на настройку и подходит тем, кто не хочет поднимать всё с нуля.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-06/e4433ae3-898b-4c14-90c1-2a4bbb8b13a1.png" alt="" /></figure><h3>Условия использования и тарифы</h3><p>Базовые конфигурации начинаются от 577 руб./месяц. Заявленная скорость порта — до 10 Gbps, что подходит для проектов, где много трафика.</p><p>Есть возможность бесплатно попробовать сервис присутствует, но предоставляется по запросу в поддержку, а при оплате на срок от трёх месяцев действуют скидки, а также регулярно проводятся акции: это поможет оптимизировать бюджет.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-06/1e2e0191-1194-4a60-a612-fcac5d8cf76d.png" alt="" /></figure><p>В целом, UFO Hosting выглядит как практичное решение для тех, кому нужны производительные VPS/VDS и выделенные серверы в России. При выборе стоит оценить, насколько конфигурации подходят под конкретные нагрузки и есть ли необходимость в интеграциях из коробки.</p><h2>6. Timeweb: хостинг для веб-проектов</h2><p><a href="https://timeweb.com/">Timeweb </a>предоставляет услуги хостинга для различных типов веб-проектов. Сервис поддерживает популярные CMS, включая WordPress, 1C-Битрикс и Joomla, что делает его подходящим как для личных блогов, так и для корпоративных сайтов.</p><p>Платформа использует собственную панель управления с инструментами для работы с сайтами, базами данных и резервными копиями. Ежедневное автоматическое резервное копирование с хранением данных до 30 дней включено во все тарифные планы. Базовая защита от DDoS-атак доступна для всех клиентов без дополнительной платы.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/b443bfef-bccb-4672-bd55-cb67a1146bc3.png" alt="" /></figure><p>Инфраструктура Timeweb размещена в дата-центрах уровня Tier III в России (Санкт-Петербург) и Казахстане (Алматы). Гарантированный показатель uptime составляет 99.98%. Поддерживаются современные технологии: PHP версий от 5.3 до 8.4, MySQL от 5.6 до 8.0, а также Perl, Python, SSH, FTP и Cron.</p><p>Тарифные планы:</p><ul><li>Year+: от 164 ₽/мес (2 сайта, 15<br />ГБ NVMe, 2 БД);</li><li>Optimo+: от 248 ₽/мес (15 сайтов,<br />40 ГБ NVMe, безлимитные БД);</li><li>Century+: от 347 ₽/мес (35 сайтов,<br />50 ГБ NVMe, безлимитные БД);</li><li>Millennium+: от 482 ₽/мес (60<br />сайтов, 60 ГБ NVMe, безлимитные БД).</li></ul><p>Все тарифы включают бесплатный SSL-сертификат, 10 ГБ почтовой квоты с неограниченным количеством ящиков и DNS-хостинг. При оплате годового тарифа предоставляется домен в зонах .RU/.РФ в подарок.</p><p>Техническая поддержка доступна круглосуточно через онлайн-чат, тикет-систему и по телефону. Среднее время ответа не превышает 15 минут. Новые клиенты могут протестировать сервис бесплатно в течение пробного периода.</p><h2>7. Reg.ru: комплексные решения для сайтов и доменов</h2><p><a href="https://www.reg.ru/">Reg.ru </a>сочетает услуги хостинга и регистрации доменов, что упрощает управление веб-проектами. Компания работает с 2005 года, имеет статус аккредитованного регистратора доменных имён в зонах .RU и .РФ.</p><h3>Функциональные возможности</h3><p>Платформа предоставляет доступ к трём панелям управления: ISPmanager, cPanel и Plesk. Это позволяет выбрать наиболее удобный интерфейс для работы с сайтами. Все тарифы включают бесплатный SSL-сертификат от Let’s Encrypt, который автоматически устанавливается при создании сайта.</p><p>Начинающим пользователям доступен конструктор сайтов с готовыми шаблонами. Поддерживаются популярные CMS, включая WordPress, Joomla и 1С-Битрикс. Ежедневное резервное копирование данных с хранением копий в течение 30 дней входит в стандартный набор услуг.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/c1ac0c6a-51ae-4ae5-8875-f18a01ffdc2c.png" alt="" /></figure><h3>Техническая инфраструктура</h3><p>Серверы размещены в дата-центрах уровня Tier III в Москве. Средний показатель uptime составляет 99.9%, что подтверждается ежемесячной статистикой. Подключение к сети осуществляется по выделенным каналам со скоростью до 1 Гбит/с на выделенных серверах.</p><h3>Поддержка и тарифы</h3><p>Техническая поддержка доступна 24/7 через онлайн-чат и тикет-систему. Среднее время ответа составляет 15-20 минут. Для срочных вопросов можно обратиться по телефону.</p><p>Тарифы — от 151 ₽/мес (7 ГБ SSD, 15 сайтов). При регистрации домена в зонах .RU или .РФ предоставляется скидка на другие доменные имена.</p><h2>8. Спринтхост: хостинг с персональным подходом</h2><p><a href="https://sprinthost.ru/">Sprinthost</a> предлагает услуги хостинга с акцентом на индивидуальную поддержку клиентов. Сервис работает с 2011 года и специализируется на VPS-решениях для различных веб-проектов.</p><h2>Особенности сервиса</h2><p>Компания предоставляет персонального менеджера для каждого клиента, который помогает с настройкой сервера и решением технических вопросов. А если вы остались недовольны услугами, то в течение 30 дней сервис вернёт деньги. Sprinthost проводит бесплатные обучающие вебинары по DevOps и администрированию серверов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/7acc90d0-655a-4cda-906f-a7e5ad4f9a8e.png" alt="" /></figure><h3>Технические характеристики и тарифы</h3><p>Инфраструктура размещена в дата-центрах Москвы и Санкт-Петербурга с аптаймом 99.9%. Поддерживаются современные технологии разработки, включая Ruby on Rails, Node.js, Python и Docker. Все серверы используют SSD-накопители с гарантированной скоростью чтения/записи.</p><p>Тарифные планы:</p><ul><li>Start: 290 ₽/мес (1 ядро, 1 ГБ<br />RAM, 15 ГБ SSD);</li><li>Turbo: 1 900 ₽/мес (4 ядра, 8 ГБ<br />RAM, 100 ГБ NVMe).</li></ul><h3>Поддержка</h3><p>Техническая помощь доступна 24/7 через тикет-систему и онлайн-чат. Среднее время ответа составляет 10-15 минут. Для корпоративных клиентов предусмотрена приоритетная поддержка по телефону.</p><h2>Как выбрать хостинг в 2025 году</h2><p>Выбор хостинга зависит от типа проекта и его требований. Для небольших сайтов и блогов подойдет виртуальный хостинг с поддержкой популярных CMS — важно проверить наличие автоматических бэкапов и базовой защиты от DDoS. Если проект связан с обработкой персональных данных, убедитесь, что провайдер соответствует 152-ФЗ и использует сертифицированное оборудование.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/3a0b1d01-c4e0-424d-86b2-8988d43bcdb1.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/b3c26558-3a50-4eb3-a9f3-89c899fd9e59.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/3408c453-b5db-44ce-b6ab-f1b3bcb5abd1.png" alt="" /></figure><p>Для высоконагруженных сервисов и интернет-магазинов лучше рассматривать VPS или выделенные серверы. Обратите внимание на тип накопителей (SSD/NVMe), возможность масштабирования ресурсов и аптайм дата-центров (рекомендуется от 99.9%).</p><p>Перед покупкой протестируйте сервис — большинство провайдеров предлагают пробный период. Проверьте скорость работы панели управления и отзывчивость поддержки. Не забывайте о резервном копировании: даже если хостинг предоставляет эту услугу, дублируйте критически важные данные самостоятельно.</p><p>Главное правило — выбирайте решение, которое покрывает текущие потребности проекта. Важно, чтобы конфигурацию можно было оперативно менять по мере роста запросов и масштабирования бизнеса. Технологии меняются быстро, и гибкость конфигурации часто важнее сиюминутной экономии.</p><h2>FAQ</h2><h3>Что такое виртуальный хостинг и когда его выбирать?</h3><p>Виртуальный хостинг — это экономичное решение, где один физический сервер делит ресурсы между множеством сайтов. Подходит для небольших проектов с низкой нагрузкой: личных блогов, лендингов или стартовых страниц.</p><p>Преимущества: низкая стоимость, простота управления через панели, автоматические обновления и базовая защита. Минусы: ограниченные ресурсы; производительность зависит от соседних сайтов; минимальный контроль над настройками.</p><h3>Что такое VPS/VDS и для каких проектов он подходит?</h3><p>VPS (Virtual Private Server) или VDS — это виртуальный сервер с выделенными ресурсами (процессор, память, диск), предоставляющий доступ для полной настройки. Идеален для проектов среднего масштаба: интернет-магазинов, API, SaaS, чат-ботов, корпоративных порталов или приложений с умеренным трафиком.</p><p>Преимущества: гибкость конфигураций, выбор ОС, изоляция ресурсов. Минусы: требует базовых навыков администрирования, стоимость выше, чем у виртуального хостинга.</p><h3>Что такое выделенный сервер и когда его использовать?</h3><p>Выделенный сервер — это физический сервер, полностью зарезервированный под ваш проект. Подходит для высоконагруженных систем: крупных интернет-магазинов, игровых платформ, корпоративных ERP или аналитических сервисов с большим трафиком.</p><p>Преимущества: максимальная производительность, полный контроль, высокая отказоустойчивость. Минусы: высокая цена, сложность настройки и обслуживания.</p><h3>В чём основные различия между виртуальным хостингом, VPS и выделенным сервером?</h3><p>Виртуальный хостинг — самый дешёвый и простой, но ресурсы делятся между пользователями, что ограничивает производительность (до 1000–2000 посетителей в сутки).</p><p>VPS обеспечивает выделенные ресурсы и гибкость, справляясь с нагрузкой до 5000–10 000 пользователей в сутки.</p><p>Выделенный сервер — максимум мощности для пиков свыше 10 000 пользователей, но требует значительных затрат и технических знаний.</p><p>Выбор зависит от масштаба: виртуальный для старта, VPS для роста, выделенный для enterprise.</p><h3>Нужны ли навыки администрирования для хостинга?</h3><p>Для виртуального хостинга навыки не нужны — управление идёт через интуитивные панели, а провайдеры обеспечивают обновления и базовую поддержку. Для VPS желательны базовые знания (настройка ОС, установка ПО), хотя многие провайдеры предлагают помощь. Для выделенного сервера навыки администрирования необходимы, так как вы полностью отвечаете за сервер, хотя провайдеры могут предлагать платное администрирование.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что по экологии? Сколько углеродного следа оставляет ваш код</title>
      <link>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</link>
      <comments>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</guid>
      <description><![CDATA[<p>Узнайте, сколько CO₂ генерирует ваш код в 2025 году и как снизить углеродный след в IT. Практические советы по оптимизации архитектуры, выбору «зеленых» технологий и реальные кейсы компаний. Экологичное программирование — новый тренд для разработчиков и бизнеса.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod">Что по экологии? Сколько углеродного следа оставляет ваш код</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году IT-индустрия потребляет больше энергии, чем крупная европейская страна  в 2010. <a href="https://www.iea.org/">По данным IEA</a> (International Energy Agency), дата-центры и телекоммуникационные сети уже отвечают за 3,7% глобальных выбросов CO₂ — это больше, чем производит авиация.</p><p>Казалось бы, код — это просто текст. Но каждый запрос к API, каждая компиляция и даже холостой цикл требуют энергии. Например, обучение GPT-4 в 2023 году «съело» столько же электричества, сколько 120 домохозяйств за год. А теперь представьте, что таких моделей тысячи, а серверов — миллионы.</p><p>Почему это важно? Во-первых, <a href="https://digital-strategy.ec.europa.eu/">регуляторы ужесточают требования</a>: в ЕС с 2025 года IT-компании обязаны раскрывать углеродный след своих продуктов. Во-вторых, инвесторы все чаще смотрят на ESG-рейтинги — показатели экологического и ответственного производства. В-третьих, оптимизация кода снижает затраты на инфраструктуру.</p><p>Эта статья — не манифест экоактивистов, а руководство для разработчиков, архитекторов и технических директоров компаний (СТО), которые стремятся более эффективные и экологичные проекты.</p><h2>Углеродный след кода: что скрывается за строчками</h2><p>Программное обеспечение — не виртуальный конструктор. Каждая операция требует электричества, а серверы, на которых работает код, часто питаются от невозобновимых источников энергии — например, угля и газа.</p><h3>Откуда берутся выбросы</h3><p>Когда мы говорим об углеродном следе ПО, важно понимать: код не существует в вакууме. Каждая строка, каждый запрос и каждая операция требуют физических ресурсов — электричества, серверного оборудования, систем охлаждения. В 2025 году эта цепочка стала еще сложнее из-за взрывного роста облачных вычислений и ИИ.</p><p>Прямые выбросы — это энергия, которую потребляют серверы при выполнении вашего кода. Например, один средний веб-сервер на AWS EC2 (тип t3.large) в год вырабатывает около 400 кг CO₂ — как небольшой автомобиль, проехавший 2000 км. При этом нагрузка на серверы постоянно растет: с 2020 по 2025 год энергопотребление дата-центров увеличилось на 35%.</p><p>Косвенные выбросы часто упускают из виду. Производство серверного оборудования — процесс крайне энергоемкий. Для создания одной только микросхемы памяти DDR5 требуется около 200 кВт⋅ч энергии — столько же, сколько средний холодильник потребляет за год. А после выхода оборудования из строя лишь 20% компонентов перерабатывается должным образом (<a href="https://globalewaste.org/">Global E-Waste Monitor 2024</a>).</p><p>Системы охлаждения — еще один скрытый источник выбросов. Современные дата-центры работают 24/7, и даже с использованием жидкостного охлаждения на поддержание температуры уходит до 40% всей потребляемой энергии. В жарких странах, ОАЭ или Сингапуре, этот показатель может достигать 50%.</p><p>Яркий пример — крупные языковые модели. Если в 2023 году обучение GPT-4 потребовало ~10 ГВт⋅ч (эквивалент годового потребления 120 домохозяйств), то к 2025 году из-за увеличения размеров моделей этот показатель вырос в 1,5 раза. Один запрос к такому ИИ теперь генерирует около 2 г CO₂ — как если бы вы проехали 10 метров на бензиновом автомобиле.</p><p>Но проблема не только в ИИ. Обычное веб-приложение с посещаемостью 100 000 пользователей в месяц может производить до 1 тонны CO₂ в год — и это без учета мобильных клиентов и API. При этом <a href="https://www.webpagetest.org/eco/">30% этой нагрузки приходится на неоптимизированный фронтенд</a>: тяжелые изображения, избыточные JavaScript-библиотеки и частые запросы к серверу.</p><p>Ситуацию усугубляет географический фактор. Дата-центр в Норвегии, где 98% энергии поступает от ГЭС, будет «чище», чем такой же центр в Польше, где угольные электростанции дают 70% энергии. <a href="https://app.electricitymaps.com/">Разница</a> в углеродном следе может быть 20-кратной для идентичных операций.</p><p>При этом стандарты измерения все еще остаются разрозненными. PUE (Power Usage Effectiveness), который используют Google и Microsoft, учитывает только эффективность инфраструктуры, но не источник энергии. Новый стандарт CUE (Carbon Usage Effectiveness), разработанный в 2024 году, уже включает эти данные, но его поддерживают менее 30% провайдеров.</p><h2>Где код тратит энергию впустую</h2><p>Некоторые части систем особенно вредны для экологии. Главные «пожиратели» ресурсов:</p><ul><li>Неоптимизированные алгоритмы. Сортировка пузырьком (O(n²)) на большом массиве данных может потреблять в 100 раз больше энергии, чем быстрая сортировка (O(n log n)).</li><li>Микросервисный хаос. Архитектура из сотен микросервисов увеличивает нагрузку на сеть. Каждый вызов API между сервисами — это дополнительные 0,5–1 Вт⋅ч.</li><li>Облачные провайдеры. Не все одинаково зеленые. AWS и Google используют 60–70% ВИЭ (возобновляемых источников энергии), но в Азии и Африке их дата-центры часто работают на угле.</li></ul><h3>Как измерить углеродный след</h3><p>В 2025 году появились инструменты, которые помогают оценить влияние кода:</p><ul><li>Cloud Carbon Footprint — анализирует выбросы AWS, GCP и Azure.</li><li>Scaphandre — мониторит энергопотребление серверов в реальном времени.</li><li>Greenframe.io — симулирует нагрузку на веб-приложение и считает CO₂.</li></ul><p>Климатические инициативы в IT больше не просто красивые слова в корпоративных отчетах. В 2025 году за неэффективный код можно получить не только порицание сообщества, но и вполне реальный штраф.</p><p>Европейский союз уже ввел санкции против пяти крупных SaaS-компаний за превышение углеродных квот, а Amazon Web Services выплатила 2,7 млн евро штрафа за неоптимизированные алгоритмы в своих сервисах.</p><h2>Как изменились подходы к разработке</h2><p>Эти тренды нацелены на долгосрочное действие и в перспективе должны полностью изменить текущую концепцию в разработке.</p><h3>Экологичный DevOps — новая реальность</h3><p>Современные системы автоматического масштабирования стали умнее. Kubernetes Horizontal Pod Autoscaler теперь учитывает не только нагрузку на CPU, но и текущий углеродный след дата-центра. Если в регионе пиковое потребление энергии и работают угольные электростанции, система сознательно ограничивает масштабирование.</p><p><a href="https://cloud.google.com/blog">Технология, разработанная Google</a> в партнерстве с WattTime, уже снижает выбросы CO₂ на 27-33% по сравнению с традиционным подходом.</p><p>CI/CD-цепочки тоже стали «зеленее». Вместо запуска полного набора тестов при каждом коммите, современные системы определяют, какие именно модули затронуты изменениями.</p><p><a href="https://carbonrunner.io/features/github-action-runners">GitHub Actions представил Carbon-Aware Runner</a>, который планирует выполнение задач на время максимальной доступности возобновляемой энергии в регионе. По данным Microsoft, это сокращает углеродный след тестирования на 40%.</p><h3>Языки программирования: война за эффективность</h3><p>Rust продолжает набирать популярность не только из-за безопасности, но и благодаря энергоэффективности. Тесты Benchmarks Game показывают, что один и тот же алгоритм обработки данных на Rust потребляет на 38-42% меньше энергии, чем на Python. В 2025 году Rust вошел в топ-5 языков для enterprise-решений, вытеснив Java в 17% крупных проектов.</p><p>Но настоящим открытием стал <a href="https://ziglang.org/documentation/master/">Zig </a>— язык, который сочетает производительность C с простотой синтаксиса. Его компилятор потребляет в 3 раза меньше ресурсов, чем LLVM-бэкенд Rust, что делает его идеальным выбором для встраиваемых систем.</p><h3>ИИ на грани: когда меньше значит лучше</h3><p>TinyML-революция набирает обороты. Современные нейросети для микроконтроллеров занимают менее 256 КБ памяти, но справляются с задачами, которые раньше требовали облачных вычислений.</p><p>Например, новые датчики Nest анализируют звук прямо на устройстве, определяя не только дым, но и тип возгорания. Это экономит до 150 МБ трафика в месяц на одно устройство.</p><p>На фронте больших языковых моделей тоже произошли изменения. Meta* выпустила LLaMA-3 Nano — модель с 500 млн параметров, которая работает на смартфоне и по качеству ответов не уступает GPT-3.5. Ее углеродный след при обучении в 1200 раз меньше, чем у GPT-4.</p><p><i>(*Компания запрещена в РФ)</i></p><h3>Новые правила игры: регуляторы и бизнес</h3><p>С января 2025 года в Евросоюзе действует Углеродный налог на цифровые продукты (Digital Carbon Border Tax). Теперь любое ПО, продающееся в ЕС, должно иметь сертификат углеродной эффективности.</p><p>Для крупных enterprise-решений максимально допустимый углеродный след составляет 500 г CO₂ на 1000 пользователей в месяц. Нарушители платят 7% от оборота продукта в регионе.</p><p>Венчурные фонды радикально изменили подход к инвестициям. <a href="https://www.pwc.com/gx/en/services/sustainability/publications.html">Согласно отчету PwC</a>, 43% фондов требуют ESG-отчетность перед заключением сделки, а 28% вообще не рассматривают стартапы без «зеленой» стратегии. В Кремниевой долине появился первый акселератор Carbon Neutral Startups, который дает бонусы в $50 000 проектам с нулевым углеродным следом.</p><p>Корпорации тоже не остались в стороне. <a href="https://www.microsoft.com/sustainability">Microsoft ввела внутренний углеродный налог</a> — теперь каждое подразделение платит $100 за каждую тонну CO₂, связанную с его продуктами. Эти деньги идут на развитие возобновляемой энергетики.</p><p>Но самое интересное происходит на рынке труда. Разработчики с навыками «зеленого» программирования получают на 15-20% больше предложений. Появилась появилась новая категория навыков — «Устойчивая разработка ПО», а спрос на таких специалистов вырос на 300% за последний год.</p><h2>Как писать «зеленый» код</h2><p>Каждая лишняя операция в коде — это не только миллисекунды процессорного времени, но и реальные граммы CO₂. В 2025 году энергоэффективность кода перестала быть теоретической концепцией и превратилась в конкретный навык, который влияет на карьеру разработчика. Рассмотрим три ключевых направления оптимизации.</p><h3>Оптимизация запросов к базе данных</h3><p>Типичный пример — использование SELECT * вместо явного перечисления полей. Когда приложение запрашивает все поля таблицы users (включая редко используемые avatar_blob или metadata_json), сервер БД тратит дополнительные ресурсы на чтение и передачу этих данных. В крупных системах с миллионами запросов в день это приводит к значительному перерасходу вычислительных ресурсов.</p><p>Современные ORM типа Prisma и Drizzle добавили автоматическую оптимизацию запросов. Теперь при использовании select() они анализируют, какие поля действительно нужны на клиенте, и генерируют оптимальный SQL. В тестах это снижает нагрузку на БД на 12-18%.</p><h3>Работа с циклами и алгоритмами</h3><p>Классическая ошибка — продолжать перебор массива после нахождения нужного элемента. В 2025 году статический анализатор кода в WebStorm и VS Code автоматически предупреждает о таких ситуациях. Особенно критично это для мобильных приложений: лишние итерации цикла на слабых устройствах увеличивают энергопотребление на 5-7%.</p><p>Новые версии JavaScript и TypeScript ввели оптимизированные методы для массивов. Например, array.findLast() работает в 1,5 раза эффективнее ручной реализации с циклом. Для сложных алгоритмов появились «зеленые» библиотеки вроде EcoCollections для Java, которые минимизируют энергопотребление при работе с структурами данных.</p><h3>Сжатие и передача данных</h3><p>Формат Brotli стал новым стандартом для API: он обеспечивает лучшее сжатие, чем gzip, особенно для JSON-ответов. Компания Cloudflare провела эксперимент: после перехода на новую версию Brotli нагрузка на их серверы снизилась на 18%, что эквивалентно годовому потреблению энергии 2000 домохозяйств.</p><p>Но сжатие — не панацея. Грамотное проектирование API может дать больший эффект. GraphQL-подход, где клиент запрашивает только нужные данные, в среднем почти вдвое уменьшает объем передаваемой информации по сравнению с REST. А технология Server-Sent Events (SSE) для реального времени потребляет в 3 раза меньше ресурсов, чем WebSockets, когда не нужна двусторонняя связь.</p><p>Современные фреймворки начали учитывать энергоэффективность. Next.js 15 <a href="https://nextjs.org/blog">представил «зеленый» режим компиляции</a>, который оптимизирует сборку под минимальное энергопотребление. В тестах это дало 8% экономии на процессоре при работе приложения. А Deno 2.0 автоматически кэширует зависимости на уровне ОС, сокращая число повторных загрузок.</p><p>Эти изменения кажутся мелкими, но в масштабах индустрии они имеют огромное значение. Если бы все репозитории на платформе применили базовые оптимизации, глобальное энергопотребление дата-центров сократилось бы на несколько процентов. Для отрасли, которая потребляет 700 ТВт⋅ч в год, это десятки миллионов долларов и тысячи тонн CO₂.</p><h2>Выбор технологий</h2><p>В 2025 году выбор стека технологий влияет не только на производительность, но и на экологичность проекта. Разберем ключевые аспекты, которые помогут снизить углеродный след вашего приложения.</p><h3>Языки программирования: баланс между скоростью и эффективностью</h3><p>Rust и Go продолжают доминировать в высоконагруженных системах. Тесты показывают, что веб-сервер на Rust потребляет на 35-40% меньше энергии при одинаковой нагрузке по сравнению с Node.js. Особенно заметна разница в облачных средах, где каждый ватт на счету.</p><p>C++ остается выбором для задач, где важна предсказуемая производительность. Новый стандарт C++26 добавил энергоэффективные режимы работы алгоритмов STL, что особенно важно для встраиваемых систем.</p><p>Python по-прежнему хорош для прототипирования, но в продакшене его лучше заменять на компилируемые языки. PyPy 8.0 сократил энергопотребление интерпретатора на 25%, но даже с этими улучшениями Python проигрывает Rust в 3-4 раза по эффективности.</p><h3>Базы данных: от малого к большему</h3><p>SQLite — идеальный выбор для небольших проектов и edge-устройств. Его новая версия 3.45 добавила режим «энергосбережения», который снижает потребление на 15% при фоновых операциях.</p><p><a href="https://www.postgresql.org/docs/17/release-17.html">PostgreSQL 17</a> сделал большой шаг в энергоэффективности. Функция автоматического партиционирования теперь учитывает не только производительность, но и энергопотребление. В тестах это дало 20% экономии на крупных аналитических запросах.</p><p>Для высоконагруженных систем появилась альтернатива — ScyllaDB 5.0. Эта Cassandra-совместимая СУБД потребляет втрое раза меньше энергии при аналогичной нагрузке, благодаря полному переписыванию на Rust.</p><h2>Кейсы: что работает, а что нет</h2><p>Российские компании тоже внедряют экологичные IT-решения. МТС разработала мобильное приложение, где пользователи получают бонусы за раздельный сбор мусора — их можно обменять на подписки или скидки. За первый год проект привлек 500 тысяч участников и сократил количество непереработанных отходов в регионах присутствия.</p><p>НИУ ВШЭ, совместно с Росприроднадзором, автоматизировал сбор экологической отчетности с помощью ИИ. Нейросеть анализирует данные с датчиков и заполняет формы вместо специалистов. Это сократило время обработки с 100 до 10 часов в месяц и уменьшило количество ошибок.</p><p>Некоторые архитектурные решения приносят больше вреда, чем пользы. Один московский стартап без необходимости разбил монолитную систему на 50 микросервисов — в результате затраты на инфраструктуру выросли в 3 раза, а углеродный след увеличился на 180%.</p><p>Проблемы возникают и на уровне зависимостей. История с left-pad повторилась в 2024 году, когда один npm-пакет потянул за собой 80 МБ ненужных библиотек. Теперь крупные компании проверяют каждую зависимость через Bundlephobia и устанавливают лимит на размер node_modules.</p><h2>Что нас ждет</h2><p>В 2025 году отрасль стоит на пороге радикальных изменений, которые перевернут наши представления о «зеленом» программировании.</p><p>Супероблака — следующий этап эволюции распределенных вычислений. В отличие от традиционных облачных провайдеров, эти системы автоматически переносят нагрузку между дата-центрами в зависимости от доступности возобновляемой энергии.</p><p><a href="https://cloud.google.com/sustainability">Google уже тестирует эту технологию</a> в Северной Европе: когда в Норвегии дует сильный ветер и ветряные электростанции работают на пике, система переносит вычисления именно туда. По предварительным оценкам, это снижает углеродный след на 18-22% по сравнению со статичным распределением.</p><p>Но настоящий прорыв ожидается в сегменте квантовых вычислений. Хотя современные квантовые компьютеры потребляют колоссальное количество энергии (система IBM Quantum System One требует около 25 кВт⋅ч для работы одного кубита), их потенциал для оптимизации классических алгоритмов огромен.</p><p>В 2024 году исследователи из ЦЕРНа <a href="https://www.nature.com/articles/s41534-024-00859-0">предложили квантовый алгоритм</a>, который сокращает время сложных расчетов в 1000 раз при той же точности. Когда такие решения станут массовыми (прогноз — 2028-2030 годы), энергопотребление дата-центров может сократиться на 30-40%.</p><p>Государственное регулирование становится строже. В 2025 году в силу вступает EU Digital Product Passport — требование указывать углеродный след для всего ПО, продающегося в Европе.</p><p>Компании, которые не смогут предоставить эти данные, столкнутся с дополнительными налогами до 7% от оборота. В ответ на это крупнейшие IT-корпорации создали Carbon Neutral Software Alliance — консорциум по разработке единых стандартов измерения.</p><p>Не отстает и аппаратная часть. Производители чипов переходят на новые техпроцессы: TSMC анонсировала 2-нм процесс, который на 30% энергоэффективнее предыдущего поколения. А стартапы вроде британской ZeroPoint Technologies разрабатывают память с нулевым энергопотреблением в режиме ожидания — технология может сократить энергопотребление серверов на 15%.</p><p><b>Но главный тренд </b>— децентрализация вычислений. Edge-устройства (от смартфонов до промышленных датчиков) становятся мощнее и берут на себя часть нагрузки. Например, новый алгоритм Apple для обработки фото на iPhone 16 выполняет 90% операций локально, а не в облаке. По оценкам компании, это экономит сотни тысяч тонн CO₂ в год только для пользователей в США.</p><p>Однако остаются и <b>проблемы</b>. Бум генеративного ИИ привел к взрывному росту энергопотребления: одна тренировка модели Gemini Ultra потребляет столько же энергии, сколько небольшой город за месяц. OpenAI и Anthropic уже работают над более эффективными архитектурами, но прорыва пока не случилось.</p><p>В ближайшие 3-5 лет нас ждет:</p><ul><li>массовый переход на углеродно-нейтральные дата-центры — к 2027 году их доля превысит 60%;</li><li>внедрение AI-оптимизаторов кода, которые автоматически сокращают энергопотребление;</li><li>появление «зеленых» рейтингов для приложений — аналог энергоэффективности для бытовой техники.</li></ul><p>Компании, внедрившие принципы устойчивого развития в IT, уже в 2025 году получают на больше инвестиций и быстрее проходят аудит регуляторов. Экологичность перестала быть затратой — теперь это конкурентное преимущество.</p><p>Технологии будущего уже здесь. Вопрос в том, насколько быстро мы сможем их адаптировать. Как сказал Дженсен Хуанг из NVIDIA на последней конференции GTC:</p><blockquote>«Следующее десятилетие определит, станет ли IT частью климатического решения или останется проблемой. Выбор за нами».</blockquote><h2>Итоги</h2><p>Экологичность в IT — не благотворительность и не актуальная повестка, а реальная экономия. Плюс работа на перспективу. Оптимизация кода снижает счета за облака и повышает производительность.</p><p>С чего начать? Начните с малого:</p><ol><li>Запустите аудит через Cloud Carbon Footprint.</li><li>Уберите «мусор» из зависимостей.</li><li>Выберите хостинг с ВИЭ.</li></ol><p>Как говорил Дональд Кнут, автор книги «Искусство программирования»:</p><blockquote>«Преждевременная оптимизация — корень всех зол. Но и запоздалая — тоже».</blockquote><p>В 2025 году это актуально как никогда.</p>]]></content:encoded>
    </item>
    <item>
      <title>Bright Data запустила платформу для массового сбора данных с любых сайтов: теперь можно строить пайплайны для ИИ и BI без лишней рутины</title>
      <link>https://tproger.ru/news/bright-data-zapustila-platformu-dlya-massovogo-sbora-dannyh-s-lyubyh-sajtov--teper-mozhno-stroit-pajplajny-dlya-ii-i-bi-bez-liwnej-rutiny</link>
      <comments>https://tproger.ru/news/bright-data-zapustila-platformu-dlya-massovogo-sbora-dannyh-s-lyubyh-sajtov--teper-mozhno-stroit-pajplajny-dlya-ii-i-bi-bez-liwnej-rutiny?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/bright-data-zapustila-platformu-dlya-massovogo-sbora-dannyh-s-lyubyh-sajtov--teper-mozhno-stroit-pajplajny-dlya-ii-i-bi-bez-liwnej-rutiny</guid>
      <description><![CDATA[<p>Bright Data запустила API и платформу для сбора данных с любых сайтов: Unlocker, Browser, SERP и Crawl API, готовые для ИИ и BI пайплайнов, с 150+ млн прокси по всему миру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/bright-data-zapustila-platformu-dlya-massovogo-sbora-dannyh-s-lyubyh-sajtov--teper-mozhno-stroit-pajplajny-dlya-ii-i-bi-bez-liwnej-rutiny">Bright Data запустила платформу для массового сбора данных с любых сайтов: теперь можно строить пайплайны для ИИ и BI без лишней рутины</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Jul 2025 06:58:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>Bright Data представила масштабируемую платформу для сбора публичных веб-данных с любых сайтов в реальном времени и в историческом разрезе, готовую к использованию в пайплайнах ИИ и BI. Платформа позволяет мгновенно развернуть инфраструктуру для сбора данных в любых масштабах — от точечных скриптов до доставки готовых датасетов без кода.</p><p>Больше новостей — в нашем тг-канале Представляешь</p><h2>Как это работает</h2><p>Внутри платформы есть готовые API: Unlocker API помогает обходить CAPTCHA и блокировки, Browser API собирает динамический контент, SERP API получает структурированные данные из поисковиков, а Crawl API позволяет выгружать данные с целых доменов по одной команде. Для ИИ-команд это значит, что можно не тратить время на настройку обхода защит, а сразу получать нужные данные в чистом виде.</p><p>Разработчики могут строить пайплайны для ML/AI, аналитики, мониторинга рынка и конкурентов, обновления поисковых индексов или исследования трендов. Данные предоставляются как в режиме hands-off (Bright Data отдаёт их в готовом виде), так и через API и пайплайны, если команда хочет полный контроль.</p><h3>Что есть для разработчиков</h3><p>Платформа совместима с любыми пайплайнами ML и BI, работает с Python, Node.js и другими стеком, поддерживает интеграцию в существующую инфраструктуру через API. Поддержка масштабируемости позволяет выгружать данные в реальном времени или подгружать исторические архивы для обучения LLM.</p><p>Разработчикам доступны гибкие инструменты под разные задачи: от разовой выгрузки данных для тестирования модели до непрерывного мониторинга и сбора данных с тысяч сайтов одновременно.</p><h2>Для чего это использовать</h2><p>Эта платформа полезна для создания собственных дата-сетов для обучения моделей, мониторинга цен и наличия товаров у конкурентов, отслеживания утечек данных, построения поисковых индексов или мониторинга медиа и соцсетей. По сути, Bright Data превращает задачу массового сбора данных в инструмент, доступный без сложной настройки.</p><p>Bright Data предлагает бонус новым пользователям: первый депозит удваивается до $500, чтобы можно было протестировать платформу без риска. Платформа доступна по подписке и в виде оплаты по использованию, позволяя адаптировать расходы под объём задач.</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[CSR]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Spotify]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[NFT]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></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>n8n: установка, настройка и интеграция с Python, Node.JS и PHP</title>
      <link>https://tproger.ru/articles/n8n--ustanovka--nastrojka-i-integraciya-s-python--node-js-i-php</link>
      <comments>https://tproger.ru/articles/n8n--ustanovka--nastrojka-i-integraciya-s-python--node-js-i-php?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Кирилл Косолапов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/n8n--ustanovka--nastrojka-i-integraciya-s-python--node-js-i-php</guid>
      <description><![CDATA[<p>Подробный туториал по установке и настройки n8n. Примеры интеграции с Python, Node.JS и PHP и взаимодействия с LLM Mistral AI.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/n8n--ustanovka--nastrojka-i-integraciya-s-python--node-js-i-php">n8n: установка, настройка и интеграция с Python, Node.JS и PHP</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Opera]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 29 Jun 2025 09:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>n8n — open-source платформа для автоматизации рабочих процессов (workflow), позволяющая создавать сложные цепочки задач без глубоких знаний программирования.</p><p><b>В статье рассмотрим:</b></p><p>- Установку локально и в облаке;</p><p>- Интеграцию с Python, Node.js и PHP;</p><p>- Примеры автоматизаций;</p><p>- Интеграцию с AI Mistral.</p><h2>Установка n8n</h2><h3>Локальная установка</h3><p>Нам потребуется Docker, проверьте установку:</p><p><b>Шаги установки:</b></p><p>1. Создайте том данных:</p><p>2. Запустите контейнер:</p><p>После запуска откройте: `http://localhost:5678`</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/32713acd-811d-40dc-8141-4fb625cd4216.png" alt="" /></figure><h3>Установка на удаленном сервере</h3><p>Развертывание мы произведем в облаке <a href="https://amvera.ru/n8n">Amvera</a>, так как в нем n8n предоставляется как преднастроенный сервис с бесплатным доменом (он нам нужен), настроенными переменными и проксированием до заблокированных в РФ LLM (OpenAI, Gemini, Claude и др.).</p><p>1. Регистрируемся на <a href="https://amvera.ru/n8n">Amvera</a>;</p><p>2. Выбираем n8n в плитке на главной странице;</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/e74d96ee-5f96-4c61-bf7a-562a38edc703.png" alt="" /></figure><p>3. Вводим название для проекта и выбираем тариф.</p><p><b>Готово, через 30 секунд запустится n8n с выделенным доменом и настроенными основными переменными.</b></p><h2>Настройка n8n</h2><h3>Первоначальная настройка</h3><p>1. Откройте n8n (локально: `localhost:5678`, в облаке: ваш домен)</p><p>2. Заполните данные администратора:</p><ul><li>Email</li></ul><ul><li>Имя/Фамилия</li></ul><ul><li>Пароль</li></ul><p>3. По желанию вы можете получить бесплатный лицензионный ключ:</p><ul><li>Введите email → "Send me a free license key"</li></ul><ul><li>Активируйте в разделе Settings → Usage</li></ul><h3>Настройка для HTTP</h3><p>1. Создайте новый <b>workflow</b> → Start from scratc</p><p>2. Добавьте триггер: <b>Webhook</b> - <b>On webhook call</b></p><p>3. Настройте:</p><ul><li>HTTP Method: POST</li></ul><ul><li>Path: `/n8n` (пример)</li></ul><ul><li>Respond Mode: Using 'Respond to Webhook' node</li></ul><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/6e51fb08-a901-408c-833e-eb27c3ab1f17.png" alt="" /></figure><p>4. Добавьте обработчик: <b>Core</b> → <b>Respond to Webhook</b></p><p>5. Настройте ответ:</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/37a5add7-0873-42e1-9004-d33a228d828b.png" alt="" /></figure><h2>Примеры использования</h2><h3>Пример на Python</h3><p>В примере на Python мы сделаем калькулятор. Суть: отправляем выражение через POST,  n8n делает вычисление, возвращаем результат.</p><p><b>Workflow</b>:</p><p>1. Добавьте <b>Core</b> → <b>Code node</b> между Webhook и Respons:</p><p><b>Клиент (Python):</b></p><p>Запустим код и посмотрим результат:</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/c9a2bd14-0a7e-4c6f-8544-e4a098a5cd5e.png" alt="" /></figure><h3>Пример на PHP</h3><p>В примере на PHP мы сделаем валидацию данных. Суть: отправляем данные через POST, n8n проверяет данные, возвращает результат.</p><p><b>Workflow (Code node):</b></p><p><b>Клиент (PHP):</b></p><p>Можем зайти на нашу страницу, все работает нормально:</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/722241bc-9794-41eb-9d32-8d73d7147800.png" alt="" /></figure><h3>Пример на Node.js</h3><p>Примером на node.js будет фильтр запрещенных слов. Суть: отправляем текст, n8n проверяет на наличие плохих слов, возвращает результат.</p><p><b>Workflow (Code node):</b></p><p><b>Клиент (Node.js):</b></p><p>Перед запуском установим библиотеку командой `npm install axios`</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/c56f275a-8c74-49bf-80e5-22d5becd222a.png" alt="" /></figure><h3>Интеграция n8n с Mistral AI</h3><p>Мы интегрируем нейросеть Mistral в телеграмм-бота на C# с помощью n8n. Перед тем как начать, нам нужно получить токен.</p><p>1. Зарегистрируйтесь на <a href="https://mistral.ai/">Mistral</a></p><p>2. Создайте агента <b>Сreate an agent</b></p><p>3. Перейдите в раздел <b>API Keys</b></p><p>4. Создайте и скопируйте API-ключ (звездочки наложены):</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/7bb95f2e-0ebe-47af-9089-5e10ee2822cf.png" alt="" /></figure><p>Теперь нужно создать credentials для работы с созданной моделью. Для этого в правом верхнем углу нажмите <b>Create credentials</b>. В списке найдите <b>Mistral Cloud API</b>. В открывшемся окне вставьте скопированный ключ и сохраните.</p><p>Осталось настроить workflow.</p><p>1. Добавляем <b>Webhook</b>:</p><ul><li>Method: POST</li></ul><ul><li>PATH: n8n</li></ul><ul><li>Respond: Using 'Respond to Webhook' Node</li></ul><p>2. Добавляем <b>AI Agent</b>:</p><ul><li>Source for Prompt: Define below</li></ul><ul><li>Prompt: `{{ $json.body.text }}`</li></ul><p>3. Подключаем <b>Chat Model </b>к созданному агенту:</p><ul><li>Credential to connect with: Mistral Cloud API</li></ul><ul><li>Model: mistral-large-2411</li></ul><p>4. Добавляем <b>Respond to Webhook</b></p><p>Вот так выглядит готовый workflow:</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/b2618a94-f3eb-4055-9061-ab185aca9d9d.png" alt="" /></figure><p>Можем приступить к созданию бота. Для начала введите эти команды по очередности:</p><p>Переходим в папку с кодом и редактируем файл `Program.cs`:</p><p>Запустите бота с помощью команды `dotnet run`.</p><h3>Автоматизируем с помощью n8n</h3><p>В примере автоматизации мы сделаем бота, который будет отправлять уведомления при заполнении формы, полностью без кода.</p><p>Для работы с <b>Telegram Node</b> понадобиться создать credentials <b>Telegram API</b>. Туда вставляем токен бота, полученный в @BotFater. Сохраняем и переходим к настройке workflow.</p><p><b>Создаем новый workflow. </b></p><p>1. Добавляем <b>On form submission</b>. В качестве примера я создам самую простую форму:</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/3bd6f188-16bd-4fa4-bde2-f7a88855bdad.png" alt="" /></figure><p>Перейдите по ссылке в <b>Producrion URL</b> чтобы заполнить форму.</p><p>2. Добавляем <b>Telegram Node</b>:</p><ul><li>Credential to connect with: Telegram account</li></ul><ul><li>Resource: Message</li></ul><ul><li>Operation: Send message</li></ul><ul><li>Chat ID: вставьте свой telegram id</li></ul><p>Text:</p><p>Готово! При новых заявках бот будет присылать уведомления.</p><h3>Деплой бота в Amvera Cloud</h3><p>Перед тем как начать деплой, мы должны создать конфигуационнный файл `amvera.yml`. Для этого создаем его в рабочем каталоге с ботом и вводим следующее:</p><p>Строго говоря, этот файл проще создать в конфигураторе в интерфейсе.</p><p>2. Структура проекта будет такой:</p><p>tg-bot/</p><p>├── Program.cs</p><p>├── tg-bot.csproj</p><p>├── amvera.yml</p><p>├── bin/</p><p>└── obj/</p><p>Идем В Amvera Cloud и создаем приложение <b>Приложения</b> — <b>Создать приложение</b>. Вводим название и выбираем тариф.</p><p>Далее загружаем все файлы, что есть у нас в каталоге, с ботом. В конце будет окно с настройкой конфигуцрации, выглядит оно так:</p><figure><img src="https://media.tproger.ru/user-uploads/115814/2025-06-16/7806bf2f-38e5-4aa4-ade2-6c12d3f6c214.png" alt="" /></figure><p>Нажимаем <b>Завершить</b> и ждем когда приложение будет запущено.</p><h2>Заключение</h2><p>n8n — мощный инструмент для создания интеграций и автоматизаций. Надеюсь, статья была вам полезна и буду рад обсудить в комментариях любые вопросы!</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[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></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[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></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>Playwright + VS Code: Установка и первый автотест за 15 минут</title>
      <link>https://tproger.ru/articles/playwright---vs-code--ustanovka-i-pervyj-test-za-15-minut</link>
      <comments>https://tproger.ru/articles/playwright---vs-code--ustanovka-i-pervyj-test-za-15-minut?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Pavel Nik]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/playwright---vs-code--ustanovka-i-pervyj-test-za-15-minut</guid>
      <description><![CDATA[<p>Гайд для начинающих: как настроить среду, установить Playwright и написать первый тест. Пошаговая инструкция с примерами кода и пояснениями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/playwright---vs-code--ustanovka-i-pervyj-test-za-15-minut">Playwright + VS Code: Установка и первый автотест за 15 минут</a>»</p>]]></description>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Playwright — мощный инструмент автоматизации web-приложений. Фреймворк уже достаточно известный и популярный. И если вы хотите его попробовать, то вот инструкция по установке с помощью Visual Studio Code (VS code).</p><p>Гайд для тех, кто только входит в автоматизацию. После можно получить первые результаты, попробовать сам фреймворк и дальше экспериментировать: делать свои тесты.</p><p><b>*Инструкция для Windows. Надеюсь, проблем при установке ни у кого не возникнет.</b></p><h2>Основные шаги по установке</h2><h3>Установка VS Code</h3><ol><li>Перейдите на оф. сайт <a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> и скачайте последнюю версию. На главной странице должна отображаться кнопка <i>Download for Windows.</i></li><li>Дальше стандартная установка по инструкции: <i>Next &gt; Next &gt; Install</i>.</li></ol><h3>Установка Node.js. Шаги аналогичные</h3><ol><li>Также перейдите на оф. сайт <a href="https://nodejs.org/en/download">https://nodejs.org/en/download</a> и скачайте последнюю версию Node.js. Я использовал <i>Windows Installer (.msi).</i></li><li>Такая же стандартная установка: <i>Next &gt; Next &gt; Install</i>.</li></ol><h3>Создание проекта</h3><ol><li>Создайте пустую папку на ПК, где будет храниться проект для автоматизации. <br />У меня для этого есть отдельная директория, так удобнее хранить все проекты в одном месте. Но её можно создать даже на рабочем столе, разницы никакой. Мой путь к папке —  <i>C:\Users\Pavel\Projects\TestProject.</i></li><li>Запустите VS Code и там выберите созданную папку.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/113257/2025-03-04/d46a761e-dbab-4bde-9ac8-f1bb936117d0.png" alt="" /></figure><h3>Установка Playwright</h3><ol><li>Перейдите в раздел управления расширениями <i>Extensions.</i></li><li>Введите <i>Playwright</i> в поисковой строке.</li><li>Нужно скачать тот, что верифицирован Microsoft (у него больше всего установок).</li></ol><figure><img src="https://media.tproger.ru/user-uploads/113257/2025-03-04/b5ea7aec-53b2-480b-af3c-4934b427a86c.png" alt="" /></figure><p>Но установка еще не закончена, дальше:</p><ul><li>Вызовите<i> Command Palette</i>. Можно через основное меню: <i>View &gt; Command Palette </i>или комбинацией клавиш <i>Ctrl+Shift+P</i>.</li><li>Введите <i>Test: Install Playwright</i> в появившейся строке.</li><li>Выберите необходимые браузеры для установки.</li><li>Я оставляю только Chromium, его вполне достаточно. Кликаем Ok и ждем окончательной установки Playwright (должен появиться терминал и начаться установка пакетов).</li></ul><figure><img src="https://media.tproger.ru/user-uploads/113257/2025-03-04/9d8a4d16-7fbc-43ba-a316-a28d7b729a95.png" alt="" /></figure><h3>Создание тестов</h3><ol><li>В основном окне <i>Explorer </i>добавьте новый файл в модуле <i>tests </i>(правая кнопка мыши, новый файл).<br />*Важно, чтобы название файла оканчивалось на <i>spec.ts</i> или <i>.test.ts</i> (расширение может быть и <i>.js</i>): так Playwright определяет тесты по дефолту. В примере добавил файл <i>login.spec.ts.</i></li></ol><figure><img src="https://media.tproger.ru/user-uploads/113257/2025-03-04/731e6efb-a3e6-4385-93c7-2fa89e8fa0f3.png" alt="" /></figure><ol><li>Вставьте следующий код в созданный файл <i>login.spec.ts. </i><br />Это пример логина на платформе, который ± подходит под любой сайт: нужно только изменить URL, locators и данные для входа. Использую тестовую платформу <a href="https://demowebshop.tricentis.com/">https://demowebshop.tricentis.com/</a>.</li></ol><p>Осталось совсем немного. Только запустить созданный тест:</p><ol><li>Перейдите в раздел <i>Testing</i>.</li><li>Выберите созданный файл и запустите тесты кликом <i>Run test</i>.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/113257/2025-03-04/64456ff7-2a83-416f-8a60-57ae2567eb51.png" alt="" /></figure><p>Можете добавить еще один тест в тот же файл и посмотреть его выполнение:</p><p>Вот и всё! Теперь у вас есть базовая автоматизация с Playwright! Дальше можно дописывать другие тесты. Например, посмотреть работу системы с незарегистрированным email, вынести credentials в конфигурационный файл и т.д. И, конечно, углубляться, разбираться во всем, чтобы стать уверенным автоматизатором. Можно продолжить изучение статей на оф.сайте <a href="https://playwright.dev/docs/writing-tests">Playwright</a>. Главное, соблюдайте <a href="https://playwright.dev/docs/best-practices">best-practices</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>Почему ваше приложение тормозит: архитектурные 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[JSON]]></category>
      <category><![CDATA[Микросервисы]]></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>CORS от А до Я: история, ошибки и грамотная настройка</title>
      <link>https://tproger.ru/articles/cors-ot-a-do-ya--istoriya--owibki-i-gramotnaya-nastrojka</link>
      <comments>https://tproger.ru/articles/cors-ot-a-do-ya--istoriya--owibki-i-gramotnaya-nastrojka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/cors-ot-a-do-ya--istoriya--owibki-i-gramotnaya-nastrojka</guid>
      <description><![CDATA[<p>Что такое CORS, почему браузер блокирует запросы и как избежать типичных ошибок. Простое объяснение для разработчиков + рабочие решения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/cors-ot-a-do-ya--istoriya--owibki-i-gramotnaya-nastrojka">CORS от А до Я: история, ошибки и грамотная настройка</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Jun 2025 11:19:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>CORS (Cross-Origin Resource Sharing) — это механизм, который позволяет веб-приложениям безопасно запрашивать ресурсы с других доменов. Если вы когда-либо видели в консоли браузера ошибку вроде «No ‘Access-Control-Allow-Origin’ header», значит, вы уже столкнулись с его работой. Сегодня разберёмся, как появился CORS, зачем он нужен и как с ним работать.</p><h2>Откуда возник CORS</h2><p>Всё <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy">началось</a> в начале 2000-х, когда веб-приложения становились всё сложнее, а разработчики чаще нуждались в данных с других доменов. Однако браузеры строго придерживались политики одного источника (Same-Origin Policy, SOP), запрещавшей доступ к сторонним ресурсам. Эта политика появилась ещё в 1995 году в Netscape Navigator 2.0 и была призвана защитить пользователей от атак вроде XSS. Проблема в том, что SOP блокировала не только вредоносные, но и вполне легитимные запросы, например, к внешним API. Разработчики пытались обойти ограничения с помощью JSONP или iframe, но такие решения были небезопасными и нестабильными.</p><p>В 2005 году инженер Мэтт Ошри предложил идею более надёжного и безопасного механизма, который в дальнейшем стал основой CORS. А в 2008-м Анн ван Кестерен <a href="https://fetch.spec.whatwg.org/">подготовила</a> черновик спецификации для W3C. В 2014 году CORS официально вошёл в стандарт Fetch API и с тех пор стал ключевым элементом работы с кросс-доменными запросами. Он помогает контролировать доступ к ресурсам, сохраняя баланс между открытостью веба и безопасностью пользователей.</p><h2>Как устроен CORS</h2><p>CORS работает как диалог между браузером и сервером, основанный на HTTP-заголовках. Когда фронтенд-приложение (например, на сайте frontend.com) запрашивает данные с другого домена (api.com), браузер автоматически добавляет к запросу заголовок Origin: https://frontend.com. Этот заголовок сообщает серверу, откуда пришёл запрос.</p><p>Сервер в ответ решает, разрешать ли доступ. Если он включает в ответ заголовок Access-Control-Allow-Origin и указывает там адрес запроса (например, https://frontend.com) или символ * (разрешение для всех доменов), то браузер пропускает ответ. Если такого заголовка нет или значение не совпадает, браузер блокирует ответ — даже если сервер технически его отправил.</p><p>Для так называемых «сложных» запросов, например, с методом POST или нестандартными заголовками, браузер сначала отправляет предварительный (OPTIONS) запрос, чтобы уточнить у сервера, допустим ли основной. В ответе сервер указывает, какие методы (Access-Control-Allow-Methods) и заголовки (Access-Control-Allow-Headers) разрешены.</p><p>Пример ответа сервера с разрешением:</p><h2>Топ-7 самых частых ошибок в CORS и как их исправить</h2><p>Для того чтобы определить оптимальные методы работы, лучше учиться на ошибках. Хорошая новость в том, что почти все CORS-ошибки легко понять и исправить — если знать, где искать. Ниже собрали 7 <a href="https://arunangshudas.com/blog/7-common-cors-errors-and-how-to-fix-them/">самых распространённых ошибок</a> CORS, с которыми сталкиваются разработчики, и рассказали, как можно с ними справиться без боли и паники.</p><h3>Нет заголовка Access-Control-Allow-Origin</h3><p>Сообщение об ошибке:</p><p>"No ‘Access-Control-Allow-Origin’ header is present on the requested resource"</p><p>Когда ваш JavaScript-код пытается получить данные с другого домена, браузер ожидает, что в ответе будет заголовок Access-Control-Allow-Origin. Если его нет — браузер блокирует ответ, считая его небезопасным.</p><h4>Решение 1: Настроить сервер на разрешение CORS</h4><p>Если вы контролируете сервер, добавьте в ответ заголовок:</p><p>Access-Control-Allow-Origin: *</p><p>* — разрешение запросов с любого домена</p><p>Но для безопасности лучше указать конкретный домен:</p><p>Access-Control-Allow-Origin: http://example.com</p><h4>Решение 2: middleware CORS в Express.js</h4><p>Если вы используете Node.js с Express, добавьте<b>:</b></p><h3>Браузер блокирует preflight-запросы (OPTIONS)</h3><p>Сообщение об ошибке:</p><p>"CORS policy preflight request did not succeed" или что-то похожее.</p><p>Иногда перед настоящим запросом браузер сначала отправляет preflight-запрос методом OPTIONS, чтобы проверить, разрешен ли основной запрос. Это происходит, если:</p><ul><li>Метод запроса не GET или POST (например, PUT, DELETE).</li></ul><ul><li>В заголовках есть что-то нестандартное (например, Authorization или Content-Type: application/json).</li></ul><p>Если сервер не умеет обрабатывать OPTIONS — все ломается.</p><h4>Решение: Обработать OPTIONS-запросы на сервере</h4><p>Пример для Express.js:</p><p>app.options('*', cors()); // Разрешаем preflight-запросы</p><p>Или настройка CORS с поддержкой OPTIONS:</p><h3>Запросы с учётом сессий (credentials) блокируются</h3><p>Сообщение об ошибке:</p><p>"The value of the ‘Access-Control-Allow-Origin’ header in the response must not be '*' when the request's credentials mode is 'include'"</p><p>Вы отправляете запрос с куками или авторизацией (credentials: 'include'), но сервер разрешает доступ всем (Access-Control-Allow-Origin: *). Это запрещено — нельзя слать credentials, если разрешено всем.</p><h4>Решение: Указать конкретный домен и разрешить credentials</h4><p>На сервере также добавьте:</p><p>Access-Control-Allow-Credentials: true</p><h3>Смешанные протоколы — HTTP и HTTPS</h3><p>Сообщение об ошибке:</p><p>"Mixed content: The page at 'https://...' was loaded over HTTPS, but requested an insecure resource 'http://...'."</p><p>Ваш сайт работает по HTTPS, а API — по HTTP. Браузеры считают, что это опасно, и банально блокируют запросы.</p><h4>Решение:</h4><ul><li>Переведите API на HTTPS.</li><li>Обновите все ссылки с http:// на https://.</li></ul><ul><li>Если работаете локально и сервер только HTTP, используйте ngrok, чтобы создать HTTPS-туннель.</li></ul><h3>CORS блокирует редиректы</h3><p>Сообщение об ошибке:</p><p>"Redirect from '...api' to '...login' has been blocked by CORS policy."</p><p>API делает редирект, но в ответе на редирект нет CORS-заголовков. Браузер не знает, можно ли доверять редиректу, и блокирует.</p><h4>Решение:</h4><p>Убедитесь, что редирект тоже возвращает правильные заголовки:</p><p>Access-Control-Allow-Origin: http://example.com</p><p>Если используете fetch, добавьте:</p><h3>Неверно настроен Access-Control-Allow-Headers</h3><p>Сообщение об ошибке:</p><p>"Request header field &lt;X&gt; is not allowed by Access-Control-Allow-Headers"</p><p>Ваш запрос содержит нестандартный заголовок (например, Authorization), а сервер не пропускает его.</p><h4>Решение:</h4><p>На сервере укажите, какие заголовки разрешены:</p><h3>Метод запроса запрещён сервером</h3><p>Сообщение об ошибке:</p><p>"Method PUT is not allowed by Access-Control-Allow-Methods"</p><p>Вы отправляете запрос методом PUT, PATCH, DELETE, а сервер разрешает только GET и POST.</p><h4>Решение:</h4><p>На сервере явно разрешите нужные методы:</p>]]></content:encoded>
    </item>
    <item>
      <title>Как отправлять email из кода: nodemailer, SMTP и HTML-письма</title>
      <link>https://tproger.ru/articles/kak-otpravlyat-email-iz-koda--nodemailer--smtp-i-html-pisma</link>
      <comments>https://tproger.ru/articles/kak-otpravlyat-email-iz-koda--nodemailer--smtp-i-html-pisma?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-otpravlyat-email-iz-koda--nodemailer--smtp-i-html-pisma</guid>
      <description><![CDATA[<p>Как отправлять email из кода. Показываем, как отправлять письма через Nodemailer, SMTP и HTML. Рассматриваем пошаговую инструкцию и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-otpravlyat-email-iz-koda--nodemailer--smtp-i-html-pisma">Как отправлять email из кода: nodemailer, SMTP и HTML-письма</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Google Analytics]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Задача кажется простой: взял библиотеку, добавил в приложение — и письма полетели. На практике возникают вопросы:</p><ul><li>Как настроить подключение к SMTP-серверу?</li><li>Что делать, если письма летят в спам?</li><li>Как отправить HTML-письмо, чтобы вёрстку не перекосило?</li></ul><p>После прочтения статьи вы научитесь создавать простые текстовые уведомления и HTML-письма с вложениями. Рассмотрим настройку SMTP-провайдера Яндекс, научимся слать письма с персональными вложениями.</p><p>Информация пригодится вам, если вы подключаете форму обратной связи или добавляете систему уведомлений. Прежде чем погружаться в практику, вспомним основы — как работает доставка электронной почты.</p><h2>SMTP — простой протокол передачи email</h2><p>По протоколу SMTP почтовые серверы «договариваются» о передаче писем от отправителя к получателю. Архитектура проверена десятилетиями: каждый почтовый сервер в мире понимает SMTP. Протокол справляется с миллиардами писем ежедневно, не принадлежит ни одной компании, а новые решения не ломают старые системы.</p><h3>Как работает SMTP</h3><p>Принцип работы электронной почты напоминает обычную почтовую службу. Бумажное письмо кладут в конверт, подписывают адрес получателя и опускают в ящик. Дальше почтовая служба разбирается, как доставить письмо до адресата.</p><p>В электронной почте происходит нечто похожее:</p><ol><li>Когда написали письмо и нажимаете «Отправить», ваша программа соединяется с SMTP-сервером.</li><li>Сервер проверяет адрес получателя и определяет, куда дальше передавать письмо.</li><li>Письмо путешествует между SMTP-серверами, пока не достигнет сервера получателя.</li><li>Сервер получателя сохраняет письмо в почтовый ящик, откуда адресат может его прочитать.</li></ol><p>Начинающие разработчики путают SMTP с другими почтовыми протоколами, хотя они выполняют принципиально разные функции.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-05-28/40a2c5f6-f20e-455f-a717-a20af573efe1.jpg" alt="" /><figcaption>Электронные письма пересылаются между серверами по SMTP. Чтобы адресат получил сообщение от почтовой службы, используется протокол POP3 или IMAP</figcaption></figure><p><b>SMTP </b>отвечает только за отправку писем. Он работает как «исходящая почта», передавая письма от отправителя к серверу получателя. SMTP используют, когда отправляют письма из приложений.</p><p><b>POP3 </b>и <b>IMAP </b>предназначены только для получения писем. Они работают как «входящая почта» и позволяют клиентам загружать письма с сервера. Разница между ними в том, что POP3 скачивает и удаляет письма с сервера, а IMAP синхронизирует состояние писем между всеми устройствами пользователя.</p><h3>Основные типы SMTP-серверов</h3><p>По назначению SMTP-серверы можно разделить на две большие группы:</p><ul><li><b>Обычные серверы</b> для переписки. Их предоставляют интернет-провайдеры, хостинг-компании и почтовые сервисы. Единственная проблема — лимиты. Можно отправлять не более 100-500 писем в день.</li><li><b>Специальные серверы</b> для массовых рассылок и автоматических уведомлений от сайтов (например, подтверждение регистрации или чек покупки). Через такие серверы можно отправлять тысячи и даже миллионы писем без риска блокировки.</li></ul><p>Выбор зависит от ваших потребностей. <b>Отправлять десятки писем в день</b> можно через  бесплатные сервисы: Gmail или Яндекс. Если планируете <b>рассылки из сотен или тысяч писем</b>, обратите внимание на SendGrid, Mailgun, Amazon SES. Они гарантируют защиту от блокировок, но работают по платной подписке.</p><p>Можно развернуть <b>почтовый сервер на собственном железе</b>. Этот подход выбирают, когда нельзя доверять переписку даже Яндексу. Назир Наурзоков — инженер по проектным решениям Acer в России — рассказал об особенностях этого решения в статье «<a href="https://tproger.ru/articles/nuzhen-li-vashej-kompanii-sobstvennyj-pochtovyj-server">Нужен ли вашей компании собственный почтовый сервер</a>».</p><h2>Установка и настройка nodemailer</h2><p>Практиковаться будем на бесплатной библиотеке <a href="https://nodemailer.com/">Nodemailer</a>. Через неё можно слать обычный текст и HTML-письма со сложным дизайном, вложенными файлами.</p><p>Перед установкой потребуется Node.js версии 8.0.0 или выше:</p><p>Если среда Node.js не установлена или устарела, <a href="https://nodejs.org/en/download">скачайте актуальную версию</a>.</p><p>Чтобы загрузить Nodemailer, откройте терминал, перейдите в директорию проекта и выполните команду:</p><h3>Тестовый скрипт для отправки письма</h3><p>Не беспокойтесь, если не определились с почтовым сервером. Отправим первое письмо в тестовом режиме — результат видно без реальной отправки.</p><p>Создайте новый файл, например <i>send-email.js</i>, и вставьте следующий код:</p><p>Запустите скрипт:</p><p>В консоли будет сообщение об успешной отправке и ссылка, по которой можно посмотреть, как выглядит ваше письмо. После подключения к реальному SMTP-серверу тестовые сообщения можно слать на личную или временную почту (<a href="https://temp-mail.org/ru/">Temp Mail</a>, <a href="https://internxt.com/ru/temporary-email">Internxt</a>).</p><p>Подробнее по теме: <a href="https://tproger.ru/articles/chto-takoe-vremennaya-pochta-i-kak-ee-ispolzovat">Что такое временная почта и как ее использовать</a>.</p><h2>Отправка простого текстового письма</h2><p>Код для отправки через SMTP-сервер Яндекса:</p><p>В user указываем логин от почты без @yandex.ru, а пароль нужно <a href="https://id.yandex.ru/security/app-passwords">сгенерировать</a> в Яндекс ID.</p><p>Поле from можно указывать в нескольких форматах:</p><p>Имя отправителя нужно заключать в кавычки, если оно содержит пробелы или спецсимволы.</p><h3>Различие между cc и bcc</h3><p><b>CC (Carbon Copy) </b>— открытая копия письма. Все получатели видят адреса в поле cc:</p><p><b>BCC (Blind Carbon Copy)</b> — скрытая копия. Получатели в bcc не видны другим адресатам:</p><h3>Настройка reply-to</h3><p>Если хотите получать ответы на другой адрес, используйте replyTo:</p><h2>Создание и отправка HTML-писем</h2><p>Самый простой способ отправить текст с применением стилей — передать HTML-код в виде строки:</p><p>HTML-код реальных писем сложнее, занимает сотни строчек. Поэтому рекомендуется использовать встроенный модуль <i>fs </i>для чтения из файла:</p><h3>Встраивание изображений</h3><p>Nodemailer поддерживает 2 способа работы с картинками:</p><ul><li>Ссылки на внешние ресурсы, которые загружаются при открытии письма.</li><li>Встраивание картинки прямо в письмо через параметр <i>attachments </i>с флагом <i>cid</i>.</li></ul><p>Встроенные изображения увеличивают размер письма, но спасают от ситуаций, когда источник картинки может быть заблокирован в стране получателя.</p><h3>Адаптив и совместимость</h3><p>Вёрстка в почтовых клиентах не работает как в браузерах. <b>Многие CSS-свойства не поддерживаются, JavaScript полностью заблокирован.</b></p><p>HTML-письмо — это большая таблица, которая тоже состоит из таблиц.</p><p>Раньше таблицами верстали сайты, потом пришли к flexbox и grid. Электронная почта тоже эволюционирует, но медленно — в HTML-письмах эффективна только табличная вёрстка.</p><p>Таблицы корректно отображаться в Gmail, Mail.ru, Outlook и других почтовых клиентах.</p><h3>Тестирование писем</h3><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-05-28/84db2113-a6f0-4b97-9dcc-00147f3a9a9a.jpg" alt="" /><figcaption>Панель для контроля превью, трекинга писем, блокировок — Litmus.com</figcaption></figure><p>Для проверки используйте:</p><ul><li><a href="https://www.litmus.com/">Litmus</a> — платформа для тестирования в 90+ клиентах.</li><li><a href="http://emailonacid.com">Email on Acid</a> — альтернатива Litmus.</li><li><a href="http://mail-tester.com">Mail Tester</a> — бесплатная проверка на спам.</li><li><a href="http://caniemail.com">Can I Email</a> — таблица поддержки CSS в письмах.</li></ul><p>Начинайте с простых шаблонов и постепенно усложняйте. Всегда тестируйте в основных клиентах: Gmail, Outlook и обязательно на мобильных устройствах.</p><h2>Подключение шаблонов и вложений</h2><p>Шаблоны нужны, чтобы отправлять персонализированные письма множеству получателей. Вместо создания отдельного HTML для каждого пользователя вручную, один шаблон подставляет имена, данные заказов, списки товаров автоматически.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-05-28/210cd4f3-5dc2-45ed-bb1c-e8b148c9766e.jpg" alt="" /><figcaption>Пример персонализированного письма</figcaption></figure><p>При отправке 100 писем с приветствием «Привет, Максим!» и уникальными номерами заказов ручное создание HTML превращается в кошмар. Шаблонизатор Handlebars решает эту проблему. Также он упрощает поддержку — изменения в дизайне вносятся в один файл.</p><p>Handlebars превращает статичные HTML-шаблоны в динамические письма. Переменные заменяются реальными данными при компиляции.</p><p>Handlebars поддерживает условные блоки {{#if}} и циклы {{#each}}. С их помощью можно показывать разные части письма в зависимости от данных или выводить списки товаров, уведомлений, участников.</p><p>HTML-шаблоны реального проекта хранятся в отдельной папке. Модуль fs читает файл, Handlebars компилирует его с данными, результат передается в nodemailer. Такой подход разделяет логику приложения и вёрстку писем.</p><h2>Добавление файлов-вложений</h2><p>Параметр attachments в nodemailer принимает массив объектов с описанием файлов. Каждое вложение содержит имя файла и путь к нему или буфер с содержимым:</p><p>Размер всех вложений не должен превышать лимиты почтового сервера — 25 МБ для Gmail и Outlook.</p><h2>Генерация файлов на лету</h2><p>Популярная задача — создание PDF-документов прямо в коде. Библиотека <a href="https://github.com/foliojs/pdfkit">pdfkit </a>генерирует PDF в памяти, результат передается как буфер в nodemailer. Аналогично работают библиотеки для создания Excel-файлов или изображений. Получается персонализированное письмо с документами и красивым оформлением.</p><h2>Ошибки при отправке писем и их обработка</h2><p><b>Ошибки аутентификации</b> встречаются чаще всего. Коды 535 и 534 указывают на проблемы с логином или паролем. Почтовые провайдеры требуют использования паролей приложений вместо основных паролей аккаунтов. Gmail и Яндекс.Почта не позволят войти с обычным паролем, если не включена 2-Fa.</p><p><b>Проблемы с получателями</b> проявляются кодами 550 (пользователь не найден) и 553 (неверный формат email). Ошибка 552 сигнализирует о превышении размера письма.</p><p>Реальная система должна различать критические и временные ошибки. Временные проблемы (таймауты, недоступность сервера) требуют повторных попыток с задержкой. Критические ошибки (неверный email, проблемы аутентификации) нужно логировать и обрабатывать немедленно.</p><p>Простейший подход — попытки отправки с увеличивающимися интервалами: 2, 4 и 8 секунд.</p><h2>Как понять, дошло ли письмо?</h2><p>Nodemailer сообщает только о том, что SMTP-сервер принял письмо для доставки. Это не гарантирует доставку в почтовый ящик получателя.</p><p>Фактическая доставка зависит от множества факторов:</p><ul><li>репутации отправителя,</li><li>содержимого письма,</li><li>настроек получателя.</li></ul><p>Для отслеживания реальной доставки используют <b>скрытый пиксель</b> — невидимые изображения размером 1×1 px, встроенные в HTML-письма. Когда получатель открывает письмо, изображение загружается с вашего сервера, фиксируя факт прочтения.</p><h2>Почему письма попадают в спам?</h2><p>Спам-фильтры анализируют множество факторов. Основные проблемы: отправка с бесплатных почтовых сервисов для бизнес-рассылок, использование <a href="https://vc.ru/marketing/1092370-email-protiv-bdsm-200-stop-slov-iz-za-kotoryh-vasha-rassylka-mozhet-popast-v-spam">спам-слов</a> в теме (“СРОЧНО!!!”, “СКИДКА 90%”).</p><p>Технические аспекты:</p><ul><li>отсутствие SPF, DKIM и DMARC записей в DNS;</li><li>неправильно настроенный reverse DNS;</li><li>высокий процент отказов (bounce rate) в предыдущих рассылках.</li></ul><p>Хотите улучшить доставляемость? Добавьте ссылку для отписки, поддерживайте чистоту списков рассылки и наращивайте объем писем постепенно.</p><h2>Безопасность при отправке писем</h2><p>Первое правило: никогда не храните пароли прямо в коде. Даже если это тестовый проект, который никто не увидит. Используйте переменные окружения.</p><p>Создайте файл<i> .env </i>в корне проекта:</p><p>Не забудьте добавить <i>.env</i> в <i>.gitignore</i>. В коде обращайтесь к этим переменным через <i>process.env</i>:</p><h2>OAuth2 и пароли приложений</h2><p>Если работаете с Gmail, Яндексом или другими крупными почтовыми сервисами, забудьте про обычные пароли. Используйте OAuth2 или пароли для приложений:</p><ul><li>Пароли приложений работают только для конкретной задачи, их можно в любой момент отозвать.</li><li>OAuth2 — более сложный, но безопасный способ.</li></ul><p>Подробнее по теме: <a href="https://tproger.ru/articles/oauth-2-0-i-oidc--kak-zashhitit-api-i-polzovatelskie-dannye-253181">OAuth 2.0 и OIDC: как защитить API и пользовательские данные</a>.</p><h2>SPF, DKIM, DMARC</h2><p>Это записи в DNS, которые говорят почтовым серверам: «Да, это письмо действительно от нас, а не от мошенников»:</p><ul><li><b>SPF </b>— список IP-адресов, с которых можно отправлять письма от вашего домена.</li><li><b>DKIM </b>— цифровая подпись письма.</li><li><b>DMARC </b>— политика обработки писем, которые не прошли проверку.</li></ul><p>Если используете свой домен, настройте эти записи. Если нет — не переживайте, это задача для более продвинутого уровня.</p><h2>Что дальше?</h2><p>Следующий шаг — <b>автоматизация рассылок</b>. Когда пользователь регистрируется, система отправляет приветственное письмо, при оформлении заказа — подтверждение с деталями покупки.</p><p>Для больших объёмов писем понадобятся <b>SendGrid</b>, <b>Mailgun </b>и <b>Amazon SES</b>. Эти сервисы решают проблемы с доставляемостью и предоставляют статистику — сколько писем доставлено, открыто, по каким ссылкам кликнули получатели.</p><p>Персонализация выходит за рамки подстановки имени в шаблон. Анализ поведения пользователей позволяет отправлять релевантный контент — подборки товаров на основе предыдущих покупок, напоминания о брошенной корзине.</p><p>Тестирование email-кампаний помогает улучшить результаты. <a href="https://tproger.ru/articles/kak-uluchshit-produkt-s-pomoshhju-a-b-testirovanija">A/B-тесты</a> показывают, какие заголовки чаще открывают, эксперименты с временем отправки выявляют оптимальные часы для конкретной аудитории.</p><p>Интеграция с аналитикой замыкает цикл. <b>UTM-метки</b> в ссылках письма показывают в Google Analytics, сколько пользователей перешло из рассылки на сайт и что там делали. Эти данные помогают оценить эффективность email-маркетинга и планировать следующие кампании.</p>]]></content:encoded>
    </item>
    <item>
      <title>6 советов, которые реально прокачают навыки работы с Docker</title>
      <link>https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker</link>
      <comments>https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker</guid>
      <description><![CDATA[<p>Шесть практик, которые прокачают навыки работы с Docker: минимизация образов, ручная сборка, sandbox-подход, нестандартная контейнеризация и отказ от Docker CLI.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/6-sovetov--kotorye-realno-prokachayut-navyki-raboty-s-docker">6 советов, которые реально прокачают навыки работы с Docker</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 03 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Docker давно стал стандартом в разработке: контейнеры запускают фронтенд, бэкенд, базы данных, пайплайны и тесты. Но большинство разработчиков использует его как ещё один способ запустить проект, не вдаваясь в детали. А ведь за docker build и docker run скрывается целая экосистема. Сегодня рассмотрим шесть практик, которые реально прокачают навыки работы с Docker.</p><h2>Сделайте минимальный Docker-образ, не ломая прод</h2><p>Большинство Docker-образов в проектах содержат больше данных, зависимостей и инструментов, чем требуется для работы приложения. Это приводит к избыточному объёму, медленной сборке и повышенным рискам безопасности. Умение собирать минимальный образ — один из базовых навыков работы с Docker, который напрямую влияет на стабильность и скорость развёртывания.</p><p>Начать стоит с multi-stage сборки: на первом этапе — установка зависимостей и сборка, на втором — только нужные артефакты. Это позволяет исключить лишние файлы и утилиты из финального образа. В качестве базового слоя лучше использовать alpine, distroless или даже scratch, если вы точно понимаете, какие бинарники и библиотеки требуются приложению.</p><p>Хорошая практика — использовать утилиты docker history и dive для анализа того, какие файлы и слои попали в образ. Если размер превышает ожидания, стоит проверить, не остались ли во внутреннем слое временные файлы, dev-зависимости или директории кэша.</p><p>Полезный навык — намеренно уменьшить образ до минимума и посмотреть, на каком этапе он перестанет работать. Это позволяет выявить неочевидные зависимости, которые могут мешать переносимости и воспроизводимости. Например, отсутствие системной библиотеки, необходимость в переменных окружения или некорректная настройка путей.</p><p>Результат — меньше уязвимостей, быстрая сборка и уверенность в том, что образ содержит только то, что действительно нужно для запуска в проде.</p><h2>Попробуйте контейнизировать то, что изначально не предназначалось для этого</h2><p>Работа с Docker чаще всего начинается с бэкенд-приложений, сервисов и утилит, которые изначально проектировались как самостоятельные процессы. Они хорошо вписываются в модель контейнеров: запускаются из CLI, работают в изоляции, не требуют доступа к UI или железу. Но стоит выйти за эти рамки — начинаются сложности.</p><p>Попробуйте упаковать в контейнер любую графическую программу. Технически это возможно: X11 или Wayland можно пробросить через сокет, устройства передать через volume, окружение прописать вручную. Но на практике вы столкнётесь с рядом ограничений: отсутствие звука, глюки интерфейса, ошибки в драйверах, проблемы с доступом к GPU или нестабильное поведение при рендеринге.</p><p>В этом упражнении ценен не сам результат, а путь. Вы увидите, как устроена изоляция в Docker, почему графические приложения не работают «из коробки» и где находятся реальные границы контейнеризации. Контейнер — это не виртуальная машина, у него нет полноценного init, драйверов или прямого доступа к оборудованию. Многие фичи, которые работают локально, в контейнере требуют дополнительных танцев с бубном.</p><p>Такая практика особенно полезна, если вы имеете дело с devtool'ами, UI-обвязкой или тестированием в headless-средах. Понимание, что именно ломается и почему, позволяет более точно проектировать окружение и избегать архитектурных ловушек в будущем.</p><h2>Соберите базовый образ с нуля</h2><p>Когда разработчик пишет FROM node или FROM ubuntu, он автоматически получает десятки слоёв, библиотек и утилит, о которых, скорее всего, не задумывается. Это удобно, но не даёт понимания, как вообще работает контейнер на низком уровне. Попробуем разобраться.</p><p>Укажите в Dockerfile FROM scratch — и не увидите ни bash, ни glibc, ни стандартных каталогов. Вам придётся самостоятельно добавить всё необходимое: бинарник, зависимости, библиотеки, конфигурацию. Если пишете на Go, задача упрощается: можно собрать статически слинкованный исполняемый файл и скопировать его в образ. Для других языков, особенно тех, что зависят от динамических библиотек или рантайма (например, Python или Node.js), придётся вручную подтягивать зависимости.</p><p>Такая практика заставляет иначе взглянуть на структуру контейнера. Вы начнёте понимать, чем отличается CMD от ENTRYPOINT, зачем в некоторых образах используется sh -c, и что произойдёт, если не задать WORKDIR. Вы столкнётесь с ошибками «no such file or directory» даже тогда, когда файл вроде бы существует — потому что в контейнере не хватает нужной libc.</p><p>Отдельный повод для размышлений — Alpine. Его любят за размер и минимализм, но он использует musl вместо glibc, и не всё с ним работает корректно. В процессе сборки на практике увидите, почему иногда проще остаться на Debian Slim, чем пытаться адаптировать всё под Alpine.</p><p>Этот эксперимент не нужен для продакшена — он нужен вам, как разработчику. Прокачивает понимание, как устроен Docker, что по-настоящему важно приложению для запуска, и какие зависимости вы добавляете бессознательно.</p><h2>Делайте разные варианты Docker-образов</h2><p>Хороший Dockerfile — тот, который гибко адаптируется под разные сценарии: продакшен, отладку, тестирование, запуск на ARM или x86. Если вы умеете собирать только один универсальный образ — вы ещё не освоили Docker по-настоящему.</p><p>Попробуйте собрать сразу несколько версий своего образа: на Debian и на Alpine, с минимальным размером и с полным набором утилит, для amd64 и arm64. Добавьте build-аргументы (ARG) — они позволяют передавать параметры на этапе сборки: выбрать базовый образ, включить или выключить зависимости, задать переменные окружения. Используйте RUN if или шаблонизацию через Dockerfile.template, чтобы варьировать поведение без дублирования кода.</p><p>Вот типичный пример: в режиме отладки вам нужен образ с установленным curl, vim, доступом к логам и расширенной трассировкой. А в продакшене — максимально облегчённый, с удалёнными временными файлами, сжатым слоем и только необходимыми бинарниками. Один и тот же проект — два разных образа. Добавьте сюда ещё поддержку разных архитектур (multi-arch build через --platform), и вы выйдете на уровень CI/CD, где из одного пайплайна собирается три-четыре артефакта.</p><p>Такая практика решает сразу несколько задач. Во-первых, помогает лучше понять, как влияет каждый шаг сборки на финальный размер и поведение контейнера. Во-вторых, избавляет от лишних костылей, когда на проде всё работает, а на локалке — нет. И главное — прокачивает навык автоматизации. Один Dockerfile, разные образы, ноль копипасты.</p><h2>Поиграйте в «А что если запустить чужой (небезопасный) код?»</h2><p>Представьте задачу: вам нужно запустить код, который написал кто-то другой. Вы не уверены, что он безопасен. Это может быть скомпилированный бинарник, питоновский скрипт или даже npm-зависимость с подозрительным хуком. Где-то в коде может быть rm -rf /, попытка выйти за пределы контейнера, установить рутовый доступ или просто майнить крипту. И теперь этот код запускается на вашей машине — внутри Docker.</p><p>Кажется, контейнер защитит? Не всегда.</p><p>Docker не является полноценной песочницей. По умолчанию контейнер может обращаться к файловой системе, к ядру и к хостовым ресурсам — особенно если вы запускаете его                 с --privileged или без ограничения пользователя. Даже docker run -it ubuntu работает от root внутри контейнера, что уже создаёт риски.</p><p>Если вы действительно хотите запустить небезопасный код, нужно жёстко ограничить контейнер:</p><ul><li>отключить права root (через --user);</li></ul><ul><li>запретить модификацию файловой системы (--read-only);</li></ul><ul><li>отобрать лишние возможности ядра (--cap-drop=ALL);</li></ul><ul><li>включить seccomp-профиль, AppArmor или SELinux;</li></ul><ul><li>отключить доступ к сети или монтированию сокетов.</li></ul><p>Список можно продолжать. Главное — понять, что Docker по умолчанию не даёт изоляции на уровне VM. Если вы работаете с кодом, которому не доверяете, этого может быть недостаточно.</p><p>Это упражнение учит думать о безопасности как о процессе. И особенно важно пройти его, если вы когда-нибудь планируете запускать user-generated code: плагины, кастомные скрипты, пайплайны CI. Только на практике становится ясно, где заканчиваются возможности Docker и начинаются границы настоящей песочницы.</p><h2>Работайте без Docker CLI</h2><p>Если убрать Docker CLI — что останется? Больше, чем кажется.</p><p>Docker ― это не единый монолит. Он работает поверх набора инструментов и стандартов: buildkit, containerd, спецификация OCI. CLI просто прячет эту архитектуру за удобными командами: docker build, docker run, docker push. Но всё, что кажется магией, можно повторить вручную.</p><p>Попробуйте отказаться от docker как от инструмента. Сконфигурируйте buildctl напрямую и соберите образ без Dockerfile. Или вообще создайте его вручную: сформируйте структуру, описания слоёв, метаданные, манифест. Прочитайте спецификацию <a href="https://github.com/opencontainers/image-spec">OCI Image Format </a>и идите по ее шагам. Понадобится tar, sha256sum, немного JSON — и внимательность.</p><p>Образ собрали? Отлично. Теперь отправьте его в реестр без docker push. Используйте oras, skopeo или curl с аутентификацией и ручной отправкой слоёв по HTTP API. Узнаете много нового: как работает digest, что такое manifest list и зачем нужны media types.</p><p>Наконец, запустите контейнер без docker run. Через ctr, runc или даже напрямую с помощью systemd-nspawn.</p><p>Зачем это нужно? Чтобы воспринимать Docker глубже. Так, вы понимаете, как устроен pipeline сборки и запуск контейнера, и точнее управляете им. Особенно это важно в продакшн-среде: когда образы не собираются, push падает, реестр отвечает 403, а пайплайн горит.</p><p>Ты точно программист, если читаешь это! Больше мемов, инсайтов и боли кодеров <a href="https://t.me/+ajgz7pDecB4xZTI6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Большой гайд по DevOps от Tproger: инструменты, практики, автоматизация</title>
      <link>https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya</link>
      <comments>https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya</guid>
      <description><![CDATA[<p>Собрали всё, что нужно DevOps-инженеру: CI/CD, Kubernetes, серверлесс, безопасность, мониторинг и альтернативы Docker — практично и по делу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya">Большой гайд по DevOps от Tproger: инструменты, практики, автоматизация</a>»</p>]]></description>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[DevSecOps]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 10 May 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали подборку наших лучших материалов для тех, кто строит пайплайны, следит за стабильностью и разворачивает сервисы в прод. Здесь — про Docker и Podman, Kubernetes, CI/CD, DevSecOps, serverless и всё, что нужно знать DevOps-инженеру в 2025 году. Сохраняйте, пригодится не раз.</p><h2>Инструменты и окружение</h2><p>Современные DevOps-инженеры без инструментов — как админ без терминала. Вот что стоит добавить в стек:</p><p><a href="https://tproger.ru/articles/top-10-instrumentov-devops--kotorye-uprostyat-vawu-zhizn-i-izbavyat-ot-nochnyh-relizov">Топ-10 инструментов DevOps, которые упростят вашу жизнь и избавят от ночных релизов </a>— Список лучших инструментов для DevOps-инженеров, которые упрощают релизы, мониторинг и CI/CD-процессы.  От логгирования до автоматизации тестов.</p><p><a href="https://tproger.ru/articles/podman-alternativa-docker">Podman: Альтернатива Docker без daemon</a> — Знакомим с Podman, инструментом, который не требует daemon, но дает весь функционал Docker.</p><p><a href="https://tproger.ru/articles/docker-hub-v-rossii---vse--gajd--kak-obojti-blokirovku">Docker Hub в России — всё? Гайд, как обойти блокировку</a> —Объясняем, как работать с Docker Hub после блокировки: альтернативы, зеркала и решения.</p><h2>CI/CD, Kubernetes и деплой</h2><p>Когда каждое изменение должно доходить до продакшена быстро и без боли — нужна хорошая сборка:</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/kubernetes-node-js-werf">Собираем и деплоим в Kubernetes приложение на Node.js с помощью werf </a>— Пошагово показываем, как собрать и развернуть приложение на Node.js в Kubernetes с помощью инструмента werf.</p><p><a href="https://tproger.ru/articles/avtomatizaciya-deploya-s-ispolzovaniem-kubernetes---tproger">Как автоматизировать деплой с использованием Kubernetes</a> — Рассказываем, как автоматизировать процесс деплоя приложений в Kubernetes: подходы, инструменты и советы.</p><p><a href="https://tproger.ru/articles/vybiraem-optimalnuyu-arhitekturu-monitoringa--ot-legkovesnogo-servisa-do-vysokonagruzhennyh-klasterov">Выбираем оптимальную архитектуру мониторинга: от легковесного сервиса до высоконагруженных кластеров </a>—Рассматриваем варианты мониторинга от минимальных решений до сложных систем, подходящих под высокие нагрузки.</p><h2>Практики и подходы</h2><p>Не только инструменты, но и культура разработки — основа DevOps:</p><p><a href="https://tproger.ru/articles/kak-stat-devops-v-2024-godu">Как стать DevOps в 2024 году</a> — Что нужно знать, какие навыки прокачивать, с чего начать.</p><p><a href="https://tproger.ru/articles/kak-avtomatizirovat-bezopasnost-s-pomoshhyu-devsecops-i-iskusstvennogo-intellekta">Как автоматизировать безопасность с помощью DevSecOps и искусственного интеллекта</a> — Объясняем, как применить DevSecOps-подход и AI для защиты приложений на всех этапах разработки.</p><p><a href="https://tproger.ru/articles/kak-serverless-tehnologii-pomogajut-snizit-nagruzku-na-razrabotchikov">Как serverless-технологии помогают снизить нагрузку на разработчиков</a> — Разбираемся, как serverless помогает ускорить разработку, упростить масштабирование и снизить поддержку инфраструктуры.</p><p>Не забывайте читать предыдущие гайды. <a href="https://tproger.ru/articles/bolwoj-gajd-po-python-ot-tproger--topovye-instrumenty-dlya-raznyh-napravlenij">Python</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>, <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/s----vse-samye-vazhnye-materialy-ot-tproger">С++</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">инструменты</a>, <a href="https://tproger.ru/articles/veb-razrabotka-i-frontend--gajd-ot-tproger">фронтенд</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>JavaScript: большой гайд от Tproger</title>
      <link>https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger</link>
      <comments>https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger</guid>
      <description><![CDATA[<p>Гайд по JavaScript. Топовые и полезные статьи с теорией, инструментами и фреймворками. Практика для новичков и продвинутых программистов.  ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger">JavaScript: большой гайд от Tproger</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 08 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>JavaScript — база веб-разработки. На нем пишут интерактивные веб-интерфейсы, динамичные приложения и серверные фичи. В общем, на JS можно делать все — от простых скриптов до сложных экосистем. В этом гайде собрали статьи для новичков и не только, которые помогут прокачаться в JavaScript.</p><h2>База и теория</h2><ol><li><a href="https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera">Event loop для чайников: простыми словами о сложном механизме браузера</a> — В статье разбираем, что такое Event Loop, очередь задач и стек вызовов. Простыми словами о том, как браузер выполняет JavaScript-код и обрабатывает события.</li><li><a href="https://tproger.ru/articles/chek-list-dlya-node-js-novichkov--obrabotka-owibok-254149">Чек-лист по Node.js для новичков: обработка ошибок</a> — Показываем основные подходы к обработке ошибок для Node.js. Рассматриваем пошаговую инструкцию и практические примеры.</li><li><a href="https://tproger.ru/articles/znaniya--kotorymi-dolzhen-obladat-javasript-razrabotchik-v-2024-godu--eto---baza">Что нужно учить JavaSript-разработчикам в 2024 году</a> — Разбираем, какие технологии и навыки нужно знать JS-разработчику, в том числе и в 2025. От фреймворков до подходов к архитектуре.</li><li><a href="https://tproger.ru/articles/deklarativnyj-javascript">Декларативные языки на примерах с JavaScript</a> — Рассказываем, что значит декларативный стиль программирования. Сравниваем с императивным на примерах JavaScript.</li><li><a href="https://tproger.ru/articles/javascript-localstorage-polnoe-rukovodstvo">JavaScript localStorage: Полное руководство</a> — Разбираем, как работает localStorage. Учим сохранять данные на клиенте с помощью JavaScript.</li><li><a href="https://tproger.ru/articles/ponimanie-strogogo-rezhima-javascript">Как работает режим strict в JavaScript</a> — Объясняем, что делает режим strict и почему он помогает писать более безопасный код на JavaScript.</li><li><a href="https://tproger.ru/articles/kak-besplatno-vyuchit-javascript-i-ne-idti-v-onlajn-wkoly">Как бесплатно выучить JavaScript и не идти в онлайн-школы</a> — Рассказываем, как самостоятельно освоить JavaScript. Бесплатные ресурсы, полезные советы и личный план обучения.</li><li><a href="https://tproger.ru/articles/kakie-js-biblioteki-ispolzovat-dlya-animacij-na-sajte-v-2024-godu">Какие JS-библиотеки использовать для анимаций на сайте в 2024 году</a> — Актуальные JavaScript-библиотеки для веб-анимации. Рассматриваем лучшие инструменты для красивых и быстрых интерфейсов.</li></ol><h2>Практикуемся</h2><ol><li><a href="https://tproger.ru/articles/10-realnyh-voprosov-s-sobesedovaniya-javascript-razrabotchika-s-otvetami-254156">10 реальных вопросов с собеседования JavaScript-разработчика с ответами</a> — Подборка реальных вопросов с собеседований для JavaScript-разработчиков. Даем ответы и объясняем, как правильно мыслить на интервью.</li><li><a href="https://tproger.ru/articles/prilozhenie-dlya-prognoza-pogody-na-vue-js">Приложение прогноза погоды с использованием Vue JS</a> — Пошаговое руководство по созданию погодного приложения на Vue.js. Обучаем взаимодействию с API и построению интерфейса.</li><li><a href="https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript">Математика в программировании: реализуем уравнения на JavaScript</a> — Объясняем, как реализовать математические уравнения на JavaScript. Практика для программистов, которые не боятся формул.</li><li><a href="https://tproger.ru/articles/regulyarnye-vyrazheniya-v-javascript-eto-ne-tak-strawno-kak-vy-dumaete">Регулярные выражения в JavaScript: разбираемся в создании</a> — Учим создавать и использовать RegExp в JavaScript. Поясняем синтаксис, паттерны и типовые ошибки.</li><li><a href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja">Решаем популярные задачи с асинхронным кодом на JavaScript: часть первая</a> — Практика асинхронного программирования на JavaScript. Решаем задачи с API, задержками и промисами.</li><li><a href="https://tproger.ru/articles/tutorial-po-javascript-async-x2f-await-izuchaem-callbacks-promises-i-async-x2f-await">Асинхронный JavaScript: изучаем Async/Await, Callbacks и Promises</a> — Учим писать асинхронный код в JavaScript: от колбэков до современного async/await. Понятно, на примерах и без лишнего.</li><li><a href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja">Задачи по асинхронному программированию на JS</a> — Упражнения на асинхронный JavaScript. От простых примеров до сложных сценариев.</li></ol><p>Предыдущие подборки лежат здесь: <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>, <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/s----vse-samye-vazhnye-materialy-ot-tproger">С++</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">инструменты</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Нужен ли сеньору второй язык программирования? Опытом поделился разработчик с 18 годами стажа</title>
      <link>https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha</link>
      <comments>https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha</guid>
      <description><![CDATA[<p>Нужен ли сеньору второй язык программирования? Опыт и выводы разработчика с 18 годами стажа — когда и зачем изучать новые языки</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha">Нужен ли сеньору второй язык программирования? Опытом поделился разработчик с 18 годами стажа</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 May 2025 06:04:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>В айтишных чатах нередко звучит мнение: хороший сеньор должен уметь программировать на любом языке.</p><p>Оскар — разработчик с 18-летним стажем. Он решил <a href="https://www.architecture-weekly.com/p/why-we-should-learn-multiple-programming">разобраться</a>, насколько утверждение про необходимость знать множество языков правдива.</p><p>Сам Оскар за свою карьеру успел поработать с C#, Java, C++, Python, Ruby, JavaScript, Perl и прочими языками. Но не потому что стремился к полиглотству, а потому что так сложилось — проекты, клиенты, задачи.</p><p>По его мнению, изучение новых языков не просто расширяет кругозор. Это помогает иначе смотреть на архитектуру и подходы к решению задач. Даже если вы продолжаете писать на своем основном языке, знакомство с другими помогает вырасти ментально.</p><h2>Синтаксис — это не все</h2><p>Проблема в том, что многие изучают новый язык на уровне «выучил синтаксис — значит, могу писать». Но это часто приводит к «Java-коду на Go» или «C#-архитектуре в TypeScript». Новички в языке переносят привычные паттерны, не понимая, как использовать сильные стороны новой платформы.</p><p>Чтобы писать идиоматично, нужно время. Неделя — чтобы освоить синтаксис. Пару месяцев — чтобы почувствовать экосистему. Год — чтобы писать как носитель языка.</p><h2>Когда стоит добавлять новый язык в стек</h2><p>Оскар выделяет три повода:</p><ul><li>Бизнес-задача. Например, для тяжелых расчетов стоит взять язык быстрее JavaScript.</li><li>Кадровый вопрос. Иногда проще найти разработчиков под Node.js, чем под Java.</li><li>Карьерный рост. Умение работать с востребованным стеком открывает больше возможностей.</li></ul><p>Но главное — не делать выбор из любопытства. Однажды Оскару пришлось переписать модуль с F# на C#, потому что никто не хотел его поддерживать. В другом проекте Python-модуль оказался узким горлышком и потребовал переделки. Эти эксперименты дорого обошлись бизнесу.</p><h2>Архитектору — особенно важно</h2><p>Если вы архитектор, то знание языков — не просто плюс, а необходимость. Без этого вы будете опираться на чужие слова и чужие слайды, а не на собственный опыт. Лучшие архитекторы, по словам Оскара, регулярно пишут код — пусть и не фуллтайм.</p><h2>Баланс между глубиной и гибкостью</h2><p>Итак, должен ли сеньор уметь писать на любом языке? Не обязательно. Но он должен уметь быстро адаптироваться, понимать принципы, а не только синтаксис. И главное — не бояться признать, что его любимый язык не всегда лучший выбор.</p><p>Языки — это инструменты. Хороший разработчик остается таковым вне зависимости от того, на чем он пишет.</p>]]></content:encoded>
    </item>
    <item>
      <title>Чек-лист: как перейти на новый хостинг и не потерять данные</title>
      <link>https://tproger.ru/articles/chek-list--kak-perejti-na-novyj-hosting-i-ne-poteryat-dannye-255261</link>
      <comments>https://tproger.ru/articles/chek-list--kak-perejti-na-novyj-hosting-i-ne-poteryat-dannye-255261?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chek-list--kak-perejti-na-novyj-hosting-i-ne-poteryat-dannye-255261</guid>
      <description><![CDATA[<p>Иван Некулицы, основатель PQ.Hosting, рассказывает, как организовать переезд на другой хостинг без рисков и простоев.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chek-list--kak-perejti-na-novyj-hosting-i-ne-poteryat-dannye-255261">Чек-лист: как перейти на новый хостинг и не потерять данные</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>К переезду сайта на новый хостинг нужно хорошо готовиться. Если провести миграцию неправильно, можно потерять часть контента и даже ухудшить позиции сайта в поисковых системах. Подробный чек-лист переноса сайта на новый ресурс дал Иван Некулицы — основатель и директор международного хостинг-провайдера PQ.Hosting, предлагающего виртуальные  (VPS/VDS), выделенные серверы с 10 Gbps в 43 странах.</p><p>Причины переноса сайта на другой хостинг могут быть разными:</p><ul><li><b>Юзабилити.</b> Страницы сайта начнут грузиться быстрее, плюс он будет более удобным и поднимется в поиске.</li><li><b>Затраты.</b> Хостеры с выгодными тарифами или оптимальными предложениями позволят снизить эксплуатационные расходы.</li><li><b>Стабильность.</b> Смена провайдера с частыми сбоями на более устойчивого партнера обеспечит бесперебойную работу ресурса.</li><li><b>Поддержка.</b> Более квалифицированная служба поддержки поможет быстрее справляться с возникающими проблемами;</li><li><b>Масштабирование.</b> Хостер с возможностью масштабирования ресурсов поддержит растущий трафик и потребности вашего сайта;</li><li><b>Безопасность.</b> Повышенные меры защиты предотвратят угрозы кибератак и утечек данных;</li><li><b>Расположение. </b>Серверы, расположенные рядом с основной аудиторией, обеспечат ускоренную загрузку и лучшее восприятие пользователями.</li></ul><p>Какой бы ни была причина перехода, важно организовать его без потерь данных и времени.</p><h2>Шаг первый</h2><p>Начать стоит с <b>планирования и подготовки к миграции</b>. Выберите оптимальное время для переезда. Запланируйте перенос на наименее загруженный период работы сайта (например, поздней ночью или в выходные). Одновременно с этим <b>приостановите</b> публикацию нового контента и изменения на странице на время миграции, и предупредите команду, чтобы редакторы, авторы или клиенты не вносили правки: любые изменения во время переноса могут не попасть на новый сервер, что приведёт к потере данных. Если ожидается заметный простой или отключение функций (например, оформление заказов), <b>предупредите пользователей о предстоящих технических работах.</b> Разместите баннер или уведомление на сайте с указанием времени обслуживания и извинениями за неудобства.</p><p>При переносе необходимо <b>подготовить новую хостинг-платформу</b> заранее: зарегистрировать и настроить аккаунт у нового провайдера — желательно за 1-2 недели до переключения. Важно, чтобы тариф и ресурсы нового хостинга не уступали старому, а лучше превосходили его по параметрам (производительность, объем хранилища, оперативная память и пр.). Обязательно стоит <b>проверить совместимость нового сервера с имеющимся стеком технологий</b>: версии ОС, PHP/Node.js, СУБД, требуемые модули и библиотеки должны соответствовать или превышать текущие, чтобы избежать ошибок совместимости.</p><p>Далее нужно провести аудит всех компонентов вашего проекта. Составьте подробный список того, что нужно перенести: файлы сайта, базы данных, аккаунты пользователей, контент (изображения, видео, документы), настроенные задачи (cron jobs), DNS-записи (A, CNAME, MX и пр.), сертификаты SSL, иные интеграции.</p><p>Заранее стоит <b>продумать, как минимизировать downtime.</b> Помимо выбора ночного времени и контент-фриза существуют технические приемы: например, сокращение TTL DNS (см. раздел про DNS ниже) позволяет быстрее переключить домен на новый IP, а предварительное тестирование сайта на новом сервере до обновления DNS помогает выявлять проблемы — причем пользователи ничего не заметят.</p><h2>Шаг второй</h2><p><b>Резервное копирование перед переносом</b> — обязательная процедура. Стоит сделать полный бэкап всего проекта — перед любыми изменениями создать актуальную резервную копию файлов и баз данных. Даже если старый сервер не будет сразу отключен, наличие независимого бэкапа — это подстраховка на случай непредвиденных сбоев. После создания, проверьте работоспособность бэкапа. По возможности, убедитесь, что резервная копия валидна и её можно развернуть.</p><h2>Шаг третий</h2><p>Переходим непосредственно к переносу файлов и баз данных. Для этого нужно <b>перевести сервисы в режим миграции</b> и перед началом копирования данных <b>переключить сайт в оффлайн-режим</b> (режим обслуживания).</p><p>Далее — скопировать файлы сайта на новый сервер. Самый простой способ — загрузить бэкап на новый хост и развернуть его там, после чего перенести на него базу данных, связанные сервисы и настройки. Помимо основного кода и БД, переносится и все окружение сайта. До переключения DNS запускаем тестирование на новом сервере, чтобы убедиться в работоспособности сайта в новом окружении, прежде чем направлять на него пользователей.</p><p>Последний шаг на этом этапе — <b>синхронизация последних изменений</b> (при необходимости). Если принято решение не останавливать полностью работу старого сайта на время переноса (например, при миграции очень большого проекта), то придется повторно синхронизировать данные, которые могли измениться за время копирования.</p><h2>Шаг четвертый</h2><p>Чтобы сократить TTL DNS перед переключением, за день-два до планируемой миграции <b>стоит уменьшить TTL</b> (Time to Live) для DNS-записей вашего домена, а также обновить DNS-записи на новые. Когда новый сервер полностью готов и протестирован, нужно изменить DNS-записи домена, указывающие на старый хост, чтобы они указывали на новый. Если домен обслуживается у регистратора или внешнего DNS-сервиса — поменяйте A-запись (IPv4) и AAAA-запись (IPv6), или NS-записи (если менялся DNS-провайдера целиком). В случае смены хостинга часто требуется обновить NS (nameservers) на стороне регистратора на NS нового провайдера.</p><p>После обновления DNS возможно кратковременное состояние, когда часть пользователей попадает на новый сервер, а часть — еще на старый (пока старый кэш не истечет). Поэтому нужно следить за переходным периодом и не допустить, чтобы старый сервер в этот период тоже оставался доступным.</p><p>После проверки переноса или перенастройки всех связанных DNS-записей стоит <b>проверить и обновления DNS</b>. Для этого можно использовать утилиты вроде nslookup или онлайн-сервисы (Google DNS, Cloudflare DNS, WhatsMyDNS), чтобы убедиться, что домен теперь указывает на новый сервер по всему миру.</p><h2>Шаг пятый</h2><p><b>Перенос состоялся. Что дальше? Пост-миграционное тестирование и мониторинг</b></p><p>В рамках этих процессов необходимо тщательно <b>проверить сайт на новом хостинге</b>. Когда домен начал вести на новый сервер, стоит провести всестороннее тестирование фронтенда и бэкенда в боевых условиях: при помощи инструментов веб-аналитики или специальных сервисов для измерения скорости сравнить время загрузки страниц до и после переезда. Это нужно для оценки производительности и нагрузки.</p><p>Не стоит забывать <b>следить за журналами и метриками</b>: просматривать логи веб-сервера и приложений на новом сервере, искать ошибки (PHP fatal errors, 500 Internal Server Error, проблемы подключения к БД и т.д.) и устранять их. После перехода на новый хостинг нужно проверять и SEO-показатели и индексацию, чтобы убедиться, что сайт по-прежнему правильно индексируется поисковиками.</p><p>Обязательно <b>обеспечьте непрерывность сервисов электронной почты </b>— стоит протестировать доставку писем на корпоративные адреса после смены MX-записей (если они менялись). В завершении провести финальное резервное копирование и отключение старого сервера. Когда работа сайта на новом хосте не вызывает нареканий —  рекомендую сделать еще одну резервную копию — уже на новом хостинге, чтобы зафиксировать рабочее состояние в точке после миграции. Впервые 24-48 часов после миграции важно быстро реагировать на возможные сбои. Стоит сообщить команде, что переезд завершён, и попросить коллег сообщать обо всех замеченных проблемах.</p><h2>Лайфхаки для безопасной и простой миграции</h2><p>Вот несколько универсальных советов для тех, кто планирует переезжать на новый хостинг:</p><ul><li>Делайте бэкапы на каждом этапе.</li><li>Планируйте и документируйте. Подготовьте чек-лист миграции и строго ему следуйте.</li><li>Тщательно проверяйте окружение до запуска. Никогда не переключайте пользователей на новый хостинг, пока сами не убедитесь, что там всё работает на 100%.</li><li>Минимизируйте окно простоя.</li><li>Общайтесь с аудиторией. Предупредите постоянных пользователей о небольшом перерыве в работе.</li><li>Учитывайте SEO-факторы. Небольшие просадки SEO в возможны, но правильная миграция их минимизирует.</li><li>Следите за качеством данных. После переезда организуйте своеобразный аудит данных: сопоставьте количество записей в базах, количество файлов, размер медиа-библиотеки до и после.</li></ul><p>Не отключайте старое раньше времени. Мы уже упоминали, но повторим: пусть старый хостинг побудет вашей сетью безопасности на случай форс-мажора. Лучше заплатить за лишние несколько дней или неделю, чем потом пожалеть о поспешном удалении данных.</p><p>Чтобы не потерять данные, нужно использовать лучшие подходы. Как раз рассказываем о таких в нашем <a href="https://t.me/+iKEwDxvulHFkZDhi">тг-канале</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие есть паттерны в React и для чего они нужны: часть 2</title>
      <link>https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2</link>
      <comments>https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Юсуп Изрипов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2</guid>
      <description><![CDATA[<p>В этой части Юсуп Изрипов рассказывает, что такое хуки и кастомные хуки, а также про Compound Components и Серверные компоненты и Suspense.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2">Какие есть паттерны в React и для чего они нужны: часть 2</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Apr 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Меня зовут Юсуп Изрипов, я сеньор разработчик в VK. Работаю над продуктами, которыми ежедневно пользуются миллионы человек. В этой части поговорим о том, как и когда использовать хуки и почему серверные компоненты — настоящая революция.</p><p>Ниже — оставшиеся три паттерна, которые мы не разобрали в прошлой <a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-1">статье</a>.</p><h2>Хуки и кастомные хуки</h2><p>Мы уже несколько раз упоминали хуки (Hooks) — пора поговорить о них как о новом паттерне, фактически пришедшем на смену многим предыдущим. Хуки появились в React 16.8 и моментально изменили стиль написания компонентов. Теперь вместо классов с методами жизненного цикла у нас функциональные компоненты, которые используют состояния (useState), эффекты (useEffect) и другие возможности прямо внутри функции. А главное — мы можем писать свои собственные, пользовательские хуки (custom hooks) для повторного использования логики.</p><p>Почему же хуки так популярны? Они дают возможность переиспользовать состояние и побочные эффекты, не меняя структуру самих компонентов. Раньше, чтобы два компонента разделяли какую-то логику, приходилось применять HOC или Render Props — то есть вводить дополнительный компонент-обёртку или коллбэк. Теперь же мы можем вынести логику в custom hook useSomething() и вызвать его в нужных нам компонентах или других кастомных хуках. Получается, что хуки позволяют писать более прямолинейный, читаемый код: вместо закулисной магии HOC мы явно вызываем необходимые нам хуки и получаем данные.</p><p>Custom hook — это просто функция, название которой по соглашению начинается с use (чтобы линтер React знал, что внутри неё могут быть хуки). Например, давайте перепишем наш HOC withCounter из предыдущего примера как кастомный хук:</p><p>Получилось то же самое поведение (счётчик кликов), но без обёрток. Компонент ClickButton сам вызывает useCounter() и получает count и increment. Внутри useCounter может быть любая другая сложная логика, побочные эффекты, вызовы других хуков — компонент, использующий наш хук, об этом не знает и не должен знать. Зато код компонента предельно ясный: он просто берёт нужные ему данные из хука и использует их.</p><p>Повторное использование логики — главное преимущество кастомных хуков. Вы можете написать, например, хук useFetch(url) (достаточно распространённое решение), который будет обращаться к API и возвращать состояние загрузки, успеха запроса, данные и ошибки. Далее можно применять этот хук в разных компонентах, страницах, не дублируя сам код запроса.</p><p>Кроме того, хуки отлично работают друг с другом. Вы можете внутри одного хука вызвать другой (например, использовать useContext или useReducer внутри своего useAuth хука). Это помогает облегчить написание сложных функциональностей, так как мы используем небольшие хуки, выполняющие простые задачи, из которых как конструктор составляем более сложное поведение.</p><p>Плюсы: ясность и лаконичность. Мы не оборачиваем компонент, использующий хук, ни в какие лишние слои, его JSX не замусорен вспомогательными функциями или компонентами, он просто вызывает хук и получает результаты. HOC и Render Props во многом ушли в прошлое из-за того, что хуки решают те же проблемы более естественным для JavaScript способом. Кастомные хуки легко тестировать (это по сути просто функции). Хуки позволяют разделять логику внутри одного компонента на независимые части: например, компонент может использовать одновременно и свой локальный useState, и несколько разных кастомных хуков —  каждая часть отвечает за себя, и этот код не переплетается, тогда как при использовании нескольких HOC или Render Props было бы труднее изолировать ответственности.</p><p>Минусы: если это можно назвать минусом. Хотя хуки упростили многое, они принесли также свои правила, о которых нужно помнить: вызывать в одном порядке, только в компонентах либо других хуках, не внутри условий. Если нарушить эти правила, React выдаст предупреждение или ошибку. Ещё потенциальный минус: повторное использование хука означает, что каждый компонент получает свою копию состояния. Это обычно то, что нам нужно, но если вдруг требуется разделять одно состояние между несколькими компонентами — хуки напрямую не помогут, придётся выносить состояние выше (или в контекст, или в стор). Впрочем, это уже другая задача.</p><p>В целом, сейчас хуки — основной инструмент в React, используемый разработчиками. Большинство новых API, фреймворков, библиотек строятся вокруг хуков. Поэтому если вы видите библиотеку, написанную на HOC либо Render Props, то, скорее всего, у неё уже есть или появится версия на хуках. Хуки сделали код React компонентов более понятным и свели на нет необходимость в классах (почти все новые фичи React рассчитаны только на функциональные компоненты).</p><h2>Compound Components (Составные компоненты)</h2><p>Паттерны, о которых говорилось выше, касаются того, как компоненты делятся логикой или данными. А есть подход, делающий фокус на композиции компонентов, позволяя создавать гибкие интерфейсы. Compound Components — это паттерн, при котором несколько компонентов работают вместе как единое целое, обмениваясь общим состоянием (обычно через контекст). Пользователь такого комплекта компонентов может гибко комбинировать его части в JS.</p><p>Я познакомился с данным паттерном, когда писал в качестве пет-проекта свой собственный UI Kit. Представьте &lt;Accordion&gt; с множеством &lt;AccordionItem&gt; или &lt;Select&gt; и &lt;Option&gt;. Compound Components — когда мы пишем код таким образом, что компонент &lt;Accordion&gt; не обязан принимать массив пунктов через пропсы и рендерить его внутри. Мы даём разработчику возможность самому в JSX расписать, какие пункты будут у аккордеона и что в них будет находиться, используя заранее предусмотренные дочерние компоненты: &lt;Accordion.Item&gt;, &lt;Accordion.Header&gt; и &lt;Accordion.Panel&gt;.</p><p>Возможно, у вас, как и у меня, сразу же возник вопрос в голове: «как же Accordion узнает о своих Item и организует их работу?» Внутри — как раз при помощи React Context. Compound Components обычно реализуются так: родитель (компонент-контейнер) содержит всё состояние (например, какой пункт раскрыт) и методы управления (функция toggle(index)). Он оборачивает children своим контекст провайдером и передаёт туда эти данные и функции. Дочерние компоненты (которые рендерятся где-то внутри children) просто берут нужное из контекста и таким образом получают доступ к состоянию родителя. Они знают, к какому именно контейнеру принадлежат, благодаря тому, что рендерятся внутри него и получают его контекст.</p><p>Давайте рассмотрим конкретный пример. Сделаем простой составной компонент Toggle, который будет управлять отображением/скрытием некоторого контента по клику. У нас будет &lt;Toggle&gt; в роли контейнера и его дочерние компоненты &lt;Toggle.On&gt;, &lt;Toggle.Off&gt; и &lt;Toggle.Button&gt;.</p><p>Здесь &lt;Toggle&gt; управляет состоянием on (показано/скрыто) и предоставляет через контекст значение { on, toggle } всем потомкам. &lt;ToggleOn&gt; и &lt;ToggleOff&gt; читают on и в зависимости от него либо рендерят children, либо нет. &lt;ToggleButton&gt; получает из контекста функцию toggle и вызывает её при клике. В итоге снаружи мы получаем удобный и декларативный интерфейс: внутрь &lt;Toggle&gt; мы помещаем разные части UI, которые сами знают, когда им отображаться и что делать при клике —  мы лишь описываем структуру, не связывая их вручную пропсами.</p><p>Обратите внимание: компоненту &lt;Toggle&gt; без разницы, сколько у него внутри &lt;ToggleOn&gt; или &lt;ToggleOff&gt; и какой внутри них JSX. Всё завязано только на состоянии контекста. Это и есть сила композиции: пользователю библиотеки даются «кирпичики» (несколько компонентов), из которых он может сложить нужную конструкцию как ему необходимо, а не один монолитный компонент с десятком пропсов настроек.</p><p>Плюсы этого паттерна: огромная гибкость и выразительность. Хороший compound-компонент ощущается как маленький фреймворк. Например, библиотека @reach/ui (предшественник современной radix-ui) много компонентов строила через этот паттерн: диалоги, списки, выпадающие меню . Пользователю легко понять API —  просто вкладывай одни компоненты в другие. Появляется возможность тонко настроить итоговую разметку, вставить дополнительные элементы если надо, ведь внутри children мы не ограничены, можем обернуть тот же &lt;ToggleButton&gt; в какой-нибудь &lt;div&gt; с нужным классом. Проще поддерживать визуальное единообразие: все части контролируются одним контекстом, не размазывая логику по нескольким несвязанным компонентам.</p><p>Минусы: сложнее реализовать. Необходимо аккуратно продумать как компоненты будут взаимодействовать, предусмотреть, что некоторые могут отсутствовать или повторяться. Если неправильно спроектировать составной компонент, можно столкнуться с багами: например, если &lt;ToggleButton&gt; случайно использовать вне &lt;Toggle&gt; (то есть вне своего провайдера), useContext вернёт undefined и будет ошибка — надо либо избегать такого, либо делать проверки и бросать понятное сообщение об ошибке (мол, «ToggleButton ОБЯЗАТЕЛЬНО должен быть потомком Toggle»).</p><p>Ещё один момент связан с производительностью, когда контекстное значение меняется, все потребители контекста перерендерятся. Например, при каждом клике toggle выше перемонтируются и &lt;ToggleOn&gt;, и &lt;ToggleOff&gt;, и &lt;ToggleButton&gt;. В нашем случае это конечно пустяки, но если бы у нас был десяток сложных для ререндера children'ов, подписанных на контекст, и состояние менялось часто, нужно было бы подумать об оптимизации (разбивке контекстов или мемоизации).</p><p>Тем не менее плюсы обычно перевешивают: паттерн Compound Components позволяет создать очень понятный и гибкий пользовательский API для ваших компонентов. Это проявление философии React — композиция важнее наследования. Вместо того чтобы делать сложный компонент с кучей условий, мы делаем набор простых компонентов, которые в комбинации собираются в сложное поведение.</p><p>Compound Components — довольно «профессиональный» паттерн. В небольших приложениях вы можете не столкнуться с необходимостью его реализовывать, но если разрабатываете библиотеку компонентов, как я в своём пет-проекте, или сложный виджет, такой подход —  чуть ли не необходимость. Практически все продвинутые React UI-библиотеки (Material UI, Chakra, Radix и т.д.) используют контекст и композицию под капотом для своих сложных компонентов.</p><h2>Серверные компоненты и Suspense: современные возможности React</h2><p>Наконец, давайте поговорим о новейших возможностях, которые принесли нам 18 и 19 версии React’а. Они направлены на улучшение работы с асинхронностью, данными и рендерингом на стороне сервера. В первую очередь, React Suspense и Server Components. Эти вещи ещё не до конца устоялись в среде разработчиков, но их стоит держать в уме.</p><h3>Suspense — ожидание с комфортом</h3><p>Когда интерфейсу нужно загрузить данные, всегда возникает задача — показать индикатор загрузки, пока всё не готово. Раньше приходилось вручную писать логику, часто это бывало состояние isLoading и условный рендер либо спиннера, либо контента. С появлением React Suspense командой React был предложен более декларативный способ. Suspense — это специальный компонент, который позволяет нам приостановить рендеринг своих дочерних компонентов, пока те не готовы, и в это время показать fallback UI.</p><p>Проще говоря, мы оборачиваем часть дерева компонентов в &lt;Suspense fallback={&lt;Loader/&gt;}&gt; ... &lt;/Suspense&gt;, и если внутри этой области происходит задержка (например, идёт загрузка кода или данных), React сам автоматически покажет &lt;Loader&gt; вместо содержимого, а когда всё завершится — отобразит наши компоненты. Suspense берёт на себя координацию этого процесса, освобождая нас от ручного управления состоянием загрузки.</p><p>Сегодня Suspense широко используется для ленивой загрузки компонентов (React.lazy + &lt;Suspense&gt;). Например:</p><p>Здесь компонент Comments будет подгружён по требованию (и в отдельном бандле). Пока бандл не загрузится, пользователь увидит текст-заглушку «Комментарии загружаются...». Как только код придет, React отрисует &lt;Comments&gt;. Всё это без какого-либо специального кода внутри ArticlePage для отслеживания загрузки. Suspense сам разрулит ситуацию —  React.lazy под капотом бросает Promise на время загрузки, а &lt;Suspense&gt; ловит его и показывает фоллбэк.</p><p>Кроме ленивой загрузки кода, Suspense постепенно начинает применяться и для асинхронных данных. В React 18 появился экспериментальный API, позволяющий Suspense работать с данными, например, можно использовать специальный use для ожидания промиса прямо внутри компонента (пока официально не стабильно, но фреймворки типа Next.js 13 уже вовсю используют это). Идея та же: компонент, который загружает данные, вместо того чтобы сразу вернуть JSX, может приостановить своё выполнение до получения данных. React, обнаружив это, покажет fallback, а когда данные придут — продолжит рендер компонента. Таким образом, можно писать компонент, который выглядит синхронным, хотя внутри у него асинхронный код — за счёт Suspense'а пользователю не покажется незавершённый результат.</p><p>Признаться, Suspense для работы с данными — пока штука из области экспериментов. Если вы пишете обычное приложение на Vite или CRA без Next, то прямо сейчас использовать Suspense для загрузки данных «из коробки» не выйдет —  потребуется либо сторонняя библиотека (например, React Query пока не интегрирован с Suspense по умолчанию, но планирует), либо фреймворк. Однако направление понятное: React движется к тому, чтобы сделать работу с асинхронностью более декларативной. Уже сейчас вы можете использовать Suspense для спиннеров и заглушек при загрузке кода, а в ближайшем будущем, вероятно, подобный подход станет нормой и для данных (в React 19+ должны появиться официальные инструменты для этого).</p><p>Подводя итог по Suspense: этот паттерн позволяет очень аккуратно организовать отображение состояния загрузки. Вместо большого количества условных isLoading ? &lt;Spinner&gt; : &lt;Content&gt; мы просто заявляем: «Эта часть UI может задержаться, показывай пока вот это». Это улучшает UX (пользователь видит скелетон или лоадер без моргания незагруженного контента) и упрощает код. Обязательно следим за развитием Suspense — возможно, скоро он будет использоваться намного чаще, чем сейчас.</p><h2>Серверные компоненты —  React выходит на сервер</h2><p>Ещё одна революционная идея команды React — React Server Components (RSC), или серверные компоненты. Это попытка объединить лучшее из мира серверного рендеринга и клиентских SPA. Смысл в том, что если часть ваших React-компонентов может выполняться только на сервере, генерируя готовый HTML, который отправляется клиенту, то пусть они и исполняются на сервере, не загружая клиент. Эти компоненты никогда не попадают в бандл JS, не несут в себе интерактива — они чисто для рендеринга контента. Другая часть компонентов всё также остаётся клиентской, это давно знакомые нам React-компоненты, которые умеют обрабатывать события, имеют какое-то своё состояние и т.д. Разделение происходит явно: React различает, какой компонент предназначен для сервера, а какой — для клиента.</p><p>Как же React понимает, в какой среде выполнять код компонента? Введена директива "use client": если файл компонента начинается с этой строки, то компонент клиентский, он будет собран в JS и выполнится в браузере. Если же такой строчки нет —  компонент считается серверным и по умолчанию выполнится на сервере (например, при рендеринге страницы на Node.js). Серверный компонент может содержать асинхронный код (запросы к БД, файловой системе и т.п.), ведь он запускается в среде сервера. Но он не может использовать, например, useState или useEffect, ведь у него нет постоянного состояния между запросами, да и доступ к DOM он не имеет.</p><p>React 18 (и в полной мере React 19) позволяет фреймворкам использовать эту возможность. Например, Next.js 13 с новым app/ роутером делает все компоненты по умолчанию серверными, если не указать "use client". Таким образом, большую часть страницы вы можете рендерить на сервере, отдавая сразу на клиент сразу готовую разметку, а для интерактивных элементов использовать клиентские компоненты.</p><p>Преимущества Server Components:</p><ul><li>Производительность. Серверные компоненты избегают гидрации, клиенту не нужно повторно исполнять JS, чтобы восстановить состояние UI. Вы получаете выгоды SSR (быстрый первый рендер, минимум работы на клиенте) без обычных недостатков SSR (необходимость гидрации большого объёма HTML).</li><li>Безопасность. Чувствительный код остается на сервере, не попадает в бандл, и данные можно получать напрямую на сервере (например, напрямую из базы) без передачи ключей API в браузере.</li><li>Размер бандла существенно сокращается, ведь клиент вообще не получает код серверных компонентов, только итоговую HTML разметку и нужный JS для оставшихся клиентских компонентов.</li></ul><p>Как это выглядит на практике? Самый понятный пример:</p><p>Представим блог. Страницу поста можно сделать целиком серверным компонентом, на сервере загрузится пост из БД и вернёт нам готовую верстку статьи. А вот кнопка лайка или форма добавления комментария — это уже интерактив, их делаем клиентскими компонентами. В результате пользователь, заходя на страницу, сразу же получит полностью готовую страницу поста (никакого лоадера, всё пререндерено). А JS-код загрузится для кнопки лайка и формы комментария, и только они будут гидрироваться и начнут работать на клиенте. Это сочетание SSR и SPA, orchestrated by React.</p><p>React строго определяет, как серверные и клиентские компоненты могут взаимодействовать. Серверный компонент может импортировать и использовать другой серверный или клиентский компонент, а вот клиентский компонент не может импортировать серверный. То есть дерево может быть: Серверный → внутри него Клиентский → внутри него ещё Клиентский и т.д. Но не наоборот. В примере выше серверный компонент страницы может рендерить внутри себя &lt;LikeButton /&gt; (клиентский компонент кнопки). А если бы вы попробовали внутри клиентского компонента сделать import PostDetails from './PostDetails.server.jsx' — сборка не позволит, скажет, что так нельзя. Таким образом, архитектура разделяется: «верхние» уровни страницы —  серверные, «листья» интерактивности — клиентские.</p><p>Server Components — пока прерогатива фреймворков. То есть в обычном приложении вы не сможете воспользоваться этим вручную без большого труда. Но если вы работаете с Next.js, Remix или в целом с fullstack React-приложениями, то RSC уже доступны. В React 19 они обещают быть полностью стабильными (в React 18 это скорее эксперимент для энтузиастов). Библиотеки тоже начинают подстраиваться: например, React Router v7 планирует поддерживать RSC, Vite тоже экспериментирует с этим.</p><p>Что в итоге нам дают серверные компоненты? Потенциально — большой скачок в производительности и удобстве разработки fullstack приложений. Мы получаем паттерн разделения по среде: какие компоненты должны рендериться на сервере, а какие — на клиенте. Это новое измерение при проектировании React приложения. Разработчику теперь нужно будет думать не только о разделении логики и UI, или о переиспользовании кода, но и решать, где лучше его выполнить — на сервере или в браузере. Правильное использование RSC может значительно ускорить приложение без лишних усилий для разработчика (React сам решит, когда и что подгружать, синхронизирует состояние между сервером и клиентом).</p><p>С другой стороны, появляется дополнительная сложность в понимании: нужно чётко осознавать ограничения (например, нельзя в серверном компоненте использовать useEffect, или что состояние в серверном компоненте не сохраняется между запросами). Но это всё решается практикой и хорошей документацией.</p><h2>Заключение</h2><p>Мы рассмотрели ключевые паттерны React и даже заглянули в будущее React-архитектур.</p><ul><li>Container &amp; Presentational Components привносят порядок, отделяя логику от отображения.</li><li>HOC и Render Props —  старые приёмы для переиспользования кода, которые в значительной мере вытеснены более современными хуками, но по прежнему встречаются в проектах.</li><li>Compound Components демонстрируют силу композиции, предоставляя API для гибкой сборки компонентов из небольших частей.</li><li>А Suspense и Server Components — это уже ближайшее будущее, делающее работу с асинхронностью и рендерингом более эффективной и декларативной.</li></ul><p>Важно понимать, что паттерны — это не нерушимые догмы. В каждом конкретном случае их нужно применять с умом. Порой проще обойтись без паттерна, чем усложнять архитектуру ради «красивого» решения. Не нужно лишний раз оверинженирить. Однако знание этих подходов обогащает ваш инструментарий. Когда вы сталкиваетесь с определённой проблемой, на подкорке всплывёт: «ага, здесь бы подошёл такой-то паттерн!» Опытный разработчик видит несколько вариантов реализации и выбирает оптимальный.</p><p>От себя добавлю: изучая паттерны, всегда пробуйте их в деле. Напишите свой HOC, переделайте компонент с Render Props на хук, реализуйте небольшой набор Compound Components — так вы прочувствуете их сильные и слабые стороны. React развивается, и появляются новые приёмы, но фундаментальные идеи (композиция, разделение обязанностей, явное управление состоянием) остаются. Владейте этими инструментами, и ваши React приложения будут благодарить вас чистотой и поддерживаемостью кода!</p><p>Паттерны в React нужно не только знать, но и применять. Собрали полезные инструменты <a href="https://t.me/+iKEwDxvulHFkZDhi">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Context Collapse: как микросервисы могут сойти с ума</title>
      <link>https://tproger.ru/articles/context-collapse--kak-mikroservisy-mogut-sojti-s-uma</link>
      <comments>https://tproger.ru/articles/context-collapse--kak-mikroservisy-mogut-sojti-s-uma?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/context-collapse--kak-mikroservisy-mogut-sojti-s-uma</guid>
      <description><![CDATA[<p>Даже самая идеальная микросервисная архитектура может упасть. В статье обсудим зарубежный материал, где автор рассказывает о проблеме Context Collapse.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/context-collapse--kak-mikroservisy-mogut-sojti-s-uma">Context Collapse: как микросервисы могут сойти с ума</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Mar 2025 12:40:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>В феврале на Medium вышла статья <a href="https://levelup.gitconnected.com/context-collapse-the-silent-microservices-killer-76a60058561e">Context Collapse: The Silent Microservices Killer</a>. Перевели ее для вас, так как тема довольно редкая и интересная. Ниже предлагаем обсудить проблему контекста и как он может упасть.</p><h2>Что вообще такое context collapse</h2><p>Есть вероятность, что вы слышите этот термин в первый раз. Немного лирики: в мире микросервисов есть два понятия: технический контекст и доменный контекст (Bounded Context).</p><h2>Технический контекст</h2><p>Технический контекст — это информация, которая передается между микросервисами для выполнения запросов или операций. В нем лежит большое количество данных: идентификаторы запросов (например, TraceID в трассировке), пользовательские сессии, метаданные или параметры аутентификации.</p><p>Без технического контекста микросервисы не могут:</p><ul><li>отслеживать, откуда пришел запрос и куда он направляется,</li><li>сохранять согласованность данных между сервисами,</li><li>выявлять сбои (например, через логи или трассировку).</li></ul><h2>Доменный контекст (Bounded Context)</h2><p>Доменный контекст происходит из методологии Domain-Driven Design (DDD) — это про четкое разделение бизнес-логики между микросервисами. У каждого сервиса должна быть своя «ограниченная область» (Bounded Context), где термины, данные и правила имеют уникальное значение.</p><p>Например, в интернет-магазине слово «заказ» может означать разные вещи для сервиса оплаты (финансовая транзакция) и сервиса доставки (отправка покупателю). Если границы контекста не определены четко, возникает путаница: сервисы начинают дублировать логику или интерпретировать данные по-разному.</p><p>Без доменного контекста:</p><ul><li>код будет дублироваться и появится избыточность,</li><li>усложнится взаимодействие между сервисами,</li><li>систему будет сложнее поддерживать.</li></ul><h2>Вернемся к коллапсу контекста</h2><p>Автор статьи просит нас представить следующую картину: вы сделали новую архитектуру, она масштабируется, разделяется, деплои проходят гладко, CI/CD пайплайны цветут и пахнут — другими словами, не архитектура, а мечта. Все работает как часы, поэтому вы сидите, попивая кофе и раскладывая пасьянс.</p><p>Вдруг приходит пользователь и сообщает, что платеж был проведен дважды. На панели мониторинга появляются задержки, и логи здесь вообще бесполезны. Вы начинаете разбираться и спустя несколько часов споров с терминалом, находите причину: один из сервисов забыл, кто вообще такой этот пользователь, прямо во время проведения транзакции.</p><p>Тра-та-та, это и есть контекстный коллапс. Как называет его автор — тихий убийца микросервисов в 2025 году. Поймать этот баг с помощью breakpoints нельзя, при этом он будет уничтожать вашу производительность и код в целом.</p><h2>Что на самом деле происходит</h2><p>Представьте, что микросервисы — это эстафетный забег: каждый сервис передает «эстафетную палочку» — идентификаторы пользователей, сессионные данные, намерения — следующему участнику. Контекстный коллапс случается, когда эта палочка выпадает на бегу.</p><p>Сервис теряет важное состояние, например:</p><ul><li>«Это корзина Пети»</li><li>"Этот платеж уже прошел"</li></ul><p>И начинается хаос: дублирующиеся API-запросы, потерянные транзакции или, что еще хуже, повреждение данных.</p><p>В 2025 году появляется все больше слишком фрагментированных архитектур и гипермасштабируемых систем. Ваши запросы могут проходить через 10, 20 и даже 30 сервисов, но если на каком-то этапе отвалился контекст, то это конец.</p><p>В статье автор не делает акцента на том, какой именно это контекст — технический или доменный. На самом деле может произойти все что угодно: это может быть как потеря технического контекста, так и нарушение доменных границ (когда сервисы лезут не в свое дело). Оба случая приводят к хаосу: данные становятся несогласованными, ошибки множатся, а разработчики теряют контроль над системой.</p><h2>Как понять, что контекст вот-вот может «коллапснуться»</h2><p>Вы наверняка были в такой ситуации: вы на 100% уверены, что система должна работать, но она не работает, хотя ошибок в коде никаких, казалось бы, нет. Вот основные признаки коллапса, с которыми вы можете столкнуться:</p><ul><li>Всплеск пинга: сервисы запрашивают данные, которые должны бы уже знать, создавая огромное количество лишних вызовов и перегружая API.</li><li>Дублирующиеся действия: повторные списания, задвоенные отправки писем, неожиданные повторные заказы. Пользователи возмущены, рейтинг падает.</li><li>Мистические баги: логи говорят «всё в порядке», но результат явно неверный. Код не видит проблему, а отладка превращается в кошмар.</li></ul><p>Давайте рассмотрим на примере. Клиент решает перевести деньги с одного счёта на другой. Сервис транзакций отправляет запрос в модуль проверки лимитов, затем передаёт его в систему обработки платежей. Но из-за потери контекста на одном из этапов модуль проверки лимитов теряет информацию о сессии клиента и воспринимает его как нового пользователя. В результате:</p><ul><li>Лимиты не распознаются, и транзакция блокируется, даже если у пользователя достаточно денег.</li><li>Либо, наоборот, проверка пропускается, и клиенту позволяют перевести больше лимита.</li><li>Сервис обработки платежей не получает подтверждение проверки и отправляет повторный запрос, а это может привести к двойному списанию средств.</li></ul><p>Клиент идет громить службу поддержки, она — разработчиков, а они размахивают руками, потому что в логах все отлично.</p><p>Опрос CNCF за 2024 год показал, что 68% команд, которые используют микросервисы, сталкиваются с необъяснимыми проблемами производительности. И всему виной в том числе контекстный коллапс.</p><h2>5 решений, как бороться с контекстным коллапсом</h2><p>Да, контекстный коллапс — крайне неприятный баг. Главное — чтобы все сервисы работали слаженно и «знали» друг друга.</p><h3>1. Правильно передавайте контекст</h3><p>Вам нужно передавать критические важные данные — идентификаторы пользователей, состояние транзакций, метаданные запроса — в каждом шаге цепочки. Стоит использовать OpenTelemetry, чтобы распространять контекст по сервисам.</p><p>Вот пример реализации middleware автором на Go:</p><h3>2. Кэшируйте с умом</h3><p>Нет смысла заставлять сервисы угадывать, если они просто могут запомнить. Быстрый кэш, например, с Redis, может хранить временный контекст — например, токены сеанса или состояния запросов, — поэтому сервисы не будут постоянно спрашивать «кто это?» Вот фрагмент кода на Питоне, где используется Redis для хранения и извлечения контекста:</p><p>Это позволяет поддерживать контекст во всех вызовах, не перегружая вашу базу данных. А еще TTL (time-to-live) Redis сам за собой убирает — устаревшие данные не скрываются.</p><h3>3. Используйте Event-Driven Architecture</h3><p>Микросервисы без сохранения состояния выглядят отлично, пока не контекст не коллапснется. Событийная архитектура идет от обратного: вместо того чтобы надеяться, что службы все запомнят, регистрируйте каждый шаг как событие. Если служба все-таки забудет, воспроизведите поток. Вот пример на Node.js с Kafka:</p><p>Здесь также можно использовать RabbitMQ. В общем, больше никаких отговорок со стороны сервиса из разряда «я забыл».</p><h3>4. Проверяйте логи</h3><p>Когда контекст теряется, логи — ваше место преступления. Настройте Grafana Loki или Datadog для поиска «потерянных контекстов». Вот пример с Grafana:</p><p>Тэгните логи с помощью request_id или user_id, а затем вызовите Loki:</p><h3>5. Тестируйте на коллапсы</h3><p>Профилактика лучше, чем лечение. Добавьте хаос-тестирование с помощью, например, Chaos Mesh, чтобы моделировать потери контекста.</p><p>Хаос-тестирование — это метод преднамеренного введения сбоев в систему, чтобы проверить, насколько она устойчива и надежна. Обычное тестирование и мониторинг могут выявить проблемы, но хаос-тестирование (Chaos Engineering) помогает увидеть, как система поведет себя в случае неожиданных отказов.</p><p>Прервите mid-requests к сервисам — сможет ли система восстановится в таком случае? Если нет, значит, ваша передача контекста недостаточно надежна.</p><p>Эти решения не универсальны. Начните с правильного распространения контекста для быстрых улучшений, затем добавьте кэширование или событийную архитектуру для масштабируемости и постоянно аудируйте систему.</p>]]></content:encoded>
    </item>
    <item>
      <title>Новый компилятор TypeScript на Go собирает код быстрее, но не делает его быстрее</title>
      <link>https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree</link>
      <comments>https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree</guid>
      <description><![CDATA[<p>Microsoft переписала компилятор TypeScript на Go: сборка быстрее в 10 раз, но код работает так же. Что это меняет для разработчиков</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree">Новый компилятор TypeScript на Go собирает код быстрее, но не делает его быстрее</a>»</p>]]></description>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Mar 2025 05:07:21 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Microsoft переписывает компилятор TypeScript с JavaScript на Go</b> и <b>обещает 10-кратный прирост производительности</b>.</p><p>Новость быстро разлетелась по сообществам, но на деле всё не так однозначно, <a href="https://www.architecture-weekly.com/p/typescript-migrates-to-go-whats-really">пишет</a> разработчик Оскар Дудич в рамках Architecture Weekly.</p><p><b>Речь идёт о скорости компиляции, а не исполнения кода</b>. Ваши приложения не станут работать быстрее — только собираться. Это как если бы производитель автомобилей сказал, что «машина стала в 10 раз быстрее», а потом уточнил, что речь о производстве, а не скорости на трассе.</p><h2>Почему решили переписать и причём тут Go</h2><p><b>Компилятор — это CPU-bound задача</b>. Он не ждёт ответа от базы данных и не занимается сетевыми запросами. Он грузит процессор на полную, разбирая дерево типов, анализируя код и генерируя выходной файл.</p><p><b>Node.js с его однопоточной моделью и event loop плохо подходит для таких задач</b>. Он отлично работает в веб-серверах — там важна скорость отклика и работа с I/O, но не тяжёлые вычисления. Компилятор TypeScript вырос, стал сложнее, и старая архитектура начала тормозить.</p><p><b>Go здесь оказался подходящим выбором:</b></p><ul><li>у него есть <b>легковесные потоки (goroutines)</b>;</li><li><b>параллельное выполнение</b> встроено на уровне языка;</li><li>нет нужды в трюках с worker threads, как в Node.js;</li><li>проще работать с памятью и сложными структурами.</li></ul><h2>Почему просто не использовать worker threads в Node.js?</h2><p>Это возможно, и они действительно дают параллельность. Но:</p><ul><li><b>переписывать старый код с учётом многопоточности — больно</b>;</li><li>обмен данными между потоками в Node.js идёт через сериализацию;</li><li>каждый поток создаёт свой V8-инстанс, что дорого по ресурсам.</li></ul><p><b>Команда решила не латать старое, а начать с чистого листа</b>. И, как показали первые тесты, даже однопоточный Go-компилятор оказался быстрее, чем старый на Node.js.</p><h2>А что с браузерами и плагинами?</h2><p>Это пока не ясно. <b>В браузерах Go не работает нативно</b>, и придётся либо компилировать его в WebAssembly, либо сохранить JS-версию для playground'ов. Вопросов больше, чем ответов:</p><ul><li>как сохранить совместимость с TypeScript-плагинами;</li><li>будет ли 100% повторяемость в поведении компилятора;</li><li>изменятся ли ошибки, предупреждения и тонкости типов.</li></ul><h2>Зачем вообще об этом думать</h2><p><b>Это кейс о масштабировании и выборе инструментов</b>. То, что хорошо работало в 2012 году, перестаёт тянуть в 2025-м. Переписывание проекта — не всегда трагедия. Иногда это необходимость, если фундамент начал мешать росту.</p><p><b>Важно не повестись на «10x быстрее»</b>. Такие цифры всегда требуют контекста. Но и отрицать ценность изменений не стоит — особенно если вы работаете с большими кодовыми базами и каждый процент ускорения важен.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как отличить реальный код от AI-сгенерированного: шпаргалка для программистов</title>
      <link>https://tproger.ru/articles/kak-otlichit-realnyj-kod-ot-ai-sgenerirovannogo--wpargalka-dlya-programmistov</link>
      <comments>https://tproger.ru/articles/kak-otlichit-realnyj-kod-ot-ai-sgenerirovannogo--wpargalka-dlya-programmistov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-otlichit-realnyj-kod-ot-ai-sgenerirovannogo--wpargalka-dlya-programmistov</guid>
      <description><![CDATA[<p>Узнайте, как отличить реальный код от AI-сгенерированного. В этой статье мы поделимся простыми способами выявления сгенерированных алгоритмов и расскажем, на что стоит обращать внимание программистам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-otlichit-realnyj-kod-ot-ai-sgenerirovannogo--wpargalka-dlya-programmistov">Как отличить реальный код от AI-сгенерированного: шпаргалка для программистов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Жиза]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 27 Feb 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>С развитием ИИ-программирования всё сложнее определить, писал ли код человек или алгоритм. AI-генераторы уже умеют создавать чистые, рабочие решения, но у них есть характерные признаки, которые выдают их искусственное происхождение. Сегодня мы разберёмся, как отличить реальный код от сгенерированного ИИ: на что обращать внимание, какие паттерны встречаются чаще всего и почему важно уметь это распознавать.</p><h2>Почему это вообще важно?</h2><p>AI-инструменты уже не просто помогают разработчикам — они активно пишут код. GitHub Copilot, ChatGPT, Codeium и другие способны за секунды сгенерировать сложные алгоритмы, SQL-запросы, тесты и даже целые API. С одной стороны, это удобный способ ускорить разработку, снизить рутину и сделать код чище. Но с другой — AI-код не всегда надежен, а слепое копирование может привести к багам и уязвимостям.</p><p>Если раньше единственной угрозой было «гуглить решения на Stack Overflow», то теперь ситуация сложнее: AI-код может быть логически неверным, не соответствовать бизнес-требованиям или использовать устаревшие практики. При этом его сложно сразу раскритиковать — он выглядит идеально, четко структурирован и, на первый взгляд, работает.</p><p>Собрали основные причины, почему важно уметь отличать AI-код от написанного человеком:</p><ul><li>AI не всегда понимает контекст и может предложить небезопасные решения, например, SQL-инъекции или некорректную обработку данных.</li><li>AI не знает внутренних договоренностей команды, поэтому может генерировать код, который не вписывается в общую архитектуру.</li><li>AI не знает внутренних договоренностей команды, поэтому может генерировать код, который не вписывается в общую архитектуру.</li><li>AI может выдавать хоть и корректный, но совсем не соответствующий требованиям бизнеса код.</li><li>Некоторые AI-решения обучены на коде с лицензиями, несовместимыми с коммерческими проектами, что может привести к юридическим проблемам.</li></ul><p>Кроме того, AI-код всё чаще встречается не только в продакшн-решениях, но и на собеседованиях. Работодатели начали сталкиваться с кандидатами, которые просто копируют ответы из ChatGPT и не могут объяснить, как работает их код.</p><p>По данным <a href="https://survey.stackoverflow.co/2024/ai">Stack Overflow Developer Survey 2024</a>, более 70% разработчиков уже используют AI в кодинге, а 40% признались, что нейросети хоть раз предлагали им потенциально небезопасные решения. Поэтому сейчас важно не просто уметь пользоваться AI, но и понимать, где он может навредить.</p><h2>Где чаще всего встречается AI-код?</h2><p>AI-сгенерированный код может появиться где угодно: от свежего pull request’а в репозитории до ответа на Stack Overflow или тестового задания кандидата. Иногда это просто вспомогательные сниппеты, а иногда — полноценные фрагменты, которые выглядят слишком «чисто», но вызывают ощущение, что что-то не так.</p><p>Разберем, в каких ситуациях чаще всего встречается AI-код и как его распознать.</p><h3>Кодовые ревью</h3><p>Допустим, в репозиторий приходит pull request, и он выглядит… странно. Формально код работает, но:</p><ul><li>Он слишком абстрактный и не учитывает специфику проекта.</li><li>Переменные и методы названы шаблонно: processData(), getResponse(), handleRequest().</li><li>Комментарии избыточны или выглядят так, будто их писал учебник: «Этот метод сортирует массив по возрастанию» (да, спасибо, КЭП).</li><li>Код слишком формальный, без характерных для команды решений или оптимизаций.</li></ul><h4>Пример:</h4><p>Вы просите разработчика написать логику валидации email-адреса, а в PR прилетает нечто такое:</p><p>Формально всё корректно. Но если в вашем проекте уже есть встроенные механизмы валидации (например, DataAnnotations в .NET), такой код выглядит излишним. Кроме того, регулярка взята из учебников и не учитывает edge-кейсы. Это может быть явным признаком AI-генерации.</p><h3>Форумы и Stack Overflow: кто-то выкладывает красивый, но подозрительно академичный код</h3><p>AI-код часто появляется в ответах на Stack Overflow, GitHub Discussions или Reddit. На первый взгляд, он идеален, но:</p><ul><li>Не учитывает контекст задачи;</li><li>Не использует упрощения, принятые в реальной разработке;</li><li>Выглядит так, словно его писал преподаватель для учебного пособия.</li></ul><h4>Пример:</h4><p>Кто-то спрашивает: «Как перевернуть строку в Python?»</p><p>Ответ от AI:</p><p>Код технически правильный, но выглядит слишком заумно. Человеческий ответ скорее выглядел бы так:</p><p>Или</p><p>Люди обычно пишут проще и без ненужных комментариев.</p><h3>AI-код в legacy-проектах: «быстро сгенерили, а потом никто не разобрался»</h3><p>AI помогает быстро закрыть задачу, но иногда это оборачивается проблемами для будущих разработчиков. Представьте, в legacy-коде уже начали появляться фрагменты, которые никто не может понять, потому что их сгенерировал AI, а автор ушел из проекта (надеемся, не жиза).</p><h4>Пример:</h4><p>Вы находите в коде функцию, которая вроде бы что-то делает, но написана так, что ее никто не понимает:</p><p>Комментариев нет, названия переменных обобщенные. Оказывается, это было быстрое AI-решение для шифрования, но никто не знал, что тут XOR с чередующимися ключами.</p><p>Еще один тревожный сигнал — фрагменты кода, которые выглядят слишком универсально, но плохо вписываются в логику проекта. Например, в коде на C# встречается сложная реализация сортировки, хотя в .NET уже есть встроенные методы, делающие то же самое.</p><h3>Интервью и тестовые задания: как отличить, решал ли кандидат сам или просто скормил задачу нейросети?</h3><p>С ростом AI-разработки на собеседованиях всё чаще встречаются кандидаты, которые приносят решения из ChatGPT. Важно понять, действительно ли человек писал код сам, или просто скопировал без понимания.</p><p>Как распознать AI-код на интервью:</p><ul><li>Кандидат использует нестандартные или слишком формальные конструкции, которые редко встречаются в индустрии;</li><li>В коде много избыточных комментариев, будто их писал учебник;</li><li>Кандидат не может объяснить, почему использовал именно это решение;</li><li>В коде встречаются устаревшие или малоиспользуемые подходы.</li></ul><h4>Пример:</h4><p>Вы даете тестовую задачу: «Напишите функцию для поиска всех простых чисел до N».</p><p>AI-кандидат приносит это:</p><p>Формально всё правильно, но человек, скорее всего, объяснил бы решение проще и без таких заумных комментариев.</p><p>Как проверить такого кандидата? Лучший способ — попросить изменить или оптимизировать код. Если он не может объяснить каждую строчку или предложить альтернативный вариант, он, скорее всего, просто скопировал ответ из AI.</p><h2>Шпаргалка: 6 признаков, что код написан AI</h2><p>AI-код часто выглядит идеально с точки зрения синтаксиса, но его выдаёт стиль, структура и некоторые неестественные решения. Разберем шесть главных признаков, которые помогут быстро понять, что перед вами код от нейросети.</p><h3>Слишком академичный стиль</h3><p>AI часто пишет код так, будто это учебное пособие: использует полный формальный синтаксис, лишние комментарии и развернутые определения.</p><p><b>Пример:</b></p><p>Кто-то просит написать функцию на Python для поиска максимального значения в списке. Человек бы написал так:</p><p>AI же может предложить развернутый вариант:</p><p>Этот код работает, но выглядит так, словно вышел из учебника.</p><h3>Избыточные и очевидные комментарии</h3><p>AI очень любит комментировать вещи, которые понятны и без пояснений.</p><p><b>Пример:</b></p><p>Разработчики так не пишут — слишком очевидные комментарии просто мешают читать код.</p><h3>Неестественные или шаблонные названия переменных</h3><p>AI генерирует код по шаблону и часто использует слишком общие, но «правильные» названия.</p><p><b>Пример:</b></p><p>В реальности разработчик скорее назвал бы класс  CsvParser или LogAnalyzer, а не абстрактный DataProcessor.</p><h3>Неоптимизированные решения, игнорирующие стандартные библиотеки</h3><p>AI может создать велосипед, даже если есть готовое стандартное решение.</p><p><b>Пример:</b></p><p>Запрос: «Написать код, который объединяет строки в список с запятыми».</p><p>AI-код:</p><p>Но в Python есть встроенный join(), и нормальный разработчик написал бы просто:</p><h3>Код слишком универсален, но не учитывает реальный контекст</h3><p>AI пытается писать универсальные решения, даже если это не нужно.</p><p><b>Пример:</b></p><p>Допустим, нужна функция, которая складывает два числа. Человек просто сделает:</p><p>AI же может предложить универсальный метод с кучей проверок:</p><p>На вид хорошо, но зачем здесь проверка на отрицательные числа?</p><h3>Используются устаревшие или редко применяемые методы</h3><p>AI может выдавать код, который выглядит нормально, но использует уже неактуальные или малоиспользуемые подходы.</p><p><b>Пример:</b></p><p>Для чтения файлов в Python AI может предложить:</p><p>Хотя уже давно правильный вариант:</p><p>Так код выглядит безопаснее и не оставляет открытые файловые дескрипторы.</p><p>Хотя AI часто можно вычислить, это не значит, что его нельзя применять. Наоборот, в ряде случаев нейросети могут здорово ускорить работу разработчиков. Главное — понимать, где AI будет полезным помощником, а где может навредить. Рассмотрим несколько сценариев, в которых сгенерированный код действительно помогает.</p><h2>AI-код не всегда плох: когда его можно (и нужно) использовать</h2><h3>Генерация шаблонного кода (CRUD-операции, конфигурации, тесты)</h3><p>Разработчики часто сталкиваются с задачами, которые повторяются от проекта к проекту. Например, создать REST API с базовыми CRUD-операциями, написать конфигурационные файлы или сгенерировать unit-тесты.</p><p><b>Пример:</b></p><p>Допустим, нужно быстро создать контроллер для работы с сущностью User в Node.js + Express. Человек может вручную писать стандартные GET, POST, PUT и DELETE, а может поручить это AI:</p><p>Такой код вполне можно доверить AI, потому что он шаблонный и не требует сложной бизнес-логики.</p><h4>Когда стоит использовать?</h4><ul><li>Генерация стандартных CRUD-операций;</li><li>Создание базовых конфигурационных файлов (например, docker-compose.yml);</li><li>Автоматическое написание тестов для базовых сценариев.</li></ul><h3>Автоматизация рутинных задач (генерация SQL-запросов, скрипты для CI/CD)</h3><p>AI отлично справляется с рутинными задачами, которые требуют знаний синтаксиса, но не требуют креативности. Например, он может быстро сгенерировать сложный SQL-запрос или YAML-скрипт для CI/CD.</p><p><b>Пример:</b></p><p>Нужно составить SQL-запрос для получения списка клиентов, которые сделали заказ в последние 30 дней. AI может сразу предложить готовое решение:</p><p>Вручную писать такие запросы несложно, но если их много, AI может сэкономить кучу времени.</p><h4>Когда стоит использовать?</h4><ul><li>Написание SQL-запросов на основе простых описаний;</li><li>Генерация конфигураций CI/CD (например, .gitlab-ci.yml или Jenkinsfile);</li><li>Создание вспомогательных скриптов для автоматизации (например, bash-скриптов для деплоя).</li></ul><h3>Помощь в написании boilerplate-кода и документации</h3><p>Boilerplate — код, который нужен для работы приложения, но не несет уникальной бизнес-логики. Это могут быть шаблонные классы, интерфейсы, обработчики исключений и т. д.</p><p><b>Пример:</b></p><p>AI может быстро создать интерфейс для TypeScript на основе JSON-данных. Так:</p><p>AI-сгенерированный TypeScript-интерфейс:</p><p>Кроме того, AI может помочь с генерацией документации. Например, если нет комментариев, он их добавит, что особенно полезно при работе с чужим кодом.</p><h4>Когда стоит использовать?</h4><ul><li>Написание интерфейсов и типов для TypeScript или Java;</li><li>Генерация обработчиков исключений и логирования;</li><li>Автоматическое создание документации (например, для API в OpenAPI/Swagger).</li></ul><h3>Генерация идей, но не слепое копирование (AI как ассистент, а не разработчик)</h3><p>AI может быть полезен не только в коде, но и на этапе обсуждения архитектуры или поиска решений. Например, если есть задача оптимизировать алгоритм, можно спросить AI, какие методы использовать.</p><p>Пример:</p><p>Разработчик хочет ускорить поиск в огромном массиве данных. AI  предложит несколько алгоритмов (B-дерево, бинарный поиск, хеш-таблицы), а уже сам программист выберет, что подходит лучше.</p><h4>Когда стоит использовать?</h4><ul><li>Когда нужна структурированная подборка идей.</li><li>При изучении новых технологий — AI может быстро объяснить базовые принципы.</li><li>При генерации альтернативных решений, чтобы оценить их плюсы и минусы.</li></ul><p>AI — не замена разработчиков, а инструмент, который помогает ускорять работу. Его можно и нужно использовать для рутинных задач, но всегда с проверкой и пониманием контекста.</p><h2>Как научиться быстро определять AI-код?</h2><p>Понимание того, что перед вами код, сгенерированный AI, — не просто навык, а важная часть профессиональной гигиены разработчика. Поэтому важно научиться быстро отличать машинный код от человеческого. Разберем несколько стратегий.</p><h3>Задавайте себе правильные вопросы</h3><p>Когда видите код (в PR, на форуме, в тестовом задании), попробуйте мысленно пройтись по этим вопросам:</p><ul><li>Логична ли структура? Если код выглядит идеально отформатированным, но при этом содержит нелогичные или избыточные конструкции, это подозрительно.</li><li>Есть ли повторения? AI любит дублировать куски кода, даже если их можно оптимизировать.</li><li>Реализация слишком академичная? Если код выглядит так, будто его писал профессор компьютерных наук, но без учета реального использования — возможно, его сгенерировал AI.</li><li>Код соответствует задаче или просто «выглядит умно»? Иногда AI генерирует код, который слишком сложен для простой задачи. Например, вместо for-цикла он может предложить рекурсивный алгоритм без реальной необходимости.</li></ul><h3>Сравнивайте с примерами из реального продакшен-кода</h3><p>Если вам кажется, что код написан AI, попробуйте сравнить его с примерами из проектов, над которыми работали вы или ваши коллеги. Настоящий код часто:</p><ul><li>содержит «следы» работы команды (специфичные комменты, соглашения по именованию, использование внутренних утилит),</li><li>ориентирован на реальное использование, а не «идеальный синтаксис»,</li><li>имеет свою логику форматирования (не всегда академически правильную).</li></ul><h3>Проверяйте код на избыточность и неестественные конструкции</h3><p>AI часто генерирует код, который формально правильный, но содержит странные избыточные решения. Например:</p><ul><li>Ненужные проверки (if True:);</li><li>Лишние константы вместо прямых значений;<br /></li><li>Чрезмерная типизация в языках, где это необязательно;<br /></li><li>Странные циклы, когда можно использовать встроенные методы.</li></ul><p>Определять AI-код — навык, который развивается с опытом. Главное — обращать внимание на логику, осмысленность и соответствие реальным сценариям использования. Если код кажется слишком правильным, но при этом странным — скорее всего, его написал не человек.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что такое cookies, localStorage и sessionStorage: главные отличия и примеры</title>
      <link>https://tproger.ru/articles/chto-takoe-cookies--localstorage-i-sessionstorage</link>
      <comments>https://tproger.ru/articles/chto-takoe-cookies--localstorage-i-sessionstorage?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-takoe-cookies--localstorage-i-sessionstorage</guid>
      <description><![CDATA[<p>Что такое cookies, localStorage и sessionStorage. Показываем основные отличия и примеры кода. Рассматриваем пошаговую инструкцию и важные особенности каждого вида ✔ Tproger
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-takoe-cookies--localstorage-i-sessionstorage">Что такое cookies, localStorage и sessionStorage: главные отличия и примеры</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Персональные данные]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Feb 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Работа современных сайтов и приложений неизбежно связана с сохранением данных на стороне клиента. Эти данные применяются в других частях веб-ресурсов или используются в следующих сессиях. Например, на сайте онлайн-магазина пользователь сохраняет товары в корзине и завершает сессию. Когда он возвращается на сайт, он может продолжить покупку, не потеряв свои товары.</p><p>Как это реализуется на практике? Есть несколько способов работы с информацией. Наиболее востребованные из них — это cookies, localStorage и sessionStorage. Эти инструменты отличаются друг от друга, но далеко не все разработчики могут объяснить разницу между ними.</p><p>Узнаем, что собой представляют cookies, localStorage и sessionStorage, каковы их основные характеристики и особенности, как они применяются и какой способ работы с данными лучше.</p><h2>Cookies</h2><p>На заре интернета cookies были безальтернативным вариантом хранения данных на стороне клиента. Файлы куки представляют собой элементарные пары типа «ключ-значение» и используются для:</p><ul><li>управления текущими сессиями;</li><li>персонализации пользователя;</li><li>отслеживания его активности.</li></ul><p>При этом данные не просто остаются в хранилище в браузере, но и передаются на серверы в виде HTTP-заголовков, выступая частью спецификации протокола. Cookies поддерживают все браузеры — это универсальный способ работы с информацией. И хотя объем данных для хранения ограничен, производительность этого способа — крайне важный показатель для работы современных веб-ресурсов.</p><p>По сути куки — это ограниченные по размеру текстовые файлы, которые сайт сохраняет на устройстве пользователя. Объем данных в «печеньках» лимитирован — это не больше 4 КБ, при этом у них есть срок хранения, который устанавливает разработчик ресурса.</p><p>Например, в Google есть файлы аналитики для сбора информации, которые хранятся от 6 до 24 месяцев. Некоторые cookies действуют только в период работы в браузере и при закрытии автоматически уничтожаются, другие хранятся в течение всего перерыва между сессиями — их срок жизни зависит от выполняемых задач.</p><p>Куки почти идеальный инструмент для идентификации посетителя, но сам пользователь может отключить их почти на любом ресурсе, что делает «печеньки» недостаточно надежным хранилищем информации.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-02-25/444a9012-6723-4a77-9166-14e4b8210d2f.png" alt="" /></figure><p>Развитие этого инструмента продолжается. Например, в экосистеме Chromium доступна версия, которая поддерживает общую память и асинхронный API CookieStore — им можно пользоваться без блокировки главного потока.</p><p>Закрепим основные характеристики cookies:</p><ul><li>сохраняют данные, которые передаются на сервер с помощью заголовков;</li><li>локальные и сессионные куки-хранилища существуют только на стороне клиента;</li><li>сроки хранения устанавливаются заранее при создании куков;</li><li>объем ограничен (4 КБ);</li><li>бывают защищенные куки, но в этом случае их содержимое будет недоступным на клиентской стороне — такой формат используется для аутентификации пользователей при хранении их токенов.</li></ul><p>Способ хранения данных в cookies имеет определенные ограничения. Чтобы сохранить корректность запроса, содержимое должно быть закодированным и безопасным. При этом интерфейс для чтения и записи cookies не всегда удобный, что вынуждает разработчиков работать с ним не напрямую, а через сторонние библиотеки.</p><p>Этот способ применяют, чтобы сохранить данные авторизации либо когда доступ к сохраненным данным требуется на сервере. Кроме того, куки применяют компании, чтобы отслеживать поведение пользователей, но сами браузеры активно этому противодействуют.</p><p>Разработчики на JavaScript используют свойство document.cookie, которое предоставляет строковый формат для работы всех cookies, связанных с текущим процессом. Пример кода:</p><p>В этом примере для установки cookie разработчик присваивает строку свойству document.cookie. Можно задать дополнительные свойства — например, срок действия, путь или домен.</p><p>У файлов cookie довольно широкая область применения — хранение настроек юзера, удержание посетителей сайта, хранение сведений о текущем сеансе, показ целевой рекламы. При этом файлы устанавливает конкретный сервер, и только он может их прочитать.</p><p>Разработчики устанавливают и читают cookie через заголовки Set-Cookie и Cookie непосредственно в протоколе HTTP. В приложениях куки устанавливают и считывают с помощью соответствующего API либо модуля файлов cookie на одном из серверных языков — например, Node.js.</p><p>Среди рядовых юзеров интернета бытует мнение, что куки вредны и опасны. Это не совсем верно. Сами по себе эти файлы не представляют угрозы для данных — они не содержат вирусы и не могут установить на устройство вредоносное ПО. Но если злоумышленники получат доступ к cookies на вашем устройстве, они будут знать все о сеансах конкретного посетителя и могут использовать эти сведения в своих целях.</p><p>Существует риск, что при работе на компьютерах с публичным вай-фаем или при подключении через чужие взломанные устройства, личные данные могут быть похищены. Определенные уязвимости, связанные с cookie, могут возникать на сайтах онлайн-магазинов, которые уделили недостаточно внимания информационной безопасности.</p><p>Чтобы минимизировать риски, юзеру при посещении незнакомых сайтов или при использовании публичных сетей лучше отказаться от автоматического приема куки-файлов. Альтернативный вариант — входить инкогнито.</p><h2>LocalStorage</h2><p>Это более продвинутый формат хранилища в браузере, позволяющий сайтам сохранять больше информации без ущерба для трафика. LocalStorage создали в качестве альтернативы cookie, чтобы обойти ограничения последних. А именно — небольшой объем хранилища, необходимость постоянно передавать данные с сервера в браузер и обратно. В localStorage работа с данными стала проще и эффективнее.</p><p>В локальном хранилище, в отличие от сеансового, данные сохраняются после закрытия и повторного открытия страницы. Файлы работают до тех пор, пока пользователь их не очистит или это не сделает код на JavaScript.</p><p>Информация хранится в формате «ключ-значение» в виде строк. Даже если ввести числовые или логические данные, они преобразуются в строчные. Для использования хранилища в JavaScript используют объект localStorage.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-02-25/07284145-9813-4c0b-aa55-b68172e7de1c.png" alt="" /></figure><p>Пример кода:</p><p>Запись напоминает код для сеансового хранилища. Метод setItem() используется для хранения данных, метод getItem() — для их получения, removeItem() — для удаления конкретных элементов, clear() — для полной очистки данных. Несмотря на то, что в localStorage сохраняются только строки, с помощью JSON разработчики могут взаимодействовать и с более сложными типами данных.</p><p>Основные характеристики localStorage:</p><ul><li>данные хранятся бессрочно;</li><li>очистить хранилище можно только принудительно — через код JavaScript или полную очистку браузерного кэша пользователем;</li><li>объем данных для хранения — 5-10 МБ (по этому показателю localStorage лидирует среди всех хранилищ);</li><li>старыми браузерами не поддерживается — например, на IE7 это локальный ящик не работает;</li><li>действует по принципу ограничения домена — сохраненная информация доступна лишь одному источнику.</li></ul><p>Поскольку данные не исчезают даже после закрытия компьютера, сайты на длительный срок сохраняют нужную им информацию — в первую очередь это предпочтения пользователя и его настройки.</p><p>Эффективность хранилища в том, что данные не нужно отправлять на сервер при каждом запросе, что позволяет хранить больше информации. localStorage особенно полезны для сохранения индивидуальных настроек — фильтров, размеров окон на сайте, выбора светлой/темной темы и т.д. Благодаря свойствам и размеру хранилища, с некоторыми приложениями юзер может работать и в офлайне.</p><h2>SessionStorage</h2><p>Способ работы с данными sessionStorage во многом аналогичен localStorage, но есть принципиальное отличие — после закрытия браузера данные полностью удаляются. Это не означает, что sessionStorage — хуже, просто у него другая сфера применения. В частности формат идеален для хранения данных, актуальных в рамках конкретной сессии — например, информации при заполнении формы или вводе данных банковской карты.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-02-25/c4040c74-e2e9-41b5-a18b-7cf41465d5b3.png" alt="" /></figure><p>Объем хранилища ограничен, но в большинстве случаев этого достаточно для хранения инфы в пределах одного сеанса. Данные по сути не защищены, так что вопрос приватности — забота пользователя.</p><p>Хранилище сеансов поддерживается всеми актуальными браузерами — данные находятся в полной доступности, пока открыты вкладки и окна. Если пользователь закрывает окно, происходит автоматическая очистка.</p><p>Для подключения сеансового хранилища разработчики на JavaScript используют объект sessionStorage и методы для получения, установки и удаления данных.</p><p>Пример кода:</p><p>Как видите, есть определенное сходство с localStorage, поскольку у хранилищ одинаковый алгоритм работы. Метод setItem() применяется для сохранения данных (первый аргумент — ключ, второй — значение), метод получения — removeItem(), для очистки используется метод clear().</p><p>Основные характеристики sessionStorage:</p><ul><li>данные хранятся в течение одной сессии, после закрытия браузера очищаются;</li><li>хранилище использует контекст браузера верхнего уровня, то есть в каждой вкладке содержатся уникальные данные;</li><li>объем данных — 5 МБ;</li><li>старые браузеры формат не поддерживают.</li></ul><p>Если вы открываете другую вкладку с той же страницей, там будут храниться уже другие данные. При этом перезагрузка страницы на данные не влияет, но если прервется сессия (например, временно отвалится интернет) информация обнулится.</p><p>Способ SessionStorage применяют для сохранения данных неавторизованных посетителей в онлайн-магазинах — какие товары он смотрел, какие положил в корзину. Формат используется также в случаях, когда применение localStorage нецелесообразно — например, при заказе еды в ресторанах. В локальном хранилище посетитель бы увидел прошлый заказ, который он собирал и не оформил, но меню к тому времени может поменяться. В сессионном хранилище актуальный заказ будет собран по новой.</p><h2>Сравнение cookies, localStorage и sessionStorage</h2><p>Принципиальная разница между способами хранения понятна из предыдущих разделов, осталось рассмотреть конкретные критерии.</p><h2>Размер хранилища</h2><ul><li>Файлы cookie. Здесь размер минимальный. Для каждого домена куки могут хранить ограниченный объем данных — как правило, не больше 4 КБ.</li><li>LocalStorage. Максимально возможный объем данных для каждого домена — не менее 5 МБ, а при использовании определенных настроек и больше.</li><li>SessionStorage. Здесь хранится больше данных для одного домена в сравнении с cookies. Размер — не более 5 МБ.</li></ul><h2>Срок хранения</h2><ul><li>Файлы cookie. Данные куки могут быть сеансовыми или постоянными в зависимости от настроек. Постоянные имеют свой срок действия, который исчисляется месяцами или даже годами, сеансовые уничтожаются сразу после завершения сеанса.</li><li>LocalStorage. Данные в локальном хранилище остаются после закрытия браузера и его повторного открытия. Удалить их может только пользователь или код JavaScript.</li><li>SessionStorage. Информация в сеансовом хранилище остается, пока открыта вкладка сайта. При закрытии данные удаляются.</li></ul><h2>Работа с данными</h2><ul><li>Файлы cookie. Разработчик может установить срок действия для файлов, после которого браузер автоматически очистит куки.</li><li>LocalStorage. Нельзя запрограммировать автоматическое удаление данных или другие действия с ними. Они сохраняются, пока не будут удалены принудительно.</li><li>SessionStorage. Здесь нет механизма автоматического истечения срока действия. Поэтому данные будут актуальны, пока открыта страница.</li></ul><h2>Доступ к данным</h2><ul><li>Cookies. Доступ к файлам можно получить и изменить через JavaScript API, но существуют определенные ограничения для третьих лиц.</li><li>LocalStorage и sessionStorage. Есть прямой доступ к информации в хранилищах через API JavaScript, который позволяет манипулировать данными.</li></ul><h2>Сетевой трафик</h2><ul><li>Cookies. Данные автоматически отправляются на север после каждого HTTP-запроса для соответствующего домена, что увеличивает загрузку трафика.</li><li>LocalStorage и sessionStorage. Данные не отправляются на сервер, а остаются на стороне клиента, что сокращает объем лишнего трафика.</li></ul><h2>Когда использовать cookies, localStorage и sessionStorage</h2><p>Использование различных способов хранения информации зависит от целей обращения с данными. На сайтах с авторизацией и значимой историей просмотра (например, в крупных онлайн-магазинах) важно, чтобы пользовательские данные сохранялись в большом объеме и как можно дольше, поэтому предпочтительным инструментом выступает localStorage.</p><p>В других случаях достаточно sessionStorage — например, для неавторизованных пользователей хранить информацию дольше одного сеанса не требуется. Cookies применяются, когда нужно отправить небольшое количество данных на сервер — этот способ используют практически все современные веб-ресурсы при работе с информацией, требующей быстрого обновления.</p><p>Разницу в жизненном цикле cookies, localStorage и sessionStorage используют в соответствии с задачами хранения. Ограниченный срок действия cookies и данных сессионного хранилища могут стать преимуществами в одном случае и недостатками в другом. С данными localStorage аналогичная ситуация — если нужен полный контроль времени хранения, этот формат идеально подходит.</p><h2>Проблемы и перспективы хранилищ данных</h2><p>Все хранилища потенциально уязвимы для XSS-атак. В cookies применяют дополнительные меры защиты: флаги HTTPOnly и Secure запрещают доступ из JavaScript к файлам, чувствительным к безопасности. Для отправки таких файлов используется передача по шифрованным каналам HTTPS.</p><p>Для защиты от атак CSRF (подделка межсайтовых запросов) используют атрибут SameSite, проверку HTTP_Referer/Origin или применение синхронизированных токенов.</p><p>В localStorage для обеспечения безопасности важно соблюдать принцип одного источника и тоже пользоваться зашифрованными HTTPS-соединениями. При этом эксперты все равно не рекомендуют сохранять конфиденциальные данные в localStorage.</p><p>Учитывайте, что куки могут замедлять загрузку, особенно если у пользователей низкая скорость интернета. LocalStorage на HTTP-запросы не влияет, что положительно отражается на производительности веб-ресурса.</p><p>После появления пятой версии HTML localStorage становится более востребованным элементом при разработке веб-приложений. Он обеспечивает полноценной контроль данных с сохранением актуальности проекта, идеально подходит для хранения структурированной информации и ее дальнейшей обработки. При этом инструмент поддерживает синхронизацию данных, когда пользователь открывает приложение в разных вкладках.</p>]]></content:encoded>
    </item>
    <item>
      <title>Облачные IDE: Тестируем лучшие онлайн-редакторы кода</title>
      <link>https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda</link>
      <comments>https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ростислав Сорокин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda</guid>
      <description><![CDATA[<p>Полезные сервисы: Replit, CodeSandbox, GitHub Codespaces, JetBrains Fleet, StackBlitz.
Обзор возможностей, плюсы и минусы, какие задачи лучше решать в каждой среде.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda">Облачные IDE: Тестируем лучшие онлайн-редакторы кода</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 23 Feb 2025 09:07:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда я впервые столкнулся с облачными IDE, возникло сомнение: «А разве онлайн-среда может заменить привычный локальный редактор, где всё под рукой и настроено?» Однако, спустя несколько лет я убедился, что эти сервисы серьёзно продвинулись в плане функционала и быстроты работы. Сегодня хочу поделиться опытом тестирования пяти популярных решений: Replit, CodeSandbox, GitHub Codespaces, JetBrains Fleet и StackBlitz. Расскажу, в каких случаях они выручат, какие у них плюсы и минусы, а также поделюсь конкретными примерами использования.</p><h2>Что такое облачные IDE и почему они важны</h2><p>Облачные IDE (или онлайн-редакторы кода) позволяют работать над проектом прямо из браузера, без сложной локальной настройки окружения. На сервере уже установлены необходимые инструменты (компиляторы, интерпретаторы), можно быстро переключаться между различными стеками технологий. Это удобно, когда нужно:</p><ol><li>Быстро протестировать идею или прототип,</li><li>Работать из любого места и с любого устройства,</li><li>Обучаться программированию (особенно новичкам, которым сложно настраивать среду разработки),</li><li>Совместно редактировать код в реальном времени.</li></ol><p>Для меня облачные IDE — отличный вариант, когда нужно не заморачиваться с локальной установкой инструментов, а сразу перейти к коду. А ещё они выручают, когда я не хочу загружать ноутбук гигантскими IDE, особенно если машина не слишком мощная.</p><h2>Replit</h2><p><a href="https://replit.com">Replit</a> был одним из первых облачных решений, с которыми я столкнулся. Он ориентирован на скорость старта: заходишь на сайт, создаёшь «репл» (так называются проекты в Replit), выбираешь язык — и готово. Уже предустановлен интерпретатор или компилятор, можно писать и сразу же запускать программу.</p><h3>Возможности</h3><ul><li>Поддержка множества языков: Python, JavaScript, C++, Java, Go, Rust и другие.</li><li>Встроенный чат с искусственным интеллектом (Ghostwriter) для помощи в написании кода.</li><li>Возможность совместной работы: можно дать ссылку коллеге, и он зайдёт в ваш проект, чтобы вместе отлаживать или рефакторить код.</li><li>Хостинг: Replit умеет публиковать веб-приложения «на живом URL» одним нажатием кнопки.</li></ul><h3>Плюсы</h3><ul><li>Очень простая регистрация и моментальный старт.</li><li>Социальные функции: можно смотреть публичные проекты других пользователей, форкать их и учиться.</li></ul><h3>Минусы</h3><ul><li>Не всегда удобен для серьёзных проектов: базовые настройки окружения ограничены, а для расширенных сценариев нужен платный тариф.</li><li>Интерфейс может работать медленнее, если проект становится большим или инсталляция зависимостей тяжёлая.</li></ul><h3>Где пригодится</h3><ul><li>Отличный вариант для новичков, которые хотят учиться программировать без сложной настройки локальной среды.</li><li>Быстрые прототипы, демонстрации кода на собеседованиях или парное программирование.</li></ul><h2>CodeSandbox</h2><p><a href="https://codesandbox.io">CodeSandbox </a>ориентирован, прежде всего, на фронтенд-разработчиков. Он замечательно подходит для проектов на React, Vue, Angular, Svelte и других библиотечных и фреймворковых решениях.</p><h3>Возможности</h3><ul><li>Автоматическое создание окружения для фронтенд-проектов: нужен React? Выбираем шаблон — и сразу получаем структуру, файлы конфигурации и пакетный менеджер.</li><li>«Live preview» (живая перезагрузка): при каждом изменении в коде страница в правой части обновляется без перезагрузки.</li><li>Интеграция с GitHub: можно подтянуть репозиторий, внести правки в CodeSandbox, а затем запушить изменения обратно.</li><li>Возможность запускать бэкенд-сервер (через Docker-контейнеры) в отдельных sandboxes.</li></ul><h3>Плюсы</h3><ul><li>Удобно для веб-разработки: всё уже настроено (Webpack, Vite или другие сборщики).</li><li>Поддержка TypeScript из коробки.</li><li>Отлично работает совместное редактирование, есть возможность прямого «шеринга» результатов.</li></ul><h3>Минусы</h3><ul><li>Фокус именно на веб-технологиях, так что для языков, не связанных с фронтендом, CodeSandbox не всегда подойдёт.</li><li>Бесплатные sandboxes могут засыпать при простое, что не всегда удобно для постоянного хостинга.</li></ul><h3>Где пригодится</h3><ul><li>Быстрые демки UI-компонентов или обучающие примеры для фронтенда.</li><li>Когда нужно показать коллегам, как работает тот или иной React-хук, без установки Node.js локально.</li><li>Создание небольшого прототипа веб-приложения в режиме реального времени.</li></ul><h2>GitHub Codespaces</h2><p><a href="https://github.com/features/codespaces">GitHub Codespaces</a> — по сути, облачное продолжение Visual Studio Code. Если у вас есть репозиторий на GitHub, вы можете открыть его в Codespaces и получить преднастроенную среду разработки прямо в браузере. Это решение особенно нравится разработчикам, которые уже привыкли к VS Code.</p><h3>Возможности</h3><ul><li>Полноценная интеграция с GitHub: открываем репозиторий, создаём Codespace, и всё готово к работе.</li><li>Расширения VS Code в облаке: многие привычные плагины можно установить и использовать.</li><li>Поддержка Docker и Dev Containers: можно создавать контейнеры со своим набором инструментов, чтобы каждый член команды имел идентичную среду.</li><li>Возможность «подцепиться» к Codespaces и локальным VS Code, если хочется работать в офлайне или со своим привычным окружением.</li></ul><h3>Плюсы</h3><ul><li>Знакомая среда для тех, кто пользуется VS Code.</li><li>Гибкий вариант конфигурации (Dev Containers), позволяющий упростить онбординг новых сотрудников.</li><li>Нет проблем с зависимостями: всё хранится в контейнере, поэтому переходить между проектами очень удобно.</li></ul><h3>Минусы</h3><ul><li>Требует платного тарифного плана GitHub, если нужен серьёзный объём ресурсов (хотя есть ограниченное бесплатное время).</li><li>Для маленьких проектов может быть избыточен, так как мощь Codespaces раскрывается больше в средних и крупных командах.</li></ul><h3>Где пригодится</h3><ul><li>Команды, которые живут в экосистеме GitHub, хотят, чтобы любой разработчик мог моментально начать работать с проектом, не тратя часы на установку зависимостей.</li><li>Сложные проекты, где важно гарантировать одинаковую среду для всех.</li></ul><h2>JetBrains Fleet</h2><p><a href="https://www.jetbrains.com/fleet">Fleet </a>— новый проект от JetBrains, который позиционируется как «умная и быстрая» IDE нового поколения. Предлагается как облачная среда с возможностью локальной установки. JetBrains известны своими тяжёловесными, но очень функциональными IDE (IDEA, PyCharm, WebStorm и т.д.), а Fleet стремится занять более лёгкую нишу с возможностью работать в облаке.</p><h3>Возможности</h3><ul><li>Режим «смарт-редактирования», когда Fleet по мере необходимости подгружает функции анализа кода.</li><li>Распределённая архитектура: можно разворачивать часть Fleet в локальном окружении, часть — в удалённом, чтобы снизить нагрузку на машину.</li><li>Совместное редактирование кода в реальном времени, причём JetBrains обещают, что это будет «ровно, как в Google Docs, только для кода».</li></ul><h3>Плюсы</h3><ul><li>Потенциально более лёгкая, чем классические JetBrains IDE, работает быстрее на слабом железе.</li><li>Глубокий анализ кода, как и во всех решениях JetBrains, что особенно полезно для больших проектов.</li></ul><h3>Минусы</h3><ul><li>Fleet пока ещё развивается, некоторые функции отсутствуют или реализованы не до конца.</li><li>Менее дружелюбен к новичкам, чем Replit или CodeSandbox, потому что ориентирован скорее на опытных разработчиков.</li></ul><h3>Где пригодится</h3><ul><li>Разработка на языках, где особенно важны рефакторинг и интеллектуальные подсказки: Java, Kotlin, Python и т.д.</li><li>Если нужна более «лёгкая» альтернатива классическим IDE JetBrains, но при этом с возможностью работать удалённо.</li></ul><h2>StackBlitz</h2><p><a href="https://stackblitz.com">StackBlitz</a> — ещё один «фронтенд-ориентированный» онлайн-редактор, но с упором на выполнение кода прямо в браузере без специальных серверных окружений. Он запускает Node.js-среду в браузере через WebAssembly, благодаря чему проекты могут работать очень быстро и автономно.</p><h3>Возможности</h3><ul><li>Мгновенный запуск Angular, React, Vue, Svelte и т.д., без серверной компоненты.</li><li>Поддержка Node.js-приложений (через WebContainers) прямо в браузере: по сути, локальная VM работает «внутри» вкладки.</li><li>Отличная интеграция с GitHub и возможность деплоя проектов.</li></ul><h3>Плюсы</h3><ul><li>Реально быстрая загрузка и мгновенный старт проектов на популярных фреймворках.</li><li>Почти не зависит от «серверной» стороны, потому что всё работает через WebContainers.</li><li>Хорошо подходит для офлайн-режима (в разумных пределах).</li></ul><h3>Минусы</h3><ul><li>Частично функционал ограничен: если нужны какие-то специфические системные зависимости, WebContainers могут не справиться.</li><li>Не так универсален, как решения уровня GitHub Codespaces. В первую очередь он предназначен для веба.</li></ul><h3>Где пригодится</h3><ul><li>Обучающие примеры фронтенда, демо на конференциях или мастер-классах.</li><li>Когда нужно показать, как работает Angular-компонент или React-хук, а интернет-подключение не самое надёжное.</li><li>Быстрое создание прототипа и проверка идей.</li></ul><h2>Мой личный опыт и выводы</h2><p>За 10 лет работы программистом я привык, что «настоящая IDE» должна быть у меня локально, с тщательно настроенными плагинами. Однако чем дальше, тем больше я использую облачные решения. В одних случаях это экономит время на настройке окружения, в других — позволяет быстро работать даже на слабом устройстве, а в третьих — просто удобно для совместной разработки.</p><ul><li>Replit я использую, когда хочу быстро показать фрагмент кода на собеседовании или протестировать идею на маломальном языке, где нет желания ставить компилятор локально.</li><li>CodeSandbox прекрасно подходит для демонстрации и прототипирования фронтенд-проектов. Идеально, если нужно поделиться примером React или Vue-компонента.</li><li>GitHub Codespaces — моё решение для серьёзных проектов, где нужна стабильная облачная среда уровня VS Code, плюс глубокая интеграция с GitHub Actions и репозиториями.</li><li>JetBrains Fleet я «щупаю» как потенциальную легковесную замену IntelliJ IDEA, но с возможностью облачной синхронизации и удалённой мощью серверов JetBrains. Пока рано говорить о полной замене, но направление впечатляет.</li><li>StackBlitz — это «волшебство», когда нужно поднять Node.js в браузере. Очень люблю показывать StackBlitz на воркшопах по фронтенду, потому что всё запускается буквально за секунды.</li></ul><p>Какую из этих сред выбрать — зависит от задач и предпочтений. Если вы профессионал, который «сидит в одной IDE 8 часов в день», возможно, вы пока предпочтёте локальные решения. Но всё чаще облачные сервисы дают такую же мощь и удобство, причём сэкономив кучу времени на конфигурации. В любом случае, всем рекомендую попробовать, хотя бы ради эксперимента. Может оказаться, что облачная IDE для некоторых задач станет вашим новым любимым инструментом.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 библиотек JavaScript, которые можно забыть в 2025 году</title>
      <link>https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu</link>
      <comments>https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu</guid>
      <description><![CDATA[<p>Неактуальные библиотеки и фреймворки JavaScript, о которых можно забыть в 2025 году. Более современные и производительные аналоги. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-bibliotek-javascript--kotorye-mozhno-zabyt-v-2025-godu">10 библиотек JavaScript, которые можно забыть в 2025 году</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Feb 2025 10:01:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие разработчики, как и люди других профессий, придерживаются консервативных взглядов. Они считают, что если технология старая, но еще работает, нет смысла менять ее на новую. Такие программисты продолжают пользоваться неактуальными библиотеками для написания кода, не обращая внимания на современные тренды.</p><p>Это в корне неправильный подход. Устаревшие фреймворки и библиотеки не отвечают текущим требованиям к производительности, масштабируемости и адаптивности. Они не успевают за новейшими парадигмами и функциями, что неизбежно отражается на качестве создаваемых продуктов.</p><p>В нашем обзоре — 10 библиотек JavaScript, которым в 2025 году пора сказать «До свидания». Для каждого продукта из антирейтинга мы подобрали альтернативные варианты.</p><h2>Фреймворки, которые утратили актуальность в 2025 году</h2><h3>jQuery</h3><p>Это одна из первых библиотек JavaScript, которая из-за инерционного мышления все еще входит в некоторые списки самых популярных инструментов разработки. Пользователи ценят jQuery за кроссбраузерную поддержку, лаконичный синтаксис и простые алгоритмы взаимодействия с DOM.</p><p>Почему прогеры продолжают пользоваться библиотекой? Чисто технически jQuery присутствует во множестве сайтов, сделанных 10-15 лет назад (тогда этот код стал альтернативой VanillaJS). Библиотека создавалась, чтобы сделать язык более гибким и удобным в разработке.</p><p>Сегодня многие преимущества jQuery утратили свою актуальность — например, создание кода, работающего на всех браузерах. Теперь платформы стандартизированы, что делает кроссбраузерные решения библиотеки ненужными.</p><p>Кроме того, современные нативные API JavaScript серьезно улучшились — для подавляющего большинства задач, которые раньше выполнял jQuery, достаточно ванильного JS. Новейшие методики обеспечивают все манипуляции с DOM и взаимодействие веб -страницы с сервером (AJAX-запросы), поэтому необходимость в библиотеке отпадает.</p><p>В 2025 пришло время отпустить jQuery — его применение сейчас может привести к замедлению загрузки веб-страниц и приложений, а уж этого бы нам точно не хотелось.</p><h4>Чем заменить</h4><p>Нативного API JavaScript в ряде случаев будет достаточно для разработки, а для всех остальных ситуаций есть новые версии высокопроизводительных фреймворков React, Vue и Angular.</p><h3>Lodash</h3><p>Когда-то эта универсальная библиотека утилит считалась почти обязательной для каждого проекта на JavaScript. Здесь есть String — функция преобразования для обрезки и переноса в верхний регистр; Object — утилита для  расширения и слияния; Array — для сжатия и изменения; многие другие фичи, включая глубокое клонирование объектов и манипуляции с массивами данных.</p><p>Библиотека Lodash помогала программистам писать более компактный, чистый и простой в обслуживании и поддержке код, конвертировать данные в различные форматы, выполнять математические операции. В настоящее для большинства таких операций утилиты не требуются.</p><h4>Чем заменить</h4><p>Сегодня многие функции, представленные в Lodash, есть в новой спецификации JavaScript E56. Оператор spread (…), методы Array (map, reduce, filter и прочие) решают те же задачи, которые некогда решал Lodash. В число главных недостатков библиотеки входит также ее большой вес — импорт всего одной функции увеличивает накладные расходы проекта.</p><h3>Moment.js</h3><p>Долгое время эта библиотека была основным инструментом для работы с датами. Ее сильными сторонами были:</p><ul><li>способность анализировать, проверять, актуализировать и отображать текущие метки времени;</li><li>работать с календарными датами;</li><li>определять длительность различных процессов;</li><li>поддерживать часовые пояса и т.д.</li></ul><p>Сейчас эта библиотека стала слишком тяжелой — даже в мини-формате она занимает 66 КБ, что излишне нагружает устройства, отражается на производительности и быстрой работе UX-функций. Есть более легкие пакеты с теми же функциями.</p><h4>Чем заменить</h4><p>Современная альтернатива — date-fns — набор функций для работы с датами на JavaScript, который не входит в библиотеки и работает независимо. Предусматривает модульный импорт — вы можете взять из пакета только то, что требуется для работы, тем самым снижая нагрузку.</p><p>Ещё один вариант — Luxon — новая библиотека для работы с датами, созданная командой Moment. Этот инструмент изначально позиционировался как замена предыдущему продукту компании как более мощное, современное и удобное средство. Здесь работа с часовыми поясами реализована без дополнительных расширений, применяется современный подход к написанию кода.</p><p>Кроме того, JavaScript Temporal API позволяет работать с датами и временем напрямую, не используя сторонние библиотеки. Поэтому любое из указанных трех решений делает применение Moment.js избыточным и ненужным.</p><h3>RequireJS</h3><p>Долгое время библиотека была для JavaScript-разработчиков основным инструментом для управления зависимостями. Технология асинхронного определения модулей (AMD) обеспечивала эффективную асинхронную загрузку файлов. Модульный принцип не использовался в других библиотеках и инструментах, что создавало ощущение эксклюзива.</p><p>Это был самый эффективный способ взаимодействия с зависимостями, особенно ценный в работе с большими приложениями. Совместимость со всеми популярными браузерами, включая Firefox, Safari, Chrome, Opera, а также веб-продуктами на Node, была еще одной сильной стороной библиотеки.</p><p>С появлением модулей в ES6 RequireJS утратила статус уникального инструмента. В новой спецификации JavaScript реализован нативный способ определения и импорта модулей. Такой подход делает синтаксис более интуитивным, ускоряет и упрощает разработку.</p><p>При этом RequireJS в сравнении с более свежими аналогами слишком сложен в настройке и применении. Он требует от прогеров ручной настройки загрузчика и управления путями зависимостей, что повышает риск ошибок и отнимает кучу времени. Современные загрузчики более расторопные и автоматизированные.</p><h4>Чем заменить</h4><p>Помимо ES6, с модулями успешно работает сборщик Webpack, компилируя их в единый файл. Это еще более эффективный инструмент, совместимый с TypeScript и Node.js. При запуске программа обрабатывает модули, выстраивает граф зависимостей между ними и на его основе генерирует общий файл.</p><p>У этого бендлера есть дополнительные продвинутые возможности — например, разделение кода, горячая замена модулей в реальном времени, а также операция tree shaking (встряхивание дерева), то есть удаление мертвого кода из продукта. Webpack делает работу с зависимостями более рациональной и полностью заменяет тяжелый и устаревший RequireJS.</p><h3>Backbone.js</h3><p>Одна из первых библиотек JS (выпущена в 2010), основанная на шаблоне проектирования Model-View-Controller. Предназначена, в основном, для разработки пользовательских интерфейсов и структурирования веб-приложений.</p><p>Некогда  Backbone.js считался легковесным и функциональным инструментом, который упрощал работу с кодом, улучшал синхронизацию приложения с сервером и позволял создавать эффективный клиентский код.</p><p>Со временем у фреймворка стали проявляться ограничения. Например, отсутствие механизма двусторонней привязки данных. Такая опция есть у многих современных библиотек, поэтому разработчикам не приходится при каждом обновлении или изменении модели вручную настраивать DOM и множить шаблонный код. Все прогеры в курсе, что ручные операции существенно повышают риск ошибок.</p><p>Кроме того, в Backbone.js нет собственного шаблонизатора, что вынуждает применять другие библиотеки типа Handlebars.js.</p><h4>Чем заменить</h4><p>Достойных вариантов замены достаточно. Это React с его архитектурой, основанной на компонентах, и виртуальным DOM. Это и Vue.js с двусторонней привязкой данных и гибкой архитектурой. Это также универсальный Angular с теми же функциями.</p><h3>Modernizr</h3><p>Библиотека обнаружения особенностей HTML5 и CSS3 в браузере пользователя. В свое время была крайне полезной и обеспечивала работу приложений в разных браузерах.</p><p>С появлением транпислеров (программ, которые переводят части кода с одного языка программирования на другой) необходимость в Modernizr существенно снизилась. Более того, использование этого инструмента чревато увеличением расходов на приложения. Разработчикам приходится задействовать множество тестов на обнаружение функций, что замедляет загрузку.</p><h4>Чем заменить</h4><p>Компилятор (транспилер) JavaScript Babel успешно решает задачу преобразования современного кода в формат, совместимый со старыми версиями браузеров. Кроме того, Babel — полифил, то есть способен заполнять пробелы в скрипте с целью добавления новых функций.</p><h3>MooTools</h3><p>Объектно-ориентированный фреймворк, некогда популярный и безальтернативный. MooTools содержит комплект утилит для работы с DOM, событиями и AJAX-запросами. Сильными сторонами библиотеки был объектно-ориентированный подход и лаконичный синтаксис. Разрабы, предпочитающие писать элегантный и ясный код, были от MooTools в восторге.</p><p>Однако постепенно все преимущества фреймворка нивелировались — сообщество так и не дождалось существенных обновлений и перешло на более прогрессивные инструменты. В сравнении с ними MooTools занимает много места, что негативно сказывается на приложениях, где важна производительность (а сегодня она важна везде).</p><h4>Чем заменить</h4><p>В современной версии Vanilla JavaScript реализована большая часть функций, представленных в MooTools, в том числе методы для работы с DOM и для обработки событий.</p><p>Что касается полноценных библиотек, то MooTools без проблем заменят React или Vue.js. Это простые в освоении и использовании прогрессивные фреймворки для разработки пользовательских интерфейсов.</p><h3>Script.aculo.us</h3><p>Библиотека визуальных эффектов и методов управления пользовательским интерфейсом. Была популярна у разработчиков, работающих с анимацией и интерактивными опциями в приложениях. Сильные стороны Script.aculo.us — простота в применении, обширный ассортимент возможностей — перетаскивание, сортировка, слайдеры и т.д.</p><p>Отсутствие значительных обновлений и большой вес были факторами, которые ослабили позиции Script.aculo.us в сообществе. Если в 2025 году в мире еще остались программисты, которые пользуются этой библиотекой, им точно пора осваивать новые инструменты.</p><h4>Чем заменить</h4><p>GreenSock — более мощная, быстрая и универсальная библиотека анимации с огромным выбором эффектов и элементов управления. Работает на стороне клиента и сервера, совместима со всеми браузерами.</p><p>Anime.js — еще один гибкий и адаптивный инструмент. Подходит новичкам, поскольку его просто настраивать и легко использовать.</p><h3>Underscore.js</h3><p>Библиотека утилит, которая годами удерживала лидирующие позиции в разработке на  JavaScript. Эксперты называли ее «швейцарским ножом разработчика» за большой выбор функций и массу возможностей.</p><p>Однако с этим инструментом произошло то же, что и другими библиотеками утилит. Большинство функций, которые были представлены в Underscore.js, теперь реализованы в ES6.</p><h4>Чем заменить</h4><p>Новая спецификация JavaScript E56+ поддерживает методы функционального программирования, позволяет манипулировать объектами и массивами данных. Таким образом, все функции Underscore.js доступны непосредственно на JavaScript без всяких посредников. Вывод — переносите код на E56+, он станет чище и проще в поддержке.</p><h3>Axios</h3><p>Библиотека для отправки запросов HTTP из браузера или Node.js. Поддерживает множество методов запросов (Get, Put, Delete и другие), загрузку и отправку файлов. Сильные стороны — удобный интерфейс, поддержка Promise API (способ организации асинхронного кода).</p><p>Несмотря на популярность Axios и его относительную свежесть, эта библиотека стремительно теряет позиции, поскольку появились новые инструменты с более расширенным функционалом.</p><h4>Чем заменить</h4><p>Fetch API превосходит конкурента по простоте и гибкости. Он выполняет те же задачи, но оснащен дополнительными функциями — потоковой передачей, отменой запросов, улучшенной обработкой ошибок.</p><p>Замена устаревших библиотек новыми — не только погоня за трендами и стремление к прогрессу, но и возможность создавать более производительные, легкие и экономичные веб-страницы и приложения.</p><p>В эпоху, когда быстродействие, лаконичность и оптимизация ценятся как разработчиками, так и юзерами, использование наиболее эффективных инструментов становится ключевым конкурентным преимуществом поставщиков цифровых продуктов.</p><p>Делитесь в комментариях, на какие библиотеки перешли! Ну а если хотите детальнее разобраться во всех аспектах Java и JavaScript, заходите в наш <a href="https://t.me/+b_gDXaX2fMIwODky">тг-канал</a>.</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>Топовые инструменты для фронтенд-разработки в 2025 году</title>
      <link>https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu</link>
      <comments>https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu</guid>
      <description><![CDATA[<p>Инструменты для фронтенд-разработки. Показываем актуальный инструментарий для frontend в 2025 году. Рассматриваем тренды для фронтендеров ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu">Топовые инструменты для фронтенд-разработки в 2025 году</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Feb 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Специальные инструменты для разработки фронтенда существенно упрощают работу программистов, ускоряют процесс, помогают создавать привлекательные интерфейсы сайтов и решают множество других прикладных задач.</p><p>Мы собрали топ самых эффективных инструментов для фронтенда в 2025 году. Актуальная информация о фреймворках, библиотеках, средствах сборки, проверки и отладки будет полезна как начинающим, так и опытным прогерам.</p><h2>Фреймворки и библиотеки для разработки интерфейсов</h2><p>Создание фронтенда, то есть клиентской части программного продукта — неотъемлемый этап разработки сайтов и приложений. Фронтендеры работают с с HTML, CSS, JavaScript, а также используют многочисленные библиотеки с готовыми решениями. Даже новички в курсе, что без фреймворков проекты сегодня не пишутся — это долго, тяжело и непродуктивно. Ниже — наиболее эффективные фреймворки для разработки UI.</p><h3>React.js</h3><p>Созданная Джорданом Валке, ведущим программистом самой известной в мире соцсети, библиотека React остается лидером в сфере разработки инфраструктуры на JavaScript UI. На <a href="http://react.js">React.js</a> написаны такие проекты, как Skype, PayPal, Airbnb, Dropbox и многие другие.</p><p>Популярность библиотеки объясняется вполне объективными причинами:</p><ul><li>Обширное комьюнити. Только на GitHub вы найдете больше 110 тыс. публикаций с тегом «react». Библиотекой пользуются во всем мире, а тысячи профессиональных программистов постоянно обновляют инструменты и актуализируют данные. Если у разработчика появится вопрос, он обязательно найдет на него ответ в сообществе.</li><li>Технологический бэкграунд. Библиотеку создали профи из FB для себя — такие проекты делаются максимально качественно и надежно. Тот факт, что технологии доверяют крупнейшие мировые корпорации, говорит сам за себя.</li><li>Активное взаимодействие с TypeScript. Этот инструмент представляет собой продвинутую версию JS, который со временем стал слишком тяжелым в плане кода. TypeScript лишен многих недостатков Java, поэтому активно применяется в React.js. В общем, в 2025 году фреймворк точно не умрет.</li><li>Версионность. В React, в отличие от Angular или Vue, код, написанный даже несколько лет назад, без проблем запустится на новейшей версии. А если там есть неактуальный элемент, программа сама подскажет, как его исправить.</li></ul><p>В React 19 появились новые, еще более мощные компоненты, повышающие производительность и пользовательский опыт:</p><ul><li>Улучшенная поддержка Server Components, с которой более удобно работать с серверным рендерингом и загружать контент в больших проектах;</li><li>Новый API — Actions, который делает более простой и продуктивной работу с формами и интерактивными элементами;</li><li>Директивы preload и preinit обеспечивают предварительную загрузку важных ресурсов, что ускоряет работу приложений;</li><li>Новый канал релизов React Canaries позволяет протестировать некоторые опции React еще до их официального выпуска.</li></ul><p>Улучшения произошли и в экосистеме React. Упрощается работа с Redux — библиотекой, которую все чаще используют в связке с React. Инструменты для работы с таблицами и интерфейсами React Table 8 более доступны и производительные.</p><h3>Vue.js</h3><p>Еще один мощный, но при этом простой и гибкий в применении инструмент для фронтенд-разработчиков — <a href="http://vue.js">Vue.js</a>. Согласно экспертным прогнозам, он сохранит свои позиции в топе-3 фреймворков для JavaScript в 2025 году.</p><p>Относительно недавно создатели Vue радикально обновили движок и архитектуру. При этом доля TypeScript кода в репозитории приближается к 99%, что расценивается профессиональными прогерами крайне позитивно.</p><p>Команда разработчиков Vue.js, возглавляемая Эваном Ю, в свое время заявила, что фреймворк станет самым простым и удобным инструментом из всех существующих. По мнению экспертов, их слова полностью подтвердились.</p><p>В числе главных преимуществ фреймворка:</p><ul><li>Подходит для новичков. Для освоения достаточно знания HTML, CSS, JavaScript;</li><li>Небольшой вес. Размер новой заархивированной библиотеки runtime меньше 10 kb;</li><li>В пакет входит виртуальный DOM — объектная модель документа;</li><li>Активное крутое сообщество. Профессионалы помогут, если у разработчика возникнут проблемы.</li></ul><p>Количество полноценных приложений, сделанных на Vue.js, превышает 36 тысяч. Это число постоянно растет, и в 2025 году тренд обязательно продлится. В экосистему внедряются новые технологии, например, Vapor Mode, — инструмент, открывающий новые горизонты для разработки высокопроизводительного софта.</p><p>Подход, заданный Composition API, позволяет создавать компоненты через импорт функций вместо обновления опций. На выходе получаем более чистую архитектуру, что особенно важно для продуктов со сложной логикой.</p><p>Появление высокоуровнего фреймворка Nuxt 4 принесет важные улучшения в плане производительности и гибкости разработки. Поддержка Vue 3.3+ в Nuxt 4 улучшает работу с анимацией и межкомпонентные переходы. Пользовательский интерфейс становится более динамичным и плавным.</p><p>На фреймворке Vue созданы сайты Ozon, Zoom, Chess (сайт для шахматистов с посещаемостью 20 млн пользователей в месяц), Livestorm — платформа для запуска вебинаров, и многие другие ресурсы.</p><h3>Angular</h3><p>Этому мощному фреймворку доверяет Google, что уже говорит само за себя. Множество десктопных и мобильных приложений создано на <a href="https://angularjs.org/">AngularJS</a> — это крутой инструмент с минимальным риском критических ошибок. На сайте фреймворка создатели призывают разработчиков сосредоточиться на приложениях, а код Angular берет на себя.</p><p>И хотя профи считают этот фреймворк более сложным в освоении, чем Vue и React, его функциональность оправдывает все трудности учебного процесса. В 2025 году эволюция Angular продолжится: его последние версии показывают существенные изменения в подходах к реактивности ПО и управлению состоянием.</p><p>Новые решения, на которые стоит обратить внимание:</p><ul><li>К числу ключевых нововведений фреймворка относится технология Signals, которая делает взаимодействие с реактивными данными более простым. «Сигналы» актуальны в том случае, когда требуется синхронное обновление UI и оптимизация производительности приложения.</li><li>В Angular 19 компоненты Standalone стали новым стандартом. Теперь они могут использоваться без добавления в модуль. Такое решение упрощает архитектуру приложений и делает подход к коду более прямолинейным.</li><li>Внедрение зависимостей (DI, Dependency Injection) дополнено новой функцией inject() — она заменяет стандартный конструктор, что также упрощает код и делает его более гибким.</li><li>Автоматическая миграция продуктов к новому API — еще один шаг к упрощению и сокращению кода. Это напрямую отражается на производительности современных приложений, в первую очередь, на больших и логически сложных.</li></ul><p>Прежние плюсы  Angular остались неизменными — расширяемость, взаимодействие с другими фреймворками и инструментами, множество надстроек и дополнений — Auto Validate, Complete, Grid и т.д.</p><p>На фреймворке написан сайт британской газеты The Guardian, интерактивные элементы PayPal, самый посещаемый сайт мониторинга погоды Weather.com, фронтенд музыкального ресурса VEVO и многие другие продукты.</p><h3>Svelte</h3><p>В свое время фреймворк предложил принципиально новый подход к разработке пользовательских интерфейсов. Концепция создателей <a href="https://svelte.dev/">Svelte</a> — делать больше с минимальными затратами. Некоторые разработчики считают Svelte больше компилятором, чем фреймворком, что по сути соответствует действительности.</p><p>В чем основные фишки Svelte:</p><ul><li>При меньшем весе проекты более производительны — им не требуется виртуальный DOM;</li><li>Фреймворк прост в освоении, поэтому подходит начинающим разработчикам;</li><li>Опытные прогеры обращают внимание на быстроту и стабильность инструмента;</li><li>Анимации в Svelte доступны прямо из коробки — сторонние библиотеки не требуются.</li></ul><p>На текущем этапе этот фреймворк рано ставить на одну ступень с React и Vue, но его рейтинг на GitHub постоянно повышается, и в 2025 году растущий тренд точно сохранится.</p><p>Фронтенд-разработкой с фреймворком Svetle пользовались такие компании, как Spotify, Ikea, Finance.yahoo, Music.apple и многие другие.</p><h3>Solid.js</h3><p>Минималистичный фреймворк, который по производительности и быстроте превосходит все остальные фреймворки из топа. <a href="https://www.solidjs.com/">Solid</a> напоминает React, но вместо виртуального DOM использует компиляцию. Проект без проблем компилируется в JavaScript-код, что обеспечивает быстрый рендеринг страницы (трансформацию кода в картинку для пользователя).</p><p>В чем плюсы:</p><ul><li>Тонкая реактивность обеспечивает оптимизацию рендеринга в реальном времени;</li><li>Есть бесшовная интеграция со всеми актуальными библиотеками на JS;</li><li>Компоненты фреймворка — стандартные JavaScript-функции: они выполняются однократно для настройки представления, после чего автоматически обновляют интерфейс.</li></ul><p>Solid.js, по состоянию на 2025, — идеальный инструмент для одностраничных приложений и продуктов с максимальной интерактивностью (чат-ботов, мессенджеров, панелей управления).</p><p>Фреймворк используют такие ресурсы, как 1c.ru, криптовалютная биржа Ape.pro, маркетплейс Майнкрафт Waypoint Studios и другие.</p><h2>Инструменты для сборки и разработки</h2><p>По мнению большинства экспертов, в 2025 году ведущим трендом в сборке и разработке на JavaScript будет работа с универсальными мета-инструментами, совместимыми с любыми фреймворками.</p><p>Топ наиболее эффективных инструментов этого направления:</p><ul><li><a href="https://vite.dev/">Vite</a>. Локальный сервер разработки от Эвана Ю. В новой версии Vita 6 возможности существенно расширились, в том числе в плане поддержки других фреймворков, помимо Vue. Благодаря модульной архитектуре и новой системе плагинов, улучшилась кастомизация сборки (процесс внесения изменений). С Vite можно использовать несколько фреймворков в одном проекте — для сложных приложений это актуальная опция. Обновления в реальном времени происходят быстро и стабильно.</li><li><a href="https://webpack.js.org/">Webpack</a>. Сборщик модулей, который компилирует части кода в единый файл. Работает с JavaScript и TypeScript. Несмотря на появление новых инструментов сборки, в 2025 году Webpack останется обязательным инструментом, особенно для работы с масштабными проектами. Он оптимизирует размер и скорость загрузки ресурсов, эффективно выстраивает процессы разработки, в том числе HMR — горячую замену модулей. Плюс обеспечивает совместимость продуктов с различными версиями браузеров.</li><li><a href="https://parceljs.org/">Parcel</a>. Главная фишка этого инструмента в том, что его не нужно настраивать и конфигурировать — это делается автоматически. Parcel применяет воркеры — скрипты для многоядерной компиляции, и содержит кэш файловых систем для ускоренной сборки. Есть поддержка из коробки JS, CSS, HTML, поэтому соответствующие плагины не требуются. Модули, которые меняются в процессе разработки, обновляются автоматически.</li></ul><h2>Тестирование и отладка</h2><p>В 2025 году в тестировании и отладке продуктов наиболее востребованы следующие инструменты:</p><ul><li><a href="https://jestjs.io/ru/">Jest</a>. Самый популярный фреймворк для тестирования кода на JavaScript. Работает с синхронным и асинхронным кодом, интегрируется с React и Vue. В числе основных плюсов — простая настройка и удобное применение. Подходит для проверки и отладки сложных приложений.</li><li><a href="https://www.cypress.io/">Cypress</a>. Инструмент для автоматизации тестирования, который подходит новичкам. Использует тест end-to-end, покрывая весь путь пользователя, и внедряется в CI/CD — процессы непрерывной доставки и развертывания. Благодаря подробной документации подходит для новичков.</li><li><a href="https://testing-library.com/docs/react-testing-library/intro">React Testing Library</a>. Библиотека эффективных инструментов для тестирования пользовательских интерфейсов UI. RTL позволяет абстрагироваться от внутренней логики компонентов и проверяет состояние реального DOM, то есть имитирует действия пользователей, руководствуясь только данными браузера.</li><li><a href="https://storybook.js.org/">Storybook</a>. Позиционируется как максимально простое средство тестирования и разработки. Создает изолированную программную среду для ускоренного и эффективного процесса.</li></ul><h2>Инструменты для контроля версий</h2><p>Актуальные в 2025 средства для контроля созданных разработчиками версий:</p><ul><li><a href="https://git-scm.com/">Git</a>. Распределенная VCS (система управления версиями) отслеживает изменения в исходном коде и файлах в совместных проектах. Позволяет править и контролировать версии в процессе разработки. Обладает расширенными возможностями работы с репозиториями.</li><li><a href="https://github.com/gitlabhq">GitHub/GitLab</a>. Службы управления репозиториями, которые используются и для управления изменениями в опенсорс-проектах. Оба репозитория обладают полным набором инструментов для контроля и интеграций, обеспечивая эффективную совместную разработку и неограниченное сотрудничество. Обладают встроенными опциями безопасности, которые разработчики могут в любой момент активировать.</li><li><a href="https://bitbucket.org/product">Bitbucket</a>. Аналог GitHub с бесплатным доступом к контролю команды до пяти разработчиков. Подходит для написания частных проектов, обладает гибкостью, совместим со множеством других инструментов, в том числе с Jira, — средой для управления проектами.  Интеллектуальный семантический поиск JQL сканирует код по запросу пользователя.</li></ul><h2>CSS-процессоры и CSS-фреймворки</h2><p>Инструменты для первичной трансляции кода, актуальные в 2025 году:</p><ul><li><a href="http://sass-lang.com/">Sass</a>. Препроцессор упрощает написание кода, исключая одинаковые участки или заменяя ключевые элементы синтаксиса одним знаком. Sass считается самым надежным языком расширений CSS, содержит средства импорта и множество других функций.</li><li><a href="http://lesscss.org/">Less</a>. Этот препроцессор поддерживает CSS и позволяет разработчикам применять его методы для улучшения и дополнения веб-приложений. В Less встроены логические, строковые, математические функции, а также функции списков.</li><li><a href="https://getbootstrap.com/">Bootstrap</a>. Классический фреймворк для ускоренной верстки со множеством встроенных компонентов. Более 20% всех сайтов в мире создано с его помощью. Автоматически выстраивает адаптивную сетку на базе Flex-модели, создает изображения, поставляется с панелями навигации и другими компонентами.</li><li><a href="https://tailwindcss.com/">Tailwind CSS</a>. Фреймворк, который пользователи называют прогрессивной версией Bootstrap. Содержит обширный каталог утилитарных классов и инструментов для прототипирования, стилизации сайтов и приложений. Легко настраивается, работает с собственными служебными шаблонами, создает сложные адаптивные макеты, в том числе с ориентацией под мобильные устройства.</li></ul><h2>Инструменты для работы с API и серверной логикой</h2><p>Эффективная работа с API обеспечивает надежность при обработке информации в приложениях.</p><p>В 2025 году топ таких инструментов выглядит следующим образом:</p><ul><li><a href="https://graphql.org/">GraphQL</a>. Язык, описывающий взаимодействие клиента с сервером.  Рассматривается как альтернатива стандартного инструмента REST. В сравнении с последним, более удобен в применении, содержит обширный инструментарий.</li><li><a href="https://www.apollographql.com/docs/react">Apollo Client</a>. Язык запросов, созданный разработчиками FB. Интегрируется с GraphQL и React для управления состоянием приложения. Предоставляет эффективные инструменты в виде поддержки кэширования, управления состоянием и исправления ошибок. Интегрируется с библиотекой Redux и другими фреймворками.</li><li><a href="https://axios-http.com/ru/docs/intro">Axios</a>. JS-библиотека для работы с HTTP-запросами, а по сути — клиент для работы в браузере и с платформой Node.js. Помогает настроить взаимодействие между frontend и backend.</li></ul><h2>UI и UX-дизайн</h2><p>Интерфейсу и комфорту пользователя современные сайты и приложения уделяют максимум внимания. На кривые и неудобные ресурсы посетители просто не приходят — зачем, если есть лаконичные и функциональные продукты, отвечающие актуальным трендам цифрового дизайна.</p><p>Эти инструменты сохраняют свою актуальность в 2025 году:</p><ul><li><a href="https://www.figma.com/">Figma</a>. Графический редактор, который остается самым популярным инструментом для проектирования интерфейсов, прототипирования и тестирования. Также это среда взаимодействия команды разработчиков, доступная непосредственно в браузере. Содержит удобные инструменты, может работать в режиме многозадачности.</li><li><a href="https://helpx.adobe.com/ru/xd/get-started.html">Adobe XD</a>. ПО для работы с интерфейсами, анимированием, прототипами сайтов, сервисов и приложений от лидера индустрии. Основной инструмент UX-дизайнеров, желающих создавать юзабельные и современные макеты и делиться результатами работы с командой. Содержит многочисленные инструменты для рисования, создания 3D-эффектов, добавления интерактивных функций и анимации.</li><li><a href="https://www.sketch.com/">Sketch</a>. Выбор многих профессионалов индустрии UI/UX дизайна. Упрощает разработку интерфейсов благодаря множеству встроенных полезных функций — артбордов, редакторов, поддержкой командной работы в режиме онлайн. Работает только с macOS.</li></ul><p>При выборе фреймворков и инструментов фронтам стоит руководствоваться удобством и простотой использования, соответствием собственному профессиональному уровню, языковой поддержкой, ценой, а также спецификой создаваемого продукта.</p><p>Вспомогательные инструменты ускоряют и упрощают разработку, снижают риск ошибок и работают на результат — запуск привлекательных, быстрых и функциональных веб-продуктов и приложений.</p><p><i>Рассказывайте в комментариях, какими фреймворками и библиотеками пользуетесь вы. А если хотите найти большей полезной информации про фронтенд — вам </i><a href="https://t.me/+BDTRdPNEOY00ZjE6">сюда</a><i>.</i></p>]]></content:encoded>
    </item>
  </channel>
</rss>