<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Производительность</title>
    <description/>
    <link>https://tproger.ru/tag/performance</link>
    <atom:link href="https://tproger.ru/tag/performance/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Fri, 23 Oct 2026 17:05:54 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Производительность</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Наблюдаемость: где на самом деле теряются миллисекунды</title>
      <link>https://tproger.ru/articles/nablyudaemost-gde-na-samom-dele-teryayutsya-millisekundy</link>
      <comments>https://tproger.ru/articles/nablyudaemost-gde-na-samom-dele-teryayutsya-millisekundy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/nablyudaemost-gde-na-samom-dele-teryayutsya-millisekundy</guid>
      <description><![CDATA[<p>Как собрать трассы без правки кода через eBPF, превратить их в метрики по медленным запросам и не принять смену методики за регрессию. Разбираем три слоя с цифрами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/nablyudaemost-gde-na-samom-dele-teryayutsya-millisekundy">Наблюдаемость: где на самом деле теряются миллисекунды</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 09 Sep 2026 13:00:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Дашборд краснеет, а причина не находится. У наблюдаемости, которая так себя ведёт, обычно три независимые беды: телеметрия собрана не везде, собранное не переведено в решения, а полученные числа прочитаны неверно.</p><p>Разбираем все три слоя: как получить трассировку, не переписывая сервисы, как превратить трассы в метрики, по которым можно действовать, и как не принять смену методики измерения за изменение продукта.</p><p>Трассировка через eBPF снимает налог на ручное инструментирование, но требует ядра не ниже 5.8, несрезанной таблицы символов и знания устройства планировщика Go.</p><p>При 50 000 запросах в секунду и четырёх точках съёма на запрос получается 200 000 входов в ядро ежесекундно и потолок расхода в 200–600 мс процессорного времени на ядро.</p><p>Медленный запрос это не одна проблема, а пять разных: лишняя работа, борьба за ресурсы, давление среды, деградация плана и патологические шаблоны вроде N+1.</p><p>Инструменты базы говорят, что дорого внутри неё, но не говорят, какой сервис это вызвал и был ли запрос пользовательским. Этот контекст приносят трассы.</p><p>Версия браузера, тип навигации, библиотека сбора данных и версия инструментирования входят в определение метрики: смешав их в одном графике, вы увидите изменение измерения вместо изменения продукта.</p><h2>Слой первый наблюдаемости: собрать данные, не трогая код</h2><p>Ручное инструментирование обходится дороже, чем кажется на старте. Каждая точка вызова библиотеки, каждая ветка передачи контекста и каждое извлечение сопутствующих данных — это код, который расходится с реальностью, забывается в горячем пути и стоит процессорного времени на высокой частоте запросов.</p><p>Альтернатива, ставшая эксплуатационно пригодной за последние пару лет, — <a href="https://dev.to/neeraj_singhi_golang/ebpf-powered-request-tracing-in-go-microservices-without-instrumentation-tax-34kf">подключение зондов eBPF напрямую к символам рантайма</a> и точкам входа библиотек HTTP и gRPC. Трассы восстанавливаются из событий ядра и пользовательского пространства, а файл бинарника на диске не меняется вовсе: правки идут только в памяти работающего процесса, точечно и обратимо.</p><h3>Почему с Go это сложнее, чем с C</h3><p>Зонд работает так: в заданное смещение работающего бинарника ставится инструкция прерывания, при попадании в неё ядро останавливает поток, выполняет свою программу и возобновляет исполнение. Для C и Rust это ложится на прологи функций почти без остатка. Go добавляет три осложнения.</p><p><b>Планирование горутин.</b> Планировщик Go раскладывает множество горутин на меньшее число системных потоков. Один HTTP-запрос может обрабатываться горутиной на одном потоке в момент срабатывания зонда и переехать на другой поток до записи ответа. Наивный зонд, читающий идентификатор потока или процесса, теряет непрерывность на этом переезде. Правильный якорь — идентификатор горутины, а достать его можно либо через карту, построенную по отладочной информации, либо вычислением фиксированного смещения от указателя, лежащего в регистре локального хранилища потока.</p><p><b>Соглашение о вызовах.</b> В Go 1.17 аргументы функций переехали со стека в регистры, причём сначала только на amd64; на arm64 и ppc64 это произошло версией позже. Программа зонда, написанная под прежнее соглашение и читающая контекст со смещения от указателя стека, на новых бинарниках прочитает мусор. Значит, трассировщику нужна либо логика зондов под каждую минорную версию языка, либо вычисление места по отладочной информации самого бинарника.</p><p><b>Встраивание функций.</b> Компилятор Go агрессивно встраивает мелкие функции, и нужный символ может просто отсутствовать по ожидаемому адресу. Зонд, поставленный не туда, даёт пропущенные отрезки трассы или испорченные аргументы, причём молча.</p><p><b>Отдельная ловушка при разборе событий:</b><br />Структура на стороне потребителя должна побайтово совпадать со структурой в программе зонда, включая выравнивание. Расхождение в один байт приводит к тому, что все поля после первого декодируются неправильно, а внешне это выглядит как случайный мусор в трассах.</p><h3>Главная нерешённая проблема: передача контекста между сервисами</h3><p>Если нельзя вписать заголовок в коде приложения, как передать идентификатор трассы дальше по цепочке вызовов? Есть три подхода, и практически применим один.</p><ul><li>Писать заголовок прямо в пакет на уровне сетевого интерфейса. Требует расширенных привилегий и работает только для нешифрованного HTTP/1.1: шифрование выполняется выше уровня сокета, и программа видит уже зашифрованные байты.</li><li>Пропускать исходящие вызовы через локальный вспомогательный прокси, который держит соответствие идентификатора горутины и контекста трассы и вставляет заголовки перед пересылкой. Добавляется сетевой переход, зато шифрование не ломается.</li><li>Править карту заголовков прямо в памяти процесса. Соответствующая функция ядра помечена как опасная и действительно способна повредить память: каждая её загрузка пишет предупреждение в журнал ядра, работа требует широкой привилегии CAP_SYS_ADMIN, а в режиме блокировки ядра она запрещена совсем.</li></ul><p>Единственный вариант, который одновременно совместим с шифрованием, безопасен и разворачивается где угодно, — второй. Его цена в задержке составляет обычно меньше 100 мкс на переход через локальную петлю, что приемлемо, когда сами измеряемые операции занимают миллисекунды.</p><h3>Что ломается в продакшене</h3><ul><li>Идентификаторы горутин переиспользуются. При высокой конкурентности номер может уйти на новую горутину раньше, чем потребитель разобрал события старой.</li><li>Обновление бинарника сдвигает смещения символов. Зонды старого отображения ядро снимает само, и новый бинарник какое-то время работает без трассировки. Слежение за изменением файла сокращает разрыв до секунд, но не убирает его.</li><li>Требования к ядру. Кольцевые буферы нужны ядру от 5.8, а переносимая компиляция зондов требует 5.4 с включённой отладочной информацией о типах. Матрицу ядер стоит проверить до внедрения, а не после.</li><li>Срезанные бинарники. Сборка без таблицы символов и отладочной информации лишает трассировщик возможности сопоставить имена функций со смещениями. Компромисс: оставить хотя бы таблицу символов, заплатив примерно 10–15% размера бинарника.</li></ul><h3>Сколько это стоит в процессорном времени</h3><p>Зонды не бесплатны: каждое срабатывание это программное прерывание с входом в ядро. При 50 000 запросах в секунду и четырёх точках съёма на запрос получается 200 000 входов ежесекундно. Опубликованные замеры дают порядка 1–3 мкс на срабатывание на современном оборудовании, то есть верхняя оценка расхода составляет 200–600 мс процессорного времени в секунду на одно ядро.</p><p>Цифра ощутимая, но сравнивать её стоит с альтернативой, а не с нулём. Автор разбора оценивает эту альтернативу в десятую часть рабочего времени разработчиков, уходящую на сопровождение кода инструментирования. Потребителя событий при этом лучше держать на отдельной горутине, привязанной к ядру, которое не обслуживает запросы, чтобы выделение памяти под отрезки трасс не мешало обработке.</p><p>Правильный вывод не «заменить инструментирование зондами», а «использовать оба». Зонды дают сплошное покрытие и базовое распределение задержек без усилий разработчиков, включая сторонние бинарники, которые вы не можете изменить. Ручное инструментирование даёт смысловое наполнение: идентификатор пользователя, арендатора, флаг функциональности — то, чего из сырых байтов HTTP не синтезировать. Наиболее точные схемы наблюдаемости держат оба слоя, причём слой зондов работает проверкой на непротиворечивость для отрезков, которые приложение теряет под нагрузкой.</p><h2>Слой второй: превратить трассы в решения</h2><p>Собранная телеметрия сама по себе ничего не улучшает. Больше телеметрии означает больше объектов для разглядывания, а не больше понимания. Полезной она становится, когда из неё извлечены закономерности, на которые можно действовать.</p><h3>«Медленный запрос» это пять разных диагнозов</h3><p>Прежде чем что-то чинить, стоит понять, чем именно болен запрос. <a href="https://www.cncf.io/blog/2026/08/21/how-to-turn-slow-queries-into-actionable-reliability-metrics-with-opentelemetry/">Разбор CNCF</a> раскладывает медленные запросы к базе на пять непохожих причин:</p><ul><li>Лишняя работа. Обычно это полный перебор таблицы из-за отсутствующего или неприменимого индекса. Выборка по идентификатору клиента без индекса растёт с 20 мс на десяти тысячах строк до минут на десяти миллионах. Запрос не менялся, изменился объём данных.</li><li>Борьба за ресурсы. Идеально оптимизированный запрос стоит в ожидании блокировок или свободного соединения. Запрос, проводящий 95% времени в ожидании блокировки, оптимизацией текста не лечится: ему нужна перекройка транзакций.</li><li>Давление среды. Насыщение процессора, узкое место ввода-вывода и нехватка памяти замедляют любой запрос с любым планом: тот же текст запроса и тот же план на нагруженной машине отработает в разы дольше, чем на свободной, и оптимизировать тут нечего.</li><li>Деградация плана. Данные и текст запроса те же, а план исполнения изменился. Устаревшая статистика после массовой загрузки заставляет планировщик выбрать заведомо плохую стратегию.</li><li>Патологические шаблоны. Проблема N+1 выполняет сотню быстрых запросов по две миллисекунды последовательно, добавляя двести миллисекунд задержки на одно только выполнение, не считая сетевых издержек на каждый обмен с базой. Ни один запрос не является медленным, а шаблон катастрофичен и в журнал медленных запросов не попадает вовсе.</li></ul><h3>Чего не хватает встроенным инструментам базы</h3><p>Журналы медленных запросов, хранилища запросов и разбор планов прекрасно отвечают на вопрос, что дорого внутри базы. Они не отвечают на вопросы, которые задаёт дежурный инженер: какой сервис это вызвал, пользовательская это работа или фоновая, связано ли это со всплеском задержки, который сейчас расследуется.</p><p>Этот контекст приносит распределённая трассировка: каждый отрезок обращения к базе вложен в контекст запроса и знает сервис, конечную точку и инициатора. Вместо того чтобы вручную сшивать журналы базы с трассами постфактум, медленные запросы анализируются прямо из трасс со всем прикладным контекстом внутри.</p><p>Дальше из отрезков трасс выводятся метрики, и делается это в три приёма: сперва простое обнаружение медленных запросов, затем взвешивание по трафику, чтобы понять, что даст наибольший выигрыш при ускорении, и наконец поиск аномалий для дежурства. Первые два отвечают на вопрос оптимизации, третий — на вопрос реагирования на инцидент, и путать их не стоит: это разные задачи с разными приоритетами.</p><h2>Слой третий: не принять смену измерения за изменение продукта</h2><p>Третья ошибка самая обидная, потому что данные при этом верны. Метрика может быть абсолютно точной, а рассказанная по ней история — совершенно неверной.</p><p>Дальше примеры пойдут из веб-производительности, потому что там эта ошибка задокументирована лучше всего. Механика же общая: любой дашборд, где смешаны серии с разных популяций или с разных версий сбора, ведёт себя одинаково, будь то задержки бэкенда или отрисовка страницы.</p><h3>Общий тренд не объясняет вашу просадку</h3><p>В июньском наборе данных о реальных пользователях Chrome, опубликованном в середине июля, доля источников с хорошей отрисовкой основного содержимого упала до 67,7%, с хорошей задержкой отклика на взаимодействие до 85,9%, а доля проходящих все три ключевых показателя до 55,3%. Исключением оказалась стабильность вёрстки, поднявшаяся до 81,4%.</p><p>Google объяснил движение сезонностью, сравнив его с прошлым годом. Контекст полезный, но он не является доказательством того, что у вас локально ничего не сломалось. Релиз, рекламная кампания, изменение формы согласия, сдвиг в составе устройств или новый сторонний скрипт способны совпасть с общеотраслевым движением.</p><p>Гарри Робертс формулирует критерий проверки прямо: <a href="https://csswizardry.com/2026/07/web-perf-wednesday-002-the-metrics-dont-tell-the-whole-story/">если общая доля прошедших упала на 1,2 процентного пункта, а конкретный сайт просел на четыре, широкий тренд разницу не объяснил</a>. Верно и обратное: если сайт почти идеально повторяет рынок по браузерам и устройствам, срочное расследование в коде потратит время всей команды впустую.</p><p>Правильное сравнение поэтому не «этот месяц против прошлого». Сравнивайте движение сайта с общей дельтой, разделяйте мобильные и настольные устройства, смотрите на показатели отрисовки и отклика по отдельности и разбирайте важные шаблоны страниц, а не источник целиком.</p><h3>Изменение методики выглядит как изменение продукта</h3><p>Дальше будет сложнее. По мере того как браузеры начинают показывать переходы внутри одностраничных приложений, которые метрики первоначальной загрузки пропускали, на одном дашборде окажутся жёсткие навигации, мягкие навигации браузера и собственные виртуальные страницы приложения, причём каждая серия собрана с разной популяции пользователей.</p><p>Смешав их без оговорок, вы получите скачок графика, вызванный сменой методики, и потратите неделю на поиск несуществующей регрессии. Отсюда практическое требование: версия браузера, тип навигации, библиотека сбора данных и версия инструментирования перестают быть служебными деталями и становятся частью определения метрики. Дашборд должен нести отметки релизов, состав трафика и устройств и внятное указание, какую популяцию представляет каждый график.</p><h3>Компенсация это не исправление</h3><p>Ещё одна ловушка того же рода: браузеры учатся скрывать последствия проблем. Привязка прокрутки к содержимому подправляет позицию, когда над областью просмотра что-то вставилось или исчезло, и читателя перестаёт выбрасывать с того места, которое он разглядывал.</p><p>Улучшение реальное, но документ по-прежнему перевёрстывается, если у картинки не заданы размеры или объявление меняет высоту. Браузер убирает одно видимое следствие, а причина остаётся на месте. Проверять после такого изменения стоит липкие шапки, ленты, интерфейс согласия и встроенные блоки, а чинить всё равно вёрстку, а не полагаться на маскировку.</p><p>Тот же разрыв виден и в метрике отклика. Большинство команд сегодня способны сказать, плохой у них отклик или нет. Заметно меньше способны сказать, какое именно взаимодействие в этом виновато, на каком шаге пользовательского пути оно случилось и что его задержало. Весь разбор Гарри Робертса именно про этот разрыв между наличием числа и наличием понимания.</p><h2>Что забрать с собой</h2><p>Три слоя решают три разные задачи, и провал на любом из них выглядит одинаково: дашборд есть, ответа нет. Без покрытия вы не видите части системы. Без перевода трасс в метрики видите всё и не понимаете ничего. Без дисциплины в чтении принимаете смену методики за регрессию.</p><p>Начинать проще всего с третьего слоя: он не требует ни новой инфраструктуры, ни единой строчки кода, только дисциплины чтения. Сверьте движение своих метрик с движением рынка и убедитесь, что расследуете настоящую регрессию, а не смену методики. Дальше уже видно, чего не хватает: покрытия или перевода трасс в решения.</p><p>Материалы разбора: <a href="https://dev.to/neeraj_singhi_golang/ebpf-powered-request-tracing-in-go-microservices-without-instrumentation-tax-34kf">устройство трассировки Go-сервисов через eBPF</a>, <a href="https://www.cncf.io/blog/2026/08/21/how-to-turn-slow-queries-into-actionable-reliability-metrics-with-opentelemetry/">перевод медленных запросов в метрики надёжности</a> и <a href="https://csswizardry.com/2026/07/web-perf-wednesday-002-the-metrics-dont-tell-the-whole-story/">разбор того, как метрики вводят в заблуждение</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Оптимизация изображений для веба: где теряются мегабайты</title>
      <link>https://tproger.ru/articles/optimizaciya-kartinok-dlya-veba-gde-teryayutsya-megabajty-i-kak-ih-v</link>
      <comments>https://tproger.ru/articles/optimizaciya-kartinok-dlya-veba-gde-teryayutsya-megabajty-i-kak-ih-v?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/optimizaciya-kartinok-dlya-veba-gde-teryayutsya-megabajty-i-kak-ih-v</guid>
      <description><![CDATA[<p>Оптимизация изображений для веба: размер в пикселях, формат под тип картинки, AVIF против WebP и сжатие в браузере. Проверьте свои картинки по чеклисту.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/optimizaciya-kartinok-dlya-veba-gde-teryayutsya-megabajty-i-kak-ih-v">Оптимизация изображений для веба: где теряются мегабайты</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Алгоритмы сжатия]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Sep 2026 09:00:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Картинки обычно оказываются самой тяжёлой частью страницы, и почти всегда они тяжелее, чем нужно. Скриншот интерфейса на 2,1 МБ ужимается до 102 КБ без заметной глазу разницы, а фотография на 4,7 МБ теряет три четверти веса ещё до того, как вы дотронетесь до качества сжатия.</p><p>Разница между четырёхсекундной загрузкой и загрузкой меньше секунды обычно лежит именно здесь, а не в бандле скриптов. Ниже пошаговая оптимизация изображений: что делать первым, какой формат выбирать под какой тип картинки и почему кодировать современные форматы нужно на сборке, а не на лету.</p><p>Первым делом уменьшайте размер в пикселях, а не качество: фотография 6000×4000 в карточке шириной 1200 пикселей это чистые потери. Один этот шаг убрал 77% веса тестового снимка.</p><p>Формат выбирается под тип картинки: фотографиям WebP или AVIF, скриншотам и интерфейсам сжатие без потерь, логотипам SVG, анимациям анимированный WebP вместо GIF.</p><p>AVIF при равном качестве весит вдвое меньше JPEG, но кодируется примерно в пятнадцать раз дольше, поэтому генерировать его нужно на этапе сборки.</p><p>Метаданные съёмки занимают от 10 до 30 КБ на файл и в вебе не нужны ни для чего.</p><p>Сжатие с потерями на тексте и резких границах даёт видимые артефакты: скриншоты и логотипы жмутся только без потерь, зато на 20–60%.</p><h2>Шаг, который экономит больше всех остальных</h2><p>Прежде чем подбирать кодек и качество, посмотрите на фактические размеры. Фотография 6000×4000 в карточке шириной 1200 CSS-пикселей отдаёт браузеру в двадцать пять раз больше пикселей, чем нужно обычному экрану, и вшестеро больше, чем нужно экрану с двойной плотностью.</p><p>В замерах автора чеклиста <a href="https://dev.to/_544bf5cbd223c35a49756/image-optimization-the-complete-2026-checklist-for-faster-websites-3pi5">одно только уменьшение до реально отображаемого размера ужало тестовое изображение с 4,7 МБ до 1,1 МБ</a>. Это минус 77% при нулевой потере качества: пиксели, которых не видно, просто перестали передаваться.</p><p><b>Как определить нужный размер:</b><br />Отправная точка это ширина контейнера в CSS-пикселях. На обычном экране она же и есть нужная ширина в физических пикселях, на плотных экранах нужно кратно больше: у части ноутбуков это двойка, у большинства современных смартфонов тройка. Поэтому правильный инструмент здесь не фиксированный множитель, а атрибут srcset с несколькими вариантами файла: браузер сам возьмёт тот, что соответствует плотности экрана посетителя.</p><h2>Формат под тип изображения, а не один на всё</h2><p>Самая частая ошибка — выбрать один формат и применять его ко всему подряд. Между фотографией с плавными градиентами и скриншотом с текстом и резкими границами разница принципиальная, и сжимаются они противоположными способами.</p><ul><li>Фотографии — WebP (на 30–50% меньше JPEG) или AVIF (ещё примерно на 30% меньше WebP).</li><li>Скриншоты и элементы интерфейса — PNG или WebP без потерь.</li><li>Логотипы и иконки — SVG: вектор весит копейки и масштабируется без предела.</li><li>Анимации — анимированный WebP вместо GIF, это экономит 60–80% веса.</li></ul><p>Отдельно про текст. Сжатие с потерями на буквах и резких границах создаёт заметные ореолы вокруг символов, поэтому скриншоты и логотипы обрабатываются только алгоритмами без потерь. Инструменты вроде oxipng ужимают такие файлы на 20–60%, не меняя при этом ни одного пикселя.</p><h3>Конвертация и сжатие — это два разных действия</h3><p>Перевод PNG в JPEG экономит место. Сжатие получившегося JPEG экономит ещё столько же, и про этот второй проход регулярно забывают. Для фотографий рабочий диапазон качества это 75–82%: от стопроцентного такая картинка визуально неотличима, а весит заметно меньше.</p><h3>Метаданные, которые вы отдаёте бесплатно</h3><p>В файле с камеры или из редактора лежат EXIF, координаты GPS, модель камеры и метки программы обработки. Для показа в браузере это бесполезный груз весом от 10 до 30 КБ на файл, за одним исключением: тег ориентации. Часть снимков с телефона хранит пиксели неповёрнутыми и полагается на него, поэтому поворот нужно применить к самим пикселям до того, как метаданные срежутся, иначе фотографии лягут набок. На каталоге из тысячи товарных снимков набегает до 30 МБ трафика ни за что, а координаты съёмки вдобавок могут оказаться данными, которые вы не собирались публиковать.</p><h2>AVIF: что это и почему его нельзя кодировать на лету</h2><p>AVIF (AV1 Image File Format) выпущен Alliance for Open Media в 2019 году и построен на внутрикадровом кодировании видеокодека AV1. По сути это инструменты сжатия одного кадра AV1, упакованные в самостоятельный контейнер для картинок.</p><p>Перед WebP у него два практических преимущества: выше степень сжатия при равном качестве и глубина цвета до 12 бит с поддержкой расширенного динамического диапазона, тогда как WebP ограничен восемью битами и обычным диапазоном. Достигается это за счёт заметно более богатого набора инструментов предсказания, унаследованного от видеокодека.</p><h3>Сколько это в килобайтах</h3><p>В сравнительном тесте <a href="https://dev.to/uglypeardata/avif-format-guide-the-next-generation-image-compression-std-4oa5">брали пейзажный кадр 1920×1080 с градиентами неба, текстурой листвы и границами зданий, исходник в BMP весил 5,93 МБ</a>. Целевое качество задавали по метрике структурного сходства: она сравнивает сжатую картинку с исходной, где единица означает полное совпадение, а 0,92 примерно соответствует порогу, за которым разницу перестают замечать глазом. Результаты:</p><p>На листве и градиентах неба разница видна и глазом: JPEG на низком битрейте показывает цветовые блоки, у AVIF артефактов практически нет. Отвечают за это многоуровневые фильтры внутри цикла кодирования, которые заглаживают границы блоков и восстанавливают детали текстур.</p><p>Плата за это — время. Кодирование AVIF примерно в пятнадцать раз дольше JPEG и вчетверо дольше WebP, потому что выбор разбиения и типа преобразования требует перебора с оптимизацией. Зато декодирование медленнее JPEG всего вдвое, и на просмотр это почти не влияет. Практический вывод прямой: генерируйте AVIF заранее, на этапе сборки. Сервисы доставки изображений кодируют его и по запросу, но только с кешированием результата, чтобы платить за кодирование один раз на вариант, а не на каждого посетителя. Чего делать нельзя, так это кодировать заново при каждом обращении.</p><h3>Как отдавать современный формат и не потерять старые браузеры</h3><p>Поддержка AVIF в браузерах составляет примерно 96%, но подстраховка всё равно нужна. Делается она тегом &lt;picture&gt;: браузер берёт первый формат, который понимает, и до остальных не доходит.</p><p>Атрибуты width и height здесь не декоративные: без них браузер не знает пропорций до загрузки файла и подвёрстывает страницу заново, когда картинка приходит. Это тот самый прыжок содержимого, который портит метрику визуальной стабильности. Атрибут loading=lazy убирает изображения за пределами первого экрана из очереди, конкурирующей за отрисовку главного элемента.</p><p>Именно за пределами: на картинку первого экрана его ставить нельзя. Отложенная загрузка задержит ровно тот элемент, скорость появления которого и меряет метрика отрисовки основного содержимого. Там уместен противоположный по смыслу fetchpriority=high.</p><h2>Сжатие в браузере: почему это вообще возможно</h2><p>Браузер умеет декодировать, преобразовывать и кодировать изображение прямо на устройстве, не отправляя файл никуда. Для товарных снимков, клиентских материалов и прочего чувствительного это снимает целый шаг из конвейера вместе с вопросом, где полежит копия.</p><p>Речь здесь уже не про ассеты вашего сайта, которые готовятся на сборке. Речь про картинки, которые в браузер приносит сам пользователь: форма загрузки в личном кабинете, объявление на маркетплейсе, вложение в заявку. Сжать их до отправки на сервер можно прямо во вкладке, и это снимает и трафик, и вопрос о том, где полежит оригинал.</p><p>Автор одного из таких инструментов <a href="https://dev.to/_544bf5cbd223c35a49756/how-i-built-a-browser-image-compressor-that-handles-30-images-at-once-56k4">разобрал устройство своего конвейера</a>, и его опыт пригодится всем, кто выносит тяжёлые вычисления во фронтенд.</p><h3>Вся тяжёлая работа уходит из главного потока</h3><p>Перекодирование снимка 4000×4000 нагружает процессор настолько, что в главном потоке интерфейс замирает, а браузер показывает предупреждение о зависшей странице. Поэтому весь конвейер живёт в Web Worker: главный поток отвечает за выбор файлов, превью и состояние, а рабочий поток декодирует через createImageBitmap, применяет преобразования и кодирует через OffscreenCanvas. Именно через него, а не через canvas.toBlob: последний это метод DOM-элемента, а DOM в рабочем потоке отсутствует, и нужный метод там называется convertToBlob.</p><p>Важная деталь производительности: передавать данные между потоками нужно как ArrayBuffer через механизм передачи владения, а не структурным клонированием. На пачке из тридцати изображений это разница между мгновенным откликом и лишними полусекундами нагрузки на сборщик мусора для каждого файла.</p><h3>Три ошибки, которые ищутся дольше всего</h3><p><b>Рабочий поток не имеет доступа к window.</b> Причём не только напрямую: достаточно подключить библиотеку, которая трогает window на верхнем уровне модуля. В консоли разработчика появляется ошибка обращения к неопределённому объекту, а вот в интерфейсе не появляется ничего: если сбой рабочего потока никак не показан пользователю, тот видит вечный спиннер. Лечится ревизией всех импортов рабочего потока: библиотеки, завязанные на браузерное окружение, остаются в главном потоке и передают в рабочий поток уже готовые данные.</p><p><b>Округление сломало масштабирование.</b> Быстрый путь изменения размера использовал округлённый шаг по пикселям. На больших изображениях округление уводило исходную координату за пределы строки, и картинка выходила разрезанной по горизонтали с чёрной мозаикой внизу. Помогли точные дробные коэффициенты и ограничение по границам в каждом ручном проходе по пикселям.</p><p><b>Асинхронный обработчик сообщений перепутал порядок.</b> Обработчик стал ждать преобразование уже после кодирования, а асинхронные обработчики порядок не сохраняют: состояние поворота разъехалось с готовым изображением. Полностью синхронным такой обработчик не сделать, декодирование и кодирование асинхронны по своей природе. Работает другое: обрабатывать сообщения строго по одному, не начиная следующее до завершения предыдущего, и хранить состояние вроде угла поворота рядом с данными конкретного сообщения, а не в общей переменной.</p><p><b>Заголовки безопасности ломают рабочие потоки молча:</b><br />Блокирует загрузку скрипта заголовок Cross-Origin-Embedder-Policy: он требует, чтобы каждый сторонний ресурс отдавал разрешающий заголовок, иначе браузер молча его отбрасывает. Cross-Origin-Opener-Policy на это не влияет, но включают их обычно парой, поэтому и ломается всё в одном релизе. Любое изменение заголовков безопасности проверяйте на настоящем развёрнутом стенде, а не только на машине разработчика.</p><h2>Что это даёт в цифрах</h2><p>Скриншот 1920×1080 проходит такой путь: исходный PNG весит 2,1 МБ, после уменьшения и перевода в WebP с качеством 75% — 186 КБ, то есть минус 91%. Тот же кадр в AVIF занимает 102 КБ, минус 95% от исходного.</p><p>Именно эти проценты и отделяют страницу, которая грузится четыре секунды, от страницы, которая укладывается в одну.</p><h2>Что забрать с собой</h2><p>Порядок действий важнее набора инструментов. Сначала пиксели, потом формат под тип изображения, потом второй проход сжатия, и только затем разговор про кодеки нового поколения. Обратный порядок даёт красивую строчку в отчёте и почти никакого эффекта на реальной странице.</p><p>Материалы разбора: <a href="https://dev.to/_544bf5cbd223c35a49756/image-optimization-the-complete-2026-checklist-for-faster-websites-3pi5">чеклист оптимизации с замерами</a>, <a href="https://dev.to/uglypeardata/avif-format-guide-the-next-generation-image-compression-std-4oa5">техническое устройство AVIF и сравнительный тест форматов</a> и <a href="https://dev.to/_544bf5cbd223c35a49756/how-i-built-a-browser-image-compressor-that-handles-30-images-at-once-56k4">разбор браузерного конвейера сжатия</a>.</p><p>Откройте свою главную страницу с открытой панелью сети и отсортируйте запросы по размеру. Первые три строки почти наверняка окажутся картинками, и это ваша ближайшая оптимизация изображений: уменьшить их вдвое реально за один вечер.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пагинация и лимиты API: как отдавать данные постранично и не дать выгрести базу</title>
      <link>https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat</link>
      <comments>https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat</guid>
      <description><![CDATA[<p>Пагинация через OFFSET тормозит на глубоких страницах и теряет строки. Смотрите, как перейти на курсор и настроить лимиты запросов — с кодом и замерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/paginaciya-i-limity-api-kak-otdavat-dannye-postranichno-i-ne-dat">Пагинация и лимиты API: как отдавать данные постранично и не дать выгрести базу</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Sep 2026 05:00:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш API отдаёт страницы по двадцать записей и работает прекрасно ровно до того дня, когда у первого крупного клиента накопится полмиллиона строк. Тогда выяснится сразу две вещи: страницы стали открываться секундами, а синхронизация на стороне клиента дважды затянула одни и те же заказы.</p><p>Оба симптома дают один и тот же виновник — постраничная выдача через OFFSET. И оба чинятся одним переходом, причём переписывать приходится только слой выдачи.</p><p>Пагинация — это способ отдать большую коллекцию по частям. Вариантов ровно два. Offset-пагинация просит базу пропустить N строк и вернуть следующие двадцать. Курсорная (её же называют keyset) запоминает последнюю отданную запись и просит всё, что идёт после неё.</p><p>Стоимость OFFSET растёт линейно: на таблице в 1,2 млн строк выборка со смещением в миллион занимает 2,4 с против 3 мс у курсора.</p><p>Под параллельными вставками и удалениями OFFSET выдаёт дубликаты и пропуски, потому что нумерация строк сдвигается между запросами.</p><p>Курсор не поддерживает переход на произвольную страницу, поэтому для админок и таблиц с кнопкой «страница 47» offset остаётся правильным выбором.</p><p>Лимиты запросов на счётчике в памяти инстанса не работают: при десяти инстансах настроенные 100 запросов в минуту превращаются в 1000.</p><p>Скользящее окно на сортированном множестве Redis и атомарном Lua-скрипте занимает пятнадцать строк и снимает гонку без распределённых блокировок.</p><p>Результат на спокойной базе одинаковый. Поведение под ростом данных и параллельными записями — принципиально разное.</p><h2>Offset ломается двумя разными способами</h2><p>Про первый знают почти все, про второй вспоминают уже после инцидента.</p><h3>Он линейно замедляется</h3><p>PostgreSQL, MySQL и SQLite не умеют «перепрыгнуть» через строки. При OFFSET 100000 база честно читает сто тысяч строк и выбрасывает их, чтобы отдать следующие двадцать. Стоимость запроса растёт вместе со смещением.</p><p>Автор разбора <a href="https://dev.to/sirmax/why-i-switched-my-api-from-offset-to-cursor-pagination-and-when-you-shouldnt-1464">замерил это на таблице в 1,2 млн строк</a> в PostgreSQL 15 с холодным кешем и обычным btree-индексом по id:</p><p>Курсорный вариант на той же таблице держал 3 мс на любой глубине. Разница объясняется сложностью: поиск по индексу это O(log n), а большое смещение — O(offset). На пятидесятитысячной странице пользователь ждёт больше двух секунд вместо миллисекунд.</p><h3>Он врёт, когда в таблицу пишут</h3><p>Этот сценарий коварнее. Пользователь загрузил первую страницу с двадцатью записями, отсортированными от новых к старым. Пока он читал, в таблицу добавились три новые записи. Запрос второй страницы с OFFSET 20 вернёт часть того, что уже было на первой: всё сдвинулось на три позиции.</p><p>Клиент получает дубликаты. При удалении записей картина обратная — часть строк он не увидит никогда, потому что они проскочили мимо границы страницы. У автора статьи на этом сломалась синхронизация у клиента: задание дважды загрузило одни и те же двадцать заказов, и три письма в поддержку ушло на то, чтобы понять, что виновата пагинация, а не код клиента.</p><p>Курсор от этого защищён по построению. Курсор — это последняя фактически полученная запись, поэтому «всё, что после неё» остаётся верным независимо от того, сколько строк вставили или удалили между запросами.</p><h2>Как выглядит курсор в коде</h2><p>Простейшая версия работает по первичному ключу и умещается в один обработчик:</p><p>Обратите внимание на per_page + 1. Запрашивая на одну запись больше, чем собираетесь отдать, вы узнаёте о существовании следующей страницы без отдельного запроса COUNT. Лишняя запись отбрасывается, а её наличие становится флагом has_more.</p><h3>Составной курсор: место, где ломается наивная версия</h3><p>Курсор по одному id корректен, только пока вы сортируете по id. Как только сортировка идёт по created_at, простое условие created_at &gt; X начинает терять записи: два заказа, созданные в одну миллисекунду, дают ничью, и одна из строк молча исчезает из выдачи.</p><p>Лечится это составным курсором — ключ сортировки плюс первичный ключ, сравниваемые как кортеж:</p><p>Сравнение кортежей разрешает ничьи детерминированно, поэтому ни одна строка не дублируется и не пропадает. Под это нужен составной индекс (created_at DESC, id DESC), иначе выигрыш в скорости пропадёт вместе с планом запроса.</p><p><b>Про формат курсора:</b><br />Не отдавайте наружу голый идентификатор, если планируете менять схему. Заверните значения в маленький JSON с полем версии и закодируйте в base64: тогда через год вы поменяете состав курсора, не сломав клиентов, которые прямо сейчас держат страницу открытой.</p><h2>Когда офсетную пагинацию нужно оставить</h2><p>Курсор не бесплатный, и подменять им всё подряд не стоит. Есть четыре ситуации, где offset честно лучше:</p><ul><li>Интерфейсу нужен переход на конкретную страницу. У курсора нет номеров страниц, поэтому админки, таблицы и всё с кнопкой «перейти к странице 47» остаются на offset.</li><li>Данных мало и они не меняются. Справочник на пять тысяч строк не выиграет ничего, зато offset проще объяснить и отладить.</li><li>Пагинация идёт по памяти или по кешу, где смещение и так стоит O(1).</li><li>Сортировка задаётся пользователем по произвольной колонке. Курсор тут превращается в кодирование кортежей в непрозрачные строки, и это уже заметная сложность.</li></ul><p>Разумное правило: курсор по умолчанию для всего, что может перерасти десять тысяч строк или читается во время записи. Offset — для небольших, статичных и внутренних данных.</p><p>И отдельно стоит помнить, что пагинация обычно не единственная нагрузка на базу. Кто ещё и насколько сильно её грузит, разбирали в переводе про <a href="https://tproger.ru/translations/patterny-upravleniya-trafikom-k-postgresql-v-production">паттерны управления трафиком к PostgreSQL</a>.</p><h2>Вторая половина задачи: кто и сколько может забрать</h2><p>Правильная пагинация решает, как отдавать данные. Она не решает, сколько их заберут за минуту. Ограничение частоты запросов выглядит тривиально («считай запросы, блокируй сверх N») и превращается в задачу распределённых систем ровно в тот момент, когда серверов становится два.</p><h3>Сначала ответьте, от чего защищаетесь</h3><p>От выбранной цели зависит вся конструкция, и целей <a href="https://dev.to/weston_carnes_d580b505e0c/api-rate-limiting-patterns-algorithms-and-how-to-do-it-right-4l35">обычно выделяют четыре</a>:</p><ul><li>Защита от перегрузки — не дать всплеску положить сервис.</li><li>Честное распределение — не дать одному шумному клиенту вытеснить остальных.</li><li>Защита от злоупотреблений — притупить перебор паролей, скрейпинг и подстановку учётных данных.</li><li>Контроль расходов — ограничить дорогие ручки вроде вызова модели или построения отчёта. Тот же принцип со стороны поставщика разбирали на примере <a href="https://tproger.ru/articles/kak-ogranichit-rashody-na-openai-api-chtoby-ii-agenty-ne-sozhgli">лимитов трат в OpenAI API</a>.</li></ul><h3>Три алгоритма и один, который выбирают почти всегда</h3><p><b>Фиксированное окно</b> считает запросы в календарном интервале: сто в минуту со сбросом на начале минуты. Просто и дыряво: клиент отправляет сотню в 12:00:59 и ещё сотню в 12:01:00, то есть двести за одну секунду. Граница окна и есть дыра.</p><p><b>Скользящее окно</b> считает в непрерывно сдвигающемся интервале, часто взвешивая счётчик предыдущего окна по мере хода времени. Точнее, но требует больше состояния.</p><p><b>Ведро токенов</b> обычно и оказывается верным выбором по умолчанию. В ведре лежит до N токенов, оно пополняется с постоянной скоростью, каждый запрос тратит один токен. Такая схема разрешает контролируемые всплески (молчавший клиент накопил токены и может потратить их разом), но держит среднюю нагрузку в рамках. Родственное «дырявое ведро» выдаёт идеально ровный поток и нужно там, где принимающая сторона всплесков не переносит.</p><blockquote>Фиксированное окно пишут первым и потом жалеют. На ведро токенов мигрируют.</blockquote><h3>Ловушка, из-за которой лимит не работает вообще</h3><p>Счётчик в памяти процесса живёт до появления второго сервера. После этого «сто запросов в минуту» тихо означает «сто запросов в минуту на инстанс», и при десяти инстансах клиент законно получает тысячу. Ошибку не видно ни в логах, ни в мониторинге: лимит вроде бы работает, просто не тот.</p><p>Лечится это переносом счётчика в общее хранилище, обычно в Redis, причём проверка и инкремент обязаны быть атомарными. Последовательность «прочитать, сравнить, увеличить» из кода приложения гоняется между инстансами и недосчитывает запросы ровно под той нагрузкой, ради которой лимит и ставили.</p><h2>Скользящее окно на Redis: пятнадцать строк Lua</h2><p>Команда сервиса jo4.io столкнулась с частным случаем этой задачи: ручка подсказки категорий ходит в модель через Groq, каждый вызов стоит денег, а пользователь может дёрнуть её полсотни раз за минуту. Нужны были лимиты на конкретную ручку и на конкретного пользователя, причём в тот же день.</p><p>Скользящее окно они <a href="https://dev.to/anand_rathnas_d5b608cc3de/redis-sliding-window-rate-limiting-with-lua-the-15-line-script-that-saved-our-ai-budget-p0i">собрали на сортированном множестве Redis</a>. Скор записи — временная метка в миллисекундах, а весь алгоритм умещается в один Lua-скрипт, который Redis выполняет атомарно:</p><p>Первая команда чистит записи старше окна относительно текущего момента — именно поэтому окно скользящее, а не фиксированное: границ, к которым можно приурочить всплеск, здесь просто нет. PEXPIRE с запасом в секунду доубивает ключ, если новых запросов не приходит, так что чистить хранилище отдельно не нужно.</p><h3>Две детали, на которых легко ошибиться</h3><p><b>Уникальность члена множества.</b> ZADD не добавляет запись, а перезаписывает существующую, если член совпал. Два запроса в одну миллисекунду с одинаковым значением дадут счётчик, который занижен. Авторы склеивают метку времени с восемью символами UUID: метка обеспечивает уникальность почти всегда, а восемь шестнадцатеричных символов дают около четырёх миллиардов вариантов внутри одной миллисекунды.</p><p><b>Куда падать при отказе Redis.</b> Решение здесь принимается осознанно и по-разному для двух случаев. Если вызов не получил внятного ответа вовремя (таймаут клиента, сетевая икота), запрос пропускают: лимит здесь страхует бюджет, а не безопасность, и блокировать живого пользователя из-за сбоя инфраструктуры хуже, чем оплатить лишний вызов модели. А вот жёсткое исключение (Redis недоступен, соединение отвергнуто) пробрасывают наверх: если хранилище легло целиком, лучше шумно упасть, чем молча жечь бюджет вообще без ограничений.</p><p>Обошлось это в два часа работы вместе с тестами. Одна запись в сортированном множестве занимает около 50 байт, на пользователя их пять, и даже при десяти тысячах активных пользователей всё хранилище лимитов весит порядка 2,5 МБ. Настроенный лимит составил пять запросов за шестьдесят секунд на пользователя. Первым же уловом стал автоматизированный скрипт, бивший в ручку больше двухсот раз в час.</p><h2>Честный контракт с клиентом</h2><p>Ограничение без внятного ответа превращает вежливого клиента в невежливого: не понимая, что происходит, он начинает долбить чаще. Минимальный набор обязательств выглядит так:</p><ul><li>Отдавать 429 Too Many Requests, а не общий 400 или 503. По коду клиент понимает, что делать.</li><li>Присылать заголовок Retry-After, чтобы клиент знал момент следующей попытки, а не подбирал его перебором.</li><li>Показывать остаток бюджета в заголовках вида X-RateLimit-Remaining и X-RateLimit-Reset.</li></ul><p>Последний пункт стоит дешевле всего и работает лучше всего: клиент, который видит свой остаток, обычно распределяет запросы сам и до стены не доходит.</p><h2>Что забрать с собой</h2><p>Обе половины задачи решаются до того, как появится нагрузка, и обе стоят один вечер. Курсорная пагинация убирает и деградацию на глубоких страницах, и молчаливую порчу выдачи при параллельных записях. Атомарный счётчик в общем хранилище превращает лимит из декоративного в настоящий.</p><p>Отложить их дешевле всего прямо сейчас и дороже всего в момент, когда в поддержку придёт клиент с задвоенными заказами: тогда чинить придётся не только API, но и данные на его стороне.</p><p>Разборы, на которых основан материал: <a href="https://dev.to/sirmax/why-i-switched-my-api-from-offset-to-cursor-pagination-and-when-you-shouldnt-1464">переход с offset на курсор с замерами</a>, <a href="https://dev.to/weston_carnes_d580b505e0c/api-rate-limiting-patterns-algorithms-and-how-to-do-it-right-4l35">паттерны и алгоритмы ограничения частоты</a> и <a href="https://dev.to/anand_rathnas_d5b608cc3de/redis-sliding-window-rate-limiting-with-lua-the-15-line-script-that-saved-our-ai-budget-p0i">скользящее окно на Redis и Lua</a>.</p><p>Откройте свой самый нагруженный список и выполните запрос с большим смещением. Если ответ идёт дольше сотни миллисекунд, вы уже нашли, с чего начать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Dawarich 1.14 рисует миллион GPS-точек за секунду вместо падения браузера</title>
      <link>https://tproger.ru/news/dawarich-1-14-risuet-million-gps-tochek-za-sekundu-vmesto-padeniya</link>
      <comments>https://tproger.ru/news/dawarich-1-14-risuet-million-gps-tochek-za-sekundu-vmesto-padeniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/dawarich-1-14-risuet-million-gps-tochek-za-sekundu-vmesto-padeniya</guid>
      <description><![CDATA[<p>Dawarich перевёл точки и треки на карты-тайлы: 957 350 точек грузятся меньше секунды, JSON упал с 590 МБ до 150 КБ. Что ещё в 1.14.1 и сколько стоит облако.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/dawarich-1-14-risuet-million-gps-tochek-za-sekundu-vmesto-padeniya">Dawarich 1.14 рисует миллион GPS-точек за секунду вместо падения браузера</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:33:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Автор Dawarich, открытой self-hosted замены Google Timeline, под ником Freika 2 сентября <a href="https://www.reddit.com/r/selfhosted/comments/1w56g1u/dawarich_1141_now_rendering_millions_of_points_in/">показал</a>, что после перевода отрисовки на карты-тайлы тестовый набор из 957 350 геоточек загружается меньше чем за секунду. Раньше такой объём ронял браузер. Объём JSON, который уходил клиенту, уменьшился примерно с 590 МБ до 150 КБ. Сам релиз 1.14.1 <a href="https://github.com/Freika/dawarich/releases/tag/1.14.1">вышел</a> 31 августа.</p><p>Кому это важно: тем, кто много лет копил историю перемещений в Google Timeline и после переноса её на устройство ищет, где хранить данные самому. Импорт Google Takeout в Dawarich есть, а с новой отрисовкой многолетний архив перестаёт быть проблемой для интерфейса. Проект написан на Ruby on Rails с PostgreSQL и ставится через Docker; на сайте указано больше 9000 звёзд на GitHub.</p><ul><li>Точки, треки, маршруты и слои «тумана войны» теперь отдаются через map tiles; 957 350 точек за меньше чем секунду, JSON с 590 МБ до 150 КБ.</li><li>Для перетаскивания точек на карте новый режим нужно отключить.</li><li>Определение посещений (visit detection) переписано с нуля; метаданные устройств перенесены в таблицу point_sources.</li><li>OwnTracks в HTTP-режиме показывает членов семьи на карте; перелёты из AirTrail считаются отдельно от треков Dawarich.</li><li>Self-hosting бесплатен со всеми функциями; облако: Lite 59,99 евро в год (12 месяцев истории, 200 запросов API в час), Pro 149,99 евро (бессрочная история, 1000 запросов в час), Family 299,99 евро (до 5 человек).</li></ul><h2>Почему тайлы решают проблему миллиона точек</h2><p>Старая схема отдавала клиенту все точки в JSON, и браузер сам рисовал их на карте. На сотнях тысяч точек это сотни мегабайт данных и столько же объектов в памяти вкладки. Новая схема режет данные на тайлы: карта запрашивает только тайлы видимой области и масштаба, а отрисовка по-прежнему идёт в браузере, просто над несравнимо меньшим объёмом данных. Плата за это одна, и автор её называет: точки в режиме тайлов нельзя таскать мышью, для редактирования режим надо выключить.</p><p>Автор пишет, что за месяц вышло девять релизов, и называет результат «немного безумным» (перевод редакции). Для админа, который держит Dawarich на маломощном VPS или Raspberry Pi, важно другое: девять релизов за месяц означают частые миграции базы, и перед каждым обновлением нужен бэкап PostgreSQL.</p><h2>Что ещё изменилось в 1.14.1</h2><ul><li>Метаданные устройств перенесены в таблицу point_sources: миграция базы при обновлении обязательна, перед ней нужен бэкап PostgreSQL.</li><li>Импорт OwnTracks исправлен для массивов PostgreSQL; повреждённая или обрезанная загрузка теперь отклоняется без ошибки сервера.</li><li>Расстояние перелётов из AirTrail считается отдельно от расстояния, записанного трекером.</li><li>Интерфейс переведён на шесть языков: английский, немецкий, испанский, французский, польский и каталанский; следующим заявлен упрощённый китайский. Русского перевода нет.</li></ul><h2>Self-hosting или облако</h2><p>Self-hosted версия бесплатна и включает всё, что есть в платных тарифах, ограничения только у облачного варианта: Lite за 59,99 евро в год хранит 12 месяцев истории и даёт 200 запросов API в час, Pro за 149,99 евро снимает лимит истории и поднимает потолок до 1000 запросов, Family за 299,99 евро рассчитан максимум на пять участников. Условия оплаты облака по регионам проект не описывает; self-hosting от них не зависит.</p><p>Что проверить перед обновлением: сделать дамп базы, обновить образ Docker до 1.14.1, дождаться миграций и убедиться, что карта показывает точки в новом режиме. Кому релиз не нужен: тем, у кого история перемещений измеряется тысячами точек, а не сотнями тысяч; для них разница будет незаметна. О другом свежем self-hosted проекте того же класса мы писали на примере <a href="https://tproger.ru/news/home-assistant-2026-9-pokazal-kartu-matter-i-modbus-integracii-b">Home Assistant 2026.9</a>; о хранении резервных копий такого рода данных есть разбор <a href="https://tproger.ru/articles/kak-hranit-bekapy-v-s3-chtoby-ih-ne-udalil-sboj-ili-virus">про бэкапы в S3</a>.</p><p>Источники: <a href="https://www.reddit.com/r/selfhosted/comments/1w56g1u/dawarich_1141_now_rendering_millions_of_points_in/">Пост разработчика в r/selfhosted</a>, <a href="https://github.com/Freika/dawarich/releases/tag/1.14.1">Релиз 1.14.1 на GitHub</a>, <a href="https://dawarich.app/">Сайт проекта</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Интерпретатор Plush перешёл на регистры и ускорился до 3,37 раза</title>
      <link>https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza</link>
      <comments>https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza</guid>
      <description><![CDATA[<p>Байткод Plush переписан со стековой модели на регистровую: медиана 2,07 раза, максимум 3,37, на fib быстрее Lua на 24%. Как устроено и что не выросло.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza">Интерпретатор Plush перешёл на регистры и ускорился до 3,37 раза</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:32:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Максим Шевалье-Буавер, автор языка Plush и в прошлом разработчица JIT-компилятора YJIT для Ruby, 2 сентября <a href="https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter/">описала</a>, как переписала виртуальную машину Plush со стекового байткода на регистровый. На наборе синтетических тестов новый интерпретатор быстрее старого в 2,07 раза по медиане и до 3,37 раза в лучшем случае; на тестах fib и binary_tree Plush обогнал Lua 5.5.1 на 24% и 55%.</p><p>Практический интерес здесь не в самом Plush, минималистичном динамическом языке на Rust, а в измеренном ответе на старый вопрос: сколько стоит стековая модель байткода. Вывод автора сформулирован жёстко: «вам, вероятно, не стоит писать стековые байткод-интерпретаторы в 2026 году» (перевод редакции). Для тех, кто пишет свои DSL, скриптовые движки или встраиваемые интерпретаторы, это готовый аргумент с цифрами и с честным списком того, что не ускорилось.</p><ul><li>Медианное ускорение 2,07 раза, максимальное 3,37; геометрическое среднее 1,94 раза, из них 1,55 дала сама регистровая модель без оптимизаций, ещё 25% добавили специализированные инструкции.</li><li>Инструкция теперь 64-битное слово вместо enum на 24 байта; трёхадресная форма reg(a) = reg(b) + reg(c), до 64 000 локальных переменных, 76 опкодов.</li><li>Замеры: MacBook Air M5 (10 ядер, arm64), rustc 1.96.0, 11 чередующихся запусков на тест, медиана; повторный прогон дал те же результаты.</li><li>Против Lua 5.5.1: быстрее на 24% в fib и на 55% в binary_tree; сравнение с CPython 3.14.6 и CRuby 4.0.6 автор ограничивает оговорками о разной семантике и составе тестов.</li><li>Тесты сборщика мусора почти не изменились: регистровая модель ускоряет диспетчеризацию, а не аллокацию.</li></ul><h2>Почему стековая машина медленнее</h2><p>В стековой VM выражение a + b превращается в три инструкции: положить a, положить b, сложить. Каждая инструкция проходит через диспетчер: прочитать опкод, перейти на обработчик, сдвинуть указатель. В регистровой VM то же выражение записывается одной инструкцией с тремя операндами: куда положить и что сложить. Главный тезис статьи: в интерпретаторе самый большой рычаг производительности это число инструкций, которые нужно продиспетчеризовать, и регистровая модель сокращает его в разы. Автор цитирует это как основной вывод: «снова, в интерпретаторе главный рычаг это уменьшение числа инструкций» (перевод редакции).</p><p>Второй эффект: значения не гоняются между локальными переменными и временным стеком. Локальные переменные и есть регистры фрейма, поэтому x = y + z не требует ни загрузки, ни сохранения.</p><h2>Как устроен новый байткод</h2><p>Старая инструкция была Rust-перечислением Insn размером 24 байта. Новая упакована в 64-битное слово: опкод и операнды-регистры. Для сравнения автор приводит Lua: там 32-битное слово с 8-битными полями, отсюда лимит в 255 регистров на фрейм и 200 именованных локальных переменных. У Plush поля шире, до 64 000 локальных переменных, ценой вдвое большего размера инструкции. Всего опкодов 76. Сверху добавлены оптимизации, каждая из которых убирает инструкции: слитые сравнение-и-переход, сдвиги и маски с непосредственными операндами, свёртка констант, устранение лишних пересылок. Инлайн-кэши вынесены в отдельные таблицы, чтобы не раздувать слово инструкции.</p><p>Замену enum на 64-битное слово автор описывала <a href="https://pointersgonewild.com/2026-08-25-replacing-a-rust-enum-with-a-64-bit-word/">неделей раньше</a>, тогда это дало 17% на старой стековой модели; нынешняя статья седьмая в серии о Plush.</p><h2>Что показали замеры и где их границы</h2><p>Методика описана подробно: MacBook Air M5, rustc 1.96.0, для каждого сравнения 11 чередующихся запусков старой и новой версии, берётся медиана, весь набор прогнан дважды. Сравнивались конкретные коммиты репозитория. Неоптимизированная регистровая VM дала 1,55 раза по геометрическому среднему, оптимизации добавили ещё 25%, итого 1,94; медиана по отдельным тестам 2,07, максимум 3,37. Тесты, упирающиеся в сборщик мусора, остались на месте: диспетчеризация там не узкое место.</p><p>Сравнение с другими языками автор сопровождает оговорками: CPython 3.14.6, CRuby 4.0.6 и Lua 5.5.1 имеют другую семантику, а набор тестов синтетический. Заявлены только два прямых результата против Lua: fib на 24% быстрее, binary_tree на 55%. Отдельная демонстрация: программный рендеринг уровня Quake в 800 на 600 в один поток, около 47 кадров в секунду, с живой кучей до 1 ГБ без заметных пауз GC по оценке автора.</p><h2>Что из этого забрать в свой интерпретатор</h2><ul><li>Если вы проектируете байткод с нуля, начинайте с регистровой модели: выигрыш от неё больше, чем от любой микрооптимизации диспетчера.</li><li>Считайте инструкции, а не такты: слитые инструкции (сравнение плюс переход) и непосредственные операнды окупаются именно сокращением диспетчеризации.</li><li>Не ждите ускорения там, где узкое место в аллокации: GC-тесты Plush не изменились.</li><li>Готовые бинарники Plush есть для Linux и macOS (x86-64 и arm64) и через PowerShell-установщик для Windows x86-64; код под Apache-2.0, примеры под CC0, всё в <a href="https://github.com/maximecb/plush">репозитории</a>.</li></ul><p>Кому это не пригодится: тем, кто использует готовые рантаймы и не пишет свои. CPython, к слову, остаётся стековой машиной, и разница подходов хорошо видна на его фоне; о цене операций в самом Python мы недавно писали в связи с новой <a href="https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya">3.15.0rc2</a>. Другой свежий пример переписанного интерпретатора с подробным разбором каждой оптимизации: <a href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0</a>, где тоже сменили промежуточное представление и получили 2,2 раза.</p><p>Источники: <a href="https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter/">Pointers Gone Wild: Plush's New Register-Based Interpreter</a>, <a href="https://github.com/maximecb/plush">Репозиторий Plush</a>, <a href="https://pointersgonewild.com/2026-08-25-replacing-a-rust-enum-with-a-64-bit-word/">Предыдущая статья серии: Replacing a Rust enum with a 64-bit word</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Go 1.27 находит утечки горутин в работающем сервисе через pprof</title>
      <link>https://tproger.ru/news/go-1-27-nahodit-utechki-gorutin-v-rabotayushhem-servise-cherez-pprof</link>
      <comments>https://tproger.ru/news/go-1-27-nahodit-utechki-gorutin-v-rabotayushhem-servise-cherez-pprof?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/go-1-27-nahodit-utechki-gorutin-v-rabotayushhem-servise-cherez-pprof</guid>
      <description><![CDATA[<p>Профиль goroutineleak в Go 1.27 находит горутины, навсегда заблокированные на каналах, Mutex, WaitGroup и Cond, в продакшене: как включить и что он не ловит.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/go-1-27-nahodit-utechki-gorutin-v-rabotayushhem-servise-cherez-pprof">Go 1.27 находит утечки горутин в работающем сервисе через pprof</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 01:46:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда Go 2 сентября <a href="https://go.dev/blog/goroutine-leak-profiles">рассказала</a> в официальном блоге о новом типе профиля goroutineleak, который вошёл в Go 1.27. Он находит горутины, навсегда заблокированные на каналах и примитивах пакета sync, и делает это на работающем продакшен-сервисе, без тестов и без остановки процесса. Профиль доступен через runtime/pprof и через стандартный HTTP-обработчик net/http/pprof по адресу /debug/pprof/goroutineleak.</p><p>Для тех, кто держит Go-сервисы в проде, это закрывает старую дыру в инструментах. Обычный goroutine-профиль показывает, сколько горутин сейчас заблокировано, но не отличает штатное ожидание от горутины, которая уже никогда не проснётся. Раньше такие утечки искали руками по стекам или ловили в тестах пакетом goleak; сам релиз Go 1.27 <a href="https://go.dev/blog/go1.27">вышел</a> 19 августа, а разбор механизма команда опубликовала только сейчас.</p><ul><li>Профиль goroutineleak входит в Go 1.27 и доступен через runtime/pprof и net/http/pprof (/debug/pprof/goroutineleak).</li><li>Ловит блокировки на отправке и приёме в канал, блокирующем select, Mutex, RWMutex, WaitGroup и Cond.</li><li>Не считает утечкой ожидание файлового и сетевого ввода-вывода, системных вызовов и самодельных спинлоков.</li><li>По словам команды Go, метод точный и почти не даёт ложных срабатываний; накладные расходы на память названы пренебрежимо малыми, худший случай для одного цикла GC оценён как O(n²).</li><li>В примере из блога профиль нашёл 116 зависших горутин на одной строке с отправкой в небуферизованный канал.</li></ul><h2>Что такое утечка горутины и почему её было трудно найти</h2><p>Утечка горутины по определению из блога Go: горутина заблокирована на операции, условие для продолжения которой больше никогда не наступит. Классический пример: воркеры пишут результаты в небуферизованный канал, а читатель вышел из функции по первой ошибке. Каждый следующий воркер зависает на ch &lt;- result навсегда, и чем дольше живёт процесс, тем больше таких горутин копится, растёт потребление памяти и нагрузка на сборщик мусора.</p><p>До Go 1.27 инструментов было три, и ни один не решал задачу для продакшена. goleak проверяет, не остались ли горутины после конкретного теста. Пакет synctest, появившийся в стандартной библиотеке Go 1.25, помогает тестировать конкурентный код с виртуальным временем. Обычный goroutine-профиль показывает заблокированные горутины, но не доказывает, что они не проснутся: всплеск нагрузки выглядит в нём так же, как утечка.</p><h2>Как профиль отличает утечку от штатной блокировки</h2><p>Идея, которую описывает автор поста Влад Сайок из команды Go, опирается на работу, которую сборщик мусора и так делает. GC вычисляет достижимость памяти от корней. Команда добавила к этому анализу горутины: горутина считается живой, если она не заблокирована на примитиве конкурентности или если примитив, на котором она ждёт, достижим из какой-нибудь живой горутины. Анализ стартует с незаблокированных горутин и распространяется по доступным им каналам и мьютексам. Всё, что осталось недостижимым после этого обхода, никто уже не разблокирует, значит, это утечка.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/c958bdbf-595c-4ab4-894d-ff81b1255c95.webp" alt="Схема изменённого алгоритма маркировки сборщика мусора Go с учётом заблокированных горутин" /><figcaption>Схема изменённого алгоритма маркировки: горутины помечаются живыми вместе с достижимыми примитивами синхронизации. Источник: Go Blog</figcaption></figure><p>Команда Go утверждает, что механизм точный и «почти не даёт ложных срабатываний» (перевод редакции). Есть патологический случай: цепочка горутин, где каждая ждёт примитив, доступный только следующей. Для такой «гирлянды» проверка в худшем случае занимает O(n²) шагов за один цикл GC, поэтому в блоге советуют не включать сбор профиля постоянно, а снимать его периодически, например раз в четыре часа. Память на учёт горутин авторы называют пренебрежимо малой, а GC при этом продолжает работать параллельно с пользовательским кодом.</p><p>Разработка выросла из совместного исследования Орхусского университета, Университета Вашингтона в Сент-Луисе и Uber; академическую версию представили на конференции ASPLOS 2025.</p><h2>Что видно в профиле на живом примере</h2><p>В блоге разобран сервис, который раз в секунду запускает обработку десяти элементов и на пятом получает ошибку. Функция делает ранний return, оставшиеся воркеры зависают на отправке в канал. Программа подключает net/http/pprof и слушает localhost:6060; профиль снимают обычным способом:</p><p>Через несколько минут работы pprof показывает Total: 116 заблокированных горутин, и все они стоят на одной операции: отправке в канал ch. Исправление для примера тривиальное: сделать канал буферизованным на число воркеров, make(chan result, len(ws)), тогда воркеры допишут результаты и завершатся, даже если читатель ушёл.</p><h2>Что профиль не ловит</h2><ul><li>Ожидание файлового и сетевого ввода-вывода и системных вызовов утечкой не считается: горутина, зависшая на чтении из сокета, в профиль не попадёт.</li><li>Самодельные спинлоки и другие пользовательские механизмы блокировки не входят в гарантированный набор.</li><li>Горутина, которая по замыслу ждёт вечно на достижимом канале (например, фоновый слушатель), утечкой не считается, потому что канал достижим из живого кода.</li></ul><p>Кому новый профиль ничего не даст: сервисам, где горутины блокируются в основном на сети, а не на каналах, и проектам, которые ещё не перешли на Go 1.27. Профиль работает только в рантайме этой версии; для старых сборок остаются goleak и ручной разбор стеков.</p><h2>Как включить у себя</h2><ol><li>Обновить тулчейн до Go 1.27 (релиз от 19 августа 2026 года, <a href="https://go.dev/doc/go1.27">заметки к выпуску</a>) и пересобрать сервис.</li><li>Если net/http/pprof уже подключён, новый обработчик появится автоматически по пути /debug/pprof/goroutineleak; отдельной настройки не нужно.</li><li>Снимать профиль периодически, а не постоянно: команда Go предлагает интервал вроде четырёх часов из-за квадратичного худшего случая.</li><li>Смотреть в первую очередь на места с ранним return при ошибках, таймауты без select с контекстом и воркер-циклы, у которых читатель может уйти раньше писателей.</li></ol><p>Схемы GC и полный пример кода лежат в <a href="https://go.dev/blog/goroutine-leak-profiles">посте команды Go</a>. Из соседних новостей по инфраструктуре Go-сервисов на сайте есть разбор <a href="https://tproger.ru/news/kubernetes-1-37-chitaet-bolwie-kollekcii-iz-etcd-potokom-i-ekono">Kubernetes 1.37</a> и заметка о <a href="https://tproger.ru/news/tailscale-vypustila-tailcat-soedinit-dve-mawiny-cherez-nat-bez">tailcat от Tailscale</a>, написанном на Go.</p><p>Источники: <a href="https://go.dev/blog/goroutine-leak-profiles">Go Blog: Goroutine leak profiles</a>, <a href="https://go.dev/doc/go1.27">Go 1.27 Release Notes</a>, <a href="https://go.dev/blog/go1.27">Go Blog: Go 1.27 is released</a></p><p>Изображение на обложке: Go Authors, логотип Go</p>]]></content:encoded>
    </item>
    <item>
      <title>Прототип Cloudflare сжал текст в кэше в 2,8 раза ценой пары процентов CPU</title>
      <link>https://tproger.ru/news/prototip-cloudflare-szhal-tekst-v-kewe-v-2-8-raza-cenoj-pary-proc</link>
      <comments>https://tproger.ru/news/prototip-cloudflare-szhal-tekst-v-kewe-v-2-8-raza-cenoj-pary-proc?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/prototip-cloudflare-szhal-tekst-v-kewe-v-2-8-raza-cenoj-pary-proc</guid>
      <description><![CDATA[<p>Cloudflare описала прототип Cache Transcoding в Pingora: текстовые ответы сжимаются zstd при записи в кэш и распаковываются перед выдачей. Коэффициент 2,834x, цена 4,31 нс на байт. Разбираем, где приём применим у себя.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/prototip-cloudflare-szhal-tekst-v-kewe-v-2-8-raza-cenoj-pary-proc">Прототип Cloudflare сжал текст в кэше в 2,8 раза ценой пары процентов CPU</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:33:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Cloudflare 1 сентября <a href="https://blog.cloudflare.com/cache-transcoding/">описала</a> прототип Cache Transcoding: подходящие ответы сжимаются алгоритмом zstd перед записью на диск кэша и перед передачей между уровнями Tiered Cache, а перед выдачей клиенту распаковываются. В тестах компании подходящие объекты стали занимать в среднем треть исходного места. Для тех, кто держит собственный кэширующий прокси или CDN, это готовая схема обмена дешёвого CPU на дорогой диск.</p><p>Автор публикации Ааши Патель из Cloudflare объясняет мотивацию просто: память и диски дорожают, а кэш-серверы Cloudflare хранят огромный объём текста, который origin-серверы отдают без сжатия. Прототип реализован внутри Pingora, прокси-фреймворка компании на Rust.</p><ul><li>На контрольном наборе коэффициент сжатия составил 2,834x при zstd уровня 3.</li><li>Кодирование стоит 4,31 нс на байт (около 232 МБ/с), декодирование 1,56 нс на байт (около 641 МБ/с).</li><li>HTML, JSON, CSS и JavaScript давали 67,3% запросов, но только 22,3% байтов; около 71% таких ответов приходили без Content-Encoding.</li><li>Картинки, видео и шрифты занимали 63,3% байтов при 21,4% запросов; повторно сжимать их невыгодно.</li><li>Порог 4 КиБ отсекает мелкие объекты и теряет около 1% потенциально сжимаемых байтов.</li></ul><h2>Почему сжимать пришлось именно в кэше</h2><p>Казалось бы, текст в интернете и так сжат. Но по замерам Cloudflare около 71% текстовых ответов приходят от origin-серверов без заголовка Content-Encoding: сжатие для клиента делает уже edge-сервер, а на диск кэша объект ложится сырым. При этом HTML, JSON, CSS и JavaScript составляли 67,3% запросов и 22,3% байтов, а медиа и шрифты 21,4% запросов и 63,3% байтов. Пересжимать медиа бессмысленно: оно уже сжато своими кодеками. Значит, целевая доля кэша, где сжатие даёт эффект, это примерно пятая часть байтов.</p><p>Ключевая фраза публикации: «стоимость кодирования оплачивается один раз, когда объект попадает в кэш» (перевод редакции). Дальше объект читают многократно, а декодирование почти в три раза дешевле кодирования. Между дата-центрами через Tiered Cache объект едет уже сжатым, и это экономит ещё и междатацентровый трафик.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/0f339ada-ed27-4fd6-8d3a-853b7e473f36.webp" alt="Схема Cache Transcoding: объект сжимается на входе в кэш, передаётся между уровнями сжатым и распаковывается перед клиентом" /><figcaption>Путь объекта через уровни кэша в прототипе Cache Transcoding. Источник: Cloudflare</figcaption></figure><h2>Критерии и цифры</h2><p>В прототипе сжимались только ответы 200 OK с тремя условиями: заголовок Content-Encoding не задан, тип содержимого сжимаемый, известен Content-Length не меньше 4 КиБ. Range-запросы, уже сжатые ответы, тела неизвестной длины и бинарное содержимое проходят без изменений. Порог 4 КиБ исключил много мелких запросов, но потерял, по расчётам компании, около 1% потенциально сжимаемых байтов: «сжатие всего подходящего текста от 4 КиБ и выше дало почти всю измеренную экономию места».</p><p>Замеры производительности проводились на более чем миллионе запросов через 10 кэш-серверов. Коэффициент 2,834x получен на двух тестовых объектах размером около 195 и 272 КиБ, а не на всём кэше сервиса. Кодирование zstd уровня 3 стоило 4,31 нс на байт, декодирование 1,56 нс на байт. Дополнительная нагрузка на CPU при выбранных предположениях, по оценке Cloudflare, составила несколько процентов. Это замер вендора на его трафике; на другом профиле содержимого доля текста и коэффициент будут иными.</p><h2>Как повторить у себя</h2><p>Приём применим к любому кэширующему слою, где объекты хранятся на диске и читаются чаще, чем пишутся: nginx с proxy_cache, Varnish, самописные кэши на Pingora или Go. Порядок действий по мотивам публикации:</p><ol><li>Измерить долю ответов без Content-Encoding и их суммарный объём: если origin уже сжимает всё, выигрыша не будет.</li><li>Ограничить кандидатов по типу содержимого и размеру; порог 4 КиБ у Cloudflare покрыл почти всю экономию.</li><li>Сжимать один раз при записи, хранить сжатым, декодировать при выдаче; прототип Cloudflare всегда декодирует объект, а отдачу сжатого представления клиенту напрямую компания называет будущей работой.</li><li>Считать CPU: при 232 МБ/с на кодирование одно ядро обслуживает ограниченный поток записи, и на серверах с высокой долей промахов кэша это может стать узким местом.</li></ol><p>Для российских хостингов и собственных CDN аргумент тот же, что у Cloudflare: диски и память дорожают, а zstd есть в любом дистрибутиве и в библиотеках для всех основных языков. Cloudflare описывает внутренний прототип, а не продукт, поэтому ни включить, ни купить эту функцию нельзя; повторять придётся у себя.</p><h2>Что осталось проверить</h2><p>Компания перечисляет открытые вопросы: другие уровни zstd, другие типы объектов, range-запросы и предварительно сжатые ответы. Zstandard, напомним, разработан Янном Колле и открыт в 2016 году; в более раннем тестировании Cloudflare он сжимал на 42% быстрее Brotli и давал файлы на 11,3% меньше gzip при сопоставимой скорости. Редакция проверит, дойдёт ли прототип до боевой сети и появятся ли цифры по общей экономии.</p><p>Источник: <a href="https://blog.cloudflare.com/cache-transcoding/">Блог Cloudflare: Cache Transcoding</a></p><p>Изображение на обложке: Cloudflare</p>]]></content:encoded>
    </item>
    <item>
      <title>Wasmi 2.0 ускорил интерпретацию WebAssembly в 2,2 раза</title>
      <link>https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza</link>
      <comments>https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza</guid>
      <description><![CDATA[<p>Вышел Wasmi 2.0, интерпретатор WebAssembly на Rust: новый исполнитель, четыре режима dispatch, аккумуляторные регистры и стабильный fuel metering. Замеры авторов на M2 Pro, EPYC и Xeon и что это значит для плагинов и embedded.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0 ускорил интерпретацию WebAssembly в 2,2 раза</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:28:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Робин Фрайлер, автор интерпретатора WebAssembly Wasmi, 1 сентября <a href="https://wasmi-labs.github.io/blog/posts/wasmi-v2.0/">объявил</a> о выходе Wasmi 2.0. По замерам самого проекта, новая версия исполняет Wasm-код примерно в 2,2 раза быстрее Wasmi 1.0 по геометрическому среднему набора бенчмарков. Для тех, кто запускает Wasm там, где JIT недоступен или нежелателен, это означает заметное ускорение без смены рантайма.</p><p>Wasmi написан на Rust и рассчитан на сценарии, где нужен именно интерпретатор: плагины в приложениях, встраиваемые устройства, песочницы, смарт-контракты. Релиз <a href="https://github.com/wasmi-labs/wasmi/releases/tag/v2.0.0">опубликован</a> на GitHub и crates.io; работа над ним заняла восемь месяцев.</p><ul><li>Wasmi 2.0 примерно в 2,2 раза быстрее Wasmi 1.0 по геометрическому среднему; замеры вендора на Apple M2 Pro, AMD EPYC 7763 и Intel Xeon Platinum 8370C.</li><li>Появились четыре режима dispatch; indirect-threaded на 10–15% медленнее direct-threaded, но экономит память под IR.</li><li>Новое промежуточное представление с аккумуляторными регистрами ireg, freg32 и freg64 и 64-битными ячейками стека.</li><li>Fuel metering стал стабильным и привязан к входному Wasm-коду; появился deterministic profile и новый CLI.</li><li>Включение SIMD больше не замедляет обычный код: в 1.0 это стоило около 8%, в 2.0 разница в пределах шума.</li></ul><h2>Откуда взялись 2,2 раза</h2><p>Автор подробно разбирает три источника ускорения. Первый: режимы диспетчеризации инструкций. В 1.0 был один switch-loop, теперь их четыре: direct-threaded, indirect-threaded, switch-loop и call-loop. Режим auto-dispatch включён по умолчанию и выбирает threaded-код там, где компилятор и платформа это позволяют. Indirect-threaded вариант примерно на 10–15% медленнее direct-threaded, зато требует меньше памяти на промежуточное представление, что важно для микроконтроллеров.</p><p>Второй источник: новое промежуточное представление. В 1.0 операнды адресовались смещениями в стеке; в 2.0 появились аккумуляторные регистры ireg, freg32 и freg64, через которые проходит большая часть значений. Ячейки стека стали всегда 64-битными, а SIMD-значения занимают две соседние ячейки, поэтому поддержка SIMD больше не стоит производительности обычного кода.</p><p>Третий: структура CodeMap, в которой хранятся скомпилированные функции. Она стала append-only с раздельными buckets, поэтому вызов внутренней функции на горячем пути не требует ни одного lookup и не берёт блокировок. Доступ к данным экземпляра модуля, по бенчмарку count/globals, улучшился примерно на 35%; таблицы Wasm уменьшились в 2–4 раза за счёт 32-битных ссылок.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/9fd51160-93fb-4066-847b-01cefb14b81b.webp" alt="График геометрического среднего времени исполнения для Wasmi 1.0, Wasmi 2.0, Wasm3, WAMR, Stitch и Wasmtime Pulley" /><figcaption>Геометрическое среднее времени исполнения по набору wasmi-benchmarks на Apple M2 Pro. Источник: Wasmi Labs</figcaption></figure><h2>Как измеряли и с кем сравнивали</h2><p>Замеры сделаны на проекте wasmi-benchmarks, который можно запустить самостоятельно, на трёх машинах: Apple M2 Pro, AMD EPYC 7763 и Intel Xeon Platinum 8370C. Кроме Wasmi 1.0 в сравнении участвовали интерпретаторы Wasm3, WAMR в режиме fast-interpreter, Wasmtime Pulley и Stitch. Это замер вендора: набор тестов, машины и конфигурации выбирал сам проект, и автор оговаривает, что цифры зависят от нагрузки.</p><p>В посте есть поучительный эпизод про компилятор. Rust 1.92 включил оптимизацию DestinationPropagation, из-за чего CoreMark у интерпретатора Stitch упал с более чем 3000 до примерно 2200 баллов; после исправления результат вернулся выше 3000. Похожая проблема нашлась и в Wasmi: её устранение подняло CoreMark примерно с 2800 до более чем 4200 баллов, то есть примерно на 50%. Вывод для практики: производительность интерпретатора на Rust заметно зависит от версии компилятора, и после обновления toolchain бенчмарки стоит перепрогонять.</p><h2>Что изменилось кроме скорости</h2><ul><li>Fuel metering, то есть учёт «топлива» на выполнение, стал стабильным и считается по входному Wasm-коду, а не по внутренним инструкциям; это важно для смарт-контрактов и лимитов на плагины.</li><li>Deterministic profile гарантирует одинаковый результат на разных платформах.</li><li>Поддержка memory64 стала опциональной; отключение валидации через feature validate уменьшает бинарник примерно на 200–300 КБ.</li><li>Обновлённый CLI и C-API.</li></ul><p>Кому обновление ничего не даст: тем, кто запускает Wasm через JIT-рантаймы вроде Wasmtime или V8 на сервере и в браузере. Интерпретатор нужен там, где JIT запрещён (iOS, некоторые блокчейн-среды), где нет памяти под скомпилированный код или где важна предсказуемость времени запуска.</p><h2>Как попробовать</h2><p>Wasmi ставится как обычный crate из crates.io; для Rust-проекта достаточно обновить зависимость wasmi до версии 2.0 и прогнать тесты: автор предупреждает о смене внутреннего представления, а значит, поведение при ошибках и лимитах стоит перепроверить. Проект открыт, спонсируется Stellar Development Foundation с октября 2024 года.</p><p>В планах на Wasmi 3.0 названы оставшиеся части WebAssembly 3.0: function-references, exception-handling и gc. Сроков автор не называет.</p><p>Источники: <a href="https://wasmi-labs.github.io/blog/posts/wasmi-v2.0/">Блог Wasmi Labs: Wasmi v2.0</a>, <a href="https://github.com/wasmi-labs/wasmi/releases/tag/v2.0.0">Релиз v2.0.0 на GitHub</a></p><p>Изображение на обложке: Wasmi Labs</p>]]></content:encoded>
    </item>
    <item>
      <title>Zero на Three.js: инженерный разбор интерактивного сайта</title>
      <link>https://tproger.ru/articles/zero-na-three-js-inzhenernyj-razbor-interaktivnogo-sajta</link>
      <comments>https://tproger.ru/articles/zero-na-three-js-inzhenernyj-razbor-interaktivnogo-sajta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zero-na-three-js-inzhenernyj-razbor-interaktivnogo-sajta</guid>
      <description><![CDATA[<p>Разбираем, как BUNQ LABS сделала zero.university: виртуальный скролл, шейдеры, KTX2/DRACO, адаптивное качество и загрузка текстур без фризов. Проверьте техники.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zero-na-three-js-inzhenernyj-razbor-interaktivnogo-sajta">Zero на Three.js: инженерный разбор интерактивного сайта</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Jul 2026 04:19:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте, что вы заходите на сайт, а он не пускает. Нет кнопки «войти» — только поле, где нужно нарисовать ноль. Как только круг замыкается, из линии расходится инеевый узор, и сайт начинает рассказывать историю. Это не декоративная заглушка: так работает <a href="https://zero.university/">zero.university</a> — кейс, где первый жест пользователя сразу задаёт тон всему повествованию.</p><p><b>Zero</b> — иммерсивный лендинг индийского стартапа Zero University, который предлагает альтернативу классическому университетскому пути. Сайт превращает скролл в шестиактную историю: традиционное образование, разбитое стекло, горящие деньги, уничтоженные сертификаты, тоннель из логотипа ZERO и, наконец, интерактивная карта города с офисами реальных компаний. Цель — не просто показать красивую картинку, а провести пользователя через аргумент: диплом перестаёт быть гарантией, а навыки открывают дорогу в индустрию.</p><p>Проект разрабатывала студия <b>BUNQ LABS</b> четыре месяца. Исходные ассеты занимали больше гигабайта: несжатые Blender-сцены, 8K-текстуры и запечённые анимации. Финальная сборка уместилась в 10 МБ и держит 60 FPS даже на бюджетном Android. Команда опубликовала технический разбор на Codrops, а мы выделили решения, которые можно перенести в свои WebGL-проекты.</p><ul><li>Первый жест как ворота: распознавание нуля — это простая проверка угла, округлости и замкнутости, а не нейросеть.</li><li>Виртуальный скролл заменяет нативный: одно число управляет загрузкой, анимацией, шейдерами и текстом.</li><li>Ассеты важнее рендера: DRACO, KTX2/ETC1S, атласы и собственный превьювер сжали гигабайты до мегабайтов.</li><li>Текстурные загрузки — главный источник фризов; декодинг в воркере и очередь по requestIdleCallback решают проблему.</li><li>Адаптивное качество по frame time позволяет не гадать о мощности устройства.</li><li>Мобильная точность шейдеров: mediump на Adreno и Mali — это реальный 16-битный float, и его недостаточно для сложных эффектов.</li></ul><p>Разбираем, как это устроено изнутри, и что из этого можно взять в свою работу.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-07-28/00e5f2ad-8fc7-49b9-88da-322a34a6bef1.webp" alt="Шесть этапов интерактивного повествования zero.university: от традиционного образования до интерактивной карты города." /><figcaption>Схема повествования: шесть этапов и пять «ворот», через которые проходит пользователь. Источник: Codrops / BUNQ LABS</figcaption></figure><h2>Сюжет из шести этапов и пяти ворот</h2><p>Интерактивный нарратив строится вокруг пяти «ворот» — точек, где скролл останавливается и ждёт действия пользователя. Сначала нужно нарисовать ноль, затем удерживать касание, чтобы разбить стекло, потом — чтобы запуститься сквозь тоннель. Каждый жест связан с сюжетным поворотом: обещание университетского пути буквально трескается, за ним появляется статистика безработицы, диплом превращается в горящую бумагу, сертификаты рвутся на полосы.</p><h3>От обещания к свободе</h3><p>Шесть этапов идут от иллюзии контролируемого пути к интерактивной карте, где пользователь сам выбирает, куда смотреть. Финальный экран — город с башней Zero University в центре. Можно приближать, панорамировать и открывать карточки ролей, сценариев и инструментов. Это не просто финал: после того как сайт вёл пользователя за руку, он отдаёт управление обратно.</p><h2>Архитектура: один скролл управляет всем</h2><p>Одно из главных архитектурных решений — отказ от нативного скролла браузера. Нет ScrollTrigger, нет огромного прокручиваемого DOM. Вместо этого события колёсика и тача обновляют виртуальное значение скролла, которое плавно догоняет цель. Всё остальное — загрузка ассетов, анимации, тайминги шейдеров, текст и оверлеи — читают это единственное число.</p><p>Проект разбит на девять таких сегментов; загрузчик одновременно выполняет роль первых ворот. Каждый сегмент самодостаточен: у него свой жизненный цикл, свои объекты и своя утилизация. Это упростило поддержку и отладку. Переход к любому этапу воспроизводит жизненные циклы всех предыдущих сегментов, поэтому состояние всегда консистентно — как будто пользователь дошёл до этого места естественным скроллом.</p><h2>Конвейер 3D-ассетов: как уместить 1 ГБ в 10 МБ</h2><p>Большую часть четырёх месяцев ушла не на код, а на подготовку ассетов. Исходники пришли из Blender: несжатая геометрия, 8K-текстуры, запечённые анимации — всё вместе больше гигабайта. Первый месяц команда тратила на то, чтобы выбрать формат для каждого типа ресурсов.</p><h3>DRACO и KTX2</h3><p>Вся геометрия отправляется со сжатием DRACO, декодеры для которого хостятся локально в public/vendor/. Урок команда усвоила на собственном опыте: замедление на gstatic и unpkg привело к тому, что все сжатые ассеты перестали декодироваться, хотя сами файлы лежали на ихних серверах. Если декодер зависит от чужого CDN, весь пайплайн зависит от него.</p><p>Самый большой выигрыш дали текстуры. PNG может быть маленьким на диске, но в видеопамять он загружается распакованным. Текстура 2048² занимает около 16 МБ VRAM независимо от размера файла. Формат KTX2 со сжатием ETC1S остаётся сжатым на GPU, занимает меньше памяти и загружается быстрее.</p><h3>Собственный превьювер компрессии</h3><p>С KTX2 есть проблема: ETC1S — lossy, и локально его не посмотреть обычным просмотрщиком. Чтобы не гадать с настройками, команда сделала внутренний дашборд: сжатая и несжатая версия каждой картинки и видео рядом. Так можно было подобрать степень сжатия индивидуально — усилить там, где артефакты не заметны, сохранить качество для ключевых объектов и отключить мипмапы, где они не нужны. Инструмент простой, но редко встречается в WebGL-пайплайнах, хотя экономит огромное количество времени и памяти.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-07-28/3a57d9e3-14e7-4f55-8aad-78cee34f1da3.webp" alt="Внутренний дашборд команды для сравнения сжатой и несжатой версии каждого ассета." /><figcaption>Превьювер компрессии: сжатая и несжатая версии текстур и видео рядом. Источник: Codrops / BUNQ LABS</figcaption></figure><h3>Атласы вместо дюжин картинок</h3><p>Похожие текстуры собрали в общие атласы. Например, все текстуры рук уместили в один атлас 4×4, а каждая mesh сдвигала UV-координаты, чтобы взять свой кусок. Спрайты текста, сертификаты, бумажные обрывки, облака, монеты и осколки стекла тоже ушли в атласы. Больше 50 отдельных изображений превратились примерно в дюжину атласов, а большинство градиентных фонов заменили несколькими строками GLSL. Ранние сборки весили 35–40 МБ, финальная — меньше 10 МБ. При этом интерактивная карта мира вынесена в отдельную группу загрузки, чтобы не блокировать открытие сайта.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-07-28/e1686dcf-b13a-494e-94b3-0e32f0eb880a.webp" alt="Атлас текстур рук 4×4: каждая mesh сдвигает UV-координаты, чтобы взять свой кусок." /><figcaption>Атлас рук: все текстуры рук упакованы в одну текстуру 4×4. Источник: Codrops / BUNQ LABS</figcaption></figure><h2>Текстурные загрузки: главный источник фризов</h2><p>Уменьшить скачивание — только половина дела. Сжатые текстуры всё равно нужно загрузить в GPU на главном потоке, и крупная текстура легко блокирует рендер на 50 мс — достаточно, чтобы потерять несколько кадров. Если эта загрузка случается впервые во время скролла, подёргивание заметно сразу. Сайт может хорошо показывать себя в бенчмарках и при этом чувствоваться вязким.</p><ul><li>Декодировать вне главного потока — через createImageBitmap(). Тогда во время рендера остаётся только загрузка в GPU.</li><li>Загружать в GPU в простое — декодированные текстуры ставят в очередь и выгружаются по requestIdleCallback, пока есть запас времени.</li><li>Разбивать большие атласы на плитки 256² и загружать по одной на кадр, чтобы не выбиваться из бюджета кадра.</li></ul><p>Когда известно, что следующий этап вот-вот появится — после загрузчика или во время перехода между воротами — очередь сбрасывается синхронно. Все нужные текстуры уже в видеопамяти, прежде чем они появятся на экране.</p><h2>Адаптивное качество по реальному frame time</h2><p>Невозможно заранее знать, на каком устройстве откроется сайт. Рендерер поэтому постоянно измеряет время кадра по скользящему окну и динамически меняет уровень качества. Если рендеринг замедляется — понижается tier. Если производительность стабильно высокая — tier снова растёт. Задержка между переключениями не даёт постоянно метаться у границы.</p><p>Уровни качества влияют только на визуальную полировку: devicePixelRatio, количество сэмплов размытия, геометрию монет, разрешение текста. Сама история остаётся неизменной и на флагмане, и на бюджетном телефоне. Для особо тяжёлых моментов — например, разбитие стекла — рендерер временно понижает пиксельное соотношение и отключает размытие и иней, прячет затраты внутри самого жеста.</p><h2>Шейдеры под каждый эффект</h2><p>Каждый ключевой момент использует собственный шейдер. ИИ помогал сгенерировать первые версии, но все финальные шейдеры переписывались и дорабатывались вручную. Вот несколько приёмов, которые стоит запомнить.</p><h3>Постпроцессинг из нескольких проходов</h3><p>Кадр собирается из цепочки проходов: основная 3D-сцена, процедурный фон, преломление стекла, иней и след от жеста, глубина резкости, foreground с зернистостью и тональной картой, отложенный текст, и в конце — разбитое стекло. Стеклянный, текстовый и шейдер разбития инициализируются лениво и прогреваются в простое, чтобы не попадать на критический путь загрузчика.</p><h3>Иней из нарисованного нуля</h3><p>Эффект инея строится на ping-pong-буфере из четырёх проходов: горизонталь, вертикаль и две диагонали. Каждый проход распространяет нарисованный штрих, захватывая самые яркие соседние пиксели и создавая восьмиугольный паттерн роста. Яркость текстуры льда модулирует шаг распространения, край получается кристаллическим. После замыкания контура центр масс штриха становится точкой отсчёта для радиального таяния.</p><h3>Освещение без источников света</h3><p>Реалтаймовое освещение скинненной меши рук было бы слишком дорогим, а свет должен был точно совпадать с оригинальным артом. Поэтому освещение запекли в текстуры и смешивают между ними. Используются два слота: один содержит текущий ключевой кадр, другой — следующий. По мере проигрывания анимации новый слот плавно вытесняет старый.</p><p>Перед смешиванием альфа предумножается, чтобы вокруг прозрачных краёв рук не появлялись тёмные ореолы. Обе текстуры освещения лежат в одном атласе, поэтому переключение между ключами требует только обновления двух UV-смещений и коэффициента смешивания.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-07-28/cb760b51-b0f4-4804-aff6-58ce015d2fda.webp" alt="Две запечённые текстуры освещения рук внутри одного атласа для плавного переключения." /><figcaption>Запечённое освещение рук: два ключевых кадра в одном атласе смешиваются по прогрессу анимации. Источник: Codrops / BUNQ LABS</figcaption></figure><h3>Горящие деньги</h3><p>Эффект сгорания использует noise-driven distance field. Фронт горения проходит по купюре, слегка опережая точку дискарда. Перед ним появляется тонкий HDR-ободок углей, затем обугленная поверхность. FBM — самая дорогая часть шейдера, поэтому фрагменты отсекаются как можно раньше, если они ещё не достигли порога горения.</p><h3>Рвущиеся сертификаты</h3><p>Каждая вершина хранит индекс полосы, к которой принадлежит фрагмент диплома. Фронт разрыва движется слева направо, и каждая полоса отделяется и падает независимо со своим вращением. Нормали для освещения строятся аналитически из той же волновой функции, которая анимирует меш, поэтому normal map не нужен.</p><h3>Тоннель ZERO</h3><p>Тоннель получается выдавливанием поперечного сечения из логотипа ZERO. Импульс яркости распространяется по мировой координате Z, поэтому эффект остаётся бесшовным, даже когда секции тоннеля повторяются.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-07-28/bfbebb17-dc15-4bbb-b00c-a1fb7f98c13f.webp" alt="Тоннель ZERO, полученный выдавливанием сечения логотипа." /><figcaption>Тоннель ZERO: импульс яркости распространяется по мировой координате Z, сохраняя бесшовность. Источник: Codrops / BUNQ LABS</figcaption></figure><h3>Текст, который приходит в фокус</h3><p>Нарративный текст появляется не мгновенно, а проявляется через семиотводное гексагональное размытие. Радиус размытия зависит от прогресса появления, поэтому буквы будто фокусируются. Проход выполняется в отложенном текстовом проходе и полностью пропускается, когда текст не виден.</p><h3>Точность на мобильных</h3><p>Одна из самых неприятных находок возникла на реальных мобильных GPU. Несколько шейдеров пришлось явно перевести на highp float, потому что на Adreno и Mali mediump — это настоящий 16-битный float. На десктопе ошибок не было, а на телефоне полосы диплома двигались одинаково, а эффект горения покрывался бэндами. Вывод: тестировать на реальных мобильных устройствах нужно с первых дней, а не перед релизом.</p><h2>Дизайн взаимодействий</h2><p>Исходный материал от заказчика состоял из картинок и видео, поэтому поведение каждых ворот проектировали с нуля. Большинство используют общую систему «нажми и удерживай». Общий конфиг задаёт момент появления подсказки и длительность удержания, а каждые ворота реализуют визуал через собственные хуки.</p><p>Пока пользователь удерживает касание, кадр постепенно смещается в тёмно-красный. Когда стекло разбивается, цвет возвращается примерно за 200 мс — это создаёт ощущение, что осколки выбивают темноту. Проверили вариант в 400 мс: он ощущался заметно слабее. Звук разбития привязан к первому отрисованному кадру, а не к таймеру: на медленных устройствах таймер может сыграть раньше анимации, и эффект рассинхронится.</p><h2>Финальная награда — интерактивный мир</h2><p>Последняя последовательность запуска выносит пользователя в открытое небо. Облака расступаются, открывая город с башней Zero University в центре, над которой появляется ореол — финальные ворота. Камера приземляется в интерактивную карту, где можно панорамировать, зумить и открывать карточки с ролями, сценариями и инструментами. Плашка Join Beta превращается в форму waitlist. После того как сайт вёл пользователя через историю, он отдаёт ему контроль — и просит остаться.</p><h2>FAQ</h2><h2>Выводы</h2><p>Самый важный урок проекта — подготовка ассетов и загрузка в GPU заслуживают не меньше внимания, чем сам рендеринг. Инструменты вроде превьювера компрессии, локальных декодеров, очереди загрузки и адаптивного менеджера качества редко выглядят героически, но именно они превратили гигабайт исходников в 10-мегабайтный сайт, который не тормозит на дешёвом телефоне.</p><blockquote>ИИ генерировала первые версии кода и прототип, который выиграл нам проект, за 48 часов. Но полировка — сотни мелких решений, тестирование на реальных устройствах и инженерная интуиция — осталась за людьми.</blockquote><p><b>Источник:</b> технический разбор команды BUNQ LABS на <a href="https://tympanus.net/codrops/2026/07/17/zero-the-engineering-behind-a-defiant-interactive-narrative/">Codrops</a>.<br />Попробуйте открыть <a href="https://zero.university/">zero.university</a> на десктопе и на бюджетном смартфоне — и сравните, где заметнее компромиссы качества.</p>]]></content:encoded>
    </item>
    <item>
      <title>React-паттерн, который все используют, но он убивает производительность</title>
      <link>https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite</link>
      <comments>https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite</guid>
      <description><![CDATA[<p>Почему React.memo перестаёт работать из-за inline-пропсов и как это исправить. Разбираем на примере со 200 строками и замерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite">React-паттерн, который все используют, но он убивает производительность</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Jul 2026 04:56:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы обернули список в React.memo, добавили useCallback на обработчики и ждёте, что интерфейс полетит. Но при каждом вводе в поисковую строку список всё равно тормозит, а Profiler показывает 200 лишних рендеров. Чаще всего виноват не React, а один крошечный JSX-паттерн, который встречается в каждом втором компоненте.</p><p>В статье разбираем, почему React.memo сравнивает пропсы по ссылке, как inline-объекты и inline-функции обнуляют эту оптимизацию, и какие два простых приёма действительно возвращают производительность.</p><p>React.memo пропускает рендер только тогда, когда все пропсы равны по Object.is. Для объектов и функций это проверка по ссылке.</p><p>Inline-объекты и inline-колбэки в JSX создают новую ссылку на каждый рендер родителя, поэтому memo видит «новые» пропсы и снова рисует дочерний компонент.</p><p>В эксперименте со 200 memoизированными строками это дало 243,9 мс на один keystroke; после стабилизации ссылок — 6 мс.</p><p>Сначала выносите статические объекты за пределы компонента, а useCallback применяйте только там, где колбэк действительно пересекается с memoизированным потомком.</p><p>Оптимизировать всё подряд не нужно: измеряйте в Profiler, а не добавляйте хуки «на всякий случай».</p><h2>Как React решает, рендерить компонент заново или нет</h2><p>Когда родитель перерисовывается, React не делает послаблений дочерним элементам только потому, что они обёрнуты в React.memo. Он сравнивает новые пропсы со старыми. Если каждый проп проходит проверку Object.is, React может «отказаться» от рендера — bailout. Если хотя бы один проп не равен, компонент рисуется заново.</p><p>Для примитивов Object.is работает очевидно: 1 === 1 и 'hello' === 'hello'. А вот для объектов и функций сравнение идёт по ссылке.</p><p>Два объекта с одинаковым содержимым — это разные объекты в памяти. То же самое с функциями. Поэтому, когда вы пишете style=\{\{ padding: 16 \}\}, React получает новую ссылку на каждом рендере и считает проп изменившимся.</p><h2>Почему inline-пропсы — это не микрооптимизация, а поломка контракта</h2><p>Сам по себе объект в JSX не вреден. Если компонент дешёвый, редко перерисовывается и не обёрнут в memo, inline-пропсы почти не влияют на скорость. Проблема появляется, когда три условия накладываются друг на друга:</p><ul><li>родитель перерисовывается часто — поиск, скролл, фильтры, live-данные;</li><li>дочерний компонент или поддерево достаточно тяжёлые, чтобы лишний рендер был заметен;</li><li>вы уже добавили React.memo и ожидаете, что React будет пропускать работу.</li></ul><p>В такой ситуации нестабильные ссылки не просто добавляют накладных расходов — они полностью отменяют ту оптимизацию, ради которой вы взяли React.memo. UI продолжает работать, но лагает ввод, тормозят списки, а в Profiler видно, что дерево горит жёлтым при каждом чихе.</p><h3>Классический опасный пример</h3><p>Представьте список товаров из 200 строк. Каждая строка обёрнута в memo, но в месте вызова передаются inline-пропсы:</p><p>Здесь style и onAddToCart создаются заново при каждом рендере ProductList. Для memo это сигнал, что у каждой строки изменились пропсы, и все 200 компонентов рисуются снова.</p><h2>Эксперимент: от 243,9 мс до 6 мс на один keystroke</h2><p>Автор оригинальной статьи собрал контрольный пример: поисковый интерфейс со 200 memoизированными строками. Все строки получают одинаковые логические значения, но новые ссылки на объекты и функции. Результат после шести введённых символов: каждая видимая строка отрендерилась 14 раз.</p><p>В React DevTools Profiler один keystroke дал коммит длительностью 243,9 мс, в котором подсветились все 200 волокон строк. Инструмент @welldone-software/why-did-you-render прямо указал причину: props.style — «different objects that are equal by value», props.onAddToCart — «different functions with the same name».</p><p><b>Почему 14 рендеров?</b><br />
Каждый ввод в поиск меняет searchTerm, родитель перерисовывается, и inline-пропсы дают строкам новые ссылки. Счётчик рендеров растёт на каждый keystroke, даже если отфильтрованные товары не изменились.</p><h2>Как починить: два приёма вместо дюжины хуков</h2><p>Чтобы восстановить bailout, нужно сделать так, чтобы неизменяющиеся значения не получали новую ссылку на каждом рендере. Правило простое: сначала вынести, потом закешировать.</p><h3>1. Статические объекты — за пределы компонента</h3><p>Если объект не зависит от пропсов и состояния, создайте его один раз на уровне модуля. Это дешевле любого хука и не требует dependency-массива.</p><h3>2. Динамические колбэки — useCallback</h3><p>Если функция передаётся в memoизированный компонент и не должна меняться без причины, оберните её в useCallback со стабильным массивом зависимостей.</p><p>После этих двух изменений в эксперименте время рендера упало с 243,9 мс до 6 мс, счётчики строк застыли на 2, а Why Did You Render замолчал — avoidable re-renders исчезли.</p><h2>Когда не нужно ничего стабилизировать</h2><p>Главная ошибка — оборачивать в useCallback каждую функцию и выносить каждый объект за компонент. React сам по себе быстрый, а мемоизация — это контракт, а не стиль кодирования.</p><ul><li>Компонент дёшев и редко перерисовывается — не тратьте когнитивный бюджет команды.</li><li>Дочерний элемент не обёрнут в React.memo — тогда стабильные ссылки ничего не экономят.</li><li>Значение зависит от часто меняющегося состояния — useCallback с нестабильным массивом зависимостей всё равно будет пересоздаваться.</li><li>Вы ещё не замерили в Profiler — оптимизация без измерений почти всегда лишняя работа.</li></ul><p>React Compiler, который сейчас выходит в стабильное состояние, автоматически мемоизирует многое из того, что раньше делали вручную. Но и он не отменяет понимания ссылочной стабильности: useMemo и useCallback остаются полезными, когда нужен точный контроль, например для зависимостей эффектов.</p><h2>Часто задаваемые вопросы</h2><h2>Выводы</h2><p>Inline-объекты и inline-колбэки в JSX — не антипаттерн сами по себе. Они становятся проблемой только на границе memoизации, где React ожидает стабильные ссылки. Как только вы понимаете это правило, многие «таинственные» лишние рендеры перестают быть таинственными.</p><ol><li>Профилируйте до оптимизации, а не после.</li><li>Вынесите статические объекты за компонент — это самый дешёвый способ стабилизации.</li><li>Применяйте useCallback только для колбэков, которые уходят в memoизированные потомки.</li><li>Проверяйте себя через React DevTools Profiler и Why Did You Render.</li><li>Не забывайте про React Compiler, но не полагайтесь на него как на волшебную палочку.</li></ol><blockquote>Мемоизация — это контракт. Если потомок рассчитывает на стабильные ссылки, родитель должен их обеспечить. Нарушение этого контракта стоит намного дороже, чем отсутствие мемоизации вовсе.</blockquote><p><b>Источник:</b> <a href="https://blog.logrocket.com/react-pattern-everyone-uses-kills-performance/" rel="noopener noreferrer">LogRocket — The React pattern everyone uses that kills performance</a>.</p><p>Проверьте свой текущий проект: откройте React DevTools Profiler, введите что-нибудь в поиск и посмотрите, сколько компонентов подсветится жёлтым только из-за новой ссылки в пропсах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как исправить hydration-ошибки RSC в Next.js: практический гид</title>
      <link>https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid</link>
      <comments>https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid</guid>
      <description><![CDATA[<p>Разбираем, почему возникают hydration mismatches в React Server Components и Next.js App Router, и как находить, исправлять и предотвращать их в production.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid">Как исправить hydration-ошибки RSC в Next.js: практический гид</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 21 Jul 2026 11:37:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Hydration mismatch в Next.js легко поймать в next dev, но в production он превращается в минимизированный код ошибки React и ссылку на декодер. В статье разбираем, почему ошибки гидратации особенно болезненны в приложениях с React Server Components, какие причины встречаются чаще всего и какой рабочий процесс помогает находить и предотвращать такие баги.</p><p>Речь пойдёт не о теории reconcile-алгоритма, а о практике: что проверять первым делом, как изолировать проблему через Suspense, куда смотреть в production-логах и как писать тесты, которые ловят регрессии до попадания к пользователям.</p><h2>Что такое hydration mismatch</h2><p>Гидратация — это процесс, при котором React берёт серверный HTML и навешивает на него обработчики событий, после чего страница становится интерактивной. React ожидает, что дерево, которое он отрендерил на клиенте, точно совпадёт с тем, что пришло с сервера. Если строки, атрибуты или структура различаются, возникает hydration mismatch.</p><p>В development-режиме React покажет предупреждение, текст расхождения и стек компонента. В production всё сводится к коротким кодам вроде #418 или #425. Без телеметрии вы не узнаете, на каком маршруте, в каком компоненте и из-за каких данных произошёл сбой.</p><h2>Почему это больно именно в RSC</h2><p>В классическом SSR обычно один серверный рендер и один клиентский проход гидратации. App Router добавляет Server Components, Client Components, потоковую передачу, Suspense-границы, динамические данные маршрута и RSC payload, который едет рядом с HTML.</p><p>Когда несовпадение происходит вне Suspense-границы, React может отбросить весь серверный HTML и перерендерить дерево на клиенте. Приложение заплатило цену серверного рендера, а пользователь не получил ни производительности, ни преимуществ стриминга. Это не просто предупреждение в консоли, а реальная потеря производительности.</p><h2>Ключевые выводы</h2><ul><li>Hydration mismatch в production без телеметрии почти невозможно локализовать: нужна инструментация на клиенте.</li><li>Основные причины: browser-only API, дата/время/локаль, состояние авторизации, невалидный HTML, расширения браузера, CSS-in-JS.</li><li>Граница 'use client' — это не только маркер сборки, но и граница гидратации: серверный рендер должен быть детерминирован.</li><li>Suspense-границы помогают изолировать сбой и не давать ему сломать всё дерево.</li><li>Проверяйте hydration только на production-сборке: next dev ведёт себя иначе.</li><li>Добавьте Playwright-smoke-тесты на критичные маршруты, чтобы ловить регрессии в CI.</li></ul><h2>Самые частые причины</h2><p>Перед тем как копать RSC payload или сравнивать HTML, стоит проверить шесть типовых сценариев. Они покрывают подавляющее большинство production-инцидентов.</p><ul><li><b>Browser-only API во время рендера:</b> window, document, localStorage, navigator — сервер не знает об этих значениях.</li><li><b>Дата, время и локаль:</b> Date, Intl.DateTimeFormat, относительное время — сервер обычно в UTC, пользователь в своей зоне.</li><li><b>Состояние авторизации:</b> сервер рендерит выклогнутый UI, клиент сразу видит авторизованного пользователя.</li><li><b>Невалидный HTML:</b> браузер чинит DOM до гидратации, а React сравнивает с исходным деревом.</li><li><b>Расширения и middleware:</b> браузерные плагины и edge-переписывания меняют HTML.</li><li><b>CSS-in-JS и порядок классов:</b> styled-components и Emotion могут генерировать разные имена классов при стриминге.</li></ul><h3>Browser-only API и сторонние провайдеры</h3><p>Самая частая причина — не ваш собственный код, а сторонний провайдер, который читает localStorage, window или navigator при инициализации. Под это попадают аналитика, фичер-флаги, A/B-тесты, session replay и персонализация.</p><p>Проблемный вариант: провайдер читает localStorage прямо при рендере.</p><p>Исправление: серверные флаги передаются в Client Component, а локальные оверрайды применяются после гидратации.</p><p><b>Принцип:</b> серверный и первый клиентский рендер должны получить одинаковый результат. Браузерные оверрайды включаются в useEffect после монтирования.</p><h3>Дата, время и локаль</h3><p>Сервер часто работает в UTC, а пользователь — в своей зоне. Date.toLocaleString(), Intl.DateTimeFormat и функции вроде formatDistanceToNow() дают разные строки в зависимости от часового пояса и времени между рендером и гидратацией.</p><p>Проблемный вариант: относительное время считается на сервере.</p><p>Исправление: сервер отдаёт стабильную абсолютную дату, клиент заменяет её на относительную после монтирования.</p><p>suppressHydrationWarning здесь уместен, потому что расхождение ожидаемо, ограничено листовым элементом  и управляется явно. Но оборачивать им большой контейнер, чтобы скрыть неизвестную ошибку, — значит замазать баг, а не починить его.</p><h3>Состояние авторизации</h3><p>Типичный сценарий: сервер рендерит UI для неавторизованного пользователя, потому что маршрут статический или не читает куки, а клиент сразу видит залогиненного пользователя. При каждой загрузке страница перерендеривается.</p><p>Решение — читать куки на сервере через cookies() из next/headers.</p><p>С cookies() маршрут становится динамическим — это обычно правильный компромисс для UI, зависящего от авторизации. Начиная с Next.js 15, cookies() асинхронный и требует await. В Next.js 16 синхронный доступ к request-time API полностью уходит.</p><h3>Невалидный HTML</h3><p>Браузер молча чинит невалидную вёрстку. React же гидратирует не исходную строку, а DOM, который построил браузер. Классический пример —  внутри <p></p>: браузер закроет параграф до div, и React увидит другое дерево.</p><p>Браузер превратит это в примерно такую структуру:</p><p>Если HTML приходит из CMS или редактора, валидируйте и нормализуйте его на сервере. Для собственных компонентов следите за предупреждениями validateDOMNesting в DevTools.</p><h3>Расширения браузера и middleware</h3><p>Менеджеры паролей, переводчики, грамматические плагины и другие расширения могут вставлять или переупорядочивать узлы до гидратации. Edge middleware и CDN-трансформации тоже могут переписывать HTML в пути.</p><p>Если несовпадение затрагивает только &lt;html&gt; или &lt;body&gt;, сначала подозревайте расширения. React 19 стал терпимее к инъекциям в head/body, но на старых версиях такие ошибки особенно шумные.</p><p>suppressHydrationWarning на корневых элементах — документированный escape hatch, но он работает только на один уровень вглубь и не должен использоваться для сокрытия неизвестных расхождений в продуктовом UI.</p><h3>CSS-in-JS и порядок классов</h3><p>В проектах со styled-components или Emotion имена классов могут зависеть от порядка рендера. Стриминг и Suspense меняют этот порядок, поэтому нужен registry с useServerInsertedHTML.</p><h2>Production workflow для отладки</h2><p>Не начинайте с diff-а огромных HTML-документов. Работайте по порядку, сужая область поиска.</p><ol><li>Настройте клиентскую телеметрию: перехватывайте console.error и отправляйте hydration-ошибки на свой endpoint.</li><li>Воспроизводите баг на production-сборке: next build &amp;&amp; next start, а не next dev.</li><li>Используйте Suspense-границы, чтобы изолировать проблемный участок и понять, в каком поддереве ошибка.</li><li>Сравнивайте серверный HTML (curl) и клиентский DOM после гидратации.</li><li>Когда найдёте расходящийся элемент, проверьте: browser-only API, дата/время, авторизацию, HTML-вложенность, расширения, стили.</li></ol><h3>Инструментация: instrumentation-client.ts</h3><p>Файл instrumentation-client.ts в Next.js запускается после загрузки документа, но до гидратации React. Это удобная точка для лёгкой клиентской телеметрии.</p><p>Если используете LogRocket, Sentry или другой инструмент, прикрепите тот же payload к текущей сессии — тогда можно будет увидеть, как выглядела страница в момент сбоя.</p><h3>Изоляция через Suspense</h3><p>Suspense-границы не только показывают fallback при загрузке. Если hydration mismatch случается внутри границы, React может ограничить восстановление этим поддеревом, а не переключать весь root на клиентский рендер.</p><p>Оберните поочерёдно основные секции. Если страничная ошибка исчезает после оборачивания конкретной секции, баг почти наверняка внутри неё.</p><h3>Сравнение HTML и DOM</h3><p>Получите серверный HTML через curl с нужными куками:</p><p>В Chrome DevTools после загрузки страницы скопируйте живой DOM:</p><p>Сохраните результат в /tmp/client-render.html и сравните:</p><p>Этот метод хорошо ловит HTML-слой, но может пропустить расхождения на уровне reconciler-а и RSC payload. Если raw HTML совпадает, проверяйте Client Components и браузерное состояние.</p><h2>Профилактика</h2><p>Лучше не допускать ошибки, чем потом их чинить. Несколько практик, которые помогают держать серверный и клиентский рендер синхронизированными.</p><ol><li>Server Component должен быть детерминированным: одни и те же входные данные дают одни и те же выходные HTML и RSC payload.</li><li>Все browser-only API, куки, заголовки, локаль и время должны оставаться за границей 'use client' или читаться через request-time API на сервере.</li><li>Для клиентского UI сначала рендерите стабильный baseline, а улучшения добавляйте в useEffect после гидратации.</li><li>Валидируйте HTML из внешних источников до того, как React его увидит.</li><li>Тестируйте hydration на production-сборке в CI.</li></ol><h3>Пример: стабильный baseline + клиентское улучшение</h3><p>Скелетон — это стабильная базовая разметка. Карточки товаров появляются после монтирования. Сервер и первый клиентский рендер совпадают, а пользователь получает нужный контент чуть позже.</p><h3>Smoke-тесты в CI</h3><p>Ручное тестирование пропустит регрессии. Добавьте Playwright-тест на критичные маршруты.</p><p>Запускайте такой тест только против production-сборки, никогда против next dev. Сделайте его обязательной проверкой для маршрутов, где hydration failure критичен: продуктовые страницы, дашборды, чекаут, личный кабинет.</p><h2>FAQ</h2><h2>Выводы</h2><p>Hydration mismatch — не придирка React, а реальный баг производительности и корректности. Каждое несовпадение означает, что приложение могло отбросить серверный HTML, за который уже заплатило ресурсами.</p><p>В приложениях с React Server Components, где цель — меньше клиентского JavaScript и более ранний стриминг полезного UI, hydration failures тихо отменяют эти преимущества. Поэтому важно держать браузерную логику за границей 'use client', рендерить стабильные серверные baseline и проверять гидратацию в production-условиях до того, как ошибку найдут пользователи.</p><blockquote>Hydration errors should be fixed, not ignored — официальная позиция React.</blockquote><p><b>Источник:</b> <a href="https://blog.logrocket.com/how-fix-rsc-hydration-mismatches-next-js/" rel="noopener noreferrer">LogRocket Blog — How to fix RSC hydration mismatches in Next.js</a>.</p><p>Проверьте свои критичные маршруты на production-сборке, настройте телеметрию и не давайте hydration-ошибкам копиться в консоли.</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust, Go или Zig: как выбрать язык для высоконагруженного бэкенда в 2026 году</title>
      <link>https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend</link>
      <comments>https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend</guid>
      <description><![CDATA[<p>Сравниваем Rust, Go и Zig для высоконагруженных сервисов: производительность, сложность, экосистема и реальные кейсы миграции.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend">Rust, Go или Zig: как выбрать язык для высоконагруженного бэкенда в 2026 году</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Jul 2026 06:41:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы строите высоконагруженный бэкенд, выбор языка сегодня сводится к тройке: Rust, Go и Zig. У каждого — своя цена, своя скорость разработки и свои сценарии, в которых он выигрывает. Разбираем, как не ошибиться и когда смешивать их в одном проекте.</p><p>Речь пойдёт не о сравнении синтаксиса в вакууме, а о бэкенд-сервисах: API, шлюзах, обработке событий, парсинге данных и всём, что работает под нагрузкой. В статье — авторский взгляд на материал блога инженера Pooya Golchian, дополненный российским контекстом и поправками на реальное состояние экосистем.</p><p><b>Go</b> остаётся стандартным выбором для большинства микросервисов: быстрая компиляция, простота найма, огромная экосистема.</p><p><b>Rust</b> выигрывает там, где важны предельная задержка и контроль над памятью, но требует опытной команды и времени на обучение.</p><p><b>Zig</b> подходит для узких, критичных к производительности участков и для интеграции с существующим C-кодом, но экосистема пока незрелая.</p><p>В больших системах работает гибридный подход: Go для скорости разработки, Rust/Zig для горячих путей.</p><p>Мигрировать стоит только после профилирования: оптимизация без замеров обычно дороже, чем выгода.</p><h2>Почему именно эти три языка</h2><p>В 2026 году для нового backend-проекта по-прежнему можно взять Java, C#, Python или Node.js. Но если речь заходит о высоких нагрузках, низкой задержке и контроле над ресурсами, внимание смещается к трём игрокам.</p><ul><li><b>Rust</b> — язык с владением и заимствованием, дающий безопасность памяти без сборщика мусора.</li><li><b>Go</b> — язык с простой моделью конкурентности, статической линковкой и минималистичной философией.</li><li><b>Zig</b> — язык в духе C, но с современной системой сборки, comptime и явным управлением памятью.</li></ul><p>Все трое компилируются в нативный код, дают один бинарник на выходе и не требуют виртуальной машины. Именно это отличает их от Java, C# и Python на старте.</p><h2>Rust: максимум производительности, максимум сложности</h2><h3>Сильные стороны</h3><ul><li>Безопасность памяти на этапе компиляции — нет use-after-free, data races и большинства утечек.</li><li>Нулевая стоимость абстракций: высокоуровневый код часто компилируется так же эффективно, как ручной C.</li><li>Мощная модель конкурентности поверх tokio или async-std.</li><li>Зрелая экосистема: axum, actix-web, serde, sqlx.</li></ul><h3>Слабые стороны</h3><ul><li>Крутая кривая обучения: borrow checker требует перестройки мышления.</li><li>Долгая компиляция: полная пересборка крупного проекта занимает десятки секунд и минуты.</li><li>Меньше кадров на рынке, чем у Go или Java.</li><li>Итерации медленнее: каждая ошибка компилятора — это время на переделку.</li></ul><h3>Когда выбирать Rust</h3><p>Rust логичен, если вы строите инфраструктуру — прокси, базы данных, очереди, edge-сервисы — или если профилирование показывает, что горячий путь съедает CPU и память. Примеры из продакшена: Cloudflare использует Rust на edge, Discord переписал на Rust часть read-path сервисов.</p><h2>Go: скорость разработки в масштабе</h2><h3>Сильные стороны</h3><ul><li>Компиляция за секунды и один статический бинарник для деплоя.</li><li>Встроенные горутины и каналы — простая, но мощная конкурентность.</li><li>Отличная стандартная библиотека и быстрое тестирование через go test.</li><li>Большая база инженеров и проверенные практики в крупных компаниях.</li></ul><h3>Слабые стороны</h3><ul><li>Сборщик мусора может давать всплески задержек, хотя в последних версиях паузы сокращаются.</li><li>Меньше контроля над расположением памяти и размером структур.</li><li>Пиковая пропускная способность ниже, чем у Rust и Zig, на CPU-bound задачах.</li><li>Система типов и обработка ошибок минималистичны — кому-то этого достаточно, кому-то не хватает.</li></ul><h3>Когда выбирать Go</h3><p>Go — выбор по умолчанию для команд из 5–50 человек, которым нужно быстро запускать CRUD-сервисы, API-шлюзы и data pipeline. Uber, Google и Яндекс активно используют Go в микросервисах. Если главная метрика — time to market, а не последний процент производительности, Go обычно выигрывает.</p><h2>Zig: новый игрок с C-душой</h2><h3>Сильные стороны</h3><ul><li>Производительность уровня C с более современным синтаксисом и системой сборки.</li><li>comptime — выполнение кода на этапе компиляции для генерации оптимизированных структур.</li><li>Прямое взаимодействие с C без FFI-слоёв.</li><li>Маленькие быстрые бинарники и явное управление памятью.</li></ul><h3>Слабые стороны</h3><ul><li>Экосистема backend-фреймворков и библиотек пока существенно меньше, чем у Rust и Go.</li><li>Сообщество и количество инженеров на рынке ограничены.</li><li>Ручное управление памятью перекладывает ответственность на разработчика.</li><li>Некоторые части языка и стандартной библиотеки всё ещё эволюционируют.</li></ul><h3>Когда выбирать Zig</h3><p>Zig хорош, когда нужна C-производительность, но с более удобным инструментарием, или когда приходится интегрироваться с существующим C-кодом. Пример из продакшена: финансовая база данных TigerBeetle написана на Zig. Для универсального backend в 2026 году Zig ещё рано называть mainstream-выбором.</p><h2>Сравнение в цифрах</h2><p>Ниже — иллюстративные цифры из оригинального материала, полученные на AWS c7g.2xlarge (Graviton3). Относитесь к ним как к точке отсчёта, а не как к гарантии для вашего сервиса: в реальности большее значение имеют I/O, запросы к базе данных и сетевая задержка.</p><p><b>Бенчмарки:</b><br />HTTP throughput — Rust 892K req/s, Go 734K req/s, Zig 812K req/s.<br />JSON-сериализация — Rust 1,2M/s, Go 890K/s, Zig 1,1M/s.<br />Память на 10K соединений — Rust 45MB, Go 78MB, Zig 38MB.<br />Размер бинарника — Rust 8,2MB, Go 12,4MB, Zig 6,1MB.<br />Время компиляции с нуля — Rust 42s, Go 3,2s, Zig 18s.<br />P99 latency — Rust 2,1ms, Go 3,8ms, Zig 2,4ms.</p><h2>Реальные истории миграции</h2><h3>Discord: Go → Rust</h3><p>Discord переводил read-path сервисы с Go на Rust из-за пауз сборщика мусора, которые проявлялись в хвостовых задержках. По данным компании, throughput вырос в несколько раз, а tail latency снизилась. Ключевой вывод: мигрировать стоит только горячие пути, а не весь сервис целиком.</p><h3>Uber: Python → Go</h3><p>Uber мигрировал часть микросервисов с Python на Go, чтобы обойти ограничения GIL и упростить масштабирование. Переход занял годы, но зато проходил постепенно: Go-совместимость и простота языка позволяли быстро обучать команду.</p><h3>TigerBeetle: C++ → Zig</h3><p>TigerBeetle — финансовая база данных, ориентированная на корректность и производительность. Команда выбрала Zig, отказавшись от сложности C++ и сборщика мусора. comptime позволил генерировать специализированные структуры данных под задачу.</p><h2>Гибридная архитектура</h2><p>На практике редко выбирают один язык на весь проект. Гораздо чаще используют гибрид:</p><ul><li><b>API Gateway и CRUD</b> — Go: быстро писать, просто деплоить, легко искать людей.</li><li><b>Горячие пути</b> — Rust: низкая задержка и контроль над памятью.</li><li><b>Специализированные компоненты</b> — Zig: парсинг бинарных форматов, криптография, интеграция с C.</li></ul><p>Такая схема позволяет получить скорость разработки в большинстве сервисов и производительность там, где она действительно нужна. Главное — разделять систему по чётким границам и не превращать проект в зоопарк ради самого зоопарка.</p><h2>Что выбрать в 2026 году</h2><p>Выбор зависит от приоритетов команды и задачи:</p><ul><li><b>Нужна скорость разработки и лёгкий найм</b> — Go.</li><li><b>Нужна максимальная производительность и безопасность памяти</b> — Rust.</li><li><b>Нужна C-производительность с современной сборкой и интеграцией с legacy на C</b> — Zig.</li><li><b>Команда маленькая и сроки горят</b> — начинайте с Go, профилируйте, мигрируйте горячие пути при необходимости.</li><li><b>Строите базу данных, прокси или edge</b> — Rust становится очень сильным кандидатом.</li></ul><h2>FAQ</h2><h2>Выводы</h2><p>Rust, Go и Zig — не конкуренты в прямом смысле, а инструменты для разных условий. Go задаёт темп разработки, Rust отвечает за надёжность и производительность, Zig покрывает специализированные ниши. Лучшая стратегия для 2026 года — начать с Go, измерять, а затем точечно внедрять Rust или Zig там, где данные это оправдывают.</p><blockquote>Нет универсального лучшего языка — есть лучший язык для конкретной команды, задачи и бюджета на обучение.</blockquote><p><b>Источник:</b> <a href="https://pooya.blog/blog/rust-go-zig-high-performance-backend-2026/">Pooya Golchian — Rust vs Go vs Zig: High-Performance Backend Services in 2026</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Claude Code научился работать в циклах: разбираем официальный гайд Anthropic</title>
      <link>https://tproger.ru/articles/claude-code-nauchilsya-rabotat-v-ciklah-razbiraem-oficialnyj-ga</link>
      <comments>https://tproger.ru/articles/claude-code-nauchilsya-rabotat-v-ciklah-razbiraem-oficialnyj-ga?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/claude-code-nauchilsya-rabotat-v-ciklah-razbiraem-oficialnyj-ga</guid>
      <description><![CDATA[<p>Anthropic опубликовала официальный гайд по loops в Claude Code. Разбираем turn-based, goal-based, time-based и proactive циклы, примеры команд и советы по экономии токенов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/claude-code-nauchilsya-rabotat-v-ciklah-razbiraem-oficialnyj-ga">Claude Code научился работать в циклах: разбираем официальный гайд Anthropic</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Методологии разработки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Jul 2026 11:41:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пока одни разработчики всё ещё соревнуются в длине промптов, в Anthropic считают, что главный навык будущего — не prompt-инжиниринг, а проектирование циклов. В начале июля 2026 года официальный аккаунт <b>ClaudeDevs</b> опубликовал гайд <a href="https://claude.com/blog/getting-started-with-loops">Getting started with loops</a>, в котором команда Claude Code наконец дала общую терминологию тому, что последние недели обсуждали в X Борис Черни, Питер Штайнбергер и Эдди Османи.</p><p>В статье loops определяются просто: <b>агент повторяет циклы работы до тех пор, пока не выполнится условие остановки</b>. Разница между типами циклов Anthropic выводит из четырёх вещей: что запускает цикл, что его останавливает, какая примитивная команда Claude Code используется и для каких задач это подходит.</p><h2>Что такое loop в Claude Code</h2><p>Если коротко, loop — это способ переложить на агента не отдельную команду, а <b>повторяющийся процесс</b>. Сначала агент получает или собирает контекст, потом действует, проверяет результат и либо останавливается, либо начинает следующую итерацию. Человек при этом отвечает не за каждый шаг, а за то, чтобы правильно описать условие остановки, проверку качества и триггер запуска.</p><p>Для российских разработчиков, которые часто запускают Claude Code на удалённом сервере по SSH, это особенно удобно: можно настроить цикл, который работает, пока вы спите, и присылает отчёт утром в Telegram или Slack. Главное — не забыть про лимиты токенов, потому что неограниченный цикл способен съесть месячный бюджет за одну ночь.</p><p>Claude Code предлагает четыре типа loops: turn-based, goal-based, time-based и proactive.</p><p>Каждый цикл характеризуется триггером, условием остановки и подходящей командой: ручной prompt, /goal, /loop//schedule или автоматическая рутина.</p><p>Качество результата зависит от проверочных навыков (SKILL.md) и чистоты кодовой базы, а не только от самого цикла.</p><p>Чтобы не переплачивать за токены, важны чёткие критерии завершения, ограничение по числу итераций и правильный выбор модели.</p><p>Начинать стоит с простейшего цикла и добавлять сложность только там, где ручная работа реально становится узким местом.</p><h2>Четыре типа циклов</h2><h3>Turn-based: ручной цикл</h3><p>Самый простой и самый знакомый вид. Пользователь отправляет prompt, Claude собирает контекст, вносит правки, запускает тесты и возвращает результат. После этого человек проверяет работу и пишет следующий prompt. Каждый такой оборот — это один turn.</p><p>По мнению команды Claude Code, здесь ключевой рычаг — не более длинный prompt, а <b>проверочный SKILL.md</b>. Если вы обычно вручную открываете dev-сервер, кликаете по новой кнопке, проверяете консоль и запускаете Lighthouse, эти шаги стоит записать в skill. Чем более количественные проверки вы зададите, тем чаще Claude сможет сам понять, что задача выполнена.</p><h3>Goal-based: цикл с целью через /goal</h3><p>Когда задача сложная и одного оборота недостаточно, помогает команда /goal. Вы явно описываете критерий успеха и максимальное число попыток. Каждый раз, когда Claude хочет остановиться, оценочная модель проверяет условие: если цель не достигнута — агент возвращается к работе.</p><p>Чем более детерминирован критерий, тем лучше. «Сделай хорошо» — плохая цель. «Добейся Lighthouse Performance ≥ 90, не более 5 попыток» — хорошая. То же самое работает для числа пройденных тестов, покрытия кода или отсутствия ошибок линтера.</p><h3>Time-based: цикл по расписанию /loop и /schedule</h3><p>Некоторые задачи не требуют вашего присутствия: утренняя сводка по Slack, проверка PR на ревью, мониторинг CI. Для таких случаев есть /loop: команда повторяет prompt через заданный интервал, пока вы её не отмените или пока работа не закончится.</p><p>/loop работает на вашем компьютере, поэтому при выключении терминала цикл остановится. Если нужно, чтобы агент работал в облаке даже с закрытым ноутбуком, используется /schedule — эта команда создаёт рутину, которая запускается по расписанию на серверах Anthropic (research preview).</p><h3>Proactive: проактивные рутины</h3><p>Проактивные циклы объединяют всё вышеперечисленное: /schedule для запуска по событию или расписанию, /goal для критерия готовности, skills для проверки, dynamic workflows для параллельной обработки и auto mode, чтобы цикл не останавливался на каждом разрешении.</p><p>Типичный сценарий: обработка входящих баг-репортов. Рутина каждый час проверяет канал обратной связи, триажирует каждую заявку, чинит баг, прогоняет тесты и отвечает пользователю. Для сложных случаев можно параллельно исследовать несколько решений в разных worktrees и поручить «судейскому» агенту выбрать лучшее.</p><h2>Как не потерять качество кода</h2><p>Автономность без контроля качества быстро превращается в генерацию мусора. В гайде Anthropic выделяет четыре опоры, на которых держится качество loop:</p><ul><li><b>Чистая кодовая база.</b> Claude копирует паттерны, которые уже есть в проекте. Если в репозитории хаос, агент будет его множить.</li><li><b>Проверочные skills.</b> SKILL.md должен содержать конкретные шаги, инструменты и критерии, по которым Claude сам оценивает результат.</li><li><b>Актуальная документация.</b> Фреймворки и библиотеки меняются, и агенту нужны свежие best practices.</li><li><b>Второй агент для ревью.</b> Проверяющий со свежим контекстом менее предвзят, чем основной агент. Можно использовать встроенный /code-review или Code Review for GitHub.</li></ul><p>Важный совет: когда отдельный результат не дотягивает до стандарта, не исправляйте только конкретный случай — закодируйте правило в skill или CLAUDE.md, чтобы все будущие итерации работали лучше.</p><h2>Как не сжечь бюджет на токенах</h2><p>Loops — это не бесплатная автоматизация. Каждый оборот стоит денег, а неосторожная proactive-рутина может породить сотни параллельных подагентов. В гайде перечислены шесть способов держать расходы под контролем:</p><ul><li>Выбирайте подходящий примитив и модель: мелкие задачи не нуждаются в сложных оркестрациях.</li><li>Формулируйте чёткие критерии завершения: конкретнее цель — меньше лишних итераций.</li><li>Запускайте пилот на малой выборке перед массовым прогоном.</li><li>Используйте скрипты для детерминированной работы: запуск готового скрипта дешевле, чем рассуждение модели.</li><li>Не запускайте рутины чаще, чем меняется объект мониторинга.</li><li>Регулярно смотрите /usage, /goal без аргументов и /workflows, чтобы видеть, куда уходят токены.</li></ul><h2>С чего начать</h2><p>Авторы гайда предлагают не начинать с proactive-рутин, а посмотреть на свою повседневную работу и найти одно место, где вы сами являетесь узким звеном. Задайте три вопроса:</p><ul><li>Могу ли я описать проверку результата так, чтобы Claude мог сам её выполнить?</li><li>Достаточно ли чётко я понимаю, что значит «готово»?</li><li>Эта работа приходит по расписанию или в ответ на внешние события?</li></ul><p>Если ответ на первый вопрос «да» — начните с turn-based цикла и проверочного skill. Если на второй — попробуйте /goal. Если на третий — /loop или /schedule. Запустите цикл, понаблюдайте, где он застревает или перегибает палку, и дорабатывайте harness, а не только prompt.</p><h2>Сводка: какой цикл когда использовать</h2><h2>FAQ</h2><h2>Выводы</h2><p>Гайд Anthropic — не просто описание четырёх команд. Это попытка дать разработчикам общий язык для обсуждения того, как ИИ-агенты переходят из разряда «помощников в чате» в разряд «автономных рабочих процессов». Turn-based, goal-based, time-based и proactive loops — это не конкуренты, а ступени одной эволюции: от ручного управления каждым шагом к проектированию систем, которые управляют сами собой.</p><p>Главная метафора, которую стоит уносить с собой: ваш вклад перестаёт измеряться качеством очередного prompt, а начинает измеряться качеством <b>harness</b> — системы проверок, остановок и триггеров. Если вы ещё не пробовали /goal или /loop, начните с одной повторяющейся задачи на этой неделе. Скорее всего, вы удивитесь, как много ручной работы можно отдать циклу.</p><blockquote>I don't prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. My job is to write loops.</blockquote><p><b>Источники:</b></p><ul><li><a href="https://claude.com/blog/getting-started-with-loops">Getting started with loops — официальный гайд Anthropic</a></li><li><a href="https://x.com/ClaudeDevs/status/2074208949205881033">@ClaudeDevs on X</a></li><li><a href="https://addyosmani.com/blog/loop-engineering/">Loop Engineering — Addy Osmani</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как работает экспертиза для сложных продуктов: рассказываем про подходы к задачам</title>
      <link>https://tproger.ru/articles/kak-rabotaet-ekspertiza-dlya-slozhnyh-produktov-rasskazyvaem-pro</link>
      <comments>https://tproger.ru/articles/kak-rabotaet-ekspertiza-dlya-slozhnyh-produktov-rasskazyvaem-pro?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-rabotaet-ekspertiza-dlya-slozhnyh-produktov-rasskazyvaem-pro</guid>
      <description><![CDATA[<p>Как устроена работа со сложными проектами — серверные платформы, Kubernetes и BPM. Разбираем подходы пяти команд и даём чек-лист для выбора инструментов и подрядчиков.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-rabotaet-ekspertiza-dlya-slozhnyh-produktov-rasskazyvaem-pro">Как работает экспертиза для сложных продуктов: рассказываем про подходы к задачам</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 06 Jul 2026 05:05:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда проект выходит за рамки типовых решений — кастомная архитектура, нестандартные нагрузки, требования к SLA — начинается зона, где спецификации из каталога уже не работают. Нужна инженерная экспертиза: кто-то должен профилировать нагрузку, рассчитать NUMA-топологию, прогнать тесты и гарантировать, что в проде всё будет работать.</p><p>В этой подборке разбираем, как устроена работа со сложными и большими проектами: какие подходы используют команды с технической экспертизой, какие предложения есть на рынке и как это влияет на конечный результат.</p><h3>Selectel: серверные платформы с полным циклом разработки</h3><p>Когда речь заходит о серверной инфраструктуре, чаще обсуждают процессоры, память, накопители или сетевые интерфейсы. Но на практике серверная платформа — это сочетание аппаратной архитектуры, встроенного программного обеспечения, операционной системы и инструментов управления.</p><p>Поэтому в <a href="https://selectel.ru/" rel="nofollow">Selectel</a> разработка начинается не со сборки серверов под конкретный проект. Команда развивает собственную серверную платформу, которая становится основой для последующих решений: от серверов общего назначения до GPU-систем для задач искусственного интеллекта, высокопроизводительных вычислений и обработки данных.</p><h3>От эксплуатации к разработке</h3><p>Требования к новой платформе формируются на основе собственного опыта работы с железом. С 2008 года Selectel накопил большую экспертизу в эксплуатации серверов различных поколений и конфигураций и использует этот опыт при определении требований к новым платформам.</p><p>Инженеры опираются на реальные сценарии использования, особенности рабочих нагрузок и требования внутренних сервисов компании. Такой подход позволяет проектировать платформу с учетом практической эксплуатации, а не только характеристик отдельных компонентов.</p><h3>Собственная аппаратная архитектура</h3><p>Одним из ключевых решений стала разработка собственной материнской платы. Она определяет архитектуру платформы: организацию питания, топологию PCI Express, расположение компонентов, взаимодействие процессоров с памятью и периферией, систему охлаждения и набор поддерживаемых интерфейсов.</p><p>Использование собственной платы позволяет самостоятельно выбирать компонентную базу, проектировать системную архитектуру и топологию платы, а также быстрее внедрять новые технологии без зависимости от готовых OEM-платформ.</p><p>Платформа Selectel поддерживает процессоры Intel Xeon 6, память DDR5, интерфейс PCI Express Gen5, модуль доверенной платформы TPM 2.0, а также предусматривает установку современных сетевых адаптеров и ускорителей вычислений.</p><p>Для задач искусственного интеллекта и высокопроизводительных вычислений используются серверы форм-фактора 8U с несколькими GPU, тогда как платформы 1U и 2U применяются для виртуализации, корпоративной инфраструктуры, баз данных, облачных сервисов и других сценариев эксплуатации.</p><h3>BIOS, BMC и управление платформой</h3><p>Разработка аппаратной части ведется одновременно с развитием встроенного программного обеспечения.</p><p>BIOS отвечает за инициализацию оборудования и взаимодействие компонентов при запуске системы. BMC обеспечивает независимое управление сервером, мониторинг аппаратных компонентов, диагностику, удаленную консоль, обновление прошивок и выполнение сервисных операций без участия основной операционной системы.</p><p>Для управления оборудованием Selectel использует собственный интерфейс Selectel Management Interface (SMI), разработанный на базе OpenBMC.</p><p>Работа с исходным кодом BIOS и BMC позволяет инженерам самостоятельно реализовывать необходимые функции, устранять ограничения и изменять поведение платформы без ожидания обновлений от производителей оборудования. Это важно при развитии собственной серверной платформы, где аппаратная и программная части проектируются одновременно.</p><h3>Программный уровень платформы</h3><p>Следующий уровень образуют операционная система, средства виртуализации и программные инструменты управления инфраструктурой. На этом уровне оборудование интегрируется в облачную платформу и становится частью сервисов, которыми пользуются клиенты. Это позволяет проектировать совместимость аппаратной и программной частей заранее, а не адаптировать программное обеспечение после выпуска нового оборудования.</p><h3>От платформы к решению под конкретную задачу</h3><p>После того как серверная платформа разработана и проверена, она становится основой для инженерной работы с конкретными проектами.</p><p>В зависимости от профиля нагрузки инженеры подбирают конфигурацию сервера: процессоры, объем и тип оперативной памяти, дисковую подсистему, сетевые интерфейсы и графические ускорители. При этом учитываются не только характеристики отдельных компонентов, но и их совместная работа.</p><p>Для CPU-интенсивных задач приоритетом становятся вычислительные ресурсы процессора и организация многопоточной нагрузки. Для систем хранения — производительность дисковой подсистемы и сетевых интерфейсов. При работе с GPU оцениваются баланс между центральным и графическими процессорами, пропускная способность PCI Express, требования к питанию и охлаждению. При необходимости проектируются конфигурации под storage- и backup-системы.</p><p>На этапе проектирования также анализируются особенности будущей инфраструктуры: тип рабочей нагрузки (CPU-bound, memory-bound, IO-bound или GPU-bound), требования к доступности и SLA, особенности электропитания, тепловыделения, размещения оборудования в стойке и существующей сетевой инфраструктуры.</p><h3>Проверка гипотез до закупки оборудования</h3><p>Для проверки используется Proof of Concept (PoC) — инженеры воспроизводят профиль нагрузки клиента на тестовом стенде, сочетая синтетические и прикладные тесты. Это помогает заранее оценить производительность, задержки, температурные режимы и запас вычислительных ресурсов.</p><p>Во время таких испытаний анализируются параметры, которые невозможно оценить по спецификации оборудования: NUMA-топология, баланс между CPU и GPU, производительность подсистемы хранения, влияние вариантов конфигурации памяти, пропускная способность сетевых интерфейсов и шин PCI Express.</p><p>По итогам команда получает рекомендации по конфигурации с учетом характера нагрузки и ожидаемой производительности.</p><h3>Проверка совместимости и стабильности</h3><p>После формирования конфигурации сервер проходит комплексную проверку.</p><p>На производственном этапе контролируются комплектность оборудования, версии компонентов и прошивок. BIOS, BMC, сетевые адаптеры, RAID- и HBA-контроллеры приводятся к согласованным версиям, что обеспечивает воспроизводимость конфигурации. Затем проверяется работа памяти, накопителей, сетевых интерфейсов, аппаратных датчиков и других компонентов платформы.</p><p>Отдельный этап посвящен совместимости программной и аппаратной частей. Инженеры тестируют работу операционных систем, гипервизоров, драйверов, сетевых режимов, подсистем хранения данных и механизмов удаленного управления. Результатом становится матрица совместимости с рекомендуемыми версиями программного обеспечения.</p><p>После этого выполняется серия нагрузочных испытаний. Для оценки производительности используются бенчмарки процессоров, памяти, подсистем хранения, сетевой инфраструктуры и GPU. Отдельно анализируется поведение системы под длительной максимальной нагрузкой: температурные режимы, эффективность охлаждения, корректировка ошибок ECC, журналы BMC и другие параметры, позволяющие выявить потенциальные проблемы до начала эксплуатации.</p><h3>Что отличает подход Selectel</h3><p>Разработка собственной серверной платформы позволяет команде работать одновременно на нескольких уровнях: от аппаратной архитектуры и встроенного программного обеспечения до интеграции платформы в облачную инфраструктуру.</p><p>Доступ к исходным кодам BIOS/BMC дает возможность не только обходить проблемы, а фиксить причины. Оборудование используется в собственных дата-центрах, поэтому требования к стабильности проверены. На базе платформы инженеры проектируют конфигурации под конкретные задачи, проверяют с помощью PoC, нагрузочного и стресс-тестирования, а затем используют полученный опыт для дальнейшего развития продукта.</p><p>Собственные серверные платформы используются в инфраструктуре компании, поэтому инженеры могут наблюдать их работу в реальных условиях эксплуатации. Это позволяет регулярно проверять взаимодействие аппаратной архитектуры, встроенного программного обеспечения и программного стека под рабочими нагрузками, выявлять особенности поведения платформы и учитывать этот опыт при дальнейшем развитии продукта.</p><p>В целом, такой подход объединяет разработку платформы, инженерную экспертизу и эксплуатацию в один непрерывный цикл — собственная инфраструктура становится источником обратной связи для следующих поколений серверной платформы.</p><h2>Deckhouse: Kubernetes-платформа и экосистема для Cloud Native</h2><p><a href="https://deckhouse.ru/">Deckhouse</a> — экосистема инструментов для разработки, доставки и эксплуатации Cloud Native-приложений. В основе — Deckhouse Kubernetes Platform (DKP), которая автоматизирует управление кластерами Kubernetes поверх любой инфраструктуры: публичные и частные облака, bare metal, закрытые контуры без доступа в интернет. Вокруг платформы выстроен набор продуктов — управление виртуализацией, хранение секретов, CI/CD, мониторинг — всё в одной экосистеме с общим API и интерфейсом.</p><p>Продукты разрабатываются и размещаются на территории РФ. Платформа поддерживает российские ОС: РЕД ОС, Astra Linux, ALT Linux. Deckhouse Kubernetes Platform CSE имеет сертификат ФСТЭК России №4860, платформа внесена в реестр российского ПО.</p><h3>Что входит в экосистему</h3><p>Deckhouse Kubernetes Platform (DKP) — ядро. Управляет кластерами Kubernetes, системным ПО на узлах, базовыми компонентами. После установки платформа готова к работе: автомасштабирование, мониторинг, мультитенантность — из коробки, без ручной сборки из отдельных компонентов.</p><p>Deckhouse Virtualization Platform (DVP) — управление виртуальными машинами и контейнерами из одного интерфейса. Масштабируется до 1000 серверов и 50 000 виртуальных машин. Поддерживает IaC-подход через открытый API, что позволяет автоматизировать развёртывание и управление средой полностью декларативно.</p><p>Deckhouse Stronghold — управление жизненным циклом секретов: пароли, ключи API, сертификаты, SSH-ключи, токены. Совместим с API HashiCorp Vault, что упрощает миграцию с него — без выгрузки секретов наружу через внешние утилиты. Поддерживает двойное шифрование через внешние HSM (AES + ГОСТ, AES + RSA), автоматическое резервное копирование и межкластерную репликацию.</p><h3>Как устроен процесс работы</h3><h4>Установка и конфигурация</h4><p>После установки DKP полностью готова к работе. Узлы группируются под разные типы нагрузки, настраиваются политики безопасности, мониторинг, журналирование. Платформа автоматически управляет системным ПО на узлах и базовыми компонентами Kubernetes.</p><h4>Развёртывание в закрытых контурах</h4><p>Установка и использование продуктов возможны на серверах без доступа в интернет, включая географически удалённые объекты.</p><h4>DevSecOps-практики</h4><p>Сквозное применение DevSecOps на всех этапах поставки: управление сетевыми политиками, аутентификация и авторизация, заказ TLS-сертификатов, аудит-логирование, изолированные контейнеры.</p><h4>Для кого это полезно</h4><ul><li>Техлиды и архитекторы получают платформу, которая закрывает инфраструктурный слой: не нужно собирать стек из отдельных компонентов — мониторинг, service mesh, хранение секретов, балансировка уже встроены.</li><li>Разработчики получают сокращение времени подготовки среды разработки до 15 раз, единый UI и API для управления всей инфраструктурой, понятный CI/CD-конвейер. DVP позволяет использовать IaC для управления виртуальными машинами так же, как контейнерами — через манифесты.</li><li>QA-инженеры и SRE работают с уже настроенным мониторингом из коробки, автоматическими алертами и механизмами восстановления.</li></ul><h3>Что отличает подход</h3><p>Вся экосистема продуктов разрабатывается одной командой и поддерживает единый канал экспертной поддержки. Не нужно разбираться, кто отвечает за проблему — платформа или отдельный модуль: всё покрывает один контракт.</p><p>Кластеры поддерживают любой тип инфраструктуры без изменения подхода к управлению: одни и те же практики работают в Yandex Cloud, в собственном ЦОД и на bare metal одновременно. В кейсе «Лемана ПРО» именно это позволило объединить кластеры из разных облачных провайдеров и дата-центров в единую инфраструктуру.</p><p>Высокая доступность из коробки: SLA 99,99% достигается за счёт отказоустойчивости компонентов платформы, геораспределённых конфигураций (Multicluster на базе Istio, MetroCluster) и fencing-механизмов для безопасного восстановления при сбоях узлов.</p><h3>Техническая база</h3><ul><li>Поддерживаемые ОС (host): Astra Linux SE, РЕД ОС, РОСА Сервер, ALT Linux, CentOS, Debian, Ubuntu</li><li>Поддерживаемые ОС (guest в DVP): любые ОС на x86-64</li><li>Интеграции: LDAP, OIDC, внешние HSM, аппаратные СХД (TATLIN, Huawei, HPE, NetApp), SCSI-протокол, LACP, VLAN</li><li>API: открытый, совместим с HashiCorp Vault API (для Stronghold)</li><li>Форматы дисков ВМ: VMDK, Qcow2, Raw</li><li>Сертификация: ФСТЭК России №4860, реестр российского ПО</li></ul><h3>Управление и поддержка</h3><p>Единый канал поддержки покрывает все продукты экосистемы. Для обучения работает Deckhouse Академия с курсами по платформе и инструментам безопасности. Обновления платформы приходят автоматически в выбранное окно обслуживания. Для знакомства с продуктами доступна 30-дневная пробная версия.</p><h2>ELMA365 BPM: автоматизация бизнес-процессов на Low-code платформе</h2><p><a href="https://elma365.com/ru/products/bpm/">ELMA365 </a>— Low-code BPM-платформа для оцифровки, автоматизации и оптимизации бизнес-процессов. В основе — процессный движок, который автоматически ставит задачи участникам, маршрутизирует процессы по заданной логике и собирает данные на каждом этапе. Моделирование ведётся в визуальном дизайнере по нотации BPMN 2.0 — без привлечения разработчиков. Сценарии и кастомная бизнес-логика пишутся на TypeScript с подсветкой синтаксиса и автодополнением прямо в интерфейсе.</p><p>Платформа разворачивается в облаке на серверах Яндекса — без установки дополнительных компонентов, всё работает через браузер. По данным TAdviser, ELMA BPM — самая внедряемая BPM-система в России и СНГ.</p><p>Продукт используют в корпоративной автоматизации: согласование документов, управление задачами и поручениями, электронный документооборот, CRM-процессы, КЭДО.</p><h3>Как устроен процесс работы</h3><h4>Моделирование процессов</h4><p>Процесс описывается в графическом дизайнере из готовых блоков: задачи, шлюзы принятия решений, таймеры, уведомления, запуск подпроцессов. Используется нотация BPMN 2.0 — схема понятна как аналитику, так и бизнес-заказчику. Дополнительно доступны готовые активности ECM для работы с документами: подписание, согласование, генерация по шаблону, вебхуки для интеграций.</p><h4>Формы и данные</h4><p>Все формы создаются в графическом редакторе. Поля настраиваются под специфику процесса, группируются по вкладкам и панелям, скрываются или отображаются в зависимости от контекста. На этапе моделирования добавляются сценарии на TypeScript: автозаполнение полей, вычисление значений, определение ветки процесса — всё без написания backend-логики.</p><h4>Запуск и исполнение</h4><p>После запуска процессный движок автоматически ставит задачи участникам в нужной последовательности. Задачу можно назначить не конкретному сотруднику, а отделу — её возьмёт тот, кто менее загружен в данный момент. Запуск настраивается вручную или по расписанию с учётом рабочего календаря, официальных и праздничных дней. Стандартный API позволяет запускать процессы из внешних систем и получать статус по запущенным экземплярам.</p><h4>Отладка и мониторинг</h4><p>В режиме отладки проверяется логика операций и корректность сценариев в реальном времени. При ошибке система выделяет проблемную операцию и показывает детали. После запуска ход процесса отслеживается через канбан-доску и карточку процесса со схемой в реальном времени: завершённые операции подсвечиваются синим, текущая — зелёным. Руководитель видит списки задач подчинённых, загрузку по сотрудникам, статистику по просрочкам за период.</p><h4>Быстрая оптимизация</h4><p>Процессы редактируются без остановки уже запущенных экземпляров. Изменения вступают в силу сразу после публикации. Платформа поддерживает версионность процессов — можно откатиться к предыдущему состоянию, если что-то пошло не так. Это важно для компаний, у которых одновременно живут десятки «живых» процессов: по оценке ELMA, для компании в 500 человек таких процессов от 50 до 100, и каждый меняется со временем.</p><h3>Для кого это полезно</h3><ul><li>Разработчики и аналитики работают в среде с подсветкой синтаксиса, автодополнением и встроенным отладчиком — TypeScript-сценарии пишутся прямо в интерфейсе. Сторонние библиотеки и внешние системы подключаются через готовые скрипты и вебхуки. Стандартный API открывает возможности для интеграции с любыми внешними сервисами, веб-сайтами и базами данных.</li><li>PM получает полную видимость по задачам и срокам: канбан, мониторинг процессов в реальном времени, автоматические уведомления при просрочке или ошибке. Перераспределение задач при отпусках и болезнях закрывается механизмом замещения — администратор назначает замещающего и выдаёт временные доступы.</li><li>QA-инженеры могут использовать версионность процессов для контроля изменений и отладчик для проверки бизнес-логики до выхода в продакшн.</li></ul><h3>Что отличает подход</h3><p>Платформа сочетает Low-code-скорость с гибкостью полноценного кода. Большинство процессов настраивается без программирования, но там, где нужна кастомная логика, TypeScript-сценарии дают полный контроль. Это позволяет аналитикам закрывать задачи самостоятельно, не ставя каждое изменение в очередь к разработчикам.</p><p>Версионность и редактирование «на лету» — принципиальная особенность для enterprise: процессы живут годами и постоянно меняются. ELMA365 позволяет управлять этим циклом без остановки операционной работы и без риска сломать уже запущенные экземпляры.</p><p>Интеграционная шина покрывает основные корпоративные сценарии: ЭДО через операторов ЮЗДО и Контур.Диадок, CRM с встроенной телефонией и мессенджерами через ChatDesk, КЭДО с электронной подписью, которая полностью легитимна и позволяет убрать бумажные носители.</p><h3>Техническая база</h3><ul><li>Язык сценариев: TypeScript (встроенная IDE с автодополнением и отладчиком)</li><li>Нотация процессов: BPMN 2.0</li><li>API: стандартный REST API для запуска процессов и управления ими из внешних систем</li><li>Интеграции: ЭДО (ЮЗДО, Контур.Диадок), мессенджеры (ChatDesk), телефония, внешние БД и веб-сервисы через вебхуки и скрипты</li><li>Развёртывание: облако (серверы Яндекс), браузерный интерфейс без установки компонентов</li></ul><h3>Управление и поддержка</h3><p>Изменения в процессах вносятся аналитиками без привлечения IT-отдела — платформа адаптирована под пользователей без специальных технических навыков. Мониторинг, уведомления и эскалации настраиваются на этапе моделирования. Новые идеи проверяются быстро: смоделировал → отладил → опубликовал → проанализировал в реальном времени.</p><h2>Т1 Сфера: платформа полного цикла производства ПО</h2><p><a href="https://t1.ru/products/platforma-sfera">«Сфера» (SFERA — Scaled Framework for Enterprise Resilience and Agility)</a> — платформа для управления разработкой, тестированием, эксплуатацией и поставкой ПО. Более 40 инструментов в одном контуре: таск-трекер, Git-репозиторий, CI/CD-конвейер, хранение артефактов, управление тестированием, мониторинг, документация. Платформа разрабатывается с 2020 года на основе опыта внедрения ИТ-конвейеров в крупнейших российских компаниях, включая банковский сектор.</p><p>В реестре российского ПО. Работает на инфраструктуре без выхода в интернет — подходит для закрытых корпоративных контуров. Применяют в enterprise-компаниях с большими ИТ-командами: финансовый сектор, ретейл, телеком, госструктуры. Поддерживает команды от нескольких человек до десятков тысяч специалистов одновременно.​</p><h3>Как устроена платформа</h3><h4>Управление процессами и задачами</h4><p>Сфера.Задачи — таск-трекер с настройкой под любую методологию: Agile, Scrum, SAFe, Kanban. Управляет бэклогом, декомпозицией задач, приоритизацией, назначением ответственных и дедлайнов. Закрывает те же сценарии, что Jira, Notion, Trello и Azure DevOps — в одном инструменте.</p><p>Сфера.Знания и Сфера.Документы обеспечивают базу знаний и документооборот — аналог связки Confluence + Notion. Здесь хранятся архитектурные решения, регламенты, технические спецификации и всё, что обычно теряется в чатах и почте.​</p><h4>DevOps-инструментарий</h4><p>Сфера.DevOps — сквозная автоматизация цикла от написания кода до деплоя. Включает:</p><ul><li>Git-инструмент для хранения, рецензирования и версионирования кода</li><li>CI/CD-конвейер для непрерывной интеграции, тестирования и развёртывания</li><li>Единое хранилище артефактов разработки</li><li>DevOps-сервис самообслуживания для операций первого и второго дня — создание компонентов, сборка, проверка, раскатка</li></ul><h4>Тестирование</h4><p>Комплекс инструментов для автоматизированного тестирования встроен в DevOps-конвейер. Поддерживает быстрый и автоматизированный процесс проверки на всех этапах жизненного цикла — от написания тест-кейсов до интеграционного и регрессионного тестирования в пайплайне.​</p><h4>Мониторинг и эксплуатация</h4><p>Сфера.Интеллектуальный мониторинг — транзакционный мониторинг бизнес-сервисов в реальном времени. Включает управление ИТ-активами, технологиями, сервисами, автоматизацию первой линии поддержки и управление жизненным циклом инцидентов. Контроль внесения изменений в инфраструктуру фиксируется отдельным инструментом.​</p><p>Особенность платформы — 3D-дашборды для контроля всех процессов производства ПО. Верхнеуровневый мониторинг детализируется до уровня отдельной команды или стрима: видно, где тормозит пайплайн, где накапливается технический долг, где горят сроки.​</p><h3>Для кого это полезно</h3><p>Техлиды и архитекторы получают единую среду, в которой живут архитектурные схемы, API-документация, код и задачи — всё связано и не расползается по разным системам. Инструмент для проектирования архитектуры на разных уровнях входит в состав платформы отдельным модулем.​</p><p>Разработчики работают в знакомом Git-workflow с code review, CI/CD-конвейером и хранилищем артефактов — без необходимости настраивать интеграции между десятком разных инструментов. DevOps-сервис самообслуживания сокращает время на рутинные операции: создание компонентов, настройку сборок, деплой.​</p><p>QA-инженеры используют встроенный тест-менеджмент в связке с CI/CD — тест-кейсы, автоматизация, отчётность по покрытию в одном контуре.</p><h3>Что отличает подход</h3><p>Платформа строилась не в вакууме, а на основе реального опыта ИТ-конвейеров в крупных корпорациях — в первую очередь банковского сектора. Помимо инструментов, в комплекте идёт методологический фреймворк — пошаговый план выстраивания технологического производства: от формирования команд до вывода продукта в промышленную эксплуатацию. Это снижает порог входа для команд, которые только выстраивают DevOps-культуру.​</p><h3>Техническая база</h3><ul><li>Методологии: Agile, Scrum, SAFe, Kanban​</li><li>Инструменты: таск-трекер, Git, CI/CD, хранилище артефактов, тест-менеджмент, база знаний, документооборот, мониторинг, управление инцидентами​</li><li>Интеграции: существующие системы контроля версий (GitLab и другие), внешние DevOps-инструменты​</li><li>Развёртывание: корпоративный контур без выхода в интернет​</li><li>Реестр: входит в реестр российского ПО​</li></ul><h3>Управление и поддержка</h3><p>Платформа разработана совместно с VK, «1С», Лабораторией Касперского и Ростелекомом в рамках дорожной карты «Новое общесистемное ПО». Поддержка охватывает все модули платформы через единый канал. Новые команды могут опираться на встроенный методологический фреймворк для выстраивания процессов производства ПО с нуля.</p><h2>Comindware Platform: Low-code BPM для автоматизации сложных процессов</h2><p><a href="https://www.comindware.ru/platform/">Comindware Platform </a>— Low-code BPM-платформа для моделирования, автоматизации и оптимизации бизнес-процессов предприятия. В одной среде работают корпоративная архитектура, процессный движок, кейс-менеджмент, управление данными и интеграции с внешними системами. Процессы описываются в визуальном дизайнере по нотации BPMN, исполняются движком точно в соответствии с моделью — без разночтений при переносе логики из схемы в код.</p><p>Среднее время реализации MVP на стороне клиента — 4 недели. Один из подтверждённых кейсов: бизнес-аналитик ABPMP в одиночку автоматизировал процесс обработки заявок за 30 часов, ускорив его в пять раз. Платформа применяется в промышленности, финансовом секторе, ритейле, телекоме, строительстве, медицине и государственных структурах. Среди кейсов нашла проекты для Газпром Авиа, НСПК, UCS, UserGate.</p><h3>Как устроен процесс работы</h3><h4>Моделирование и автоматизация процессов</h4><p>Процессы моделируются в BPMN-нотации, движок исполняет их в точности с моделью. Настройка большинства сценариев ведётся без написания кода, для сложной кастомной логики доступны C# и N3.</p><h4>Управление данными и интерфейсами</h4><p>Права доступа настраиваются на уровне отдельных кнопок, столбцов, таблиц и полей. Для отображения данных доступны рабочие области, виджеты, карты, графики, QR-коды.</p><h4>Событийная оркестрация</h4><p>Самогенерирующийся REST API развивается вместе с платформой и клиентскими приложениями, оставаясь обратно совместимым. Документирование через Swagger/OpenAPI: разработчики получают подробное описание каждого с примерами и возможностью тестирования на реальных данных без сборки приложения.​</p><p>Встроенные коннекторы покрывают стандартные корпоративные интеграции: Git, OpenLDAP/Active Directory, SMTP/IMAP, Exchange, OData (ERP), RabbitMQ/MSMQ, MSSQL/MySQL. Для событийных сценариев поддерживаются вебхуки — обмен данными с Telegram, Viber, JivoSite, телефонией (Novofon, Mango Office), почтовыми сервисами и любыми внешними системами через HTTP.</p><h3>Для кого это полезно</h3><ul><li>Архитекторы и аналитики управляют всей картой процессов компании в одной среде — от верхнеуровневой модели до исполняемых процессов. Изменения вносятся без остановки запущенных экземпляров, логика модели напрямую транслируется в поведение системы без ручной интерпретации.​</li><li>Разработчики работают с самогенерирующимся REST API с Swagger-документацией, встроенными коннекторами к популярным сервисам и возможностью подключать кастомную логику на C#.</li><li>PM получает прозрачность по статусу процессов в реальном времени и аналитику по отклонениям.</li><li>QA и аналитики проверяют логику процессов на моделях до выхода в прод. Изменения можно откатить или протестировать на отдельном контуре.</li></ul><h3>Что отличает подход</h3><p>Платформа объединяет в одной среде то, что обычно разведено по разным инструментам: архитектурное моделирование, исполнение процессов, кейс-менеджмент, управление данными и интеграции.</p><p>Самогенерирующийся API — нестандартное архитектурное решение для enterprise-платформ. Обычно API — это отдельный артефакт, который отстаёт от эволюции продукта. Здесь API генерируется автоматически по мере развития платформы и клиентских приложений, оставаясь обратно совместимым.</p><p>Платформа работает на собственном оборудовании, в частных или публичных облаках и по гибридной схеме. Интерфейс — браузерный, как для конечных пользователей, так и для разработчиков, установка ПО на рабочие места не требуется.​</p><h3>Техническая база</h3><ul><li>Нотация процессов: BPMN 2.0</li><li>Языки кастомной логики: C#, N3</li><li>API: самогенерирующийся REST API, документирование через Swagger/OpenAPI​</li><li>Коннекторы: Git, Active Directory/OpenLDAP, Exchange, SMTP/IMAP, OData, RabbitMQ, MSMQ, MSSQL, MySQL​</li><li>Интеграции через вебхуки: Telegram, Viber, JivoSite, Novofon, Mango Office, Unisender, Mailchimp, CRM-системы (Bitrix24, Megaplan, MS Dynamics)​</li><li>Развёртывание: on-premise, частное и публичное облако, гибридная схема​</li></ul><h3>Управление и поддержка</h3><p>Настройка большинства сценариев доступна аналитикам без привлечения разработчиков. Партнёрская сеть охватывает задачи внедрения и сопровождения. Для быстрого старта доступен пилотный проект — среднее время реализации MVP составляет 4 недели. Платформа развивается с учётом требований российского рынка и поддерживает работу в закрытых корпоративных контурах.</p><p>***</p><p>Общая закономерность у всех рассмотренных решений одна: экспертиза видна в глубине проработки конкретного слоя. Selectel копает до уровня BIOS/BMC и изучает, как ведёт себя железо под нагрузкой — потому что сами на нём работают. Чек-лист, который стоит держать в голове при выборе инструментов и подрядчиков для сложных задач:</p><ul><li>Есть ли у команды собственный опыт эксплуатации, а не только внедрения</li><li>Можно ли протестировать решение под свой профиль нагрузки до принятия решения</li><li>Насколько глубоко команда может разобраться в проблеме — до первопричины или только до симптома</li><li>Покрывает ли поддержка весь стек или только отдельные его части</li><li>Как решение ведёт себя при изменениях — масштабировании, миграции, обновлениях</li></ul><p>Правильный ответ на эти вопросы не всегда очевиден из документации. Иногда приходится доходить до него на собственном опыте — желательно не в продакшне.</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему классический CI/CD не справляется с LLM (и какие release gates мы построили, чтобы это исправить)</title>
      <link>https://tproger.ru/translations/pochemu-klassicheskij-ci-cd-ne-spravlyaetsya-s-llm-i-kakie-release</link>
      <comments>https://tproger.ru/translations/pochemu-klassicheskij-ci-cd-ne-spravlyaetsya-s-llm-i-kakie-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/pochemu-klassicheskij-ci-cd-ne-spravlyaetsya-s-llm-i-kakie-release</guid>
      <description><![CDATA[<p>Перевод статьи о том, почему классические CI/CD-ворота не ловят тихие регрессии в LLM и как baseline-оценки, детектирование дрейфа, shadow-проверки и бюджеты предотвращают инциденты.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/pochemu-klassicheskij-ci-cd-ne-spravlyaetsya-s-llm-i-kakie-release">Почему классический CI/CD не справляется с LLM (и какие release gates мы построили, чтобы это исправить)</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></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[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Jul 2026 13:30:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи Freddy Daniel Alvarez Pinto из The New Stack, оригинал: <a href="https://thenewstack.io/why-cicd-fails-llms/" rel="noopener noreferrer">https://thenewstack.io/why-cicd-fails-llms/</a>.</p><p>Эта статья объясняет, почему классических CI/CD-ворот недостаточно для production-систем на базе ИИ. Автор делится практическим подходом к release gates для LLM-пайплайнов с помощью baseline-оценок, детектирования дрейфа, shadow-проверок и ограничений по стоимости и латентности. Акцент — на профилактике: отлов тихих AI-регрессий до того, как они достигнут пользователей, на основе реальных уроков платформенной инженерии из production-инфраструктуры.</p><p>В пятницу днём я задеплоил обновлённый RAG-пайплайн. Все оценки прошли, оценки сходства выглядели отлично, а к утру понедельника система уверенно рекомендовала устаревшие цены, потому что embedding-модель дрейфовала настолько, что предпочитала старые чанки свежим. Ни один алерт не сработал, ни один тест не упал, дашборд был зелёным, а выходные данные — мусором.</p><p>В тот момент я перестал доверять зелёному цвету как сигналу к релизу. У нас не было проблемы с деплоем. У нас была проблема с release gates. Классический CI/CD создавался для детерминированного ПО. LLM — вероятностны. Наши ворота тоже должны быть вероятностными.</p><p>Классические CI/CD-ворота работают по принципу pass/fail, но LLM поставляют поведение, а не только код, поэтому нужны ворота, отслеживающие дрейф поведения.</p><p>Три режима отказа: eval drift (постепенная деградация оценок), distribution shift (реальные запросы отличаются от тестовых) и context poisoning (изменились извлечённые документы, а тесты спрашивают вчерашнее).</p><p>Четыре release gates: baseline eval suite, eval drift detection, shadow traffic validation, cost/latency guardrails.</p><p>Ворота должны быть простыми и понятными команде, иначе инженеры начнут их обходить.</p><p>Eval-датасеты нужно версионировать так же тщательно, как Terraform state: с бэкапами и параноей.</p><h2>Почему классический CI/CD не справляется с LLM-пайплайнами</h2><p>В обычной доставке ПО ворота достаточно просты: unit-тесты прошли, интеграционные тесты прошли, проверки безопасности прошли — деплой. Это бинарно. Сборка зелёная или красная. Эта модель ломается, когда вы поставляете не код, а поведение.</p><blockquote>Классический CI/CD создавался для детерминированного ПО. LLM — вероятностны. Наши ворота тоже должны быть вероятностными.</blockquote><p>Production-система на базе ИИ может сегодня показывать relevance 0,82, завтра 0,79, а на следующей неделе 0,74. Поскольку ни один запуск не пересекает порог отказа, никого не пейджат, хотя пользователи уже получают худшие ответы.</p><p>Я больше 20 лет управлял production-инфраструктурой: приватными облаками OpenStack, миграциями баз данных, CI/CD-пайплайнами и mission-critical системами. В классическом DevOps мы усвоили: сервер, который сообщает о 99,9% аптайма при потере 0,1% финансовых транзакций, — не здоров. Он скрывает баг. Оценки LLM работают так же. Агрегированные метрики маскируют локальные отказы.</p><p>Первый режим отказа — eval drift: оценки деградируют постепенно, но недостаточно, чтобы упасть по жёсткому порогу. Второй — distribution shift: реальные пользователи задают короткие, беспорядочные, странные вопросы, о которых ваш чистый eval-датасет и не думал. Третий — context poisoning: ваши извлечённые документы изменились, а тесты всё ещё спрашивают вчерашние вопросы.</p><p>Традиционный CI/CD gate спрашивает: «Тест прошёл?» LLM release gate спрашивает: «Поведение осталось в допустимом диапазоне?» Обычный gate сравнивает ожидаемый вывод с фактическим. AI CI/CD gate сравнивает кандидатное поведение с историческим и production-поведением, а также со стоимостью, латентностью и риском. Традиционные ворота быстро отсеивают исключения. LLM release gates внимательно отсекают дрейф.</p><blockquote>Традиционные ворота быстро отсеивают исключения. LLM release gates внимательно отсекают дрейф.</blockquote><p>Это различие важно, потому что production AI-системы гниют, а не взрываются. Я создал llm-eval-drift-release-gates-AGENT, потому что хотел ворота, которые относятся к AI-релизам как к инфраструктурным релизам: измеримым, повторяемым и, по возможности, скучным. Скука недооценена. Она позволяет инженерам спать.</p><h2>Анатомия LLM release gate</h2><p>Первое ворото — baseline eval suite. Он прогоняет фиксированный датасет по кандидатному пайплайну и оценивает relevance, faithfulness, safety, groundedness и любые доменные проверки, которые вам важны. Цель не в том, чтобы доказать, что модель идеальна. Цель — поймать регрессии до того, как они станут историями от клиентов.</p><p>Вот упрощённая Python-структура из паттерна, который я использую:</p><p>Использование StrEnum сохраняет enum в виде строк без множественного наследования. Это важно в релизном инструментарии, потому что значения статусов часто логируются, сериализуются, сравниваются в CI или передаются в дашборды.</p><p>Это ловит очевидные отказы: коллапс relevance, падение faithfulness, небезопасные выходы или искажённые результаты оценщика. Если отказ жёсткий, пайплайн блокируется немедленно; если срабатывает предупреждение, требуется ручное одобрение. Мне не нравятся тихие предупреждения: это будущие инциденты в хорошей рубашке.</p><h3>Второе ворото: детектирование дрейфа оценок</h3><p>Второе ворото — детектирование дрейфа оценок. Фиксированного порога недостаточно. Если relevance падает с 0,91 до 0,86, ваш порог 0,80 говорит, что всё в порядке. Ваши пользователи могут не согласиться.</p><p>Поэтому я сравниваю текущие оценки с rolling baseline из недавних деплоев:</p><p>Eval suite обнаружил 6% падение relevance в 23:00 в четверг. Без него это падение достигло бы 200 пользователей к понедельнику. Ворото не знало бизнес-контекста. Ему это и не нужно. Оно знало, что кандидат хуже последнего известного хорошего релиза.</p><h3>Третье ворото: shadow traffic validation</h3><p>Третье ворото — shadow traffic validation. Перед полным раскатом я направляю небольшой процент реального трафика на кандидатный пайплайн. Пользователи всё ещё получают production-ответ, но система записывает кандидатный вывод для сравнения.</p><p>Это canary-deployment, применённый к ИИ. Я использовал тот же паттерн в инфраструктурных раскатах, включая идеи из моего репозитория eks-canary-deployment-pipeline. Разница в том, что для LLM вы сравниваете не только HTTP 200. Вы сравниваете качество ответа, извлечённый контекст, латентность и причины, по которым кандидат расходится с production подозрительным образом.</p><p>Judge-модель может быть полезна, но я не даю ей быть единственным авторитетом. Она даёт сигнал. Release policy принимает решение.</p><h3>Четвёртое ворото: стоимость и латентность</h3><p>Четвёртое ворото — стоимость и латентность. Модель, которая идеально оценивается, но стоит в 3 раза дороже, — не валидный релиз. RAG-пайплайн, который добавляет две секунды латентности, тоже не готов. Эта же логика легла в основу моей работы enterprise-rag-guardrails-costops.</p><p>Когда это ворото не проходит, система блокирует релиз или направляет его на ручное одобрение. Я научился не торговаться о латентности во время деплоя. Она всегда побеждает позже.</p><p>Эти четыре ворота не делают деплой LLM идеальным. Они делают сложнее поставку бессмыслицы под зелёным бейджем.</p><h2>Как встроить это в существующий CI/CD</h2><p>Release gate не должен быть отдельным научным проектом. Если ваша платформенная команда уже использует GitHub Actions или GitLab CI, LLM-пайплайн деплоя должен вписаться в этот workflow.</p><p>Паттерн намеренно скучный:</p><p>Такую форму я расширил из своей работы devsecops-pipeline-github-actions. Соберите приложение. Запустите детерминированные тесты. Запустите baseline eval suite. Сравните с rolling baselines. Провалидируйте на shadow-трафике. Проверьте бюджеты стоимости и латентности. Деплойте, только когда все ворота согласны.</p><p>Здесь guardrails MLOps становятся полезны платформенным инженерам. Вам не нужна отдельная религия деплоя. Вам нужен один дополнительный набор проверок внутри пайплайна, которому команда уже доверяет.</p><p>Вот небольшая Python-точка входа, которую можно вызывать из CI. Важная деталь: она падает аккуратно, когда нужные отчёты отсутствуют или искажены, потому что сырые stack trace — не стратегия релиза.</p><p>Лучший release gate — тот, которым команда реально пользуется. Если для настройки нужна PhD по ML, это не ворота. Это стена. Я сейчас получаю степень PhD в области безопасности облачных вычислений, и даже я не хочу процесс деплоя, которому каждую пятницу нужна диссертация. Ворота должны быть достаточно простыми, чтобы запускаться в CI, достаточно строгими, чтобы блокировать плохие релизы, и достаточно гибкими, чтобы не стать офисным украшением.</p><p>Последняя часть далась мне дольше, чем хотелось бы признать.</p><h2>Ошибки, которые я совершил, и что бы сделал иначе</h2><p>Моя первая версия была болезненно строгой. Каждый деплой блокировался. Eval suite жаловался на мелкие изменения формулировок, безобидные различия форматирования и пограничные падения оценок. Команда начала обходить ворота полностью. Это была моя вина.</p><p>Ворота, которые блокируют всё, хуже, чем никаких ворот. По крайней мере, без ворот люди знают, что рискуют. С плохими воротами они учатся игнорировать систему.</p><blockquote>Ворота, которые блокируют всё, хуже, чем никаких ворот. С плохими воротами люди учатся игнорировать систему.</blockquote><p>Моя вторая ошибка — оценивать только на синтетических запросах. Они были чистыми, полными и вежливыми. Реальные пользователи такими не бывают. Реальные пользователи печатают три слова, ошибаются в названиях продуктов, вставляют фрагменты и ожидают, что система поймёт контекст, который они не дали.</p><p>Оценки выглядели отлично. Production — нет.</p><p>Моя третья ошибка — не версионировал eval-датасет. Когда я добавлял новые крайние случаи, я терял возможность сравнивать старые релизы с новыми baselines. Теперь я версионирую eval-наборы так же, как версионирую Terraform state: внимательно, с бэкапами и с лёгкой паранойей.</p><p>Строить это из Кочабамбы, Боливия, тоже повлияло на дизайн. У меня не было неограниченных облачных кредитов на огромные eval-прогоны. Это заставило оптимизировать сэмплирование, кешировать вызовы judge-модели и разделять быстрые PR-проверки от более тяжёлых ночных.</p><p>Ограничения рождают лучшую инженерию. Раздражает, но правда.</p><h2>Отправляйте уверенность, а не только код</h2><p>В классическом ПО мы поставляем код и проверяем поведение. В ИИ мы поставляем поведение и проверяем соответствие. Release gates — это то, как мы закрываем этот разрыв.</p><p>LLM release gates не уберут неопределённость из production AI-систем. Ничто не уберёт. Но они дают платформенным командам практический способ поймать eval drift, distribution shift, context poisoning, скачки стоимости и регрессии латентности до пользователей.</p><p>Это важно для надёжности агентных workflow. Это важно для AI CI/CD. Это важно, потому что «все тесты прошли» больше не достаточно.</p><p>Я создал llm-eval-drift-release-gates-AGENT, потому что устал от зелёных пайплайнов, которые мне лгали. Репозиторий — open-source, offline-first референсная реализация этого паттерна release gates. Он намеренно достаточно мал, чтобы изучить, запустить, сломать и ужесточить в своём CI/CD.</p><p>Репозиторий: <a href="https://github.com/fdaniel-alvarez-dev/llm-eval-drift-release-gates-AGENT" rel="noopener noreferrer">https://github.com/fdaniel-alvarez-dev/llm-eval-drift-release-gates-AGENT</a>. Форкайте, ломайте, улучшайте. Худший release gate — тот, который вы никогда не построили.</p><h2>Выводы</h2><p>Классический CI/CD создавался для детерминированного ПО, а LLM — вероятностны. Поэтому release gates для ИИ должны отслеживать не только прохождение тестов, но и дрейф поведения: baseline-оценки, детектирование дрейфа, shadow-трафик, стоимость и латентность.</p><p>Ворота должны быть простыми, понятными и настраиваемыми. Их задача — не идеальная модель, а предотвращение тихих регрессий, которые иначе достигнут пользователей. Версионируйте eval-датасеты, проверяйте на реальном трафике и не забывайте про бюджеты. Так вы сможете доверять зелёному цвету пайплайна снова.</p>]]></content:encoded>
    </item>
    <item>
      <title>KolibriOS 0.7.7: ОС на ассемблере, которая влезает на дискету</title>
      <link>https://tproger.ru/articles/kolibrios-0-7-7-os-na-assemblere-kotoraya-vlezaet-na-disketu</link>
      <comments>https://tproger.ru/articles/kolibrios-0-7-7-os-na-assemblere-kotoraya-vlezaet-na-disketu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kolibrios-0-7-7-os-na-assemblere-kotoraya-vlezaet-na-disketu</guid>
      <description><![CDATA[<p>KolibriOS 0.7.7 — российская ОС на ассемблере, которая помещается на дискету и работает на i586 с 8 МБ ОЗУ. Разбираем возможности и ограничения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kolibrios-0-7-7-os-na-assemblere-kotoraya-vlezaet-na-disketu">KolibriOS 0.7.7: ОС на ассемблере, которая влезает на дискету</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Ретро]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Jul 2026 12:28:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2026 году операционная система, которая полностью умещается на 3,5-дюймовой дискете и загружается быстрее, чем вы успеваете отпить кофе, звучит как технологическая шутка. Но <b>KolibriOS 0.7.7</b> существует, развивается и даже имеет рабочий графический стол. Это не эмулятор и не демо: полноценная 32-битная ОС, ядро которой написано на ассемблере.</p><p>В своей колонке <i>Daily Drivers</i> редактор Hackaday Дженни Лист скачала ISO-образ, запустила KolibriOS на современном ThinkPad и удивилась: система выглядит зрелой, стабильной и по-настоящему быстрой. Разбираем, что это за проект, откуда он взялся и кому пригодится сегодня.</p><h2>Что такое KolibriOS</h2><p><b>KolibriOS</b> — российский форк MenuetOS, созданный в 2004 году. В то время как автор оригинального MenuetOS Вилле Турьянмаа переключился на закрытую 64-битную версию, сообщество вокруг русскоязычного порта сохранило код открытым и продолжило развивать 32-битную ветку. Название «Колибри» выбрано неслучайно: система маленькая и быстрая, как птица-колибри.</p><p>Проект поддерживается преимущественно разработчиками из России, Казахстана, Украины и Германии. Код распространяется под открытой лицензией, а сборки регулярно публикуются на официальном сайте и зеркалах сообщества.</p><h2>Версия 0.7.7</h2><p>Версия 0.7.7 продолжает философию предельного минимализма. Минимальные системные требования смехотворны по нынешним меркам: <b>1 МБ</b> места на диске, <b>8 МБ</b> оперативной памяти и процессор класса <b>i586</b>. При этом система выдаёт графический интерфейс, многозадачность и набор встроенных программ.</p><p>Дженни Лист отмечает, что на ThinkPad 2020-х годов KolibriOS загружается «в мгновение ока» и сразу показывает рабочий стол. Интерфейс выглядит пиксельным, как в 1990-х: нет сглаживания, есть ощущение ретро. Но при этом всё работает — без синих экранов и зависаний.</p><ul><li>KolibriOS 0.7.7 — 32-битная ОС с ядром на ассемблере, базовый образ весит около 1 МБ.</li><li>Минимальные требования: i586, 8 МБ ОЗУ, 1 МБ на диске.</li><li>В комплекте браузеры, игры, эмуляторы, графические редакторы и среда разработки.</li><li>Главное ограничение для повседневного использования — отсутствие поддержки HTTPS.</li><li>Лучше всего подходит для старого железа, тонких клиентов, обучения и ретрокомпьютинга.</li></ul><h2>Как устроена система</h2><h3>Ядро на ассемблере</h3><p>Большая часть KolibriOS написана на <b>FASM</b> — плоском ассемблере. Это объясняет крошечный размер исполняемых файлов и молниеносную загрузку: система не тратит время на инициализацию абстракций, слоёв совместимости и десятков фоновых служб.</p><p>Важная оговорка: несмотря на миф «всё на ассемблере», часть приложений и драйверов портирована или написана на C, Free Pascal, Oberon и даже Python. Но ядро, графическая подсистема и системные вызовы остаются ассемблерными.</p><h3>Файловые системы и загрузка</h3><p>KolibriOS умеет загружаться с CD/DVD, USB, жёстких дисков и даже с классической дискеты 1,44 МБ. Поддерживаются файловые системы FAT12/16/32, exFAT, NTFS и ext2/3/4. Есть варианты для Coreboot и загрузка прямо из Windows.</p><h2>Что внутри: программы и игры</h2><p>Несмотря на размер, KolibriOS поставляется с обширным набором софта. По данным сообщества, в образ входят более <b>250 программ</b>, включая текстовый процессор, просмотрщик изображений, графический редактор, музыкальный плеер, IRC-клиент и веб-браузеры.</p><p>Из игр и развлечений — порты эмуляторов, DOSBox, а также shareware-версии классики вроде DOOM и Wolfenstein 3D на полноценном CD-образе. Есть поддержка SDL, что позволяет переносить проекты с «больших» систем.</p><blockquote>Something this polished deserves a while to play around.</blockquote><h2>Главное ограничение: интернет без HTTPS</h2><p>Дженни Лист называет именно этот момент решающим: встроенные браузеры KolibriOS, включая Netsurf и Webview, не поддерживают HTTPS. Без этого современный веб практически закрыт: большинство сайтов, включая сам Hackaday, просто не откроются.</p><p>Это меняет статус системы с «основной ОС на каждый день» на «платформу для специальных задач». Почта, мессенджеры, облачные сервисы и онлайн-документация остаются недоступны без промежуточного прокси или другой машины.</p><p><b>Почему HTTPS сложно:</b><br />Современный TLS требует большой криптографической библиотеки, регулярных обновлений корневых сертификатов и поддержки множества алгоритмов. В условиях ОС размером в мегабайт это серьёзный архитектурный вызов, который сообщество пока не взяло в штатный комплект.</p><h2>Кому и где пригодится KolibriOS</h2><p>С учётом ограничений у KolibriOS остаётся несколько чётких сценариев применения. В России и соседних странах это особенно актуально: парки старого офисного и школьного оборудования часто содержат машины, которые официально «не тянут» современные ОС.</p><ul><li>Воскрешение старого железа. Pentium- и ранние Core-машины получают рабочий стол, браузер для локальных страниц и офисные утилиты.</li><li>Тонкие клиенты. Низкие требования к RAM и CPU делают KolibriOS кандидатом для терминалов с удалённым рабочим столом.</li><li>Обучение. Ядро на ассемблере, простые системные вызовы и небольшой кодовой базы — отличная площадка для изучения устройства ОС.</li><li>Ретрокомпьютинг. Запуск DOS-игр через эмулятор, классические 2D-игры и ностальгический интерфейс 1990-х.</li><li>Встроенные системы. Сборка Kolibri-A ориентирована на специализированное железо и железные проекты.</li></ul><h2>Как попробовать KolibriOS</h2><p>Попробовать систему проще всего в виртуальной машине. Скачайте ISO-образ с официального сайта, создайте VM с 64 МБ ОЗУ и загрузитесь с образа. Для реального железа подойдёт запись образа на USB-флешку или CD.</p><ul><li>Скачайте ISO или образ дискеты с официального сайта KolibriOS.</li><li>Для VM: создайте 32-битную машину с 64 МБ RAM и VESA-видео.</li><li>Для железа: запишите ISO на CD или USB через обычную утилиту.</li><li>Загрузитесь и выберите разрешение экрана из меню загрузчика.</li><li>Исследуйте меню «Пуск»: игры, утилиты, терминал и браузер.</li></ul><p>Если планируете использовать сетевые функции, проверьте совместимость сетевой карты по <a href="https://wiki.kolibrios.org/" rel="noopener noreferrer">списку оборудования</a>. Поддерживаются многие чипы Realtek, Intel и 3Com.</p><h2>Выводы</h2><p>KolibriOS 0.7.7 — это не замена Windows или Linux, а демонстрация того, какой отклик может давать компьютер, когда софт пишут под железо, а не под абстракции. В эпоху, когда операционки растут гигабайтами, проект напоминает: минимализм ещё жив.</p><p>Для российского читателя у KolibriOS есть дополнительный смысл: это открытый проект с русскоязычным сообществом, который можно изучать, дополнять и применять для решения практических задач — от перевода старого классного компьютера в рабочее состояние до обучения низкоуровневому программированию.</p><p>Главный вопрос — нужна ли вам такая система прямо сейчас. Если у вас есть старый 32-битный ноутбук, интерес к ассемблеру или просто ностальгия по быстрым ОС — попробуйте. А для повседневной работы с интернетом пока придётся держать под рукой что-то посовременнее.</p><p><b>Источники:</b></p><ul><li><a href="https://hackaday.com/2026/07/02/jennys-daily-drivers-kolibrios-0-7-7/" rel="noopener noreferrer">Jenny’s Daily Drivers: KolibriOS 0.7.7 — Hackaday</a></li><li><a href="https://distrowatch.com/kolibri" rel="noopener noreferrer">KolibriOS на DistroWatch</a></li><li><a href="https://wiki.kolibrios.org/" rel="noopener noreferrer">Официальная вики KolibriOS</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Async Rust: как уменьшить бинарник, пока rustc не оптимизирован</title>
      <link>https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan</link>
      <comments>https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan</guid>
      <description><![CDATA[<p>Разбираем, почему async Rust генерирует лишние state machine, как это бьёт по embedded и WASM, и что можно сделать в коде прямо сейчас.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan">Async Rust: как уменьшить бинарник, пока rustc не оптимизирован</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Jun 2026 10:21:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Асинхронный Rust обещал нам zero-cost abstraction: пишете почти как на обычном синхронном языке, а runtime сам разбирается с конкурентностью. На сервере с десятками гигабайт RAM это обещание обычно сбывается. Но стоит перейти к embedded-прошивке на 256 КБ flash или к WebAssembly-модулю, который гонится за каждым килобайтом, — и картина меняется. Функция с двумя await-точками превращается в state machine из 360 строк MIR, тогда как синхронный аналог укладывается в 23. Почему так происходит и что с этим делать уже сегодня?</p><p>Тема получила новый импульс после серии публикаций Диона Доктера (Dion Dokter) из голландской компании Tweede golf. Во второй части он заглядывает внутрь rustc и утверждает: async Rust так и не вышел из состояния MVP. Я не буду дословно переводить его рассуждения, а переосмыслю их с упором на практику: как понять, платите ли вы за async-удобство лишними байтами, и как снизить налог, пока компилятор не научился делать это сам.</p><ul><li>Асинхронный Rust компилируется в state machine: на каждую await-точку приходится отдельное состояние плюс служебные Unresumed, Returned и Panicked.</li><li>Простая функция с двумя await-точками даёт 360 строк MIR против 23 у синхронного кода. Часть излишков LLVM убирает, но не все, особенно при оптимизации по размеру.</li><li>Компилятор не схлопывает идентичные состояния, не инлайнит futures через await, генерирует state machine даже для async-блоков без await и оставляет panic-путь в состоянии Returned.</li><li>В release-сборках замена panic в Returned на возврат Pending может сократить прошивку на 2–5%. Убирание state machine у пустых async-блоков — ещё около 0,2%.</li><li>Пока rustc не исправлен, можно вручную: возвращать impl Future из «прозрачных» функций, использовать std::future::ready, схлопывать await-точки через match и передавать большие данные по ссылке.</li></ul><h2>Почему async-функция — это всегда state machine</h2><p>Когда вы пишете async fn, компилятор не просто оборачивает тело в callback. Он строит конечный автомат: enum, где каждый вариант — состояние между await-точками. Это называется coroutine desugaring и происходит на уровне MIR (Mid-level IR) — до того, как код попадает в LLVM.</p><p>Рассмотрим минимальный пример. Есть две функции, каждая из которых просто возвращает число, и третья складывает результаты:</p><p>У bar две await-точки, поэтому минимум два пользовательских состояния. Но если сдампить MIR после прохода coroutine_resume, картина шире:</p><p>Три служебных состояния добавляются всегда. Они нужны, чтобы соблюсти контракт Future::poll: опрос завершённой future не должен приводить к неопределённому поведению. Поэтому после первого Ready future переходит в Returned, а повторный poll паникует. Аналогично Panicked блокирует future после пойманного panic — похоже на poisoning мьютекса.</p><p>Логика корректная, но цена высокая: bar порождает 360 строк MIR, а эквивалентный синхронный код — 23. В 15 с лишним раз больше. LLVM часть этого выбросит, но на opt-level = "z" или в толстых async-графах вызовов он быстро сдаётся.</p><h2>Четыре места, где компилятор работает вхолостую</h2><h3>1. Panic в состоянии Returned</h3><p>Контракт future требует только отсутствия UB. Паниковать при повторном poll — не обязательно. Можно просто вернуть Pending снова: ничего опасного не произойдёт, а ветка panic — это лишний побочный эффект, который плохо оптимизируется.</p><p>Дион сделал экспериментальный патч rustc: в release-режиме Returned больше не паникует. На embedded-прошивках это дало <b>2–5% экономии бинарного размера</b>. В debug-сборках панику можно оставить, чтобы быстро ловить ошибочный повторный poll, — по аналогии с overflow-checks.</p><h3>2. State machine без await</h3><p>Взгляните на функцию без единой await-точки:</p><p>Идеальная реализация — всегда возвращать Poll::Ready(5) безо всякого enum. А rustc генерирует полноценный CoroutineLayout с тремя служебными состояниями и switch по дискриминанту. Такие функции часто появляются в трейтах, где один интерфейс должен быть async, но конкретная реализация ничего не ждёт. Патч, убирающий state machine у async-блоков без await, даёт ещё <b>0,2%</b> размера — мало, но правка тривиальная.</p><h3>3. Futures не инлайнятся через await</h3><p>Классический шаблон: адаптер просто пересылает вызов вниз.</p><p>Сейчас bar получает собственный state machine, который вызывает state machine foo. Вручную мы бы написали fn bar(blah) -&gt; impl Future { foo(blah) } и избавились бы от лишнего enum. Аналогично с преамбулой и постамбулой: их можно перенести на FutureExt::map из крейта futures.</p><h3>4. Одинаковые состояния не схлопываются</h3><p>Если в async-функции несколько веток match ведут к одинаковому await, компилятор создаёт отдельное состояние на каждую ветку:</p><p>Здесь send_response вызывается с разными аргументами, но структура состояний дублируется. Если вынести выбор аргумента за await, получится одно состояние вместо двух:</p><p>В одном примере из статьи MIR сокращается с 456 до 302 строк, а ассемблер — примерно на 11%. Оптимизации stack, поэтому выигрыш в реальном коде может быть заметнее.</p><h2>Что делать сегодня, не дожидаясь rustc</h2><p>Всё перечисленное выше — это работа для команды компилятора. Но релиз с этими патчами может занять месяцы, а то и годы. Пока он не вышел, можно снизить async-bloat в своём коде.</p><p><b>Главный принцип:</b> каждый лишний async fn — это лишний state machine. Если функция не содержит await, не делайте её async.</p><h3>Заменяйте async-пустышки на impl Future</h3><p>Типичный случай — трейт, где одна реализация реально ждёт ввода-вывода, а другая просто возвращает значение.</p><p>Вместо полноценного state machine получается готовая future, которая сразу возвращает Ready. Это особенно полезно в embedded-HAL, где трейты часто async, но конкретный драйвер может делать только прямой доступ к регистрам.</p><h3>Прозрачные обёртки без await</h3><p>Если функция только пересылает await вниз, уберите await:</p><h3>Схлопывайте await-точки</h3><p>Если несколько веток match заканчиваются одним и тем же await, вынесите выбор аргументов наружу. Это уменьшает число состояний state machine и облегчает жизнь LLVM.</p><h3>Передавайте большие данные по ссылке</h3><p>Async-функция захватывает в state machine всё, что живёт через await. Если передать массив по значению, он окажется внутри future целиком:</p><p>Разница в 52 раза по размеру future — и это без учёта memcpy, который компилятор вынужден вставлять при перемещении больших значений.</p><h2>Перспективы: Project Goal и финансирование</h2><p>Дион оформил эти идеи как <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Rust Project Goal</a> — формальный механизм, через который команды заявляют цели на полугодие. По его оценке, работа требует порядка <b>€30 000</b> финансирования. Для компиляторного проекта это скромная сумма: речь идёт о 2–5% размера прошивки практически в любом async-проекте.</p><p>Есть и другой подход к той же проблеме: не убирать state machine на входе, а научить LLVM лучше их оптимизировать на выходе. Дион считает, что оба направления дополняют друг друга. Чем проще state machine попадает в LLVM, тем эффективнее её можно проинлайнить и упростить на поздних проходах.</p><h2>Выводы</h2><blockquote>Async Rust never left the MVP state. The compiler generates state machines with a lot of unnecessary baggage. With a few targeted optimizations in rustc we can get smaller binaries and better performance for everyone.</blockquote><p>Утверждение «async Rust так и не вышел из MVP» звучит резко, но поясняет, почему наши «zero-cost» абстракции иногда всё-таки стоят дорого. Компилятор делает корректный, но не оптимальный код: лишние panic-ветки, неинлайненные futures, дублирующиеся состояния и state machine там, где они не нужны.</p><p>Для embedded и WASM это не абстрактная проблема, а конкретные килобайты прошивки. Пока rustc учится, разработчик может снизить налог вручную: убирать async у функций без await, возвращать impl Future из прозрачных обёрток, схлопывать await-точки и не передавать большие структуры по значению.</p><p>Если ваш проект на Rust бьётся о лимит flash, имеет смысл посмотреть на async-граф вызовов свежим взглядом. Часто проще убрать одну лишнюю async-обёртку, чем месяцами ждать патч в компиляторе.</p><p><b>Источники:</b><br />— <a href="https://tweedegolf.nl/en/blog/237/async-rust-never-left-the-mvp-state" rel="noopener">Dion Dokter, «Async Rust never left the MVP state»</a>;<br />— <a href="https://tweedegolf.nl/en/blog/235/debloat-your-async-rust" rel="noopener">Dion Dokter, «Debloat your async Rust»</a>;<br />— <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Rust Project Goal: Async state machine optimisation</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Линус Торвальдс назвал «мерзкой» раскладку файлов sched_ext в Linux — код уже переложили по папкам</title>
      <link>https://tproger.ru/news/linus-torvalds-nazval-merzkoj-raskladku-fajlov-sched-ext-v-li</link>
      <comments>https://tproger.ru/news/linus-torvalds-nazval-merzkoj-raskladku-fajlov-sched-ext-v-li?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/linus-torvalds-nazval-merzkoj-raskladku-fajlov-sched-ext-v-li</guid>
      <description><![CDATA[<p>Линус Торвальдс назвал «мерзкой» раскладку файлов sched_ext в Linux и потребовал переложить их в отдельную папку. Разбираем, что изменилось в Linux 7.2.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/linus-torvalds-nazval-merzkoj-raskladku-fajlov-sched-ext-v-li">Линус Торвальдс назвал «мерзкой» раскладку файлов sched_ext в Linux — код уже переложили по папкам</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Jun 2026 10:49:58 GMT</pubDate>
      <content:encoded><![CDATA[<p>Линус Торвальдс <a href="https://lore.kernel.org/lkml/CAHk-=wghMm2c+AYEcwYY7drSVXB27DYqc-ZXpFiq=XFs-w59wA@mail.gmail.com/">публично раскритиковал</a> структуру новых исходников sched_ext, которые вошли в Linux 7.2: вместо отдельной директории авторы рассовали файлы с префиксом ext_ прямо в kernel/sched. Он назвал это «мерзким» и потребовал убрать — и разработчики уже переложили код в kernel/sched/ext/.</p><p>В Linux 7.2 код расширяемого планировщика sched_ext изначально появился в виде файлов ext_arena.c, ext_cid.c, ext_types.h и других прямо в kernel/sched.</p><p>Линус Торвальдс слил изменения «под протестом», указав, что префиксы вместо директорий — это неправильный способ группировки.</p><p>Новый pull request перенёс файлы в kernel/sched/ext/; Торвальдс уже принял эту реструктуризацию.</p><h2>Что случилось</h2><p>На прошлой неделе в основную ветку Linux 7.2 попал основной набор изменений sched_ext — фреймворка, который позволяет реализовывать политики планирования в пользовательских программах BPF. К патчам не было претензий по функциональности, но Торвальдса возмутила организация файлов.</p><p>Вместо того чтобы создать поддиректорию kernel/sched/ext/, авторы добавили в kernel/sched несколько файлов с префиксом ext_: ext_arena.c, ext_arena.h, ext_cid.c, ext_cid.h и ext_types.h.</p><blockquote>Please don't do this disgusting thing. There's a reason we have subdirectories: it's to group files together and separate them out. Using name prefixing instead of directories is disgusting and wrong. If you have this many random sched-ext files, it damn well should be cleaned up and not be this kind of mess. I've pulled this, but under protest. Proper hierarchical filesystems have been available since 1965.</blockquote><h2>Как исправили</h2><p>В ответ разработчики отправили <a href="https://lore.kernel.org/lkml/e10b2679e4d0882e6d690c55c3efaa74@kernel.org/">новый pull request</a>, который перекладывает все sched_ext-файлы в отдельную директорию kernel/sched/ext/. Торвальдс уже <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7603d8e78023e5883e075b4625fbdf059c6384f7">принял</a> реструктуризацию.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-06-26/89512d36-a006-490f-b024-cd83152e9bd5.webp" alt="Список файлов sched_ext, перенесённых в kernel/sched/ext/" /><figcaption>Так теперь выглядит перенос файлов sched_ext в отдельную директорию.</figcaption></figure><h2>Почему это важно</h2><p>С точки зрения пользователя разница кажется косметической, но для ядра это вопрос сопровождаемости. Иерархические директории — стандартный способ группировки связанного кода, а префиксы в общей папке быстро превращаются в беспорядок. Реакция Торвальдса подчёркивает, что даже мелкие архитектурные решения в Linux принимаются строго.</p><h2>Выводы</h2><p>История с sched_ext — хороший пример того, как в Linux следят за чистотой кодовой базы. Технически патчи работали, но неправильная организация файлов оказалась достаточно серьёзной проблемой, чтобы Торвальдс потребовал исправлений. Теперь код лежит там, где ему положено — в отдельной директории.</p><h2>Источники</h2><ul><li><a href="https://www.phoronix.com/news/Linux-Sched-Ext-Restructured">Phoronix: "Disgusting" Linux sched_ext Source Code Restructured</a></li><li><a href="https://lore.kernel.org/lkml/CAHk-=wghMm2c+AYEcwYY7drSVXB27DYqc-ZXpFiq=XFs-w59wA@mail.gmail.com/">Письмо Линуса Торвальдса в lkml</a></li><li><a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7603d8e78023e5883e075b4625fbdf059c6384f7">Коммит реструктуризации в git.kernel.org</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Зарубежный хостинг для сайта: ТОП-25 иностранных хостинг-провайдеров</title>
      <link>https://tproger.ru/articles/zarubezhnyj-hosting-dlya-sajta-top-25-inostrannyh-hosting-provajd</link>
      <comments>https://tproger.ru/articles/zarubezhnyj-hosting-dlya-sajta-top-25-inostrannyh-hosting-provajd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анастасия Шишкина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zarubezhnyj-hosting-dlya-sajta-top-25-inostrannyh-hosting-provajd</guid>
      <description><![CDATA[<p>Подборка лучших зарубежных хостингов для сайта. Узнайте, какие иностранные провайдеры предлагают стабильную работу, защиту данных и выгодные условия размещения веб-проектов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zarubezhnyj-hosting-dlya-sajta-top-25-inostrannyh-hosting-provajd">Зарубежный хостинг для сайта: ТОП-25 иностранных хостинг-провайдеров</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Партнёрский материал]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Jun 2026 05:39:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда ваш сайт ориентирован на аудиторию из Европы или США, а посетители жалуются на долгую загрузку, проблема часто кроется в географии сервера. Российские дата-центры далеки от западной аудитории, отсюда задержки в десятки и сотни миллисекунд. Здесь и выручает зарубежный хостинг: серверы в Нидерландах, Германии или Франкфурте, максимально близко к вашим клиентам.</p><blockquote><i>Я собрал в одном месте 25 зарубежных хостингов. В статье — цены, плюсы и минусы каждого сервиса, критерии выбора, юридические нюансы и ответы на частые вопросы.</i></blockquote><h2>ТОП-15 зарубежных хостингов в 2026 году</h2><ol><li><a href="https://pravda1.ru/VemrLw?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Timeweb</a> — дата-центры в Казахстане для легального размещения сайтов на доменах .kz с соблюдением местных требований.</li><li><a href="https://pravda1.ru/FiVorg?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Fornex</a> — доступно семь стран, серверы работают на мощных процессорах AMD EPYC, а в каждый тариф уже встроена фильтрация DDoS-трафика.</li><li><a href="https://pravda1.ru/HmksyG?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Beget</a> — геораспределенная инфраструктура по РФ и СНГ с панелью управления собственной разработки и бесплатной миграцией под ключ.</li><li><a href="https://pravda1.ru/fCsLkp?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">AdminVPS</a> — бесплатное администрирование для всех клиентов и моментальный запуск сервера через минуту после оплаты.</li><li><a href="https://pravda1.ru/etnKOp?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">WebHOST1</a> — десять стран для размещения VDS, включая Израиль, Турцию и Гонконг, плюс кэшбэк 20% на лицензии 1С-Битрикс.</li><li><a href="https://pravda1.ru/shaRTt?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">SmartApe</a> — VPS на NVMe со скоростью чтения до 8 тыс. МБ/с и тройное резервирование данных в европейских дата-центрах Tier IV.</li><li><a href="https://eurobyte.ru/services/virtual-hosting/europe/?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Евробайт</a> — виртуальный хостинг в Амстердаме от 159 руб./мес. с бесплатным переносом и месяцем теста за 50 руб.</li><li><a href="https://pravda1.ru/ifEOua?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Макхост</a> — своя система управления, завязанная на голландский дата-центр и оплата картой «Мир» без привязки к валютному курсу.</li><li><a href="https://pravda1.ru/QxwnHa?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">HandyHost</a> — дата-центр расположен в столице Финляндии, дисковое хранилище построено на быстрых NVMe, а опробовать услугу можно бесплатно.</li><li><a href="https://pravda1.ru/JcCbig?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">XLGAMES</a> — игровые серверы на процессорах Intel Core i7/i9.</li><li><a href="https://pravda1.ru/cmZzrR?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Pterohost</a> — AMD Ryzen 9 7950X3D с разгоном до 5.9 ГГц и AI-ассистент, обученный на тикетах поддержки.</li><li><a href="https://pravda1.ru/OvuxKr?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">RU VDS</a> — 23 дата-центра по миру (включая Антарктиду!) и кэшбэк баллами до 5% за каждое пополнение.</li><li><a href="https://pravda1.ru/olFHkj?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Maze Host</a> — бюджетные тарифы от 0.66 USD с DDoS-защитой и серверами во Франции.</li><li><a href="https://pike2.ru/ggsel?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting&amp;sub3=https%3A%2F%2Fggsel.net%2Fcatalog%2Fserver-hosting" rel="nofollow">ggsel</a> — маркетплейс с десятками продавцов VPS в разных странах, где можно сравнить цены за пару кликов.</li><li><a href="https://pravda1.ru/lnpZNr?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Hostinger</a> — встроенный AI-конструктор сайтов и 30-дневная гарантия возврата без лишних вопросов.</li></ol><p><b>1. <a href="https://pravda1.ru/VemrLw?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Timeweb</a></b></p><p>Платформа работает с 2006 года и входит в число заметных игроков на российском рынке. Главная фишка — физическое присутствие серверов в Казахстане. В линейке услуг есть привычный shared-хостинг, виртуальные серверы с гарантией ресурсов, а также полноценные физические стойки под крупные проекты.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/8606b5a2-46dc-4d86-8387-60bb615d6f13.webp" alt="" /></figure><ul><li>Стоимость: от 180 руб./мес. (тариф Year при оплате на год)</li><li>География покрытия: Россия (Санкт-Петербург) и Казахстан (Алма-Ата)</li></ul><p><b>Преимущества</b></p><ul><li>Дата-центр класса Tier III.</li><li>Переезжать от другого провайдера не больно: помогут бесплатно.</li><li>Доступность ресурса — 99.98% плюс ежедневное создание резервных копий данных.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Не поддерживаются Ruby on Rails и Node.js на обычном хостинге (требуется VDS).</li></ul><p><b>2. <a href="https://pravda1.ru/FiVorg?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Fornex</a></b></p><p>Первый сервер подняли 16 лет назад, и с тех пор клиентская база разрослась по всем часовым поясам — от Нью-Йорка до Токио. Оборудование размещено в европейских и американских дата-центрах. В линейке услуг — классический веб-хостинг на скоростных NVMe, виртуальные серверы с посекундной тарификацией и полноценные выделенные машины.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/3d157aba-7f31-4465-843c-368fc3cd57c6.webp" alt="" /></figure><ul><li>Стоимость: от 390 руб./мес. (виртуальный хостинг)</li><li>География покрытия: Германия, Нидерланды, Швеция, Швейцария, Испания, США</li></ul><p><b>Преимущества</b></p><ul><li>Обещают стабильную работу 99.99% времени, плюс есть встроенная фильтрация входящих атак.</li><li>Быстрая техподдержка 24/7: отвечает за несколько минут.</li><li>VPS с гибкой настройкой и оплатой по часам, полный root-доступ.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Виртуальный хостинг дороже российских аналогов.</li></ul><p><b>3. <a href="https://pravda1.ru/HmksyG?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Beget</a></b></p><p>Входит в топ-3 по регистрации доменов в зонах .ru и .рф. Вместо готовых решений вроде cPanel — своя облачная платформа и панель управления под нее. Виртуальный хостинг можно бесплатно опробовать первый месяц, а VPS доступны от Калининграда и дальше в Европу. Для тяжелых вычислительных задач сдают выделенные серверы с графическими ускорителями.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/bdbe8290-a0ad-4890-b7b4-4b92e0c43184.webp" alt="" /></figure><ul><li>Стоимость: от 420 руб./мес. (виртуальный хостинг при помесячной оплате)</li><li>Доступные регионы: Россия, Европа, СНГ</li></ul><p><b>Преимущества</b></p><ul><li>Подтверждено соответствие международным стандартам безопасности PCI DSS и ISO.</li><li>Связаться с техподдержкой можно в любой момент — через панель, Telegram, звонок или почту.</li><li>Переезд ваших проектов от другого хостера проведут без дополнительной оплаты.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Стоимость виртуального хостинга выше среднерыночной.</li></ul><p><b>4. <a href="https://pravda1.ru/fCsLkp?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">AdminVPS</a></b></p><p>Это провайдер, который делает ставку на гибкость и географическое разнообразие. Взять виртуальную машину можно в Европе или в любом уголке СНГ. Компания предлагает две линейки VPS: на процессорах с частотой до 3,6 ГГц и на мощных чипах до 5,0 ГГц.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/1124c30a-5a3f-4dbb-892d-4145b26f481c.webp" alt="" /></figure><ul><li>Стоимость: от 299 руб./мес. (VPS Lite на процессорах 3,6 ГГц)</li><li>География покрытия: Россия, Беларусь, Казахстан, Нидерланды, Германия, Финляндия, Польша</li></ul><p><b>Преимущества</b></p><ul><li>Широкий выбор локаций: семь стран.</li><li>Мгновенный запуск сервера через минуту после оплаты.</li><li>Бесплатное администрирование по системе «все включено».</li></ul><p><b>Что стоит учесть</b></p><ul><li>Трафик на начальных тарифах ограничен 1–5 ТБ в месяц (не безлимитный).</li></ul><p><b>5. <a href="https://pravda1.ru/etnKOp?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">WebHOST1</a></b></p><p>Сервис работает с 2008 года и за это время разместил более 150 тысяч проектов. География присутствия охватывает сразу десять стран. В портфеле не только классический веб-хостинг и VPS, но и аренда целых серверов, защищенные SSL-сертификаты, а также официальные лицензии на программное обеспечение.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/6b9cd58e-84c7-4cc2-b72b-42472307787b.webp" alt="" /></figure><ul><li>Стоимость: от 225 руб./мес.</li><li>Доступные регионы: Россия, Нидерланды, США, Израиль, Гонконг, Молдова, Франция, Турция, Армения, Германия</li></ul><p><b>Преимущества</b></p><ul><li>Бесплатный перенос сайтов и 30 дней хостинга в подарок для тестирования.</li><li>Защита от DDoS-атак включена в базовые тарифы.</li><li>Партнерская программа с выплатой до 40% от платежей приведенных клиентов.</li></ul><p><b>Что стоит учесть</b></p><ul><li>В пиковые часы возможны задержки в работе сайтов и нестабильность.</li></ul><p><b>6. <a href="https://pravda1.ru/shaRTt?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">SmartApe</a></b></p><p>Платформа предоставляет VPS на европейских серверах. Серверное железо стоит в дата-центрах класса Tier IV. Это высшая категория отказоустойчивости, таких объектов в мире единицы. В отличие от виртуального хостинга того же провайдера, где серверы есть и в России, линейка VPS четко ориентирована на Европу.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/6f53262d-e201-4094-b1d3-1227ae249543.webp" alt="" /></figure><ul><li>Стоимость: от 330 руб./мес.</li><li>География покрытия: дата-центры Tier III и Tier IV в Европе</li></ul><p><b>Преимущества</b></p><ul><li>Производительность NVMe-накопителей по паспорту доходит до 8 тыс. Мб/сек.</li><li>Выбор более 20 ОС, включая Windows Server и Astra Linux CE.</li><li>Договор-оферта и возможность заключения двустороннего договора.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Канал ограничен 200 Мбит/с (у зарубежных конкурентов часто 1 Гбит/с).</li></ul><p><b>7. <a href="https://eurobyte.ru/services/virtual-hosting/europe/?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Евробайт</a></b></p><p>Эта компания предлагает обычный виртуальный хостинг в Амстердаме. Никаких прав root и возни с командной строкой — привычная панель ISPmanager, где сайт разворачивается за пару кликов. Серверы собственные, стоят в голландском дата-центре, а не сняты в аренду.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/d808789f-4191-4749-a7ed-39d3f25d44e4.webp" alt="" /></figure><ul><li>Стоимость: от 159 руб./мес. (тариф 3 ГБ SSD)</li><li>Доступные регионы: Амстердам, Нидерланды (дата-центр Tier III)</li></ul><p><b>Преимущества</b></p><ul><li>Управление сайтами — через знакомую многим панель ISPmanager.</li><li>Даже на самом дешевом тарифе нет ограничений ни на число проектов, ни на количество баз данных.</li><li>Новый клиент получает бесплатный переезд от старого хостера и сертификат шифрования Let‘s Encrypt без доплат.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Дисковое пространство скромное — максимум 15 ГБ на старших тарифах.</li></ul><p><b>8. <a href="https://pravda1.ru/ifEOua?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Макхост</a></b></p><p>Компания работает с 2000-х годов и обслуживает более 60 000 клиентов. Серверы находятся в Нидерландах — стране с либеральным законодательством в отношении контента. Провайдер использует панель управления собственной разработки, а не привычный ISPmanager.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/82b4bff2-93b5-43d7-8d7d-84ad220e799e.webp" alt="" /></figure><ul><li>Стоимость: от 232 руб./мес. (тариф 3 ГБ SSD при оплате за год)</li><li>География покрытия: Нидерланды</li></ul><p><b>Преимущества</b></p><ul><li>При смене провайдера ваши сайты перевезут без оплаты.</li><li>Оплата рублями через систему «Мир» без привязки к курсу валют.</li><li>Возможность собрать тариф через конструктор (1 ГБ SSD, гибкая настройка).</li></ul><p><b>Что стоит учесть</b></p><ul><li>Собственная панель управления — потребуется время на привыкание, если раньше работали только с ISPmanager или cPanel.</li></ul><p><b>9. <a href="https://pravda1.ru/QxwnHa?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">HandyHost</a></b></p><p>Хостинг с зарубежными серверами в Финляндии работает на NVMe-дисках — современный стандарт, который заметно быстрее обычных SSD. При этом панель управления остается привычной ISPmanager 6, а поддержка — русскоязычной.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/3abffd43-23d8-41d3-b5fc-3d48469afb2a.webp" alt="" /></figure><ul><li>Стоимость: от 129 руб./мес. (тариф vHOST-0 при оплате за 2 года)</li><li>География покрытия: Москва, Санкт-Петербург, Хельсинки (Финляндия)</li></ul><p><b>Преимущества</b></p><ul><li>Тестовый период 30 дней — без активационных платежей и скрытых условий.</li><li>NVMe-диски вместо обычных SSD — выше скорость чтения и записи.</li><li>При оплате на год дают домен .ru в подарок.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Оперативная память на аккаунт небольшая — от 600 МБ до 2,7 ГБ на максимальном тарифе.</li></ul><p><b>10. <a href="https://pravda1.ru/JcCbig?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">XLGAMES</a></b></p><p>Специализированная платформа для игровых проектов на рынке с 2015 года. Серверные мощности распределены между Европой и США — для онлайн-баталий критично, чтобы хост был рядом с участниками, иначе задержки испортят впечатление. В панели управления можно развернуть новый игровой мир одной кнопкой, без ручной возни с файлами и настройками.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/db8dcc26-482a-4731-8be6-d3e35c3767fc.webp" alt="" /></figure><ul><li>Стоимость: уточняется при выборе тарифа</li><li>Доступные регионы: Европа, США</li></ul><p><b>Преимущества</b></p><ul><li>Процессоры Intel Core i7 и i9, SSD-диски, канал 1 Гбит/с.</li><li>Возврат средств за 5 дней, если услуга не устроила.</li><li>Техподдержка работает 24/7.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Веб-хостинг для сайтов еще не запущен.</li></ul><p><b>11. <a href="https://pravda1.ru/cmZzrR?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Pterohost</a></b></p><p>Это игровой хостинг, который делает ставку на топовое железо и собственную панель управления YourControl. Серверы работают на AMD Ryzen 9 7950X3D с разгоном до 5.9 ГГц, оперативной памятью DDR5 ECC и NVMe Gen4. Это одни из самых мощных конфигураций на рынке игрового хостинга. Провайдер поддерживает более 15 игр, включая Minecraft, Rust, CS2, Garry‘s Mod и Project Zomboid.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/36c14c8d-e40e-457e-a4fd-9e3ff1e62c80.webp" alt="" /></figure><ul><li>Стоимость: уточняется при выборе игры и тарифа</li><li>География покрытия: Европа</li></ul><p><b>Преимущества</b></p><ul><li>Для клиентов доступен AI-ассистент, обученный на тикетах поддержки.</li><li>Автоматические бэкапы на удаленном S3-хранилище, изолированном от основного сервера.</li><li>Собственная панель YourControl с терминалом и файловым менеджером.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Специализация только на играх — для обычных сайтов не подходит.</li></ul><p><b>12. <a href="https://pravda1.ru/OvuxKr?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">RU VDS</a></b></p><p>Это полноценный конструктор виртуальных серверов с десятками параметров на выбор. Провайдер предлагает VPS в 23 локациях по всему миру. Здесь можно собрать сервер под себя: выбрать процессор (обычный, мощный или AMD EPYC), тип диска (HDD, SSD, NVMe), объем RAM и даже видеопамять.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/5b0256e1-ac7a-429a-b9bc-2407c8756123.webp" alt="" /></figure><ul><li>Стоимость: от 139 руб./мес. (VPS на SSD)</li><li>Доступные регионы: Армения, Беларусь, Казахстан, Лондон, Турция, Амстердам, Цюрих, Франкфурт</li></ul><p><b>Преимущества</b></p><ul><li>Гибкий конфигуратор: меняйте параметры сервера онлайн без потери данных.</li><li>Панель ISPmanager бесплатно до конца 2026 года.</li><li>23 дата-центра по всему миру.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Тестовый период всего 3 дня (меньше, чем у многих конкурентов).</li></ul><p><b>13. <a href="https://pravda1.ru/olFHkj?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Maze Host</a></b></p><p>Одна площадка закрывает две задачи: сюда идут и за обычным хостингом для сайта, и за арендой игрового сервера. Ключевая особенность для зарубежного размещения — наличие серверов во Франции. Это европейская локация с хорошей связностью внутри ЕС и низким пингом для западноевропейской аудитории.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/bd567535-838e-43f6-898e-0a1f522f5c9b.webp" alt="" /></figure><ul><li>Стоимость: от 0.66 USD/мес. (тариф Lite)</li><li>География покрытия: Россия и Франция</li></ul><p><b>Преимущества</b></p><ul><li>Цены в USD — удобно для международных расчетов и зарубежных клиентов.</li><li>DDoS-защита включена во все тарифы без доплат</li><li>Самый дешевый тариф — всего 0.66 USD в месяц.</li></ul><p><b>Что стоит учесть</b></p><ul><li>При оплате из России возможны дополнительные комиссии.</li></ul><p><b>14. <a href="https://pike2.ru/ggsel?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting&amp;sub3=https%3A%2F%2Fggsel.net%2Fcatalog%2Fserver-hosting" rel="nofollow">ggsel</a></b></p><p>Это цифровой маркетплейс, где десятки продавцов предлагают свои услуги. Здесь можно найти VPS в Великобритании, Франции, США, а также специализированный хостинг для OpenAI, n8n и игр. Плюс подхода — возможность сравнить цены и условия от разных арендодателей в одном месте.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/62a0af93-a39a-4755-8693-1ffb59bfd241.webp" alt="" /></figure><ul><li>Стоимость: от 650 руб./мес.</li><li>Доступные регионы: зависит от продавца</li></ul><p><b>Преимущества</b></p><ul><li>Можно найти VPS в разных странах (Великобритания, Франция, США) без регистрации на десятке сайтов.</li><li>Цены иногда ниже, чем у крупных провайдеров.</li><li>Есть редкие ниши: хостинг для OpenAI, n8n, игровых серверов Minecraft.</li></ul><p><b>Что стоит учесть</b></p><ul><li>За качество сервера и поддержку отвечает конкретный продавец, а не платформа.</li></ul><p><b>15. <a href="https://pravda1.ru/lnpZNr?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Hostinger</a></b></p><p>Один из крупнейших международных хостинг-провайдеров, работающий с 2004 года. Компания предлагает широкий спектр услуг: от простого виртуального хостинга до мощных VPS и облачных решений.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/c4e323a9-34ef-42a9-8b09-f242660f388c.webp" alt="" /></figure><ul><li>Стоимость: от 1.99 $</li><li>География покрытия: Европа, Азия, Северная и Южная Америка</li></ul><p><b>Преимущества</b></p><ul><li>Дата-центры разбросаны по Америке, Азии и Европе — сервер можно запустить в любом из этих регионов.</li><li>Платформа использует SSD-накопители и продвинутые технологии кэширования для высокой скорости загрузки.</li><li>Встроенный AI-конструктор сайтов.</li></ul><p><b>Что стоит учесть</b></p><ul><li>Панель управления собственная, а не привычная cPanel или ISPmanager — потребуется привыкание.</li></ul><h2>Еще 10 хостингов с зарубежными серверами</h2><ul><li><a href="https://pravda1.ru/vuwEFn?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Asura Hosting</a> — выбор между cPanel и DirectAdmin, плюс аккаунт прокачивается через три уровня с пожизненными скидками.</li><li><a href="https://pravda1.ru/dfaJoR?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Hawk Host</a> — шесть дата-центров на трех континентах (Америка, Европа, Азия) с возможностью протестировать пинг до каждого перед покупкой.</li><li><a href="https://pravda1.ru/txzrLJ?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">IONOS</a> — 30 лет на рынке и ISO-сертифицированные дата-центры с геоизбыточностью.</li><li><a href="https://pravda1.ru/kHfjQu?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">FirstVDS</a> — процессоры с водяным охлаждением и частотой до 5.7 ГГц.</li><li><a href="https://pravda1.ru/vnUiuH?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">AccuWeb Hosting</a> — специализированные Windows VPS для Forex-трейдинга с нулевой задержкой и полным RDP-доступом.</li><li><a href="https://pravda1.ru/RdQwky?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">SpaceWeb</a> — 25 лет на рынке, три дата-центра (включая Амстердам) и бесплатный перенос сайтов еще до оплаты.</li><li><a href="https://pravda1.ru/mlCgeQ?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">CastleHOST</a> — покупаете игровой PRO-сервер — получаете бесплатный веб-хостинг в подарок плюс заработок на модах.</li><li><a href="https://pravda1.ru/XNqk3R?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">CloudVPS</a> — активация сервера за 5 минут, семь премиальных локаций и минималистичный подход без перегруза.</li><li><a href="https://pravda1.ru/pfEgkP?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">VDSina</a> — собираете сервер как конструктор и получаете до 50% партнерских отчислений.</li><li><a href="https://pravda1.ru/lWiTfp?sub1=tproger-kfl&amp;sub2=zarubezhnyj-hosting" rel="nofollow">Fozzy</a> — стоимость видна сразу на 10 лет вперед, плюс круглосуточная поддержка из разных часовых поясов.</li></ul><h2>Когда сайту нужен «паспорт» из другой страны</h2><p>Большинство владельцев проектов привыкли к российским серверам. Но есть ситуации, когда лучший иностранный хостинг становится не прихотью, а необходимостью.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/5b51bf94-c71b-45af-bc8d-9b674c141c7c.webp" alt="" /></figure><h3>Законы</h3><p>Если ваш бизнес работает с европейскими клиентами и попадает под действие GDPR, данные физических лиц обязаны храниться на серверах внутри ЕС. Российский хостер здесь не подойдет — только европейская юрисдикция. Аналогичная история с сайтами на доменах .kz: власти Казахстана требуют физического размещения серверов на своей территории. Timeweb, кстати, предоставляет такую возможность.</p><h3>Аудитория за границей</h3><p>География сервера напрямую влияет на скорость загрузки. Если ваши посетители сидят в Берлине или Лионе, а хостинг стоит во Владивостоке — задержки в 150–200 мс неизбежны. Для интернет-магазина или онлайн-сервиса каждая миллисекунда простоя бьет по конверсии. Вплоть до того, что Google понижает в выдаче медленные ресурсы. Выгоднее оплачивать VPS в Нидерландах или Франкфурте — и получить пинг 20–30 мс.</p><h3>Свобода контента и изоляция</h3><p>Нидерланды, например, известны либеральным законодательством в отношении интернет-контента. Аренда сервера в этой юрисдикции обеспечивает стабильную работу для проектов, чья тематика требует повышенной юридической определенности. Это особенно актуально для криптовалютных сервисов или международных платформ, где важна прозрачность регулирования.</p><h2>Как выбрать лучший зарубежный хостинг</h2><p>Выбрать провайдера за пределами РФ проще, если разбить задачу на отдельные критерии. Весь процесс сводится к пошаговой проверке.</p><ul><li>География. Смотрите, есть ли дата-центр в стране вашей целевой аудитории. Чем ближе сервер к пользователям, тем ниже пинг и быстрее загрузка сайта.</li><li>Производительность. NVMe-диски вместо обычных SSD, процессоры не старше Intel Xeon Gold или AMD EPYC, выделенный канал от 100 Мбит/с — три главных маркера.</li><li>Надежность. Ищите открытый SLA с гарантией аптайма 99,9% и выше, а также информацию о резервном копировании (ежедневные бэкапы — хороший тон).</li><li>Безопасность. Бесплатный SSL-сертификат, защита от DDoS и изоляция аккаунтов через CloudLinux — минимальный набор для спокойствия.</li><li>Удобство управления. Панель должна быть понятной без курсов администрирования. ISPmanager или cPanel подойдут новичкам, собственная разработка провайдера — тоже вариант, если она интуитивная.</li><li>Поддержка и сервис. Круглосуточный чат на русском или английском языке с живым ответом за 5–10 минут. Проверьте перед оплатой — напишите тестовый вопрос.</li><li>Оплата. Узнайте, принимают ли карты российских банков, есть ли PayPal или криптовалюта. И обратите внимание: выгодные цены часто указаны при оплате на год вперед, а помесячный тариф может быть в 1,5-2 раза дороже.</li></ul><h2>Для каких задач подходит зарубежный хостинг</h2><p>Идеального пакета, который подойдет под все задачи, нет. Зарубежные провайдеры хороши ровно для тех проектов, где география сервера, гибкость настроек или юрисдикция играют решающую роль. Давайте разберем конкретные сценарии.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2026-06-16/75bcf50f-dda4-4b99-badd-e3da0111a3e5.webp" alt="" /></figure><h3>WordPress сайты и блоги</h3><p>CMS, на которой работает треть интернета, нетребовательна к ресурсам, но чувствительна к скорости базы данных и версии PHP. Многие зарубежные хостинги предлагают специализированные WordPress-тарифы с автоматическими обновлениями ядра, кешированием на уровне сервера и инструментами миграции в один клик. Плюс доступ к глобальной библиотеке плагинов и тем, которые иногда лучше тестируются именно на западной инфраструктуре.</p><h3>Интернет-магазины</h3><p>Здесь в игру вступают два фактора: безопасность платежей и скорость в пиковые нагрузки. Зарубежный сервер упрощает интеграцию с международными эквайрингами вроде Stripe или Adyen, которые ожидают определенные настройки окружения. К тому же перед Черной пятницей или рождественским сезоном европейские и американские провайдеры лучше справляются с трафиком — их инфраструктура заточена под такие всплески.</p><h3>Лендинги и маркетинговые страницы</h3><p>Задача одностраничного сайта — быстро загрузиться и не отвлекать пользователя. География сервера здесь критична меньше, чем настройки кеширования и сжатия. Но если рекламная кампания идет на зарубежную аудиторию, хостинг с CDN и сервером в регионе показа объявлений даст фору любому локальному провайдеру. Важна также совместимость с западными аналитическими системами и пикселями соцсетей.</p><h3>SaaS и веб-приложения</h3><p>Серьезные проекты, которым нужны стабильная работа CPU, большие объемы оперативной памяти и контроль над окружением. Зарубежные VPS и облачные решения предлагают понятные API для автоматизации развертывания, возможность масштабирования в пару кликов и дата-центры в разных часовых поясах. Если ваше приложение используют клиенты из Нью-Йорка и Сан-Франциско, сервер на восточном и западном побережье США станет правильной архитектурой.</p><h3>Технические проекты, включая VPN-инфраструктуру</h3><p>Разработчикам и системным администраторам часто нужны серверы с чистыми IP-адресами, поддержкой специфических протоколов и минимальными ограничениями на исходящие соединения. Зарубежные хостинги не глушат порты в нестандартных диапазонах — можно поднять сервер с любым софтом, который требует специфических сетевых настроек.</p><h3>Тестовые и учебные серверы</h3><p>Для экспериментов, обучения или временных проектов жалко платить много. И здесь европейские провайдеры с их минимальными тарифами по 1–3 евро в месяц оказываются вне конкуренции. Вы получаете полноценную среду с root-доступом или готовой панелью, которую после завершения работы просто удаляете без потери значительной суммы.</p><h3>Международные проекты с аудиторией в ЕС, США или Азии</h3><p>Это главная и самая очевидная задача для зарубежного хостинга. Когда ваши пользователи живут в трех разных часовых поясах, размещать сервер в одном из регионов и разгонять трафик через глобальное CDN — стандартная практика. Плюс соблюдение местных законов о хранении персональных данных, например, GDPR для Европы или CCPA для Калифорнии. Без серверов в этих юрисдикциях работа с аудиторией становится юридически рискованной.</p><h2>FAQ</h2><h3>Чем сервер за границей отличается от локального?</h3><p>Главное различие — юрисдикция и география. Отечественный провайдер физически находится в вашей стране, подчиняется ее законам и обычно быстрее работает для местной аудитории. Размещение на европейских или американских мощностях дает возможность выбрать сервер в ЕС, США или Азии, соблюдать требования GDPR и других международных норм, но иногда требует оплаты в валюте.</p><h3>Какую иностранную площадку лучше выбрать для сайта?</h3><p>Универсального ответа нет. Для блога или визитки хватит виртуального хостинга с сервером в Европе. Для интернет-магазина или высоконагруженного проекта смотрите в сторону VPS — там больше ресурсов и гибкие настройки. Главное — выбирайте локацию, близкую к вашей аудитории, и провайдера с прозрачными условиями возврата.</p><h3>Подходит ли иностранный сервер для WordPress?</h3><p>Да, и очень хорошо. Большинство зарубежных провайдеров предлагают специализированные WordPress-тарифы с предустановкой, автоматическими обновлениями и кэшированием на уровне сервера. CMS одинаково стабильно работает на мощностях в США, Нидерландах или Германии — география не влияет на совместимость.</p><h3>Влияет ли расположение сервера на скорость сайта?</h3><p>Напрямую. Чем дальше вычислительные мощности от посетителя, тем выше задержка (пинг). Разница в 100–200 миллисекунд может быть критичной для интернет-магазина или онлайн-сервиса, но почти незаметна для блога. Оптимальный вариант — выбрать дата-центр в той же стране или регионе, где живет большинство ваших пользователей.</p><h3>Какие риски есть при использовании зарубежных провайдеров?</h3><p>Три основных момента: языковой барьер в поддержке (не везде есть русскоязычные операторы), возможные сложности с возвратом средств по законам другой страны (всегда проверяйте условия moneyback заранее) и риск блокировки сайта на территории РФ, если контент попадает под локальные ограничения. Оплата в валюте может быть неудобной.</p><h3>Можно ли перенести сайт с одного иностранного хостинга на другой?</h3><p>Да, и практически все провайдеры из этой подборки делают это бесплатно. Процесс стандартный: вы оставляете заявку новому хостеру, предоставляете доступ к старой панели или FTP — и специалисты переносят файлы, базы данных и настройки. Переезд занимает от нескольких часов до пары дней.</p><p>Правильно подобранный зарубежный хостинг решает три главные задачи: низкий пинг для европейской или американской аудитории, соблюдение местных законов о данных и предсказуемую работу без внезапных отключений. Начинать лучше с виртуального хостинга на тестовом периоде — так вы поймете, подходит ли вам провайдер, не рискуя бюджетом. Обращайте внимание на локацию дата-центра, условия возврата и наличие русскоязычной поддержки в чате.</p>]]></content:encoded>
    </item>
    <item>
      <title>Netflix построила Service Topology: живая карта микросервисов</title>
      <link>https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top</link>
      <comments>https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top</guid>
      <description><![CDATA[<p>Как Netflix объединяет eBPF, IPC-метрики и tracing в единую карту зависимостей. Разбираем, почему статические схемы устарели и что перенести в свою систему.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top">Netflix построила Service Topology: живая карта микросервисов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Jun 2026 07:47:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы хоть раз отлаживали микросервис ночью, знаете главный вопрос: это мой сервис сломался или его уронило что-то выше по течению? В системе из тысяч сервисов ответ приходится искать по кускам — метрики, логи и трейсы показывают симптомы, но не дают единой карту зависимостей. Netflix столкнулась с этой же болью и построила инструмент под названием Service Topology, который рисует живую карту зависимостей в реальном времени.</p><p>Service Topology — это не статическая схема из вики, а динамическая карта связей между сервисами. Она обновляется по мере того, как меняется трафик, появляются новые зависимости или старые исчезают. Карта показывает не только «кто с кем говорит», но и контекст: уровень доступности, бизнес-домен, владельца и текущее состояние здоровья.</p><p>Если тема микросервисов для вас новая, начните с базового разбора <a href="https://tproger.ru/articles/chto-takoe-mikroservisy--arhitektura--plyusy-i-minusy--primery">«Что такое микросервисы»</a>, а если выбираете архитектуру для проекта — сравните варианты в материале <a href="https://tproger.ru/articles/monolit-ili-mikroservisy--kak-vybrat-arhitekturu-dlya-novogo-proekta">«Монолит или микросервисы»</a>. Авторский разбор внутреннего устройства Netflix читайте в статье <a href="https://tproger.ru/articles/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri">«Разработчик изучал систему рекомендаций Netflix месяцами»</a>.</p><ul><li>Netflix объединила три источника данных: eBPF-сетевые потоки, IPC-метрики и распределённые трейсы.</li><li>Каждый источник строит свой граф; общий вид получается параллельным слиянием слоёв.</li><li>Карта обновляется почти в реальном времени и отвечает на запросы быстрее секунды.</li><li>Инженеры используют её для поиска причин сбоев, оценки зоны поражения и планирования изменений.</li><li>Подход можно перенести в любую распределённую систему, где нужно понимать зависимости.</li></ul><h2>Почему обычной наблюдаемости мало</h2><p>Традиционные инструменты наблюдаемости показывают фрагменты картины. Метрики говорят, что что-то болит. Логи рассказывают, что конкретно произошло в одном сервисе. Трейсы прослеживают путь отдельного запроса. Но ни один из этих сигналов не показывает полную топологию зависимостей — ту самую основу, на которой держится распределённая архитектуры.</p><p>Инженеру в три часа ночи приходится мысленно склеивать данные из разных источников. Это медленно, чревато ошибками и добавляет стресса. Netflix проанализировала тысячи обращений в поддержку за четыре года и увидела повторяющиеся вопросы: кто мои upstream и downstream, что упадёт вместе со мной, почему сервис отображается в панели мониторинга как Unknown (неизвестный сервис). Ответы на них требовали единого представления о зависимостях.</p><h2>Три источника данных Service Topology</h2><p>Главный вывод Netflix: ни один источник не рассказывает всю историю. Поэтому система строит три независимых графа и объединяет их по запросу.</p><h3>Сетевые потоки eBPF</h3><p>На сетевом уровне Netflix собирает потоки ядра через eBPF. Это даёт полноту: сюда попадают все соединения, независимо от того, инструментирован сервис или нет. Слой показывает связи между кластерами и приложениями такими, какими они есть на самом деле. Недостаток — не хватает прикладного контекста: видно, что сервис А достучался до IP-адреса сервиса Б, но неизвестно, какой конкретно endpoint вызывался.</p><h3>IPC-метрики</h3><p>На прикладном уровне собираются метрики межпроцессного взаимодействия. Когда сервис обращается к другому через gRPC, GraphQL или REST, он фиксирует endpoint, ошибки, задержки и протокол. Этот слой даёт детали, которых нет у сетевого: какой именно путь вызывается и с какой вероятностью ошибки. Ограничение очевидно: если сервис не отправляет метрики, его вызовов здесь не будет.</p><h3>Распределённые трейсы</h3><p>Третий слой — трейсинг запросов от начала до конца. Он показывает не «может ли сервис А позвонить сервису Б», а «звонил ли он в рамках этого конкретного пользовательского запроса». Это помогает увидеть поведение во время выполнения, ветвления, фича-флаги и редкие пути. Поскольку трейсы собирают выборочно, редкие сценарии могут не попасть в агрегированный вид.</p><p>Когда инженер запрашивает общую картину, система обходит все три графа параллельно и сливает результаты. Сеть обеспечивает полноту, IPC добавляет контекст, трейсы показывают реальное поведение. Каждый источник компенсирует слабости остальных.</p><h2>Как собирают Service Topology</h2><h3>Приём и обработка потоков</h3><p>За кулисами работает конвейер, который держит миллионы событий в секунду. Потоки сетевых логов читаются из Kafka в нескольких регионах AWS. Для обработки Netflix использует Apache Pekko Streams — форк Akka, который разбивает нагрузку по группам автомасштабирования и сам управляет обратным давлением.</p><h3>Восстановление прямых связей</h3><p>Сетевой лог показывает отдельные сетевые прыжки: например, приложение → балансировщик → приложение или приложение → NAT-шлюз → приложение. Чтобы получить настоящие связи, запускается трёхступенчатая агрегация. Первая стадия забирает сырые записи, вторая распознаёт посредников и восстанавливает прямые пути между приложениями, третья финализирует агрегаты и добавляет статус здоровья. Такой градуированный подход раскидывает нагрузку и не даёт горячим узлам уронить весь конвейер.</p><p>Готовая топология хранится в графовой базе Netflix — абстракции поверх распределённого хранилища «ключ — значение». Она заточена под быстрый обход графа в несколько хопов. Поверх базы — gRPC-API с фильтрами по уровню доступности и домену, постраничным выводом больших выборок и ответом менее чем за секунду.</p><h3>Хранение и API</h3><p>Отдельно стоит возможность «путешествия во времени». Система не хранит каждый момент отдельно, а накапливает данные в скользящих окнах. Это позволяет спросить «как выглядела топология вчера в полночь» без взрыва объёмов хранения.</p><h2>Что даёт инженерам</h2><p>Интерфейс и API дают инженерам несколько рабочих сценариев — от ручного расследования до автоматических проверок.</p><ul><li>Видеть upstream и downstream для любого сервиса с фильтрами по уровню доступности и домену.</li><li>Переключаться между единым видом и отдельными слоями: только сеть, только IPC или только трейсы.</li><li>Одним кликом переходить от узла топологии к логам, трейсам и детальным метрикам.</li><li>Оценивать зону поражения перед отключением сервиса на обслуживание и понимать, кого уведомлять.</li><li>Накладывать статус здоровья на граф и быстро понимать, локальная ли это проблема или каскадный сбой.</li><li>Обращаться к топологии программно — например, чтобы автоматически проверять классификацию доступности критичных сервисов.</li><li>Смотреть историю зависимостей и находить, что изменилось перед инцидентом.</li></ul><h2>Как перенести в свою систему</h2><p>Не каждая компания работает в масштабе Netflix, но логика подхода универсальна. Если у вас десятки сервисов, уже появляется эффект «тысячи кусочков пазла». Начать можно с малого: собрать список зависимостей из существующих источников и периодически сверять его с реальным трафиком.</p><p><b>Чек-лист для первых шагов:</b><br />1. Выберите один настоящий источник связей: логи балансировщика, агент на хосте или метрики вызовов.<br />2. Не пытайтесь сразу построить идеальную модель — начните с автоматически обнаруженных рёбер.<br />3. Добавьте контекст: владельца сервиса, уровень критичности и домен.<br />4. Сделайте карту доступной программно, а не только в интерфейсе — инцидент-боты и скрипты будут благодарны.<br />5. Проверяйте актуальность: в динамичной среде карты, устаревшие на несколько часов, быстро теряют ценность.</p><p>Для иллюстрации вот минимальный скрипт, который строит рёбра графа из логов балансировщика:</p><h2>Часто задаваемые вопросы</h2><h2>Выводы</h2><p>Service Topology — не просто красивая картинка для панели мониторинга. Это операционная основа, которая ускоряет расследования, снижает риск изменений и даёт автоматическим системам общую картину инфраструктуры. Netflix называет её knowledge graph foundation — фундаментом для интеллектуальной автоматизации, в том числе для автоматического поиска первопричины сбоев.</p><blockquote>Service topology provides the knowledge graph foundation that makes this kind of intelligent automation possible.</blockquote><p>Для российских команд, где инфраструктура тоже стремительно усложняется, главный урок в другом: не ждите идеальной полноты данных. Начните с одного реального источника, добавьте контекст, сделайте карту программно доступной — и она начнёт приносить пользу раньше, чем вы построите «полноценную» систему.</p><h2>Источники</h2><ul><li><a href="https://medium.com/netflix-techblog/from-silos-to-service-topology-why-netflix-built-a-real-time-service-map-0165ba13a7bc">From Silos to Service Topology: Why Netflix Built a Real-Time Service Map</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Что такое Git worktrees и зачем их использовать</title>
      <link>https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat</link>
      <comments>https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat</guid>
      <description><![CDATA[<p>Git worktrees появились ещё в 2015 году, но популярность обрели только недавно. Разбираем, что это такое, как использовать в терминале и зачем они пригодятся.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat">Что такое Git worktrees и зачем их использовать</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 18 Jun 2026 03:00:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи Cassidy Williams из GitHub Blog, оригинал: <a href="https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/">https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/</a></p><p>Git worktrees позволяют держать несколько рабочих копий одного репозитория на разных ветках — и сейчас эта возможность в тренде. Забавно, что в Git она появилась ещё в 2015 году. Но worktrees действительно удобны, и в этой статье разберёмся, зачем они нужны, чем отличаются от обычных веток и почему внезапно стали популярны.</p><p>worktree — это дополнительная рабочая копия репозитория на другой ветке, привязанная к тому же .git.</p><p>С их помощью можно переключаться между задачами, не прерывая текущую работу и не используя stash.</p><p>Они особенно полезны при параллельной работе с ИИ-агентами и в приложении GitHub Copilot.</p><p>У worktrees есть ограничения: раздувание зависимостей, необходимость убирать папки, правила .gitignore и запрет на одновременный checkout одной ветки в нескольких worktrees.</p><h2>Переключение контекста через ветки и stash</h2><p>Представьте: вы работаете над задачей и вдруг получаете срочный баг. Нужно срочно переключить контекст.</p><p>Сначала, скорее всего, спрячете текущие изменения в stash:</p><p>Потом перейдёте на main и обновите её:</p><p>Затем создадите ветку с хотфиксом:</p><p>Пофиксите, закоммитите и запушите ветку:</p><p>После слияния pull request вы вернётесь к компьютеру, подтянете main и удалите ветку с багфиксом:</p><p>А потом сможете вернуться к задаче, над которой работали:</p><p>Фух. На чём мы остановились?</p><p>Переключение туда-сюда, перезагрузка файлов, переустановка node_modules в зависимости от того, что изменилось, — всё это отнимает много сил. Нагрузка от смены контекста серьёзная.</p><p>Это базовый пример, но иногда разработчики справлялись с таким хаосом сложными командами git stash или даже несколькими клонами одного репозитория (я сама грешила этим).</p><p>А потом появились… worktrees!</p><h2>Переключение контекста через worktrees</h2><p>С worktrees вы никогда не покидаете свою ветку и не используете stash, а редактор с вашей текущей фичей остаётся нетронутым.</p><p>Эта команда мгновенно создаёт соседнюю папку hotfix-workspace, базирует её на main и создаёт новую ветку hotfix-bug.</p><p>Теперь можно открыть эту папку в новом окне редактора (или перейти в неё через cd) и чинить баг. Исходное окно редактора остаётся в том же состоянии, в котором вы его оставили.</p><p>Pull request сливаете онлайн, как обычно, а после слияния можно просто удалить временную папку.</p><p>Гораздо плавнее! Нет риска конфликтов stash, редактор не перезагружается, и вы действительно можете работать параллельно.</p><h2>Так почему же сейчас?</h2><p>Долгое время worktrees были относительно неизвестны. Большинство разработчиков никогда о них не слышали, потому что либо Git GUI не поддерживали их (или относились как к второсортной функции), либо все привыкли к знакомой схеме: feature-ветка, работа, PR, merge и повтор.</p><p>Сейчас наша работа изменилась. ИИ заставляет нас работать параллельно больше, чем когда-либо в истории разработки ПО. Разработчики запускают множество сессий одновременно, а «культура код-ревью» растёт быстрее, чем «культура написания кода».</p><p>Агенты и люди могут делать больше параллельно с помощью worktrees. Это режим по умолчанию в приложении GitHub Copilot и во многих других современных инструментах.</p><blockquote>Агенты и люди могут делать больше параллельно с помощью worktrees.</blockquote><h2>В чём подвох?</h2><p>Worktrees решают кучу проблем, но есть нюансы, на которые стоит обращать внимание.</p><ul><li>Раздувание зависимостей: каждая папка worktree требует собственную копию зависимостей проекта. Если запускать npm install или pip install в нескольких worktrees, диск может быстро закончиться.</li><li>Управление папками: нужно удалять папки worktree, чтобы со временем не засорять родительский каталог. Приложение GitHub Copilot часто делает это за вас, но если вы работаете в терминале, придётся следить самостоятельно.</li><li>Требования к глобальному .gitignore: если создавать worktree внутри основного репозитория, их нужно вручную добавить в .gitignore, чтобы случайно не закоммитить. Можно создавать worktree за пределами основного репозитория (GitHub Copilot делает это по умолчанию), но это стоит учитывать.</li><li>Ограничение «одна ветка»: Git не позволяет одновременно checkout’ить одну и ту же ветку в двух разных worktrees, чтобы избежать повреждения данных.</li></ul><h2>Как использовать git worktrees в приложении GitHub Copilot?</h2><p>Отличный вопрос! Здорово, что там всё работает «из коробки». Когда вы открываете приложение, на главном экране есть выпадающий список, который спрашивает, где запускать новую сессию. По умолчанию выбран новый worktree.</p><p>Когда вы запускаете новую сессию, можно нажать на имя сессии вверху приложения и увидеть (забавное!) сгенерированное имя вашего worktree, а также путь, где он находится, проект, для которого он создан, и сведения о внесённых изменениях.</p><p>Проще простого!</p><h2>Стоит ли использовать worktrees?</h2><p>Я дам вам самый senior-ответ, который только можно: зависит от ситуации! Вам может быть удобнее работать по-другому. Возможно, вы не так много работаете параллельно и привыкли к ментальной модели веток и stash. Возможно, теперь вы будете использовать только worktrees. А может, захотите и то, и другое!</p><p>Мир у ваших ног, и попробовать всё это можно уже сегодня в приложении GitHub Copilot.</p><p><b>Об авторе.</b> Cassidy Williams — старший директор по адвокации разработчиков в GitHub. Она создаёт ПО, консультирует стартапы и учит разработчиков строить лучше. Подписаться на её еженедельную рассылку можно на <a href="https://cassidoo.co/newsletter">cassidoo.co/newsletter</a>.</p><h2>Выводы</h2><p>Git worktrees — способ работать с несколькими ветками одновременно, не прерывая текущую задачу и не рискуя запутаться в stash. Они особенно удобны при параллельной работе с ИИ-агентами и встроены в приложение GitHub Copilot по умолчанию. Попробуйте — возможно, именно они упростят ваш рабочий процесс.</p>]]></content:encoded>
    </item>
    <item>
      <title>EchoBird — настольный менеджер ИИ-инструментов на Rust</title>
      <link>https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust</link>
      <comments>https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust</guid>
      <description><![CDATA[<p>EchoBird — бесплатный настольный менеджер для установки ИИ-агентов, локальных LLM и управления моделями. Узнайте, кому он пригодится и как устроен изнутри.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust">EchoBird — настольный менеджер ИИ-инструментов на Rust</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Jun 2026 08:30:33 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://echobird.ai/">EchoBird</a> — open-source настольный менеджер для установки ИИ-агентов и локальных больших языковых моделей (LLM). Если вы хоть раз объясняли другу, как установить Claude Code, настраивали API-ключи для Codex CLI или искали, куда пропал config.json после очередного эксперимента с локальной моделью, вы знаете главную боль запуска ИИ-инструментов на новой машине: каждый инструмент живёт по своим правилам. EchoBird сводит эту кашу в одно кроссплатформенное приложение.</p><p>EchoBird — это open-source настольный лаунчер для ИИ-агентов и локальных больших языковых моделей (LLM). Написан на Rust + Tauri, работает на Windows, macOS и Linux. Автор, разработчик с ником edison7009, собрал его после того, как друзья не раз просили помочь «поставить этот ваш ИИ» на новой машине. Сейчас проект насчитывает 2200 звёзд на GitHub, 162 ответвления и 112 релизов; актуальная версия — v5.2.7.</p><p>Идея простая: вместо того чтобы запускать терминал для каждого инструмента, вбивать команды установки и копаться в переменных окружения, вы открываете одно окно. Там устанавливаются агенты, подключаются API-ключи, запускаются локальные модели и управляются собственные ИИ-проекты. В российских условиях локальные LLM и альтернативные поставщики часто воспринимаются не как эксперимент, а как рабочая необходимость: ограничения на доступ к западным сервисам и требования к данным делают собственное железо привлекательнее облака.</p><ul><li>EchoBird — это open-source менеджер ИИ-инструментов на Rust + Tauri для Windows, macOS и Linux.</li><li>Четыре сценария: установка и починка агентов, локальные LLM, личные ИИ-проекты и единое средство запуска приложений.</li><li>Model Nexus объединяет API-ключи, модели и протоколы OpenAI / Anthropic в одном центре конфигурации.</li><li>Локальные модели запускаются через llama.cpp, vLLM или SGLang с автоподбором под железо.</li><li>Расширяется через plugin.json: новый инструмент можно добавить без изменения кода приложения.</li></ul><h2>Четыре сценария, которые покрывает EchoBird</h2><p>Приложение не претендует на роль универсального рабочего стола, а решает конкретные задачи вокруг «поставил — настроил — запустил». Все четыре сценария используют общий Model Nexus — о нём ниже.</p><h3>Установка и починка агентов</h3><p>EchoBird сканирует систему, находит уже установленные инструменты и проверяет зависимости. Если чего-то не хватает, ведёт установку в режиме диалога. Если что-то сломалось — запускает починку. Поддерживаются Claude Code, Codex CLI, OpenCode, Aider, Hermes Agent, MiMo Code от Xiaomi и собственная линейка агентов автора — OpenClaw, ZeroClaw, NanoBot и PicoClaw. Новый инструмент добавляется через файл plugin.json, поэтому сообщество может расширять список без запросов на слияние в основной репозиторий.</p><h3>Локальные LLM в один клик</h3><p>Встроены три runtime'а под разное железо: llama.cpp для CPU и слабых машин, vLLM для серверных GPU NVIDIA на Linux и SGLang для агентских сценариев с жёстко заданным выводом — например, когда модель должна вернуть JSON строго по схеме. EchoBird сам определяет наличие видеокарты NVIDIA и предлагает runtime с подходящими параметрами — например, размер батча и offloading слоёв на GPU. После запуска модель отдаёт совместимые с OpenAI и Anthropic endpoints — остальные инструменты не замечают подмены. Про локальный запуск LLM через Ollama у нас есть <a href="https://tproger.ru/articles/zapuskaem-llm-lokalno-cherez-ollama-gajd-ot-ustanovki-do-claude">пошаговый гайд</a>.</p><h3>Мои ИИ-проекты</h3><p>Раздел для утилит, демок, игр и скриптов, созданных в режиме vibe coding (импровизационной разработки с ИИ), которые рождаются за один вечер с ИИ-помощником. Вместо того чтобы искать директорию и вспоминать команду запуска, проект живёт в едином списке с кнопкой «старт».</p><h3>Менеджер приложений</h3><p>Центральная панель запуска для всего, что уже установлено. Можно запустить Claude Code, Codex CLI или локальную модель из одного списка, не открывая отдельные терминалы и окна.</p><h2>Model Nexus: единая точка входа для моделей</h2><p>Главная архитектурная идея — Model Nexus. Это прослойка между приложением и поставщиками моделей, которая хранит API-ключи, проверяет задержки, транслирует OpenAI- и Anthropic-совместимые протоколы.</p><p>Без него каждый инструмент требует своей конфигурации: Claude Code требует свой API-ключ, Codex CLI — свой .env, Hermes Agent — свой config.toml, а локальный vLLM — свой путь к модели. Model Nexus заменяет это на «ввёл один раз, используешь везде».</p><p>Поддерживаются 14+ поставщиков: Anthropic, OpenAI, Gemini, xAI Grok, Mistral, Together AI, DeepSeek, MiniMax, GLM, SiliconFlow, а также Ollama, llama.cpp, vLLM, SGLang, OpenRouter и любой OpenAI-совместимый endpoint. Каждому агенту можно назначить свой протокол независимо от остальных.</p><h2>Почему Tauri + Rust, а не Electron</h2><p>Выбор стека для менеджера, который управляет чужими тяжёлыми моделями, логичен. Tauri даёт бинарник менее 10 МБ против типичных 100+ МБ у Electron. Rust напрямую дёргает системные API, работает с файловой системой, процессами и детекцией GPU без лишних мостов. Для инструмента, который постоянно запускает подпроцессы и читает конфигурации, это надёжнее и предсказуемее.</p><h2>Сравнение: классическая установка Claude Code и EchoBird</h2><p>Традиционный путь — пять шагов, каждый из которых может обломаться:</p><ol><li>Проверить версию Node.js (нужен 18+).</li><li>Убедиться, что права npm настроены правильно.</li><li>Выполнить npm install -g @anthropic-ai/claude-code.</li><li>Прописать переменную окружения ANTHROPIC_API_KEY.</li><li>Проверить: claude --version. При смене машины — повторить.</li></ol><p>Путь через EchoBird — короче в разы:</p><ol><li>Открыть EchoBird.</li><li>Install &amp; Repair → Claude Code → установить в один клик.</li><li>Model Nexus → ввести API-ключ один раз для всех инструментов.</li></ol><h2>Расширение через plugin.json</h2><p>Новый инструмент описывается JSON-файлом с командами установки, проверки, починки и запуска. Пример минимального плагина:</p><p>Такой подход отделяет ядро приложения от рецептов установки. Теоретически сообщество может добавить плагины для российских моделей — например, GigaChat, YandexGPT или локальных сборок на базе Saiga — без необходимости ждать официальных обновлений.</p><h2>Что нового в ветке v5.x</h2><p>Релизы выходят активно. Несколько примечательных изменений последних недель:</p><ul><li>v5.2.4 — зеркала для установки из Китая (Tsinghua, Alibaba, Huawei), чтобы зависимости качались без VPN.</li><li>v5.2.0 — переключатель Responses-протокола OpenAI для моделей, которые говорят на нём нативно, например MiniMax-M3 и Qwen3.7.</li><li>v5.2.6 — поддержка MiMo Code от Xiaomi и починка автоуплотнения контекста в Codex V2, из-за которого разговоры обрывались.</li><li>v5.2.4 — нативные элементы управления окном и стандартные горячие клавиши macOS (⌘W, ⌘M, ⌘,).</li></ul><h2>Как попробовать</h2><p><b>Безопасность:</b><br />Перед запуском любого установочного скрипта из интерната рекомендуем открыть его в редакторе или скачать официальный инсталлятор из <a href="https://github.com/edison7009/EchoBird/releases">GitHub Releases</a>.</p><p>После установки: открываете Model Nexus, добавляете ключи; переходите в Install &amp; Repair, выбираете инструменты; запускаете их из App Manager. Для локальных моделей — Local LLM → runtime → модель.</p><h2>Кому пригодится</h2><ul><li>Тимлидам и DevRel'ам, которым часто нужно «поднять окружение» на новой машине коллеги.</li><li>Разработчикам, кто переключается между рабочими и личными ПК и устал от повторяющегося адаптации.</li><li>Энтузиастам локальных LLM, которым надоело вручную ставить CUDA, vLLM и искать пути к моделям.</li><li>Авторам плагинов, которые хотят добавить поддержку отечественных или нишевых ИИ-сервисов.</li></ul><h2>Выводы</h2><p>EchoBird не изобретает ИИ-инструменты заново — он убирает трение на границе между «хочу попробовать» и «уже работает». Model Nexus решает проблему разрозненных конфигураций, встроенные runtime'ы — проблему локальных моделей, а плагины — проблему поддержки новых сервисов. Выбор Rust + Tauri выглядит обоснованным: приложение остаётся лёгким, хотя самые тяжёлые модели грузятся вне его.</p><blockquote>EchoBird родился из собственной боли: друзья постоянно просили меня установить Claude Code на их машины. Я хотел, чтобы любой мог нажать одну кнопку и получить рабочее окружение, не разбираясь в Node.js, npm и переменных окружения.</blockquote><p>Если в вашем рабочем процессе регулярно фигурируют Claude Code, Codex CLI, Aider или локальные LLM, стоит потратить несколько минут на установку и посмотреть, сколько ручных шагов отпадёт.</p><h2>Источники</h2><p>Оригинальный материал: <a href="https://dev.to/wonderlab/open-source-project-of-the-day-97-echobird-one-app-to-install-configure-and-run-all-your-ai-2bpi">Open Source Project of the Day (#97): EchoBird</a> — DEV Community. Дополнительно: <a href="https://github.com/edison7009/EchoBird">репозиторий EchoBird на GitHub</a>, <a href="https://echobird.ai/">официальный сайт</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что важнее технологического стека при создании сайта</title>
      <link>https://tproger.ru/articles/chto-vazhnee-tehnologicheskogo-steka-pri-sozdanii-sajta</link>
      <comments>https://tproger.ru/articles/chto-vazhnee-tehnologicheskogo-steka-pri-sozdanii-sajta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-vazhnee-tehnologicheskogo-steka-pri-sozdanii-sajta</guid>
      <description><![CDATA[<p>Разбираем, что реально влияет на успех сайта — скорость, хостинг, микроразметка, ИИ-поиск и UX. Проверьте свой фундамент.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-vazhnee-tehnologicheskogo-steka-pri-sozdanii-sajta">Что важнее технологического стека при создании сайта</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 15 Jun 2026 09:00:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы сейчас спорите, на чём писать новый сайт — React, Vue или что-то ещё — остановитесь. <b>Скорее всего, технологический стек, то есть набор инструментов для разработки, не решит, выстрелит проект или нет.</b> Современный сайт можно собрать практически на любом зрелом фреймворке, и он будет работать. Главное теперь не в том, на чём выстроен сайт, а в том, <b>насколько быстро он грузится, насколько удобен для людей и понятен для поисковых и ИИ-систем</b>. В этой статье разберём, почему стек отошёл на второй план и что по-настоящему влияет на успех веб-проекта.</p><h2>Что значит «правильный фундамент сайта»</h2><p>Под фундаментом я понимаю не только сервер и домен, а совокупность факторов: производительность, надёжность инфраструктуры, структурированные данные, качество контента, доступность и удобство использования. Фреймворк — это инструмент; фундамент — это то, ради чего инструмент используется. Плохо оптимизированный сайт на передовом стеке часто проигрывает хорошо сделанному сайту на классическом стеке. Подробнее про метрики скорости — в материале <a href="https://tproger.ru/articles/kak-s-pomoshhju-core-web-vitals-vljubit-v-svoj-sajt-polzovatelej-i-poiskovye-sistemy">о Core Web Vitals на Tproger</a>.</p><ul><li>Выбор фреймворка перестал быть решающим фактором: зрелые инструменты дают схожие возможности.</li><li>Производительность, хостинг, домен и CDN (сеть доставки контента) напрямую влияют на трафик и конверсию.</li><li>Структурированные данные (Schema.org / JSON-LD) помогают поисковикам и ИИ правильно понимать контент.</li><li>ИИ-поиск и ответные системы меняют правила видимости: важны ясность, авторитетность и точные ответы.</li><li>Качественный контент и UX становятся главным конкурентным преимуществом.</li></ul><h2>Технологический стек стал товаром</h2><p>За последнее десятилетие экосистема веб-разработки выросла настолько, что большинство популярных фреймворков предлагают примерно одно и то же: компонентную архитектуру, серверный рендеринг, интеграции с API, аутентификацию и инструменты оптимизации. Разрыв между React, Vue, Svelte, Next.js, Nuxt, Laravel или Django в типичных задачах сократился до предпочтений команды, а не до объективных преимуществ.</p><p>Пользователи не видят, на чём написан сайт. Они видят, загружается ли страница за секунду, работает ли форма на мобильном, понятна ли навигация. Бизнесу важны трафик, заявки, продажи и лояльность — ни один из этих показателей не растёт автоматически от того, что вы переписали проект на модный стек.</p><p><b>Сигнал проверить себя:</b> если команда обсуждает миграцию фреймворка, но у сайта LCP выше 2,5 с, нет CDN и картинки весят по 400 КБ — стоит сначала закрыть очевидные дыры в фундаменте.</p><h2>Производительность всё ещё решает</h2><p>Многочисленные исследования показывают, что задержка загрузки влияет на отказы и конверсию. Даже небольшое увеличение времени ответа заметно снижает вероятность, что пользователь дождётся контента.</p><h3>Что именно оптимизировать</h3><p>Современная оптимизация выходит далеко за «сожми JS». Нужно думать о форматах изображений (WebP, AVIF), ленивой загрузке, кешировании на граничных серверах, CDN, оптимизации шрифтов и времени ответа сервера. Интернет-магазин, который перевёл каталог на WebP, включил lazy loading и раздал статику через CDN, зачастую получит больше прироста, чем если бы переписал витрину с нуля.</p><ul><li>Измеряйте LCP (Largest Contentful Paint — отрисовку крупного контента), INP (Interaction to Next Paint — время реакции на взаимодействие) и CLS (Cumulative Layout Shift — визуальную стабильность) в PageSpeed Insights или Lighthouse.</li><li>Переводите изображения в современные форматы и используйте адаптивные размеры.</li><li>Включайте кеширование статики на CDN (сети доставки контента) как минимум на год.</li><li>Убирайте неиспользуемый CSS и JS: в российских сетях каждый лишний мегабайт бьёт по скорости и по бюджету пользователя.</li></ul><h2>Домены и инфраструктура не теряют значения</h2><p>Разработчики любят обсуждать код, но домен, DNS и регистратор — это цифровое имущество проекта. Неправильно настроенные записи, просроченный домен или взломанный регистратор могут положить сайт быстрее, чем баг в приложении.</p><p>В российском контексте стоит обращать внимание на локальных регистраторов — например, Reg.ru или RU-CENTER. Важны двухфакторная аутентификация в личном кабинете, блокировка переноса домена (domain lock), корректные NS-записи и резервные DNS-серверы. Если ваш бизнес зависит от сайта, отказоустойчивость DNS может спасти репутацию в момент DDoS или аварии хостинга.</p><ul><li>Проверьте срок действия домена и включите автообновление.</li><li>Включите 2FA у регистратора и запретите неавторизованный трансфер.</li><li>Используйте минимум два независимых NS-сервера в разных сетях.</li><li>Мониторьте время отклика DNS: оно влияет на TTFB (Time to First Byte — время до первого байта ответа сервера).</li></ul><h2>Хостинг — это уже не просто сервер</h2><p>Раньше хостинг означал аренду железа и развёртывание кода. Сегодня платформы предлагают глобальные CDN, автомасштабирование, встроенную безопасность, наблюдаемость и автоматизацию развёртывания. Граничные вычисления позволяют отдавать контент ближе к пользователю, снижая задержку.</p><h3>Что спрашивать у провайдера</h3><p>В России это может быть Selectel, Timeweb, Beget, Yandex Cloud или VK Cloud. Выбирая провайдера, смотрите не только на цену CPU/RAM, но и на SLA по доступности, географию CDN-точек, скорость развёртывания, поддержку HTTP/2 и HTTP/3, а также простоту мониторинга. Сайт, который остаётся доступным во время вирального всплеска трафика, приносит больше пользы, чем идеально написанный, но упавший сервис.</p><p><b>Практический контрольный список:</b> есть ли у провайдера CDN (сеть доставки контента) в России, автомасштабирование, бэкапы и DDoS-защита? Если нет — вы платите не за хостинг, а за аренду сервера с самообслуживанием.</p><h2>Структурированные данные перешли из «можно» в «нужно»</h2><p>Поисковые системы и ИИ всё чаще не просто индексируют текст, а пытаются понять <i>смысл</i> страницы. Schema.org / JSON-LD помогает явно указать: это статья, товар, отзыв, событие, организация или рецепт.</p><p>Без микроразметки поисковику приходится догадываться из неструктурированного текста, что повышает риск ошибок. С микроразметкой контент чаще попадает в расширенные сниппеты, карточки знаний и rich results. Для русскоязычных проектов это особенно важно в Яндексе и Google: оба поисковика поддерживают Schema.org.</p><p>Пример разметки статьи на базе Schema.org — в гайде <a href="https://tproger.ru/articles/dobavlenie-schema-org-v-docusaurus-dlya-geo">«Добавляем Schema.org в Docusaurus для GEO»</a>.</p><ul><li>Для статей используйте тип Article с headline, author и datePublished.</li><li>Для товаров — Product с offers, aggregateRating и availability.</li><li>Проверяйте разметку через валидаторы Google Rich Results Test и Яндекс.Вебмастер.</li><li>Добавляйте FAQ и HowTo только там, где они реально отвечают на вопросы пользователей.</li></ul><h2>ИИ-поиск и Answer Engine Optimization</h2><p>Пользователи всё чаще задают вопросы нейросетям и ассистентам вместо того, чтобы вбивать ключевые слова в поисковик. ChatGPT, Perplexity, ЯндексGPT, Google AI Overviews собирают ответы из множества источников и показывают их в диалоговом формате.</p><h3>Как стать источником для ИИ</h3><p>Это меняет правила видимости. Цель уже не только попасть на первую страницу Google, но и стать источником, который ИИ цитирует. Answer Engine Optimization (AEO) — подход, при котором контент структурируется так, чтобы давать прямые, авторитетные и легко извлекаемые ответы.</p><ul><li>Формулируйте ключевые тезисы в первых 100-150 словах статьи.</li><li>Используйте чёткие заголовки H2/H3 с вопросами («Что такое...», «Как проверить...»).</li><li>Добавляйте блоки FAQ и Ключевые выводы: ИИ-системы часто цитируют именно их.</li><li>Подкрепляйте утверждения ссылками на первоисточники и данные.</li></ul><h2>Контент остаётся главной причиной визита</h2><p>Технологии улучшают доставку, но не заменяют смысл. Тонкий контент, заточенный только под ключевые слова, всё хуже ранжируется: поисковики и ИИ всё лучше распознают экспертизу, авторитетность и релевантность.</p><p>Хороший сайт отвечает на реальные вопросы и решает реальные задачи. Это может быть собственное исследование, пошаговый гайд, сравнение инструментов или разбор типичных ошибок. Контент, который демонстрирует экспертизу, чаще получает ссылки, цитаты и репосты — а значит, и органический трафик.</p><blockquote>Поисковые системы всё лучше распознают контент, который действительно отвечает на вопросы пользователей. Техническая оптимизация открывает дверь, но экспертиза заставляет людей возвращаться.</blockquote><h2>Пользовательский опыт — новый дифференциатор</h2><h3>С чего начать проверку</h3><p>Когда технологии доступны всем, преимущество уходит к тому, кто делает продукт удобнее. Интуитивная навигация, отзывчивая вёрстка, доступность для людей с ограниченными возможностями и стабильная работа на мобильных — это не «полировка», а часть функционала.</p><p>Простые вещи работают сильнее сложных: сократите число шагов в корзине, увеличьте целевые зоны кнопок на телефоне, проверьте таб-навигацию и контрастность. Улучшения доступности обычно делают сайт удобнее для всех.</p><ul><li>Проверьте сайт с клавиатуры: можно ли дойти до всех интерактивных элементов?</li><li>Запустите Lighthouse в мобильном режиме и исправьте критичные замечания по доступности.</li><li>Тестируйте на реальных устройствах, а не только в десктопном браузере.</li><li>Собирайте обратную связь от реальных пользователей, а не только метрики.</li></ul><p>Подробнее про инструменты и приёмы проверки доступности — в материале <a href="https://tproger.ru/articles/chto-takoe-dostupnost-sajta-i-kak-ejo-proverit">«Что такое доступность сайта и как её проверить»</a>.</p><h2>Будущее — за результатами, а не фреймворками</h2><p>Индустрия веб-разработки дошла до точки, где любой зрелый фреймворк способен дать отличный результат. Настоящий вызов — собрать сайт, который быстро грузится, легко находится, надёжно работает и понятен людям и машинам.</p><p>Сайты, которые побеждают сегодня, строятся не на модных технологиях, а на сильном фундаменте. Разработчики, которые фокусируются на производительности, инфраструктуре, микроразметке, контенте и UX, создают проекты, которые останутся конкурентоспособными независимо от того, как изменятся поисковики, ИИ или фронтенд-стек.</p><h2>FAQ</h2><h2>Выводы</h2><p>Технологический стек важен, но он перестал быть главным предиктором успеха. В 2026 году сайт выигрывает не потому, что написан на модном фреймворке, а потому что у него сильный фундамент: быстрая загрузка, надёжная инфраструктура, понятная микроразметка, качественный контент и удобный интерфейс.</p><p>Если вы планируете запуск или редизайн, начните не со споров о стеке, а с аудита скорости, инфраструктуры и контента. Это даст больше реальной пользы, чем очередная миграция «на что-то более современное».</p><p><b>Источник:</b> <a href="https://www.freecodecamp.org/news/building-a-website-what-matters-more-than-your-tech-stack/">Manish Shivanandhan, freeCodeCamp — Building a Website in 2026: What Matters More Than Your Tech Stack</a>. Материал подготовлен как авторская переработка идеи с добавлением российского контекста и практических рекомендаций.</p>]]></content:encoded>
    </item>
    <item>
      <title>Семь ошибок индексации БД, которые убивают производительность SaaS на корню</title>
      <link>https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa</link>
      <comments>https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa</guid>
      <description><![CDATA[<p>Разбираем 7 типичных ошибок индексации в PostgreSQL и MySQL: переиндексация, низкая селективность, раздутие индексов, мультитенантность и внешние ключи. Проверьте свою БД перед релизом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sem-owibok-indeksacii-bd-kotorye-ubivayut-proizvoditelnost-sa">Семь ошибок индексации БД, которые убивают производительность SaaS на корню</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Масштабируемость и ограничения памяти]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Jun 2026 05:30:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш код чист, архитектура продумана, а запросы на staging укладываются в 12 мс. Но при 500 000 записей всё встаёт: панели мониторинга тормозят, пользователи жалуются, а дежурный инженер в полночь разглядывает план выполнения запроса и не понимает, что пошло не так. В девяти случаях из десяти причина — не отсутствие индексов, а <b>неправильные индексы</b>.</p><p><b>Индекс в базе данных</b> — это вспомогательная структура (чаще всего B-дерево; хеш-индексы, GiST, GIN и другие типы применяются в узких специфических сценариях), которая ускоряет выборку строк по заданным колонкам. По аналогии с оглавлением книги: вместо перелистывания всех страниц СУБД сразу переходит к нужной главе. Но если оглавление построено плохо, пользы от него нет — а вот накладные расходы на поддержку остаются.</p><p>В этой статье разберём семь самых разрушительных ошибок индексации в production-SaaS: от параноидального создания индексов «на всякий случай» до игнорирования раздутия и особенностей мультитенантных схем. Каждая ошибка — с примерами SQL, метриками и конкретным фиксом.</p><p>Индексы — это налог на запись: каждый INSERT, UPDATE и DELETE обновляет все индексы таблицы.</p><p>Индекс на колонке с низкой селективностью (boolean, статус) почти бесполезен — используйте частичные (partial) индексы.</p><p>В составном индексе порядок колонок критичен: PostgreSQL может использовать (a, b, c) только если условие начинается с a.</p><p>Раздутые индексы на высокоизменяемых таблицах могут занимать в 8 раз больше места, чем нужно — планируйте REINDEX CONCURRENTLY.</p><p>В мультитенантных системах индекс по tenant_id один часто недостаточен: добавляйте диапазон времени или тип события.</p><p>Внешние ключи в PostgreSQL не индексируются автоматически — после каждого FOREIGN KEY создавайте индекс вручную.</p><p>Без EXPLAIN ANALYZE индексы создаются вслепую. Проверяйте реальный план выполнения перед деплоем.</p><h2>Ошибка 1. Индексировать всё подряд «на всякий случай»</h2><p>Самая распространённая ошибка — не недостаток индексов, а их избыток из тревожности. Особенно часто в неё попадают junior-разработчики: добавляют индекс на каждую колонку, которая встречается в WHERE, «на всякий случай». Кажется ответственным, но на самом деле вредно.</p><p>Каждый индекс — это налог на запись. При INSERT, UPDATE и DELETE PostgreSQL (или MySQL) вынуждена обновлять <b>все</b> индексы таблицы. На таблице с 8 индексами каждая запись трогает 8 структур данных. При низкой нагрузке это невидимо, но при 10 000 записей в минуту это становится узким местом.</p><p><b>Аудит неиспользуемых индексов в PostgreSQL:</b><br />Запрос к pg_stat_user_indexes покажет, сколько раз каждый индекс применялся с момента сброса статистики. Если idx_scan = 0 — индекс кандидат на удаление.</p><p>Не удаляйте индекс сразу — сначала убедитесь, что он не нужен для редких, но критичных отчётов. Но если он месяцами не используется, смело избавляйтесь.</p><h2>Ошибка 2. Не понимать селективность</h2><p>Индекс на булеву колонку — почти всегда бесполезен. <b>Селективность</b> измеряет, сколько различных значений содержится относительно общего числа строк. У boolean всего два значения. Если 95% строк имеют is_active = true, планировщик запросов проигнорирует индекс и сделает Seq Scan — и будет прав.</p><p>Правило большого пальца: если у колонки меньше 10–20 уникальных значений относительно размера таблицы, простой индекс по ней один не справится. Используйте частичные или составные индексы.</p><h2>Ошибка 3. Неверный порядок колонок в составном индексе</h2><p>Составные индексы мощны, но часто неправильно понимаются. PostgreSQL может использовать индекс (a, b, c) для фильтрации по a, a и b, a, b и c. Но <b>не может</b> эффективно использовать его, если запрос фильтрует только по b или c — ведущая колонка пропущена.</p><p>Решение: первыми ставьте колонки с equality-условиями, затем — по селективности, и проектируйте индексы вокруг <b>реальных паттернов запросов</b>, а не вокруг схемы таблицы. Также учитывайте ORDER BY и необходимость покрывающего индекса. Перед созданием обязательно запускайте EXPLAIN ANALYZE.</p><h2>Ошибка 4. Игнорировать раздутие индексов</h2><p>Индексы деградируют со временем. Многие инженеры воспринимают их как «поставил и забыл», но это заблуждение. В PostgreSQL при обновлении или удалении строки старые записи в индексе устаревают и накапливаются как <b>раздутие</b> (bloat); их физическое удаление происходит при выполнении VACUUM. На высокоизменяемых таблицах (заказы, события, логи, сессии) раздутие накапливается стремительно.</p><p>Таблица с 1 млн живых строк может иметь индекс, раздутый до размеров 8 млн записей. Каждый запрос через такой индекс делает в 8 раз больше работы, чем должен.</p><p><b>REINDEX CONCURRENTLY</b> — ключевое слово. Обычный REINDEX блокирует таблицу, а в production-SaaS это прямой путь к инциденту. CONCURRENTLY перестраивает индекс без блокировок, хотя и медленнее.</p><p>Также убедитесь, что autovacuum настроен под вашу реальную нагрузку на запись. Значения по умолчанию в PostgreSQL консервативны и часто недостаточны для SaaS с высокой интенсивностью записи.</p><h2>Ошибка 5. Индексы на колонках с малым числом уникальных значений в мультитенантных системах</h2><p>В мультитенантной архитектуре почти каждый запрос фильтрует по tenant_id. Естественное желание — проиндексировать эту колонку. Но для крупных тенантов индекс по tenant_id вернёт слишком много строк, и планировщик предпочтёт Seq Scan. Для маленьких тенантов отдельный индекс по tenant_id может быть полезен.</p><p>На серьёзном масштабе правильное решение — партиционирование таблиц по tenant_id, но это архитектурное решение. Практический первый шаг — составные индексы с временными диапазонами.</p><h2>Ошибка 6. Не индексировать внешние ключи</h2><p>В PostgreSQL внешние ключи <b>не индексируются автоматически</b>. При удалении родительской строки СУБД должна проверить все дочерние таблицы на наличие ссылающихся записей — и без индекса на внешнем ключе это Seq Scan по каждой дочерней таблице. На таблице orders с 50 млн строк удаление пользователя вызывает полное сканирование.</p><p>Сделайте это командным соглашением: в чек-листе миграций обязательный пункт «после каждого FOREIGN KEY — CREATE INDEX».</p><h2>Ошибка 7. Не использовать EXPLAIN ANALYZE перед деплоем</h2><p>Большинство решений об индексах принимаются интуитивно. Интуиция ошибается достаточно часто, чтобы это стало проблемой. EXPLAIN ANALYZE показывает, что именно делает планировщик: какие индексы использует, какие игнорирует, сколько строк реально прочитал против оценки, где тратится время.</p><p>На что обращать внимание:<br />• <b>Seq Scan</b> на большой таблице при выборке малой доли строк — возможно, пропущен индекс или планировщик не может использовать существующий индекс.<br />• <b>Rows Removed by Filter</b> в десятки тысяч — индекс есть, но неправильные колонки или низкая селективность.<br />• <b>Buffers: shared hit=0 read=45000</b> — данные не закэшированы (cold cache), страницы читаются с диска. Для диагностики раздутия смотрите общее число буферов и сравнивайте размер индекса с ожидаемым.<br />• Высокое <b>actual time</b> — проверьте раздутие, актуальность статистики, количество буферов, дисковую подсистему и наличие блокировок. Запустите ANALYZE tablename, чтобы обновить статистику планировщика.</p><h2>Чек-лист индексации для SaaS</h2><ul><li>У каждой колонки внешнего ключа есть индекс?</li><li>Составные индексы упорядочены по селективности, а не по удобству?</li><li>Булевы и низкокардинальные фильтры используют частичные индексы вместо полных?</li><li>Вы запускали EXPLAIN ANALYZE на 10 самых медленных запросов за неделю?</li><li>Есть процесс поиска и удаления неиспользуемых индексов?</li><li>Высокоизменяемые таблицы регулярно проходят REINDEX CONCURRENTLY?</li><li>Autovacuum настроен под реальный объём записи, а не под значения по умолчанию PostgreSQL?</li><li>В мультитенантных таблицах индексы начинаются с tenant_id и включают диапазон времени?</li></ul><h2>Выводы</h2><p>Индексы — не фича производительности, которую добавляют, когда всё начинает тормозить. Это проектное решение, которое принимается вместе со схемой, и пересматривается по мере эволюции паттернов запросов. Команды, которые уверенно масштабируются, — не те, у кого больше всего индексов, а те, кто понимает, что каждый индекс стоит, что даёт и когда его пора убирать.</p><blockquote>База данных, которая быстра на 10 000 строках и быстра на 50 миллионах, — не случайность. Это результат того, что кто-то считал планирование запросов первоклассной инженерной задачей, а не рутинным дополнением.</blockquote><p>Проверьте свои самые медленные запросы этой недели — возможно, одна из этих семи ошибок уже сидит в вашей production-базе.</p><p><b>Источник и материалы:</b><br />• <a href="https://dev.to/outworktech/database-indexing-mistakes-that-kill-saas-performance-at-scale-4j8e">Database Indexing Mistakes That Kill SaaS Performance at Scale</a> — оригинальная статья OutworkTech<br />• <a href="https://www.postgresql.org/docs/current/indexes.html">PostgreSQL Index Types</a> — официальная документация<br />• <a href="https://www.postgresql.org/docs/current/sql-reindex.html">REINDEX</a> — документация по перестроению индексов</p>]]></content:encoded>
    </item>
    <item>
      <title>Agentic SRE: как ИИ-агенты меняют практику надёжности</title>
      <link>https://tproger.ru/articles/agentic-sre-kak-ii-agenty-menyayut-praktiku-nadyozhnosti</link>
      <comments>https://tproger.ru/articles/agentic-sre-kak-ii-agenty-menyayut-praktiku-nadyozhnosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/agentic-sre-kak-ii-agenty-menyayut-praktiku-nadyozhnosti</guid>
      <description><![CDATA[<p>Разбираем, как агентный подход к SRE ускоряет диагностику инцидентов и сокращает рутину. Пять рабочих сценариев, стек инструментов и правила безопасности. Читайте и внедряйте.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/agentic-sre-kak-ii-agenty-menyayut-praktiku-nadyozhnosti">Agentic SRE: как ИИ-агенты меняют практику надёжности</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Организация разработки]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 31 May 2026 07:22:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы дежурите по ночам и проводите значительное время инцидента в поисках контекста — есть способ существенно сократить этот этап. <b>Agentic SRE</b> (агентный подход к Site Reliability Engineering) — это эволюция практики надёжности, где ИИ-агенты берут на себя рутину наблюдения, диагностики и безопасного реагирования. Цель не в том, чтобы заменить инженера, а в том, чтобы дать ему сверхспособности в моменты, когда каждая секунда дорога.</p><h2>Что такое Agentic SRE</h2><p>Agentic SRE — это практика, в которой автономные ИИ-агенты помогают наблюдать за системами, анализировать телеметрию (метрики, логи, трейсы) и выполнять ограниченные операционные действия при заданных человеком guardrails (правил безопасности). Агент не заменяет SRE-инженера, а работает как цифровой напарник: собирает контекст, предлагает гипотезы и выполняет только те действия, которые одобрены политикой.</p><p>Ключевое отличие от классической автоматизации — способность к <b>рассуждению</b>. Традиционные скрипты реагируют на жёсткие триггеры («если CPU &gt; 90%, то перезапустить»). Агент же может связать всплеск ошибок с недавним развёртыванием, проверить корреляцию по трейсам и предложить конкретный план действий — всё до того, как инженер откроет ноутбук.</p><p>Agentic SRE — это ИИ-агенты, которые помогают инженерам наблюдать, диагностировать и реагировать на инциденты.</p><p>Основная цель — сократить рутину и ускорить принятие решений, а не заменить человека.</p><p>Ключевые сценарии: триаж алертов, инцидент-копилот, автоматический RCA, безопасное исправление, обучение на инцидентах.</p><p>Безопасность превыше всего: агенты работают с allowlists, approval gates и полным аудитом.</p><p>Российские команды могут строить стек на OpenTelemetry, Prometheus/Grafana, собственных LLM и PagerDuty/Opsgenie.</p><h2>Почему это важно именно сейчас</h2><p>Сегодняшние системы стали слишком распределёнными, шумными и динамичными, чтобы человек успевал за ними вручную. Микросервисы, Kubernetes, feature flags и канареечные развёртывания создали ландшафт, где одно изменение может затронуть десятки сервисов, а сигналы о проблемах разбросаны по десяткам дашбордов.</p><p>Инженеры тратят значительное время на корреляцию метрик, чтение логов, проверку недавних выкаток и охоту за контекстом — до того, как начинают решать проблему. Agentic SRE решает это, превращая сырые телеметрические данные в структурированный контекст и автоматизируя безопасные части цикла реагирования.</p><p>Особенно это критично ночью и в выходные, когда на дежурстве один человек, а давление предельно велико. Задачи, которые легко стандартизировать, но сложно выполнить идеально в 2 часа ночи, — идеальная ниша для агентов, которые умеют обобщать, коррелировать и рекомендовать действия согласно политике.</p><h2>Из чего строится стек</h2><p>Практичная архитектура агентного SRE собирается из нескольких слоёв. При этом важно понимать: ценность приходит не от выбора модели, а от качества контекста, жёстких ограничений и дисциплины исполнения.</p><ul><li>Телеметрия: OpenTelemetry — стандарт сбора телеметрии — для сбора логов, метрик и трейсов в едином формате.</li><li>Наблюдаемость: Prometheus, Grafana, Datadog, New Relic, Elastic или облачные системы — хранилище и визуализация.</li><li>Оркестрация: MCP-серверы (Model Context Protocol от Anthropic), внутренние API или системы рабочих процессов, которые предоставляют агенту безопасные инструменты.</li><li>Среда выполнения агента: LLM-фреймворки с function calling, планированием и работой с инструментами.</li><li>Рабочий процесс при инцидентах: PagerDuty, Opsgenie, Slack, Jira, ServiceNow — куда агент пишет отчёты и запрашивает подтверждения.</li><li>Safety Layer: RBAC, approval gates, audit logs, allowlists и пути отката — неотъемлемая часть, а не дополнение.</li></ul><p><b>Принцип безопасности:</b><br />Агент должен уметь делать только то, что мог бы сделать дежурный инженер после одобрения. Это делает систему практичной и снижает риск случайного ущерба.</p><h2>Пять сценариев, которые уже работают</h2><h3>1. Триаж алертов: от шума к сути за секунды</h3><p>Когда срабатывает алерт, агент собирает связанные трейсы, проверяет недавние развёртывания, находит соответствующие всплески в логах и формирует краткое резюме на русском языке: вероятная причина, уверенность, рекомендуемые действия. Это решает проблему «с чего начать?», которая сжигает драгоценные минуты в начале инцидента.</p><h3>2. Инцидент-копилот: второй мозг в канале</h3><p>Агент подключается к каналу реагирования (Slack, Teams) и выполняет роль «второго мозга»: строит таймлайн, подтягивает ссылки на дашборды, отслеживает гипотезы по мере их проверки. Когда в инциденте участвуют несколько инженеров, это предотвращает фрагментацию контекста и дублирование усилий.</p><h3>3. Автоматический черновик RCA (Root Cause Analysis)</h3><p>После инцидента агент сравнивает таймлайн с недавними изменениями (развёртывания, конфиги, фичер-флаги), находит корреляции и генерирует первый черновик отчёта RCA с ссылками на доказательства. Инженер остаётся владельцем выводов, но экономит значительное время на подготовку документации.</p><h3>4. Безопасное исправление под контролем</h3><p>Для хорошо изученных типов инцидентов агент может рекомендовать или выполнять низкорискованные действия: перезапуск упавшего экземпляра сервиса, масштабирование развёртывания, отключение сломанного фичер-флага. Но всё, что влияет на пользовательский трафик, требует одобрения человека.</p><h3>5. Обучение на инцидентах: от пожаротушения к профилактике</h3><p>Агент анализирует паттерны в разных инцидентах, выявляет повторяющиеся корневые причины и предлагает, где улучшить наблюдаемость или сократить рутину. Со временем это создаёт обратную связь: боль в продакшене превращается в инвестиции в платформу. Точные алерты, подробные трейсы, недостающие дашборды — всё это становится следствием системной работы, а не хаотичных пост-инцидентов.</p><h2>Guardrails: почему доверие важнее интеллекта</h2><p>Главный риск агентного SRE не в том, что агент слишком умен, а в том, что он может быть <b>слишком уверен в себе</b>. LLM способны генерировать правдоподобные, но неверные объяснения. Поэтому каждая рекомендация должна быть прослежена до реальной телеметрии, а каждое действие — ограничено явными правами.</p><ul><li>Action allowlists: агент может делать только то, что в белом списке.</li><li>Approval gates: рискованные изменения требуют подтверждения.</li><li>Полный audit log: каждое действие агента записывается.</li><li>Read-only mode на этапе внедрения: сначала наблюдаем, потом действуем.</li><li>Разграничение прав по сервисам и командам.</li><li>Human override на каждом шаге: человек всегда может взять управление.</li></ul><blockquote>Если вы воспринимаете агента как стажёра с феноменальной памятью, но без здравого смысла, вы спроектируете систему с гораздо лучшей защитой.</blockquote><h2>Выводы</h2><p>Agentic SRE — это не модный тренд, а логичный ответ на растущую сложность инфраструктуры. Реальная ценность не в полной автономии, а в ускорении понимания, безопасной автоматизации и качественной коллаборации человека и машины в критические моменты.</p><p>Если строить это правильно, результат — продвинутая практика надёжности: меньше бесполезной работы, короче инциденты и больше времени для инженеров на системные улучшения вместо повторяющейся рутины. Настоящая ценность агентного SRE — не в замене инженера, а в том, чтобы дать ему модель работы с гораздо большей эффективностью.</p><p>Источник: <a href="https://devops.com/agentic-sre-the-next-frontier-of-reliability/">Agentic SRE: The Next Frontier of Reliability — DevOps.com</a> (Neel Shah, 2026).</p>]]></content:encoded>
    </item>
    <item>
      <title>Шесть способов сделать flatten в Python — какой быстрее в 500 раз</title>
      <link>https://tproger.ru/translations/west-sposobov-sdelat-flatten-v-python-kakoj-bystree-v-500-ra</link>
      <comments>https://tproger.ru/translations/west-sposobov-sdelat-flatten-v-python-kakoj-bystree-v-500-ra?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/west-sposobov-sdelat-flatten-v-python-kakoj-bystree-v-500-ra</guid>
      <description><![CDATA[<p>Разворачиваем вложенный список в Python: for + extend, list comprehension, itertools.chain, reduce, sum, NumPy. Замер и почему sum() — анти-паттерн.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/west-sposobov-sdelat-flatten-v-python-kakoj-bystree-v-500-ra">Шесть способов сделать flatten в Python — какой быстрее в 500 раз</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 May 2026 11:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если в коде встречается список списков и нужно превратить его в один плоский, на ум приходит как минимум пять подходов — от обычного for до itertools.chain и NumPy. Какие из них работают за миллисекунды, а какие — за секунды? Перевод и адаптация туториала Real Python с разбором всех способов и замером производительности.</p><p>Flatten — операция приведения вложенной структуры к одномерной. Самый распространённый кейс: матрица представлена как список списков, а вам нужен плоский список всех значений, чтобы передать в алгоритм или ML-модель. В отличие от других языков, в Python нет встроенного .flatten() у списков — поэтому стандартное «как это сделать?» имеет несколько ответов разной степени читаемости и эффективности.</p><p>Пусть у нас есть матрица 4×4:</p><p>Цель — получить:</p><ul><li>Быстрее всего работает обычный цикл с in-place мутацией: += или .extend(). Время — около 5–7 мс.</li><li>itertools.chain() — около 16 мс, но в 3 раза экономнее по памяти; подходит, когда финальный список не нужен полностью.</li><li>List comprehension — около 24 мс. Читаемо и без побочных эффектов, но создаёт промежуточные объекты.</li><li>functools.reduce() + lambda и sum() — от 2,6 секунд. Это в 400–500 раз медленнее за счёт постоянного создания новых промежуточных списков.</li><li>Для произвольной вложенности — рекурсия или итеративный обход со стеком.</li><li>В data-science для NumPy-массивов используйте np.ndarray.flatten() — он быстрее любого варианта на чистых списках.</li></ul><h2>Способ 1. Цикл for + .extend()</h2><p>Самый прямолинейный и читаемый вариант: проходим по каждой подсписку и добавляем её элементы к итоговому списку через .extend().</p><p>.extend() принимает любой iterable и поэлементно добавляет его в конец списка. Альтернативно можно использовать augmented-concatenation +=:</p><p>Обе функции делают одно и то же. Real Python отмечает: flatten_extend читается чуть лучше, потому что метод named — намекает на смысл операции. По скорости варианты идут в первой тройке.</p><h2>Способ 2. List comprehension</h2><p>Pythonic-альтернатива однострочнику. Двойной for внутри comprehension перебирает сначала строки, потом элементы строк:</p><p>Подход компактнее цикла и не плодит промежуточных переменных. Скорость — заметно медленнее .extend() из-за двух вложенных циклов на уровне comprehension, но всё ещё в диапазоне десятков миллисекунд.</p><h2>Способ 3. itertools.chain() — экономно по памяти</h2><p>chain() возвращает итератор, а не список. Это значит, что вы можете обходить элементы потокового, не материализуя весь массив в памяти — полезно, когда матрица большая и хранить полный flat-список нерационально.</p><p>На большой матрице chain.from_iterable примерно в три раза медленнее цикла .extend(): накладные расходы на материализацию через list(). Но если итоговый список как таковой не нужен — можно отдать сам итератор потребителю и сэкономить и время, и память.</p><h2>Способ 4. functools.reduce() и sum() — почему так медленно</h2><p>Эти варианты часто появляются в туториалах для красоты, но на практике плохо масштабируются. Причина одна: каждая итерация создаёт новый промежуточный список вместо мутации существующего.</p><p>iconcat мутирует аккумулятор и держится в топ-3 по скорости. А вот вариант с lambda и оператором + на каждом шаге копирует обе стороны — отсюда и взрывной рост времени на больших данных.</p><p>С sum() ситуация ровно такая же:</p><p>sum() работает на любых сложениях, но для списков это О(n²) по аллокациям. На матрице 1000×1000 он в ~500 раз медленнее цикла с .extend().</p><h2>Способ 5. Произвольная вложенность — рекурсия и стек</h2><p>Все предыдущие способы предполагают, что вложенность ровно одна. Если структура произвольно глубокая или неоднородная, нужен другой подход:</p><p>Рекурсия удобна, пока глубина не упирается в sys.getrecursionlimit() (по умолчанию 1000). Для очень глубоких структур стоит переписать через итеративный обход со стеком:</p><h2>Способ 6. NumPy для data-science</h2><p>Если вы работаете с матрицами в data-science, у numpy.ndarray есть готовый метод .flatten(). Он быстрее любого варианта на чистых Python-списках, потому что под капотом работает с непрерывным блоком памяти.</p><h2>Замер производительности</h2><p>Real Python прогнали все варианты на матрице 1000×1000 через timeit. Результаты, отсортированные по времени:</p><p>Между первыми тремя и последними четырьмя — пропасть в 400–500 раз. Причина: топовые функции мутируют существующий список, а reduce(+), reduce(operator.add), reduce(lambda x, y: x + y) и sum() на каждой итерации создают копии.</p><h2>FAQ</h2><h2>Выводы</h2><p>Если вам нужен один-в-один поведенческий рецепт: for row in matrix: flat.extend(row). Этот код понятен любому, кто знает Python, и упирается в производительность только когда матрица переваливает за миллионы элементов. Если объёмы такие, что нужна потоковая обработка — переключитесь на itertools.chain. Если данные numerical — используйте NumPy.</p><p>Главное, чего стоит избегать — sum(matrix, []) и reduce с + или lambda. Они смотрятся изящно в туториалах, но превращают O(n) в O(n²) и ставят вас в первую же боттлнек-историю на проде.</p><p>Оригинальный туториал с пошаговыми объяснениями и сравнением — <a href="https://realpython.com/python-flatten-list/">на Real Python</a>, автор — Leodanis Pozo Ramos.</p>]]></content:encoded>
    </item>
    <item>
      <title>Inline-пропсы в React тихо обнуляют memo: разбор на 200 строк, как чинить</title>
      <link>https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k</link>
      <comments>https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k</guid>
      <description><![CDATA[<p>Контролируемый эксперимент LogRocket: 200 memoized React-строк, inline объекты в JSX делают коммит 244 мс на нажатие. Простой фикс снижает до 6 мс. Разбор.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k">Inline-пропсы в React тихо обнуляют memo: разбор на 200 строк, как чинить</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 May 2026 11:30:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Совет по производительности React обычно сводится к набору рецептов: оборачиваем дорогие дочерние компоненты в React.memo, добавляем useCallback к обработчикам, useMemo к вычислениям — и идём дальше. На практике эти инструменты работают только тогда, когда передаваемые через них значения действительно стабильны. Если родитель пересоздаёт объект или функцию на каждом рендере, React видит новую ссылку и memoization-граница перестаёт делать полезную работу.</p><p>В <a href="https://blog.logrocket.com/react-pattern-everyone-uses-kills-performance/">материале на блоге LogRocket</a> разобран один из самых частых React-паттернов, который в неподходящем контексте оказывается одним из самых дорогих, — передача inline-объектов, массивов и колбэков прямо в месте вызова компонента. Контролируемый эксперимент с 200 memoized строк показывает, как это превращает один keystroke в коммит на 243,9 мс — и как простой рефактор возвращает время до 6 мс.</p><p><b>React.memo сравнивает по ссылке.</b> Внутри React работает Object.is: {padding:16} и {padding:16} — это разные ссылки, значит «изменилось».</p><p><b>Inline-объекты в JSX обнуляют memo.</b> Каждый рендер родителя создаёт новый объект/функцию, мемоизированный дочерний компонент видит «новые пропсы» и перерисовывается заново. Оптимизация, которую вы планировали, не срабатывает.</p><p><b>Цена в живом коде.</b> Эксперимент: 200 memoized строк, поиск, inline style и onAddToCart. После 6 нажатий — счётчик рендеров каждой строки = 14, на keystroke коммит 243,9 мс.</p><p><b>Фикс простой.</b> Статичный объект — в module scope. Динамический колбэк — в useCallback с пустыми зависимостями. После: коммит 6 мс, счётчик рендеров = 2, Why Did You Render молчит.</p><p><b>React Compiler не отменяет понимания.</b> Он автоматизирует много memoization, но useMemo/useCallback остаются escape hatch для случаев, когда нужен точный контроль (например, dependency для Effect).</p><h2>Как работает bailout у React</h2><p>React.memo оборачивает компонент в memoization-границу. Когда родитель ререндерится, React не пропускает дочерний автоматически только потому, что он мемоизирован. Вместо этого сравниваются новые пропсы со старыми. Если каждый пропс считается равным — bail out, переиспользуем предыдущий результат. Если хотя бы один не равен — рендер. По умолчанию React сравнивает попропсово через Object.is.</p><p>Эта деталь критична, потому что для объектов и функций Object.is — это, по сути, проверка по ссылке:</p><p>Содержимое выглядит идентичным, но ссылки разные. React поэтому считает их изменёнными. Именно по этой причине inline-объекты и колбэки оказываются скрытой причиной того, что мемоизированный дочерний компонент продолжает ререндериться.</p><p>Та же логика объясняет, зачем нужны useCallback и useMemo. По <a href="https://react.dev/reference/react/useCallback">документации React</a>, useCallback кеширует определение функции между рендерами, а useMemo — результат вычисления. Оба помогают только тогда, когда зависимости остаются достаточно стабильными, чтобы React переиспользовал предыдущее значение. Если положить в массив зависимостей нестабильный объект, React видит новую зависимость на каждом рендере и пересчитывает заново.</p><p>Это и объясняет, почему баг ощущается запутанным в реальном приложении. Значения «выглядят» неизменными для человека: у style-объекта те же ключи, тело колбэка идентично, config всё ещё говорит то же самое. Но React не сравнивает намерение или структуру — он сравнивает идентичность.</p><h2>Когда inline-пропсы реально становятся проблемой</h2><p>Стоит провести границу между теоретической и практической ценой. Inline-колбэк сам по себе — не баг производительности. Если ребёнок дешёвый, частота рендера низкая и memoization-границы вокруг нет, измеримого отрицательного эффекта может вообще не быть. И в документации React, и в гайдах LogRocket по производительности — общее место: оптимизация работает там, где есть реальные узкие места, а не гипотетические.</p><p>Проблема начинается, когда сходятся три условия одновременно:</p><ul><li>Родитель ререндерится часто (поиск, скролл, фильтры, анимация, live data).</li><li>Дочерний компонент или поддерево большое — лишняя работа заметна.</li><li>Вы уже добавили memoization и ждёте, что React пропустит работу, когда «ничего важного не изменилось».</li></ul><p>В такой связке нестабильные inline-ссылки не просто добавляют немного оверхеда — они <b>обнуляют ту оптимизацию, которую вы намеренно ввели</b>. И этот паттерн коварен в продакшене: он не объявляет себя багом. UI работает, исключений нет, предупреждений нет, и без профилировщика часто нет очевидного запаха. Цена проявляется иначе: тормозящая фильтрация списков, лаг ввода, шумные flame-графы и компонентные деревья, которые продолжают перерисовываться, даже когда осмысленные данные не менялись.</p><h2>Контролируемый эксперимент: 200 memoized строк</h2><p>Чтобы не спорить «плохо или нормально», автор поста собрал контролируемый тест: поисковый список товаров с 200 memoized строками, где каждая строка получает одинаковые логические значения, но новые ссылки на объект и функцию на каждом рендере родителя. Это позволяет напрямую увидеть, делает ли React.memo bail out или всё поддерево ререндерится на каждое нажатие клавиши.</p><p>Представьте storefront UI с 200 memoized ProductRow. Родитель — ProductList — хранит searchTerm в state. Каждое нажатие апдейтит state, ререндерит ProductList и снова прогоняет JSX, который мапает отфильтрованные товары. В эксперименте каждая ProductRow обёрнута в memo и помечена whyDidYouRender = true, но получает два inline-пропса в месте вызова:</p><p>Это ровно тот случай, о котором React предупреждает при передаче функций в memoized-компоненты: свежая функция или объект, созданные во время рендера, не пройдут сравнение пропсов, если ссылку не стабилизировать.</p><p>В эксперименте эффект становится виден почти мгновенно. Объект style и колбэк onAddToCart пересоздаются каждый раз, когда ререндерится ProductList, поэтому memo-обёртка видит изменённые пропсы для каждой строки на каждом нажатии. Счётчик рендеров делает это конкретным: после шести нажатий каждая видимая строка показывает <b>Renders: 14</b>. React Profiler затем показывает рантайм-цену ошибки: одно нажатие порождает коммит, в котором ProductList занимает <b>243,9 мс</b> и все 200 row-fibers светятся в flame-графе.</p><p>Здесь React Developer Tools отрабатывают по полной. По официальной документации, React DevTools позволяют инспектировать компоненты, редактировать пропсы и state, а также находить проблемы производительности. Профайлер также доступен программно через &lt;Profiler&gt;, но интерактивный вид DevTools обычно используется командами для отладки.</p><p><a href="https://github.com/welldone-software/why-did-you-render">Why Did You Render</a> делает корневую причину ещё нагляднее. Пакет модифицирует React и сообщает о потенциально избегаемых ререндерах. В этом примере он рапортует props.style как «different objects that are equal by value» и props.onAddToCart как «different functions with the same name» — ровно тот референциальный мисматч, который мы и ожидаем. Это диагностический инструмент только для разработки, не для прода, но крайне эффективный для выявления этого класса багов.</p><h2>Рефакторинг, который реально решает проблему</h2><p>Чтобы остановить каскад рендеров, нужны стабильные ссылки. Концептуально фикс прост: значения, которые не меняются, не должны пересоздаваться во время рендера; колбэки, которым нужно жить через рендеры, должны быть memoized, когда ребёнок зависит от референциальной стабильности.</p><p>Вынос ROW_STYLE в module scope решает проблему на самом дешёвом уровне: React никогда не видит новую ссылку на объект, потому что он создаётся один раз вне компонента. Использование useCallback для handleAddToCart даёт ребёнку стабильную ссылку на функцию между рендерами, пока массив зависимостей не меняется. Это и есть тот случай, для которого React документирует useCallback при передаче функций в мемоизированных детей.</p><p>В эксперименте стабилизация ссылок восстанавливает bail-out. Измеренный результат впечатляет: ProductList падает с 243,9 мс до <b>6 мс</b>, бейджи рендеров остаются на <b>2</b> сколько ни печатай, и Why Did You Render замолкает — избегаемых референциальных мисматчей больше нет.</p><h2>Когда стабилизировать ссылки, а когда — нет</h2><p>Это часть, которая часто теряется в дискуссиях про производительность. Урок не «никогда не используй inline-объекты» и не «оборачивай всё в useCallback». Урок: <b>memoization — это контракт</b>. Если ребёнок полагается на референциальное равенство, чтобы пропустить работу, родитель обязан этот контракт уважать и передавать стабильные ссылки.</p><p>Но это не значит, что каждому компоненту нужна агрессивная мемоизация. Современные рекомендации React всё ещё трактуют memoization как точечную оптимизацию, а не дефолтный стиль. Если рендер дешёвый, поддерево маленькое или ребёнок не memoized, стабилизация ссылок может добавить сложности без реальной выгоды. Поэтому большинство гайдов по React performance, включая обзоры LogRocket, акцентируют профилировку прежде, чем механически оптимизировать.</p><p>Полезное правило большого пальца: <b>сначала перенеси, потом мемоизируй</b>. Если значение статично — вынеси его за пределы тела компонента, прежде чем тянуться к хукам. Это даёт референциальную стабильность почти без когнитивной или рантайм-нагрузки. useCallback и useMemo — только когда значение реально динамическое и ребёнок выигрывает от стабильной идентичности.</p><h2>Меняет ли это React Compiler</h2><p>Один актуальный нюанс — <a href="https://react.dev/learn/react-compiler">React Compiler</a>. Документация описывает его как стабильный билд-тайм инструмент, который автоматически оптимизирует React-приложения и по умолчанию мемоизирует код на основе анализа и эвристик. Это уменьшает потребность в ручных useMemo, useCallback и React.memo, особенно в новом коде.</p><p>Но это не делает референциальную стабильность нерелевантной. Документация также отмечает, что useMemo и useCallback остаются полезными как escape hatch для случаев, когда разработчику нужен точный контроль — например, чтобы держать memoized-значение стабильным как зависимость для Effect. Так что даже в кодовых базах, переходящих на React Compiler, всё равно полезно понимать, как нестабильные ссылки влияют на ререндеры, результаты профайлера и кейсы, где ручной контроль ещё нужен.</p><h2>Итог</h2><p>Inline-объекты и inline-колбэки — не плохой React-код по умолчанию. Чаще всего это просто обычные JavaScript-выражения внутри JSX. Проблема появляется, когда они пересекают memoization-границу и вы ждёте, что React воспримет «то же значение» как «тот же пропс». По умолчанию React сравнивает пропсы и зависимости хуков через Object.is, поэтому для объектов и функций новой ссылки достаточно, чтобы React счёл значение изменившимся.</p><p>Этот паттерн заслуживает большего внимания, чем обычно получает. Это не пустяковая микрооптимизация. Это один из самых простых способов случайно обнулить React.memo — особенно в фильтруемых списках, дашбордах, search-heavy UI и компонентных деревьях с дорогими потомками. Код выглядит чистым, приложение работает, но оптимизация, на которую вы рассчитывали, исчезает.</p><p>Практический вывод для команд, строящих быстрые React-интерфейсы: <b>профилируй сначала</b>. Если memoized поддерево всё ещё ререндерится слишком часто — проверь пропсы прежде, чем винить React. Перенеси статичные объекты из render-пути. Мемоизируйте колбэки только тогда, когда ребёнок реально выигрывает. Используй React DevTools и Why Did You Render, чтобы подтвердить, что именно изменилось и почему. Делай это последовательно — и React.memo перестанет быть декоративным куском кода и начнёт делать свою работу.</p><p>Источник: <a href="https://blog.logrocket.com/react-pattern-everyone-uses-kills-performance/">The React pattern everyone uses that quietly kills performance — LogRocket Blog</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python в апреле: Packaging Council, GC-реверт, Astral в OpenAI</title>
      <link>https://tproger.ru/news/python-v-aprele-sovet-po-upakovke-revert-gc-i-astral-pod-opena</link>
      <comments>https://tproger.ru/news/python-v-aprele-sovet-po-upakovke-revert-gc-i-astral-pod-opena?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/python-v-aprele-sovet-po-upakovke-revert-gc-i-astral-pod-opena</guid>
      <description><![CDATA[<p>Главные события Python в апреле 2026: PEP 772 принят, появился Packaging Council. Инкрементальный GC откатывают в 3.14.5. OpenAI приобрёл Astral. Разбираем главное.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/python-v-aprele-sovet-po-upakovke-revert-gc-i-astral-pod-opena">Python в апреле: Packaging Council, GC-реверт, Astral в OpenAI</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 04 May 2026 17:18:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Прошедший месяц в Python-экосистеме оказался редким по плотности институциональных изменений. Python Steering Council 16 апреля принял <a href="https://peps.python.org/pep-0772/">PEP 772</a> — у языка впервые появился отдельный избранный совет по упаковке: пять человек с тем же уровнем полномочий, что и сам Steering Council, но узкоспециализированных. В тот же день core-команда откатила инкрементальный сборщик мусора, который ввели в Python 3.14, — продакшен показал рост памяти до 5 раз. А компания Astral со своими uv и Ruff перешла под крыло OpenAI: 126 миллионов скачиваний uv в месяц теперь под чужим контролем.</p><p>Разбираем главные события апреля 2026 — что меняется для тех, кто пишет на Python, мейнтейнит библиотеки или поддерживает прод-инфраструктуру.</p><p><b>PEP 772 принят.</b> Python получил избранный Packaging Council из пяти человек с двухлетними сроками — теперь у решений про pip, setuptools и PyPI есть формальный орган, не зависящий от PyPA.</p><p><b>Инкрементальный GC откатывают.</b> В 3.14.5 и 3.15 вернётся старый поколенческий сборщик. Память на проде росла до 5×, а паузы 26 мс vs 1,3 мс этого не оправдывали.</p><p><b>OpenAI приобрёл Astral.</b> Создатели uv, Ruff и type-checker ty теперь под OpenAI. Лицензии открытые — форк остаётся страховочным механизмом.</p><p><b>PEP 803 принят.</b> Появится abi3t — стабильный ABI для free-threaded билдов, цель Python 3.15. Решает «wheel-explosion» для Cryptography, SciPy, Pydantic.</p><p><b>Python 3.15.0 beta 1.</b> Первая бета и feature-freeze назначены на 5 мая. После этой даты в 3.15 уже не попадут новые PEP-ы.</p><h2>PEP 772: у Python появился Packaging Council</h2><p>16 апреля Python Software Foundation и Steering Council одобрили <a href="https://peps.python.org/pep-0772/">PEP 772</a> — учреждение Packaging Council из пяти человек, выбираемых голосующими членами PSF. Полномочия совета сравнимы со Steering Council, но узкоспециализированы: стандарты упаковки, инструменты вроде pip и setuptools, эксплуатация PyPI.</p><p>До этого момента Python Packaging Authority (PyPA) координировала упаковочные решения неформально, через делегирование от Steering Council по PEP 609. На практике это значило, что любое крупное изменение в pip или PyPI требовало согласования через несколько групп без чёткого мандата. Совет получает прямые полномочия и работает на двухлетних сроках с шахматным переизбранием — две и три позиции ротируются в разных циклах, чтобы сохранять преемственность.</p><p>Главное последствие — упаковочные вопросы перестают зависать в комитете. По формулировке PEP, решения принимаются консенсусом, как и в Steering Council, но при необходимости совет может действовать голосованием. На повестке у нового органа уже стоят темы вроде упаковки в эпоху LLM-зависимостей и стандартизации lockfile-формата.</p><h2>Реверт инкрементального GC в Python 3.14.5</h2><p>В тот же день, 16 апреля, релиз-менеджер Hugo van Kemenade предложил откатить инкрементальный сборщик мусора, дебютировавший в Python 3.14, и core-команда согласилась. Реверт войдёт в 3.14.5 и 3.15 до feature-freeze.</p><p>Тестирование на продакшене у Neil Schemenauer показало интересную картину. Максимальные паузы инкрементального коллектора действительно упали с 26 мс до 1,3 мс — то самое, ради чего его и вводили. Но пиковое потребление памяти выросло до 5× baseline, а суммарное время выполнения задач увеличилось из-за дополнительной бухгалтерии. Для веб-приложений, дата-пайплайнов и батч-задач длинные паузы — не главная проблема. Память — главная.</p><p>Необычная часть истории — что ревёрт идёт в патч-релизе 3.14.5. На цикле релиза 3.14 предположение было, что инкрементальный GC обоснован. Откат показывает, что «прошёл бенчмарк-сьют» и «работает в проде» — это не одно и то же. Если ваши деплои на 3.14 жгут заметно больше памяти, чем на 3.13, теперь понятно почему. Core-команда не закрывает инкрементальный подход насовсем — вернуться к нему могут в 3.16, но через полноценный PEP-процесс, который оригинальная реализация пропустила.</p><h2>OpenAI приобрёл Astral — uv, Ruff и ty переходят к ChatGPT-вендору</h2><p>В конце марта OpenAI <a href="https://openai.com/index/openai-acquires-astral/">объявил о покупке Astral</a> — компании-разработчика uv, Ruff и type-checker ty. Новость прокатилась по сообществу в апреле, когда разработчики начали считать масштаб сделки. uv в начале года перешагнул отметку в 126 миллионов скачиваний в месяц, Ruff давно стал линтером по умолчанию для существенной доли современных Python-проектов. Перенос обоих инструментов под OpenAI — ощутимый сдвиг в том, кто контролирует критическую инфраструктуру Python.</p><p>Реакция Simon Willison — «осторожно-оптимистичная»: команде Astral можно доверять прямо сейчас, но «product+talent acquisition может со временем превратиться в чисто talent-only». Структурная страховка — открытые лицензии: форк остаётся жизнеспособным запасным вариантом, если будущие владельцы решат развернуть стратегию.</p><p>Первый полный месяц после поглощения прошёл «скучно в хорошем смысле»: uv выпустил патчи 0.11.3–0.11.7, Ruff — 0.15.9–0.15.11, ни один проект курса не сменил. Если кто-то опасался резкого крена в сторону интеграции только с Codex — этого не произошло. На tproger мы <a href="https://tproger.ru/news/astral-zapuskaet-napravlenie-bezopasnosti-dlya-python-sozdateli">писали ранее</a> о том, как Astral в начале апреля запустила направление безопасности — теперь это инициатива внутри OpenAI.</p><h2>PEP 803: стабильный ABI для free-threaded Python</h2><p><a href="https://peps.python.org/pep-0803/">PEP 803</a> приняли 30 марта, цель — Python 3.15. Документ определяет abi3t — отдельный вариант стабильного ABI для free-threaded билдов. Это закрывает «wheel-explosion problem», на которую Cryptography, SciPy и Pydantic жалуются уже больше года.</p><p>Сейчас, чтобы расширение работало на free-threaded Python, мейнтейнерам приходится собирать отдельный wheel для каждой минорной версии каждого Python-релиза. Контракт обычного abi3 (собрал один раз — работает на любой 3.x) для free-threaded не работает: у этих билдов разные инварианты по потокобезопасности.</p><p>Цена стабильности — PyObject становится непрозрачным под abi3t. Расширения, которые сейчас лезут в поля PyObject напрямую, должны мигрировать на новые accessor-API из PEP 697 и PEP 793. Это реальный рефакторинг, но взамен — один wheel на много версий Python. Картинку дополняет FastAPI 0.136.0 от 16 апреля: теперь у фреймворка есть официальная поддержка Python 3.14t. Инфраструктурный слой для GIL-free Python зреет быстро.</p><h2>Что ещё стоило бы заметить</h2><ul><li><b>Python 3.15.0 beta 1 — 5 мая.</b> Альфа 8 от 7 апреля стала последней. Бета означает feature-freeze: новые PEP-ы в 3.15 после 5 мая уже не попадут.</li><li><b>JIT в 3.15 быстрее.</b> На x86-64 Linux замеры показывают +6–7%, на AArch64 macOS — +12–13% по сравнению с tail-calling-интерпретатором из 3.14.</li><li><b>PEP 829 (черновик).</b> Barry Warsaw предложил .start-файлы как замену .pth для startup-хуков пакетов. Старый формат позволяет произвольное исполнение кода при импорте — известный supply-chain-вектор.</li><li><b>Polars 1.40.0 (18 апреля).</b> Streaming-движок дотянули до групповых AsOf-join, статистики (cov, corr, skew, kurtosis, entropy) и strptime; добавили lock-free memory manager со spill-to-disk.</li><li><b>Starlette 1.0 (22 марта).</b> ASGI-фундамент FastAPI наконец стабилен: API теперь не сломается без мажорного релиза.</li><li><b>Gemma 4 day-one в Python.</b> 2 апреля Google открыл веса (2B/4B/31B + 26B MoE). Transformers 5.5.0, vLLM 0.19, Ollama 0.21 — всё с поддержкой в день релиза.</li><li><b>Jazzband сворачивается.</b> Площадка коллективного мейнтейнинга 84 проектов закрывается до конца 2026 года. Причины — «slopocalypse» (поток AI-сгенерированных PR-ов) и выгорание единственного админа.</li></ul><h2>Выводы</h2><p>Апрель 2026 ощутимо сдвинул сразу два слоя Python-экосистемы. Управленческий — у языка появился второй формальный орган, конкретно отвечающий за упаковку, что давно просили десятки участников. Техническая прод-сторона — команда призналась, что инкрементальный GC из 3.14 не проходит проверку реальностью, и откатила его. На фоне этого поглощение Astral смотрится как индустриальный сигнал: ключевая Python-инфраструктура мигрирует в орбиту крупных AI-вендоров, и сообществу остаётся следить, не превратится ли «product+talent» в «talent-only».</p><p>Если поддерживаете C-расширение — следите за abi3t и API-миграцией под PEP 697/793. Если деплоите на 3.14 — планируйте обновление до 3.14.5, как только она выйдет. И если вы в принципе следите за Python — стоит разово посмотреть на состав будущего Packaging Council: пять человек впервые получают мандат принимать решения за всех нас.</p><p>Источник: <a href="https://realpython.com/python-news-may-2026/">Python News — Real Python</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>В llama.cpp предложили поддержку MTP — Qwen3.6 27B быстрее в 2,4 раза</title>
      <link>https://tproger.ru/news/v-llama-cpp-smerzhili-mtp-dekoding-qwen3-6-27b-stal-v-2-4-raza</link>
      <comments>https://tproger.ru/news/v-llama-cpp-smerzhili-mtp-dekoding-qwen3-6-27b-stal-v-2-4-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-llama-cpp-smerzhili-mtp-dekoding-qwen3-6-27b-stal-v-2-4-raza</guid>
      <description><![CDATA[<p>В llama.cpp предложили поддержку Multi Token Prediction. Qwen3.6 27B Q8_0 ускорился с 7 до 16–22 ток/с, accept rate 72%. Разбираем PR, бенчмарки, как запустить.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-llama-cpp-smerzhili-mtp-dekoding-qwen3-6-27b-stal-v-2-4-raza">В llama.cpp предложили поддержку MTP — Qwen3.6 27B быстрее в 2,4 раза</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 04 May 2026 17:18:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик am17an <a href="https://github.com/ggml-org/llama.cpp/pull/22673">открыл PR #22673 в llama.cpp</a> с поддержкой MTP-голов: дополнительные слои модели предсказывают следующие три токена, а основной forward-pass проверяет их одним проходом. На Qwen3.6 27B при 8-битной квантизации режим даёт стабильные 16–22 токенов в секунду против 7 на baseline — ускорение в 2,4 раза.</p><p>MTP (Multi Token Prediction) — техника, <a href="https://arxiv.org/abs/2404.19737">предложенная исследователями Meta в апреле 2024</a>: рядом с основной языковой моделью обучаются дополнительные головы, предсказывающие следующие 1–3 токена напрямую. Широкое применение в production-LLM пришло с DeepSeek-V3, а <a href="https://tproger.ru/news/alibaba-otkryla-vesa-qwen3-6-35b-a3b-moe-model-s-1m-konteksta">Qwen3.6</a> поддерживает архитектуру из коробки. До PR #22673 при экспорте в GGUF эти головы терялись. Теперь они подтягиваются как отдельная под-модель внутри того же файла и работают как драфтер для спекулятивного декодинга.</p><p><b>Что добавили.</b> Поддержку Multi Token Prediction в llama.cpp — флаг --spec-type mtp запускает спекулятивный декодинг через MTP-головы модели.</p><p><b>Скорость.</b> Qwen3.6 27B Q8_0 — 16–22 ток/с против 7 ток/с baseline. Ускорение в 2,2–2,4 раза в зависимости от типа задачи.</p><p><b>Accept rate.</b> При --spec-draft-n-max 3 — 72,2% угаданных токенов в среднем; при n-max 2 — 82,6% (короче драфт, выше попадание).</p><p><b>Совместимость.</b> Подтверждены Qwen3.6 27B и Qwen3.6 35BA3B; по заявлению автора, режим работает на любой модели с MTP-головами.</p><p><b>Где взять.</b> Готовый GGUF с MTP-головой для Qwen3.6 27B автор приложил к PR — отдельный файл скачивать не нужно, всё в одном.</p><h2>Что такое Multi Token Prediction</h2><p>Стандартный авторегрессионный декодинг генерирует токены последовательно: сгенерировал — пересчитал контекст — сгенерировал следующий. Это упирается в латентность памяти: каждый токен требует одного полного прохода через модель, и с ростом её размера падает скорость генерации.</p><p>Спекулятивный декодинг ускоряет процесс через идею «угадай и проверь»: маленькая черновая модель быстро генерирует несколько токенов вперёд, а большая основная модель проверяет их одним пакетным проходом. Принятые токены остаются, отвергнутые перегенерируются. Если черновик угадал — экономия в разы.</p><p>MTP идёт дальше: вместо двух разных моделей (большая + черновая) одна и та же модель обучается предсказывать сразу несколько следующих токенов через дополнительные параллельные головы. Концепция вышла из <a href="https://arxiv.org/abs/2404.19737">статьи Meta «Better &amp; Faster Large Language Models via Multi-token Prediction»</a> (Gloeckle и соавторы, апрель 2024), массовое применение в production-LLM пришло с DeepSeek-V3. Главное преимущество — не нужно держать в памяти отдельную draft-модель.</p><h2>Бенчмарки am17an на Qwen3.6 27B</h2><p>Автор PR прогнал девять синтетических задач — генерация Python-кода, C++-кода, объяснение концепций, суммаризация, факто-QA, перевод, креативные тексты, пошаговая математика и длинный код-ревью. Замеры с одной моделью и одним GPU (см. <a href="https://gist.github.com/am17an/228edfb84ed082aa88e3865d6fa27090">gist с бенчмарком</a>):</p><ul><li><b>Baseline без спекулятивного декодинга:</b> 7,0–7,7 ток/с, агрегат 201 секунда на 1404 токена.</li><li><b>MTP, n-max 3</b> (3 драфт-токена за шаг): 13,9–21,6 ток/с, accept rate 72,2%, 83,8 с — ускорение в 2,4 раза.</li><li><b>MTP, n-max 2:</b> 15,2–18,2 ток/с, accept rate 82,6%, 90,4 с — короче драфт, но выше доля принятых.</li><li><b>Draft-модель Qwen3.5 0.8B, n-max 16:</b> для сравнения с классическим speculative decoding — 12,7–47,7 ток/с, accept rate 67,7%, 81,4 с.</li></ul><p>На фактической QA («ответь точно») draft-модель догоняет MTP по скорости — accept rate подскакивает до 99,4%, — но на креативных и аналитических задачах MTP стабильнее: меньше провалов на нестандартных формулировках.</p><h2>Как запустить</h2><p>После сборки llama.cpp из ветки PR запуск сервера с MTP выглядит так:</p><p>Ключевой флаг — --spec-type mtp. --spec-draft-n-max 3 задаёт длину драфта; для большинства моделей оптимум — 2 или 3.</p><p>Готовый GGUF с MTP-головами для Qwen3.6 27B автор приложил к PR. Конвертация других MTP-моделей идёт через обновлённый convert_hf_to_gguf.py из той же ветки.</p><h2>MTP против обычного спекулятивного декодинга</h2><p>Классическая схема speculative decoding в llama.cpp требует двух GGUF-файлов: основной модели и небольшой черновой (например, Qwen3.5 0.8B как драфт для Qwen3.6 27B). Это удваивает требования к памяти и усложняет деплой — нужно следить, чтобы токенизаторы у обеих моделей совпадали. MTP убирает оба ограничения: дополнительные головы лежат в том же GGUF-файле, что и основная модель, токенизация заведомо одна. По бенчмаркам автора MTP-режим стабильнее по задержке, а draft-модель может выстрелить выше пика на специфичных задачах вроде QA, где её предсказания проще.</p><p>В обсуждении PR мейнтейнер ngxson отметил, что предыдущие попытки добавить MTP опирались на постоянное копирование данных между host и device — основной автор am17an обошёл это через отдельный hook для распространения скрытых признаков между ubatch-ами.</p><blockquote>Свежий старт лучше моего WIP #18886 — другие попытки добавить MTP сильно полагались на копирование данных host ↔ device. Похоже, у тебя это решено?</blockquote><h2>Чек-лист для тех, кто хочет попробовать</h2><ol><li>Склонировать <a href="https://github.com/ggml-org/llama.cpp">репозиторий llama.cpp</a> и переключиться на ветку PR #22673 (или дождаться мерджа в master).</li><li>Собрать с CUDA или Metal-бэкендом — режимы для CPU работают, но без значимого ускорения.</li><li>Скачать GGUF с MTP-головой: qwen3.6-q8_0-mtp.gguf, ссылка приложена в PR.</li><li>Запустить llama-server с флагами --spec-type mtp --spec-draft-n-max 3.</li><li>Сравнить токены в секунду с baseline (без флагов спекулятивного декодинга) — на Qwen3.6 ожидается рост в 2–2,5 раза.</li></ol><h2>Выводы</h2><p>После мерджа PR локальный запуск Qwen3.6 27B приближается по задержке к облачным API: разница в ответе на коде и аналитике сокращается с десятков секунд до считанных. Для MoE-вариантов вроде Qwen3.6 35BA3B экономия видеопамяти от MTP особенно полезна — ту же скорость теперь можно получить на одной серверной карте, не запуская параллельно отдельную draft-модель.</p><p>Если пишете инструменты вокруг локальных LLM — обновитесь после мерджа PR в master. Тем, кто использует облачные модели только из-за скорости, имеет смысл проверить, не закрывает ли Qwen3.6 + MTP их сценарий. У нас уже выходил отдельный <a href="https://tproger.ru/news/zapuskaem-llm-lokalno-cherez-ollama-gajd-ot-ustanovki-do-claude">гайд по запуску LLM локально через Ollama</a> — он пригодится, если вы только подбираете инструменты.</p><p>Источники: <a href="https://github.com/ggml-org/llama.cpp/pull/22673">PR #22673 в llama.cpp</a>, <a href="https://gist.github.com/am17an/228edfb84ed082aa88e3865d6fa27090">бенчмарки am17an</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Сравнение гибридных языковых моделей класса 9B для промышленного инференса</title>
      <link>https://tproger.ru/articles/sravnenie-gibridnyh-yazykovyh-modelej-klassa-9b-dlya-promywlennogo</link>
      <comments>https://tproger.ru/articles/sravnenie-gibridnyh-yazykovyh-modelej-klassa-9b-dlya-promywlennogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Ходыкин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sravnenie-gibridnyh-yazykovyh-modelej-klassa-9b-dlya-promywlennogo</guid>
      <description><![CDATA[<p>В материале сравниваются три открытые гибридные модели класса 9B (NVIDIA Nemotron‑Nano‑9B‑v2, Bamba‑9B‑v2, Qwen3.5‑9B) с референсной плотной Llama 3.1 8B. На основе моделирования под нагрузкой 4096 входных и 256 выходных токенов на одном H200</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sravnenie-gibridnyh-yazykovyh-modelej-klassa-9b-dlya-promywlennogo">Сравнение гибридных языковых моделей класса 9B для промышленного инференса</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[GPU]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 30 Apr 2026 09:07:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Выбор языковой модели с 8–9 млрд параметров для задач промышленного инференса — инженерная задача, требующая учёта нескольких факторов. Модель должна работать на ограниченном парке ускорителей, обеспечивать приемлемую задержку и показывать достаточное качество на таких задачах, как чат-боты, саммаризация документов, генерация кода и аналитика длинных контекстов. Классический подход — использование проверенной плотной модели Llama 3.1 8B — даёт стабильный результат, однако упирается в расход памяти на KV‑кеш, что ограничивает число одновременно обслуживаемых запросов.</p><p>Альтернативой выступают гибридные архитектуры, в которых традиционное внимание чередуется с более экономичными механизмами: Mamba‑2, Gated DeltaNet. Разработчики этих моделей заявляют о радикальном снижении потребления памяти и повышении пропускной способности без потери качества. В данном материале рассматриваются три открытые гибридные модели — NVIDIA Nemotron‑Nano‑9B‑v2, Bamba‑9B‑v2 (IBM) и Qwen3.5‑9B (Alibaba) — и сравниваются с референсной плотной моделью Llama 3.1 8B.</p><p><b>Методика моделирования</b></p><p>Моделирование проводилось для одного ускорителя NVIDIA H200 с 141 ГБ видеопамяти при типичной нагрузке: 4096 входных токенов и до 256 выходных. Рассчитывались следующие метрики: память на один экземпляр с учётом весов, оверхеда и KV‑кеша (Instance VRAM); полное время ответа (E2E Latency); пропускная способность одного экземпляра в запросах в секунду (RPS per replica); требуемый объём памяти на единицу пропускной способности (VRAM/RPS); максимальное число параллельных запросов, ограниченное исключительно памятью. Расчёты верифицировались с помощью расширенного симулятора InferSim и по данным публичных бенчмарков.</p><p><b>Результаты</b></p><figure><img src="https://media.tproger.ru/user-uploads/137657/2026-04-30/213cf68a-3c91-4545-a4f4-ebba0d3f8bfe.webp" alt="" /><figcaption>Результаты моделирования относительно референсной Llama 3.1 8B</figcaption></figure><p><b>Особенности производительности моделей</b></p><p>Разница на порядок по KV-cashe у Nemotron обусловлена архитектурой. Модель содержит 56 слоёв, из которых лишь четыре используют полноценное внимание с KV‑кешем, а остальные 52 — сверхбыстрые Mamba‑2‑блоки. Mamba‑2 работает как рекуррентная сеть: вместо хранения растущей таблицы ключей и значений для каждого токена она обновляет компактное скрытое состояние фиксированного размера. В результате для запроса длиной 4096 + 256 токенов KV‑кеш Nemotron занимает около 68 МБ — примерно в восемь раз меньше, чем у Llama. Именно поэтому модель способна удерживать в памяти почти 2000 одновременных запросов; узким местом становится не память, а вычислительная мощность GPU.</p><p>Архитектура Qwen3.5 построена на чередовании Gated DeltaNet и Gated Attention. Большинство слоёв использует механизм линейного внимания, который подобно Mamba‑2 оперирует скрытым состоянием постоянного размера, не порождая тяжёлого KV‑кеша. Однако у этого подхода есть обратная сторона: Gated DeltaNet работает последовательно, послойно обновляя внутреннее состояние, и плохо утилизирует матричные вычисления GPU. На коротких дистанциях классический Attention с его эффективным матричным умножением способен загрузить видеокарту почти полностью, тогда как GDN‑слои проигрывают в чистой скорости. В результате TTFT у Qwen3.5 для 4096 токенов составляет 1.86 с против 1.32 с у Llama. На очень длинных контекстах (100K токенов и выше) ситуация меняется: классический KV‑кеш становится тормозом, а Gated DeltaNet продолжает работать с прежней эффективностью.</p><p><b>О качестве и специализации моделей</b></p><p>Каждая из рассмотренных моделей имеет собственную нишу, определяемую не только скоростью, но и метриками качества.</p><p>Llama 3.1 8B — референсная плотная модель. Показывает 69.4% на MMLU и 72.6% на HumanEval. Это проверенный универсал для задач, где важна предсказуемость и стабильность, а не максимальная производительность.</p><p>Nemotron‑Nano‑9B‑v2 позиционируется как математик и кодер. По данным NVIDIA, модель достигает 72.1% на AIME25, 97.8% на MATH500, 64.0% на GPQA Diamond и 71.1% на LiveCodeBench. Эти результаты делают её сильнейшим вариантом для задач, требующих точных вычислений и генерации корректного кода.</p><p>Qwen3.5‑9B является универсальным «эрудитом». Модель превосходит GPT‑OSS‑120B по MMLU‑Pro (82.5%) и GPQA Diamond (81.7%), а также показывает 83.2% на HMMT. Высокое качество на широком спектре тестов позволяет использовать её в сценариях, где важны широкий кругозор и точность ответов.</p><p>Bamba‑9B‑v2 — быстрый универсал, превосходящий Llama 3.1 8B по среднему баллу OpenLLM v2. Она не специализируется на одной задаче, но обеспечивает хорошее качество при заметно более высокой скорости.</p><p><b>Рекомендации</b></p><ul><li>Для чат-ботов и потоковой обработки с высокой пропускной способностью оптимален Nemotron‑Nano‑9B‑v2 — он в полтора раза быстрее Llama и примерно на 30% эффективнее использует память (VRAM/RPS 45.8 против 65.0 ГБ·с).</li><li>Для саммаризации, аналитики документов и агентных систем, где во главе угла широкий кругозор и качество ответа, лучше подходит Qwen3.5‑9B.</li><li>Bamba‑9B‑v2 занимает промежуточную позицию: она даёт заметный прирост скорости при сопоставимом с Llama объёме памяти и может использоваться как универсальный инструмент.</li></ul><p><b>Заключение</b></p><p>Большие языковые модели по‑прежнему требуют значительных вычислительных ресурсов. Однако прогресс в архитектурах — Mamba‑2, Gated DeltaNet — шаг за шагом снижает стоимость владения: на одном H200 теперь можно обслужить заметно больше клиентов, чем год назад. Выбор модели перестаёт быть гаданием по маркетинговым обещаниям и превращается в инженерную задачу с чёткими метриками.</p><p>Автор продолжает калибровку симулятора на реальных замерах и готов делиться обновлёнными данными. Читатели, имеющие опыт промышленного развёртывания этих или аналогичных моделей, приглашаются к обсуждению.</p>]]></content:encoded>
    </item>
    <item>
      <title>Box в Rust: как уменьшить память программы с 895 до 420 МБ</title>
      <link>https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb</link>
      <comments>https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb</guid>
      <description><![CDATA[<p>Перевод dystroy.org: как заменой Option на Option&gt; и кастомным Deserializer уменьшить память Rust-программы с 895 до 420 МБ. Читайте разбор с кодом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb">Box в Rust: как уменьшить память программы с 895 до 420 МБ</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 27 Apr 2026 10:54:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваши Rust-структуры с Option&lt;BigStruct&gt; заполнены процентов на 20–30 — следующие 5 минут вероятно вернут вам сотни мегабайт RAM. Разработчик <a href="https://dystroy.org/">Дени «Canop» де Майе</a> (автор файлового менеджера <a href="https://github.com/Canop/broot">broot</a>) сократил потребление памяти своей программы <b>с 895 МБ до 420 МБ — это минус 475 МБ</b>. Изменил только layout структур и стратегию десериализации serde. Перевод <a href="https://dystroy.org/blog/box-to-save-memory/">его статьи</a> с пояснениями.</p><p>Главная идея: в Rust поле типа Option&lt;BigStruct&gt; занимает <i>столько же</i>, сколько BigStruct — даже когда оно None. Чтобы пустое поле «весило одно слово», нужно обернуть значение в Box. Компилятор тогда применяет niche-оптимизацию (использует нулевой указатель как маркер None) — Option&lt;Box&lt;T&gt;&gt; весит ровно как один указатель. На задачах с массой опциональных полей это даёт двукратное сокращение памяти.</p><ul><li>Кейс: десериализация всех JSON-моделей AWS SDK (Smithy Shapes) через serde в Rust</li><li>Было: 895 МБ. Стало: 420 МБ. Экономия 475 МБ (-53%)</li><li>Изменения: только layout структур + кастомный Deserializer для пустых полей</li><li>Ключевая мысль: Option&lt;Big&gt; ≠ Option&lt;Box&lt;Big&gt;&gt; по памяти</li><li>Niche-оптимизация компилятора: Option&lt;Box&lt;T&gt;&gt; весит как один указатель</li><li>Verification: jemalloc через feature-флаг profile, замер до/после загрузки</li><li>Цена: десериализация чуть дороже по CPU (значение всё равно создаётся, потом отбрасывается)</li></ul><h2>Реальный кейс</h2><p>Программа автора десериализует все JSON-файлы из репозитория <a href="https://github.com/awslabs/aws-sdk-rust/tree/main/aws-models">awslabs/aws-sdk-rust/aws-models</a> в структуры «Smithy Shape». Эти файлы содержат тысячи объявлений вроде такого:</p><p>Как принято в Rust-коде, для разбора используется serde. Соответствующие структуры выглядят естественно — это обычная вложенность структур со множеством опциональных полей и serde-атрибутов. Не нужно вчитываться в код: обратите внимание только на сами имена полей и на россыпь Option&lt;...&gt;:</p><p>Это типичный для Rust код. Но именно такой layout приводит к тому, что после десериализации структуры занимают 895 МБ. При этом анализ показывает: большинство опциональных строк отсутствуют — это и стало рычагом для радикального сокращения объёма. Чтобы понять механизм, нужен короткий теоретический отступ.</p><h2>Как устроены структуры в памяти Rust</h2><p>На 64-битной платформе одно «слово» — это 8 байт. Например, столько занимает usize.</p><p>Тип String занимает 3 слова: указатель на буфер, длину и ёмкость (capacity). Это <b>24 байта</b> на сам тип String (проверить можно через dbg!(std::mem::size_of::&lt;String&gt;())) — не считая место под содержимое строки на heap. Подробности в <a href="https://doc.rust-lang.org/std/string/struct.String.html">документации Rust</a>.</p><p>Существует niche-оптимизация компилятора: Option&lt;String&gt; весит столько же, сколько String. Дополнительный байт под пометку «это None» не нужен — пустое значение определяется по нулевому указателю.</p><p>Поэтому такая структура, когда все строки None, занимает ровно <b>120 байт</b> (5 × 24):</p><h3>Композиция структур</h3><p>Дальше — самое важное. Что будет, если такая структура встроена в другую? Пусть это будет Container1, у которой одно поле Option&lt;String&gt; и одно — SmithyServiceTrait:</p><p>Размер Container1 — 24 + 120 = 144 байта: 24 под Option&lt;String&gt; и 120 под SmithyServiceTrait. А что, если поле trait сделать опциональным — на случай, когда trait отсутствует?</p><p>Сколько занимает Container2, когда оба поля None? <b>Те же 144 байта.</b> Опциональность ничего не сэкономила: место под структуру уже зарезервировано в layout родителя, и компилятор всё равно держит его готовым. Везёт ещё, что внутри SmithyServiceTrait только поля Option&lt;String&gt; — это позволяет компилятору не добавлять дополнительный байт-discriminant для внешнего Option.</p><p>Применив эту арифметику к SmithyTraits, видно, почему наивная реализация так разбухает в памяти.</p><h3>Почему в Java и других языках с GC такой проблемы нет</h3><p>В языках с reference-семантикой полей композиция работает иначе. Когда у класса Container есть поле-объект, это поле — указатель на heap. Если поле null, оно занимает только одно слово.</p><p>Чтобы добиться того же поведения в Rust — то есть чтобы пустое поле занимало одно слово, — нужно явно вынести содержимое на heap, обернув в Box:</p><p>Теперь, когда оба поля None, Container3 занимает всего <b>32 байта</b>: 3 слова под Option&lt;String&gt; и одно слово под Option&lt;Box&lt;...&gt;&gt;. Та же niche-оптимизация работает и здесь: Option&lt;Box&lt;...&gt;&gt; весит столько же, сколько голый Box&lt;...&gt;.</p><h2>Что именно поменялось</h2><p>Изменение свелось к трём шагам:</p><ol><li>Найти структуры, которые часто оказываются «пустыми» (все поля — None).</li><li>Сделать их опциональными в родительской структуре, переместив на heap через Box.</li><li>Написать кастомный Deserializer, чтобы пустые структуры вообще не попадали в результат.</li></ol><p>Было:</p><p>Стало:</p><p>Аналогично, в SmithyShape все поля Option&lt;SmithyReference&gt; заменены на Option&lt;Box&lt;SmithyReference&gt;&gt;. Местами пришлось поправить акцессоры, потому что путь к данным удлинился на одну разыменовку. И всё — память на хранение десериализованных AWS-shape снизилась вдвое, экономия 475 МБ.</p><h3>Подводные камни</h3><ul><li><b>CPU чуть дороже.</b> Десериализация полного объекта всё равно происходит — а потом он отбрасывается, если оказался пустым. Парадокс: суммарно задача стала <i>быстрее</i>, потому что меньше памяти = меньше работы аллокатора, меньше TLB-промахов, лучше попадания в L2/L3-кеш. На больших объёмах эти эффекты перевешивают накладные расходы на лишний разбор.</li><li><b>Фрагментация heap.</b> Много мелких Box ведёт к фрагментированной куче. В авторском случае это не было проблемой, но в долгоживущих сервисах — стоит держать в уме.</li></ul><h2>Как проверить, что экономия реальная</h2><p>Чутьё подсказывает, где можно сэкономить и сколько примерно. Но без замеров — не работа. В Rust нет простого способа узнать, сколько весит композитный объект со всеми полями и аллокациями за указателями. Решение автора — использовать аллокатор, умеющий отдавать статистику. В стандартной поставке такие данные ограничены, поэтому подключается <a href="https://github.com/tikv/jemallocator">jemalloc</a>:</p><p>В Cargo.toml объявляется feature-флаг profile, чтобы не таскать jemalloc в обычные сборки:</p><p>В main.rs аллокатор подключается под этим же флагом:</p><p>И в самой функции загрузки структур делается замер: до и после.</p><p>Совет автора: tikv_jemalloc_ctl отдаёт ещё кучу деталей, которые полезно мониторить в серверных приложениях.</p><h2>Что запомнить из статьи</h2><ul><li>Применяйте Option&lt;Box&lt;T&gt;&gt; только там, где поле пусто в большинстве случаев — иначе heap-fragmentation и разыменовка перевесят выигрыш.</li><li>Размер типа узнать просто: std::mem::size_of::&lt;T&gt;(). Реальное потребление с heap — только через jemalloc-ctl, dhat-rs или heaptrack.</li><li>Niche-оптимизация работает не для всего: String, Box, Vec, &amp;T — да; кастомный enum без явных #[repr] — обычно нет.</li><li>При desered-через-serde: голая замена типа на Option&lt;Box&gt; не даёт выигрыша — нужен кастомный Deserializer, который вернёт None для «пустых» структур.</li><li>Перед оптимизацией — всегда замер. После оптимизации — снова замер. Без цифр это карго-культ.</li></ul><h2>От редакции</h2><p>Один практический совет от редакции: чтобы быстро найти кандидатов на оптимизацию в большом проекте, прогоните код через <a href="https://github.com/nnethercote/dhat-rs">dhat-rs</a> — это профайлер аллокаций от автора «Rust Performance Book». Он покажет, какие типы съедают больше всего heap. Альтернатива Option&lt;Box&lt;T&gt;&gt; — <a href="https://docs.rs/bumpalo/">arena-аллокаторы</a> вроде bumpalo: если вся группа объектов живёт один пакетный жизненный цикл, разовый bump-аллокатор может оказаться эффективнее множества мелких Box.</p><p>Если интересна тема Rust в крупных продакшенах, у Tproger есть свежий материал про то, как <a href="https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro">WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</a> — там тоже про экономию памяти и скорость, только в другом масштабе.</p><p>Источник: <a href="https://dystroy.org/blog/box-to-save-memory/">«Box to save memory» — dystroy.org/blog</a>. Автор оригинала — <a href="https://dystroy.org/">Дени «Canop» де Майе</a>, разработчик файлового менеджера <a href="https://github.com/Canop/broot">broot</a> и других open-source утилит на Rust.</p>]]></content:encoded>
    </item>
    <item>
      <title>Аналоги Jira 2026: лучшие российские альтернативы для управления проектами и задачами</title>
      <link>https://tproger.ru/articles/analogi-jira-2026--luchwie-rossijskie-alternativy-dlya-upravleniya</link>
      <comments>https://tproger.ru/articles/analogi-jira-2026--luchwie-rossijskie-alternativy-dlya-upravleniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Герасимов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/analogi-jira-2026--luchwie-rossijskie-alternativy-dlya-upravleniya</guid>
      <description><![CDATA[<p>Чем заменить Jira в России? Сравнение аналогов: SimpleOne, Kaiten, YouGile. Функционал, цены, миграция данных. Пошаговый план по переходу для команд разработки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/analogi-jira-2026--luchwie-rossijskie-alternativy-dlya-upravleniya">Аналоги Jira 2026: лучшие российские альтернативы для управления проектами и задачами</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 23 Apr 2026 11:51:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вопрос о том, чем заменить Jira, остается одним из самых острых для российского ИТ-менеджмента. Для многих компаний перенос процессов из привычного австралийского трекера долгое время казался задачей, сопоставимой с остановкой непрерывного производства: риски высоки, а равноценную замену найти сложно. Бизнес привык к гибким JQL-запросам, сложным маршрутам согласований (workflow), десяткам установленных плагинов и тесной интеграции с Confluence и Bitbucket.</p><p>Но реальность 2026 года диктует свои условия. Использовать Jira через серые схемы оплаты, без официальной поддержки и с риском блокировки облака — это игра в русскую рулетку, в которую крупный бизнес играть не готов.</p><p>Хорошая новость заключается в том, что российский рынок систем управления разработкой совершил качественный скачок. Если несколько лет назад российский аналог Jira часто представлял собой базовую канбан-доску, то сегодня заказчикам доступны зрелые платформы. Современные решения способны справляться с Enterprise-нагрузками, поддерживать масштабируемые фреймворки (такие как SAFe или LeSS) и оркестрировать сложные процессы CI/CD.</p><p>В этой статье мы проведем объективный обзор топовых аналогов Jira, представленных на российском рынке. Мы сравним их функциональные возможности, удобство миграции, ценовую политику и поможем определить, какая замена Jira оптимально подойдет под задачи вашей команды</p><h2>Почему команды ищут замену Jira в 2026 году</h2><p>Помимо очевидных ограничений, связанных с доступом к сервисам Atlassian из России, существуют и глубокие архитектурные причины, побуждающие ИТ-директоров рассматривать альтернативные решения:</p><ol><li>Перегруженность системы. Инструмент, созданный 20 лет назад как баг-трекер, оброс таким количеством плагинов и настроек, что для управления им нужен отдельный штат администраторов.</li><li>Зависимость от плагинов (Франкенштейн-архитектура).  Чтобы настроить нормальный учет времени (Tempo), диаграммы Ганта (Structure) или управление тестовыми сценариями (Zephyr), нужны сторонние плагины. Они стоят денег, часто конфликтуют друг с другом после обновлений и не всегда дружат между собой.</li><li>Слабый фокус на продуктовый подход. В Jira вы живете в парадигме «Проектов». Если над одним большим продуктом работает 10 команд, вам придется городить сложную иерархию проектов и эпиков, чтобы просто понять, кто что делает.</li><li>Требования информационной безопасности. Для государственного сектора, финансовой отрасли и промышленных предприятий критически важно размещать данные внутри собственного защищенного контура (On-premise) и использовать программное обеспечение из Реестра отечественного ПО.</li></ol><p>Таким образом, альтернативы Jira сегодня выбирают не только из соображений импортонезависимости, но и ради получения более современного пользовательского опыта (UX), монолитной архитектуры без избытка плагинов и наличия необходимого функционала «из коробки».</p><h2>Топ-10 аналогов Jira для российского рынка</h2><p>Рассмотрим десять наиболее заметных решений на рынке, чтобы понять их позиционирование и целевую аудиторию.</p><h2>1. SimpleOne SDLC</h2><p><a href="https://simpleone.ru/sdlc?utm_source=jira_analogue_tproger_18_03" rel="nofollow">SimpleOne SDLC</a> — это аналог Jira для команд разработки. Комплексная Enterprise-платформа для управления всем жизненным циклом разработки ПО (Software Development Life Cycle), а не просто трекер задач. Решение изначально спроектировано под потребности крупного бизнеса и продуктовой разработки. В основе архитектуры платформы лежит «Продукт», что позволяет эффективно выстраивать работу множества команд.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/0e23acc7-d8d6-4fe3-ad71-add8ab74c898.webp" alt="" /><figcaption>Интерфейс SimpleOne SDLC</figcaption></figure><p><b>Для кого: </b>средний и крупный бизнес, корпорации, банки, финтех, а также компании, внедряющие масштабируемые Agile-фреймворки (например, SAFe).</p><h3>Соответствие Jira</h3><ul><li>Полная поддержка продуктовой иерархии: Портфель -&gt; Продукт -&gt; Модуль -&gt; Эпик -&gt; Фича -&gt; История -&gt; Дефект/Задача;</li><li>Нативные Agile-инструменты (Scrum, Kanban), управление спринтами и бэклогом;</li><li>Возможность настройки сложных рабочих процессов (workflow) визуальными средствами;</li><li>Наличие встроенного функционала, который в Jira требует плагинов: учет трудозатрат, ресурсное планирование, готовые дашборды (Burndown, CFD, Velocity).</li></ul><h3>Миграция из Jira</h3><p>Отработанный процесс автоматизированного переноса данных. Мигрируют пользователи, статусы, проекты, задачи с сохранением истории изменений, комментарии и вложенные файлы. Возможна бесшовная миграция с Jira на On-premise серверы заказчика.</p><h3>Плюсы</h3><ul><li>Low-code платформа: в отличие от жесткой архитектуры классических трекеров, в SimpleOne бизнес-аналитики могут изменять логику, формы и интерфейсы с помощью визуальных конструкторов;</li><li>Глубокая интеграция с ITSM: процессы разработки и технической поддержки (Service Desk) функционируют в единой среде. Инцидент, зарегистрированный в поддержке, конвертируется в задачу для разработчиков в один клик;</li><li>Продуктовый подход: структура платформы оптимальна для управления сложными продуктами, над которыми работают десятки кросс-функциональных команд;</li><li>Соответствие требованиям РФ: включено в реестр отечественного ПО.</li></ul><h3>Минусы</h3><ul><li>Избыточный функционал и высокий порог входа для небольших стартапов (до 15 человек);</li><li>Для получения максимальной отдачи от системы требуется определенный уровень зрелости процессов разработки в компании.</li></ul><h3>Тарифы</h3><p>Стоимость рассчитывается индивидуально в зависимости от масштаба внедрения (Enterprise-модель лицензирования, On-premise или SaaS).</p><h2>2. Kaiten</h2><p>Один из ведущих российских визуальных трекеров задач. <a href="https://kaiten.ru">Kaiten</a> делает ставку на обеспечение максимальной прозрачности процессов с помощью продвинутых Канбан-досок и системы рабочих пространств.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/d8257bc5-41ab-41f9-b31b-3afea2f7ebff.webp" alt="" /><figcaption>Интерфейс Kaiten</figcaption></figure><p><b>Для кого: </b>Agile-команды, продуктовые студии, ИТ-компании среднего размера, маркетинговые подразделения.</p><h3>Соответствие Jira</h3><ul><li>Полноценная поддержка Scrum (спринты, бэклог, оценка в Story Points) и Kanban (WIP-лимиты, классы обслуживания);</li><li>Иерархия задач реализуется через гибкие связи между карточками (эпики, истории);</li><li>Встроенный модуль работы с документами (альтернатива Confluence).</li></ul><h3>Миграция из Jira</h3><p>Реализован автоматизированный импорт данных из Jira, включая задачи, комментарии и структуру досок.</p><h3>Плюсы</h3><ul><li>Уникальная система пространств: на один экран можно вывести доски нескольких смежных команд, что идеально для выявления узких мест в общем потоке создания ценности;</li><li>Современный UX/UI: интуитивно понятный и «легкий» интерфейс, в котором приятно работать;</li><li>Быстрый старт: минимальное время на обучение сотрудников, команда может начать работу в первый же день;</li><li>Импортонезависимость: система включена в реестр ПО РФ.</li></ul><h3>Минусы</h3><ul><li>Ограниченные возможности для построения сложной, нестандартной бизнес-логики (workflow) по сравнению с Enterprise-платформами;</li><li>Отсутствие глубокого функционала для финансового и ресурсного управления сложными портфелями проектов.</li></ul><h3>Тарифы</h3><p>От 185 руб./пользователь/мес (до 15 пользователей). Тариф стандарт (до 250 пользователей) — 430 руб./пользователь/мес. Доступен бесплатный тариф с базовыми функциями и On-premise версия для корпоративных заказчиков.</p><h2>3. YouGile</h2><p>YouGile — это инновационный гибрид классического таск-трекера и корпоративного мессенджера. Философия системы строится на том, что все рабочие коммуникации должны происходить строго в контексте конкретной задачи.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/ce17bd4d-ee5d-42c3-9c60-4ec49a24a141.webp" alt="" /><figcaption>Интерфейс YouGile</figcaption></figure><p><b>Для кого: </b>небольшие и средние ИТ-команды, digital-агентства, студии веб-разработки, где критически важна скорость коммуникации.</p><h3>Соответствие Jira</h3><ul><li>Базовый функционал представлен Agile-досками (колонки и стикеры);</li><li>Присутствуют инструменты учета времени, контроля дедлайнов и базовой отчетности;</li><li>Отсутствует строгая иерархия эпиков и продвинутое управление спринтами «из коробки» (реализуется преимущественно через систему тегов).</li></ul><h3>Миграция из Jira</h3><p>Доступен базовый импорт (задачи, исполнители), однако перенос сложной структуры и кастомных полей потребует ручной настройки.</p><p>Плюсы:</p><ul><li>Контекстное общение: полноценный чат внутри каждой задачи — эффективное решение проблемы потери информации в разрозненных мессенджерах;</li><li>Максимальная простота: интерфейс не перегружен лишними функциями, что способствует быстрому внедрению;</li><li>Бесплатный старт: полноценное бесплатное использование для микро-команд численностью до 10 человек.</li></ul><h3>Минусы</h3><ul><li>Не подходит для управления сложной продуктовой разработкой (отсутствуют модули управления релизами, CI/CD интеграции, учет технического долга);</li><li>Слабые возможности для автоматизации бизнес-процессов.</li></ul><h3>Тарифы</h3><p>Облачная версия — бесплатно до 10 пользователей, далее от 594 руб./мес за пользователя. Доступна коробочная версия (On-premise).</p><h2>4. ПланФикс</h2><p>Гибкая платформа-конструктор для настройки рабочих процессов. ПланФикс позволяет бизнес-пользователям самостоятельно смоделировать необходимую среду: от простой CRM до аналога сложного ИТ-трекера.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/367ec142-bcae-4eb4-b19e-6b8f9cee8944.webp" alt="" /><figcaption>Интерфейс ПланФикс</figcaption></figure><p>Для кого: команды и компании любого масштаба, располагающие ресурсами бизнес-аналитиков, готовых инвестировать время в детальную настройку системы под уникальные процессы.</p><h3>Соответствие Jira</h3><ul><li>Изначально система не специализируется на разработке ПО, но ее гибкость позволяет настроить Scrum-доски, спринты и бэклоги;</li><li>Поддержка любых кастомных полей, статусов и сложных сценариев автоматизации;</li><li>Наличие учета времени и диаграмм Ганта.</li></ul><h3>Миграция из Jira</h3><p>Реализуется через импорт CSV-файлов или настройку интеграции через открытый API. Готового автоматизированного коннектора для миграции не предусмотрено.</p><h3>Плюсы</h3><ul><li>Исключительная гибкость: платформа-конструктор позволяет настроить автоматизацию любой сложности без использования программного кода;</li><li>Единое цифровое пространство: возможность органично объединить управление разработкой, CRM и Service Desk в одном интерфейсе;</li><li>Экономичность: конкурентоспособная и прозрачная ценовая политика.</li></ul><h3>Минусы</h3><ul><li>Высокий порог входа: система представляет собой «чистый лист», требующий вдумчивого проектирования и длительной настройки;</li><li>Интерфейс может восприниматься как перегруженный;</li><li>Отсутствие готовых нативных интеграций с репозиториями кода (требуется настройка через webhook).</li></ul><h3>Тарифы</h3><p>Поставляется по модели SaaS. Стоимость от 366 руб./пользователь/мес (при годовой оплате). Доступна бесплатная версия для микро-команд (до 5 человек).</p><h2>5. TeamStorm</h2><p><a href="https://teamstorm.io">TeamStorm</a> — это российская система управления разработкой, позиционируемая как наиболее близкая по логике работы и интерфейсу замена Jira.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/bc47a142-6dbc-496d-80d0-4fd8917561ed.webp" alt="" /><figcaption>Интерфейс TeamStorm</figcaption></figure><p><b>Для кого:</b> ИТ-подразделения и команды разработки, ищущие прямую альтернативу продуктам Atlassian с минимальным периодом адаптации сотрудников.</p><h3>Соответствие Jira</h3><ul><li>Поддержка классической иерархии: Эпик, История, Задача, Дефект, Подзадача;</li><li>Организация рабочего пространства через «Пространства» и «Папки»;</li><li>Управление спринтами, бэклогами, поддержка оценки задач в Story Points;</li><li>Встроенный модуль базы знаний (аналог Confluence).</li></ul><h3>Миграция из Jira</h3><p>Вендор предоставляет специализированные инструменты для бесшовного переноса данных из Jira.</p><h3>Плюсы</h3><ul><li>Привычный пользовательский опыт (UX): интерфейс и логика работы максимально приближены к связке Jira + Notion, что снижает затраты на переобучение ИТ-команд;</li><li>Производительность: высокая скорость отклика интерфейса даже при работе с большими массивами данных;</li><li>Безопасность: наличие в реестре отечественного ПО и возможность установки в закрытый контур.</li></ul><h3>Минусы</h3><ul><li>Экосистема готовых интеграций со сторонними DevOps-сервисами пока уступает зарубежным аналогам;</li><li>Ограниченный функционал для управления портфелями проектов на уровне Enterprise.</li></ul><h3>Тарифы</h3><p>Облачная (SaaS) и On-premise версии. Стоимость от 500 руб./пользователь/мес.</p><h2>6. Comindware</h2><p>Comindware — это платформа для управления бизнес-процессами (BPMS) на базе Low-code архитектуры. Предназначена для комплексной цифровой трансформации крупных предприятий.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/c39bd43a-de11-4a24-adaa-496a64680cc7.webp" alt="" /><figcaption>Интерфейс Comindware</figcaption></figure><p><b>Для кого:</b> средний и крупный бизнес (Enterprise), где процессы разработки ПО необходимо интегрировать с другими сложными корпоративными процедурами (закупки, документооборот, согласования).</p><h3>Соответствие Jira</h3><ul><li>Возможность настройки трекинга задач любой степени сложности;</li><li>Гибкое управление маршрутами (workflow) и использование графовой базы данных для построения сложных связей между объектами;</li><li>Управление неструктурированными процессами (Case Management).</li></ul><h3>Миграция из Jira</h3><p>Осуществляется через API или путем импорта/экспорта данных в рамках комплексного проекта внедрения.</p><h3>Плюсы</h3><ul><li>Максимальная адаптивность (Low-code): бизнес-процессы можно модифицировать и перестраивать прямо «на лету» без остановки работы системы и кодинга;</li><li>Масштаб автоматизации: возможность построения единой платформы для оцифровки процессов всей компании, а не только ИТ-отдела;</li><li>Корпоративная безопасность: полноценное развертывание на серверах заказчика (On-premise).</li></ul><h3>Минусы</h3><ul><li>Не является специализированным трекером для ИТ-команд (отсутствуют нативные интеграции с CI/CD);</li><li>Интерфейс требует адаптации пользователей;</li><li>Внедрение представляет собой масштабный ИТ-проект, требующий участия квалифицированных аналитиков.</li></ul><h3>Тарифы</h3><p>Лицензирование по количеству пользователей, расчет стоимости владения (TCO) предоставляется по запросу.</p><h2>7. Битрикс24 (Scrum/Задачи)</h2><p>Битрикс 24 — это популярный корпоративный портал, объединяющий инструменты коммуникации, CRM и модуль управления задачами с поддержкой методологии Scrum.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/e26d5e58-d78b-4969-8d10-65e27d2d2fce.webp" alt="" /><figcaption>Интерфейс Битрикс24</figcaption></figure><p><b>Для кого:</b> малый и средний бизнес, а также ИТ-подразделения внутри не-ИТ компаний, где приоритетом является работа в единой среде с отделами продаж и маркетинга.</p><h3>Соответствие Jira</h3><ul><li>Наличие инструмента «Скрам»: бэклог, управление спринтами, оценка в Story Points, эпики, диаграмма сгорания задач;</li><li>Поддержка Канбан-досок, диаграмм Ганта, учета времени;</li><li>Инструменты автоматизации (роботы) для изменения статусов задач.</li></ul><h3>Миграция из Jira</h3><p>Реализуется с помощью специализированных приложений из встроенного маркетплейса.</p><h3>Плюсы</h3><ul><li>Комплексный подход (Всё-в-одном): чаты, видеозвонки, задачи, документы, календарь и CRM доступны в едином, привычном интерфейсе;</li><li>Доступность и поддержка: систему можно развернуть за один день, а на рынке присутствует широкая сеть партнеров-интеграторов для любой доработки;</li><li>Гибкое ценообразование: оптимальное соотношение цены и функциональности, особенно для небольших команд.</li></ul><h3>Минусы</h3><ul><li>Модуль Scrum не обладает достаточной глубиной для сложной Enterprise-разработки (управление релизами, техническим долгом, глубокая интеграция с репозиториями);</li><li>Многообразие не-ИТ функций портала может перегружать интерфейс для профильных разработчиков.</li></ul><h3>Тарифы</h3><p>Гибкая линейка: от бесплатных облачных тарифов до коробочных версий (On-premise) для корпоративного сектора. Стандартный облачный тариф (до 50 пользователей) — 4893 руб./мес за всех пользователей.</p><h2>8. WEEEK</h2><p>WEEEK — это современная мультисервисная платформа для командной работы. Сочетает в себе функционал таск-трекера, базы знаний и CRM-системы.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/602948d4-b4c3-4e81-ac1c-92787a83caec.webp" alt="" /><figcaption>Интерфейс WEEEK</figcaption></figure><p><b>Для кого: </b>продуктовые команды, стартапы, маркетинговые агентства, отдающие предпочтение современному дизайну и удобству использования (в стиле Notion).</p><h3>Соответствие Jira</h3><ul><li>Управление задачами в форматах списков, Канбан-досок и календаря;</li><li>Встроенная база знаний для ведения документации;</li><li>Отсутствует поддержка сложных JQL-запросов и многоуровневых кастомных workflow.</li></ul><h3>Миграция из Jira</h3><p>Возможна загрузка данных через файлы, однако готового коннектора для автоматического переноса всех связей между задачами нет.</p><h3>Плюсы</h3><ul><li>Эстетика и современный UX/UI: продуманный дизайн, в котором командам действительно приятно и комфортно работать ежедневно;</li><li>Универсальность: платформа успешно заменяет сразу несколько узкоспециализированных сервисов (например, связку Trello + Notion + простую CRM);</li><li>Доступность: наличие полнофункционального бесплатного тарифа для микро-команд.</li></ul><h3>Минусы</h3><ul><li>Не ориентирован на сложную инженерную разработку (отсутствуют глубокие аналитические отчеты по релизам и интеграции с Git);</li><li>Функционал находится в стадии активного развития.</li></ul><h3>Тарифы</h3><p>Облачная версия от 199 ₽/мес за пользователя. Доступна бесплатная версия для команд до 5 человек.</p><h2>9. Directum Projects</h2><p>Directum Projects — это корпоративная система управления проектами, исторически развившаяся из мощной платформы электронного документооборота (СЭД).</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/7c1db84f-9761-4f0c-8bfa-9a083d0dd23c.webp" alt="" /><figcaption>Интерфейс Directum Projects</figcaption></figure><p><b>Для кого: </b>крупный бизнес, государственный сектор и промышленные предприятия, где проектное управление тесно связано с формализованным документооборотом и строгими регламентами.</p><h3>Соответствие Jira</h3><ul><li>Поддерживает визуализацию на Agile-досках (Scrum/Kanban);</li><li>Основной упор сделан на классическое каскадное управление (Waterfall), мощные диаграммы Ганта, ресурсное планирование и работу с проектной документацией.</li></ul><h3>Миграция из Jira</h3><p>Выполняется проектной командой в рамках внедрения системы.</p><h3>Плюсы</h3><ul><li>Синергия с документооборотом: глубокая, нативная интеграция с системами электронного документооборота (СЭД Directum);</li><li>Управление по PMBOK: профессиональный инструмент для проектных офисов (PMO), обеспечивающий контроль сроков, вех и бюджетов.</li></ul><h3>Минусы</h3><ul><li>«Корпоративный» интерфейс может потребовать адаптации со стороны Agile-команд разработчиков;</li><li>Система менее сфокусирована на специфике гибкой продуктовой разработки ПО.</li></ul><h3>Тарифы</h3><p>Преимущественно On-premise поставки. Корпоративное лицензирование (ориентировочно от 7400 ₽ за пользователя в год).</p><h2>10. Мегаплан</h2><p>Мегаплан — это широко известная на российском рынке CRM-система, оснащенная развитым модулем управления задачами и поручениями.</p><p>Для кого: малый и средний бизнес, ищущий надежную систему для контроля исполнительской дисциплины и ведения клиентской базы в едином контуре.</p><h3>Соответствие Jira</h3><ul><li>Иерархия: задачи, подзадачи, чек-листы;</li><li>Диаграммы Ганта для визуального планирования сроков;</li><li>Инструменты учета рабочего времени и планирования загрузки сотрудников;</li><li>Отсутствует специализированный ИТ-инструментарий (спринты, эпики, интеграции с репозиториями кода).</li></ul><h3>Миграция из Jira</h3><p>Доступен базовый перенос данных через экспорт/импорт CSV-файлов.</p><h3>Плюсы</h3><ul><li>Стабильность и простота: легкость внедрения, простота освоения пользователями и высокая стабильность работы;</li><li>Связка процессов: возможность в одном окне интегрировать процессное управление с продажами (CRM) и финансами;</li><li>Мобильность: качественное и полнофункциональное мобильное приложение.</li></ul><h3>Минусы</h3><ul><li>Не является профильным инструментом для разработчиков ПО; не подходит в качестве полноценной замены Jira для ИТ-подразделений;</li><li>Сложности при масштабировании на крупные кросс-функциональные ИТ-проекты.</li></ul><h3>Тарифы</h3><p>Доступны облачная (SaaS) и коробочная версии. Базовый тариф — 315 руб./мес за пользователя при покупке на год. Расширенный тариф (с бо́льшим функционалом) — 630 руб./мес за пользователя.</p><h2>Сравнительная таблица: Jira vs российские аналоги</h2><p>Мы свели ключевые функции для ИТ-разработки в единую таблицу. Вместо простых галочек «есть/нет», мы описали уровень реализации каждой функции, чтобы вы могли наглядно оценить, какие аналоги Jira лучше всего закроют ваши потребности.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/06395971-2cfe-49d8-bdb1-0639428cecd0.webp" alt="" /></figure><p>Таблица наглядно демонстрирует: для гибких Agile-команд отлично подходят легкие решения вроде Kaiten, но если вам нужна полноценная замена Jira для Enterprise-разработки с жесткими воркфлоу, глубокой интеграцией с кодом и продуктовой иерархией, ближе всего к оригиналу стоят специализированные системы — SimpleOne SDLC и TeamStorm.</p><h2>Балльная оценка готовности систем заменить Jira (для ИТ-разработки)</h2><p>Чтобы дать вам быстрый срез, мы оценили системы по 10-балльной шкале именно в контексте разработки программного обеспечения и близости к методологии Jira.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-03-18/86a27ae2-f2e0-4b2e-af30-710f62958dcb.webp" alt="" /></figure><p>Примечание: Низкий балл не означает, что система плохая. Он лишь показывает, что решение (например, YouGile, WEEEK или Мегаплан) сфокусировано на других задачах (коммуникация, продажи, универсальный трекинг) и не является прямым аналогом Jira для хардкорной инженерной разработки и управления релизами.</p><h2>Критерии выбора аналога Jira в 2026 году</h2><p>Выбор системы трекинга задач — стратегическое решение. Ошибка на этом этапе приведет к необходимости перестраивать процессы управления в будущем. При оценке решений рекомендуем обращать внимание на следующие аспекты:</p><ol><li>Масштаб и поддерживаемая методология. Для небольших команд (до 10-15 человек), работающих над внутренними проектами, оптимально подойдут легкие решения вроде Kaiten или YouGile. Для крупных ИТ-департаментов (от 100 разработчиков), создающих сложные продукты и применяющих фреймворки масштабирования (SAFe), необходимы платформы Enterprise-уровня (например, SimpleOne SDLC), поддерживающие сложную продуктовую иерархию «из коробки».</li><li>Глубина кастомизации процессов. Если ваши процессы требуют сложной логики переходов статусов (например, задача переходит в тестирование только после согласования техлидом и заполнения обязательных полей), выбирайте платформы на базе Low-code, позволяющие настраивать workflow без программирования.</li><li>Интеграция с процессом разработки. Полноценный аналог Jira должен бесшовно интегрироваться с вашими репозиториями (GitLab, GitHub). Автоматическая смена статусов задач на основе коммитов существенно повышает прозрачность разработки.</li><li>Безопасность и варианты развертывания. Для компаний финансового сектора и организаций с государственным участием обязательным требованием является наличие On-premise версии и включение продукта в Реестр отечественного ПО.</li></ol><h2>Как мигрировать с Jira на российский аналог: пошаговый план</h2><p>Процесс миграции с Jira требует тщательного планирования. Рекомендуем придерживаться следующего алгоритма:</p><p>Шаг 1: Аудит текущей конфигурации Jira.</p><p>Проанализируйте используемый функционал. Выявите устаревшие кастомные поля, неиспользуемые статусы и отключенные плагины, чтобы не переносить накопленный «технический мусор» в новую систему.</p><p>Шаг 2: Маппинг сущностей.</p><p>Составьте таблицу соответствия терминологии. Например, тип задачи Issue Type «Bug» в Jira должен соответствовать типу «Дефект» в новой системе.</p><p>Шаг 3: Тестовый перенос (Пилотный запуск).</p><p>Выберите один репрезентативный проект и осуществите его перенос в новую систему (используя встроенные инструменты импорта или API). Проверьте корректность переноса вложений, комментариев, авторов задач и связей между ними (например, blocks/depends on).</p><p>Шаг 4: Настройка ролей и бизнес-логики.</p><p>Воспроизведите утвержденные маршруты движения задач (workflow) и настройте ролевую модель доступа в выбранной платформе.</p><p>Шаг 5: Обучение проектных команд.</p><p>Проведите установочные сессии для разработчиков и менеджеров продуктов, продемонстрировав принципы работы с бэклогом и создания дефектов в новом интерфейсе. Подготовьте краткие памятки (Cheatsheets).</p><p>Шаг 6: Финальная миграция и заморозка Jira.</p><p>Переведите Jira в режим «только чтение» (Read-only) перед выходными. За выходные выгрузите «дельту» (изменения, произошедшие с момента тестового переноса) и импортируйте ее в новую систему. В понедельник утром команда начинает работать в новом трекере.</p><h2>Чек-лист: 10 вопросов перед заменой Jira</h2><p>Перед тем как подписать договор с новым вендором, задайте эти вопросы себе и интегратору:</p><ol><li>Какие функции и плагины Jira мы используем реально, а какие были установлены «на всякий случай»?</li><li>Обладает ли предлагаемый аналог готовым инструментом (скриптом или коннектором) для импорта данных из Jira (пользователи, история статусов, вложения)?</li><li>Насколько прозрачна модель ценообразования: оплата взимается за пользователей, проекты или отдельные модули? Предусмотрены ли скрытые платежи?</li><li>Способна ли новая система обрабатывать наши объемы данных (десятки тысяч задач) без деградации производительности?</li><li>Включает ли стоимость лицензии базовую техническую поддержку и помощь в процессе миграции?</li><li>Сможем ли мы беспрепятственно экспортировать свои данные (например, в форматах CSV/JSON) при необходимости смены системы в будущем?</li><li>Имеет ли вендор подтвержденные кейсы миграции с Jira в компаниях сопоставимого с нами масштаба?</li><li>Поддерживает ли система «из коробки» нативные интеграции с нашим ИТ-стеком (Git, системы CI/CD, корпоративные мессенджеры)?</li><li>Соответствует ли архитектура решения требованиям безопасности (ФЗ-152, Реестр Минцифры, возможность On-premise)?</li><li>Каков реалистичный срок внедрения системы «под ключ» для команды нашего размера?</li></ol><h2>Заключение</h2><p>Поиск ответа на вопрос «чем заменить Jira» в 2026 году — это не проблема дефицита, это проблема выбора. Российский рынок предлагает отличные альтернативы, которые давно переросли стадию «импортозамещения ради галочки».</p><p>Если вам нужен просто наглядный и быстрый инструмент для Agile-команды, смело смотрите в сторону Kaiten. Если ваша разработка тесно завязана на другие бизнес-процессы компании — вам помогут ПланФикс или ELMA365.</p><p>Но если вы крупная продуктовая компания, где сотни разработчиков пишут код, а ИТ-директору нужна прозрачная связь между техдолгом, релизами и инцидентами из техподдержки — вам нужны Enterprise-решения. Платформы вроде SimpleOne SDLC предлагают не просто трекер, а архитектуру, изначально заточенную под масштаб, продуктовый подход и гибкость Low-code настройки, что делает их, пожалуй, наиболее полноценной заменой Jira для серьезного бизнеса на сегодняшний день.</p><h2>FAQ</h2><h4>Какие российские аналоги полностью заменяют Jira?</h4><p>Полностью (со всеми тысячами плагинов) скопировать Jira невозможно и не нужно. Но по покрытию базового и продвинутого функционала для разработки (Scrum, Kanban, бэклог, релизы, Git) лучшими российскими аналогами Jira считаются SimpleOne SDLC, TeamStorm и Kaiten.</p><h4>Сложно ли перенести данные из Jira в российский аналог?</h4><p>Большинство зрелых российских трекеров уже разработали встроенные утилиты или API-скрипты для миграции. Перенос базовых задач (названия, описания, статусы) обычно проходит гладко. Сложности могут возникнуть при миграции специфических кастомных полей, скриптов автоматизации (ScriptRunner) и данных из редких плагинов.</p><h4>Сколько стоит переход с Jira на российский аналог?</h4><p>Совокупная стоимость складывается из двух составляющих: стоимости лицензий на новое ПО (от 400-500 руб/мес за пользователя в облачных версиях до миллионов рублей за Enterprise On-premise решения) и стоимости самого проекта миграции (услуги бизнес-аналитиков и системных интеграторов по настройке процессов и переносу данных).</p><h4>Какой аналог Jira лучше для скрам-команд?</h4><p>Для небольших скрам-команд (до 30 человек), которым нужна максимальная визуализация досок и быстрый старт, отлично подойдет Kaiten или YouGile. Для крупных кросс-функциональных скрам-команд в Enterprise-сегменте, работающих над сложными продуктами (например, по SAFe), более мощной альтернативой станет SimpleOne SDLC, так как он поддерживает сложную продуктовую иерархию и связку с ITSM.</p><h4>Сколько времени занимает миграция с Jira на российский аналог?</h4><p>Для небольшой команды (до 50 человек) с простыми процессами переезд можно осуществить за 1-2 недели. Для корпорации (500+ пользователей), где нужно перенести сложные воркфлоу, обучить сотрудников и провести интеграции с внутренними системами, проект миграции может занять от 2 до 6 месяцев.</p><h4>Есть ли альтернативы Jira с хорошими AI-функциями?</h4><p>Да, российские вендоры активно внедряют ИИ. Искусственный интеллект в современных аналогах (например, на платформе SimpleOne) умеет классифицировать новые задачи, подсказывать операторам решения на основе базы знаний (RAG) и помогать в создании кратких резюме по длинным обсуждениям в тикетах.</p><p>Реклама. Рекламодатель: ООО «СИМПЛ 1», ИНН 9725013892, erid: 2W5zFFxmVEH</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сделать быстрый интерпретатор динамического языка — перевод статьи Филипа Пизло</title>
      <link>https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod</link>
      <comments>https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod</guid>
      <description><![CDATA[<p>Перевод статьи Филипа Пизло (WebKit FTL JIT): 21 оптимизация AST-интерпретатора без JIT, байткода и SSA. От 35x медленнее CPython до 1,9x быстрее.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod">Как сделать быстрый интерпретатор динамического языка — перевод статьи Филипа Пизло</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 22 Apr 2026 16:30:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Хотите ускорить рантайм своего маленького DSL или учебного языка — но писать JIT нет сил, а байткод-компилятор кажется отдельным проектом? Перевод <a href="https://zef-lang.dev/implementation" rel="nofollow">статьи Филипа Пизло</a> (автора JavaScriptCore-FTL, B3 и Riptide GC в WebKit) показывает, как простой AST-интерпретатор для собственного языка Zef он разогнал <b>в 16,6 раза</b> без единой строчки машинного кода, а с переходом на обычный C++ — в <b>67 раз</b>.</p><p>Пизло — человек, от которого обычно ждут постов про «как мы выкрутили очередной трюк в JIT JavaScriptCore». Его прошлые тексты — это <a href="https://webkit.org/blog/3362/introducing-the-webkit-ftl-jit/" rel="nofollow">FTL JIT</a>, <a href="https://webkit.org/blog/5852/introducing-the-b3-jit-compiler/" rel="nofollow">B3</a>, <a href="https://webkit.org/blog/7122/introducing-riptide-webkits-retreating-wavefront-concurrent-garbage-collector/" rel="nofollow">Riptide GC</a> и другие вещи, которые требуют двух лет опыта в компиляторах. Но этот текст — принципиально другой. Он показывает ровно то, о чём обычно не пишут: что делать, когда у вас ещё нет JIT, а GC ещё не является главной болью.</p><p>Стартовая версия интерпретатора Zef была <b>в 35 раз медленнее CPython 3.10</b>, в 80 раз медленнее Lua 5.4.7 и в 23 раза медленнее QuickJS-ng 0.14.0. После 21 оптимизации (<i>ни одной из которых не требует SSA-преобразований (static single assignment), переделки сборщика мусора, байткода или машинного кода</i>) тот же интерпретатор проигрывает CPython всего в 2,1 раза, Lua — в 4,8 раза, QuickJS — в 1,35 раза. Если же собрать тем же обычным C++ без Fil-C — Zef становится <b>быстрее CPython в 1,9 раза и быстрее QuickJS в 3 раза</b>.</p><p><b>Представление значений</b>: tagged 64-битные значения с NaN-boxing (упаковка целых и указателей в неиспользуемые биты double) позволяют держать числа на стеке и отличать их от указателей по битам.</p><p><b>Symbols вместо строк</b>: один раз интернировать все имена методов и переменных в Symbol*, потом сравнивать указатели — даёт +18%.</p><p><b>Object Model + Inline Caches + Watchpoints</b>: самый большой прирост (+355%, 4,55x) — одна мегакоммит-оптимизация, без которой остальное не работает.</p><p><b>Специализация мелочей</b>: выделенный AST-узел для a + b вместо строкового a.add(b), Getter/Setter-инференс, специализированные ZeroArguments/OneArgument/TwoArguments.</p><p><b>Штраф Fil-C — 4x</b>: memory-safe C, в котором автор пишет, даёт GC бесплатно, но накладывает штраф; итоговый буст после перехода на обычный C++ — 67x.</p><h2>О каком интерпретаторе речь</h2><p>Zef — это учебный динамический язык, который Пизло написал для удовольствия. В нём есть классы с наследованием, приватные поля (по умолчанию), замыкания, кастомные операторы, getter'ы и setter'ы. На уровне идиом он похож на Ruby и тихую версию JavaScript. Исходный интерпретатор — <a href="https://zef-lang.dev/source-viewers/baseline.html" rel="nofollow">наивный AST-walker</a>, в котором каждая нода — это C++-объект с виртуальным методом Node::evaluate, а все переменные живут в std::unordered_map&lt;std::string, Value&gt;.</p><p>Весь исходный код интерпретатора, diff-просмотрщики для каждой оптимизации и бенчмарки выложены на <a href="https://zef-lang.dev/implementation" rel="nofollow">zef-lang.dev/implementation</a>. Бенчмарки — набор ScriptBench1: Richards (OS scheduler), DeltaBlue (constraint solver), N-Body (физика) и Splay (самобалансирующееся двоичное дерево). Все портированы на Zef, Lua, Python и JavaScript.</p><p>Одна деталь про измерения: Пизло собирает свой интерпретатор компилятором <a href="https://fil-c.org/" rel="nofollow">Fil-C++</a> — это его собственный memory-safe C, который даёт сборщик мусора из коробки, но платит за это примерно 4x производительности. То есть когда в тексте написано «в 35 раз медленнее CPython», держите в голове, что 4x из этого — стоимость безопасности памяти, а остальные ~9x — это то, что будем выжимать.</p><h2>Исходная точка: в 35 раз медленнее Python</h2><p>В базовом варианте Пизло сделал два единственных осознанных про производительность выбора:</p><ul><li><b>64-битное tagged-представление значений</b>. Значение может быть int32, double или Object*. Double'ы сдвигаются на 0x1000000000000 — техника из JavaScriptCore, которую в литературе зовут NaN-boxing. Целые и указатели лежат как есть. Это позволяет определить тип значения битовой проверкой и не выделять int'ы в куче.</li><li><b>Язык — C++</b>. Пизло обосновывает: «Java — потолок низкоуровневых оптимизаций слишком низкий, Rust — сборщик мусора требует глобального изменяемого состояния и циклических ссылок, с этим придётся драться или писать много unsafe».</li></ul><p>Всё остальное — сознательные «плохие» решения ради скорости разработки:</p><ul><li>Fil-C++ — штраф 4x, но GC бесплатно.</li><li>Рекурсивный AST-интерпретатор через виртуальные вызовы.</li><li>std::string везде — для имён переменных, методов, полей.</li><li>std::unordered_map везде — на каждый Get переменной идёт хеш-лукап по строке.</li><li>Цепочки рекурсивных вызовов по scope chain: класс внутри функции внутри класса внутри функции — каждый доступ проходит через несколько уровней вызовов.</li></ul><p>Результат — <b>35x медленнее CPython, 80x медленнее Lua, 23x медленнее QuickJS</b>. Дальше — что с этим можно сделать, <i>не переписывая интерпретатор на JIT</i>.</p><h2>#1–2: Прямой вызов операторов и RMW</h2><p>В Zef выражение a + b эквивалентно a.add(b). Наивный парсер делает одну и ту же AST-ноду для обоих случаев — DotCall(a, "add", [b]). Каждый плюс превращается в лукап строки "add" в Value::callMethod, который каскадом сравнивает её со всеми возможными именами операторов.</p><p>Первая оптимизация — парсер генерирует отдельные ноды Binary&lt;&gt; и Unary&lt;&gt;, каждая со своим виртуальным evaluate, который сразу зовёт Value::add, Value::sub и так далее. Без строковых сравнений на каждый плюс.</p><p><b>+17,5%</b>. Вторая оптимизация делает то же самое для += и аналогов — отдельные ноды SetRMW, DotSetRMW, SubscriptRMW. <b>+3,7%</b>. Итог: 1,22x быстрее старта.</p><h2>#3: Убрать проверку IntObject из быстрого пути</h2><p>В базовой версии Value различал четыре случая: tagged int32, tagged double, IntObject (для int64, не влезающих в 32 бита) и всё остальное. Фастпас вызывал isInt(), который через виртуальный вызов спрашивал Object::isInt() — на случай, если под обложкой лежит IntObject.</p><p>Правка — пусть Value работает только с int32 и double, а весь int64-код уезжает внутрь IntObject. <b>+1%</b>. Мелочь, но копеечка.</p><h2>#4: Symbols вместо std::string</h2><p>Это первый по-настоящему большой прирост. В исходном интерпретаторе std::string — это ключ везде, где есть хеш-лукап: локальные переменные, dot-доступ, имена операторов, имена методов. То есть на каждый x + 1 идут хеширование строки "x", strcmp на каждой коллизии, ещё раз для "+".</p><p>Оптимизация — классический interning. Новый класс Symbol. Строки превращаются в Symbol* через глобальный hash-consing — одна строка = один указатель. Равенство Symbol* теперь проверяется сравнением указателей, а хеш-таблицы ключуются по Symbol*, а не по std::string.</p><p>Правка большая по количеству затронутых файлов, но по сути тривиальная — меняются сигнатуры функций с const std::string&amp; на Symbol*. <b>+18%</b>. Суммарно: 1,46x быстрее старта.</p><h2>#5: Value Inline</h2><p>Простая техника: вынести часть методов Value в отдельный заголовочник valueinlines.h, чтобы они видели типы, которые нельзя было включить в value.h из-за циркулярных зависимостей. Компилятор теперь может их инлайнить в горячих местах. <b>+2,8%</b>.</p><h2>#6: Объектная модель + inline caches + watchpoints — 4,55x одним махом</h2><p>Самая большая оптимизация в статье, и единственная, которую Пизло специально защищает:</p><blockquote>Иногда единственный способ сделать реализацию языка быстрее — это посадить большой патч. Не позволяйте никому говорить, что хороший инженерный труд бывает только в маленьких удобоваримых изменениях. Это не всегда так. И точно не так, если вы хотите иметь быструю реализацию динамического языка.</blockquote><p>Патч объединяет три независимо бесполезных вещи:</p><h3>Новая объектная модель: Storage + Offsets</h3><p>В исходной версии каждый lexical scope выделял объект Context, а внутри Context жил hashmap с «полями» — локальными переменными. Объекты пользовательских классов были хуже: каждый объект содержал hashmap «класс → Context», потому что если Bar наследует Foo, поля у них приватные и могут иметь одинаковые имена — нужно различать, к какому классу относится поле.</p><p>Новая идея — Storage, который держит данные по Offsets, вычисленным на этапе resolve AST. Context всё ещё существует, но создаётся заранее, а объекты на рантайме просто выделяют Storage размера, который Context уже посчитал. Доступ к полю становится индексом по offset'у, а не лукапом в хеш-таблице.</p><h3>Inline caches</h3><p>Классическая техника — обычно её описывают в контексте JIT-компиляторов. Но здесь Пизло применяет её в <i>интерпретаторе</i>: для каждой AST-ноды типа expr.name запоминается тип, который expr имел в прошлый раз, и offset, куда резолвилось name. Запоминание — через placement-new на месте старой ноды: под той же памятью лежит новая специализированная нода, которая умеет быстрый путь.</p><p>Специализация может быть: «прямой load из Storage» (для локальной переменной), «проверка класса + direct call в функцию, которую видели в прошлый раз» (для метода). Плюс chain steps и watchpoints, если access требовал обхода scope chain.</p><h3>Watchpoints</h3><p>Представим: класс Foo внутри lexical scope, в котором есть переменная x. Метод Foo обращается к x. Внутри Foo имени x нет. Казалось бы, можно делать доступ без проверок. Но кто-то может унаследовать Foo и добавить геттер с именем x — тогда доступ должен пойти в геттер.</p><p>Watchpoint — это пассивный охранник: «если кто-то переопределил имя x в подклассе, инвалидируй мой inline cache». Пока имя не переопределяли, доступ работает на минимальных циклах.</p><h3>Почему всё вместе</h3><p>Пизло объясняет, почему эти три вещи не разделить:</p><ul><li>Новая объектная модель без inline caches не даёт никакого прироста.</li><li>Inline caches без watchpoints не могут кешировать большинство интересных случаев — слишком много условий.</li><li>И объектная модель, и watchpoints должны работать вместе с самого начала.</li></ul><p><b>+355% — 4,55x быстрее</b>. После этого Zef в 5,2 раза медленнее CPython, в 11,7 раза медленнее Lua, в 3,3 раза медленнее QuickJS. То есть накладные расходы Fil-C++ (примерно 4x) — это уже почти вся разница. Суммарно: 6,8x быстрее старта.</p><h2>#7: Arguments — свой тип вместо std::vector</h2><p>Раньше аргументы функций передавались как const std::optional&lt;std::vector&lt;Value&gt;&gt;&amp;. optional нужен, чтобы отличать геттер-вызов o.getter от функции без аргументов o.function() — в Zef это разные вещи для некоторых типов. То есть каждый вызов аллоцировал std::vector, копировал его, и ещё раз копировал в scope функции.</p><p>Правка — новый тип Arguments, физически совпадающий с layout scope, который callee создаст. Caller выделяет его напрямую, callee не копирует. Плюс в Fil-C++ std::optional всегда живёт в куче из-за специфики invisicaps — это отдельный штраф. <b>+33%</b>.</p><h2>#8–10: Специализация геттеров, сеттеров и callMethod</h2><p>Много методов в Zef устроены тривиально:</p><p>Это запись readable f. Метод fn f f — просто чтение переменной. Гонять это через полноценный eval AST'а расточительно. Оптимизация #8 — инференс: если тело функции — это просто Get, заменяем UserFunction на специализированный GetterFunction, делающий load по известному offset'у. <b>+5,6%</b>.</p><p>Оптимизация #9 — то же самое для сеттеров (fn set_x(v) x = v). Инференс сложнее — нужно матчить параметр сеттера как источник присваивания. <b>+3,4%</b>. Оптимизация #10 — тривиальная однострочная: inline-инг callMethod в заголовочник. <b>+3,2%</b>. Суммарно: 10,2x быстрее старта.</p><h2>#11: Глобальная hashtable для method dispatch</h2><p>Когда inline cache промахивается, старый путь лез через ClassObject::tryCallMethod и tryCallMethodDirect, которые делают два хеш-лукапа на каждый уровень иерархии наследования: «есть ли метод в этом классе» и «есть ли вложенный класс с этим именем». O(depth × 2).</p><p>Правка — глобальный hashmap (ClassObject*, Symbol*) → callee, который запоминает все успешные резолвы. Промах по IC теперь — один лукап в эту таблицу, и только если её нет — полный медленный путь. <b>+15%</b>. Суммарно: 11,8x.</p><h2>#12: Избавиться от std::optional на горячем пути</h2><p>В Fil-C++ std::optional почти всегда аллоцируется в куче — из-за особенностей union-типов и invisicaps. LLVM может непредсказуемо потерять capabilities указателей внутри union'ов; Fil-C++ компилятор страхуется и вставляет интринсики, которые заставляют всё, что выглядит как union, аллоцировать на heap.</p><p>Правка — обход кода, ведущего к std::optional на горячем пути. <b>+1,7%</b>. Важный сайд-эффект для тех, кто пишет на Fil-C++: избегайте union-типов в горячем коде.</p><h2>#13: ZeroArguments, OneArgument, TwoArguments</h2><p>Большинство встроенных функций Zef берут 0, 1 или 2 аргумента. Им не нужен полноценный Arguments-объект — он просто занимает память. Три новых типа: ZeroArguments, OneArgument, TwoArguments. Функции шаблонизируются и инстанцируются отдельно для каждого.</p><p>ZeroArguments нужен отдельно, потому что (Arguments*)nullptr уже используется для геттер-вызова. Теперь ZeroArguments означает «функция без аргументов». <b>+3,8%</b>.</p><h2>#14: Slow paths Value через static + by value</h2><p>Раньше медленные пути Value были member-функциями и принимали неявный const Value*. Значит, caller должен был stack-аллоцировать Value. В Fil-C++ любая stack-аллокация это heap-аллокация.</p><p>Правка — сделать эти методы static и принимать Value по значению. Аллокации не нужны. <b>+10%</b>. Суммарно: 13,6x. Это ещё одна «специфичная для Fil-C++» оптимизация, которая в Yolo-C++ (обычный C++) была бы бесплатной по умолчанию.</p><h2>#15–17: Дедупликация, быстрый sqrt и toString</h2><p>#15 — «оптимизация» в кавычках: убрать дублированный код в DotSetRMW. Пизло надеялся на прирост от уменьшения кода. Прироста нет — но код чище.</p><p>#16 — специализация Dot-ноды для value.sqrt. Inline caches хороши для объектов, но для числовых примитивов они не работают — там фастпас другой, через Binary&lt;&gt;/Unary&lt;&gt;. sqrt в базовом варианте летел через общий путь. Теперь — свой специализированный код. <b>+1,6%</b>.</p><p>#17 — то же самое для toString. Плюс чуть меньше аллокаций при конвертации int → string. <b>+2,7%</b>. Суммарно: 14,2x.</p><h2>#18: Специализация литералов массивов</h2><p>Код вроде my whatever = [1, 2, 3] по-старому каждый раз спускался в AST и вычислял 1, 2, 3. Но если литерал константный — результат известен на парсинге.</p><p>Оптимизация — специализированная ArrayLiteral-нода, которая при вычислении просто копирует заготовленный массив значений. <b>+8,1%</b>. Суммарно: 15,35x.</p><h2>#19: Value::callOperator по значению</h2><p>Та же идея, что в #14 — не передавать Value по ссылке в медленный путь callOperator, а принимать его по значению. Ещё одна Fil-C++-специфичная аллокация убирается. <b>+6,5%</b>. Суммарно: 16,3x.</p><h2>#20–21: Настройки компилятора и отключение ассертов</h2><p>#20 — билд-система: отключить RTTI и libc++ hardening, потому что Fil-C++ их всё равно перекрывает. Ни одного изменения в C++-коде, только флаги сборки. <b>+1,8%</b>.</p><p>#21 — отключить по умолчанию ассерты. Код использовал макрос ZASSERT (всегда проверяет). Замена на ASSERT (только если ASSERTS_ENABLED) должна была дать прирост, но — не дала. Зато готовит код к сборке в обычном C++.</p><p><b>После 21 оптимизации: 16,6x быстрее старта</b>. Zef в 2,1x медленнее CPython, в 4,8x медленнее Lua, в 1,35x медленнее QuickJS. Стартовали с 35x, 80x и 23x разрывов — оказались в окрестностях конкурентов, без строчки JIT.</p><h2>Переход на обычный C++ — ещё 4x</h2><p>Финальный эксперимент — собрать тот же код обычным C++ (GCC 11.4.0) вместо Fil-C++. Пизло называет это Yolo-C++ — без гарантий безопасности памяти. Получается <b>ещё 4x</b>. Суммарно: <b>67x быстрее базовой версии</b>. Zef в 1,9x <i>быстрее</i> CPython 3.10, в 1,2x медленнее Lua и в 3x быстрее QuickJS.</p><p>Сборка неидеальна: вместо Fil-C++ GC там calloc, память не освобождается — интерпретатор течёт, просто ScriptBench1 слишком короткий, чтобы это заметить. С реальным GC Yolo-C++-версия была бы ещё быстрее.</p><blockquote>В этот момент Zef в 1,9 раза быстрее CPython 3.10, в 1,2 раза медленнее Lua 5.4.7 и в 3 раза быстрее QuickJS-ng 0.14.0. Мы стали в 67 раз быстрее, чем там, где начали.</blockquote><h2>Итоговая таблица всех оптимизаций</h2><p>Что получается по ходу работы — в одной таблице (геосреднее по четырём бенчмаркам, чем быстрее, тем лучше):</p><h2>Выводы</h2><p>Главное в этом тексте Пизло — не сами оптимизации, а то, что они <i>все простые</i>. SSA здесь нет. GC переделывать не надо. Байткода нет. Машинного кода нет. Есть базовые вещи: не хешировать строки (Symbols), не аллоцировать лишнее (Value by value, специализированные Arguments), не ходить по hashmap'ам (Offsets + IC), запомнить то, что уже видели (inline caches), инвалидировать кеш только когда реально что-то поменялось (watchpoints).</p><p>Для тех, кто пишет интерпретатор с нуля — список в статье Пизло работает как чеклист. Первые оптимизации (#1–#5) дают суммарные 1,5x — они дешёвые. #6 даёт 4,55x — это день работы, но переворачивает игру. Всё остальное — серия из 3–8% приростов, которые в сумме добирают разницу.</p><p>Для тех, кто хочет потом написать JIT — эта статья объясняет, <i>как выглядит база</i>, на которую JIT потом ложится без сюрпризов. NaN-boxing, новая объектная модель, IC и watchpoints — это ровно то, что должно быть у интерпретатора до того, как вы начнёте генерировать машинный код.</p><p>Оригинал: <a href="https://zef-lang.dev/implementation" rel="nofollow">How To Make a Fast Dynamic Language Interpreter</a>, Filip Pizlo, 21 апреля 2026 года. Автор — один из ключевых инженеров WebKit JavaScriptCore, автор FTL JIT, B3, Riptide GC.</p>]]></content:encoded>
    </item>
    <item>
      <title>Индексы в Postgres: почему ваш индекс не работает и что такое INCLUDE</title>
      <link>https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in</link>
      <comments>https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in</guid>
      <description><![CDATA[<p>B-tree, композитные, функциональные, частичные, покрывающие индексы Postgres — разбираем на примерах, где lower() убивает индекс и когда реально нужен INCLUDE.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/indeksy-v-postgres-pochemu-vaw-indeks-ne-rabotaet-i-chto-takoe-in">Индексы в Postgres: почему ваш индекс не работает и что такое INCLUDE</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 Apr 2026 15:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш SELECT всё ещё тормозит, хотя вы добавили индекс? Вот три главные причины, почему Postgres его не использует: вы обернули колонку в lower(), перепутали порядок колонок в композитном индексе или полагаетесь на INCLUDE ради скорости записи. Индекс — это отсортированная структура, по которой база делает бинарный поиск вместо чтения всей таблицы. Но даже правильно созданный индекс легко выключить одной лишней функцией.</p><p>Джон Чартер в статье <a href="https://jon.chrt.dev/2026/04/15/things-you-didnt-know-about-indexes.html" rel="noopener">«Things you didn't know about indexes»</a> разбирает не только базовые принципы B-tree, но и три типа индексов, о которых новичкам не рассказывают: функциональные, частичные и покрывающие. Переводим полностью, с примерами на таблице покемонов и объяснением, почему EXPLAIN — ваш лучший друг.</p><p>Индексы ускоряют чтение, но замедляют запись. INSERT, UPDATE и DELETE обновляют каждый индекс — восемь индексов на таблице значат восемь дополнительных обновлений.</p><p>Композитный индекс (type_1, type_2) работает для запросов на type_1 и на обе колонки вместе, но не для запросов только на type_2. Порядок колонок важен.</p><p>Функция над индексированной колонкой убивает индекс. WHERE lower(name) = 'pikachu' не использует индекс на name — нужен функциональный индекс на lower(name).</p><p>Частичный индекс с WHERE покрывает только нужные строки. Для soft-delete или редких флагов экономит место и ускоряет запись.</p><p>Покрывающий индекс с INCLUDE отвечает на запрос без похода в таблицу — в EXPLAIN это Index Only Scan.</p><p>Не угадывайте — используйте EXPLAIN ANALYZE. Он показывает реальный план запроса и реальное время выполнения.</p><h2>Начнём с того, что вы, вероятно, уже знаете</h2><p>Индекс в базе данных похож на алфавитный указатель в конце учебника. Хотите найти страницы про фосфор? Идёте в конец, находите тему и номера страниц рядом с ней:</p><p>Представим таблицу покемонов:</p><p>Без индекса поиск Пикачу означает, что база прочитает каждую строку, проверяя колонку name. На четырёх строках это мгновенно. На десяти миллионах — уже проблема. Такое чтение называется full table scan, и оно не медленное само по себе: современные базы легко прошивают миллионы строк в секунду. Проблема в линейной сложности — удваиваете число строк, удваиваете время. Индексный поиск этой разницы почти не замечает.</p><p>Но если добавить индекс на name, получится примерно то же, что указатель в учебнике:</p><p>Данные отсортированы, поэтому база может сделать бинарный поиск по имени и найти нужную строку, а не сканировать всю таблицу. Под капотом Postgres хранит это как B-tree (сбалансированное дерево), но идея такая же, как в учебнике: отсортированные данные, по которым можно быстро искать.</p><p>Итак, индексируем всё подряд, верно? Не так быстро.</p><h2>Цена индексации</h2><p>Как бы ни хотелось проиндексировать всё, у индексов есть компромиссы. Главное правило:</p><blockquote>Чтение ускоряется, запись замедляется.</blockquote><p>С новым блестящим индексом каждый INSERT, UPDATE и DELETE должен обновить и индекс тоже. Когда мы добавляем нового покемона, база находит правильное место в отсортированном индексе имён и вставляет его туда. А индексов может быть несколько — умножайте эту работу на каждый из них.</p><p>Плюс индексы — это реальные структуры данных, и их нужно хранить. Они живут на диске и подгружаются в память: в Postgres это shared_buffers. У таблицы с восемью индексами девять объектов, которые конкурируют за буфер, а не один.</p><p>И не забываем про планировщик (query planner) — компонент, который перед каждым запросом оценивает варианты доступа к данным и выбирает самый дешёвый. Чем больше индексов, тем больше вариантов он взвешивает, так что время планирования растёт и на быстрых выборках может даже превысить время выполнения.</p><p><b>Отдельный риск на проде.</b> Обычный CREATE INDEX блокирует таблицу на запись до конца построения. На таблице в десятки миллионов строк это минуты недоступности. В production используйте CREATE INDEX CONCURRENTLY — он строит индекс без эксклюзивной блокировки, ценой чуть большего времени и того, что операция может быть прервана и оставить индекс в состоянии INVALID (который надо пересобрать).</p><h2>Почему ваш индекс не работает</h2><p>Вы взвесили компромиссы, решили, что индекс уместен. Отлично. Но он не работает как ожидалось: улучшения нет или, хуже того, скорость падает. Разберём типичные грабли.</p><h3>Композитные индексы и порядок колонок</h3><p>Возвращаясь к таблице покемонов: вы могли решить, что хороший индекс — это индекс на type_1 и type_2. «Покажи всех покемонов типа Water и Flying» — вполне разумный запрос.</p><p>Этот индекс определённо поможет запросам вроде:</p><p>Но вот этому — уже нет:</p><p>Удивлены? Когда вы создаёте композитный индекс (type_1, type_2), вы просите базу построить структуру примерно такого вида:</p><p>Сначала сортировка по type_1, затем по type_2 внутри каждой группы. Для запросов по type_1 индекс отличный, для запросов по type_1 AND type_2 — ещё лучше, но для запросов только по type_2 он не будет использован так, как вы надеетесь. Посмотрите на Flying: он разбросан под Bug, Electric, Fire и Water — базе некуда прыгнуть.</p><p>Задайте себе вопрос: какие запросы будут частыми? Если по type_2 вы будете искать так же часто, как по type_1, создайте второй индекс на type_2.</p><h3>Функции убивают индекс</h3><p>Поиск без учёта регистра — частая фича. Пользователям всё равно, пишут ли они «Pikachu», «pikachu» или «PiKaChU» — они просто хотят результат. Поэтому можно написать так:</p><p>Я бы не обратил на такой запрос особого внимания. Выглядит нормально. У нас есть индекс на name, запрос должен летать. Но, конечно, он не летает.</p><p>Почему? Индекс на name, а не на lower(name). Для базы это две совершенно разные вещи. Ваш индекс — это отсортированный список значений вида Bulbasaur, Charmander, Squirtle, Pikachu, а не bulbasaur, charmander, squirtle, pikachu. Так что когда вы просите строки, где lower(name) = 'pikachu', у базы нет отсортированной структуры для этого — и она откатывается к сканированию всей таблицы, приводя каждое имя к нижнему регистру по ходу дела.</p><p>Это касается любой функции, оборачивающей колонку. Если база не видит индексированную колонку слева от сравнения, индекс выбывает из игры.</p><p>И вот настоящие грабли: неявные преобразования тоже считаются. Классический пример — колонка user_id типа bigint сравнивается со строкой (WHERE user_id = '42') или timestamp сравнивается со строковой датой. Postgres тихо добавит приведение типа — и индекс работать перестанет с тем же эффектом, что и явная обёртка функцией.</p><p>Как обойти это? К счастью, можно построить индекс на выражении. Индекс на lower(name) абсолютно валиден, и запрос выше будет использовать его без проблем. К этому мы ещё вернёмся.</p><h3>Как избежать этих ловушек</h3><p>Короткий ответ: не гадайте. Измеряйте. Как? Спросите базу.</p><p>В Postgres есть инструмент EXPLAIN, который показывает, как именно база собирается выполнить запрос. Поставьте его перед любым SELECT — и получите отчёт:</p><p>Index Scan — это то, что вы хотите видеть. Значит, база использует индекс. Сравните с проблемным запросом:</p><p>Seq Scan значит, что читается каждая строка. Никаких индексов.</p><p>Если хотите реальные тайминги вместо оценок планировщика, используйте EXPLAIN ANALYZE. Он действительно запускает запрос и сообщает, что произошло. Попробуйте на запросе, который, как вам кажется, вы понимаете — результаты часто удивляют. А если Postgres тормозит не из-за индексов — у нас есть <a href="https://tproger.ru/articles/tormozit-postgres--12-wagov-diagnostiki" rel="noopener">12 шагов диагностики</a>, от pg_stat_activity до auto_explain.</p><h2>Чего вам не рассказывали</h2><p>Мы разобрали базовый индекс на одной колонке и его композитного брата. Вместе они покрывают большинство случаев. Но есть ещё несколько видов индексов, которые иногда оказываются именно тем, что нужно.</p><p><b>Сначала оговоримся про типы индексов в целом.</b> Всё, о чём мы пока говорили, — это B-tree, тип по умолчанию в Postgres. Но для нестандартных задач есть другие: GIN для jsonb и полнотекстового поиска, GiST для геоданных и диапазонов, BRIN для огромных таблиц с физически упорядоченными данными (логи, временные ряды), Hash для точного равенства. Ниже речь идёт именно о B-tree — но идеи функциональных, частичных и покрывающих индексов применимы и к другим типам.</p><h3>Функциональные индексы</h3><p>Мы затрагивали это в разделе про функции. Проблемный запрос был такой:</p><p>Индекс на name не помогает, потому что база ищет строки с lower(name) = ..., а отсортированной структуры для lower(name) у неё нет. Исправление — дать ей такую структуру:</p><p>Это функциональный индекс (его ещё называют индексом на выражении). Вместо того, чтобы индексировать сырую колонку, вы индексируете результат выражения, применённого к ней. Конечно, это не ограничивается lower(). Можно индексировать любое детерминированное выражение:</p><p>Годится любая функция с меткой IMMUTABLE — в Postgres это означает, что она возвращает одинаковый результат для одинаковых аргументов при любых условиях (в отличие от STABLE, которая детерминирована только в рамках одной транзакции, и VOLATILE).</p><p>Но осторожно. Если тянуться к функциональному индексу при первом же случае, это часто плохой запах. Если мы так часто ищем по имени в нижнем регистре, почему мы вообще не храним имя в нижнем регистре? Альтернативы: отдельная колонка name_lower, которую заполняете на вставке; тип citext (case-insensitive text) из одноимённого расширения; или COLLATE с регистронезависимой коллацией. Функциональный индекс — когда изменить хранение уже нельзя.</p><h3>Частичные индексы</h3><p>Большинство индексов покрывает каждую строку таблицы. Но иногда вы запрашиваете только её небольшой срез — и индексировать всё подряд расточительно. Напомню: индексы не бесплатны.</p><p>В нашей таблице покемонов есть колонка is_legendary. На момент написания существует около 1000 видов покемонов, из которых легендарными считаются всего 80 — меньше 10%.</p><p>Представьте приложение с опцией «показать всех легендарных». Изначально так и хочется создать составной индекс:</p><p>Это работает, но это перебор. Индекс теперь содержит запись для каждого покемона, а подавляющее большинство — не легендарные. Мы будем платить за хранение и запись 1000 строк, чтобы обслуживать запросы, которым интересны только 80. Более того, поскольку is_legendary — булево, получается структура, где сначала идёт разделение на False и True, и первая группа — это 920 записей мёртвого груза, оплачивающих свою долю каждой записи в таблицу ради запросов, которые их игнорируют.</p><p>Частичный индекс покрывает только строки, которые подходят под условие:</p><p>Теперь в индексе 80 записей вместо 1000. Он меньше, быстрее в запросах; а запросы вида WHERE is_legendary = true используют его без вопросов. Запросы, которые не подходят под условие (WHERE is_legendary = false), откатываются к full table scan — что вам и нужно. Эти запросы и так матчат почти каждую строку, так что индекс им не особо помог бы.</p><p>Любая колонка, где вы почти всегда запрашиваете одно значение, — кандидат на частичный индекс. Представьте индекс на колонке email в таблице users, где у вас реализован soft-delete:</p><p>Soft-deleted строки почти никогда не запрашиваются, но без фильтра всё равно раздували бы ваши индексы.</p><h3>Покрывающие индексы</h3><p>Когда база использует индекс, чтобы найти строку, это только половина работы. Индекс указывает, где строка лежит, но потом база должна сходить в саму таблицу и забрать остальные колонки, которые запросил запрос. Две поездки.</p><p>А что, если я скажу, что так делать необязательно?</p><p>Если в индексе уже есть все колонки, которые нужны запросу, база может ответить на запрос из одного только индекса. Это покрывающий индекс. В EXPLAIN вы увидите его как Index Only Scan — три самых сладких слова из возможного вывода EXPLAIN.</p><p><b>Одна важная оговорка.</b> Даже при Index Only Scan Postgres всё же заглядывает в visibility map — битовую карту, которая для каждой страницы таблицы отмечает, видимы ли все её строки всем активным транзакциям. Если страница «грязная» (были недавние UPDATE/DELETE), Postgres всё равно пойдёт в heap за проверкой MVCC. Так что на интенсивно пишущих таблицах регулярный VACUUM (автовакуум обычно справляется) критичен для того, чтобы Index Only Scan оставался «онли».</p><p>Вот запрос:</p><p>Наш частичный индекс из предыдущего раздела идеально покрывает этот запрос. Индекс на name, отфильтрованный по легендарным, — и запрос просит name легендарных. Всё, что нужно запросу, уже в индексе. Поход в таблицу не нужен.</p><p>Покрывающие индексы можно строить и специально. Postgres позволяет добавить к индексу дополнительные колонки через INCLUDE:</p><p>Теперь на такой запрос можно ответить прямо из индекса:</p><p>Почему не положить base_attack прямо в индексируемые колонки? Потому что база считает индексируемые колонки тем, по чему нужно сортировать и искать. Если добавить base_attack в ключевые колонки индекса, вы скажете базе сортировать индекс сначала по name, потом по base_attack — дополнительная работа, которая не нужна, если вы ищете только по name. INCLUDE говорит: «тащи эту колонку с собой, но не морочься сортировкой».</p><h3>Правка автора: когда на самом деле нужен INCLUDE</h3><p>В комментариях на Reddit автор получил поправку от <a href="https://www.reddit.com/user/therealgaxbo/" rel="noopener">u/therealgaxbo</a> и обновил статью. Скорость записи — не главная причина использовать INCLUDE для покрывающих индексов: в обоих случаях (колонка в ключе или в INCLUDE) индекс обновляется при каждой записи, разница по нагрузке скромная.</p><p>Реальные причины использовать INCLUDE:</p><p>Можно включать колонки, у которых типы данных не имеют подходящего operator class для типа индекса (operator class — набор функций сравнения, по которым Postgres строит индекс для конкретного типа; для некоторых типов он просто не определён). Например, колонку box (геометрический прямоугольник) нельзя добавить в B-tree индекс как ключевую — нет оператора «меньше/больше». А через INCLUDE можно.</p><p>Можно добавить колонки в уникальный индекс без изменения его семантики уникальности:</p><p>Это обеспечивает уникальность только по email, но при этом покрывает запросы, которым нужен user_id.</p><h2>Выводы</h2><p>Индексы могут казаться новичку чем-то второстепенным. Даже опытные инженеры часто создают их не задумываясь или не создают вовсе. Но грамотная индексация делает или ломает производительность вашей базы.</p><p>Хотите глубже? Сайт <a href="https://use-the-index-luke.com/" rel="noopener">Use The Index, Luke</a> научит вас всему, что только можно знать про индексы в разных СУБД. А если вы только начинаете с Postgres — загляните в наши <a href="https://tproger.ru/articles/osnovy-postgresql-dlya-nachinayushhih--ot-ustanovki-do-pervyh-zaprosov-250851" rel="noopener">основы PostgreSQL</a>: от установки до первых запросов.</p><p>И не забудьте запустить EXPLAIN ANALYZE хотя бы на одном запросе сегодня — результаты могут вас удивить.</p><p>Источник: <a href="https://jon.chrt.dev/2026/04/15/things-you-didnt-know-about-indexes.html" rel="noopener">jon.chrt.dev — Things you didn't know about indexes</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Инженер AWS обнаружил: Linux 7.0 вдвое снижает производительность PostgreSQL</title>
      <link>https://tproger.ru/news/inzhener-aws-obnaruzhil--linux-7-0-vdvoe-snizhaet-proizvoditelnost</link>
      <comments>https://tproger.ru/news/inzhener-aws-obnaruzhil--linux-7-0-vdvoe-snizhaet-proizvoditelnost?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/inzhener-aws-obnaruzhil--linux-7-0-vdvoe-snizhaet-proizvoditelnost</guid>
      <description><![CDATA[<p>Инженер AWS обнаружил: на Linux 7.0 с PREEMPT_LAZY throughput PostgreSQL падает до 0,51x — 50 751 tps вместо 98 565 tps. Причина — удаление режима PREEMPT_NONE.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/inzhener-aws-obnaruzhil--linux-7-0-vdvoe-snizhaet-proizvoditelnost">Инженер AWS обнаружил: Linux 7.0 вдвое снижает производительность PostgreSQL</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 06 Apr 2026 10:58:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>PostgreSQL — одна из самых нагруженных баз данных в мире, и её производительность критична для тысяч продуктов. Но инженер AWS обнаружил, что обычное обновление ядра Linux может вдвое обрушить throughput — без каких-либо изменений в самой СУБД.</p><p>Сальваторе Дипьетро (Salvatore Dipietro) из AWS <a href="https://www.phoronix.com/news/Linux-7.0-AWS-PostgreSQL-Drop">сообщил</a>: на Linux 7.0 с планировщиком PREEMPT_LAZY throughput PostgreSQL упал до <strong>0,51x</strong> по сравнению с Linux 6.x. То есть база данных стала работать почти вдвое медленнее — и виновата одна строка в ядре.</p><ul><li>Linux 7.0 убрал режим PREEMPT_NONE — остались только Full и Lazy preemption</li><li>Throughput PostgreSQL на Linux 7.0 упал до 0,51x (50 751 tps против 98 565 tps на Linux 6.x)</li><li>Причина: планировщик прерывает поток, держащий spinlock, — 55% CPU уходит на spinning в ожидании</li><li>Revert-патч восстанавливает производительность до 1,94x</li><li>Linux 7.0 stable выйдет примерно через 2 недели; Ubuntu 26.04 LTS будет на нём</li></ul><h2>Как обнаружили регрессию</h2><p>Дипьетро тестировал на EC2 m8g.24xlarge с 96-vCPU процессором Graviton4. Стенд: PostgreSQL 17, утилита pgbench, 1024 клиента, 96 потоков, длительность теста — 1200 секунд. Это типичная нагрузка высоконагруженного OLTP-сервиса.</p><p>На Linux 6.x результат составил <strong>98 565 tps</strong>. На Linux 7.0 с PREEMPT_LAZY — <strong>50 751 tps</strong>, то есть падение до 0,51x. После применения revert-патча производительность выросла до <strong>1,94x</strong> относительно Linux 6.x — и достигла 98 565 tps.</p><h2>Почему ядро изменили и при чём здесь spinlocks</h2><p>Виновен <a href="https://winbuzzer.com/2026/04/05/aws-engineer-reports-postgresql-perf-halved-by-linux-7-kernel-change-xcxwbn/">коммит 7dadeaa6e851</a> за авторством Питера Зийлстры (Peter Zijlstra) из Intel. В Linux 7.0 убрали режим PREEMPT_NONE: теперь доступны только Full и Lazy preemption. По умолчанию включён PREEMPT_LAZY.</p><p>Проблема в том, как PostgreSQL реализует spinlocks. Функция s_lock() в StrategyGetBuffer/GetVictimBuffer крутится в ожидании блокировки. При PREEMPT_LAZY планировщик может вытеснить поток прямо в тот момент, когда он держит spinlock. Все остальные потоки, ожидающие этот замок, начинают активно спиниться — и по замерам 55% CPU уходит именно на это бесполезное ожидание. Затронуты все основные архитектуры: arm64, x86, powerpc, riscv, s390, loongarch.</p><blockquote>PREEMPT_NONE означает, что задача будет выполняться до явного вызова schedule() или возврата из системного вызова/прерывания. Это исторически использовалось для серверных нагрузок с активным ожиданием, но мы убираем этот режим — он маскирует проблемы с блокировками вместо того, чтобы их решать.</blockquote><h2>Патовая ситуация: кто должен чинить?</h2><p>Разработчики ядра считают, что проблема на стороне PostgreSQL: база данных должна использовать механизм rseq (Restartable Sequences) — расширение Linux, позволяющее коду пространства пользователя эффективно работать с критическими секциями без spinlock-спиннинга.</p><blockquote>Правильное решение — использовать rseq time slice extension. Spinlock-спиннинг в пространстве пользователя изначально является проблемным паттерном в вытесняющей многозадачной среде.</blockquote><p>Но PostgreSQL rseq не поддерживает, и никаких сроков интеграции нет. Это классический тупик: ядро меняет поведение, опираясь на «правильную» архитектуру, а прикладное ПО годами использует привычные примитивы. В итоге пострадают администраторы баз данных, которые просто обновят ядро.</p><h2>Что делать администраторам PostgreSQL</h2><p>До тех пор, пока проблема не решена на уровне ядра или PostgreSQL, администраторам баз данных стоит учитывать следующее:</p><ul><li>Не обновляться на Linux 7.0 в production до появления официального патча или workaround</li><li>Отслеживать параметр preemption model ядра при обновлении дистрибутива</li><li>Ubuntu 26.04 LTS, выходящая примерно в конце апреля 2026, будет использовать Linux 7.0 — проверить совместимость заранее</li><li>При необходимости использовать кастомное ядро с revert-патчем коммита 7dadeaa6e851</li><li>Следить за обновлениями в PostgreSQL hackers mailing list и linux-kernel mailing list</li></ul><p>Регрессия производительности PostgreSQL на Linux 7.0 — наглядный пример того, как изменение в ядре может затронуть критическую инфраструктуру. До появления официального решения (патч ядра или поддержка rseq в PostgreSQL) администраторам баз данных следует воздержаться от обновления ядра в production-окружениях. Отслеживать развитие ситуации можно на <a href="https://www.phoronix.com/news/Linux-7.0-AWS-PostgreSQL-Drop">Phoronix</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>JOIN — не дорогая операция: бенчмарк на миллиарде строк это доказывает</title>
      <link>https://tproger.ru/translations/join---ne-dorogaya-operaciya--benchmark-na-milliarde-strok-eto-doka</link>
      <comments>https://tproger.ru/translations/join---ne-dorogaya-operaciya--benchmark-na-milliarde-strok-eto-doka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/join---ne-dorogaya-operaciya--benchmark-na-milliarde-strok-eto-doka</guid>
      <description><![CDATA[<p>Тесты на DuckDB и PostgreSQL показали: JOIN на 1 млрд строк быстрее и дешевле по CPU, чем One Big Table. Смотрите графики и SQL-код бенчмарка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/join---ne-dorogaya-operaciya--benchmark-na-milliarde-strok-eto-doka">JOIN — не дорогая операция: бенчмарк на миллиарде строк это доказывает</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 31 Mar 2026 12:49:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы наверняка слышали: «JOIN — это дорого, сделайте одну большую таблицу». Это заблуждение — одно из самых живучих в мире баз данных. Особенно часто его повторяют те, кто продвигает Data Lake и подход «One Big Table» (OBT). Но так ли это на самом деле?</p><p>Автор блога <a href="https://www.database-doctor.com/">Database Doctor</a> провёл серию бенчмарков на <a href="https://duckdb.org/">DuckDB</a> и <a href="https://www.postgresql.org/">PostgreSQL</a> (подробнее о нём — в нашем <a href="https://tproger.ru/articles/postgresql-basics">гайде по PostgreSQL</a>), сравнив классическую размерную модель (dimensional model) с подходом «One Big Table». Результаты оказались неожиданными для многих — JOIN не просто «не дорогой», он зачастую <b>быстрее</b> плоской таблицы.</p><p>— JOIN в колоночных СУБД (DuckDB) обходится дешевле, чем сканирование широкой OBT-таблицы, уже начиная с 4–6 колонок</p><p>— Стоимость сканирования OBT растёт нелинейно (примерно O(n log n)) с увеличением числа колонок</p><p>— В строковых хранилищах (PostgreSQL) JOIN тоже выигрывает на большинстве сценариев</p><p>— Ральф Кимбалл описал эти закономерности ещё в 1996 году в своей классической книге о размерном моделировании</p><p>— Даже при «бесконечном I/O» денормализация не экономит CPU — она его тратит</p><h2>Постановка эксперимента</h2><p>Рассмотрим два конкурирующих подхода к моделированию данных:</p><ul><li><b>Размерная модель (dimensional model)</b> — атрибуты продуктов хранятся в отдельной таблице product, и мы делаем JOIN с таблицей sales каждый раз при чтении</li><li><b>One Big Table (OBT)</b> — все атрибуты продуктов заранее «вклеены» в таблицу sales_obt, и мы читаем данные через SELECT без JOIN</li></ul><p>Очевидно, что вторую таблицу дороже строить в ETL-пайплайне. Но какая из них потребляет <b>меньше CPU при чтении</b>?</p><h3>Размерная модель</h3><p>Схема данных:</p><p>Здесь c01 ... c20 — строковые колонки с атрибутами продуктов. Кардинальности:</p><ul><li>product — 100 000 строк; каждая из колонок c01–c20 содержит ~100 уникальных значений (MD5-хеши)</li><li>sales — <b>1 миллиард строк</b> со случайным v и равномерно распределённым id_product</li></ul><p>Эта модель, где сущность (product) хранится отдельно от фактов (sales), называется <b>размерной моделью</b> (dimensional model). Подробнее о ней — в конце статьи.</p><h3>Генерация тестовых данных</h3><p>Сначала создаём seed-таблицу — универсальный способ генерации последовательности чисел, который работает практически на всех SQL-платформах:</p><p><i>Примечание: да, можно было бы использовать INSERT ... VALUES с несколькими кортежами, но не каждая аналитическая БД поддерживает этот синтаксис. Зато UNION ALL работает, кажется, вообще везде.</i></p><p>С помощью seed-таблицы генерируем миллиард строк для sales:</p><p>Таблицу product заполняем MD5-хешами для получения строковых значений с контролируемой кардинальностью:</p><p><i>Примечание: да, можно было бы взять ровно 100 различных значений вместо ~101 для c01–c20, но с приведённым выше кодом проще.</i></p><h3>Модель «One Big Table»</h3><p>На другой стороне ринга — заранее объединённая широкая таблица:</p><h3>Гипотеза: JOIN медленнее, чем плоская таблица</h3><p>Итак, вопрос: что быстрее?</p><p>Размерная модель с JOIN:</p><p>Или OBT без JOIN:</p><p>Если «JOIN — это дорого», то размерная модель должна быть медленнее. Мы также должны увидеть более высокое потребление CPU.</p><p>Чтобы быть <i>максимально нечестным</i> по отношению к размерной модели, автор запускает тесты на системе, где <b>вся база помещается в оперативную память</b>. Так мы моделируем «бесконечный I/O» и не платим за дисковые операции.</p><h2>Результаты DuckDB</h2><p>Тестовая машина: ноутбук с 14 ядрами, 32 ГБ RAM, SSD на 3 ГБ/с. Размер базы — 45 ГБ, из которых sales_obt занимает ~40 ГБ. DuckDB отлично утилизирует ядра: CPU загружен на 100% во время выполнения запросов.</p><p>Для тестов автор использовал серию запросов с нарастающим числом колонок:</p><p><i>Примечание: DuckDB использует написание EXPLAIN ANALYZE (а не ANALYSE). В оригинале автор шутит, что DuckDB «правильно» использует британское написание — но на самом деле в DuckDB работает американский вариант.</i></p><p>Базовый замер (measurement 0) — просто чтение v: мы платим за JOIN, но не запрашиваем колонки из product. Читатели, которых интересует эта крайняя ситуация и способы оптимизации, могут изучить тему <a href="https://www.databasedoctor.co/posts/join-elimination">join elimination в планировщиках запросов</a>. Каждый запрос выполняется трижды, берётся лучшее время.</p><h3>Время выполнения (wall clock)</h3><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-31/2511523a-e4c0-4871-a3c5-0b0e772d1c07.webp" alt="График: Wall Clock Dim vs OBT в DuckDB" /><figcaption>Время выполнения: размерная модель (Dim) vs One Big Table (OBT) в DuckDB</figcaption></figure><p>Выводы из графика:</p><ul><li>При запросе 1–2 колонок OBT <i>незначительно</i> быстрее</li><li>С ростом числа колонок стоимость OBT <b>взлетает</b> — до 15 секунд при 20 колонках</li><li>JOIN остаётся <b>практически константным</b> по времени (~1 секунда) независимо от числа колонок</li><li>Рост OBT напоминает O(n log n) — нелинейная зависимость</li></ul><h3>Потребление CPU</h3><p>DuckDB позволяет замерить CPU-время по каждому оператору в запросе:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-31/3eac03af-20e8-4c61-8eef-f31b8965a9c9.webp" alt="График: CPU usage OBT vs Dim в DuckDB" /><figcaption>Потребление CPU: OBT vs Dim (CPU по всем ядрам суммарно). Для размерной модели показаны stacked-значения: scan + join</figcaption></figure><p>Та же закономерность: OBT при 20 колонках потребляет <b>~200 секунд CPU</b>, тогда как размерная модель — всего <b>~15 секунд</b> (scan + join). Разница — на <b>порядок</b>.</p><h3>Почему JOIN быстрее при масштабировании?</h3><p>Казалось бы, мы читаем каждую строку. Почему не быстрее просто отдать её из плоской таблицы?</p><p>Ответ кроется в том, как работают <b>колоночные хранилища</b> (DuckDB, Parquet и другие):</p><ol><li><b>Декомпрессия колонок.</b> Сжатые строки хранятся в словаре (dictionary encoding). Чтобы получить данные, движок «соединяет» указатели в сегментах сжатия со словарём. Это по сути тоже своего рода JOIN — но уже внутри Storage Engine. В размерной модели строки уже «материализованы» в таблице product, и эта «декомпрессия» фактически заранее выполнена</li><li><b>Сборка строк из колонок.</b> В колоночном формате данные каждой колонки хранятся отдельно. Чтобы собрать строку, нужно пройти по метаданным, найти местоположение каждой колонки и скопировать данные в финальный результат. Каждая колонка — это отдельная аллокация (и деаллокация) памяти. Именно этот механизм, вероятно, и даёт <b>нелинейный рост</b> стоимости сканирования широкой OBT-таблицы</li></ol><h2>А что насчёт строковых хранилищ?</h2><p>Не все базы данных используют колоночное сжатие. Строковые хранилища (row stores) хранят данные в формате строк (аналогично AVRO в мире Data Lake).</p><p>У строковых хранилищ есть интересное свойство: им <b>не нужно «собирать» строку</b> из отдельных колонок — строка уже хранится целиком. Правда, они занимают больше места на диске и хуже работают при чтении отдельных колонок.</p><p>Вопрос: может быть, для OBT лучше использовать строковое хранилище? Давайте проверим.</p><h3>Гипотеза автора</h3><p><b>В пользу OBT в строковом хранилище:</b></p><ul><li>Данные можно отдать напрямую, без «сборки» строк из колонок</li><li>Не нужна «неявная декомпрессия» сжатых строк</li><li>JOIN на строковых форматах медленнее, чем на колоночных — нельзя векторизовать хеширование</li></ul><p><b>В пользу JOIN:</b></p><ul><li>Если нужна часть колонок, проекция (отбрасывание ненужных) стоит CPU — это неявный memcpy</li><li>Больший объём данных при сканировании — больше работы с буферами</li><li>У JOIN лучше кеш-локальность для строк — меньше TLB-промахов</li></ul><p>Интуиция автора подсказывает, что строковые хранилища могут сдвинуть «точку пересечения» дальше от одной колонки и дать больше преимуществ OBT — хотя бы потому, что не нужна «сборка» строки. Давайте проверим.</p><h3>Тест на PostgreSQL 17</h3><p>Для теста автор выбрал PostgreSQL 17 — классическое строковое хранилище. Датасет уменьшен до 1% (10 млн строк в sales, 10 000 строк в product), но и так sales_obt занимает 7 ГБ.</p><p>Чтобы убрать стоимость сериализации результата для клиента, вместо SELECT * используется:</p><p><i>Примечание: PostgreSQL сериализует результат в клиентский формат даже при EXPLAIN ANALYZE. Это дополнительная работа, которой лишены системы, использующие Arrow-буферы, — там промежуточная сериализация не нужна.</i></p><p>Чтобы убедиться, что PostgreSQL не «хитрит» с NULL-проверкой в COUNT, автор проверил план выполнения. Видно, что агрегат действительно работает со строкой, ширина которой пропорциональна числу входных колонок:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-31/c2bb9fe1-f7f0-46f5-a79a-12b37d21aae4.webp" alt="График: Wall Time Row Store PostgreSQL" /><figcaption>Время выполнения: PostgreSQL OBT vs JOIN (строковое хранилище)</figcaption></figure><p>Выводы:</p><ul><li>Как и предполагалось, стоимость «проекции» (отбрасывания ненужных колонок) доминирует при малом числе колонок — OBT проигрывает</li><li><b>Вопреки ожиданиям</b>, даже в базовом случае (0 колонок из JOIN) размерная модель оказывается быстрее</li><li>Красивая <b>линейная</b> зависимость: строковое хранилище масштабируется предсказуемо в обоих случаях</li><li>JOIN выигрывает или проигрывает OBT <b>с минимальной разницей</b> — но тренд в пользу JOIN</li></ul><h3>Глубокое погружение: что именно тормозит PostgreSQL?</h3><p>С помощью EXPLAIN (ANALYZE, BUFFERS) автор убедился, что запрос работает полностью в памяти:</p><p>shared hit=909120 означает, что все буферы были прочитаны из памяти (shared buffers), без обращения к диску. PostgreSQL форкает процесс на каждое соединение, поэтому профилировать конкретный запрос можно через SELECT pg_backend_pid().</p><p>Автор использовал Windows Performance Recorder для профилирования PostgreSQL на 16-колоночном запросе:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-31/9e988bc4-1aee-40f1-9a2f-8c9434939fc4.webp" alt="Скриншот: PostgreSQL trace в Windows Performance Recorder" /><figcaption>Трассировка PostgreSQL: горячие функции при сканировании OBT</figcaption></figure><p>Два самых горячих вызова:</p><ol><li><b>tts_buffer_heap_getsomeattrs</b> (файл execTuples.c) — по сути, неоптимальный memcpy. Эта функция копирует данные из буферного пула в представление кортежа. Именно та «проекция», которую автор предсказывал — но реализованная неэффективно</li><li><b>ExecInterpExpr</b> (файл execExprInterp.c) — интерпретатор выражений. Современные БД используют векторизованное или компилированное выполнение; PostgreSQL по умолчанию интерпретирует через гигантский switch-блок (JIT-компиляция через LLVM доступна с PG 11, но не используется на дефолтных настройках для дешёвых запросов). Основной вызывающий — ExecAgg: подсчёт COUNT обходится почти так же дорого, как само чтение данных</li></ol><p>Важная оговорка: PostgreSQL — <b>не идеальный представитель строковых хранилищ</b>. Базы данных с компилируемыми запросами могут быть значительно быстрее при «сыром сканировании». Тем не менее, строковые хранилища, похоже, почти всегда выигрывают от использования JOIN — если только вы не планируете выбирать практически все колонки из OBT в каждом запросе. Даже денормализация одной колонки ради экономии CPU может оказаться ошибочной.</p><h3>Как автор собирал PostgreSQL с отладочными символами</h3><p>Для профилирования PostgreSQL нужны debug-символы. Ни пакет Chocolatey, ни установщик EnterpriseDB их не включают — пришлось собирать из исходников на Windows.</p><p>Необходимые пакеты:</p><p>Файл msvc.ini в корне репозитория PostgreSQL:</p><p>Сборка:</p><h2>Размерная модель: уроки прошлого</h2><p>Всё, что мы наблюдаем, не ново. Ещё в 1996 году <b>Ральф Кимбалл</b> опубликовал книгу <a href="https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/books/data-warehouse-dw-toolkit/">«The Data Warehouse Toolkit»</a>, которая до сих пор переиздаётся и считается классикой.</p><p>Кимбалл аргументировал:</p><ul><li>Большие аналитические таблицы (<b>факты</b>) должны содержать только метрики (то, что агрегируется) и <b>целочисленные ключи измерений</b> (то, по чему делается JOIN)</li><li>Все атрибуты сущностей хранятся в отдельных <b>таблицах измерений</b> (dimension tables), к которым присоединяются через foreign key</li><li>Колонки с высокой кардинальностью и единственным значением лучше хранить прямо в таблице фактов — <b>«вырожденные измерения»</b> (degenerate dimensions). Это идеально соответствует нашему наблюдению: чтение одной колонки через JOIN действительно немного медленнее</li></ul><p>Кимбалл также рекомендовал объединять связанные таблицы <i>внутри</i> самого измерения (делая таблицу измерения шире) — но только для измерений, <b>не для фактов</b>. И делал он это не ради производительности, а для упрощения работы оптимизатора запросов.</p><h2>Итоги</h2><p>Главный вывод:</p><blockquote>«JOIN — НЕ дорогая операция по сравнению с альтернативами»</blockquote><p>Что мы выяснили:</p><ul><li>Даже при чтении <b>всех</b> строк JOIN зачастую дешевле, чем сканирование One Big Table</li><li>В колоночных хранилищах (DuckDB) преимущество JOIN проявляется начиная с 4–6 колонок и растёт <b>нелинейно</b></li><li>В строковых хранилищах (PostgreSQL) JOIN тоже выигрывает на большинстве сценариев</li><li>«Жертвовать диском ради экономии CPU на JOIN» — это миф, который противоречит измерениям</li><li>Размерное моделирование (Кимбалл, 1996) — не устаревшая методология, а эффективный инженерный подход</li></ul><p>Важно помнить: мы тестировали JOIN большой таблицы (1 млрд строк) с маленькой (100 000 строк). Что произойдёт при JOIN двух больших таблиц — вопрос для отдельного исследования.</p><p>В следующей статье автор обещает разобрать, что происходит с производительностью при добавлении <b>фильтров</b>. Спойлер: разрыв между OBT и JOIN становится ещё больше в пользу JOIN — благодаря bloom-фильтрам и pushdown-оптимизациям.</p><p><i>Перевод и адаптация статьи <a href="https://www.database-doctor.com/posts/joins-are-not-expensive">«Joins are NOT Expensive!»</a> из блога Database Doctor. Если вы хотите глубже разобраться в SQL — рекомендуем нашу <a href="https://tproger.ru/articles/sql-cheat-sheet">шпаргалку по SQL</a>.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>TurboQuant неделю спустя: что показали первые бенчмарки и реализации</title>
      <link>https://tproger.ru/articles/turboquant-nedelyu-spustya--pervye-benchmarki--realizacii-i-podvodn</link>
      <comments>https://tproger.ru/articles/turboquant-nedelyu-spustya--pervye-benchmarki--realizacii-i-podvodn?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/turboquant-nedelyu-spustya--pervye-benchmarki--realizacii-i-podvodn</guid>
      <description><![CDATA[<p>Неделя после анонса TurboQuant от Google. Q8+rotation почти без потерь, но Q4 проблемный. Разбираем бенчмарки, реализации для llama.cpp и подводные камни.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/turboquant-nedelyu-spustya--pervye-benchmarki--realizacii-i-podvodn">TurboQuant неделю спустя: что показали первые бенчмарки и реализации</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Mar 2026 03:59:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Прошла неделя с момента публикации <a href="https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/">TurboQuant</a> — алгоритма Google Research для сжатия KV-кеша LLM до 3–4 бит. <a href="https://tproger.ru/articles/google-turboquant-prostymi-slovami--kak-szhat-nejroset-v-6-raz-">Мы уже разбирали</a>, как он работает технически. Теперь — что из этого вышло на практике: первые бенчмарки показали, что Q8 с rotation почти не теряет качество (37,1% vs 37,9% на AIME25), сообщество создало рабочие реализации для llama.cpp, но скорость пока падает в 3–8 раз.</p><p>TurboQuant — алгоритм квантизации KV-кеша (Key-Value cache), промежуточного буфера, в котором LLM хранят контекст разговора. Сжимает его с 16 до 3–4 бит на значение без переобучения модели. Статья принята на ICLR 2026 (<a href="https://arxiv.org/abs/2504.19874">arXiv:2504.19874</a>).</p><p>— Сообщество создало рабочие реализации TurboQuant для llama.cpp, MLX и PyTorch</p><p>— Q8 KV-кеш с rotation — почти без потерь (37,1% vs 37,9% F16 на AIME25)</p><p>— Q4 пока проблемный для K-тензоров, рекомендуют TQ8 для K + TQ4 для V</p><p>— Текущие реализации в 3–8 раз медленнее из-за неоптимизированного поворота вектора</p><p>— Главный выигрыш — длинные контексты: 70B-модель может уместить 536K токенов вместо 109K</p><h2>Первые бенчмарки: что показали числа</h2><p>Один из первых тестов <a href="https://www.reddit.com/r/LocalLLaMA/comments/1s76bjg/what_will_googles_turboquant_actually_change_for/">опубликован</a> на r/LocalLLaMA — результаты на математическом бенчмарке AIME25 (чем выше — тем лучше). Связанный <a href="https://github.com/ggml-org/llama.cpp/discussions/20969">PR в llama.cpp</a> подтверждает данные:</p><ul><li>F16 KV-кеш (без сжатия): <b>37,9%</b></li><li>Q8_0 без rotation: <b>31,7%</b> — потеря 6,2 п.п.</li><li>Q8_0 с rotation (TurboQuant): <b>37,1%</b> — почти полное восстановление</li><li>Q4_0 без rotation: <b>2,0%</b> — катастрофическая деградация</li><li>Q4_0 с rotation: <b>21,7%</b> — значительное улучшение, но всё ещё далеко от F16</li></ul><p>Вывод: при 8-битной квантизации KV-кеша rotation практически полностью компенсирует потерю качества. При 4-битной — улучшение радикальное (с 2% до 21,7%), но до lossless ещё далеко. Безопасный минимум на сегодня — Q8 с rotation для K-тензоров и Q4 для V-тензоров.</p><h2>Проблема K-тензоров: не всё сжимается одинаково</h2><p>Разработчик inference-движка Llaminar <a href="https://www.reddit.com/r/LocalLLaMA/comments/1s76bjg/what_will_googles_turboquant_actually_change_for/">провёл</a> детальный анализ cosine similarity между сжатым и эталонным FP32-выходом на нескольких моделях. Главный вывод: K-тензоры (Key) и V-тензоры (Value) ведут себя при квантизации принципиально по-разному.</p><p>V-тензоры хорошо переносят 4-битное сжатие. K-тензоры — нет. Причина: K-тензоры имеют значительно более высокие нормы векторов по сравнению с V. Измерения показывают соотношение K/V-норм до 100–180x у современных моделей (Qwen2.5, GPT-2). Ошибка квантизации масштабируется с квадратом нормы, поэтому K-тензорам нужно больше бит для сохранения точности.</p><p>Практическая рекомендация: <b>TQ8 для K-тензоров + TQ4 для V-тензоров</b>. Это даёт хорошую экономию памяти при минимальной потере качества — компромисс, который подтверждён и бенчмарками, и cosine similarity анализом.</p><h2>Где TurboQuant действительно меняет правила</h2><p>Главный выигрыш — не скорость генерации (она пока даже падает), а <b>объём контекста</b>, который помещается в память. Расчёт из <a href="https://github.com/ggml-org/llama.cpp/discussions/20969">обсуждения llama.cpp</a> для модели 70B Q4_K_M с 34 ГБ свободной VRAM:</p><ul><li>FP16 KV-кеш: ~109K токенов</li><li>Q8 KV-кеш: ~218K токенов (2x)</li><li>TurboQuant TQ3: ~536K токенов (5x)</li></ul><p>Это значит: одна видеокарта с 48 ГБ памяти может работать с контекстом, который раньше требовал 3–4 карты. Для владельцев MacBook с Apple Silicon — локальная модель на 16 ГБ RAM теперь «видит» в 3–5 раз больше текста при той же скорости.</p><h2>Реализации TurboQuant: кто уже попробовал</h2><p>Официального кода от Google нет (ожидается во 2-м квартале 2026). Но сообщество уже создало рабочие реализации, а в vLLM открыт активный PR на нативную интеграцию:</p><ul><li><b>llama.cpp</b> — минимум 3 независимых форка. <a href="https://github.com/ggml-org/llama.cpp/discussions/20969">Обсуждение</a> интеграции в основную ветку. Флаги зависят от форка: --cache-type-k turbo3 (TheTom) или tq3_0 (другие форки)</li><li><b>MLX</b> — адаптация для Apple Silicon (M1–M5)</li><li><b>PyTorch + Triton</b> — reference-реализации для CUDA. Один разработчик получил побитово идентичный выход на Gemma 3 4B при 2-битной точности на RTX 4090</li><li><b>vLLM</b> — активный PR на нативную интеграцию TurboQuant как опции KV-кеша</li></ul><p>Главная проблема текущих реализаций — скорость. Операция поворота вектора (rotation) пока не оптимизирована: сложность O(d²) вместо O(d log d). Замедление составляет 3–8x по сравнению с обычным Q8 KV-кешем. Разработчики работают над оптимизацией через преобразование Уолша–Адамара (Walsh-Hadamard transform), которое снизит сложность до O(d log d).</p><blockquote>Реализации TurboQuant очень зависят от качества кода. Я видел vibecoded-реализации со скрытыми багами, которые убивали производительность.</blockquote><h2>Реакция рынка</h2><p>В день публикации TurboQuant 25 марта 2026 года акции производителей памяти <a href="https://www.cnbc.com">снизились</a>: SK Hynix потеряла 6,2%, Samsung — 4,8%, Micron — 3,4%. Логика рынка: если inference требует в 6 раз меньше памяти — спрос на HBM снижается. Но это упрощение: TurboQuant сжимает только KV-кеш, а не веса модели, и дешёвый inference увеличивает спрос на LLM в целом.</p><h2>Что это значит для вас</h2><p>Если вы запускаете LLM локально через llama.cpp, Ollama или LM Studio — в ближайшие месяцы ожидайте нативную поддержку TurboQuant. Практический эффект:</p><ul><li><b>Длинные контексты без нового железа</b> — ваша текущая видеокарта или MacBook сможет работать с 3–5x большим контекстом</li><li><b>Оптимальная конфигурация</b> — TQ8 для K + TQ4 для V. Чистый TQ4 для обоих пока даёт заметную деградацию на K-тензорах</li><li><b>Скорость пока не выигрыш</b> — текущие реализации замедляют генерацию в 3–8 раз. Ждите оптимизированных ядер с Walsh-Hadamard transform</li><li><b>Комбинируйте с квантизацией весов</b> — TurboQuant сжимает KV-кеш, а не веса. Q4-модель + TQ4-кеш = максимальная экономия памяти</li></ul><h2>Выводы</h2><p>TurboQuant — не серебряная пуля, но значимый шаг для локального inference. Rotation при Q8 KV-кеше работает почти без потерь. Q4 пока проблемный для K-тензоров, но V-тензоры сжимаются хорошо. Главный практический выигрыш — длинные контексты на существующем железе без покупки новых карт.</p><p>Скорость текущих реализаций — слабое место, но алгоритм публичен всего неделю, и оптимизации уже в работе. Через пару месяцев TurboQuant, скорее всего, станет стандартной опцией в llama.cpp и его производных.</p><p>Ссылки: <a href="https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/">Блог Google Research</a> | <a href="https://github.com/ggml-org/llama.cpp/discussions/20969">Обсуждение в llama.cpp</a> | <a href="https://tproger.ru/articles/google-turboquant-prostymi-slovami--kak-szhat-nejroset-v-6-raz-">Наш разбор алгоритма</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как случайно написать самый быстрый CSV-парсер на C#</title>
      <link>https://tproger.ru/translations/kak-sluchajno-napisat-samyj-bystryj-csv-parser-na-c-</link>
      <comments>https://tproger.ru/translations/kak-sluchajno-napisat-samyj-bystryj-csv-parser-na-c-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kak-sluchajno-napisat-samyj-bystryj-csv-parser-na-c-</guid>
      <description><![CDATA[<p>Как SIMD-инструкции SSE2 и AVX2 ускоряют парсинг CSV в 10 раз. Разбираем путь от наивной реализации до библиотеки, обогнавшей Sep в 41 из 70 бенчмарков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kak-sluchajno-napisat-samyj-bystryj-csv-parser-na-c-">Как случайно написать самый быстрый CSV-парсер на C#</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 28 Mar 2026 15:28:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>На рождественских каникулах 2025 года автор библиотеки <a href="https://github.com/bbepis/FourLambda.Csv">FourLambda.Csv</a> ехал в автобусе и читал про UTF-8. Обнаружив, что все ASCII-символы в UTF-8 занимают ровно один байт, он начал экспериментировать с подсчётом символов на максимальной скорости. Через несколько дней у него был готовый CSV-парсер на C#, который обогнал все существующие библиотеки в большинстве бенчмарков. Вот как это произошло.</p><blockquote><b>Ключевые выводы</b><br />- SIMD-инструкции (SSE2, AVX2) позволяют обрабатывать 16-32 байта за одну операцию<br />- В UTF-8 все управляющие символы CSV (запятая, кавычка, перенос строки) занимают ровно один байт и совпадают с ASCII<br />- Минималистичный код (16 КБ) побеждает оптимизированный, но раздутый (163 КБ) за счёт давления на L1-кэш процессора<br />- Компилятор и рантайм умеют оптимизировать лучше, если им не мешать микрооптимизациями</blockquote><h2>Наивная реализация — считаем запятые</h2><p>Прежде чем строить парсер, поставим простую задачу: как быстрее всего подсчитать, сколько раз символ , встречается в большом UTF-8-файле? Тестируем на CSV-файле размером 500 МБ.</p><h3>Базовая реализация: 135,305 мс</h3><p>Простейший вариант: перебираем каждый байт и сравниваем с искомым. Можно ли лучше?</p><h3>Unsafe-указатели: 128,683 мс</h3><p>Каждый раз, когда вы обращаетесь к массиву через data[i], рантайм .NET выполняет проверку границ (bounds checking) — убеждается, что индекс не выходит за пределы массива. Если вместо этого использовать unsafe-указатели, мы обещаем рантайму, что не выйдем за границы. Экономия — 7 мс.</p><h3>Развёртка цикла (unrolling 4x): 105,320 мс</h3><p>Механика цикла for обманчиво дорога: на каждой итерации нужно проверить условие выхода и выполнить переход в начало. Если обрабатывать по 4 элемента за итерацию, накладные расходы снижаются в четыре раза. «Хвост» данных, не кратный четырём, обрабатывается обычным побайтовым циклом.</p><h2>Проблема — UTF-8 и Unicode ломают всё</h2><p>Чтобы понять, почему мы можем сканировать текст <i>настолько</i> быстро, нужно разобраться, как текст хранится в памяти компьютера.</p><p>Наименьшая единица данных — байт (числа 0-255). Но человечество использует гораздо больше 256 символов. Ранние системы решали это через кодовые страницы — у каждого региона была своя таблица. Японские системы использовали Shift-JIS, в Китае по закону обязателен GB 18030. Если открыть файл в неправильной кодировке, вы увидите «крокозябры» (mojibake) — бессмысленный набор символов.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/1dd24e6b-e5ac-4bc8-986c-9c0566debde9.webp" alt="Пример mojibake — крокозябры при открытии файла в неправильной кодировке" /><figcaption>Так выглядит mojibake — результат открытия файла в неправильной кодировке</figcaption></figure><p>Unicode решил эту проблему в 90-х: каждому символу присваивается номер (codepoint), а разные кодировки (UTF-8, UTF-16, UTF-32) определяют, как эти номера записываются в байты.</p><p>Вот как UTF-8 кодирует символы в зависимости от количества байтов:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/09bc69c0-ede8-4534-a016-3d01c7f7357f.webp" alt="Таблица ASCII — первые 128 символов, которые в UTF-8 кодируются одним байтом" /><figcaption>Таблица ASCII-символов: все они кодируются в UTF-8 ровно одним байтом</figcaption></figure><p>Ключевой факт: байты 0x00-0x7F в UTF-8 <b>полностью совпадают</b> с ASCII. Это значит, что управляющие символы CSV — запятая (,), кавычка ("), перевод строки (\n) — всегда занимают ровно один байт, независимо от того, какие Unicode-символы находятся в данных. И это можно использовать для невероятно быстрого сканирования.</p><h2>SIMD — ускорение через параллельные инструкции</h2><p>До сих пор мы обрабатывали по одному байту за раз. Представьте сложение двух массивов по 8 элементов — нужно 8 отдельных операций сложения. Можно распараллелить это по потокам, но управление потоками создаёт накладные расходы и не добавляет эффективности.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/a70a8c10-6a79-472a-b254-0c372fe72b71.webp" alt="Скалярное сложение — один элемент за раз" /><figcaption>Скалярная операция: процессор обрабатывает по одному элементу</figcaption></figure><p><b>SIMD</b> (Single Instruction, Multiple Data) — это набор процессорных инструкций, которые выполняют одну операцию сразу над несколькими элементами данных. Вся магия происходит в железе, поэтому результат приходит за то же время, что и обычная операция над одним элементом.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/1e1ba95a-bfc8-4abe-9db0-6a1d8fb8380a.webp" alt="SIMD — параллельная обработка нескольких элементов" /><figcaption>SIMD: четыре операции сложения за одну инструкцию</figcaption></figure><p>Аналогия: сложить два однозначных числа (8 + 2) — просто. Сложить два семизначных — нужно перебирать разряды. А теперь представьте, что вы можете «увидеть» сумму двух семизначных чисел мгновенно, с той же лёгкостью, что и однозначных. Это и есть SIMD.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/71aa521a-5fb7-457b-abdd-e169a3fba9ae.webp" alt="Широкий SIMD-регистр обрабатывает ещё больше данных" /><figcaption>Более широкие регистры позволяют обрабатывать больше элементов за такт</figcaption></figure><p>Вот как выглядит SIMD-сложение 4 элементов за одну операцию:</p><p>Мы делаем в 4 раза больше работы за то же усилие.</p><h3>SSE2: 46,663 мс</h3><p>SSE2 (появился в x86-процессорах в 2000 году) работает с 128-битными регистрами — 16 байтов за раз. Алгоритм такой:</p><ol><li>Загрузить 16 байтов данных в SIMD-вектор</li><li>Сравнить каждый байт с искомым (Sse2.CompareEqual) — на позициях совпадений появятся байты 255, на остальных — 0</li><li>Извлечь старшие биты из каждого байта (Sse2.MoveMask) — получаем 16-битное число, где каждый установленный бит означает совпадение</li><li>Подсчитать установленные биты</li></ol><p>Для строки "Hello, I, like, commas." это выглядит так:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/64b6f6ff-d258-444a-9c06-9f382ab70ae9.webp" alt="Поиск разделителей через SIMD — CompareEqual и MoveMask" /><figcaption>SIMD-поиск запятых: сравнение вектора данных с вектором разделителей</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/6f22e456-df00-4a1e-aa15-3becd73f67b1.webp" alt="Расширенная SIMD-диаграмма для строки с Unicode" /><figcaption>Поиск разделителей в строке с Unicode-символами</figcaption></figure><h3>AVX2: 42,220 мс</h3><p>AVX2 (с 2011 года) расширяет регистры до 256 битов — 32 байта за итерацию. Код аналогичен SSE2, но с Vector256 вместо Vector128.</p><p>Прирост скромный — значит, узкое место сместилось на цикл обработки маски. Нужно ускорить подсчёт битов.</p><h3>AVX2 + TZCNT: 16,630 мс</h3><p>BitOperations.TrailingZeroCount — аппаратная инструкция TZCNT, которая мгновенно находит позицию младшего установленного бита. Вместо того чтобы перебирать биты маски по одному, мы прыгаем сразу к следующему совпадению и сбрасываем его.</p><h3>AVX2 + POPCNT: 13,673 мс</h3><p>А есть ещё лучше. BitOperations.PopCount — аппаратная инструкция POPCNT, которая за одну операцию считает количество установленных битов в числе. Именно то, что нам нужно:</p><p>Мы достигли потолка производительности для подсчёта символов. Ускорение в 10 раз по сравнению с наивной реализацией — отличный результат. Пора применить это к парсингу CSV.</p><h2>Поиск разделителей через SIMD</h2><p>При парсинге CSV нас интересуют три управляющих символа: запятая (,), кавычка (") и перевод строки (\n). Правила обработки:</p><ul><li>Запятая — конец текущего поля</li><li>Перевод строки — конец текущей строки</li><li>Кавычка — начало или конец экранированного блока (внутри которого запятые и переносы игнорируются). Две кавычки подряд — это экранированная кавычка в значении</li></ul><p>Парсинг разбивается на два этапа. Первый — определение позиций и длин полей через SIMD (функция DetermineFields). Второй — фактическое извлечение и дeкодирование значений, только когда пользователь их запрашивает.</p><p>Вот упрощённый код первого этапа (без обработки краевых случаев):</p><p>Несколько важных деталей:</p><ul><li>Здесь используется TrailingZeroCount вместо PopCount, потому что нам важна позиция каждого найденного символа, а не только их количество</li><li>Одна и та же схема CompareEqual + MoveMask применяется для каждого управляющего символа, а затем маски объединяются через OR. Отдельные маски сохраняются, чтобы потом определить тип найденного символа</li><li>Мы не касаемся содержимого полей — если пользователю нужен только один столбец, незачем декодировать остальные</li></ul><h2>Обработка кавычек и экранирования</h2><p>Когда поле содержит кавычки, нужно выполнить декодирование вручную — убрать обрамляющие кавычки и заменить двойные кавычки на одинарные. Кроме того, C# внутри использует UTF-16 для всех строк (char — это 16-битная единица кода), поэтому при чтении UTF-8 приходится конвертировать.</p><p>Если кавычек в поле нет, используется быстрая встроенная конвертация Encoding.UTF8.GetChars. Но если кавычки есть, быстрее выполнить конвертацию и удаление кавычек за один проход:</p><p>Хитрость здесь в том, что 2- и 3-байтовые UTF-8-последовательности всегда дают одну единицу кода UTF-16, поэтому кодпоинт можно просто привести к char. Четырёхбайтовые символы (эмодзи и редкие иероглифы) требуют суррогатных пар.</p><p>Для UTF-16-строк (внутренний формат C#) парсер использует трюк с Avx2.PackUnsignedSaturate: два 256-битных вектора 16-битных символов «сжимаются» в один 256-битный вектор 8-битных байтов. ASCII-символы сохраняются как есть, а все не-ASCII насыщаются до 255 (или 0 для отрицательных при знаковой интерпретации). После перестановки блоков через Avx2.Permute4x64 можно применять ту же маску, что и для UTF-8.</p><h2>Бенчмарки — результаты</h2><p>Существующие бенчмарки CSV-парсеров на C# тестируют только один файл — по сути, они измеряют не парсинг CSV, а производительность на одном конкретном сценарии. Поэтому автор создал собственный набор тестов с разными типами данных:</p><ul><li><b>Реальные данные Reddit</b> — широкий датасет с разными типами данных и большим количеством текста (из Reddit ArcticShift)</li><li><b>Международный текст</b> — CSV с названиями предметов из Pokemon на множестве языков (кириллица, японский, корейский)</li><li><b>Финансовые данные</b> — числа с минимумом текста</li><li><b>Синтетические тесты</b> — числовые поля, короткие файлы (50 строк), файлы с обязательным экранированием, «стресс-тест» с массой кавычек</li></ul><p>Полные результаты опубликованы на <a href="https://bepis.io/csv-benchmark/">bepis.io/csv-benchmark</a>.</p><p>Итог: <b>FourLambda.Csv оказался самым быстрым в 41 из 70 тестов</b>. Не абсолютная победа, но убедительное лидерство.</p><p>Для сравнения, вот как менялась скорость подсчёта символов на файле 500 МБ по мере оптимизации:</p><h3>Почему FourLambda.Csv быстрее Sep</h3><p>До этого самым быстрым CSV-парсером на C# считалась библиотека <a href="https://github.com/nietras/Sep">Sep</a>. Вот несколько причин, почему FourLambda.Csv выигрывает:</p><p><b>UTF-8 без промежуточной конвертации.</b> Sep внутри конвертирует UTF-8 в UTF-16 даже если данные не нужны пользователю. FourLambda.Csv работает напрямую с UTF-8.</p><p><b>Давление на кэш.</b> L1-кэш процессора — около 32-64 КБ, и он хранит не только данные, но и исполняемый код. FourLambda.Csv весит ~16 КБ, а Sep — ~163 КБ. Разница в 10 раз означает, что Sep может вытеснять данные из L1-кэша, вызывая медленные обращения к памяти.</p><p><b>Переоптимизация.</b> Sep тщательно контролирует, как данные перемещаются между регистрами. Теоретически это быстрее, но на практике может мешать оптимизациям рантайма. Компилятор и процессор умеют оптимизировать код, если им не указывают точный способ выполнения. Чрезмерная микрооптимизация «связывает руки» и мешает автоматическим улучшениям в новых версиях .NET.</p><p><b>Зависимость от оборудования.</b> Результаты могут отличаться на разных машинах. Например, Sse.Prefetch0 (предзагрузка данных в L1) давала +10-20% на ноутбуке с DDR3, но почти нулевой эффект на десктопе с DDR5. На системах с AVX-512 и ARM у Sep есть аппаратные оптимизации, которых пока нет в FourLambda.Csv.</p><h2>Выводы</h2><p>История этого проекта — хороший пример того, как глубокое понимание низкоуровневых деталей (кодировки, устройство кэша, SIMD-инструкции) может привести к результатам, которые превосходят годы целенаправленных оптимизаций в существующих библиотеках.</p><p>Главные уроки:</p><ul><li>SIMD — не магия для избранных. В C# интринсики доступны из коробки и дают кратный прирост на задачах поиска и сравнения</li><li>UTF-8-совместимость ASCII — мощное свойство, которое можно эксплуатировать для быстрого парсинга</li><li>Минимализм побеждает сложность: меньше кода — меньше давления на кэш — быстрее выполнение</li><li>Не мешайте компилятору: иногда лучшая оптимизация — не оптимизировать вручную</li></ul><p>Библиотека доступна на GitHub: <a href="https://github.com/bbepis/FourLambda.Csv">bbepis/FourLambda.Csv</a>.</p><p><i>Перевод и адаптация статьи <a href="https://bepis.io/blog/turbo-csv-parser/">How I accidentally made the fastest C# CSV parser</a> с разрешения автора.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Пропуск 90% работы по деквантизации ускорил декодирование LLM на 22,8%</title>
      <link>https://tproger.ru/news/propusk-90--raboty-po-dekvantizacii-uskoril-dekodirovanie-llm-na</link>
      <comments>https://tproger.ru/news/propusk-90--raboty-po-dekvantizacii-uskoril-dekodirovanie-llm-na?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/propusk-90--raboty-po-dekvantizacii-uskoril-dekodirovanie-llm-na</guid>
      <description><![CDATA[<p>Разработчик ускорил декодирование LLM на 22,8% тремя строками кода: sparse V dequantization пропускает деквантизацию KV-кеша для позиций с малым весом внимания.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/propusk-90--raboty-po-dekvantizacii-uskoril-dekodirovanie-llm-na">Пропуск 90% работы по деквантизации ускорил декодирование LLM на 22,8%</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 28 Mar 2026 07:53:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Три строчки кода в ядре flash attention — и декодирование большой языковой модели ускоряется на 22,8%. Без потери качества, без переобучения, без изменений в архитектуре модели.</p><p>Независимый разработчик <a href="https://github.com/TheTom">Tom Turney</a> опубликовал метод sparse V dequantization — оптимизацию для инференса LLM с квантизированным KV-кешем. Вместо того чтобы ускорять деквантизацию каждого значения, он предложил пропускать деквантизацию целиком для позиций, где вес внимания пренебрежимо мал. На Apple M5 Max с моделью Qwen 3.5 35B (MoE) метод дал прирост +22,8% к скорости декодирования на контексте 32K токенов. Перплексия осталась неизменной, а точность поиска needle-in-a-haystack выросла с 7/9 до 9/9.</p><blockquote><b>Ключевые выводы</b><br /><br />— Узкое место квантизированного KV-кеша — не то, <i>как</i> вы деквантизуете, а то, <i>сколько</i> значений вы деквантизуете.<br />— При длинном контексте (32K+) более 90% весов внимания пренебрежимо малы — их деквантизацию можно пропустить.<br />— Метод работает с любой схемой квантизации KV-кеша: TurboQuant, q8_0, q4_0, NVFP4.<br />— Реализация — 3 строки в ядре flash attention. Не нужно ни переобучение, ни калибровочные данные.<br />— NIAH-тест улучшился: 9/9 вместо 7/9. Пропуск деквантизации убирает квантизационный шум от позиций, которые ничего не вносят в результат.</blockquote><h2>Проблема — узкое место деквантизации</h2><p>Чтобы понять суть открытия, нужно разобраться в контексте. Современные LLM при генерации текста хранят промежуточные вычисления в так называемом <b>KV-кеше</b> (key-value cache). Это массив ключей (K) и значений (V), которые модель использует в механизме внимания — чтобы при генерации каждого нового токена не пересчитывать всю историю диалога.</p><p>Проблема: KV-кеш растёт линейно с длиной контекста и при 32K токенов занимает гигабайты памяти. Решение — <b>квантизация</b>: сжатие значений из 16-битного формата в 3-4 бита. <a href="https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/">TurboQuant</a> от Google (ICLR 2026) сжимает KV-кеш в 4,6 раза с потерей перплексии всего ~1%. Но при декодировании каждый сжатый блок нужно <b>деквантизовать</b> — преобразовать обратно в числа с плавающей точкой. И на длинных контекстах это становится узким местом.</p><p>На Apple M5 Max деквантизация TurboQuant занимает 14-34% времени декодирования. На контексте 32K токенов скорость декодирования падает с 78,3 tok/s (потолок без деквантизации) до 47,0 tok/s — штраф в 40%.</p><h3>14 попыток, которые провалились</h3><p>Прежде чем найти решение, Turney перебрал 14 альтернативных реализаций деквантизации на Apple Silicon: регистровые массивы, битовую арифметику, SIMD-шаффлы, FMA без ветвлений, слитые блочные операции. Ни одна не обогнала базовую таблицу подстановки (LUT) в константной памяти GPU.</p><p>Вывод оказался фундаментальным: на Apple Silicon 4 дивергентных чтения из константной памяти быстрее любой арифметики, которая даёт тот же результат. Это аппаратный пол — ниже него не опуститься. Единственный оставшийся рычаг — уменьшить количество позиций, которые нужно деквантизовать.</p><h2>Решение — не ускорять, а пропускать</h2><p>Ключевое наблюдение: в flash attention ядре веса внимания (softmax) вычисляются из ключей (K) <i>до того</i>, как начинается работа со значениями (V). То есть на момент деквантизации V мы уже знаем, какие позиции контекста получили значимый вес внимания, а какие — нет.</p><p><b>Что такое разреженность внимания?</b> Когда модель генерирует следующий токен, механизм внимания (softmax) распределяет вероятность по всем предыдущим позициям контекста. При коротком контексте внимание распределено относительно равномерно. Но чем длиннее контекст, тем более концентрированным оно становится: модель «смотрит» на несколько десятков ключевых позиций, а 90%+ получают веса ниже 10-6 — они практически ничего не вносят в итоговый результат.</p><p>Sparse V dequantization использует этот факт: если вес внимания для позиции ниже порога (10-6), её деквантизация и аккумуляция пропускаются целиком.</p><p>Вся реализация — три строки в Metal-ядре:</p><p>Это экономит чтения из константной памяти (обращения к LUT), ALU-операции (извлечение индексов, применение знака, умножение на норму) и чтения из глобальной памяти устройства.</p><p>Принципиальное отличие от 14 провалившихся подходов: они пытались сделать каждую из N операций быстрее (ограничено аппаратным полом). Sparse V убирает (1-p) x N операций целиком — и выигрыш растёт с длиной контекста, потому что разреженность внимания растёт.</p><h2>Результаты</h2><h3>Скорость декодирования (M5 Max, Qwen 3.5 35B MoE)</h3><p>Эффект sparse V масштабируется с длиной контекста — чем длиннее контекст, тем больше позиций пропускается:</p><ul><li>Короткий контекст: +1,4% (внимание плотное, мало что пропускать)</li><li>4K: +4,0%</li><li>8K: +7,2%</li><li>16K: +12,9%</li><li>32K: <b>+22,8%</b> (с 47,0 до 57,7 tok/s)</li></ul><p>При 32K токенов отношение к несжатому q8_0 улучшилось с 0,76x до 0,93x — почти паритет.</p><h3>Качество: перплексия и retrieval</h3><p>Перплексия при включении sparse V остаётся <b>численно идентичной</b> варианту без него. На корпусе wikitext-103 (50 чанков, контекст 32K, CI +/-0.021) дельта составила ровно 0,0000. Это подтверждено на всех протестированных длинах контекста: 8K, 16K, 32K.</p><p>Ещё более неожиданный результат — в тесте needle-in-a-haystack (NIAH). Этот тест проверяет, может ли модель найти конкретный факт, спрятанный в длинном контексте:</p><ul><li>Без sparse V: 7/9 (q8_0 тоже 7/9)</li><li>С sparse V: <b>9/9 (100%)</b></li></ul><p>Гипотеза автора: позиции с пренебрежимо малым весом внимания вносят практически нулевой полезный сигнал, но при деквантизации добавляют квантизационный шум. Sparse V убирает этот шум — и соотношение сигнал/шум улучшается.</p><h2>Почему это работает для любой квантизации</h2><p>Sparse V работает не на уровне конкретного формата квантизации, а на уровне <b>механизма внимания</b>. Метод использует веса softmax как сигнал для пропуска вычислений — а softmax одинаков вне зависимости от того, как именно сжаты K и V.</p><p>Автор валидировал метод на трёх форматах KV-кеша с разной стоимостью деквантизации:</p><ul><li><b>turbo3</b> (3,5 бита, TurboQuant) — +22,8% на 32K, перплексия без изменений</li><li><b>q8_0</b> (8 бит) — +5% к декодированию, перплексия идентична</li><li><b>q4_0</b> (4 бита) — перплексия идентична, скорость в пределах шума</li></ul><p>Закономерность: чем дороже деквантизация, тем больше выигрыш. turbo3 использует Walsh-Hadamard-преобразование и полярную декомпозицию — тяжёлые операции, поэтому выигрыш максимален. q4_0 использует простое масштабирование — пропуск дешёвой операции даёт мало. Но в обоих случаях метод <b>не ухудшает</b> ни перплексию, ни retrieval.</p><p>Это означает, что sparse V можно включить по умолчанию для любого формата квантизации KV-кеша в <a href="https://github.com/ggerganov/llama.cpp">llama.cpp</a> — как безусловную оптимизацию, которая ничего не стоит на коротком контексте и даёт ощутимый выигрыш на длинном.</p><h2>FAQ</h2><h3>Не сломает ли пропуск позиций качество генерации?</h3><p>Нет. Порог 10-6 выбран консервативно. При контексте 32K с 32 головами внимания вклад пропущенной позиции в итоговый вектор — менее одной миллионной от максимума. Перплексия во всех экспериментах осталась численно идентичной — дельта 0,0000 на 50 чанках wikitext-103.</p><h3>Почему нельзя пропускать и K-деквантизацию?</h3><p>Потому что K нужен для вычисления весов внимания. Чтобы узнать, какие позиции имеют пренебрежимо малый вес, нужно сначала деквантизовать все ключи и посчитать softmax. Автор отмечает это как направление будущей работы: двухпроходный механизм, где первый проход вычисляет приблизительные веса для фильтрации K-позиций.</p><h3>Работает ли это на NVIDIA GPU?</h3><p>Эксперименты проводились на Apple Silicon (M5 Max, M2 Pro). Реализация — Metal-ядро для llama.cpp. На CUDA профиль узкого места другой (NVIDIA использует тензорные ядра и HBM вместо unified memory), но сам принцип — пропуск работы для позиций с малым весом внимания — универсален. Портирование на CUDA и ROCm автор указывает как следующий шаг.</p><h2>Выводы</h2><p>Sparse V dequantization — элегантное решение, которое меняет вопрос с «как деквантизовать быстрее?» на «нужно ли деквантизовать вообще?». Метод использует информацию, которая уже есть в ядре flash attention — веса softmax — как бесплатный сигнал для пропуска вычислений.</p><p>Главная ценность подхода — не конкретный прирост в 22,8%, а более широкая идея <b>attention-aware computation</b>: использование собственных паттернов разреженности модели для оптимизации ядер инференса. Чем длиннее контекст, тем сильнее разреженность — и тем больше выигрыш. Именно при тех длинах контекста, где узкое место деквантизации наиболее болезненно.</p><p>Код и бенчмарки: <a href="https://github.com/TheTom/turboquant_plus">TheTom/turboquant_plus</a> (бенчмарки и диагностика), <a href="https://github.com/TheTom/llama-cpp-turboquant">TheTom/llama-cpp-turboquant</a> (реализация, ветка experimental_decode_speed_tests).</p><p>Обсуждение на <a href="https://www.reddit.com/r/LocalLLaMA/">r/LocalLLaMA</a>.</p><p><i>Источник: <a href="https://github.com/TheTom/turboquant_plus/blob/main/docs/papers/sparse-v-dequant.md">Sparse V Dequantization</a> — документация turboquant_plus.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Google TurboQuant простыми словами: как сжать нейросеть в 6 раз и запустить на MacBook</title>
      <link>https://tproger.ru/articles/google-turboquant-prostymi-slovami--kak-szhat-nejroset-v-6-raz-</link>
      <comments>https://tproger.ru/articles/google-turboquant-prostymi-slovami--kak-szhat-nejroset-v-6-raz-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/google-turboquant-prostymi-slovami--kak-szhat-nejroset-v-6-raz-</guid>
      <description><![CDATA[<p>TurboQuant от Google сжимает KV-кеш LLM до 3 бит — ускорение до 8× на H100, Qwen на MacBook Air. Объясняем как работает и что это значит для вас.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/google-turboquant-prostymi-slovami--kak-szhat-nejroset-v-6-raz-">Google TurboQuant простыми словами: как сжать нейросеть в 6 раз и запустить на MacBook</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[GPU]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 28 Mar 2026 04:45:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>На этой неделе в мире ИИ произошло землетрясение. Google Research опубликовал алгоритм TurboQuant, который сжимает потребление памяти нейросетей при инференсе в 6 раз и ускоряет вычисления в 8 раз — без потери качества. <a href="https://tproger.ru/news/google-turboquant-obvalil-akcii-proizvoditelej-pamyati-na-25----r">Акции производителей памяти обвалились на 25%</a>. Reddit кипит. Все суетятся — но мало кто реально понимает, что именно сделали в Google и почему это важно.</p><p>Мы разобрались. Объясняем так, чтобы было понятно всем — и тем, кто пишет нейросети, и тем, кто просто хочет запустить ChatGPT-подобную модель на своём ноутбуке.</p><p><b>TurboQuant</b> — алгоритм квантизации KV-кеша для больших языковых моделей (LLM), разработанный Google Research. Сжимает KV-кеш с 16 до 3 бит на значение, уменьшая потребление памяти при инференсе в 5–6 раз без переобучения модели и без потери качества. Представлен на ICLR 2026 (<a href="https://arxiv.org/abs/2504.19874">arXiv:2504.19874</a>).</p><h2>KV-кеш: почему нейросетям нужно столько памяти</h2><p>Когда вы общаетесь с ChatGPT, Gemini или любой другой LLM, модель должна «помнить» весь ваш диалог. Для этого она использует <b>KV-кеш</b> (Key-Value cache) — специальный буфер в памяти видеокарты, где хранятся промежуточные вычисления механизма внимания (attention).</p><p>Представьте: вы читаете книгу и делаете заметки на полях. KV-кеш — это те самые заметки. Без них модели пришлось бы каждый раз перечитывать весь текст с начала, чтобы ответить на ваш вопрос.</p><p>Проблема в масштабе:</p><ul><li>Модель Llama 3.1 70B при контексте 128K токенов тратит ~40 ГБ только на KV-кеш — это больше, чем весит сама модель в квантизированном виде</li><li>Чем длиннее контекст (переписка, документ, код) — тем больше памяти нужно, и это растёт линейно</li><li>Именно KV-кеш — главный ограничитель того, сколько текста модель может «видеть» одновременно</li></ul><p>И именно KV-кеш сжимает TurboQuant.</p><h2>Что такое TurboQuant</h2><p>TurboQuant — это алгоритм сжатия KV-кеша, разработанный Google Research. <a href="https://arxiv.org/abs/2504.19874">Статья</a> принята на ICLR 2026 — одну из топовых конференций по машинному обучению. Авторы — Amir Zandieh, Vahab Mirrokni (VP Google, известный исследователь в области алгоритмов) и коллеги.</p><ul><li>Сжимает KV-кеш до 3 бит на значение (с обычных 16) — уменьшение в ~5 раз</li><li>Не требует дообучения модели — работает с любой LLM «из коробки»</li><li>Не теряет качество на стандартных бенчмарках (LongBench, Needle in a Haystack, RULER)</li><li>Ускоряет вычисления attention до 8 раз на NVIDIA H100</li><li>Работает «на лету» — не нужно заранее обрабатывать данные</li></ul><p><b>Важно:</b> TurboQuant сжимает только KV-кеш при инференсе. Он НЕ сжимает веса модели (это делают GPTQ, AWQ, GGUF) и НЕ влияет на обучение. Это принципиально другая задача.</p><h2>Как работает TurboQuant: PolarQuant и QJL простыми словами</h2><p>TurboQuant работает в два этапа. Если упрощать — это как сжатие фотографии в JPEG, только для математических векторов в памяти нейросети.</p><h3>Шаг 1: PolarQuant — умное сжатие основных данных</h3><p>Обычно данные в нейросети хранятся в декартовых координатах — как «иди 3 блока на восток и 4 блока на север». PolarQuant переводит их в полярные координаты — «иди 5 блоков под углом 37 градусов». Перед конвертацией вектор случайным образом поворачивается — это делает распределение координат более однородным.</p><p>В полярных координатах данные распределены более предсказуемо. Это позволяет применить оптимальный квантизатор (Lloyd-Max) к каждой координате независимо, <b>без дополнительных битов на хранение параметров квантизации</b>. В обычных методах эти «служебные» биты съедают 1–2 бита на число — при 3-битной квантизации это колоссальные накладные расходы.</p><h3>Шаг 2: QJL — коррекция ошибок за 1 бит</h3><p>После PolarQuant остаётся небольшая ошибка. QJL (Quantized Johnson-Lindenstrauss) — алгоритм, который использует математическое преобразование Джонсона–Линденштрауса для сведения остаточной ошибки к <b>нулевому смещению</b>, тратя на это всего 1 дополнительный бит.</p><p>Если PolarQuant — это основной «сжиматель», то QJL — это математический «корректор», который гарантирует, что attention-скоры модели остаются точными. Вместе они дают 3-битное представление, которое <a href="https://arxiv.org/abs/2504.19874">математически доказано</a> как близкое к теоретическому пределу сжатия (с точностью до константы ~2,7).</p><h2>Чем TurboQuant отличается от обычной квантизации</h2><p>Если вы запускаете модели через llama.cpp, Ollama или LM Studio, вы уже используете квантизацию — те самые Q4, Q5, Q8 в названиях файлов. Но это квантизация <b>весов</b> модели. TurboQuant работает с совершенно другой сущностью.</p><p><b>Квантизация весов</b> (GPTQ, AWQ, GGUF) — сжимает параметры модели один раз перед запуском. Чем меньше бит — тем хуже качество. Иногда требует калибровки или дообучения.</p><p><b>TurboQuant</b> — сжимает KV-кеш (промежуточные вычисления) на лету во время работы. При 3,5 битах — нулевая потеря качества. Не требует дообучения вообще.</p><p>Эти подходы <b>комплементарны</b>. Вы можете использовать Q4-квантизированную модель И TurboQuant-сжатый KV-кеш одновременно. Одно не заменяет другое — они сжимают разные части системы.</p><h2>TurboQuant на практике: MacBook, видеокарты и облако</h2><h3>Если у вас MacBook или обычный ПК</h3><p>Энтузиасты уже <a href="https://www.reddit.com/r/LocalLLaMA/comments/1s5kdu0/google_turboquant_running_qwen_locally_on_macair/">запустили Qwen 3.5 9B на обычном MacBook Air M4</a> (16 ГБ) с контекстом <b>20 000 токенов</b> — раньше на таком железе длинные контексты были невозможны. Не MacBook Pro, не Mac Studio — обычный Air, самая дешёвая конфигурация. В Reddit-треде есть видео-демо.</p><p>Это значит: локальная нейросеть на вашем ноутбуке сможет «видеть» в 5 раз больше текста за раз. Длинные документы, полноценные кодовые базы, многостраничные переписки — всё это становится доступнее без покупки нового железа.</p><h3>Если у вас мощная видеокарта</h3><p>Один из разработчиков <a href="https://github.com/ggml-org/llama.cpp/discussions/20969">рассчитал</a> для модели 70B Q4_K_M с 34 ГБ свободной VRAM под KV-кеш:</p><ul><li>Без TurboQuant (FP16 KV-кеш): ~109K токенов контекста</li><li>С Q8 KV-кешем: ~218K токенов</li><li>С TurboQuant TQ3 (3 бита): ~536K токенов</li><li>Полное окно контекста 262K легко помещается на 3× RTX 3090</li></ul><h3>Если вы разрабатываете ИИ-продукты</h3><ul><li>В 5–6 раз меньше GPU-памяти на инференс при длинных контекстах</li><li>До 8× ускорение attention на H100</li><li>Снижение стоимости обслуживания каждого запроса к LLM</li></ul><p>Парадокс Джевонса: когда ресурс становится дешевле — его используют больше, а не меньше. Дешёвый инференс = больше компаний внедряют ИИ = спрос на железо в итоге растёт.</p><h2>TurboQuant в llama.cpp, MLX и PyTorch: кто уже пробует</h2><p>Прошло всего несколько дней с публикации, но Open Source сообщество уже на коне:</p><ul><li><a href="https://github.com/ggml-org/llama.cpp/discussions/20969">llama.cpp</a> — минимум 3 независимых реализации, обсуждение интеграции в основную ветку. Одна уже работает на Apple Silicon через Metal</li><li>MLX (Apple Silicon) — разработчики адаптируют алгоритм для маков</li><li>PyTorch + Triton — появились reference-реализации для CUDA-видеокарт</li><li>C/CUDA — рабочая реализация с 18 из 18 пройденных тестов, MSE совпадает с бумагой</li></ul><p>Пока реализации не оптимизированы. Бенчмарки показывают падение скорости генерации в 3–8 раз по сравнению с обычным Q8 KV-кешем. Причина — неоптимизированная операция поворота вектора. Разработчики уже работают над оптимизацией через преобразование Адамара.</p><h2>Как попробовать TurboQuant прямо сейчас</h2><p>Официального кода от Google нет, но сообщество уже сделало несколько рабочих реализаций. Вот как запустить TurboQuant на своём железе — три варианта в зависимости от платформы.</p><h3>На Mac (Apple Silicon M1–M5)</h3><p>Форк <a href="https://github.com/TheTom/llama-cpp-turboquant">llama-cpp-turboquant</a> от TheTom — самая зрелая реализация с Metal-ядрами для Apple Silicon. Работает на M1, M2, M3, M4, M5.</p><p>Флаг turbo3 включает 3,5-битную квантизацию KV-кеша (сжатие 4,6× vs FP16). На M5 Max 128 ГБ модель Qwen3.5-35B показывает 2747 tok/s на prefill — на уровне стандартного q8_0, при этом KV-кеш занимает в 4,6 раза меньше памяти.</p><h3>На PC с видеокартой NVIDIA или AMD</h3><p>Форк <a href="https://github.com/unixsysdev/llama-turboquant">llama-turboquant</a> поддерживает CUDA и ROCm. Тип кеша здесь называется tq3_0 (вместо turbo3).</p><h3>Python (для исследований и экспериментов)</h3><p><a href="https://github.com/tonbistudio/turboquant-pytorch">turboquant-pytorch</a> — reference-реализация на PyTorch. Подойдёт для изучения алгоритма и проверки сжатия на своих моделях.</p><p>Ollama и LM Studio пока <b>не поддерживают</b> TurboQuant — они используют свои сборки llama.cpp, в которые метод ещё не влит. Но можно поднять llama-server из форка выше и подключиться к нему как к OpenAI-совместимому API.</p><h2>Бенчмарки TurboQuant: результаты из бумаги и от сообщества</h2><p><b>Из бумаги Google</b> (тестировалось на Gemma и Mistral):</p><ul><li>LongBench, Needle in a Haystack, ZeroSCROLLS, RULER, L-Eval — при 3,5 битах «абсолютная нейтральность качества»</li><li>При 2,5 битах — «маргинальная деградация»</li><li>4-bit TurboQuant: ускорение attention до 8× на H100 по сравнению с 32-bit baseline</li><li>Сжатие KV-кеша минимум в 6 раз</li></ul><p><b>Из независимых реализаций:</b></p><ul><li>TQ3 (3 бита): MSE = 0,034, сжатие 4,9× vs FP16</li><li>TQ4 (4 бита): MSE = 0,009, сжатие 3,8× vs FP16</li><li>Размер блока: 52 байта на 128 значений (для TQ3)</li></ul><h2>Почему TurboQuant обвалил акции Micron — и стоит ли переживать</h2><p>Рынок отреагировал панически: Micron −25%, Samsung −4,7%, SK Hynix −6,2%. Но аналитики Morgan Stanley, JPMorgan, Citigroup и Goldman Sachs единодушны — реакция чрезмерна. Вот почему:</p><ol><li><b>TurboQuant не трогает обучение.</b> HBM-память, основной драйвер прибыли чипмейкеров, нужна для обучения моделей. TurboQuant сжимает только инференс</li><li><b>Это исследование, не продукт.</b> Официального кода от Google нет, эксперименты на моделях ~8B параметров</li><li><b>Прецедент DeepSeek.</b> В январе 2025 тоже обвалили чипмейкеров — затем спрос только вырос</li><li><b>Фиксация прибыли.</b> Micron был +300% за год, Samsung +200%. Инвесторы искали повод зафиксировать прибыль</li></ol><blockquote>Если TurboQuant снизит операционные расходы на ИИ до одной шестой от текущего уровня, компании, которые до сих пор не внедряли ИИ из-за высокой стоимости, войдут в ИИ-экосистему.</blockquote><p>Подробнее о реакции рынка — в <a href="https://tproger.ru/news/google-turboquant-obvalil-akcii-proizvoditelej-pamyati-na-25----r">нашей новости</a>.</p><h2>Часто задаваемые вопросы</h2><p><b>Чем TurboQuant отличается от GGUF/GPTQ/AWQ?</b><br />GGUF, GPTQ и AWQ сжимают <i>веса</i> модели (параметры). TurboQuant сжимает <i>KV-кеш</i> — временную рабочую память, которая используется во время инференса. Эти подходы дополняют друг друга.</p><p><b>Можно ли уже использовать TurboQuant?</b><br />Экспериментально — да. Несколько независимых реализаций для llama.cpp и MLX уже работают. Но в основную ветку llama.cpp и в Ollama/LM Studio метод пока не интегрирован. Ожидается в ближайшие недели–месяцы.</p><p><b>Нужно ли переобучать модель для TurboQuant?</b><br />Нет. TurboQuant — data-oblivious метод, который применяется к любой существующей LLM без дообучения и без калибровочных данных.</p><h2>TurboQuant: итоги и выводы</h2><ul><li>TurboQuant — прорыв в сжатии KV-кеша, но не «убийца GPU» и не «конец эпохи дорогого железа»</li><li>Работает <b>вместе</b> с обычной квантизацией весов, а не вместо неё</li><li>Реально позволяет запускать более длинные контексты на том же железе — в 5 раз длиннее</li><li>Сообщество уже пишет реализации для llama.cpp и MLX</li><li>До полноценного внедрения в популярные инструменты — недели или месяцы</li><li>Обвал акций — чрезмерная реакция, аналитики рекомендуют покупать на падении</li></ul><p>Следите за <a href="https://github.com/ggml-org/llama.cpp/discussions/20969">GitHub-дискуссией в llama.cpp</a> — именно там появится рабочая реализация для повседневного использования. А <a href="https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/">блог Google Research</a> и <a href="https://arxiv.org/abs/2504.19874">бумага на arXiv</a> — для тех, кто хочет погрузиться в математику.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 подходов по работе с данными, которые должен знать каждый data-инженер</title>
      <link>https://tproger.ru/articles/10-podhodov-po-rabote-s-dannymi--kotorye-dolzhen-znat-kazhdyj-dat</link>
      <comments>https://tproger.ru/articles/10-podhodov-po-rabote-s-dannymi--kotorye-dolzhen-znat-kazhdyj-dat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Неопознанный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-podhodov-po-rabote-s-dannymi--kotorye-dolzhen-znat-kazhdyj-dat</guid>
      <description><![CDATA[<p>10 подходов по работе с данными для data-инженера</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-podhodov-po-rabote-s-dannymi--kotorye-dolzhen-znat-kazhdyj-dat">10 подходов по работе с данными, которые должен знать каждый data-инженер</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Mar 2026 08:55:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>В статье рассматриваем 10 подходов по работе с данными, которые должен знать любой уважающий себя data-инженер.</p><h2>10. Star Schema —
старая рабочая лошадка (которая разваливается на больших данных)</h2><p>Наша любимая звездочка — это самая базовая модель для аналитики. Таблица фактов
(с метриками, напр. продажи) окружена таблицами измерений.</p><p>К примеру, таблица
фактов «Продажи», а вокруг нее таблицы измерения: «Клиент» (кому продали), «Продукт»
(что продали), «Заказ» и т.д. Но на больших объемах, а также при увеличении
объектов в хранилище данных, она может начать подводить. Особенно сложно в нее
вносить какие-либо изменения, так как таблицы зависят друг от друга. Звездочка
это такой неэластичный монолит.</p><p><b>Проблемы на практике:</b></p><p>Когда таблица fact_sales растёт до сотен миллионов или
     миллиардов строк, запросы начинают жёстко тормозить. JOIN-ы с несколькими измерениями и GROUP BY приводят к долгим
     сканированиям. сложно вносить изменения, все может посыпаться</p><p>Типичный запрос может выглядеть так:</p><p>И чем больше строк в fact_sales, тем медленнее выполняется такой
запрос.</p><p>Проще говоря: звёздочка удобна и понятна, но <b>не очень масштабируется</b>.</p><h2>9. Snowflake Schema — слишком усложнённая и медлительная</h2><p>Снежинка — это “нормализованная” версия звездочки: таблицы измерений
разбиваются на ещё более мелкие части, как ветви снежинки. В результате каждая
иерархия измерений (например продукт → категория → бренд) живёт в своей
таблице.</p><p>Это улучшает хранение (меньше дублирования данных и меньше места на диске),
но делает запросы <b>еще более тяжёлыми</b>, потому что для простого отчёта
нужно больше JOIN-ов между таблицами. Зато теперь чуточку легче поддерживать и
это уже мене похоже на монолит, хотя все равно таковым является.</p><p><b>Короче говоря:</b></p><ul><li>Плюсы: меньше избыточности, данные лучше
     структурированы, нормализовано (хорошо для поддержки целостности).</li><li>Минусы: запросы становятся сложнее и медленнее (много
     JOIN-ов), сложнее для понимания тем, кто пишет SQL-аналитику. И все равно
     монолит, который сложно поддерживать.</li></ul><p>п=</p><h2>8. Data Vault — гибко,
масштабируемо… и очень сложно</h2><p>Эта модель появилась, чтобы строить очень
масштабируемые DWH, где можно спокойно переживать постоянные изменения
источников данных.</p><p>Вместо привычных «фактов и измерений» тут три типа таблиц:</p><p>·        
<b>Hubs
</b>— бизнес-сущности (клиент, заказ, продукт).</p><p>·        
<b>Links
</b>— связи между ними.</p><p>·        
<b>Satellites
</b>— атрибуты и история изменений (фио клиента, наименование товара, стоимость
товара).</p><p>Можно добавлять новые источники почти без боли и хранить полную историю изменений.</p><p>Но где
подвох?</p><p>Во-первых, схема получается гигантской — десятки и сотни таблиц.</p><p>И во-вторых, даже простой отчёт превращается в цепочку JOIN-ов на пол-экрана SQL.</p><p>А в-третьих, новым людям в команде разобраться в этом всём,
как отдельный квест.</p><p>Data Vault отлично подходит для
enterprise-DWH, где важны аудит, история и масштаб. Но для обычной аналитики это как резать колбасу бензопилой.</p><p>Пример запроса:</p><h2>7. Wide Tables / One Big Table (OBT) — для time-series</h2><p>Это противоположность сложным моделям вроде Data Vault.</p><p>Идея максимально простая - берём данные из
разных таблиц и склеиваем всё в одну огромную таблицу.</p><p>·        
Запросы супербыстрые, почти без
JOIN-ов.</p><p>·        
Очень удобно для BI и дашбордов.</p><p>·        
Понятная структура: «одна строка = один
бизнес-объект».</p><p>Но за скорость нужно платить следующими недостатками:</p><p>·        
Дублирование данных на каждом шаге,</p><p>·        
Таблица быстро разрастается до сотен колонок,</p><p>·        
Любое изменение логики требует пересборки всей
таблицы,</p><p>·        
Легко поймать несогласованность данных.</p><p>Короче:</p><p>OBT — это как кеш. Но все это добро
практически невозможно поддерживать.</p><p>Часто применяется в рамках time-seriesанализа:
IoT, анализ метрик, логов, clickstream.</p><p>Пример запроса:</p><h2>6. Graph Models (Neo4j, TigerGraph) — для связей</h2><p>Когда ценность данных именно <b>в связях</b> (например,
в мошеннических схемах, социальном влиянии или цепочках переходов по сети). В таком случае куча
join-ов просто
перестают работать, особенно при всякого рода рекурсиях.</p><p>С этим помогают графовые базы.</p><p>Вот к примеру, нужно нам найти всех
друзей наших друзей:</p><ul><li>Количество JOIN-ов растёт экспоненциально
     с каждым уровнем.</li><li>Уже на 3+ переходах запрос
     становится почти нечитаемым.</li><li>Кратно падает
     производительность</li></ul><p>Теперь посмотрим, как в графовой
базе это будет реализовано:</p><p>Отлично
подходит для антифрода, соцграфов и рекомендательных систем.</p><p>И совершенно
не подходит для OLAP-аналитики.</p><h2>5. Streaming Event
Sourcing (Kafka + CDC)</h2><p>Классический batch-ETL плохо сочетается с системами реального времени. Для real-time аналитики более
всего подходит CDC.</p><p>CDC превращает изменения в базе данных в события, которые отправляются потребителю
(DWH).</p><p>Данные становятся не снимком, а временной линией.</p><p><b>Как все это работает</b></p><p>·        
Базы данных → источники событий</p><p>·        
Kafka → надёжный журнал событий</p><p>·        
Потребители → могут пересобрать состояние в
любой момент</p><p>Пример (из debezium):</p><h2>Плюсы</h2><p>·        данные в реальном времени</p><p>·        
встроенное восстановление после сбоев</p><p>·        
слабая зависимость между продюсерами и
консьюмерами</p><h2>Минусы</h2><p>·        
высокая сложность реализации</p><p>·        
порядок событий и идемпотентность реализовать
непросто</p><p>·        
отладка требует видимости на уровне событий</p><h2>4. Columnar Storage (Parquet, Delta Lake) для дешёвой и быстрой аналитики</h2><p>Row
oriented базы
(данные стандартно лежат в виде строк в таблицах) оптимизированы под точечные
запросы, а не под аналитику. Если вы выбираете из таблицы всего два столбца из
ста, все равно будет считываться весь файл, так как все столбы хранятся в одном
файле.</p><p>Колоночный же формат подразумевает, что значения столбцов лежат в разных
местах.</p><h2>Ключевые преимущества</h2><p>·        
читаются только нужные колонки</p><p>·        
сильное сжатие (RLE, словарное кодирование)</p><p>·        
векторизованное выполнение</p><p>Меньше I/O → быстрее запросы.</p><p>Структура таблицы:</p><h2>3. Мульти-модельные (когда SQL и NoSQL одновременно)</h2><p>В реальной жизни данные редко бывают одного типа.</p><p>Современные приложения одновременно работают с:</p><p>·        
реляционными фактами</p><p>·        
полуструктурированным JSON</p><p>·        
связями между сущностями</p><p>Мульти-модельные базы позволяют запрашивать всё это в одном месте.</p><p>Вот типичный сценарий, когда один из столбцов хранит данные в jsonb:</p><p>И вот пример запроса к такой таблице:</p><p>Как видно для аналитика это не совсем удобно. Поэтому (как в
сценарии с data vault),
для аналитиков лучше делать отдельные витрины, где данный json уже разложен на нужные столбцы.</p><h2>Плюсы</h2><p>·        
одна система для разных типов данных</p><p>·        
мощный SQL при гибкой схеме</p><p>·        
меньше ETL и копирования данных</p><h2>Минусы</h2><p>·        
сложнее управлять схемой</p><p>·        
планы запросов могут усложняться</p><p>·        
медленнее специализированных движков</p><h2>2. Reverse ETL (операционная аналитика, возвращающая данные в приложения)</h2><p>Классическая аналитика заканчивается дашбордами и отчетами.</p><p>Reverse ETL замыкает цикл: данные из хранилища отправляются обратно в
операционные системы. Будь то скорректированные данные или какие-то посчитанные
в DWH метрики,
которые должны также храниться в информационной системе, что отображаться на
сайте или еще где-нибудь.</p><p>Вот частые примеры использования:</p><p>·        
почти-реальная персонализация</p><p>·        
актуальные метрики здоровья клиента и оттока</p><p>·        
автоматизация продаж и маркетинга (CRM, ESP и
т.д.)</p><h2>1. Единый слой данных (наше будущее)</h2><p>Вот обычная картина в средней компании: операционные данные
хранятся в PostgreSQL, аналитические
данные в Greenplum, стриминговые
данные в Clickhouse, данные
для поиска в Elasticsearch.
Четыре системы, между которыми данные нужно синхронизировать и реплицировать.</p><p>Unified Serving Layer использует единый логический слой таблиц</p><p>Например, Iceberg / Hudi / Delta с разными способами доступа.</p><p>То есть, один
набор данных, много движков, без ETL.</p><p>Данные лежат в одном месте, но читаются разными движками,
предназначенными для разных задач.</p><h2>Что это заменяет</h2><p>·        
нет ETL (warehouse → lake → feature store)</p><p>·        
рассинхронизацию данных между системами</p><p>·        
повторную реализацию логики в SQL, Spark и
приложениях</p><p>Пример таблицы в Iceberg</p><p>OLAP-запрос (Trino / Spark SQL)</p><h2>Плюсы</h2><p>·        
единый источник истины</p><p>·        
доступ из разных движков (SQL, ML, стриминг)</p><p>·        
ACID, time-travel, эволюция схемы</p><p>·        
отсутствие vendor lock-in</p><h2>Минусы</h2><p>·        
более сложная платформа</p><p>·        
требуется сильное управление метаданными и
governance</p><p>·        
не является прямой заменой OLTP-БД (потому что с
нагрузкой может не справиться).</p>]]></content:encoded>
    </item>
    <item>
      <title>Лучшие таск-менеджеры 2026: топ таск-трекеров для команды и бизнеса</title>
      <link>https://tproger.ru/articles/luchwie-task-menedzhery-2026--top-task-trekerov-dlya-komandy-i-bizn</link>
      <comments>https://tproger.ru/articles/luchwie-task-menedzhery-2026--top-task-trekerov-dlya-komandy-i-bizn?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Герасимов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/luchwie-task-menedzhery-2026--top-task-trekerov-dlya-komandy-i-bizn</guid>
      <description><![CDATA[<p>Рейтинг лучших таск-менеджеров 2026: топ таск-трекеров в России с ценами, функциями, сравнением. Чек-лист для выбора оптимального решения.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/luchwie-task-menedzhery-2026--top-task-trekerov-dlya-komandy-i-bizn">Лучшие таск-менеджеры 2026: топ таск-трекеров для команды и бизнеса</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Feb 2026 04:57:43 GMT</pubDate>
      <content:encoded><![CDATA[<p>Кажется, что в 2026 году уже стыдно вести дела в блокноте или перекидываться задачами в личке Telegram. Но реальность такова, что даже в крупных компаниях все еще можно встретить «зоопарк» инструментов: дизайнеры сидят в одном софте, разработчики в другом, а бухгалтерия вообще присылает Excel-файлы. В итоге — хаос, потерянные задачи и вечный вопрос «а кто это должен был сделать?».</p><p>Рынок российских таск-трекеров за последние пару лет сделал квантовый скачок. Если раньше мы выбирали между «неудобно, но дешево» и «круто, но санкционно», то сейчас появились зрелые продукты, которые не просто копируют западные аналоги, а предлагают свое видение управления процессами.</p><p>В этом обзоре мы собрали лучшие таск-менеджеры 2026 года. Мы проведем детальный анализ функциональности: определим целевые сценарии использования, выделим архитектурные преимущества и честно подсветим узкие места каждого решения.</p><h2>Что такое таск-менеджер и зачем он нужен</h2><p>Таск-менеджер (Task Manager) — это программное обеспечение для организации и контроля рабочего процесса. Оно позволяет создавать задачи, назначать ответственных, устанавливать сроки (дедлайны), отслеживать статус выполнения и хранить всю коммуникацию по проекту в едином цифровом пространстве.</p><p>Стоит сразу оговориться: никакой, даже самый продвинутый тaск-менеджер, не способен компенсировать отсутствие выстроенных процессов и мотивации в команде.</p><p>В базовом варианте это просто доска со стикерами «Нужно сделать», «В работе», «Готово». Но современные таск-трекеры для команды умеют гораздо больше:</p><ul><li>Синхронизация: все видят, кто чем занят прямо сейчас;</li><li>Контекст: обсуждение задачи идет внутри задачи, а не в пяти разных чатах;</li><li>Прозрачность: руководитель видит узкие места, а сотрудник — свой вклад в общий результат;</li><li>База знаний: хранилище всех регламентов и документов в одном окне с задачами.</li></ul><p>Без нормального таск-трекера вы управляете компанией вслепую. С ним — у вас появляется приборная панель.</p><h2>Как мы составляли рейтинг лучших таск-менеджеров</h2><p>Чтобы составить этот рейтинг таск-трекеров, мы оценивали системы по критериям, которые важны для реального бизнеса в России в 2026 году:</p><ol><li>Функциональность: насколько глубоко проработаны Kanban, Scrum, диаграммы Ганта?</li><li>Юзабилити: можно ли начать работать без недельного обучения?</li><li>Гибкость: насколько легко настроить систему под себя?</li><li>Локализация: серверы в РФ, оплата в рублях, поддержка на русском;</li><li>Цена: есть ли бесплатные таск-менеджеры или адекватные тарифы для малого бизнеса.</li></ol><h2>Топ-10 лучших таск-менеджеров 2026 года</h2><p>Поехали разбираться. Мы включили в список как мощные платформы для энтерпрайза, так и легкие решения для стартапов.</p><h2>1. SimpleOne SDLC — лучший таск-трекер для ИТ-проектов и разработки ПО</h2><p>Начнем с тяжелой артиллерии. Если ваша компания занимается созданием программных продуктов, вам нужно что-то серьезнее простой доски с задачами.</p><p><a href="https://simpleone.ru/sdlc?utm_source=tprogerrating">SimpleOne SDLC</a> — это профессиональная система для управления полным циклом разработки и ИТ-проектами на базе современной Low-code платформе с встроенной ИИ-автоматизацией.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/81da6a3f-333c-4b8e-beb8-144083d04890.webp" alt="" /><figcaption>Дашборды в SimpleOne SDLC</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Управление портфелем продуктов: иерархическая структура «Портфель → Продукт → Модули → Бэклог → Команды» позволяет декомпозировать задачи от глобальной бизнес-цели до конкретного коммита;</li><li>Гибкие методологии (Agile): полноценная поддержка Scrum (управление спринтами, покер-планирование) и Kanban (доски, WIP-лимиты);</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/c7046828-8d0c-43fa-af76-45d46f9d2dd3.webp" alt="" /><figcaption>Канбан-доска в SimpleOne SDLC</figcaption></figure><ul><li>Сквозная интеграция с инструментами разработчиков: Открытый Rest API, а также глубокая связка с Git-системами (GitLab, Bitbucket). Система автоматически отслеживает изменения в коде и связывает их с задачами;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/ab5bbb52-ab7a-4291-a96f-0ad3303ceef3.webp" alt="" /><figcaption>Интеграция с GitLab в SimpleOne SDLC</figcaption></figure><ul><li>Аналитика и отчетность: встроенные профессиональные дашборды (Burndown Chart, Cumulative Flow Diagram, Velocity) для контроля скорости и качества разработки;</li><li>Единая экосистема: бесшовная интеграция с ITSM-модулем — инциденты из поддержки легко превращаются в дефекты для разработчиков;</li><li>База знаний: структурированная база знаний с иерархией статей и связью документов, спецификаций и инструкций с задачами и услугами;</li><li>Диаграмма Ганта: интерактивная диаграмма Ганта для планирования сроков, зависимостей и загрузки команды с контролем выполнения и корректировкой планов;</li><li>ИИ анализ кода: автоматический ИИ‑анализ кода в GitLab с выбором модели, отслеживанием статуса проверки и публикацией результатов в виде комментариев к изменениям.</li></ul><p><b>Плюсы:</b></p><ul><li>Мощная Low-code платформа: можно менять логику процессов и интерфейс «мышкой» без программистов;</li><li>Готовность к высоким нагрузкам (Enterprise-уровень);</li><li>Возможность построить единый контур SDLC + ITSM.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/cd09663a-c2ec-4949-8a47-0fe1ae4791b1.webp" alt="" /><figcaption>Диаграмма Ганта в SimpleOne SDLC</figcaption></figure><p><b>Минусы:</b></p><ul><li>Избыточен для маленьких команд (до 10 человек), которым нужно «просто двигать карточки»;</li><li>Требует осознанного внедрения и настройки под процессы компании.</li></ul><p><b>Цены:</b></p><p>Стоимость рассчитывается индивидуально (Enterprise-модель лицензирования).</p><p>Для кого: крупные продуктовые компании, банки, финтех, интеграторы, которым нужен полный контроль над разработкой.</p><h2>2. Kaiten — российский таск-трекер для Agile и Kanban команд</h2><p>Kaiten — это, пожалуй, самый визуальный инструмент на рынке. Его главная фишка — возможность разместить на одном экране несколько досок и дорожек, чтобы видеть всю картину целиком, не переключаясь между вкладками.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/17c13131-91b3-4305-bcd7-e3e67a0d0659.webp" alt="" /><figcaption>Интерфейс Kaiten</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Единое информационное пространство: уникальный режим отображения (Combined WIP), позволяющий видеть задачи разных отделов и команд на одном экране;</li><li>Визуализация процессов: гибкие Канбан-доски с возможностью настройки колонок, дорожек (swimlanes) и блокировок;</li><li>Поддержка методологий: готовые шаблоны для Scrum (спринты, бэклог, оценка) и Kanban;</li><li>Управление ресурсами: встроенный учет времени, трекинг часов и автоматические отчеты по эффективности;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/f621ff34-c4d6-47da-9e04-c35555c82baa.webp" alt="" /><figcaption>Ресурсное планирование в Kaiten</figcaption></figure><ul><li>База знаний: встроенный редактор документов для хранения регламентов и проектной документации прямо в системе;</li><li>Интеграции: готовые коннекторы с Telegram, Slack, GitLab, GitHub и другими сервисами.</li></ul><p><b>Плюсы:</b></p><ul><li>Очень наглядный интерфейс: сразу видно, где «бутылочное горлышко» в процессе;</li><li>Бесплатный тариф с достаточно богатым функционалом для старта;</li><li>Отличная замена Trello и Jira для небольших и средних Agile-команд.</li></ul><p><b>Минусы:</b></p><ul><li>Может подтормаживать на очень больших объемах задач и сложных досках;</li><li>Слабая кастомизация логики (нельзя переписать поведение системы под себя скриптами).</li></ul><p><b>Цены:</b></p><p>Есть бесплатный тариф (до 5 пользователей). Платные начинаются от 185 ₽ за пользователя/мес (до 15 пользователей) и от 580 ₽ за пользователя/мес (в бизнес тарифе).</p><p>Для кого: Agile-команды, стартапы, digital-агентства, продуктовые команды.</p><h2>3. Strive — таск-менеджер с базой знаний и календарем</h2><p>Strive — относительно новый игрок, который делает ставку на простоту и объединение задач с регламентами. Это своеобразный гибрид Notion и Trello для тех, кто любит порядок и минимализм.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/26c95536-05f5-4dd0-8514-14f4cfa28166.webp" alt="" /><figcaption>Интерфейс Strive</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Управление задачами: классические Канбан-доски с настраиваемыми этапами и чек-листами;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/47387053-9d71-4e37-bd86-65020195cd04.webp" alt="" /><figcaption>Пример Канбан-доски в Strive</figcaption></figure><ul><li>База знаний (Wiki): полноценный редактор документов с возможностью вставки мультимедиа, таблиц и ссылок на задачи;</li><li>Планирование: личные и командные календари для визуализации сроков и встреч;</li><li>Регламенты: возможность привязывать инструкции из базы знаний прямо к задачам, чтобы исполнитель видел, как делать работу;</li><li>Рабочие пространства: разделение задач по проектам или отделам (воркспейсы).</li></ul><p><b>Плюсы:</b></p><ul><li>Чистый, современный дизайн, в котором приятно работать;</li><li>Удобно вести документацию проекта прямо рядом с задачами, не теряя контекст;</li><li>Интуитивно понятный интерфейс, не требующий обучения.</li></ul><p><b>Минусы:</b></p><ul><li>Пока не хватает многих «взрослых» функций (Диаграмма Ганта, сложные отчеты, автоматизация);</li><li>Мало готовых интеграций с внешними сервисами.</li></ul><p><b>Цены:</b></p><p>Бесплатно до 10 человек (с ограничениями). Pro-тариф от 250 ₽ за пользователя/мес.</p><p>Для кого: небольшие команды, контент-мейкеры, редакции, малый бизнес.</p><h2>4. YouGile — таск-трекер для команд с CRM</h2><p>YouGile сделал ставку на общение. Это гибрид таск-трекера и корпоративного мессенджера. Идея проста: каждая задача — это чат, где обсуждение не отрывается от дела.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/b69d4de1-a850-4433-a2c9-f02b3cdcff0c.webp" alt="" /><figcaption>Интерфейс YouGile</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Аgile-доски: визуальное управление задачами с колонками, стикерами и дедлайнами;</li><li>Контекстное общение: встроенный чат в каждой задаче с поддержкой голосовых сообщений, файлов, реакций и закрепленных сообщений;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/49ce7923-931a-470e-804c-d20bbec22bb1.webp" alt="" /><figcaption>Встроенный чат в YouGile</figcaption></figure><ul><li>Отчеты и сводки: автоматический сбор статистики по активности команды, просроченным задачам и времени выполнения;</li><li>Роли и права: гибкая настройка доступа к доскам и задачам для сотрудников и клиентов (гостевой доступ);</li><li>Планирование (в Pro): диаграмма Ганта для календарного планирования проектов.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/d2499604-b6d2-46c3-9368-d7dbd0344396.webp" alt="" /><figcaption>Диаграмма Ганта в YouGile</figcaption></figure><p><b>Плюсы:</b></p><ul><li>Почти нулевой порог входа — интерфейс чатов понятен любому, кто видел Telegram;</li><li>Ничего не теряется в личных переписках, вся история хранится в задаче;</li><li>Полностью бесплатно для команд до 10 человек (весь функционал!).</li></ul><p><b>Минусы:</b></p><ul><li>При большом количестве задач и активных обсуждениях может возникнуть информационный шум;</li><li>Слабая автоматизация бизнес-процессов по сравнению с Low-code системами.</li></ul><p><b>Цены:</b></p><p>Бесплатно до 10 пользователей. Далее от 594 ₽ за пользователя/мес при оплате за год.</p><p>Для кого: отделы продаж, маркетинга, небольшие веб-студии, где много оперативной коммуникации.</p><h2>5. Weeek — таск-менеджер 2026 с Помодоро и Telegram ботом</h2><p>Weeek позиционирует себя как экосистема для работы. Внутри одного окна у вас и задачи, и база знаний, и простая CRM. Отличный выбор для тех, кто хочет всё в одном месте.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/afc10775-0ca0-43bf-8200-d79746f031f7.webp" alt="" /><figcaption>Интерфейс Weeek</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Мульти-просмотр: переключение между режимами Доска (Канбан), Список, Неделя (календарь) и Календарь на месяц в один клик;</li><li>Встроенная CRM: ведение базы клиентов и сделок, связанных с задачами;</li><li>База знаний: хранилище документов и регламентов;</li><li>Тайм-менеджмент: встроенный Помодоро-таймер для фокусировки на задачах;</li><li>Уведомления: умный Telegram-бот, через который можно создавать задачи и получать оповещения.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/09681103-b115-47de-a3f4-ce0068956ae0.webp" alt="" /><figcaption>Гибкие уведомления в Telegram</figcaption></figure><p><b>Плюсы:</b></p><ul><li>Очень стильный, быстрый и современный интерфейс;</li><li>Отличное мобильное приложение, не уступающее десктопной версии;</li><li>Многофункциональность: заменяет сразу несколько сервисов (Trello, Notion, CRM).</li></ul><p><b>Минусы:</b></p><ul><li>Аналитика пока слабовата для глубокого анализа эффективности;</li><li>Иногда встречаются баги в мобильной версии при слабом интернете.</li></ul><p><b>Цены:</b></p><p>Бесплатно до 5 пользователей. Pro-тариф от 199 ₽/мес.</p><p>Для кого: фрилансеры, микро-команды, творческие коллективы, стартапы.</p><h2>6. Shtab — таск-менеджер с тайм-трекингом и скриншотами</h2><p>Shtab создавался специально для управления удаленными и распределенными командами. Его главная особенность — жесткий контроль времени и финансовая прозрачность проектов.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/580198a3-3c59-4731-81ea-3a06c23ccdc0.webp" alt="" /><figcaption>Интерфейс Shtab</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Трекер задач: гибкое управление задачами с видами Доска, Список, Матрица Эйзенхауэра и Календарь;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/0863b287-b69a-49e7-bf3a-bb574d8854d0.webp" alt="" /><figcaption>Диаграмма Ганта в Shtab</figcaption></figure><ul><li>Контроль времени: встроенный тайм-трекер с возможностью делать скриншоты экрана сотрудника и отслеживать активность;</li><li>Финансы: автоматический расчет зарплаты сотрудников и стоимости проектов на основе затреканных часов и ставок;</li><li>Командная работа: комментарии, чек-листы, метки и приоритеты.</li></ul><p><b>Плюсы:</b></p><ul><li>Идеально для тех, кто платит за часы (Time &amp; Material): прозрачный биллинг;</li><li>Прозрачность работы удаленщиков: всегда видно, кто и чем занят;</li><li>Чистый дизайн.</li></ul><p><b>Минусы:</b></p><ul><li>Функция скриншотов часто воспринимается командой как микроменеджмент и недоверие;</li><li>Слабый функционал для сложной инженерной разработки (нет интеграций с Git, CI/CD).</li></ul><p><b>Цены:</b></p><p>Есть бесплатный период. Платные тарифы от 190 ₽/мес (до 20 пользователей).</p><p>Для кого: аутсорс-агентства, бюро переводов, дизайн-студии с почасовой оплатой, команды на удаленке.</p><h2>7. Битрикс24 — универсальный таск-менеджер с CRM для бизнеса</h2><p>Битрикс24 — это настоящий комбайн «все-в-одном». Здесь есть всё: от задач до конструктора сайтов и видеозвонков.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/0c731788-d83f-49ff-95e5-56d274dec3fc.webp" alt="" /><figcaption>Интерфейс Битрикс24</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Задачи и проекты: иерархия задач, Канбан, Диаграмма Ганта, контроль сроков и чек-листы;</li><li>CRM-система: мощный модуль для продаж, телефонии и маркетинга, тесно связанный с задачами;</li><li>Коммуникации: корпоративный портал, чаты, видеозвонки, лента новостей;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/2235f564-57b3-4647-944c-39ab4ad0cbaf.webp" alt="" /><figcaption>Многоканальность Битрикс24</figcaption></figure><ul><li>Автоматизация: роботы и триггеры для автоматического движения задач и сделок;</li><li>Совместная работа: диск для файлов, онлайн-редактор документов, календари.</li></ul><p><b>Плюсы:</b></p><ul><li>Огромный функционал за одну цену — можно закрыть почти все потребности офиса;</li><li>Мощная экосистема и маркетплейс приложений;</li><li>Наличие коробочной версии (On-premise) для установки на свой сервер.</li></ul><p><b>Минусы:</b></p><ul><li>Очень перегруженный интерфейс, в котором легко потеряться новичку;</li><li>Сложно внедрять и настраивать под себя без помощи интегратора.</li></ul><p><b>Цены:</b></p><p>Есть бесплатный тариф. Платные от 1 743 ₽/мес за 5 пользователей при оплате за год.</p><p>Для кого: компании любого размера, которым нужно закрыть все вопросы автоматизации одним продуктом.</p><h2>8. Яндекс Трекер — корпоративный российский таск-трекер</h2><p>Яндекс Трекер — инструмент, выросший из недр Яндекса и ставший публичным облачным сервисом. Надежный, строгий, масштабируемый и глубоко интегрированный в экосистему Yandex Cloud.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/c843e9a0-8897-4aab-8a50-8d543271de5a.webp" alt="" /><figcaption>Интерфейс Яндекс Трекера</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Управление потоком: очереди задач, фильтры, дашборды и гибкая настройка workflow;</li><li>Agile-инструменты: доски для Scrum и Kanban, планирование спринтов, диаграммы сгорания задач;</li><li>Проектное управление: диаграмма Ганта, вехи, статистика;</li><li>Интеграции: нативная связка с Yandex Cloud, Yandex Forms, Wiki и другими сервисами Яндекса.</li></ul><p><b>Плюсы:</b></p><ul><li>Привычный и понятный интерфейс для тех, кто пользовался сервисами Яндекса;</li><li>Бесплатно для первых 5 пользователей (полный функционал);</li><li>Высокая надежность и безопасность инфраструктуры Яндекса.</li></ul><p><b>Минусы:</b></p><ul><li>Интерфейс довольно аскетичный и «сухой», ориентирован на инженеров;</li><li>Может быть сложен в первоначальной настройке очередей и прав доступа.</li></ul><p><b>Цены:</b></p><p>Бесплатно до 5 пользователей. Далее от 399 ₽ за пользователя (до 10 сотрудников) при оплате за год.</p><p>Для кого: ИТ-команды, стартапы, использующие инфраструктуру Yandex Cloud.</p><h2>9. ПланФикс — кастомный российский таск-менеджер для процессов</h2><p>ПланФикс — это не просто трекер, а конструктор, из которого можно собрать хоть CRM, хоть Service Desk, хоть систему управления складом, не написав ни строчки кода.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/3511bbc9-b525-473b-a8f8-2fe8cdcf42ca.webp" alt="" /><figcaption>Интерфейс ПланФикс</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Конструктор процессов: полная настройка полей, кнопок, статусов и сценариев перехода;</li><li>Автоматизация: мощные автоматические сценарии (боты) для рутинных действий;</li><li>Коммуникации: интеграция с WhatsApp, Telegram, Email — сообщения превращаются в задачи;</li><li>Планирование: планировщики, календари и Диаграмма Ганта.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/56f7494b-5337-41ef-829f-2cb7e93d8e68.webp" alt="" /><figcaption>Диаграмма Ганта в ПланФикс</figcaption></figure><ul><li>Аналитика: настраиваемые отчеты по любым данным в системе.</li></ul><p><b>Плюсы:</b></p><ul><li>Невероятная гибкость. Можно реализовать практически любую бизнес-логику;</li><li>Позволяет собрать CRM и таск-трекер в одном интерфейсе;</li><li>Доступная цена.</li></ul><p><b>Минусы:</b></p><ul><li>Высокий порог входа — чтобы настроить систему, нужно мыслить как системный аналитик;</li><li>Дизайн «на любителя», может показаться перегруженным.</li></ul><p><b>Цены:</b></p><p>Бесплатно до 5 сотрудников. Платные тарифы от 8 $/пользователь (цены в долларах, но оплата в рублях по курсу).</p><p>Для кого: компании с нестандартными процессами, готовые инвестировать время в настройку «под себя».</p><h2>10. LeaderTask — оффлайн таск-трекер для фрилансеров и малого бизнеса</h2><p>LeaderTask — один из старейших российских планировщиков, который изначально был персональным органайзером, но вырос в инструмент для командной работы.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/54c3969f-7bdb-4edf-a086-7d5f47624877.webp" alt="" /><figcaption>Интерфейс LeaderTask</figcaption></figure><p><b>Ключевая функциональность и возможности:</b></p><ul><li>Управление задачами: древовидная структура задач, подзадачи, чек-листы, метки и цвета;</li><li>Планирование: ежедневник, календарь, напоминания;</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-25/3eb4768d-75b7-48ba-9982-c40ee02a74ae.webp" alt="" /><figcaption>Календарь в LeaderTask</figcaption></figure><ul><li>Поручения: возможность поручать задачи сотрудникам и контролировать их выполнение;</li><li>Канбан: простая доска для визуализации этапов;</li><li>Оффлайн-режим: полноценная работа без интернета с последующей синхронизацией.</li></ul><p><b>Плюсы:</b></p><ul><li>Работает без интернета (уникально для современных сервисов);</li><li>Очень быстрый и легкий десктопный клиент;</li><li>Прост в освоении.</li></ul><p><b>Минусы:</b></p><ul><li>Функционал для командной работы довольно базовый по сравнению с конкурентами;</li><li>Устаревший дизайн десктопной версии.</li></ul><p><b>Цены:</b></p><p>Есть бесплатная версия. Премиум для команд — 4999 ₽/год за одного пользователя.</p><p>Для кого: фрилансеры, руководители малого бизнеса, которым нужен личный помощник с функцией делегирования.</p><h2>Сравнительная таблица таск-трекеров</h2><p>Чтобы упростить муки выбора, мы свели ключевые характеристики в одну таблицу.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-26/16b8f984-f687-4aeb-a774-eaea2623b8ce.webp" alt="" /></figure><h2>Как выбрать подходящий таск-менеджер: чек-лист</h2><p>Не существует «самого лучшего» трекера. Есть тот, который подходит именно вам. Пройдитесь по чек-листу перед покупкой:</p><ol><li>Размер команды. Если вас 5 человек — берите YouGile или Weeek. Если 500+ разработчиков — смотрите в сторону SimpleOne или Яндекс Трекера;</li><li>Специфика работы. Для IT важны интеграции с Git и CI/CD (SimpleOne, Kaiten). Для продаж — CRM и чаты (Битрикс24, YouGile);</li><li>Бюджет. Готовы ли вы платить за каждого пользователя или ищете бесплатное решение на старте?</li><li>On-premise. Критично ли вам ставить софт на свои сервера? Если да, круг сужается до SimpleOne, Kaiten (Enterprise), Битрикс24 (Коробка);</li><li>Гибкость. Будете ли вы менять процессы под софт, или софт должен прогнуться под вас? Для второго варианта нужны Low-code платформы (SimpleOne, ПланФикс).</li></ol><h2>Выводы</h2><p>В 2026 году рынок таск-трекеров в России перестал быть просто «импортозамещением». Мы видим зрелые платформы, которые формируют собственные методологии.</p><p>Ключевой инсайт для CTO и Team Lead: при выборе стека оценивайте не текущий функциональный feature-set, а архитектурный потенциал масштабирования. Классическая ошибка — внедрение инструмента, который идеально закрывает потребности команды из 10-15 человек (низкий порог входа, отличный UX), но становится блокирующим фактором при масштабировании до 50+ сотрудников, когда на первый план выходят регламенты, безопасность и интеграции.</p><ul><li>Для продуктовых команд с планами выхода на Enterprise-уровень целесообразно сразу закладывать фундамент в виде платформ класса SimpleOne SDLC. Это превентивная инвестиция в управляемость техническим долгом и сквозную прозрачность процессов (End-to-End Visibility);</li><li>Для стартапов, где Time-to-Market критичнее формализации, решения вроде Kaiten или YouGile обеспечат необходимую динамику. Однако стоит заранее продумать стратегию миграции данных при неизбежном усложнении процессов.</li></ul><p>Главный совет: не выбирайте по скриншотам. Зарегистрируйтесь, заведите реальный проект и попробуйте прожить в системе хотя бы пару дней. Выбирайте не интерфейс, а логику, которая станет основой вашей инженерной культуры.</p><p><i>Реклама. Рекламодатель: ООО «СИМПЛ 1», ИНН 9725013892, erid: 2W5zFJeLnk9</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Android 17 Beta 1 вышла с новыми API камеры и изменениями интерфейса</title>
      <link>https://tproger.ru/news/android-17-beta-1-vywla-s-novymi-api-kamery-i-izmeneniyami-interf</link>
      <comments>https://tproger.ru/news/android-17-beta-1-vywla-s-novymi-api-kamery-i-izmeneniyami-interf?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/android-17-beta-1-vywla-s-novymi-api-kamery-i-izmeneniyami-interf</guid>
      <description><![CDATA[<p>Android 17 Beta 1 вышла для Pixel: новые API камеры, обязательная адаптивность интерфейсов и постепенные изменения дизайна</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/android-17-beta-1-vywla-s-novymi-api-kamery-i-izmeneniyami-interf">Android 17 Beta 1 вышла с новыми API камеры и изменениями интерфейса</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 13 Feb 2026 17:20:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Google <a href="https://www.androidauthority.com/android-17-beta-1-delayed-rollout-3640969/">запустила</a> первую бета-версию Android 17 для устройств Pixel.</p><p>Релиз немного задержался — компания в последний момент отложила старт тестирования, пообещав, что обновление выйдет «скоро». В итоге пауза продлилась всего несколько дней.</p><p>Бета уже распространяется «по воздуху» для участников Android Beta Program. Владельцы актуальных Pixel получат обновление автоматически.</p><h2>Обязательная адаптивность и доработанная камера</h2><p>Одно из ключевых изменений — обязательная поддержка адаптивных интерфейсов для приложений, ориентированных на Android 17.</p><p>Разработчикам придется корректно обрабатывать разные размеры экранов и форм-факторы, включая складные устройства и планшеты. Формально это не то чтобы революция. Но теперь за игнорирование адаптивности можно будет заплатить совместимостью.</p><p>Вторая важная новинка — обновленные API камеры. Они должны устранить рывки и пропуски кадров при переключении режимов съемки. Это как раз та категория проблем, которую достаточно сложно показать на презентации, но которая напрямую влияет на пользовательский опыт.</p><p>Также в системе появились визуальные правки интерфейса. Google продолжает постепенно дорабатывать дизайн, не меняя радикально общую концепцию.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-02-13/c690325a-75d9-41e1-aa65-c96b3d7425e6.webp" alt="" /></figure><h2>Как установить и когда ждать релиз</h2><p>Участники программы тестирования получат Android 17 Beta 1 автоматически. Тем, кто не хочет устанавливать бета-версию, нужно выйти из программы и дождаться стабильной сборки.</p><p>Финальный релиз Android 17 ожидается во II квартале 2026 года. Судя по первой бете, Google делает ставку не на громкие функции, а на стабильность, производительность и требования к качеству приложений.</p><p>Для экосистемы это может оказаться важнее любой эффектной анимации.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Go 1.26: до 40% быстрее GC, дешевле cgo и экспериментальный SIMD</title>
      <link>https://tproger.ru/news/vywel-go-1-26--do-40--bystree-gc--dewevle-cgo-i-eksperimentalny</link>
      <comments>https://tproger.ru/news/vywel-go-1-26--do-40--bystree-gc--dewevle-cgo-i-eksperimentalny?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-go-1-26--do-40--bystree-gc--dewevle-cgo-i-eksperimentalny</guid>
      <description><![CDATA[<p>Вышел Go 1.26: новый GC до 40% быстрее, cgo дешевле, экспериментальный SIMD и усиленная безопасность рантайма</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-go-1-26--do-40--bystree-gc--dewevle-cgo-i-eksperimentalny">Вышел Go 1.26: до 40% быстрее GC, дешевле cgo и экспериментальный SIMD</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Криптография]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 12 Feb 2026 01:45:27 GMT</pubDate>
      <content:encoded><![CDATA[<p>Go 1.26 вышел спустя полгода разработки. Релиз традиционно без фанфар, но с ощутимыми изменениями под капотом: ускорили сборку мусора, удешевили вызовы C-кода, усилили защиту рантайма и добавили несколько экспериментальных пакетов.</p><h2>Новый GC по умолчанию: минус до 40% накладных расходов</h2><p>Так, в релизе включён сборщик мусора <b>greenteagc</b>. Он оптимизирован для частого создания и сканирования мелких объектов.</p><p>В приложениях с активной аллокацией это даёт снижение накладных расходов GC <b>на 10–40%</b>. Если у вас сервис с короткоживущими структурами, это обновление может стать бесплатным ускорением, без изменения кода.</p><h2>cgo стал дешевле</h2><p>Вызовы функций на C через cgo также подешевели примерно на <b>30%</b>. Это важно для проектов, которые тянут нативные библиотеки (криптография, обработка изображений, старый C-код).</p><p>Дополнительно в runtime для 64-битных платформ включили рандомизацию адресного пространства (heap base). Это усложняет эксплуатацию уязвимостей в C-коде, подключённом через cgo. При необходимости можно отключить через:</p><h2>new() теперь умеет принимать выражения</h2><p>Встроенная функция new() получила маленькое, но приятное расширение: теперь можно передать выражение для начального значения.</p><p>Было:</p><p>Теперь можно:</p><p>Мелочь, но код становится компактнее и чище.</p><h2>Обобщённые типы: разрешили «ссылаться на себя»</h2><p>Generics стали чуть гибче. Теперь тип может передавать сам себя в список параметров типа:</p><p>Раньше такая самоссылка вызывала ошибку. Теперь — нет. Для сложных generic-алгоритмов это снимает лишние ограничения.</p><h2>Больше аллокаций в стеке, меньше в куче</h2><p>Компилятор расширил список случаев, когда слайсы размещаются в стеке, а не в куче. А так как меньше давления на GC, то и выше производительность.</p><h2>go fix переписали полностью</h2><p>Команду go fix переписали на базе пакета analysis. Теперь она использует анализаторы из пакета modernize, которые предлагают правки с учётом новых возможностей языка и стандартной библиотеки.</p><p>Также появился анализатор inline — он разворачивает вызовы функций, помеченных директивой:</p><h2>Новые пакеты</h2><p>В стандартную библиотеку добавили:</p><ul><li>crypto/hpke — реализация Hybrid Public Key Encryption</li><li>crypto/mlkem/mlkemtest</li><li>testing/cryptotest</li></ul><p>Появился экспериментальный simd/archsimd — низкоуровневый доступ к SIMD-инструкциям на AMD64. Это первый осторожный шаг Go в сторону управляемых векторных вычислений без ассемблера.</p><p>Также добавили экспериментальный runtime/secret для безопасного обнуления временной памяти и новый профиль goroutineleak в runtime/pprof — для поиска утечек горутин.</p><p>Скачать Go 1.26 можно по <a href="https://go.dev/dl/">ссылке</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Toyota открыла исходный код игрового движка Fluorite для Flutter-разработчиков</title>
      <link>https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter</link>
      <comments>https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter</guid>
      <description><![CDATA[<p>Toyota открыла код 3D-движка Fluorite для Flutter: Dart-first архитектура, C++ ECS-ядро и графика Filament для игр и UI</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter">Toyota открыла исходный код игрового движка Fluorite для Flutter-разработчиков</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Feb 2026 02:03:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Toyota <a href="https://fosdem.org/2026/schedule/event/7ZJJWW-fluorite-game-engine-flutter/" rel="nofollow">представила</a> Fluorite — 3D-движок, ориентированный на разработчиков, которые работают с Flutter и Dart. И все это open-source!</p><p>Компания позиционирует Fluorite как универсальную платформу для интерактивных приложений. Причем речь не только об играх, но даже об автомобильных интерфейсах.</p><h2>Движок на Flutter, но с С++ под капотом</h2><p>Ключевая идея Fluorite — «Dart-first» архитектура. Логика пишется на Dart и напрямую интегрируется с экосистемой Flutter: виджеты, Hot Reload, Widget Inspector и пакеты из pub.dev работают так же, как в обычных приложениях.</p><p>При этом производительность обеспечивается не Flutter-рендерингом. Вся тяжелая часть скрыта в высокоэффективном ECS-ядре на C++, которое отвечает за симуляцию, сцену и взаимодействие объектов.</p><p>Такой подход позволяет запускать проекты на мобильных устройствах, десктопе, embedded-платформах и даже консолях без переписывания движка под каждую цель.</p><h2>Графика уровня AAA за счет Filament</h2><p>Для рендеринга Fluorite использует Filament — 3D-движок Google с поддержкой физически корректного освещения (PBR). Это дает современное качество картинки без необходимости писать собственный рендерер или жертвовать производительностью ради кроссплатформенности.</p><p>По словам команды, связка Flutter + Filament позволяет разделить ответственность: UI и взаимодействие остаются на Flutter, а графика и сцена — на специализированном движке.</p><h2>Чем Fluorite отличается от конкурентов</h2><p>Главное отличие — ориентация на Flutter-разработчиков. Движок не требует изучать отдельный язык или редактор: сцены, логика и интерфейс живут в привычном стеке.</p><p>За счет этого итерации быстрее, а входной порог ниже, чем у традиционных игровых движков.</p><p>Toyota подчеркивает, что Fluorite — open-source проект и его дальнейшее развитие во многом зависит от сообщества. Судя по архитектуре, компания делает ставку на то, что интерактивные 3D-приложения станут таким же обычным сценарием для Flutter, как мобильные и веб-интерфейсы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как ускорить Prisma до производительности ванильного SQL</title>
      <link>https://tproger.ru/articles/kak-uskorit-prisma-do-proizvoditelnosti-vanilnogo-sql</link>
      <comments>https://tproger.ru/articles/kak-uskorit-prisma-do-proizvoditelnosti-vanilnogo-sql?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тысячи Енотов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-uskorit-prisma-do-proizvoditelnosti-vanilnogo-sql</guid>
      <description><![CDATA[<p>Как приблизиться к производительности «чистого SQL», сохранив удобство разработки и типизацию Prisma.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-uskorit-prisma-do-proizvoditelnosti-vanilnogo-sql">Как ускорить Prisma до производительности ванильного SQL</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 07 Feb 2026 08:55:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><br />Движок Prisma добавляет накладные издержки примерно в 2–7 раз даже в версии 7. В этом руководстве показано, как приблизиться к производительности «чистого SQL», сохранив удобство разработки и типизацию Prisma.</p><h2>Проблема: почему Prisma медленнее «чистого SQL»</h2><p>Prisma — удобная ORM, но каждый запрос проходит через несколько уровней обработки:</p><p>Каждый уровень добавляет задержку. Улучшения в Prisma v7 не устраняют фундаментальные ограничения этой архитектуры.</p><p>Практический эффект:</p><p>Для высоконагруженных API, которые обрабатывают тысячи запросов в секунду, разница в 0.17 ms на запрос быстро превращается в заметную прибавку к общей задержке.</p><h2>Решение: выполнять SQL напрямую</h2><p>Единственный способ добиться производительности «чистого SQL» — обойти Query Engine Prisma, но при этом сохранить привычный API Prisma клиента.</p><h2>Сравнение архитектур</h2><p>Обычная Prisma:</p><p>Оптимизированный подход:</p><p>Если генерировать SQL прямо из JSON-запроса и выполнять его через проверенные драйверы, накладные расходы Query Engine исчезают. Процесс подготовки становится обычным превращением JSON в строку.</p><h2>Реализация</h2><h2>1) Установка зависимостей</h2><p>PostgreSQL:</p><p>SQLite:</p><h2>2) Базовая настройка (runtime-режим)</h2><p>PostgreSQL:</p><p>SQLite:</p><p>Готово. Код запросов менять не нужно. Все операции чтения теперь выполняются быстрее.</p><h2>3) Продвинутый режим: generator (предварительная генерация SQL)</h2><p>Для максимальной производительности можно «запечь» самые частые запросы на этапе сборки.</p><p>Добавьте в schema.prisma:</p><p>Сгенерируйте код:</p><p>Подключите сгенерированное расширение:</p><p>Сравнение накладных издержек:</p><ul><li>Prisma v7: ~0.34 ms</li><li>Runtime-режим: ~0.20 ms (примерно в 1.7 раза быстрее)</li><li>Generator-режим: ~0.03 ms (примерно в 11 раз быстрее)</li></ul><h2>Результаты бенчмарков</h2><p>Тесты на 137 E2E-запросах, сравнивающих идентичные операции.</p><h2>PostgreSQL</h2><p>В среднем: в 2.10 раза быстрее, чем Prisma v7</p><h2>SQLite</h2><p>В среднем: в 5.48 раза быстрее, чем Prisma v7</p><h2>Конфигурация для production</h2><h2>1) Режим отладки</h2><p>Можно видеть сгенерированный SQL для каждого запроса:</p><h2>2) Мониторинг производительности</h2><p>Можно отслеживать время выполнения запросов в production:</p><h2>3) Выборочная оптимизация</h2><p>Можно ускорять только «горячие» модели:</p><h2>4) Настройка пула соединений</h2><p>Пример конфигурации postgres.js для production:</p><h2>Поддерживаемые возможности</h2><h2>✅ Что ускоряется (выполняется через «чистый SQL»)</h2><p>Запросы:</p><ul><li>findMany, findFirst, findUnique</li><li>count</li><li>aggregate (_count, _sum, _avg, _min, _max)</li><li>groupBy с условиями having</li></ul><p>Фильтры:</p><p>Связи:</p><p>Пагинация и сортировка:</p><h2>❌ Что остаётся на стандартной Prisma (без изменений)</h2><p>Запись:</p><ul><li>create, update, delete, upsert</li><li>createMany, updateMany, deleteMany</li></ul><p>Продвинутые возможности:</p><ul><li>Транзакции ($transaction)</li><li>Сырые запросы ($queryRaw, $executeRaw)</li><li>Middleware</li><li>Другие расширения Prisma Client</li></ul><h2>Поддержка Edge Runtime</h2><h2>Vercel Edge Functions</h2><h2>Cloudflare Workers</h2><h2>Руководство по миграции</h2><h2>Со стандартной Prisma</h2><p>Было:</p><p>Стало:</p><h2>С Drizzle ORM</h2><p>Было:</p><p>Стало:</p><h2>Частые проблемы и решения</h2><p>1)</p><p>Проблема:</p><p>Решение:</p><h2>2) Исчерпан пул соединений</h2><p>Проблема:</p><p>Решение:</p><h2>3) Результаты отличаются от стандартной Prisma</h2><p>Проблема:</p><p>Решение:</p><p>Если результаты действительно расходятся, создайте issue: <a href="https://github.com/multipliedtwice/prisma-sql/issues">https://github.com/multipliedtwice/prisma-sql/issues</a></p><h2>4) Производительность почти не выросла</h2><p>Проблема: ожидалось ускорение в 2–7 раз, но прирост минимальный.</p><p>Возможные причины:</p><ol><li>Доминирует сеть: на удалённой БД задержка сети (10–50 ms) «затмевает» накладные издержки (0.2 ms)</li><li>Очень простые запросы: findUnique по индексированному ID и так быстрый</li><li>Нет индексов: запросы упираются в план выполнения БД</li></ol><p>Что сделать:</p><h2>Когда это не стоит применять</h2><h2>Оставьте стандартную Prisma, если:</h2><ol><li>Преобладает запись: больше 50% операций — запись</li><li>Простой CRUD: одна таблица, минимум связей</li><li>Команда не готова: нет опыта с postgres.js / better-sqlite3</li><li>Нужны неподдерживаемые функции Prisma: активное использование возможностей, которые здесь не покрыты</li></ol><h2>Этот подход подходит, когда:</h2><ol><li>Преобладает чтение: более 70% операций — чтение</li><li>Высокая пропускная способность: &gt;1000 rps, где важны миллисекунды</li><li>Сложные запросы: много связей, агрегаций, условий</li><li>Оптимизация затрат: меньше задержка → меньше ресурсов</li></ol><h2>Заключение</h2><p>Можно добиться 100% производительности «чистого SQL», не отказываясь от удобства Prisma.</p><p>Основные преимущества:</p><ul><li>Ускорение чтения в 2–7 раз без переписывания запросов</li><li>Те же типы и тот же API Prisma Client</li><li>Подходит для production (по заявлению авторов) и покрыто E2E-тестами</li><li>Работает в существующих проектах Prisma</li></ul><p>Быстрый старт:</p><ol><li>Установите prisma-sql и postgres/better-sqlite3</li><li>Подключите расширение</li><li>Задеплойте и измерьте эффект</li></ol><p>Дальнейшая оптимизация:</p><ol><li>Подключите generator для «горячих» запросов</li><li>Включите мониторинг через onQuery</li><li>Настройте пул соединений</li></ol><p>Ресурсы:</p><ul><li>NPM: <a href="https://www.npmjs.com/package/prisma-sql">https://www.npmjs.com/package/prisma-sql</a></li><li>GitHub: <a href="https://github.com/multipliedtwice/prisma-to-sql">https://github.com/multipliedtwice/prisma-to-sql</a></li><li>Документация: <a href="https://github.com/multipliedtwice/prisma-sql#readme">https://github.com/multipliedtwice/prisma-to-sql#readme</a></li><li>Примеры E2E-тестов: <a href="https://github.com/multipliedtwice/prisma-to-sql/tree/main/tests/e2e">https://github.com/multipliedtwice/prisma-to-sql/tree/main/tests/e2e</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Где трекать задачи в 2026: сравнили Visary Tracker, Shtab, WEEEK и других</title>
      <link>https://tproger.ru/articles/gde-trekat-zadachi-v-2026--sravnili-visary-tracker--shtab--weeek</link>
      <comments>https://tproger.ru/articles/gde-trekat-zadachi-v-2026--sravnili-visary-tracker--shtab--weeek?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gde-trekat-zadachi-v-2026--sravnili-visary-tracker--shtab--weeek</guid>
      <description><![CDATA[<p>Посмотрим, какие сценарии они закрывают, как устроены под капотом и что предлагают с точки зрения производительности и безопасности</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gde-trekat-zadachi-v-2026--sravnili-visary-tracker--shtab--weeek">Где трекать задачи в 2026: сравнили Visary Tracker, Shtab, WEEEK и других</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Управление проектами]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 03 Feb 2026 09:22:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>Работа в российском IT-секторе за последние пару лет превратилась в бесконечный квест по поиску инструментов, которые не превратятся в тыкву после очередного обновления санкционной политики.</p><p>В этой подборке разберем системы трекинга задач, где можно выстроить процессы без западных решений, только РФ. Посмотрим, какие сценарии они закрывают, как устроены под капотом и что предлагают с точки зрения производительности и безопасности.</p><h2>1. Visary Tracker: когда нужна экосистема, а не просто доска</h2><p><a href="https://visary.cloud/tracker?utm_source=tpproger&amp;utm_medium=article">Visary Tracker</a> — это часть более крупной платформы Visary Cloud, что сразу даёт понять: система заточена не под стартапы с пятью задачами в бэклоге, а под команды, которым нужна глубокая аналитика и связка процессов. Применяется как в разработке ПО, так и в управлении проектами, поддержке и операционной работе.</p><p>Доступ через веб-интерфейс, работает с любой ОС. Развёртывание — на выбор: облако (SaaS на мощностях Cloud.ru) или on-premise, если у компании строгие требования к инфраструктуре. В облачной версии данные хранятся в РФ в соответствии с 152-ФЗ, система включена в реестр отечественного ПО (запись №23958 от сентября 2024 года).</p><h3>Методологии и визуализация процессов</h3><p>Для команд, работающих по Agile, реализована поддержка Scrum и Kanban. Можно отслеживать прогресс через Burndown Chart, смотреть на скорость команды через Velocity, планировать долгосрочные работы с помощью дорожной карты.</p><p>Если проект требует классического подхода, функционал системы можно расширить модулем проектного управления. В нём доступны диаграммы Ганта с возможностью контроля задач по вехам проекта и мониторинга ресурсов.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/0594b16b-88b5-4761-800b-11692e4ccdc8.webp" alt="" /></figure><p>Гибкость в настройке — один из ключевых моментов. Можно добавлять свои поля в карточки задач, настраивать триггеры на изменение статусов.</p><p><b>В комплект с Visary Tracker входит пакет бесплатных сервисов экосистемы, который включает:</b></p><ul><li>Сервис коммуникаций (чат, интегрированный в задачи, и сервис видеосвязи);</li><li>Функционал организационной диаграммы (органиграммы);</li><li>Дисковое хранилище для управления, совместного редактирования и хранения файлов;</li><li>Корпоративный календарь.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/f19377df-5dad-46cf-bad0-898a87794413.webp" alt="" /></figure><h3>Права доступа и безопасность</h3><p>Ролевая модель здесь достаточно детальная. Можно разграничивать доступ не только на уровне проектов, но и на отдельные части внутри проекта. Это полезно, когда в одной системе работают несколько команд с разными уровнями допуска к информации. Для администраторов предусмотрен полноценный аудит действий пользователей — кто, когда и что менял в задачах.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/2bf693f0-5b3b-4e6a-a7f1-6b996c681e21.webp" alt="" /></figure><p>Если команда работает с чувствительными данными или ведёт проекты для крупных заказчиков с требованиями по безопасности, можно поднять систему на собственных серверах. С on-premise версией у вас будет полный полный контроль над инфраструктурой и данными.</p><h3>Производительность и масштабирование</h3><p>Интересная особенность — отсутствие искусственных лимитов на количество пользователей и проектов. Система не заставляет пересматривать тарифный план, если команда выросла с 10 до 100 человек. Хранилище подбирается под задачи клиента, минимум — 25 Гб, дальше по потребностям.</p><p><b>Для автоматизации рутины предусмотрены:</b></p><ul><li>REST API и вебхуки для интеграции с системами контроля версий (Git, GitLab, Bitbucket), мессенджерами (Slack, Telegram) и CI/CD-инструментами.</li><li>Планировщик задач и триггеры, которые избавляют от необходимости вручную менять статусы или назначать исполнителей.</li><li>Модуль Visary BI — конструктор дашбордов, если стандартных отчётов не хватает и нужно строить сложную аналитику по проектам.</li></ul><p>Тайм-трекинг, встроенный в систему, позволяет вести учёт рабочего времени по задачам. Контроль загрузки команды осуществляется через назначение веса каждой задаче. Для анализа данных в сводной информации по эпику, этапу или спринту отображается суммарный вес всех входящих в них задач.</p><h3>Миграция и техподдержка</h3><p>Для команд, которые переезжают с другого трекера, есть инструмент импорта данных. В системе есть специальные сервисы для настройки переноса данных с различных IT-продуктов и настройки интеграции для полноценной работы. Для больших объёмов данных доступны дополнительные опции: платные работы по переносу или приобретение модуля ETL.​</p><p>Интерфейс полностью на русском, есть светлая и тёмная темы. Документация, видеоуроки и техподдержка — всё локализовано. Саппорт доступен через Telegram, почту и телефон. Перед покупкой можно запросить демо-доступ и посмотреть, как система работает на реальных данных.</p><h3>Тарификация</h3><p>При покупке подписки клиент получает неисключительную лицензию. Детали по тарифам — на <a href="https://visary.cloud/tariffs">официальном сайте</a>. Команда разработчиков проводит показ системы и подключает демо по запросу, что даёт возможность протестировать функционал перед внедрением.</p><h2>2. Аспро.Cloud: когда таски нужно подружить с экономикой проекта</h2><p><a href="https://aspro.cloud/?utm_source=tproger&amp;utm_medium=pr&amp;utm_campaign=cloud_cold_gde-trekat-zadachi-v-2026_040226_&amp;utm_term=paid-article">Аспро.Cloud</a> — это облачный таск-трекер, который пытается закрыть вечную проблему разрыва между кодом и деньгами. Если обычные системы просто двигают карточки по доске, то здесь архитектура завязана на связке: задача — проект — сделка — финансы. Поэтому здесь можно не только трекать баги, но и видеть рентабельность конкретного проекта в реальном времени.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-05/26c1f459-c004-46f8-a4e8-e32a9a326c79.webp" alt="" /></figure><p>Система работает как SaaS, доступна на Windows, macOS, Linux, iOS, Android (облако + мобильное приложение). Все данные находятся на серверах в РФ, есть внутренний аудит действий пользователей, шифрование данных в транзите и безвозвратное удаление данных. Система обновляется без простоя системы.</p><h3>Методологии и визуализация</h3><p>Разработчикам и PM-ам здесь выкатили полный набор: Agile-модуль для Scrum и Kanban, и отдельный функционал для Waterfall. В плане визуализации всё стандартно, но функционально:</p><ul><li>Канбан-доски для бэклога и текучки.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-05/5decc349-832c-4845-ab13-7e5dcadd7ace.webp" alt="" /></figure><ul><li>Диаграмма Ганта (timeline) для планирования сроков и зависимостей.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-05/9850ad15-44af-4849-b53b-2ad3ffaf2033.webp" alt="" /></figure><ul><li>Календарь и списки.</li><li>Модуль Workload — критичная штука для оценки загруженности команды.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-05/e97fe6fc-c39b-4501-9873-0b0ec1118d06.webp" alt="" /></figure><p>Задачи связаны с проектами, сделками, ставкой сотрудника и финансами, поэтому система подходит не только для трекинга задач, но и для контроля результата. Можно подключать к работе сотрудников, клиентов и подрядчиков и вести работу в одной системе без разрозненных инструментов.</p><h3>Техстек и автоматизация</h3><p>Для тех, кто не любит рутину, предусмотрена RPA-автоматизация: авто-назначение исполнителей, триггеры на смену статусов и планировщик регулярных задач.</p><p>По интеграциям список внушительный:</p><ul><li>Системы контроля версий: GitLab, Bitbucket — связываем коммиты с задачами.</li><li>1С и API: интеграция с 1С:Бухгалтерия 8.3 и открытый REST API для связки с внутренними системами.</li><li>Мессенджеры и соцсети: Telegram, WhatsApp/WhatsApp Business, ВКонтакте, Viber — уведомления и общение с клиентами в привычных каналах.</li><li>Почта: Gmail, Яндекс.Почта, Mail.ru, Outlook, IMAP — задачи можно создавать прямо из писем.</li><li>Облачные хранилища: Google Drive, Яндекс Диск, OneDrive, Dropbox — файлы к задачам подтягиваются из привычных мест.</li><li>IP-телефония: UIS, Mango Office, Телфин, МегаФон, Новофон, Twilio — записи звонков и история коммуникаций привязываются к проектам.</li><li>Банки: Сбербанк, Т-Банк, Альфа-Банк, ВТБ, Точка, Модульбанк, Райффайзен — автоматическая загрузка банковских операций для контроля бюджета.</li><li>Платежные системы: СБП, ЮKassa, CloudPayments, Robokassa, Дзен-мани — приём оплат и выставление счетов.</li><li>Сайты и сервисы: Tilda, готовые сайты Аспро, Jivo, Calendly, DaData, Xmind — связка с маркетингом и автоматизацией лидогенерации.</li></ul><p>Помимо этого есть встроенный маркетплейс приложений, где модули работают изолированно от ядра системы — можно подключать расширения от сторонних разработчиков без риска для стабильности.</p><h3>Безопасность и масштабирование</h3><p>Система тянет до 300+ пользователей и до 1 ТБ хранилища (лимиты зависят от тарифа). В плане безопасности завезли:</p><ul><li>Гибкое управление ролями (чтобы аутсорсеры не видели лишнего).</li><li>Полный аудит действий пользователей.</li><li>Поддержку IP-белых списков и шифрование данных в транзите.</li><li>Резервное копирование и возможность безвозвратного удаления данных.</li></ul><h3>Миграция и поддержка</h3><p>Если решили переезжать, есть штатный импорт из Jira, Asana и Trello. Интерфейс полностью на русском, документация и база знаний тоже. Саппорт отвечает через чат, почту и Telegram в рабочее время.</p><h3>Тарифы</h3><p>Модель — подписка от месяца до двух лет.</p><ul><li>Бесплатная версия: до 5 пользователей и 5 ГБ места (функционал урезан).</li><li>Платные тарифы: зависят от количества юзеров и объема хранилища.</li><li>Триальный период: 14 дней, чтобы понять полный функционал.</li></ul><p>У команды есть обучающие материалы: видеоуроки, вебинары, курсы, сертификация. Пользователи часто помогают в сообществе в ВК, также есть Telegram-канал и клуб пользователей в чате Telegram-канала.</p><h2>3. WEEEK: аналог всего знакомого</h2><p><a rel="nofollow noopener" href="https://weeek.net/ru">WEEEK</a> попадает в категорию систем, которые пытаются закрыть сразу всё: трекинг задач, управление проектами, базу знаний и даже CRM. По сути, это попытка собрать рабочее пространство в одном месте, чтобы не прыгать между пятью вкладками. Судя по отзывам пользователей, которые переезжали с Trello, Asana, Notion и даже Jira, система справляется с этой задачей неплохо.</p><h3>Архитектура и организация работы</h3><p>Структура здесь трёхуровневая: рабочие пространства → проекты → доски/календари/списки. Классическая матрёшка, как сами разработчики это называют.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/e60cd4c4-c2d3-4971-9e0a-c1512639160b.webp" alt="" /></figure><p>Визуализация задач построена вокруг досок в стиле Kanban, есть диаграмма Ганта для тех, кто привык смотреть на задачи в таймлайне. Календари интегрированы напрямую, так что можно планировать спринты и дедлайны в одном интерфейсе.</p><h3>CRM и документы</h3><p>Интересная фича — встроенная CRM с воронками продаж и аналитикой по конверсии. Это не основная функция таск-менеджера, но для команд, где разработка завязана на клиентские запросы (студии, агентства, аутсорс), может упростить жизнь.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/84bbd832-b9f8-424c-96d0-63a7199bb576.webp" alt="" /></figure><p>База знаний работает как внутренний wiki — можно хранить документацию, процессы, регламенты. Поддерживаются Google Docs и Sheets через интеграции, так что если команда уже завела гугл-документы, их можно прикручивать к задачам напрямую.</p><h3>Автоматизация и интеграции</h3><p>Уведомления настраиваются гибко: можно отправлять в Telegram, на почту, в браузер или мобильное приложение. Для тех, кто сидит только в Telegram-каналах, это удобно — не нужно постоянно заходить в интерфейс системы, чтобы проверить, что там изменилось.</p><p>Из интеграций упоминаются Figma, Miro, Airtable и связка с Google. Есть API, что теоретически позволяет прикрутить систему к своим инструментам или автоматизировать через скрипты.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/6c6e5308-8fc7-4c3d-9939-267b0953d897.webp" alt="" /></figure><p>Тайм-трекинг встроен, плюс есть помодоро-таймер для тех, кто практикует работу интервалами. Горячие клавиши и тёмная тема — стандарт для любого инструмента, которым пользуешься по 8 часов в день.</p><h3>Миграция и адаптация</h3><p>Если команда переезжает с Trello и Notion, есть импорт данных. Пользователи в отзывах отмечают, что этот функционал спас их в критической ситуации, когда нужно было быстро перенести все доски и не потерять историю.</p><h3>ИИ-помощница и дополнительные фишки</h3><p>В системе есть ИИ-ассистент по имени Вика. Судя по комментариям пользователей, она помогает с организацией задач, но детали функционала не раскрываются. Вероятно, это что-то вроде умных подсказок или автоматического распределения задач — точнее можно узнать только попробовав.</p><h3>Тарификация</h3><p>Есть бесплатная версия, которая по отзывам вполне функциональна для небольших команд. Платная подписка расширяет возможности. Для студентов предусмотрена студенческая подписка, что редкость для российских сервисов.</p><h3>Техподдержка и комьюнити</h3><p>Команда WEEEK активно ведёт блог, выпускает обучающие материалы и даже проводит онлайн-вебинары с разбором реальных кейсов. Есть Telegram-канал с новостями, где публикуют обновления и фичи. Саппорт отвечает быстро и готов прислушиваться к запросам — несколько пользователей упомянули, что их фичи были реализованы.</p><h2>4. Shtab: управление от стратегии до конкретной подзадачи</h2><p><a rel="nofollow noopener" href="https://shtab.app/">Shtab</a> подходит, чтобы собрать стратегические цели с операционкой. По сути, это попытка решить проблему, когда цели, поставленные на уровне топ-менеджмента, теряются по пути к исполнителям.</p><p>Работает в облаке (SaaS), в изолированном облаке (Private Cloud) и on-premise. Для крупных компаний с требованиями по информационной безопасности есть интеграция с SSO/LDAP и полный аудит.</p><h3>Архитектура целей и задач</h3><p>Основная фишка Shtab — иерархия от цели до подзадачи. Структура выглядит так: стратегические цели (OKR/MBO) → портфели проектов → проекты → задачи → подзадачи.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/b29c4c21-b686-4fbe-985c-1a960bb14a46.webp" alt="" /></figure><p>Для разработки можно привязать спринт или фичу к бизнес-цели и показать заказчику или топ-менеджменту, почему эта задача в приоритете. Прослеживаемость работает в обе стороны: снизу вверх можно понять, зачем ты вообще это делаешь, а сверху вниз — контролировать, как движется достижение цели.</p><h3>Визуализация и представления данных</h3><p>Система поддерживает несколько режимов работы с одними и теми же данными. Канбан-доски с настраиваемыми столбцами и WIP-лимитами для контроля нагрузки — стандарт для команд, работающих по Kanban.</p><p>Диаграммы Ганта для планирования сложных проектов с зависимостями между задачами и контролем загрузки ресурсов. Календарь для временного планирования и матрица приоритетов (срочность/важность) для фокусировки на главном.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/f480bd22-378c-42c6-9281-d68d8e3fde16.webp" alt="" /></figure><p>Списки задач с гибкой настройкой колонок и кастомными полями позволяют работать с большими объёмами задач в режиме одного окна. Все поля интерактивны, что ускоряет работу — не нужно открывать карточку, чтобы поменять статус или исполнителя.</p><h3>Управление знаниями и файлами</h3><p>Отдельный блок — инструмент Страницы, который работает как внутренний wiki. Блочный редактор позволяет оформлять документацию, регламенты, базы знаний с вложенной структурой. Можно встраивать видео и доски задач прямо в документ, что удобно для контекстной привязки информации к процессам.</p><p>Файлы хранятся в едином хранилище проекта, большинство форматов можно просматривать прямо в интерфейсе без скачивания.</p><h3>Тарификация и развёртывание</h3><p>Есть бесплатная версия, детали по ограничениям не уточняются. Облачная версия запускается за 5 минут с автоматическими обновлениями. Private Cloud даёт изолированную инфраструктуру в российском облаке с возможностью масштабирования. On-premise — для тех, кому нужен полный контроль и соответствие ФЗ-152.</p><h2>5. Kaiten: работа по Kanban</h2><p><a rel="nofollow noopener" href="https://kaiten.ru/">Kaiten</a> на рынке больше 10 лет, что для российских таск-менеджеров довольно редкий кейс. Система создавалась Kanban-командой, и это чувствуется в том, как построена работа с потоками задач.</p><p>Работает в облаке и on-premise, включена в реестр ПО РФ. Используется более чем в 200 тысячах компаний — от IT и ритейла до производства и строительства. Среди клиентов Сбер, Tele2, РусГидро, Альфа-Банк.</p><h3>Kanban и Scrum без костылей</h3><p>Разработчики позиционируют Kaiten как Agile-инструмент с полноценной поддержкой обеих методологий. Для Scrum-команд реализованы спринты с оценкой по Story Points, отслеживание прогресса и ретроспектива. Для Kanban — доски с гибкой структурой: можно настраивать этапы и подэтапы, ограничивать количество задач в процессе через WIP-лимиты, добавлять дорожки для параллельных потоков.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/ffde8dcf-7c42-4aa7-b341-ddd762576ea7.webp" alt="" /></figure><p>В Agile-аналитике есть Lead time отчеты, чтобы отслеживать время прохождения задачи от начала до конца и находить узкие места в процессе. Блокировки карточек можно фиксировать с указанием причины, а потом анализировать, почему задачи встают на паузу.</p><h3>Планирование и управление ресурсами</h3><p>Помимо досок, есть таймлайн с возможностью обозначать зависимости между задачами и вехи проекта. Можно смотреть загрузку команды и планировать ресурсы, чтобы не перегружать одних и не оставлять других без работы.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/9498ff1b-9396-402e-819d-c469f4bc813f.webp" alt="" /></figure><p>Иерархия задач строится через родительские и дочерние карточки, что упрощает декомпозицию — разбиваешь эпик на задачи, задачи на подзадачи.</p><h3>Kaiten AI</h3><p>Встроенный ИИ-ассистент умеет расшифровывать встречи и превращать договорённости в задачи. Судя по описанию, это экономит до 60% времени на разбор встреч. ИИ также анализирует процессы, показывает, что тормозит работу, и предлагает стратегические решения.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/b57403f3-09a0-4471-af7b-8d61d674c363.webp" alt="" /></figure><h3>Кастомизация и права доступа</h3><p>Kaiten делает упор на то, что систему не нужно подстраивать под стандартный процесс — она сама подстраивается под ваши уникальные воркфлоу. Пространства и доски кастомизируются как конструктор: можно создавать неограниченную структуру для проектов любой сложности.</p><h3>Интеграции и автоматизация</h3><p>Для разработчиков есть интеграции с GitLab и GitHub. Можно связывать коммиты и мердж-реквесты с карточками задач, что упрощает трекинг технической работы. Уведомления настраиваются гибко — в приложение, на почту, в Slack или Telegram.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/d3f37ae8-4f6f-4243-8c07-beed136832fa.webp" alt="" /></figure><p>Метки и теги помогают подсвечивать разные типы задач на пространстве и фильтровать их. Можно настраивать автоматические правила, чтобы система выполняла рутинные действия сама — например, перемещала карточку в другой столбец при изменении статуса или автоматически назначала исполнителя по определённому условию.</p><h3>Мобильное приложение и шаблоны</h3><p>Есть мобильные клиенты для iOS и Android, где доступны все задачи, статусы, документы и обсуждения. Для быстрого старта предусмотрены готовые шаблоны под разные процессы: IT-команды, маркетинг, согласование документов, поддержка, проектный офис. Можно взять шаблон и адаптировать под свои задачи, вместо того чтобы строить структуру с нуля.</p><h2>6. ЛидерТаск: когда нужно просто начать работать</h2><p><a rel="nofollow noopener" href="https://www.leadertask.ru/">ЛидерТаск</a> — это таск-менеджер, который на рынке уже больше 12 лет и позиционируется как инструмент для личной и командной работы. Если Visary Tracker заточен под экосистемный подход и подробную аналитику, то здесь всё проще — быстрый старт и понятность интерфейса.</p><p>Система работает как в облаке, так и на собственном сервере. Доступна через веб-интерфейс, десктопные клиенты для Windows и мобильные приложения для iOS и Android.</p><p>Из интересного: есть офлайн-режим с автоматической синхронизацией между устройствами, когда интернет снова появляется.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/0de9bf0c-f5a9-462b-8216-2cd3800171d5.webp" alt="" /></figure><h3>Организация работы</h3><p>Список инструментов строится вокруг задач, досок и календаря. Доски работают по принципу канбан: перетаскиваешь карточки между этапами, визуализируешь движение задач от начала до завершения.</p><p>Задачи можно структурировать через дерево — иерархия помогает разбивать крупные куски работы на подзадачи. Есть повторяющиеся задачи, чек-листы внутри карточек, возможность прикреплять файлы.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-29/1439c634-3327-4a73-96b8-1416458d24a5.webp" alt="" /></figure><h3>Командная работа</h3><p>Для работы в команде есть роли и права доступа. Детали реализации не раскрываются, но базовая функциональность есть — можно разграничивать, кто что видит и меняет. Это не уровень enterprise-систем с аудитом каждого действия, но для малых и средних команд должно хватить.</p><h3>Порог входа</h3><p>Система делает ставку на простоту: по отзывам пользователей, интерфейс интуитивный, разобраться можно быстро. Для команд, которым нужен инструмент здесь и сейчас, без длительного онбординга, это может быть главным фактором.</p><p>Есть бесплатная версия (ограничения не уточняются) и возможность записаться на 30-минутную демонстрацию, чтобы посмотреть на функционал в действии.</p><p>В итоге выбор сводится к балансу между функциональностью, требованиями по безопасности и тем, насколько команда готова тратить время на настройку. Универсального решения нет — есть инструменты под разные задачи и контексты.</p>]]></content:encoded>
    </item>
    <item>
      <title>*WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</title>
      <link>https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro</link>
      <comments>https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro</guid>
      <description><![CDATA[<p>*WhatsApp переписал медиадвижок на Rust, убрав 160 тыс строк C++, чтобы снизить уязвимости и повысить безопасность медиа</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro">*WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</a>»</p>]]></description>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 29 Jan 2026 02:14:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>*Meta тихо <a href="https://engineering.fb.com/2026/01/27/security/rust-at-scale-security-whatsapp/">провернула</a> одну из самых крупных миграций на Rust в пользовательском софте.</p><p>*WhatsApp заменил более 160 000 строк C++-кода на Rust в критически важной части приложения — обработке медиафайлов. Новый код уже развернут на миллиардах устройств: от Android и iOS до веба, десктопа и носимых гаджетов.</p><p>Цель проста и прагматична: снизить класс уязвимостей, которые годами преследуют мессенджеры — ошибки управления памятью.</p><h2>Откуда вообще взялась проблема</h2><p>История тянется с 2015 года и уязвимости Stagefright в Android. Тогда выяснилось неприятное: достаточно отправить специально собранный видеофайл и он выполнит код на устройстве жертвы еще до того, как пользователь что-то нажмет.</p><p>Проблема была в системных медиабиблиотеках операционной системы. Именно поэтому приложения вроде *WhatsApp не могли решить ее самостоятельно.</p><p>После этого в *WhatsApp появился собственный C++-модуль wamedia, который проверял медиафайлы на соответствие стандартам, чтобы не скормить ОС заведомо опасный контент.</p><p>Все это работало, но с оговоркой: код автоматически обрабатывал недоверенные данные, а значит сам становился идеальной мишенью для эксплойтов.</p><h2>Почему именно Rust</h2><p>В *WhatsApp довольно рано сделали неприятный, но честный вывод: значительная часть критических багов связаны с банальными ошибками работы с памятью в C и C++. Rust эту категорию проблем убирает на уровне языка.</p><p>Вместо аккуратного «подкручивания гаек», разработчики пошли чуть более радикальным путем: переписали медиабиблиотеку целиком, параллельно поддерживая две реализации — на C++ и на Rust.</p><p>Их прогоняли через дифференциальный фаззинг, тесты и сравнение поведения, пока результаты не совпали.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-29/fdbeec47-e345-4933-b0d8-8ba73ae9944a.webp" alt="" /></figure><h2>Что получилось на выходе</h2><p>Итог оказался даже лучше ожидаемого. 160 000 строк на C++ превратились примерно в 90 000 строк на Rust. И это уже с тестами.</p><p>Производительность не просела, а потребление памяти в ряде сценариев даже снизилось. Основные сложности были не в коде, а вокруг него: размер бинарников из-за стандартной библиотеки Rust и сборка под десятки платформ.</p><p>Тем не менее, библиотеку полностью выкатили в прод. Сейчас этот Rust-код ежемесячно доставляется на миллиарды устройств, включая *WhatsApp, *Messenger и *Instagram.</p><p>В *Meta прямо называют это крупнейшим клиентским деплоем Rust, о котором им известно.</p><h2>Зачем это пользователю, который «просто шлет мемы»</h2><p>Новая система, внутри компании получившая имя Kaleidoscope, проверяет файлы еще до того, как ими займутся системные библиотеки.</p><p>Она отсекает битые и нестандартные структуры, ловит подмену типов (когда «картинка» на деле исполняемый файл), отдельно помечает рискованные форматы вроде PDF со скриптами и вложениями.</p><p>По сути, это еще один слой защиты. Пользователь его не видит, но это и не нужно.</p>]]></content:encoded>
    </item>
    <item>
      <title>Где генерировать API: 10 тулз для разработчиков</title>
      <link>https://tproger.ru/articles/gde-generirovat-api--10-tulz-dlya-razrabotchikov</link>
      <comments>https://tproger.ru/articles/gde-generirovat-api--10-tulz-dlya-razrabotchikov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Гринь]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gde-generirovat-api--10-tulz-dlya-razrabotchikov</guid>
      <description><![CDATA[<p>Разбираем, где сегодня удобнее всего генерировать API: от классических инструментов на базе OpenAPI до платформ, которые поднимают API напрямую из базы данных или превращают документацию в полноценный продукт.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gde-generirovat-api--10-tulz-dlya-razrabotchikov">Где генерировать API: 10 тулз для разработчиков</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 13 Jan 2026 12:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Количество API растёт: по данным <a href="https://cdn.studio.f5.com/files/k6fem79d/production/91c1472168ec7d1a5c9c79c58ae381e55c4031e8.pdf">исследования</a>, к 2030 году мы приблизимся к 1,7 млрд активных API. Неудивительно, что быстрое создание API стало стандартом в современной разработке: сервисы нужно интегрировать друг с другом, прототипы — собирать за часы, а документацию — поддерживать актуальной.</p><p>Разработчики всё чаще используют генераторы API, которые позволяют описать структуру сервиса, а затем автоматически получить готовые эндпоинты, SDK, документацию, тесты или mock-сервисы. Разбираемся, где сегодня удобнее всего генерировать API и какие инструменты актуальны сегодня.</p><h2>Чем полезны генераторы API</h2><p>Генераторы API автоматически создают код, документацию или вспомогательные компоненты API на основе формального описания, чаще всего OpenAPI. Они ускоряют разработку, снижают количество ошибок и улучшают взаимодействие команд.</p><blockquote>Если честно, автоматическая генерация API — это просто способ сэкономить время и нервы команды. Когда у тебя десятки сервисов и интеграций, как в облачной инфраструктуре, ручная разработка контрактов превращается в хаос: каждый пишет как привык, форматы плавают, документация отстаёт. Генераторы же дают единый стандарт и устраняют большую часть рутины. Это гарантирует дисциплину, которую сложно поддерживать вручную.</blockquote><blockquote>Главное преимущество — сокращение цикла разработки. Инструменты генерации API позволяют строить контракты быстрее и с меньшим количеством ошибок, чем при ручной работе. В крупных проектах, где есть десятки сервисов и команд, автоматизация снижает риск расхождений между спецификацией и реальной логикой в коде. Это прямой выигрыш в качестве интеграций и скорости вывода обновлений в продуктив.</blockquote><h2>Swagger</h2><p>Полноценная экосистема для разработки, документирования и тестирования API на базе спецификаций OpenAPI/Swagger. Исторически Swagger Codegen был первым популярным генератором кода по Swagger/OpenAPI, но устарел.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/42f95ccc-4796-49f9-813a-639084e20fbb.png" alt="" /><figcaption>Источник: Swagger.io</figcaption></figure><p>Swagger Editor — интерактивный редактор с живой визуализацией документации. Swagger UI превращает спецификацию в интерактивный интерфейс: любой может изучить структуру API и выполнить запросы прямо в браузере, видя ответы с кодами, заголовками и телом.​ Также позволяет выполнять реальные запросы к эндпоинтам с параметрами, мгновенно показывая HTTP-ответы.</p><p>Как отмечает Елена Титова, <i>«Swagger / OpenAPI — по-прежнему универсальный стандарт, который легко интегрируется почти с любыми CI/CD-конвейерами»</i>.</p><p><b>Стоимость:</b> от €21.20 в месяц.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/1934c2b9-89e5-46c8-8d09-f17a6659aac0.png" alt="" /><figcaption>«Для надёжной API‑документации, в которой удобно просматривать описания и копировать эндпоинты/запросы/ответы, я рекомендую Postman или Swagger UI/SwaggerHub. Другие отличные варианты — ReadMe, Stoplight и Apidog. Эти инструменты созданы для интерактивной API‑документации и значительно превосходят по возможностям Google Docs». Источник: Reddit</figcaption></figure><h2>OpenApi Generator</h2><p>Инструмент для автоматической генерации кода и артефактов на основе спецификации OpenAPI. Сервис позволяет быстро создавать клиентские библиотеки для взаимодействия с API: доступно более 50 генераторов под разные языки и платформы. Владельцы API могут использовать его для выпуска официальных SDK и полностью настраивать шаблоны генерации с помощью Mustache.</p><p>Инструмент также упрощает серверную разработку. OpenAPI Generator умеет создавать серверные заготовки более чем для 40 языков и технологий, включая Java, Kotlin, Go и PHP. В ряде генераторов поддерживается инверсия управления. Это позволяет менять дизайн API через спецификацию OpenAPI, не разрушая бизнес-логику при повторной генерации кода.</p><p><b>Стоимость:</b> бесплатно.</p><blockquote>Swagger и OpenAPI Generator — самые надёжные инструменты, которые я могу рекомендовать. Они понятные, экосистема огромная, а главное — они позволяют содержать документацию, SDK и схему API синхронизированными. Это заметно ускоряет работу с партнёрами и интеграторами: у всех один контракт, без сюрпризов.</blockquote><h2>Postman</h2><p>Инструмент для тестирования API, который помогает разработчикам и тестировщикам отправлять HTTP-запросы к серверу, получать ответы и проверять корректность работы внутренних процессов приложения. С его помощью можно оценить, как функционируют механизмы «под капотом», но не то, как выглядит интерфейс.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/a900a6ca-1689-4809-be79-0f555c91fd5c.png" alt="" /><figcaption>Источник: Postman.com</figcaption></figure><p>Postman также позволяет автоматизировать тестирование. Например, можно создать набор запросов, который воспроизводит путь пользователя в интернет-магазине от поиска товара до оплаты, что значительно экономит время. У сервиса есть бесплатный тариф и платные планы с расширенными возможностями для команд и корпоративных пользователей. Все данные хранятся в облаке, что удобно для совместной работы, но может быть нежелательно для компаний с высокими требованиями к безопасности.</p><p>А ещё Postman можно использовать и в быту — например, настроить автоматическую проверку статуса готовности визы.</p><p><b>Стоимость:</b> есть бесплатный тариф, Basic — от $14 в месяц.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/cf7157c5-2971-432a-8151-d95e73adb85b.png" alt="" /><figcaption>«Я использую Postman много для тестирования и отладки. Они сделали отличный инструмент. / Я ненавижу Postman, но всегда возвращаюсь к нему». Источник: Reddit</figcaption></figure><h2>Apidog</h2><p>Универсальный инструмент для тестирования и разработки API, который упрощает работу на всех этапах жизненного цикла API. Благодаря понятному интерфейсу в APIdog легко создавать и отправлять запросы, проверять ответы и автоматизировать тестирование, что делает сервис удобным как для новичков, так и для опытных специалистов.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/f74f2b52-e3bc-4012-838d-289e03ae74bc.png" alt="" /><figcaption>Источник: Apidog.com</figcaption></figure><p>Сервис поддерживает mock-серверы, позволяя тестировать API без готового бэкенда, автоматически генерирует интерактивную документацию и работает с REST, WebSocket и GraphQL. Управление окружениями помогает быстро переключаться между dev, staging и production, а поддержка всех основных HTTP-методов и популярных способов аутентификации закрывает большинство сценариев тестирования.</p><p>Для командной работы есть общие рабочие пространства и контроль версий, что упрощает совместную разработку и интеграцию в CI/CD-процессы.</p><p><b>Стоимость:</b> есть бесплатный режим, тариф Basic — $9 в месяц.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/054d2965-8814-4d87-9034-86ea80e9e9d4.png" alt="" /><figcaption>«Недавно попробовал Apidog — он действительно классный и плавно работает. Вы одновременно создаёте документацию и тесты. У них даже есть встроенный инструмент для нагрузочного тестирования». Источник: Reddit</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/a33c7b7d-a9f4-46ed-ba60-70037a75c323.png" alt="" /><figcaption>«Apidog — отличный выбор. Они поддерживают офлайн‑режим, а их подход «всё в одном» очень удобен. Они ещё недавно добавили функцию AI‑генерации тестовых кейсов, и это реально стоящая вещь». Источник: Reddit</figcaption></figure><h2>Stoplight</h2><p>Графический редактор OpenAPI. Вы просто рисуете структуру будущего сервиса, а инструмент генерирует спецификацию и документацию. Это позволяет продумать структуру API до написания кода и снизить риск ошибок.</p><p>В основе сервиса — визуальный редактор Stoplight Studio, который поддерживает OpenAPI и JSON Schema и позволяет создавать спецификации через удобные формы, работая напрямую с Git-репозиториями. Платформа автоматически генерирует документацию, создаёт мок-серверы для раннего тестирования и предоставляет инструменты проверки качества.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/7de1a212-c7b6-4321-ab78-e0b50aeb9c1d.png" alt="" /><figcaption>Источник: Stoplight.io</figcaption></figure><p>Чтобы начать, достаточно зарегистрироваться, импортировать или создать спецификацию API и настроить структуру через визуальный редактор. Документация публикуется в один клик, а встроенные правила Spectral помогают сохранять единый стиль API внутри команды или компании.</p><p><b>Стоимость:</b> есть бесплатный тариф, Basic — от $41 в месяц.</p><blockquote>Low-code наши дизайнеры тоже пробовали — Stoplight, Postman API Builder. Хороши, когда нужно быстро собрать прототип или дать возможность продуктовой команде поиграть с контрактами без участия разработчика. Но в продакшене мы всё равно возвращаемся к OpenAPI: это стабильнее и проще автоматизировать.</blockquote><h2>Hasura</h2><p>Платформа для быстрого создания и управления API (GraphQL, REST и др.) поверх любых источников данных. Сервис позволяет запускать и развивать API без ручного кодирования: достаточно подключить базы данных, и система автоматически сгенерирует готовый GraphQL-интерфейс. Такой подход обеспечивает высокую гибкость и подходит как для отдельных сервисов, так и для сложных распределённых архитектур.</p><p>Платформа отличается высокой производительностью за счёт оптимизации запросов и динамической компиляции наиболее эффективных обращений к данным. Hasura поддерживает командную разработку через модель суперграфа, удобный API-портал для работы с данными и глобальную сеть доставки. В результате вы можете получить масштабируемый надёжный API с минимальными затратами.</p><p><b>Стоимость:</b> от $1,5 за активный час.</p><h2>PostgREST</h2><p>Независимый open-source веб-сервер, который автоматически превращает базу данных PostgreSQL в полноценный REST API. Вместо ручной реализации CRUD-логики он использует саму структуру базы: таблицы, представления, функции, роли и ограничения напрямую определяют доступные эндпоинты и операции. API соответствует спецификации OpenAPI и позволяет работать даже со сложными связями между таблицами через обычные HTTP-запросы.</p><p>Высокая производительность PostgREST достигается за счёт трёх факторов: сервер написан на компилируемом языке Haskell, максимальная часть логики делегируется PostgreSQL, а работа с БД ведётся через эффективный пул соединений и бинарный протокол. PostgREST позволяет администраторам и разработчикам быстро создавать масштабируемые API поверх реляционной модели без лишнего кода.</p><p><b>Стоимость:</b> бесплатно.</p><blockquote>Инструменты «API из базы» — например, Hasura или PostgREST — хороши в узких случаях, когда нужен очень быстрый CRUD поверх данных. Но в облачных продуктах, где логика сложнее, мы всё-таки проектируем API осознанно.</blockquote><h2>Supabase</h2><p>Платформа разработки на базе PostgreSQL, которая берёт на себя весь бэкенд‑стек и позволяет сосредоточиться на продукте, а не на инфраструктуре. Для каждой таблицы в базе она автоматически поднимает полнофункциональный REST API с поддержкой фильтрации, сортировки и пагинации и превращает схему данных в готовый HTTP‑интерфейс без ручной ручной CRUD‑обвязки. Управление доступом завязано на встроенную аутентификацию и политику Row Level Security, поэтому правила безопасности описываются привычными SQL‑политиками, а не разрозненным кодом в сервисах.</p><p>При необходимости разработчик может использовать Edge Functions — серверные функции, которые разворачиваются ближе к пользователю и работают как кастомные HTTP‑эндпоинты. В дополнение к этому Supabase предлагает realtime‑подписки и vector‑API, что позволяет строить многопользовательские интерфейсы и внедрять AI/RAG‑сценарии поверх той же самой базы и её API.</p><p><b>Стоимость:</b> есть бесплатный тариф, Pro — от $25 в месяц.</p><blockquote>Для генерации API из базы или других источников данных под конкретные задачи мы используем такие решения, как Hasura, Supabase или внутренние генераторы поверх GraphQL/REST. Они позволяют быстро поднять API-слой для внутренних продуктов, не вкладывая недели в инфраструктуру.</blockquote><h2>Redocly</h2><p>Специализированная платформа для API‑документации, выросшая из популярного open‑source‑продукта ReDoc.​ Сервис упрощает разработку и интеграцию API, так как автоматизирует создание подробной документации на основе спецификаций OpenAPI. Благодаря этому документация всегда соответствует актуальному состоянию API и не требует ручного обновления. Интерактивный формат позволяет разработчикам удобно изучать эндпоинты и примеры ответов, что ускоряет работу и снижает порог входа.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/cb6b810e-16ea-4f48-98cf-21ba83cbe589.png" alt="" /><figcaption>Источник: Redocly.com</figcaption></figure><p>Инструмент отличается современным адаптивным дизайном и поддерживает гибкую настройку внешнего вида. ReDoc легко встраивается в существующие сайты. У проекта также активное сообщество и много полезных материалов.</p><p><b>Стоимость:</b> от $10 в месяц.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/60c36dcd-a7cb-4d0f-9a6b-8bf0046a3977.png" alt="" /><figcaption>«Для одного из наших крупнейших проектов мы используем https://redocly.com/, а также несколько собственных инструментов для таких вещей, как более качественная генерация сниппетов. Это не идеальный вариант, но он отвечает многим требованиям». Источник: Reddit</figcaption></figure><blockquote>Из инструментов для документации и управления жизненным циклом API нам нравятся Redoc, ReadMe, а также комплексные API-порталы, которые дают удобные каталоги, версии, управление ключами и метриками. В больших компаниях это помогает превратить API в действительно управляемый продукт.</blockquote><h2>Docusaurus</h2><p>Удобный инструмент для создания современных API-доков. Это React-ориентированный генератор статических сайтов с поддержкой Markdown и MDX, версионирования, поиска, мультиязычности и гибкой кастомизации. Он хорошо подходит для команд, которые рассматривают документацию как часть продукта, а не как вторичное приложение. С помощью Docusaurus можно быстро собрать удобный портал документации, добавить интерактивные компоненты, встроить примеры запросов и масштабировать контент по мере развития API.</p><p><b>Стоимость:</b> бесплатно.</p><figure><img src="https://media.tproger.ru/user-uploads/115279/2025-12-19/22138d3a-1b0f-4a6c-970f-b69f2ae14e74.png" alt="" /><figcaption>«Для API‑доков у меня был хороший опыт с Docusaurus + локальный поиск. Всё полностью офлайн, на Markdown, и вы можете версионировать всё в Git. Если нужно что‑то более динамичное, можно развернуть локальную RAG‑систему поверх ваших OpenAPI‑спеков и кода. Кормите её спецификациями, примерами кода и документацией — тогда разработчики смогут задавать вопросы на естественном языке. Намного лучше, чем искать по документации через ctrl+f. Redoc тоже очень неплох для визуализации OpenAPI‑спеков, если вы его ещё не пробовали». Источник: Reddit</figcaption></figure><h2>Как выбрать инструменты для проекта</h2><p>По словам Елены Титовой, в «Стеллар» выбирают инструменты по следующим критериям:</p><ul><li>Масштабируемость и удобство поддержки — продукт должен жить долго.</li><li>Качество документации и генерации клиентских библиотек — это определяет скорость интеграций.</li><li>Встроенная автоматизация — CI/CD, тестирование, контроль версии.</li><li>Стоимость владения — от лицензии до инфраструктуры.</li><li>Кривая обучения — инструмент должен быть понятен новой команде без месяцев онбординга.</li></ul><blockquote>Главный критерий выбора инструмента простой: насколько он вписывается в ваш процесс. Хороший тул должен сокращать количество ручной работы, не ломать привычный пайплайн и обеспечивать воспроизводимость. Чем меньше «магии» и больше предсказуемости — тем лучше.</blockquote><h2>Тренды и перспективы</h2><p>Уже сегодня один из главных трендов — подход <b>API-first</b>, при котором API закладывается в фундамент продукта уже на старте. Сначала проектируется интерфейс взаимодействия, а вокруг него выстраиваются сервисы, приложения и интеграции. Это изначально закладывает масштабируемость продукта.</p><p>Появляются <b>маркетплейсы API</b>. Так, платформа <a href="https://rapidapi.com/">RapidAPI</a> даёт единый доступ к тысячам API от разных провайдеров. Здесь можно быстро найти нужный сервис, протестировать его и подключить к приложению через единый интерфейс. Это значительно сокращает время на поиск и интеграцию API.</p><p>В свою очередь, в России появился <a href="https://apiportal.ru/about/">«Портал API»</a>, на котором можно найти широкий каталог API, подробную документацию и профессиональную поддержку.</p><p>Наконец, всё чаще API рассматривается не как вспомогательный технический интерфейс, а как полноценный продукт. Такой подход получил название <b>API-as-a-Product</b>. В этой модели API не просто связывает системы между собой, а предоставляет готовый бизнес-функционал, который могут использовать разные команды, партнёры и внешние разработчики.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пузырь 2021–2022 годов лопнул: эксперты составили прогноз рынка на 2026 год</title>
      <link>https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god</link>
      <comments>https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god</guid>
      <description><![CDATA[<p>После пузыря 2021–2022 ИТ-рынок стабилизируется: в 2026 ждут низкий найм, меньше джунов и рост спроса на сильных инженеров</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/puzyr-2021-2022-godov-lopnul--eksperty-sostavili-prognoz-rynka-na-2026-god">Пузырь 2021–2022 годов лопнул: эксперты составили прогноз рынка на 2026 год</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 30 Dec 2025 11:01:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>IT-рынок пережил болезненную коррекцию после бума и перегрева 2021–2022 годов.</p><p>Тогда компании нанимали инженеров с запасом, под давлением цифровизации, дешевых денег и страха «остаться позади». По данным Indeed и FRED, пик вакансий пришелся на середину 2022 года. После чего последовал резкий спад, так и не вернувшись до прежнего уровня.</p><h2>Почему ИИ — удобный, но не главный виновник</h2><p>ИИ стал публичным оправданием сокращений. Заявление «мы заменяем людей на ИИ» хорошо смотрится в отчетах и перед инвесторами.</p><p>На практике же компании сокращали издержки, выравнивали штат и параллельно активнее нанимали за пределами США и Европы, где инженеры стоят дешевле.</p><p>Исследования показывают, что ИИ пока не делает разработчиков быстрее в реальной работе. Напротив, опытные инженеры иногда теряют в продуктивности из-за необходимости проверять и исправлять сгенерированный код.</p><h2>Как будет выглядеть рынок в 2026 году</h2><p>Эксперты <a href="https://www.finalroundai.com/blog/software-engineering-job-market-2026">сходятся</a> во мнении: 2026 год пройдет в режиме «низкого найма — низких увольнений». Массовых сокращений не ожидается, но и бурного роста вакансий не будет. Так выглядит стабилизация рынка.</p><p>При этом спрос смещается — универсальных «кодеров» нужно меньше. А вот инженеры, которые умеют проектировать системы, работать с производительностью, безопасностью и сложной интеграцией, наоборот будут все чаще находить вакансии под себя.</p><p>По прогнозу Бюро статистики труда США, число вакансий для разработчиков продолжит расти примерно на 15%. Это медленнее, чем ожидалось раньше, но все еще быстрее большинства профессий.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-30/3a3ad90f-f354-48b3-83bd-8857158de8e8.jpeg" alt="" /></figure><h2>Почему джунам повезло меньше всего</h2><p>Самое слабое место рынка — начальные позиции. Количество вакансий для junior-разработчиков упало примерно на 40% по сравнению с допандемийным уровнем.</p><p>Компании больше не готовы вкладываться в длительное обучение: им нужны люди, которые могут приносить пользу почти сразу.</p><p>Но это также создает отложенную проблему — без притока новичков рушится кадровый «конвейер».</p><h2>Какие навыки реально востребованы</h2><p>В 2026 году ценятся не языки сами по себе, а связки «язык + область».</p><p>Тот же Python чаще всего нужен при работе с ИИ и данными. JavaScript и TypeScript — для фронтенда и fullstack. Go — для бэкенда и инфраструктуры. Java — для enterprise-систем.</p><p>Параллельно растет спрос на ИИ- и дата-инженеров, а также специалистов по ИИ-инфраструктуре.</p>]]></content:encoded>
    </item>
  </channel>
</rss>