<?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/db</link>
    <atom:link href="https://tproger.ru/tag/db/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 17 Oct 2026 21:03:34 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/obem-dannyh-rastet-kak-optimizirovat-rashody-i-hranit-bolwe</link>
      <comments>https://tproger.ru/articles/obem-dannyh-rastet-kak-optimizirovat-rashody-i-hranit-bolwe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/obem-dannyh-rastet-kak-optimizirovat-rashody-i-hranit-bolwe</guid>
      <description><![CDATA[<p>S3 облачное хранилище Beget: храните бэкапы, логи и медиа отдельно от сервера, платите только за объём. Аренда S3-хранилища — в один клик.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/obem-dannyh-rastet-kak-optimizirovat-rashody-i-hranit-bolwe">Объем данных растет? Как оптимизировать расходы и хранить больше, а платить – меньше</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Sep 2026 03:15:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет!</p><p>На связи команда облачного провайдера <a href="https://beget.com/ru/cloud">Beget</a> – сегодня мы расскажем, как можно сэкономить на хранении данных, когда их становится всё больше.</p><p>Мы с вами живем в цифровую эпоху, где ежедневно создается приблизительно <a href="https://explodingtopics.com/blog/data-generated-per-day">402,74</a> млн терабайт информации, а данные – один из ключевых ресурсов каждого бизнеса.</p><p>Изображения, видео, документы, пользовательские файлы, резервные копии – их объем постоянно растет: по статистике, неструктурированные наборы данных составляют <a href="https://www.itransition.com/data/big/future">90%</a> всей информации, генерируемой предприятиями, а ее размеры зачастую достигают терабайтов или петабайтов.</p><p>И вместе с этим, соответственно, увеличиваются требования к инфраструктуре и расходы на ее содержание.</p><p>При этом удалять данные только потому, что они занимают много места, бизнес не может: новые файлы необходимы для работы, а старые – могут понадобиться клиентам, команде или для восстановления проекта после сбоя.</p><p>В этих реалиях возникает задача – как сократить расходы на хранение данных и не потерять к ним доступ.</p><p>Расскажем о решении, которое может в этом помочь.</p><h3>Когда серверу становится тесно</h3><p>Зачастую это происходит внезапно: сначала серверу хватает места, а через несколько месяцев – уже нет: добавляются новые файлы, а вместе с ними растут и затраты на инфраструктуру.</p><p>Однако не всей информации нужны ресурсы основного сервера – вот примеры данных, которые так хранить необязательно:</p><p>· резервные копии;</p><p>· архивы и старые версии файлов;</p><p>· логи и истории событий;</p><p>· изображения, видео и другой медиаконтент;</p><p>· документы, которые редко используются;</p><p>· выгрузки и результаты обработки данных;</p><p>· дистрибутивы, установочные файлы и образы;</p><p>· данные для долгосрочного хранения и аудита.</p><p>Ко многим из этих данных обращаются редко, а хранить их нужно постоянно.</p><p>Чтобы сэкономить на хранении и при этом сохранить быстрый доступ к информации, когда она понадобится, можно подключить <a href="https://beget.com/ru/cloud/storage">S3</a> – безлимитное облачное объектное хранилище для работы с большими объемами неструктурированных данных.</p><p>С ним можно разделить вычисления и хранение: оставить на серверах только то, что действительно нужно приложению для работы, а большие объемы файлов, архивов и резервных копий вынести в объектное хранилище – такой подход позволяет увеличивать объем данных по мере роста бизнеса, не перестраивая основную инфраструктуру.</p><h3>Что дает объектное хранилище</h3><p>· Моментальное масштабирование – облачное хранилище S3 расширяется автоматически, загружайте столько данных, сколько потребуется.</p><p>· Надежность и доступность – при аренде S3-хранилища данные хранятся в 3 копиях и размещаются на независимых серверах в разных стойках для абсолютной сохранности.</p><p>· Гибкое управление – версионирование, настройка доступа и классы хранения позволяют контролировать, где и как хранятся данные.</p><p>· Доступ к данным 24/7 из любой точки мира и из любого браузера.</p><p>· Удобная модель оплаты Pay as you go – оплачивайте только тот объем, который используете.</p><p>В настоящее время S3 <a href="https://www.programming-helper.com/tech/amazon-s3-object-storage-2026-cloud-data-lake-ai-infrastructure">хранит</a> сотни эксабайт данных в сотнях триллионов объектов, обрабатывая в среднем более 200 миллионов запросов в секунду.</p><p>Разберем конкретнее, какую пользу объектное хранилище может принести бизнесу.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-09-10/73c70362-ed3c-4178-9bb1-ee68eeb9114e.webp" alt="" /></figure><h3>S3 на практике: кто и как использует</h3><p>Итак, объектное хранилище может пригодиться для:</p><p>· хранения бэкапов, отчетов, медиафайлов и другого контента отдельно от серверов – чтобы сэкономить и снизить риск потери данных при сбоях;</p><p>· архивирования – сохраняйте редко используемые документы, логи и старые версии файлов без нагрузки на основные диски;</p><p>· обмена данными между сервисами – можно организовать единое хранилище для микросервисов и упростить передачу файлов между ними;</p><p>· масштабирования проектов – увеличивайте объем хранимых данных без пропорционального расширения серверных дисков.</p><p>S3 используют более <a href="https://technologychecker.io/technology/amazon-s3">398</a> тысяч компаний – и вот лишь несколько примеров результатов:</p><p>· производитель шин Apollo Tyres – на <a href="https://aws.amazon.com/ru/solutions/case-studies/apollo-tyres-case-study/">90%</a> снизил затраты на резервное копирование за 2 года на трех из семи своих заводов;</p><p>· платформа EZJobs – снизила затраты на <a href="https://futransolutions.com/case-studies/how-a-global-enterprise-cut-cloud-storage-spend-and-improved-data-lifecycle-efficiency-through-intelligent-optimization/">50%</a> благодаря интеллектуальному многоуровневому хранению;</p><p>· маркетплейс Ozon – благодаря дедупликации в среднем сэкономил на обработке данных около <a href="https://habr.com/ru/companies/ozontech/articles/818433/">13%</a> по всем бакетам;</p><p>· технологическая компания Bynder – сэкономила <a href="https://aws.amazon.com/ru/solutions/case-studies/bynder-amazon-s3-case-study/">65%</a> затрат на хранение данных о клиентах благодаря системам интеллектуального многоуровневого хранения S3;</p><p>· финансовый маркетплейс “Сравни” – уменьшил затраты на инфраструктуру БД в <a href="https://habr.com/ru/companies/sravni/articles/839334/">1,5</a> раза.</p><p>На примере этих и других компаний заметно, что объектное хранилище S3 помогает решать сразу несколько бизнес-задач – сокращать расходы на хранение, разгружать серверную инфраструктуру и масштабировать объем данных без сложных перестроек.</p><p>Если у вашего проекта большое количество данных и вы хотите оптимизировать расходы на их хранение, то создать объектное хранилище <a href="https://beget.com/ru/cloud/storage">S3</a> в <a href="https://beget.com/ru/cloud">Beget</a> буквально в один клик можно уже сейчас.</p><h3>Заключение</h3><p>Примерно <a href="https://www.demandsage.com/big-data-statistics/">90%</a> из генерируемых пользователями данных являются неструктурированными.</p><p>В этой ситуации S3-хранилище может помочь бизнесу хранить растущие объемы файлов отдельно от серверной инфраструктуры, не переплачивая за дисковые ресурсы и сохраняя быстрый доступ к нужной информации.</p><p>При этом экономия на хранении данных – далеко не единственная задача, которую могут помочь решить продукты <a href="https://beget.com/ru/cloud">Beget</a>, например, вы также можете:</p><p>· развернуть производительный <a href="https://beget.com/ru/vps">VPS</a> с готовностью за 10 секунд и <a href="https://beget.com/ru/cloud/marketplace">готовыми решениями</a> для ваших задач;</p><p>· подключить мощные <a href="https://beget.com/ru/cloud/dbaas">облачные базы данных</a> для разработки сложных веб-сервисов и приложений;</p><p>· настроить <a href="https://beget.com/ru/cloud/cdn">сеть доставки контента</a> для снижения нагрузки на сервер и увеличения скорости загрузки сайта;</p><p>· удобно управлять инфраструктурой – с <a href="https://beget.com/ru/cloud/kubernetes">Kubernetes</a>;</p><p>· обеспечить контроль и прозрачность изменений – с <a href="https://beget.com/ru/kb/faq/cloud/terraform">Terraform</a>.</p><p>А еще облако Beget – это:</p><p>· глобальный охват – выбирайте локацию серверов в России или Казахстане и будьте ближе к вашей аудитории;</p><p>· новейшее железо – мощные серверные решения на базе Amd Epyc с NVMe-дисками;</p><p>· надежность и стабильность – благодаря uptime 99,98% и дата-центрам Tier III (стандарт с защитой от аварийных ситуаций);</p><p>· бесплатные автоматические бэкапы – копии создаются раз в 2–5 дней и хранятся на двух независимых серверах в разных дата-центрах;</p><p>· универсальный интерфейс – единая панель для управления всеми облачными решениями;</p><p>· комфортный мониторинг с возможностью кастомизировать правила для отслеживания состояния серверов;</p><p>· защита от атак – серверы защищены на сетевом и транспортном уровне (L3/L4), а наша собственная разработка Syncookied обеспечивает защиту от SYN/ACK/DATA-флуда;</p><p>· функциональный API – управляйте серверами и доменами без необходимости заходить в панель управления.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-09-10/fc1001e6-1d9a-4d3d-952c-6d4d637605e4.webp" alt="" /></figure><p>Если у вас остались вопросы, вы хотите обсудить эту статью или просто пообщаться с коллегами по цеху и сотрудниками <a href="https://beget.com/ru/cloud">Beget</a>, будем рады видеть вас в нашем уютном <a href="https://t.me/beget_chat">Telegram-чате</a> – с удовольствием на всё ответим и пообщаемся.</p><p>Также сейчас для новых пользователей мы начисляем <a href="https://beget.com/s/DuUPD" rel="follow">10% кешбэка</a> за первое пополнение баланса – чтобы вы могли начать хранить данные еще выгоднее с самого первого дня.</p><p>Реклама. ООО «Бегет», ИНН 7801451618, erid: 2W5zFJqF2Y9</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция архитектуры страниц данных в СУБД: от NSM до FastLanes</title>
      <link>https://tproger.ru/articles/evolyuciya-arhitektury-stranic-dannyh-v-subd-ot-nsm-do-fastlanes</link>
      <comments>https://tproger.ru/articles/evolyuciya-arhitektury-stranic-dannyh-v-subd-ot-nsm-do-fastlanes?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Виталий При]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-arhitektury-stranic-dannyh-v-subd-ot-nsm-do-fastlanes</guid>
      <description><![CDATA[<p>Эволюция файлов данных в СУБД. Хотя NSM уже больше 15 лет, это архитектура продолжает использоваться ведущими  СУБД. Рассмотрим какие задачи решает модель PAX и ее оптимизированный вариант FastLanes.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-arhitektury-stranic-dannyh-v-subd-ot-nsm-do-fastlanes">Эволюция архитектуры страниц данных в СУБД: от NSM до FastLanes</a>»</p>]]></description>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Sep 2026 17:27:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда вы пишете SELECT * FROM users WHERE age &gt; 30, вы
редко задумываетесь о том, как именно СУБД физически хранит эти данные на
диске. А между тем, от архитектуры страницы данных зависит, сколько лишних байт
будет прочитано, насколько эффективно используется кэш
процессора, и во что обойдутся обновления и удаления. В этой статье разберём
три классические модели — NSM, DSM и PAX, а также заглянем в будущее — формат
FastLanes, созданный специально под SIMD и GPU.<b></b></p><h3>1. Классика всех времен: страница NSM</h3><p>Традиционная и самая распространённая архитектура
в OLTP-СУБД (PostgreSQL, Oracle) — слотированная страница,
относящаяся к семейству NSM (N-ary Storage Model). Страница, как правило, имеет
фиксированный размер, чаще всего 8 или 16 КБ (может настраиваться параметром
БД), и делится на три логические области:</p><p>·      
<b>Заголовок страницы</b> — содержит
метаданные: размер страницы, количество слотов, смещение до свободного
пространства и флаги.</p><p>·      
<b>Таблица слотов</b> — массив записей
фиксированной длины, каждая из которых хранит смещение (offset) до начала
соответствующей строки. Слоты упорядочены по позиции строки в таблице.</p><p>·      
<b>Область данных</b> — сами кортежи,
расположенные последовательно, но в обратном порядке относительно таблицы
слотов (данные растут с конца страницы в начало, а слоты — с начала в конец).
Это позволяет эффективно управлять фрагментацией.</p><p><br /></p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/393863ea-b164-4e8d-8cdd-1ed31ffbac59.webp" alt="Пример таблицы" /><figcaption>1.1 Пример таблицы</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/1523098a-dbbb-469e-a550-f3d7f8e23ee2.webp" alt="Пример файла данных для таблицы" /><figcaption>Рисунок 1.1 – Пример файла данных для таблицы</figcaption></figure><p><br /></p><h4>Особенности
работы с изменениями на уровне страницы:</h4><p>При обновлении строки, если её новый размер превышает старый,
на старом месте сохраняется указатель (forwarding pointer), а обновлённая
запись перемещается в свободную область страницы (или даже на другую страницу,
если свободного места недостаточно). Это порождает цепочки переадресации,
которые могут замедлять чтение.</p><p>При удалении строки соответствующий слот помечается как
недействительный (например, устанавливается флаг deleted или смещение
становится отрицательным). Физическое освобождение места происходит позже — при
сборке мусора (VACUUM в PostgreSQL) или при перестройке страницы.</p><h4>Главный недостаток:</h4><p>Для запросов, которые читают миллионы строк, но выбирают лишь 2–3 атрибута из 20, NSM необходимо просканировать всю страницу целиком. В результате в кэш CPU загружаются все атрибуты, включая ненужные. Это не только увеличивает время I/O, но и порождает промахи кэша (cache misses), поскольку полезные данные перемешиваются с не нужными.</p><h3>2. Колоночная страница DSM:</h3><p>Научная работа Джорджа П. Коупленда и Сетрага Н. Хошафяна «A
Decomposition Storage Model» (ACM SIGMOD) [1] предложила кардинально иной
подход к организации данных на странице, получивший название DSM (Decomposition
Storage Model).</p><p>В классической реализации DSM каждый атрибут таблицы хранится в
отдельном наборе страниц. При этом страницы внутри одного атрибута содержат
только значения этого столбца, расположенные в порядке строк. Для
восстановления полной записи используется либо позиционный идентификатор
(порядковый номер строки в странице), либо служебные битовые маски.</p><h4>Преимущества на уровне страниц:</h4><p>·      
Страница заполняется данными одного типа — это
даёт значительный прирост в сжатии (RLE, дельта-кодирование, битовые карты) по
сравнению с NSM-архитектурой.</p><p>·      
При сканировании одного-двух столбцов читается
ровно столько страниц, сколько нужно для этих атрибутов, без загрузки не используемых в запросе колонок.</p><h4>Обратная сторона:</h4><p>Вставка или обновление строки требуют записи в страницы всех
атрибутов, что превращается в доступ к множеству файлов и их соединение.
Запрос SELECT * для ограниченного числа строк также вынужден
выполнять дорогостоящее соединение страниц разных столбцов, что делает DSM
неэффективной для OLTP.</p><p>Первоначально модель не получила широкого распространения
именно из-за высокой стоимости сборки строк. Однако с ростом мощностей
процессоров и объёмов оперативной памяти она стала основой для колоночных СУБД
(Vertica, Greenplum, ClickHouse), где основная нагрузка — аналитические
запросы.</p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/31e86521-072e-4d3b-9983-21312d34a61b.webp" alt="Пример файла DSM" /><figcaption>Рисунок 2.1 – Пример файла DSM</figcaption></figure><p><br /></p><h3>3. PAX: гибридная модель данных</h3><p>В 2001 году на конференции VLDB была представлена работа
Анастасии Аламаки, Дэвида ДеВитта, Марка Хилла и Муниратнама Сивакумара
«Weaving Relations for Cache Performance» [2], в которой авторы предложили
комбинированный подход — PAX (Partition Attributes Crosswise).</p><h4>Ключевая идея модели:</h4><p>Страница остаётся целостной (содержит все атрибуты таблицы, как в
NSM), что позволяет избавиться от дорогостоящих соединений файлов данных. Но
внутри страницы данные разбиты по атрибутам: все значения первого атрибута
собираются в непрерывный мини-блок. Следом идёт мини-блок второго атрибута,
затем третьего, и так далее. В начале страницы располагается каталог
(directory), указывающий смещение и размер каждого мини-блока.</p><h4>Как происходит выборка данных:</h4><p>Для запроса, выбирающего два столбца, СУБД обращается к странице и читает только те два мини-блока — остальные не попадают в кэш
процессора, что снижает количество промахов.</p><p>Обновление
всей строки не требует записи в отдельные файлы (как в DSM) — достаточно
перезаписать соответствующие мини-блоки внутри одной страницы.</p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/09a94b94-0c05-469a-84ee-ff350607bddb.webp" alt="Схема страницы PAX" /><figcaption>Рисунок 3.1 – Схема страницы PAX</figcaption></figure><p><br /></p><h3>4. Современные реализации на основе PAX</h3><h4>Apache Parquet</h4><p>Прямой наследник PAX. Файл разбивается на Row Groups (группы строк,
типично 128 МБ – 1 ГБ), каждая из которых действует как крупная «страница» PAX.
Внутри Row Group данные организованы по Column Chunks — это и есть мини-блоки
разных атрибутов, только теперь они могут быть сжаты независимо друг от друга.
Parquet также добавляет индексы и статистику на уровне Column Chunk (min, max,
null count), что позволяет при сканировании пропускать целые блоки без
разжатия.</p><h4>Apache ORC (Optimized Row Columnar)</h4><p>Аналог Parquet, используемый в Hive, Presto и Trino. Внутри
ORC-файла выделяются Stripes (полосы), которые выполняют ту же роль, что и Row
Groups в Parquet. Внутри Stripe данные хранятся по колонкам с добавлением
индексов и словарей. По сути, это тоже PAX, но с более агрессивным сжатием и
встроенной фильтрацией.</p><h3>5. FastLanes — PAX, оптимизированный под SIMD и GPU</h3><p>PAX-архитектура значительно улучшила предыдущие модели
хранения данных, но она не учитывала характеристики процессора. Именно в этом
направлении происходит дальнейшее развитие архитектуры хранения данных. Петер
Бонч, учёный из исследовательского центра CWI (Нидерланды), предложил новый
формат FastLanes, который оптимизирует хранение данных под возможности
современных процессоров.</p><p>Файл FastLanes состоит из двух главных компонентов: Footer
(футер) и Data (данные). Футер содержит метаданные, описание данных и их
местонахождение в файле и может храниться отдельно от блока «Данные».</p><p>На верхнем уровне блок «Данные» повторяет архитектуру PAX:
данные делятся на группы строк и атрибуты. В отличие от существующих типов
файлов, в FastLanes группы строк содержат количество записей, кратное 1024. Это
позволяет избежать материализации данных в основной памяти и выполнять всю
работу на уровне процессора. Следующим важным нововведением является
использование сжатия LWC (Light-Weight-Compression).
Вместо тяжеловесных алгоритмов по типу Zstd, которые не позволяют
распараллелить обработку данных, применяются FSST, DICT, ALP при каскадном
(рекурсивном) применении которых достигается уровень сжатия Snappy за более
короткий промежуток времени [3]. Кроме этого, для каждой колонки данных могут
применяться разные операторы кодирования. Сжатые данные хранятся в сегментах, в
которых кроме самих данных хранятся смещения на отдельные вектора, что
позволяет читать данные на уровне одного вектора вместо целого блока, как в
старых форматах.</p><p>Когда данные читаются из
оперативной памяти в процессор, закодированный вектор, содержащий 1024
значения, разжимается и полностью помещается в кэш процессора. Напротив, старые
форматы файлов не только используют непараллельные алгоритмы сжатия, но и применяют
их к целым Row Group, что влечёт за собой использование основной памяти и
уменьшение скорости обработки [3].</p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/38442764-e882-48bd-abc8-e2389e2fbf91.webp" alt="Пример таблицы[3]" /><figcaption>Рисунок 5.1 – Пример таблицы[3]</figcaption></figure><p><br /></p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/53f16e51-def6-48b1-b0a6-3282b28622d7.webp" alt="Файл FastLane[3]" /><figcaption>Рисунок 5.2 – Файл FastLane[3]</figcaption></figure><p><br /></p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/b9a51ae2-6319-490c-bd67-4028b1b35e49.webp" alt="Футер файла FastLane[3]" /><figcaption>Рисунок 5.3 – Футер файла FastLane[3]</figcaption></figure><p><br /></p><figure><img src="https://media.tproger.ru/user-uploads/140096/2026-09-10/e52e3ea5-17fa-44d2-bc85-2f418e39150e.webp" alt="Операторы кодирования FastLane[3]" /><figcaption>Рисунок 5.4 – Операторы кодирования FastLane[3]</figcaption></figure><p><br /></p><h4>Использованные источники:</h4><ol><li>Copeland G.P., Khoshafian
     S.N. A Decomposition Storage Model. Proceedings of ACM
     SIGMOD, 1985.</li><li>Ailamaki A., DeWitt D., Hill
     M., Sivakumar M. Weaving Relations for Cache Performance. Proceedings
     of VLDB, 2001.</li><li>Boncz P., Afroozech A., et
     al. The FastLanes File Format: specification.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Баги, которые не ловятся тестами: три расследования и общая методика</title>
      <link>https://tproger.ru/articles/bagi-kotorye-ne-lovyatsya-testami-tri-rassledovaniya-i-obshhaya-meto</link>
      <comments>https://tproger.ru/articles/bagi-kotorye-ne-lovyatsya-testami-tri-rassledovaniya-i-obshhaya-meto?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bagi-kotorye-ne-lovyatsya-testami-tri-rassledovaniya-i-obshhaya-meto</guid>
      <description><![CDATA[<p>Три расследования редких дефектов: гонка в SQLite, потеря сообщений в TCP и гонки в биллинге. Разбираем общую методику поиска невоспроизводимых багов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bagi-kotorye-ne-lovyatsya-testami-tri-rassledovaniya-i-obshhaya-meto">Баги, которые не ловятся тестами: три расследования и общая методика</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Сетевые протоколы]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Баги и ошибки]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 09 Sep 2026 09:00:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Есть класс дефектов, которые проходят весь конвейер проверок и всплывают только в продакшене. Объединяет их не сложность кода. В двух случаях виновата форма проверки, написанной вежливой там, где реальность к сервису вежлива не бывает; в третьем проверка не поймала бы дефект вообще.</p><p>Разбираем три расследования — пропавшую запись в базе, три процента сообщений, терявшихся только на чистой машине, и гонки в биллинге, которые видит одна поддержка. У всех трёх разные предметные области и одна общая методика поиска невоспроизводимых багов.</p><p>Отсутствие закономерности само по себе является находкой: если сбой не привязан ни к шарду, ни к клиенту, ни к времени суток, это указывает на гонку, а не на данные.</p><p>Когда воспроизвести дефект синтетически нельзя, остаётся пассивная телеметрия в продакшене и последовательное отсечение гипотез данными.</p><p>Счётчики на каждом слое находят виновника быстрее логов: разрыв между двумя соседними числами прямо называет слой, в котором теряются сообщения.</p><p>Вежливый тест, который шлёт запрос и ждёт ответа, скрывает целый класс ошибок пакетирования. Пачечный тест их обнажает.</p><p>Отсутствие ошибок не доказывает, что дефект исправлен. Доказательством служит положительный сигнал: сработавшее предупреждение о том, что опасные условия возникли, а сбоя при этом не случилось.</p><h2>Случай первый: запись, которой не могло не быть</h2><p>Управляющий слой Tailscale разбит на шарды, у каждого своя база SQLite, и обращается к ней ровно один процесс. Такой однописательный режим — именно то, для чего SQLite и предназначен, что делает дальнейшее особенно неприятным.</p><p>Резервное копирование снимало полную копию базы каждые несколько минут и складывало файл в объектное хранилище. Работало это без единого происшествия с начала 2023 года, пока конвейер, читавший резервные копии, не сообщил об ошибке. Проверка встроенной командой контроля целостности подтвердила худшее: база повреждена.</p><p>Первый случай сочли единичным. Базу починили, причину не нашли. Потом это повторилось. И ещё раз. Всего до устранения первопричины набралось <a href="https://tailscale.com/blog/sqlite-wal-reset-bug">19 отдельных инцидентов за полгода</a>, и каждый означал простой: процесс на шарде останавливался, пока базу чинили или восстанавливали. На ранних инцидентах простой превышал час, и всё это время у клиентов на шарде не работали консоль администратора и API.</p><h3>Почему он не поддавался обычным приёмам</h3><p>Дефект сопротивлялся всем стандартным подходам сразу:</p><ul><li>Не на что было списать: низкоуровневый код работы с базой никто не трогал годами, а внимательное чтение ничего не дало.</li><li>Не нашлось общих факторов. Повреждения не привязывались ни к конкретному шарду, ни к клиенту, ни к функции продукта, ни ко времени суток, ни к уровню нагрузки.</li><li>Он не воспроизводился синтетически. Надёжного триггера не было, поэтому оставалось только развернуть пассивную телеметрию в боевой среде и ждать следующего случая.</li></ul><p>Расписания у инцидентов тоже не было: они случались то через часы, то через недели. Между октябрём и декабрём наступила шестинедельная тишина, после которой повреждения вернулись.</p><p>Команда сделала два шага, которые и составляют суть этой истории. Купила контракт поддержки у разработчиков SQLite, получив прямой доступ к людям, написавшим саму базу. И методично составила список гипотез, отсекая их данными, а не рассуждениями. В списке были сломанные блокировки при закрытии файла, неверная работа с памятью, принадлежащей базе, и обращение из нескольких потоков при отключённой потокобезопасности. Каждый инцидент приносил данные, каждая гипотеза отпадала по очереди.</p><h3>Улика: транзакция, которой не стало</h3><p>Пока первопричину искали, платформу надо было держать живой. Команда автоматизировала жёсткую остановку при обнаружении повреждения, поставила монитор, непрерывно проверявший целостность резервных копий, и переписала инструкции по восстановлению. Время восстановления упало ниже часа.</p><p>А затем построила конвейер журналирования транзакций. Идея простая: писать каждый изменяющий базу запрос в отдельный журнал. Поскольку писатель один, а транзакции сериализуемы, история изменений линейна и детерминирована, и её можно проиграть поверх последней заведомо целой копии, обойдя повреждённые страницы. Приём годится там, где порядок фиксаций известен: при единственном писателе он получается сам собой. Наивный журнал запросов на многописательной базе этого не даёт, потому что конкурентные транзакции переплетаются и без явного порядка фиксаций проигрывание не восстановит то же состояние.</p><p>Конвейер сработал и выдал улику. В двух инцидентах журналы не проигрывались чисто: данные, записанные и зафиксированные одной транзакцией, оказывались необъяснимо невидимы для последующих. Запись исчезла бесследно и без единой ошибки.</p><p>Этого не может быть. В сериализуемой однописательной базе зафиксированная запись не может пропасть. Значит, виноват слой с достаточной конкурентностью, чтобы такое спрятать, а такой слой ровно один — контрольные точки.</p><h3>Шестнадцатилетняя гонка</h3><p>SQLite с журналом предзаписи работает с двумя файлами. База — это набор страниц; при изменении данных новые страницы пишутся не в основной файл, а сначала в журнал. Позже контрольная точка переносит их в базу. Обычно момент переноса SQLite выбирает сам, но Tailscale управляла контрольными точками вручную, чтобы снимать быстрые согласованные копии. Именно этот нестандартный, хотя и полностью документированный выбор и вывел их на дефект.</p><p>Метрики во время инцидентов показывали, что SQLite сообщает о переносе большего числа страниц, чем в журнале вообще было. Разработчики базы как раз готовили инструмент для этого слоя: обёртку над виртуальной файловой системой, которая пишет дополнительные трассировочные журналы. Обёртку развернули в продакшене, и ждать пришлось недолго.</p><p>Журналы показали редкую гонку данных (race condition) между контрольной точкой и пишущей транзакцией. Если запись происходит в определённый момент работы контрольной точки, та сбивается: считает часть страниц перенесёнными в основной файл, хотя перенос не состоялся. Данные теряются навсегда, а страницы, которые на них ссылаются, например индексные, записываются как ни в чём не бывало. Файл становится структурно повреждённым, что проверка целостности всё это время и фиксировала.</p><p>Дефекту дали имя по сбросу журнала предзаписи и оценили его возраст минимум в шестнадцать лет. Он прожил так долго именно из-за редкости, это классический heisenbug: чтобы поймать его в тестовой среде, разработчикам пришлось дописать код, вызывающий гонку намеренно.</p><h3>Ложная тревога, чуть не сорвавшая исправление</h3><p>Исправление вышло в версии 3.52.0, и Tailscale раскатывала его осторожно, начав с нескольких канареечных шардов. После общей раскатки монитор резервных копий немедленно покраснел, сообщив о повреждении в тринадцати базах.</p><p>Настоящего повреждения не было. В ту же версию попала оптимизация, слегка изменившая округление при переводе текста в число с плавающей точкой, а Tailscale хранила метки времени высокой точности текстом и превращала их в числа в вычисляемом столбце. Индекс по вычисляемому выражению перестал соответствовать новому результату вычисления, и проверка целостности честно назвала это повреждением. Канареечные шарды дефект пропустили просто потому, что на них не оказалось меток времени, попадающих под изменённое округление.</p><p>Разбирали это с трёх сторон сразу. Разработчики SQLite отозвали версию целиком и выпустили 3.51.3, содержавшую только исправление гонки. Tailscale перешла на хранение меток времени целыми секундами, поскольку перевод текста в целое число однозначен. А в 3.53.0 появилось автоматическое восстановление таких индексов, чтобы проблема не возникала впредь.</p><p><b>Главный урок этого эпизода:</b><br />Канареечная выкатка проверяет только те формы данных, которые в канарейке есть. Если на канареечных узлах нет тех же значений, что в проде, канарейка не подтверждает ничего. Это касается и обновлений самой базы, драйверов и инструментов миграции, а не только кода приложения.</p><h3>Как доказали, что дефект действительно исправлен</h3><p>Самая дисциплинированная часть расследования пришлась на финал. Отсутствие повреждений доказательством не считалось: команда уже пережила шесть недель обманчивой тишины. Поэтому драйвер базы пропатчили так, чтобы он выдавал предупреждение всякий раз, когда пишущая транзакция и сброс журнала пересекаются во времени.</p><p>Логика прямая: если предупреждение сработает, а база останется целой, значит, исправление сработало ровно там, где раньше был бы инцидент. Ждали два месяца. Предупреждение сработало, подтвердив, что условия для гонки в их среде действительно возникают. С того момента прошло ещё четыре месяца без единого происшествия с базами.</p><h2>Случай второй: три процента, терявшиеся только на чистой машине</h2><p>Второй сюжет проще по масштабу и полезнее в быту. Сервис представлял собой небольшой пересыльщик TCP: принять соединение, читать текстовые строки, передавать дальше. На тестовом стенде входило 97 004 строки, а выходило 94 183. Ни ошибок, ни исключений, просто пропавшие сообщения.</p><p>На ноутбуке автора всё воспроизводилось идеально: сто тысяч строк на входе, сто тысяч на выходе. Это расхождение и было первой уликой — тест проверял не то, что делает продакшен.</p><h3>Сменить машину раньше, чем код</h3><p>Первый час, по его собственному признанию, ушёл впустую: менялись и бинарник, и машина, и профиль нагрузки разом, а выводов это не давало. Дальше автор поменял ровно одну переменную: взял чистый сервер с тем же бинарником и тем же скриптом нагрузки. Потери появились снова, 97 128 строк из ста тысяч. Среда меняла вероятность проявления, но не сам факт дефекта, а чистая машина без истории и без накопленных настроек работает как микроскоп для ошибок синхронизации.</p><h3>Считать, а не логировать</h3><p>Дальше нужен был не ещё один прогон, а способ понять, на каком слое теряются сообщения. Логи рассказывают истории, счётчики складываются. Автор расставил счётчик на каждом слое: клиент считает отправленные строки, сервер считает разобранные переводы строки, сервер считает отправленные ответы, клиент считает полученные ответы. Один прогон, четыре числа, и разрыв между соседними прямо называет виновный слой.</p><p>Сервер разобрал всё до последней строки, а ответов отправил меньше, чем разобрал. Это отпечаток пальца конкретного дефекта, и дальше оставалось найти его в коде ответа.</p><h3>read() ничего не обещает про сообщения</h3><p>Виновником оказалась одна строка: сервер отправлял по одному ответу на каждое чтение, а не на каждую разобранную строку.</p><p>TCP — это поток байтов, а не очередь сообщений. Вызов чтения не имеет понятия о том, что такое одно сообщение в вашем протоколе. Ядро вправе слить десяток сообщений в один сегмент, и одно чтение заберёт все десять, а ответ уйдёт один.</p><p>Вежливый локальный тест отправлял сообщение, дожидался подтверждения и отправлял следующее. Одно сообщение на сегмент — дефект спал. Нагрузка на стенде шла пачками, тысячами сообщений в секунду, ядро их группировало, одно чтение проглатывало сотню строк.</p><p>Исправление переносит ответ внутрь цикла по строкам и накапливает остаток в буфере, чтобы пережить строку, разорванную между двумя чтениями. Это вторая половина того же семейства ошибок, и без неё починка неполная:</p><p><b>Вывод автора расследования:</b><br />Локальный тест это не нагрузочный тест, ноутбук это не сервер, а одно чтение из сокета это не одно сообщение.</p><h2>Третий сюжет: гонки, которые видит только поддержка</h2><p>Третий сюжет про биллинг кредитов на бессерверном Postgres, где транзакции по условиям задачи были недоступны. Автор наткнулся на четыре гонки, разберём две самые показательные. Все они, по его собственной формулировке, относятся к тому сорту дефектов, которые не показываются в тестах и показываются в почте поддержки.</p><h3>Классический двойной расход</h3><p>Наивная версия, которую пишут первой:</p><p>Два одновременных запроса читают баланс, равный пяти, оба проходят проверку, оба записывают четыре. Пользователь получил две операции по цене одной. Дефект существует ровно между чтением и записью, и последовательный тест в это окно не попадает никогда.</p><h3>Инвариант переезжает в условие запроса</h3><p>Общее решение — сделать проверку и запись одним оператором, перенеся условие корректности в WHERE:</p><p>Одиночный UPDATE в Postgres атомарен. Не хватило баланса — условие не совпало, вернулось ноль строк, и вы точно знаете, что списание не произошло. Транзакция для этого не нужна вовсе. Приём обобщается: перенесите инвариант в условие выборки, и запись просто не случится, когда инвариант нарушен.</p><h3>Вебхук, доставленный дважды</h3><p>Платёжные провайдеры повторяют доставку уведомлений при таймаутах, пятисотках и сетевых сбоях, а иногда дублируют событие и в штатном режиме. Если обработчик начисляет кредиты, доставка «хотя бы один раз» означает начисление хотя бы один раз.</p><p>Обычное решение с таблицей обработанных событий требует транзакции, а её нет: падение между двумя операторами либо начислит дважды при повторе, либо потеряет начисление совсем. Рабочий вариант в один оператор использует изменяющее данные обобщённое табличное выражение, где вставка в журнал операций работает воротами: не прошла вставка, значит, не выполнилось и обновление баланса.</p><p>Деталь, которую стоит забрать отдельно: уникальный индекс под эту схему должен быть частичным. Начисления от администратора приходят с произвольным идентификатором из скрипта, и глобальный уникальный индекс рисковал бы столкнуть их друг с другом или с идентификатором операции другого типа. Приветственные начисления идут вообще без идентификатора, и с ними коллизии не будет в любом случае: Postgres не считает два пустых значения равными. Ограничение индекса двумя типами операций от платёжного провайдера держит проверку уникальности ровно там, где она нужна.</p><h2>Что из этого складывается</h2><p>Первые два расследования дают общую методику поиска, и она изложена ниже. Третий случай стоит особняком: это не детектив, а набор приёмов, которые убирают целый класс гонок ещё на этапе проектирования, до того как искать станет нечего.</p><h2>Что забрать с собой</h2><p>Общего у трёх расследований больше, чем различий. Во всех трёх случаях проверка была написана в форме, которая не воспроизводит реальность: последовательный запрос вместо пачки, одиночный вызов вместо конкуренции, одна машина вместо двух. И во всех трёх дефект спокойно проходил через тесты, а в случае с SQLite прожил так шестнадцать лет.</p><p>Соседний сюжет про то, как тесты перестают отражать реальность, разбирали в материале о том, <a href="https://tproger.ru/articles/pochemu-statichnye-moki-ubivayut-testirovanie--i-chto-my-s-etim-sdel">почему статичные моки убивают тестирование</a>.</p><p>Полезнее всего здесь дешёвые привычки. Счётчик на границе каждого слоя ставится за час. Пачечный клиент пишется за вечер. Датчик, доказывающий исправление положительным сигналом, добавляется одной строкой в драйвер. Всё это стоит несопоставимо меньше, чем полгода расследования.</p><p>Три постмортема, на которых строится разбор: <a href="https://tailscale.com/blog/sqlite-wal-reset-bug">разбор Tailscale о поиске шестнадцатилетнего бага в SQLite</a>, <a href="https://dev.to/datacpp_3670/the-3-drop-that-only-showed-up-on-a-clean-server-a-debugging-retrospective-1g3c">ретроспектива потери трёх процентов сообщений</a> и <a href="https://dev.to/xiaojun_mao_c154743594bc9/credit-billing-without-transactions-4-race-conditions-i-hit-on-serverless-postgres-4730">четыре гонки в биллинге на бессерверном Postgres</a>.</p><p>Возьмите самый подозрительный сервис и запустите по нему пачечный тест вместо последовательного. Это самый дешёвый способ узнать, какой из ваших дефектов сейчас спит.</p>]]></content:encoded>
    </item>
    <item>
      <title>NULL в SQL: почему запрос отрабатывает и молча отдаёт неверное число</title>
      <link>https://tproger.ru/articles/null-v-sql-pochemu-zapros-otrabatyvaet-i-molcha-otdayot-nevernoe-ch</link>
      <comments>https://tproger.ru/articles/null-v-sql-pochemu-zapros-otrabatyvaet-i-molcha-otdayot-nevernoe-ch?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/null-v-sql-pochemu-zapros-otrabatyvaet-i-molcha-otdayot-nevernoe-ch</guid>
      <description><![CDATA[<p>Почему WHERE x = NULL не находит строки, как одно пустое значение обнуляет весь NOT IN и на что делится среднее. Разбираем на примерах Postgres.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/null-v-sql-pochemu-zapros-otrabatyvaet-i-molcha-otdayot-nevernoe-ch">NULL в SQL: почему запрос отрабатывает и молча отдаёт неверное число</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <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>Tue, 08 Sep 2026 06:08:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>В SQL деление на ноль Postgres остановит с ошибкой. Приведение строки «abc» к числу тоже. А деление на NULL пройдёт, и запрос вернёт результат. Просто не тот, которого вы ждали.</p><p>Это главная особенность работы с отсутствующими значениями: ошибок нет, есть тихо неправильные числа. Разбираем, откуда они берутся в фильтрах, в арифметике, в агрегатах и в соединениях, и какими операторами это лечится.</p><p>Отправная точка одна: NULL — не значение, а отметка «неизвестно». Неизвестность распространяется дальше по всему выражению: через сравнения, арифметику, склейку строк, агрегаты, оконные функции и условия отбора. Результат при этом строго определён правилами языка, он просто может не совпасть с тем, что вы имели в виду.</p><p>В SQL три логических исхода, а не два: истина, ложь и неизвестность. Условие отбора оставляет только строки с истиной, поэтому неизвестность отбрасывается наравне с ложью.</p><p>Сравнение = NULL не почти верно, а отвечает на другой вопрос. Для проверки на отсутствие есть отдельные операторы, которые сравнением не являются.</p><p>Одно значение NULL в списке для NOT IN обнуляет всю выдачу целиком, а не сужает её.</p><p>Соединение по равенству отбрасывает строки, где ключ отсутствует с обеих сторон, и то же самое делает проверка уникальности.</p><p>Запрос, который отработал, прошёл только проверку грамматики. Число становится верным, когда с вопросом совпали строки, фильтры и знаменатель.</p><h2>Три логических исхода вместо двух</h2><p>Начнём с простого случая. В таблице клиентов у одного из них не заполнен телефон, и это прямо видно глазами. Запрос находит ноль строк:</p><p>Условие phone = NULL спрашивает: «равно ли это неизвестное значение тому неизвестному значению?» Ответить на такое нельзя, поэтому <a href="https://dev.to/systemcraftdev/why-where-x-null-never-works-in-sql-and-what-to-use-instead-3p4h">для каждой строки возвращается неизвестность</a>, включая ту самую строку с пустым телефоном. А отбор оставляет только строки, где условие истинно. Неизвестность не проходит ровно так же, как не прошла бы ложь.</p><p>Правило действует единообразно: NULL = NULL тоже не истина, а неизвестность. Отсюда и главный вывод — оператор равенства нельзя «подправить», чтобы он здесь заработал. Он не почти прав, он отвечает на другой вопрос.</p><p>В Postgres это проверяется одной строкой. Что вернёт такое выражение?</p><p>Оба внутренних сравнения неизвестны, поэтому внешнее сравнивает неизвестность с неизвестностью и тоже даёт неизвестность. Операторы сравнения возвращают NULL, если хотя бы одна сторона неизвестна. Именно поэтому в языке есть отдельный оператор проверки на отсутствие: узнать, равны ли две неизвестности, нельзя, а узнать, является ли значение неизвестным, можно.</p><h3>Как ведут себя И, ИЛИ и НЕ</h3><p>Логические связки тоже работают в трёх значениях, и запомнить стоит два исключения:</p><p>То есть ИЛИ всё ещё истинно, если истинна вторая сторона, а И всё ещё ложно, если ложна вторая сторона. Всё остальное с участием неизвестности схлопывается в неизвестность.</p><p>Последствия неочевидны. Вот запрос, который отбрасывает строку, которую вы почти наверняка хотели оставить:</p><p>В обычной двузначной логике «активно или не активно» — тавтология, утверждение, истинное при любом значении. В SQL это не так.</p><h3>Операторы, которые никогда не возвращают неизвестность</h3><p>Лечится это выходом из трёхзначной логики. Сначала решите, что NULL означает в вашей предметной области, а потом скажите это явно:</p><p>Проверки IS TRUE, IS NOT TRUE, IS FALSE, IS NOT FALSE и IS UNKNOWN никогда не возвращают неизвестность, поэтому строку не потеряют.</p><p>Аналог того же для равенства — IS NOT DISTINCT FROM. Обычное равенство спрашивает, известно ли, что значения совпадают. Этот оператор спрашивает, одно ли это значение, обращаясь с отсутствием как с полноценным состоянием. Две неизвестности неразличимы, поэтому предикат истинен.</p><p><b>Где это пригодится:</b><br />Соединение по условию равенства отбрасывает строки, где ключ отсутствует с обеих сторон. Если два отсутствующих ключа должны считаться совпадением, замените равенство на IS NOT DISTINCT FROM. То же касается проверок уникальности и условий отбора, где «отсутствует» должно означать «отсутствует», а не «неизвестно».</p><h2>Ловушка NOT IN, из-за которой пропадает вся выдача</h2><p>Это самый дорогой из всех эффектов, потому что он не сужает результат, а стирает его целиком. Операторы IN и NOT IN разворачиваются в цепочки сравнений, а NOT IN — в цепочку через И:</p><p>Разберём оба исхода. Если значение совпало с одним из перечисленных, срабатывает то самое правило «И спасает ложь справа», и выражение честно ложно. Если не совпало ни с одним, множитель со сравнением с пустым значением делает всё выражение неизвестным.</p><p>Для условия отбора разницы между этими исходами нет: оно оставляет только истину, а ложь и неизвестность отбрасывает одинаково. Поэтому итог один — если в списке или в подзапросе есть хотя бы одно отсутствующее значение, NOT IN не вернёт ни одной строки. Никакой ошибки при этом не будет.</p><p>Обычный IN ведёт себя мягче, поскольку разворачивается в цепочку через ИЛИ: совпадение остаётся истиной независимо от того, что ещё есть в списке. В простом условии отбора пустое значение в списке вообще ничего не меняет: несовпавшая строка отсеется что при неизвестности, что при лжи. Разница вылезает там, где результат сравнения используется дальше: под отрицанием, в выражении CASE или в ограничении целостности.</p><p>Надёжная замена — NOT EXISTS, который работает через равенство внутри условия отбора и потому никогда не трактует сравнение с отсутствующим значением как совпадение. Тот же смысл выражает антисоединение, которое вдобавок часто даёт лучший план:</p><p>Вычистить отсутствующие значения из подзапроса тоже можно, но это помогает, только если вы уверены, что их следует игнорировать. Вариант с NOT EXISTS делает это намерение явным, а не подразумеваемым.</p><h2>Арифметика: одно значение NULL обнуляет строку</h2><p>Любая арифметическая операция с участием отсутствующего значения даёт отсутствующее значение. Сложение, умножение, деление, модуль, возведение в степень — результат один.</p><p>В отчётах это выглядит как пустые ячейки, а в обновлениях данных как стёртые колонки. Классический пример, который каждый когда-нибудь писал:</p><p>Подставлять значение по умолчанию нужно в той точке, где вам известно правило предметной области, а не механически везде. В разборе Кристофера Уинслетта из Crunchy Data приводится удачная иллюстрация: <a href="https://www.crunchydata.com/blog/postgres-calculations-and-the-ambiguity-of-null">отсутствующее количество почти всегда означает ноль, отсутствующая ставка налога тоже, а вот отсутствующая цена нулём не является</a> и должна оставаться неизвестной, пока её кто-нибудь не заполнит.</p><h2>Агрегаты и оконные функции считают не то, что кажется</h2><p>Здесь отсутствующие значения ведут себя иначе, чем везде: агрегаты их пропускают. Функция COUNT(*) считает строки, а COUNT(колонка) — только непустые значения; SUM, AVG, MIN и MAX пропускают пустые входы.</p><p>У товара с двумя незаполненными оценками среднее и сумма пусты, а число строк равно двум. Отсюда практическое правило, которое экономит часы разбирательств с аналитикой: среднее — это сумма, делённая на количество непустых значений, а не на количество строк. Смешивать SUM(x) / COUNT(*) и ожидать совпадения со средним нельзя.</p><p>Оговорка про типы тоже важна: если сумма и счётчик целочисленные, деление усечёт дробную часть. Шесть, делённое на два, случайно даст ровно три, а оценки 5, 1 и 2 дадут при целочисленном делении двойку вместо 2,67.</p><h3>Где ломаются оконные функции</h3><p>Суммирование и усреднение в окне пропускают отсутствующие значения так же, как при группировке, а ROW_NUMBER считает строку в любом случае. Расхождение начинается у функций, которые смотрят в конкретную позицию окна: LAG, LEAD, FIRST_VALUE, LAST_VALUE и NTH_VALUE.</p><p>Такая функция возвращает то, что лежит в запрошенной позиции. Если там пусто, результат пуст. Ближайшее реальное значение она не ищет, и на рядах измерений с пропущенным отсчётом это даёт разрывы там, где ожидалась непрерывность.</p><h2>Проверка чужого запроса, включая сгенерированный</h2><p>Всё описанное складывается в одну проблему: запрос, который отработал, прошёл только проверку грамматики. База ловит опечатку в имени таблицы. Она не ловит суммирование не той колонки, соединение, задваивающее строки, и фильтр, поставленный не на том этапе. Каждая из этих ошибок — синтаксически корректный SQL.</p><p>Со сгенерированными запросами есть <a href="https://dev.to/michaelnocito/how-to-review-ai-generated-sql-before-you-trust-the-number-19ek">отдельная сложность</a>: они беглые. Псевдонимы аккуратные, форматирование чистое, форма выглядит как работа внимательного человека. Беглость читается как правильность, хотя это разные вещи.</p><h3>Проверка первая: посчитайте строки до того, как поверите сумме</h3><p>Задача звучала как «чистая выручка по завершённым заказам». Полученный запрос:</p><p>Он отрабатывает и возвращает 1830. Правильный ответ 1330, и это легко проверить руками: валовая сумма одиннадцати завершённых заказов равна 1605, возвраты составляют 275.</p><p>Виновато соединение. Два заказа возвращались частями, по две записи на каждый, поэтому одиннадцать строк превращаются в тринадцать, а сумма по заказам считает эти два заказа дважды: 2105 вместо 1605. Лишние 500 — это ровно стоимость задвоенных заказов. Явление называется размножением строк: соединение множит строки всякий раз, когда ключ на другой стороне встречается больше одного раза.</p><p>Проверка стоит двух запросов:</p><p>Одно это сравнение всё решает. Второе число выросло, значит, соединение размножило строки, и любая сумма или среднее по колонкам левой таблицы под подозрением. Число совпало — соединение безопасно, идём дальше.</p><h3>Проверка вторая: ищите отсутствующие значения в каждом фильтре</h3><p>Следующая просьба звучала как «та же выручка, но без служебных аккаунтов», и запрос получился такой:</p><p>Он возвращает пустоту, полученную из нуля строк. Не меньшее число, а вообще ничего. Механизм вы уже знаете: в справочнике служебных аккаунтов есть одна строка с незаполненным идентификатором, а справочники в реальной жизни такими и бывают. Одна такая строка бесшумно опустошает результат целиком.</p><h2>Что забрать с собой</h2><p>Правила про отсутствующие значения не сложны, они просто действуют не там, где их ждут. Из фильтра строка пропадает молча, арифметика превращает результат в пустоту, соединение по равенству теряет пары без ключа, а среднее делит на другой знаменатель. Ошибки при этом нигде не возникает, и потому такие дефекты живут в отчётах годами.</p><p>Самый надёжный способ не разбираться со всем этим каждый раз — не хранить отсутствующие значения там, где они не нужны. Если колонка обязана иметь значение, скажите это в схеме. Ограничение NOT NULL выглядит формальностью ровно до первого расследования, почему выручка в отчёте оказалась на пятьсот единиц больше настоящей.</p><p>Материалы разбора: <a href="https://dev.to/systemcraftdev/why-where-x-null-never-works-in-sql-and-what-to-use-instead-3p4h">почему сравнение с NULL никогда не срабатывает</a>, <a href="https://www.crunchydata.com/blog/postgres-calculations-and-the-ambiguity-of-null">поведение NULL в вычислениях Postgres</a> и <a href="https://dev.to/michaelnocito/how-to-review-ai-generated-sql-before-you-trust-the-number-19ek">проверка сгенерированного SQL до того, как поверить числу</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>Postgres Pro закрыл 28 уязвимостей PostgreSQL внеочередными релизами</title>
      <link>https://tproger.ru/news/postgres-pro-zakryl-28-uyazvimostej-postgresql-vneocherednymi-reli</link>
      <comments>https://tproger.ru/news/postgres-pro-zakryl-28-uyazvimostej-postgresql-vneocherednymi-reli?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/postgres-pro-zakryl-28-uyazvimostej-postgresql-vneocherednymi-reli</guid>
      <description><![CDATA[<p>Postgres Professional выпустила «нулевые» релизы Postgres Pro Enterprise с 28 исправлениями безопасности PostgreSQL. Что закрыто и что переиндексировать после апдейта.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/postgres-pro-zakryl-28-uyazvimostej-postgresql-vneocherednymi-reli">Postgres Pro закрыл 28 уязвимостей PostgreSQL внеочередными релизами</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 11:40:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Postgres Professional 2 сентября <a href="https://habr.com/ru/companies/postgrespro/news/1076556/">сообщила</a> о выходе «нулевых» релизов Postgres Pro Enterprise: внеочередных обновлений безопасности, которые переносят в корпоративную редакцию исправления 28 уязвимостей и более 110 ошибок из августовского обновления PostgreSQL. По словам компании, она первая и пока единственная среди коммерческих форков на российском рынке, кто довёл эти исправления до редакции уровня enterprise.</p><p>Если ваш прод стоит на Postgres Pro Enterprise, это тот случай, когда обновляться нужно не по плану, а сейчас: среди закрытых проблем четырнадцать с оценкой CVSS 8,8, и для одиннадцати из них upstream прямо пишет о выполнении произвольного кода, причём часть срабатывает через обычные SQL-функции вроде to_char() или через регулярные выражения. Если вы на ванильном PostgreSQL, те же исправления вышли ещё 13 августа в версиях 18.6, 17.11, 16.15, 15.19 и 14.24, и проверить стоит, что вы их уже накатили.</p><ul><li>«Нулевые» релизы Postgres Pro Enterprise содержат только исправления безопасности и ошибок, без новых функций; новые возможности придут в плановых минорных версиях вида 17.11.1.</li><li>Закрыты 28 CVE и более 110 багов из обновления PostgreSQL от 13 августа 2026 года (18.6, 17.11, 16.15, 15.19, 14.24).</li><li>Самые опасные: 14 CVE с оценкой 8,8, из них 11 на выполнение произвольного кода, включая переполнения буфера в regexp, to_char(), PL/Perl, pg_stat_statements и pg_dump.</li><li>Обновление накопительное, pg_upgrade не нужен: остановить сервер и заменить бинарники; после этого проверить GIN-, btree_gist- и ltree-индексы.</li><li>Компания связывает скорость выпуска с приказом ФСТЭК №117 для госорганов и ГИС: критические уязвимости устранять за 24 часа, высокие за 7 дней.</li></ul><h2>Что такое «нулевой» релиз</h2><p>Обычный цикл коммерческого форка выглядит так: выходит минорный релиз upstream PostgreSQL, вендор переносит исправления в свою ветку, тестирует вместе с собственными доработками и выпускает очередную минорную версию, где безопасность идёт вперемешку с новыми функциями. Для заказчика это означает выбор: либо ждать плановый релиз с открытыми дырами, либо ставить его сразу и получать вместе с патчами новую функциональность, которую никто не тестировал в его контуре.</p><p>«Нулевой» релиз разрывает эту связку. Он собирается на базе предыдущего минорного релиза Postgres Pro Enterprise, в него переносятся только исправления из актуальной версии PostgreSQL, и никаких новых возможностей там нет. Доработки, отложенные ради скорости, выйдут позже в привычных минорных версиях по обычному циклу. Технический директор Postgres Professional Юлия Рыденкова объясняет это так: «Заказчик может установить необходимые исправления сразу, не дожидаясь следующего планового обновления и не внедряя одновременно с этим новые возможности продуктов».</p><p>Подход не новый для индустрии: примерно так устроены security-only ветки у дистрибутивов Linux. Для российского рынка СУБД, где заказчики часто сидят на сертифицированных редакциях с долгим циклом обновления, разделение потоков «безопасность» и «функции» снимает главный аргумент против быстрого патчинга.</p><h2>Какие уязвимости закрыты</h2><p>Все 28 CVE перечислены в <a href="https://www.postgresql.org/about/news/postgresql-186-1711-1615-1519-1424-and-19-beta-3-released-3365/">анонсе PostgreSQL</a> от 13 августа. Четырнадцать из них имеют максимальную в этом наборе оценку CVSS 8,8; Postgres Professional выделяет одиннадцать, где по описанию upstream возможно выполнение произвольного кода:</p><ul><li>CVE-2026-14664: переполнение буфера в обработке регулярных выражений.</li><li>CVE-2026-14669: переполнение буфера в функции to_char().</li><li>CVE-2026-14670: переполнение буфера в связанных (tied) объектах PL/Perl.</li><li>CVE-2026-14671: путаница типов в кэше планов contrib/refint.</li><li>CVE-2026-14676: переполнение буфера в pg_stat_statements.</li><li>CVE-2026-14680: путаница типов через аргументы типа internal.</li><li>CVE-2026-15741: SQL-инъекция через аргумент функции EXTRACT() при обратном разборе (deparse) выражений.</li><li>CVE-2026-16238 и CVE-2026-16239: путаница типов в pg_restore_attribute_stats() и в связке CLOSE + DECLARE курсоров.</li><li>CVE-2026-18408: команда psql \unrestrict позволяла суперпользователю сервера-источника pg_dump выполнить произвольный код в клиенте psql при восстановлении дампа.</li><li>CVE-2026-19385: переполнение буфера в pg_dump.</li></ul><p>Ещё две проблемы стоят отдельно. CVE-2026-6471 (CVSS 7,2): пользователь с правами на репликацию мог заставить логическое декодирование подгрузить произвольную библиотеку через dlopen. После исправления список разрешённых плагинов вывода ограничен новым параметром output_plugin_libraries, и если у вас работает логическая репликация с нестандартными плагинами, их нужно туда прописать. CVE-2026-6464 (CVSS 8,1) касается psql: при раннем сбое команды COPY FROM STDIN или \copy FROM STDIN строки данных могли быть разобраны как команды psql. Для эксплуатации нужен контроль и над серверной ошибкой, и над данными COPY; вариант COPY FROM с именем файла не затронут.</p><p>Ещё три уязвимости с оценкой 8,8 в этот список компания не включила: недоразмерные выделения памяти в tsvector и tsquery (CVE-2026-14662), в 32-битных pltcl и plperl (CVE-2026-14677) и запись по произвольным адресам в fuzzystrmatch (CVE-2026-15742). Остальные пункты списка, от раскрытия существования пользователя через нестандартное число итераций SCRAM (CVE-2026-14672, CVSS 5,3) до чтения за границей буфера в функции ascii() (CVE-2026-18024, CVSS 4,3), имеют оценки от 3,8 до 8,2. Компания отмечает, что несколько уязвимостей, в частности CVE-2026-16239 и CVE-2026-14680, найдены исследователями при участии ИИ-инструментов Claude и Codex Security.</p><h2>Что делать после обновления</h2><p>Обновления накопительные: выгружать и загружать базы или запускать pg_upgrade не нужно, достаточно штатно остановить сервер и заменить бинарные файлы. Но после этого Postgres Professional, как и upstream в своём анонсе, просит выполнить несколько проверок, потому что часть исправлений затрагивает индексы:</p><ol><li>Проверить таблицы с GIN-индексами и выполнить ANALYZE, если значение reltuples выглядит некорректным (исправлена ошибка параллельной сборки GIN).</li><li>Переиндексировать btree_gist-индексы на столбцах типов float4, float8, bit и bit varying, если они есть.</li><li>Переиндексировать B-tree-индексы по столбцам ltree, если значения могут содержать больше 14 653 меток.</li><li>Проверить конфигурацию логического декодирования и добавить доверенные плагины в output_plugin_libraries.</li></ol><p>Пользователям ванильного PostgreSQL стоит помнить ещё об одном: ветка 14 перестанет получать исправления 12 ноября 2026 года, а версии 18.4 и 18.5 не выходили вовсе, ветка 18 перескочила с 18.3 сразу на 18.6 из-за регрессии в 18.5.</p><h2>Почему компания торопится</h2><p>Postgres Professional прямо связывает формат «нулевых» релизов с регуляторикой. С 1 марта 2026 года действует приказ ФСТЭК России №117 от 11 апреля 2025 года о защите информации в государственных информационных системах и системах госорганов и госучреждений: уязвимости критического уровня нужно устранить или закрыть компенсирующими мерами за 24 часа, высокого уровня за 7 календарных дней, а если уязвимости нет в БДУ ФСТЭК, сведения о ней нужно направить в службу в течение 5 рабочих дней. На коммерческие компании приказ напрямую не распространяется, но именно госзаказчики составляют заметную часть пользователей сертифицированных редакций, и для них ждать плановый релиз вендора с патчем невозможно: сроки считаются с момента выявления.</p><p>Второй фактор, который называет компания: ИИ-инструменты резко ускорили поиск дефектов. В качестве примера Postgres Professional ссылается на программу координированного раскрытия уязвимостей Anthropic, в которой модель Claude нашла и передала мейнтейнерам сотни проблем в проектах с открытым кодом; две CVE из сегодняшнего списка тоже найдены с участием ИИ. Чем быстрее находят, тем важнее способность вендора быстро адаптировать и протестировать upstream-патч для своей редакции.</p><p>Чего в сообщении нет: точных номеров «нулевых» версий по веткам и ссылок на страницы загрузки. Не сказано и о сроках аналогичных релизов для редакции Postgres Pro Standard. Следующая точка на календаре для всех пользователей PostgreSQL, плановое квартальное обновление upstream в ноябре; будет ли к нему «нулевой» релиз и как быстро, компания не обещала.</p><p>Источники: <a href="https://habr.com/ru/companies/postgrespro/news/1076556/">Postgres Professional: новость на Хабре</a>, <a href="https://www.postgresql.org/about/news/postgresql-186-1711-1615-1519-1424-and-19-beta-3-released-3365/">PostgreSQL 18.6, 17.11, 16.15, 15.19, 14.24 and 19 Beta 3 Released</a>, <a href="https://www.postgresql.org/support/security/">PostgreSQL: Security Information</a></p><p>Изображение на обложке: Изображение: Postgres Professional</p>]]></content:encoded>
    </item>
    <item>
      <title>DoltLite вышел в бету: SQLite с ветками и merge, но запись дороже</title>
      <link>https://tproger.ru/news/doltlite-vywel-v-betu-sqlite-s-vetkami-i-merge-no-zapis-dorozh</link>
      <comments>https://tproger.ru/news/doltlite-vywel-v-betu-sqlite-s-vetkami-i-merge-no-zapis-dorozh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/doltlite-vywel-v-betu-sqlite-s-vetkami-i-merge-no-zapis-dorozh</guid>
      <description><![CDATA[<p>DoltHub объявила бету DoltLite 0.50.0, форка SQLite с Prolly Tree вместо B-tree: ветки, diff, merge, push и pull для локальной базы. Совместимость с тестами SQLite 99,46%, запись медленнее до 3,1 раза.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/doltlite-vywel-v-betu-sqlite-s-vetkami-i-merge-no-zapis-dorozh">DoltLite вышел в бету: SQLite с ветками и merge, но запись дороже</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:33:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания DoltHub 31 августа <a href="https://www.dolthub.com/blog/2026-08-31-doltlite-beta/">объявила</a>, что DoltLite, её форк SQLite с Git-подобным контролем версий, достиг стадии Beta и получил версию 0.50.0. Для разработчика это значит: формат хранения объявлен стабильным, и базу с ветками, diff и merge теперь можно пробовать в настоящих проектах, а не только в экспериментах. Цена версионирования тоже названа: мелкие записи в несколько раз медленнее SQLite.</p><p>DoltLite запустили 25 марта 2026 года как замену SQLite, у которой вместо B-tree под капотом content-addressed Prolly Tree. Всё остальное, по описанию основателя DoltHub Тима Сена, от SQLite: парсер SQL, анализатор, файловый слой и тестовый harness. До беты ушло около 2000 pull request и пять месяцев.</p><ul><li>DoltLite 0.50.0 объявлен бетой: стабильный формат хранения, SQL-совместимость и полный набор операций контроля версий.</li><li>Поддерживаются branch, merge, diff, rebase, cherry-pick, reset, а также push, pull, clone и fetch на свой remote или DoltHub.</li><li>Из 892 277 TCL-тестов SQLite проходят 99,46%; sqllogictest на 5,8 млн запросов проходит полностью; известно 4809 расхождений.</li><li>В памяти чтение медленнее SQLite на 10%, запись на 60%; для файловых баз чтение на уровне SQLite, пакетная запись медленнее на 10%.</li><li>Мелкие autocommit-записи медленнее в 3,1 раза: около 400 мкс против 125 мкс у SQLite.</li></ul><h2>Что «бета» означает у DoltHub</h2><p>Компания перечисляет четыре условия. Стабильный формат хранения: до беты он менялся 12 раз, а текущий вариант продержался 57 релизов, больше трёх месяцев, и для будущих несовместимых изменений обещан путь миграции. SQL-совместимость: DoltLite проходит 100% sqllogictest, это 5,8 млн запросов, и 99,46% из 892 277 TCL-тестов самого SQLite. Полный контроль версий: ветки, слияния, diff, rebase, cherry-pick, reset и удалённые операции. И производительность, пригодная для production, с оговорками ниже.</p><p>Оставшиеся 4809 расхождений с SQLite DoltHub объясняет архитектурой: отказ от rowid, chunk вместо page и отсутствие WAL и journal-файлов рядом с базой. Если код полагается на эти детали SQLite, миграция не будет прозрачной; проверить стоит именно их.</p><h2>Сколько стоит версионирование</h2><p>Замеры приводит сам вендор. Для базы в памяти чтение медленнее SQLite примерно на 10%, запись примерно на 60%. Для файловой базы чтение на уровне SQLite, пакетная запись медленнее примерно на 10%. Хуже всего мелким autocommit-транзакциям: каждая такая запись занимает около 400 мкс против 125 мкс у SQLite, то есть в 3,1 раза дольше. Причина в природе Prolly Tree: каждое изменение порождает новые chunk с хешами, и на одиночной вставке эта работа не амортизируется.</p><p>На практике это значит, что DoltLite подходит для сценариев, где данные меняются пакетами и важна история: конфигурации, справочники, наборы данных для ML, локальные базы в приложениях, где нужен откат и сравнение версий. Для очереди с тысячами мелких вставок в секунду SQLite по-прежнему быстрее, и вендор этого не скрывает.</p><h2>Что можно сделать уже сегодня</h2><p>Рабочий цикл похож на Git: создать ветку, изменить данные, посмотреть diff, слить. Удалённые операции push, pull, clone и fetch работают с собственным remote или с DoltHub. 7 августа DoltHub добавила поддержку DoltLite в Dolt Workbench, свой графический клиент, где ветвление, diff и merge доступны из интерфейса.</p><p>Сборки, по данным репозитория, есть для Linux, macOS, Windows, Python, Node.js, Rust, Android и WebAssembly. Лицензия в анонсе беты не указана, и перед использованием в коммерческом продукте её стоит уточнить в репозитории.</p><p>Релиз 0.50.0 не содержит изменений кода относительно 0.11.57: номер версии подняли, чтобы обозначить бету. Если вы уже на 0.11.57, обновляться ради кода не нужно.</p><h2>Контекст</h2><p>DoltHub с 2018 года развивает Dolt, версионируемую базу, совместимую с MySQL. DoltLite переносит ту же идею на встраиваемый движок: Prolly Tree даёт дешёвое сравнение версий по хешам и структурное слияние, а SQLite даёт зрелый SQL-слой. По нашей оценке, главный практический вопрос беты не в фичах, а в том, насколько быстро проект закроет разрыв в мелких записях: именно там пройдёт граница между «база для датасетов» и «замена SQLite в приложении».</p><p>Сроков выхода стабильной версии DoltHub не называет; редакция проверит, изменится ли производительность записи в следующих релизах.</p><p>Источники: <a href="https://www.dolthub.com/blog/2026-08-31-doltlite-beta/">Блог DoltHub: DoltLite Beta</a>, <a href="https://github.com/dolthub/doltlite/releases/tag/v0.50.0">Релиз v0.50.0 на GitHub</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare D1 на бесплатном плане отключается при превышении лимитов</title>
      <link>https://tproger.ru/news/cloudflare-nachala-otklyuchat-d1-na-besplatnom-plane-pri-prevyweni</link>
      <comments>https://tproger.ru/news/cloudflare-nachala-otklyuchat-d1-na-besplatnom-plane-pri-prevyweni?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/cloudflare-nachala-otklyuchat-d1-na-besplatnom-plane-pri-prevyweni</guid>
      <description><![CDATA[<p>С 1 сентября Cloudflare возвращает ошибки на запросы к D1 на плане Workers Free после превышения дневных лимитов: 5 млн прочитанных и 100 тысяч записанных строк. Что изменилось, как считаются строки, как понять, что вы близко к лимиту, сколько стоит платный план и что делать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/cloudflare-nachala-otklyuchat-d1-na-besplatnom-plane-pri-prevyweni">Cloudflare D1 на бесплатном плане отключается при превышении лимитов</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 01 Sep 2026 17:27:19 GMT</pubDate>
      <content:encoded><![CDATA[<p>Cloudflare с 1 сентября начала жёстко применять дневные лимиты <b>D1</b>, встроенной SQLite-базы для Workers, на бесплатном плане Workers Free. Об этом компания сообщила в <a href="https://developers.cloudflare.com/changelog/post/2026-09-01-d1-free-tier-limit-enforcement/">записи changelog</a>. Раньше превышение суточной квоты на строки проходило почти незаметно, теперь запросы через Workers Binding API и REST API возвращают ошибки и не работают до полуночи по UTC. Данные при этом не удаляются.</p><p>Если у вас на Workers Free крутится пет-проект, бот или небольшой сервис с базой в D1, это касается напрямую: в один день трафик чуть выше обычного, и после обеда по Москве запросы к базе начинают завершаться ошибкой до трёх часов ночи, а приложение без обработки этой ошибки показывает её пользователям. Cloudflare обещает письмо при достижении лимита, но письмо не починит прод.</p><ul><li>Лимиты Workers Free для D1: 5 млн прочитанных строк и 100 тысяч записанных строк в сутки, 5 ГБ хранилища на аккаунт.</li><li>С 1 сентября при превышении запросы к D1 завершаются ошибкой до сброса счётчика в 00:00 UTC (03:00 мск); сохранённые данные не затрагиваются.</li><li>На Workers Paid за $5 в месяц включено 25 млрд чтений и 50 млн записей в месяц, дальше $0,001 за миллион прочитанных строк и $1 за миллион записанных; 5 ГБ хранилища включено, дальше $0,75 за ГБ в месяц.</li><li>Строки считаются по факту прочитанного движком, а не по числу строк в ответе: SELECT без индекса по таблице в 100 тысяч строк — это 100 тысяч чтений.</li><li>Cloudflare советует посмотреть статистику запросов за прошлые дни и добавить индексы: полное сканирование таблицы съедает лимит чтений быстрее всего.</li></ul><h2>Что изменилось на самом деле</h2><p>Сами лимиты не новые, они давно указаны на <a href="https://developers.cloudflare.com/d1/platform/pricing/">странице тарифов</a>. Изменился режим их применения: до 1 сентября Cloudflare не блокировала запросы при превышении, теперь блокирует. Ограничение действует и на вызовы из кода Worker через биндинг, и на REST API, которым пользуются внешние интеграции и админки. В тексте ошибки предлагается два выхода: перейти на платный план или подождать до завтра.</p><blockquote>Upgrade to a paid plan or wait until tomorrow.</blockquote><p>Компания подчёркивает, что хранилище остаётся нетронутым: речь только о временной недоступности запросов, а не о потере или заморозке данных. Счётчик сбрасывается в полночь по UTC, в три часа ночи по Москве. Уведомление по электронной почте приходит при достижении дневного лимита, и Cloudflare отдельно рекомендует посмотреть активность запросов за прошлые дни, чтобы понять, насколько проект близок к границе.</p><h2>Почему один запрос может стоить 100 тысяч чтений</h2><p>Главная ловушка D1 — учёт по прочитанным строкам, а не по запросам. Запрос SELECT * FROM events WHERE user_id = ? без индекса по user_id заставляет движок пройти всю таблицу, и каждая пройденная строка засчитывается в лимит, даже если в ответе одна запись. Поэтому небольшой сервис с парой тысяч посетителей в день может упереться в 5 млн чтений на одном неудачном запросе в цикле. Cloudflare в changelog прямо называет виновника: запросы с полным сканированием таблиц, и советует индексы как первое средство.</p><p>Сколько строк реально прочитал запрос, D1 возвращает в объекте meta ответа: поля rows_read и rows_written. Именно по ним, а не по числу вызовов, стоит оценивать, насколько вы близки к лимиту. Суммарную картину за день показывают GraphQL Analytics API и дашборд Cloudflare; страница тарифов перечисляет все три способа отслеживать расход.</p><p>С записями та же логика: учитываются записанные строки, а не вызовы. Объединение вставок в один батч сокращает число запросов и задержку, но не уменьшает rows_written, так что от лимита в 100 тысяч записей в сутки оно не спасает. Единственный способ уложиться — писать меньше строк: агрегировать события, не хранить в D1 логи на каждый запрос, выносить телеметрию в Analytics Engine или KV.</p><h2>Сколько стоит платный план</h2><p>Workers Paid стоит $5 в месяц и снимает дневные лимиты. По странице тарифов в него включены 25 млрд прочитанных строк и 50 млн записанных строк в месяц, сверх этого чтение стоит $0,001 за миллион строк, запись — $1 за миллион строк. Хранилище: 5 ГБ включено, дальше $0,75 за гигабайт в месяц. Бесплатный план даёт те же 5 ГБ, но при их превышении не тарифицирует, а блокирует новые записи и изменение схемы; но 5 млн чтений и 100 тысяч записей в сутки, то есть примерно 150 млн чтений и 3 млн записей в месяц.</p><h2>Что сделать до вечера</h2><ul><li>Откройте статистику D1 в дашборде за последние две недели: если пиковые дни выше 3–4 млн чтений, по нашей оценке вы в зоне риска; порог редакционный, Cloudflare его не задаёт.</li><li>Пройдитесь EXPLAIN QUERY PLAN по самым частым запросам и добавьте индексы там, где видите SCAN.</li><li>Кэшируйте горячие ответы в KV или Cache API: одно чтение из кэша вместо тысячи строк из базы.</li><li>Записи ограничены сильнее чтений: считаются записанные строки, а не вызовы, батчи не помогут; пишите меньше строк, агрегируйте события и не кладите логи в D1 на каждый запрос.</li><li>Обрабатывайте ошибку D1 в коде: показывайте пользователю понятное сообщение и отдавайте кэшированные данные, а не пятисотую страницу.</li></ul><h2>Контекст</h2><p>D1 вышла из беты в 2024 году как «SQLite на краю сети» для Workers: база живёт рядом с кодом и тарифицируется по строкам, а глобальная репликация чтения доступна как отдельная бета-функция, а не по процессорному времени. Учёт по строкам — осознанный выбор Cloudflare, и до сих пор он был безболезненным для бесплатных проектов. Для D1 «бесплатно» теперь читается буквально: в пределах квоты сервис работает, за пределами останавливается, а не копит счёт. Распространится ли такой режим на другие бесплатные лимиты Workers, changelog не говорит.</p><p>Источники: <a href="https://developers.cloudflare.com/changelog/post/2026-09-01-d1-free-tier-limit-enforcement/">D1 free tier limit enforcement (Cloudflare Changelog)</a>, <a href="https://developers.cloudflare.com/d1/platform/pricing/">D1 pricing</a></p><p>Изображение на обложке: Cloudflare</p>]]></content:encoded>
    </item>
    <item>
      <title>Antirez про новый Redis Array: 4 месяца работы и AI как safety net для системного кода</title>
      <link>https://tproger.ru/translations/antirez-pro-novyj-redis-array-4-mesyaca-raboty-i-ai-kak-safety-n</link>
      <comments>https://tproger.ru/translations/antirez-pro-novyj-redis-array-4-mesyaca-raboty-i-ai-kak-safety-n?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/antirez-pro-novyj-redis-array-4-mesyaca-raboty-i-ai-kak-safety-n</guid>
      <description><![CDATA[<p>Salvatore Sanfilippo (antirez) рассказал о 4 месяцах разработки нового типа Array в Redis: спецификация руками, AI-ассистент как safety net, ARGREP с regex.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/antirez-pro-novyj-redis-array-4-mesyaca-raboty-i-ai-kak-safety-n">Antirez про новый Redis Array: 4 месяца работы и AI как safety net для системного кода</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>Tue, 05 May 2026 13:15:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Salvatore Sanfilippo (antirez) <a href="https://antirez.com/news/164">опубликовал короткий рассказ</a> о четырёх месяцах работы над новым нативным типом данных в Redis — <b>Array</b>. Работу он начал в первых числах января. Его наблюдение, ради которого пост и написан: AI стал рабочей опорой («safety net») для системного программирования. Он позволил Сальваторе не идти на компромисс по архитектуре, прогонять громоздкие задачи без выгорания и дотягиваться до уровня сложности, который один человек обычно пропускает. <a href="https://github.com/redis/redis/pull/15162">PR #15162</a> только что приземлился в репозиторий.</p><p>Перевод и пересказ короткой заметки автора Redis для русскоязычной аудитории — четыре месяца разработки, изменение внутренней архитектуры в середине пути, ARGREP с регулярными выражениями через TRE и общий вывод про связку «человек + AI» в инфраструктурном коде.</p><p><b>Что вышло.</b> В Redis приземлился новый нативный тип Array с поддержкой числового индекса как части семантики (PR #15162). Четыре месяца работы; команды ARSET, ARSCAN, ARPOP, ARGREP, ARINSERT.</p><p><b>Спецификация — первое.</b> Месяц ушёл на ручное написание спецификации: обоснование типа, C-структуры, разрежённое представление, семантика курсора для ring buffer и ARINSERT. Сначала с Opus, потом с GPT 5.3 / Codex.</p><p><b>Архитектура поменялась в середине.</b> Изначально были два уровня директорий и slices двух типов (sparse и dense) — этого не хватило для ARSET с очень большими индексами. Перешёл на «super directory of sliced dense directories» с slice по 4096 элементов. Без AI «срезал бы углы» — с AI пошёл на extra mile.</p><p><b>ARGREP с regex.</b> При тестировании Сальваторе начал хранить файлы Markdown в Array — для своей базы знаний. Так появилась идея ARGREP. Взял библиотеку TRE (за гарантии по времени против патологических паттернов), оптимизировал её для матчинга foo|bar|zap и закрыл несколько проблем безопасности.</p><p><b>Главный вывод.</b> AI — не замена человека в системном программировании, но «safety net» для громоздких задач (32-битная поддержка, тесты алгоритмов) и виртуальная команда ревью. Спецификация по-прежнему пишется человеком, и она же ключ ко всем последующим этапам.</p><h2>Месяц первый: спецификация руками</h2><p>Сальваторе подчёркивает: даже с AI первый месяц был полностью ручной работой над спецификацией. Документ описывает обоснование нового типа, C-структуры, разрежённое представление, точную семантику курсора для ring buffer и команды ARINSERT.</p><p>Дальше пошёл back-and-forth с моделью: сначала с Claude Opus, потом, когда вышел GPT 5.3, переключился на Codex. С тех пор все системные задачи делает только на GPT 5.x. Промежуточные обсуждения с моделью качественно меняли спецификацию: интеллектуальные вызовы про лучший дизайн, что переусложнено, что — недостаточно проработано.</p><h2>Месяцы второй и третий: автокодинг и пересмотр архитектуры</h2><p>Со второго месяца Сальваторе начал реализацию через <i>automatic programming</i> (его термин для написания кода с AI-ассистентом): постоянное ревью того, что пишет модель. И тут наткнулся на проблему — выбранный уровень индирекции оказался неправильным.</p><p>Изначально была схема: два уровня директорий и slices (sparse и dense). Этого не хватало для сценария вида ARSET myarray 293842948324 foo — то есть когда индекс большой, а массив должен оставаться разрежённым без огромных аллокаций.</p><blockquote>Поскольку у меня был AI, я не пошёл на компромисс — решил пройти extra mile.</blockquote><p>Под определёнными условиями структура данных меняет внутреннюю форму, превращаясь в super directory из sliced dense directories, которые в свою очередь указывают на сами array slices (по 4096 элементов на slice по умолчанию).</p><p>Это и дало одновременно «как настоящий массив» с точки зрения внутреннего представления, и нужные характеристики по памяти. ARSCAN и ARPOP теперь сканируют существующие массивы за время, пропорциональное числу элементов, а не длине диапазона.</p><p>Затем — чтение всего кода построчно. Тип покрыт массивным тестированием (опять же с помощью AI), но «работает поверхностно» не значит «оптимально». Сальваторе нашёл много мелких неэффективностей и дизайн-ошибок, которые ему не нравились, и начал процесс ручной и AI-ассистированной перезаписи модулей.</p><h2>Появление ARGREP — от своей задачи к команде</h2><p>Когда стресс-тестирование Array на разных кейсах подтвердило, что структура годится, Сальваторе начал моделировать сценарии использования. И тут, как часто бывает, личная задача подсказала фичу: он начал хранить файлы Markdown прямо в массивах — потому что они хорошо ложатся в этот тип.</p><p>Параллельно работал с агентами на других задачах и понял, что ему нужна централизованная база знаний из файлов Markdown под нужные навыки. Из своей потребности родился ARGREP. Но захотелось не просто поиска по подстроке — захотелось регулярных выражений.</p><p>Выбор библиотеки regex — отдельная история. Сальваторе остановился на <a href="https://laurikari.net/tre/">TRE</a> от Ville Laurikari: когда regex встраивается в Redis, важно гарантировать отсутствие патологических паттернов по времени и памяти. Но у TRE оказалась неэффективность в одном специфичном и очень полезном кейсе — матчинг alternation вида foo|bar|zap.</p><p>С помощью GPT он оптимизировал библиотеку для этого кейса, заодно зафиксил несколько потенциальных проблем безопасности и расширил тесты. После этого ARGREP с честным regex был готов к мержу.</p><h2>Главное наблюдение: AI как safety net</h2><p>Сальваторе формулирует главный вывод так: для high-quality системного программирования по-прежнему нужно быть полностью вовлечённым — но AI расширил «зону комфорта». Без него Сальваторе не пошёл бы на тот уровень сложности, который выбрал для нового типа.</p><p>AI выступил safety net в двух конкретных аспектах:</p><ul><li><b>Громоздкие задачи без выгорания.</b> Например, поддержка 32-битной архитектуры, которую он добавил и протестировал отдельно. Это та работа, что обычно отнимает мотивацию и силы — с AI она прошла без обычного истощения.</li><li><b>Виртуальная команда ревью</b>, которая отлавливает очевидные баги в сложных алгоритмах. Не замена тестам и не замена самому Сальваторе — но дополнительный слой, который ловит «глупости» до того, как они уйдут в код.</li></ul><p>При этом Сальваторе подчёркивает: огромная начальная спецификация — ключ ко всему остальному. Без неё невозможно было ни прогнать ревью каждой строки в sparsearray.c и t_array.c, ни решать, что переписывать, ни понимать, какой именно компромисс ты только что принял.</p><h2>Что взять на заметку разработчику</h2><ol><li><b>Сначала спека, потом AI.</b> Если задача системная — потратьте первый этап на ручное написание спецификации. AI может качественно её прокачать через диалог, но не сгенерировать с нуля.</li><li><b>Не идите на компромисс по архитектуре, если AI это закрывает.</b> Громоздкая правильная реализация теперь под силу одному человеку. Если внутреннее представление кажется «не тем» — пересоберите его, пока спека ещё свежая в голове.</li><li><b>Ревью каждой строки.</b> AI хорош в тестах и поверхностном «работает», но качество кода остаётся за вами. Без построчного чтения после того, как «всё работает», оптимизировать дизайн — на ощупь.</li><li><b>Чередуйте модели.</b> Хотя бы две (например, GPT 5.x и Claude). Это не страховка от падений API, а способ увидеть проблему с разных углов.</li><li><b>Следите за тем, что под рукой.</b> Сальваторе нашёл идею ARGREP не через roadmap, а через собственный сценарий: хранил Markdown в Array, понадобился полнотекстовый поиск.</li></ol><h2>Выводы</h2><p>История Redis Array — короткий, но содержательный кейс того, как меняется планка инфраструктурного программирования с приходом AI-ассистентов. Не «AI пишет код», и даже не «AI делает программиста быстрее в 5 раз». А «AI убирает потолок сложности, который раньше задавался выгоранием и страхом ошибиться в дальнем углу системы».</p><p>Похожий тренд мы недавно <a href="https://tproger.ru/news/github-perepisal-plan-moshhnostej-v-30-ai-agenty-piwut-kod-byst">разбирали со стороны GitHub</a>: их CTO признал, что план по 10-кратному наращиванию мощностей пришлось переписывать в 30-кратный — потому что объём AI-сгенерированного кода вырос быстрее, чем планировали. Со стороны автора одиночного проекта это выглядит так же: новый этаж сложности достижим без новой команды.</p><p>Источник: <a href="https://antirez.com/news/164">Redis array type: short story of a long development — antirez.com</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Denwer SE: Возрождение легендарного локального веб-сервера на современном стеке</title>
      <link>https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so</link>
      <comments>https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тишов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so</guid>
      <description><![CDATA[<p>Помните диск Z:, иконку джентльмена и магию Run.exe? Денвер вернулся. Denwer SE: Python вместо Perl, HTTPS без красных экранов, свежий PHP и портативность. И да, он всё ещё помещается на флешку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so">Denwer SE: Возрождение легендарного локального веб-сервера на современном стеке</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Laravel]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 May 2026 10:11:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы начинали веб-разработку в середине 2000-х, то наверняка помните Denwer — «джентльменский набор веб-разработчика». Иконка в виде человека в шляпе, виртуальный диск Z:, папка <i>home/localhost/www</i> — всё это было ритуалом, который упрощал жизнь тысячам разработчиков. Но оригинальный Denwer безнадёжно устарел: Perl-скрипты, 32-битные сборки, поддержка только древних версий PHP и MySQL. Ему на смену пришли громоздкие комбайны вроде Open Server или сложные для новичков Docker-контейнеры.</p><p>Однако недавно проект получил второе дыхание. Разработчик Александр Тишов (Amro) — создатель <a href="https://seditio.org" rel="nofollow">CMS Seditio</a> и основатель веб-студии <a href="https://avego.org" rel="nofollow">«Авего»</a>  — выпустил <a href="https://seditio.org/dev/denwer-se-lokalnyj-veb-stek-dlya-windows-apache-php-mysql-mariadb" rel="nofollow">Denwer SE (Second Edition)</a>. Это не просто обновление, а полный реинжиниринг с сохранением классической философии: портативность, скорость работы и привычная структура каталогов.</p><p>В этой статье разберём, что изменилось под капотом, почему панель управления переехала с Perl на Python, как работает автоматический HTTPS с собственным корневым сертификатом и зачем нужен зоопарк версий PHP от 5.6 до 8.5.</p><h2>Краткий экскурс: от Denwer 3 до Denwer SE</h2><p>Оригинальный Denwer (сокращение от Джентельменский Набор Веб-разработчика) появился в начале 2000-х. Он представлял собой связку Apache + PHP + MySQL, упакованную в самораспаковывающийся архив. Главные фишки:</p><ul><li>Виртуальный диск (по умолчанию Z:), который монтировался через subst.</li><li>Автоматическое создание виртуальных хостов по именам папок в home.</li><li>Консольные exe-файлы (Run, Stop, Restart) без графического окна.</li></ul><p>Проблемы оригинала:</p><ul><li>Управление на Perl — медленно, тяжело поддерживать в Windows.</li><li>Только 32-битные компоненты.</li><li>Невозможно быстро переключать версии PHP или БД.</li><li>Отсутствие нормального HTTPS (только самоподписанные сертификаты с ошибками в браузере).</li><li>Поддержка прекратилась в 2016 году.</li></ul><p>Denwer SE решает все эти проблемы, оставаясь при этом таким же портативным — достаточно скопировать папку на флешку или в облачный каталог.</p><h2>Архитектура: Python вместо Perl</h2><p>Denwer SE — панель управления написана на Python и скомпилирована в один EXE-файл (через PyInstaller).</p><p>Внутри служебной папки <b>denwer\</b> лежат:</p><ul><li>DLL-версия Python — интерпретатор, который использует основной исполняемый файл.</li><li>Скомпилированные модули .pyd — в том числе GUI на базе Tcl/Tk для оконного интерфейса и системного трея.</li><li>Минимальный набор библиотек для управления службами, правки hosts и генерации сертификатов.</li></ul><p>Это даёт несколько преимуществ:</p><ul><li>Портативность — панель ищет соседние папки home и usr, поэтому каталог со стеком можно переносить куда угодно без переустановки.</li><li>Скорость — Python-скрипты запускаются быстрее, чем Perl, особенно на холодном старте.</li><li>Читаемость кода — разработчику проще поддерживать и расширять функционал.</li></ul><h2>Полный переход на x64</h2><p>Оригинальный Denwer навсегда остался 32-битным, что в современных реалиях просто неприемлемо. Denwer SE собирается исключительно под x64:</p><ul><li>Apache (версия 2.4.x) — 64-битный.</li><li>Все модули PHP (от 5.6 до 8.5) — Thread Safe x64.</li><li>MySQL / MariaDB — 64-битные сборки.</li></ul><p>Системные требования — Windows 7/8/10/11 (x64). Для работы компонентов потребуются Microsoft Visual C++ Redistributable (VC11, VC12, VC14, VC15). Разработчик положил установщики этих пакетов в папку <b>vcredist\</b> — при необходимости можно доустановить вручную.</p><h2>Структура каталогов: преемственность и гибкость</h2><p>Denwer SE сохранил классическую структуру, чтобы старые пользователи не ломали голову:</p><p>Главный конфиг — usr\configuration.txt. В нём задаются пути без жёсткой привязки к букве диска, например:</p><p>При старте панель монтирует виртуальный диск (по умолчанию Z:) и динамически подставляет путь через переменную <b>subst_drive</b>.</p><h2>Управление версиями PHP и БД без танцев с бубном</h2><p>В Denwer SE встроен менеджер версий. Вы просто выбираете из выпадающего списка нужную версию PHP (например, 8.3 или 5.6) — панель сама правит конфигурацию Apache.</p><p>Как это работает под капотом:</p><p>В папке usr/local/apache/php лежат подкаталоги php5.6, php7.4, php8.3 и т.д..</p><p>В каждом из них есть файл php-denwer.conf— шаблон для подключения модуля к Apache. При выборе версии этот файл копируется в <b>conf/extra/httpd-denwer.conf</b>, который затем включается в основной httpd.conf.</p><p>Если вы хотите добавить свою сборку PHP (например, PHP 8.4-rc), достаточно:</p><ul><li>Распаковать x64 Thread Safe версию в отдельный каталог внутри php\.</li><li>Создать php-denwer.conf по образцу.</li><li>Убедиться, что все DLL от VC++ установлены.</li></ul><p>Аналогично для баз данных: переключение между MySQL 5.7 и MariaDB 11.8 происходит через тот же интерфейс. В каталоге СУБД может лежать файл <b>db-denwer.conf</b>, который при старте копируется в <b>my.ini</b>.</p><h2>HTTPS, который не бесит: локальный Root CA</h2><p>Самое болезненное место при локальной разработке это самоподписанные сертификаты. Браузеры постоянно ругаются, приходится кликать «Принять риск». Для командной разработки это вообще катастрофа: каждый участник должен сгенерировать свой сертификат и добавить в исключения.</p><p>Denwer SE решает проблему элегантно — он создаёт собственный корневой центр сертификации (CA) и подписывает им сертификаты для всех ваших локальных доменов.</p><p>Как это работает:</p><ol><li>При первом запуске (если найден OpenSSL) панель генерирует ключи denwer-ca.key и сертификат denwer-ca.crt в папку usr/local/apache/conf/cert/denwer-ca/.</li><li>Для каждого виртуального хоста (папки в home/) автоматически создаётся сертификат в conf/cert/&lt;domain&gt;/.</li><li>Все сертификаты хостов подписаны локальным CA.</li></ol><p>Чтобы браузер доверял им, нужно один раз установить <b>denwer-ca.crt</b> в хранилище «Доверенные корневые центры сертификации» Windows. Для этого в панели есть специальная кнопка (требует прав администратора).</p><p>После этого любые HTTPS-запросы к локальным хостам работают без единого предупреждения.</p><h2>Удобства для разработчика (DX)</h2><p>В версии 1.2.4 добавили несколько фич, которые экономят время каждый день:</p><ul><li>Лог с таймштампами — каждая строка в окне панели имеет префикс [чч:мм:сс]. Теперь видно, сколько секунд сервер поднимается и где возможны задержки.</li><li>Прямой доступ к php.ini и my.cnf — рядом со списками версий появились кнопки, открывающие конфигурацию именно активной версии.</li><li>Автоматическое ведение hosts — панель в реальном времени сканирует home/, находит новые домены и прописывает их в C:\Windows\System32\drivers\etc\hosts. Журнал добавляемых записей сохраняется в usr\AddedHosts.txt. При остановке стека лишние строки удаляются.</li><li>Для смены версии PHP или базы данных панель требует полной остановки всех служб. Вы нажимаете «Стоп», меняете версию в списке, затем «Старт» — и стек поднимается уже с новыми настройками. Автоматический перезапуск без вашего участия работает только для Apache: когда вы добавляете новый домен в папку home/, панель сама переписывает vhosts.conf и перезапускает веб-сервер, не трогая БД.</li></ul><h2>Почему не Open Server или Docker?</h2><p>Этот вопрос закономерно возникает у всех, кто видит очередной локальный веб-сервер. Ведь есть уже давно Open Server Panel, Laragon, XAMPP, а для продвинутых — Docker. Зачем ещё один?</p><p><b>Open Server</b> — мощный и удобный комбайн с десятками версий PHP и настройками «на века». Но он разворачивается в системе не портативно: создаёт папки в ProgramData, пишет в реестр, а запуск может занимать 5–10 секунд. Denwer SE, напротив, полностью переносим: скопировал папку на флешку или в облачный каталог — и всё работает. Запуск стека — буквально 1–2 секунды, что критично, когда вы десятки раз за день перезапускаете сервер для тестов.</p><p><b>Docker</b> — индустриальный стандарт для изоляции и воспроизводимости окружений. Но для локальной разработки простого сайта он часто избыточен. Вам нужно разобраться в образах, контейнерах, пробросе портов, volume’ах и docker-compose.yml. А в Denwer SE вы просто создали папку в home/ — и готово. Никакой работы с командной строкой, никакого потребления гигабайт ОЗУ на фоновую службу Docker Desktop.</p><p><b>Laragon</b> — быстрый, портативный, поддерживает не только PHP, но и Node.js, Python, Go. Но он ориентирован на современные фреймворки, особенно Laravel. Denwer SE же сделан для тех, кто вырос на классическом Денвере: виртуальный диск Z:, папка home/имя_домена/www, минимум настроек. Не нужно переучиваться — просто распаковал и работаешь как 10 лет назад, но с новыми версиями PHP и HTTPS.</p><h2>Как начать пользоваться Denwer SE</h2><ol><li>Скачать архив с <a href="https://seditio.org/dev/denwer-se-lokalnyj-veb-stek-dlya-windows-apache-php-mysql-mariadb" rel="nofollow">официального сайта автора</a>.</li><li>Распаковать в любое место, например C:\web\DenwerSE\.</li><li>Запустить DenwerSE.exe — если нет прав администратора, попросит их для монтирования диска и правки hosts.</li><li>Нажать «Запустить» — появится виртуальный диск Z:, а в системном трее иконка.</li><li>Создать папку сайта — например, home\myproject.local и положить туда index.php.</li><li>Открыть в браузере http://myproject.local/ (или https://myproject.local/). HTTPS будет работать сразу после установки корневого сертификата (кнопка в панели).</li></ol><p>По умолчанию пароль к MySQL/MariaDB — пустая строка (пользователь <b>root</b>). При желании его можно сменить через phpMyAdmin.</p><h2>Заключение</h2><p>Denwer SE — это не просто ностальгический проект. Это действительно современный инструмент, который доказывает, что концепция «локального сервера в одну папку» всё ещё актуальна. Отказ от Perl в пользу Python, менеджер версий PHP/БД, нормальный HTTPS, портативность и мгновенный запуск — всё это делает его отличным выбором для быстрого прототипирования, тестирования легаси-кода или обучения веб-разработке.</p><p>Если вы устали ждать, пока Open Server применит настройки, или не хотите разбираться в Docker Compose — попробуйте <b>Denwer SE</b>. Вероятно, он напомнит вам старые добрые времена, но уже без боли устаревших технологий.</p><ul><li>Автор проекта: Александр Тишов
	(Amro), разработчик CMS Seditio.</li><li>Лицензия: Freeware.</li><li>Совместимость: Windows 7/8/10/11 x64.</li></ul><p>Исходники панели управления не открыты (распространяется скомпилированный EXE), но архитектура и конфиги полностью прозрачны. В планах — добавить поддержку Nginx в качестве альтернативы. Следите за обновлениями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я написал E2EE-мессенджер на Spring Boot и WebCrypto — и почему сервер не видит сообщения</title>
      <link>https://tproger.ru/articles/kak-ya-napisal-e2ee-messendzher-na-spring-boot-i-webcrypto-i-poch</link>
      <comments>https://tproger.ru/articles/kak-ya-napisal-e2ee-messendzher-na-spring-boot-i-webcrypto-i-poch?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Василенков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-napisal-e2ee-messendzher-na-spring-boot-i-webcrypto-i-poch</guid>
      <description><![CDATA[<p>Разбор архитектуры E2EE-мессенджера на Spring Boot 3, React и WebCrypto: X3DH, symmetric ratchet, AES-GCM, WebSocket, multi-device и ограничения реализации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-napisal-e2ee-messendzher-na-spring-boot-i-webcrypto-i-poch">Как я написал E2EE-мессенджер на Spring Boot и WebCrypto — и почему сервер не видит сообщения</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Алиса]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 May 2026 05:35:02 GMT</pubDate>
      <content:encoded><![CDATA[<figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/240e412b-4307-49f9-b24f-bde7e0a7fd9a.webp" alt="" /></figure><p>Я Java-разработчик и в основном работаю с backend: Spring Boot, базы данных, интеграции, авторизация, WebSocket — всё то, что обычно находится за интерфейсом.</p><p>В какой-то момент я поймал себя на мысли: я каждый день пользуюсь мессенджерами, но плохо понимаю, как они устроены внутри. Окей, JWT, WebSocket, PostgreSQL, Redis — это понятно. Но что технически означает фраза "end-to-end encryption"? Как сервер доставляет сообщения, если он не должен их читать? Где живут ключи? Что хранится в базе? Что происходит, если у пользователя два устройства?</p><p>Решил разобраться через практику. Написал мессенджер с нуля. Назвал Chaos Messenger.</p><p>Сразу честно: криптографическую часть я изучал вместе с Claude и ChatGPT — читал спецификации X3DH и Double Ratchet, разбирал примеры, задавал вопросы, пока не сложилась цельная картина. Frontend тоже делался с активной помощью ChatGPT: я backend-разработчик, React для меня не основная среда. Но архитектура, backend, интеграция WebCrypto, модель конвертов, хранение сообщений и принципиальные решения — мои.</p><p>Для меня AI здесь был не заменой понимания, а инструментом — примерно как документация, Stack Overflow и ревью коллег. Без понимания threat model и архитектуры такой проект всё равно не собрать.</p><p>В статье расскажу, как работает E2EE изнутри: как устанавливается сессия через X3DH, как каждое сообщение получает отдельный ключ через Symmetric Ratchet, почему сервер хранит только зашифрованные конверты, и какие ошибки я допустил по дороге.</p><p>Стек: Spring Boot 3, React 18, WebCrypto API, PostgreSQL, Redis, WebSocket/STOMP, Prometheus, Grafana.</p><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/4b028f37-2de1-46ea-a247-567f74fb3081.webp" alt="" /></figure><h2>Важная оговорка про web-E2EE</h2><p>Когда я говорю, что сервер не может прочитать сообщения, я имею в виду backend, базу данных, WebSocket-слой и уже сохранённые ciphertext-конверты. У них нет ключей и plaintext.</p><p>Но у web-E2EE есть отдельная проблема: frontend-код тоже приходит с сервера. Теоретически скомпрометированный сервер может отдать изменённый JavaScript, который украдёт ключи или plaintext до шифрования. Это ограничение не конкретно моего проекта, а браузерной модели в целом.</p><p>Поэтому корректная формулировка такая: backend не получает ключи и не может расшифровать уже переданные или сохранённые сообщения. Защита от подмены клиентского кода — отдельный слой безопасности: подпись сборок, независимая верификация клиента, desktop/mobile-приложения, reproducible builds.</p><h2>Почему обычный подход не работает</h2><p>Большинство "мессенджеров" на GitHub выглядят примерно так:</p><p>Сервер знает всё. Видит каждое сообщение. Если БД утекла — утекла вся переписка. Если сервер взломали — читай что хочешь. Если завтра компания решит продать данные — технически ничего не мешает.</p><p>E2EE решает это радикально: backend не получает ключи и не хранит plaintext. Сообщение шифруется на устройстве отправителя до отправки в сеть, а расшифровывается только на устройстве получателя.</p><p>Это уже не вопрос политики конфиденциальности в стиле "мы обещаем не читать". Это архитектурное ограничение: если у сервера нет ключа, он не может превратить ciphertext обратно в текст.</p><p>Звучит как магия. На самом деле — два протокола и немного WebCrypto.</p><h2>Главная идея: конверты</h2><p>Представь что Алиса хочет написать Бобу. Вместо того чтобы положить письмо на стол и надеяться что никто не прочитает — она кладёт его в запечатанный конверт. Конверт может открыть только Боб своим ключом. Сервер просто передаёт конверт не заглядывая внутрь.</p><p>Именно так это работает в коде. В базе данных у меня это выглядит так:</p><p>Когда я впервые увидел</p><p>в своей БД вместо текста — стало понятно, что модель наконец работает правильно: сервер создал сообщение, доставил его, сохранил метаданные, но так и не узнал содержимое.</p><p>А вот что сервер возвращает при запросе списка чатов через API:</p><p>Не</p><p>. Не</p><p>. Буквально</p><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/b466ad91-20da-4e64-8b78-f6e08d2851d5.webp" alt="" /></figure><p>(DevTools → Network → ответ API с</p><p>)</p><h2>Откуда берутся ключи: X3DH</h2><p>Главный вопрос: как Алиса и Боб получают общий секрет, если они никогда раньше не общались? И как сделать это так, чтобы сервер только помог передать публичные данные, но сам не смог вычислить итоговый ключ?</p><p>Для этого используется X3DH — Extended Triple Diffie-Hellman, протокол из экосистемы Signal. Его задача — установить общий секрет между двумя устройствами, используя долгосрочные и временные ключи.</p><h2>Что хранится на сервере</h2><p>Когда пользователь регистрирует устройство, он загружает на сервер пакет публичных ключей:</p><p>На сервер уходят только публичные части. Приватные ключи сериализуются и хранятся локально в браузере — и никогда не покидают устройство в сеть.</p><p>Здесь важно сказать честно: хранение приватных ключей в</p><p>Более строгий вариант — использовать Web Crypto API с</p><p>, чтобы приватный ключ жил внутри браузерного crypto runtime и его нельзя было экспортировать в байты. Но у этого подхода есть практическая сложность: ключи нужно переживать между перезагрузками страницы, синхронизировать с IndexedDB, аккуратно восстанавливать состояние устройства и не сломать UX.</p><p>В браузерных E2EE-приложениях обычно приходится выбирать между несколькими вариантами:</p><ul><li>Сериализуемые ключи в localStorage или IndexedDB — проще реализовать, но нужно очень серьёзно относиться к XSS и целостности frontend-кода.</li><li>extractable: false + IndexedDB — безопаснее, но сложнее в реализации и восстановлении состояния.</li><li>Нативное secure storage вроде Android Keystore или iOS Secure Enclave — лучший вариант для мобильных клиентов, но он недоступен обычному web-приложению.</li></ul><p>В текущей версии Chaos Messenger используется первый вариант. Это осознанный компромисс для pet/open-source проекта и удобного запуска в браузере. Переход на non-extractable ключи и более строгую модель хранения стоит в roadmap.</p><p>Ключевой момент: backend всё равно не получает приватные ключи и не может расшифровать сохранённые ciphertext-конверты. Но защита ключей на клиенте — отдельная задача, и её нельзя честно замалчивать.</p><h2>Установка сессии</h2><p>Когда Алиса открывает переписку с Бобом впервые, происходит следующее:</p><p>В классическом X3DH четвёртая DH-операция с one-time prekey опциональна: она выполняется, если сервер выдал доступный OPK получателя. В моей реализации устройство публикует набор one-time prekeys при регистрации, поэтому первое сообщение обычно использует DH4. Если OPK закончились, сессию всё равно можно установить через остальные DH-компоненты, но это уже менее сильный вариант.</p><p>Боб, получив конверт с эфемерным публичным ключом Алисы, повторяет те же операции со своими приватными ключами и получает тот же самый</p><p>. Математика симметрична.</p><p>Сервер в этот момент видит только публичные ключи и зашифрованный конверт. Он помогает устройствам найти друг друга, но не участвует в вычислении секрета.</p><p>Получить</p><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/e7bbacf3-4fd2-4710-863a-2c710b1f6759.webp" alt="" /></figure><h2>Как шифруется каждое сообщение: Symmetric Ratchet</h2><p>X3DH даёт нам стартовый</p><p>. Но использовать один и тот же ключ для всех сообщений — плохая идея. Если использовать один ключ для всей переписки, компрометация этого ключа сразу открывает весь поток сообщений.</p><p>Решение — симметричный ratchet. После каждого сообщения цепочка ключей продвигается вперёд:</p><p>Визуально это выглядит так:</p><p>используется для шифрования одного сообщения через AES-GCM, после чего уничтожается. Если атакующий компрометирует</p><p>— он прочитает только второе сообщение.</p><p>В рамках такой симметричной цепочки это даёт forward secrecy назад по цепочке: зная текущий или отдельный</p><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/939a74f7-60c5-4816-85f0-05b5afdc9845.webp" alt="" /><figcaption>(диаграмма схемы chainKey → messageKey)</figcaption></figure><p>Само шифрование сообщения:</p><p>А вот что уходит на сервер — живой пример из DevTools:</p><p>Сервер получает</p><p>и</p><p>. Расшифровать без</p><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/b5e24cda-6fd9-4b15-9f27-3eb9b4f843b0.webp" alt="" /></figure><h2>Важная оговорка: это ещё не полный Double Ratchet</h2><p>В этом проекте реализован Symmetric Ratchet — цепочка, где из</p><p>для каждого сообщения выводится отдельный</p><p>Это защищает прошлые сообщения: если атакующий узнает текущий ключ или отдельный</p><p>, он не сможет откатить HMAC назад и получить старые ключи.</p><p>Но это не полный Double Ratchet из Signal Protocol.</p><p>В полном Double Ratchet есть ещё DH ratchet step: стороны периодически выполняют новый Diffie-Hellman обмен и обновляют root key. Это даёт break-in recovery — возможность восстановить безопасность будущих сообщений после компрометации части состояния.</p><p>В моей реализации DH ratchet step пока нет. Если атакующий получит актуальное состояние сессии на устройстве и сможет продолжать его читать, он сможет расшифровывать будущие сообщения до переустановки сессии. Это честное ограничение текущей версии, и оно стоит первым пунктом в roadmap.</p><h2>Мультиустройство: один пользователь, несколько конвертов</h2><p>Первый неочевидный момент: в E2EE сообщение адресуется не просто пользователю, а конкретным устройствам пользователя.</p><p>Если у Боба два устройства — телефон и ноутбук — нужен отдельный encrypted envelope для каждого устройства. Сервер не может взять один конверт, расшифровать его и "переупаковать" для второго устройства: у него нет ключей и он не знает plaintext.</p><p>Значит при отправке сообщения нужно зашифровать его отдельно для каждого устройства каждого участника чата.</p><p>Для чата где у каждого по 2 устройства — 4 конверта на одно сообщение. Для группы из 10 человек — потенциально 20 конвертов. Это нормально, это цена безопасности.</p><h2>Сервер: хранение и доставка конвертов</h2><p>На сервере сообщение создаётся с контентом</p><p>, а конверты сохраняются отдельно:</p><p>После сохранения — fanout по WebSocket. Каждое устройство получает свой конверт и только его:</p><p>Это важное отличие от обычного WebSocket-чата. В обычном чате сервер рассылает одно и то же событие всем участникам. В E2EE-чате сервер рассылает разные события разным устройствам: payload для каждого устройства содержит свой</p><p>Топик</p><p>— строго персональный. Устройство А не получает конверт устройства Б. Никакого broadcast — только адресная доставка.</p><h2>Архитектура целиком</h2><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/de0e3257-d893-459f-86ed-7ed8eace5d56.webp" alt="" /></figure><h2>Баг который долго не замечал</h2><p>В панели чатов показывается превью последнего сообщения. Я реализовал это через</p><p>Запускаю — в списке чатов у всех написано</p><p>.</p><p>Конечно. Сервер же не знает что там написано.</p><p>Я полчаса думал как решить это на сервере. Потом дошло: нельзя решить это на сервере — у него нет ключей. Решение только на клиенте.</p><p>После того как пользователь открыл чат и сообщения расшифровались — кешируем последнее в памяти:</p><p>Это хороший пример того, как E2EE меняет привычное мышление backend-разработчика. В обычном приложении preview — это поле в SQL-запросе. В E2EE-приложении preview — это локальное клиентское состояние, потому что только клиент видел plaintext.</p><p>Простое решение. Но чтобы к нему прийти нужно было полностью принять идею что сервер здесь просто не при делах — и перестать пытаться решить задачу на его стороне.</p><h2>Rate limiting: дыра которую легко не заметить</h2><p>Эндпоинт</p><p>отправляет SMS с кодом. Без защиты любой скрипт может дёргать его тысячи раз — это называется SMS pumping fraud, SMS стоят реальных денег.</p><p>Redis у нас уже был для хранения онлайн-статусов. Добавил rate limiting поверх него:</p><p>При превышении — HTTP 429 с заголовком</p><p>. Клиент знает через сколько секунд можно повторить.</p><p>Важный нюанс: в текущей реализации, если Redis недоступен, сервис не блокирует авторизацию полностью. Для pet-проекта это приемлемый компромисс: лучше рискнуть одним лишним SMS, чем положить вход в приложение.</p><p>В production я бы сделал строже: fallback in-memory лимит на инстанс, отдельные лимиты по IP и телефону, антифрод-логику и алерты на всплески отправки кодов.</p><h2>Авторизация WebSocket</h2><p>Отдельная история — авторизация WebSocket соединений. HTTP-эндпоинты защищены Spring Security автоматически, но WebSocket — другое дело. STOMP-соединение устанавливается один раз, и нужно проверять JWT при каждом подключении.</p><p>Отдельно важно не только проверить JWT, но и связать WebSocket-соединение с конкретным устройством. Пользователь может быть один, но устройств у него несколько, а encrypted envelope адресован именно</p><p>Поэтому при подключении я проверяю не только токен, но и</p><p>: устройство должно быть зарегистрировано и принадлежать текущему пользователю. Иначе легко случайно превратить per-device E2EE-доставку обратно в обычный broadcast по пользователю.</p><h2>Что получилось — живые скрины</h2><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/1fdfa006-f5c6-4731-a40f-50559be8832d.webp" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/137649/2026-04-29/c99164a5-021c-49ac-bcc4-3e38f9cd1c31.webp" alt="" /></figure><p>Что реализовано:</p><ul><li>E2EE-модель с per-device encrypted envelopes</li><li>X3DH session setup + Symmetric Ratchet + AES-GCM</li><li>Мультиустройство</li><li>Личные и групповые чаты</li><li>Realtime доставка через WebSocket/STOMP</li><li>Статусы SENT → DELIVERED → READ</li><li>Редактирование и soft delete сообщений</li><li>Online presence, typing indicator</li><li>Фото-вложения</li><li>Поиск пользователей</li><li>Rate limiting на SMS через Redis</li><li>Prometheus метрики + Grafana дашборд</li><li>Swagger UI с JWT авторизацией</li><li>24 backend-теста на Testcontainers, 12 frontend на Vitest, E2E на Playwright</li><li>GitHub Actions CI</li></ul><p>Что ещё не сделано:</p><ul><li>Полный Double Ratchet с DH ratchet step и break-in recovery</li><li>Ротация signed prekey и аккуратное пополнение one-time prekeys</li><li>Более строгая модель хранения приватных ключей на клиенте: non-extractable CryptoKey + IndexedDB</li><li>Защита от подмены frontend-кода: подпись сборок, независимая верификация клиента, reproducible builds</li><li>Android-клиент с Android Keystore</li><li>Реальный SMS-провайдер вместо кода в backend-логах</li><li>Push-уведомления без утечки содержимого сообщений</li><li>Более строгая metadata-модель для групповых чатов</li></ul><h2>Главный инсайт</h2><p>E2EE — это архитектурное решение, а не библиотека.</p><p>Нельзя взять обычный Spring Boot чат и просто "включить шифрование". Нужно с самого начала проектировать систему так, чтобы backend не был участником доверенной зоны: он не должен получать plaintext, не должен иметь ключи и не должен уметь пересобирать сообщение из данных в базе.</p><p>Это меняет почти всё:</p><ul><li>структуру БД — вместо текста появляются encrypted envelopes</li><li>API — сервер отдаёт [encrypted], а не preview сообщения</li><li>WebSocket — доставка идёт не по пользователю, а по конкретному устройству</li><li>мультиустройство — одно сообщение превращается в несколько ciphertext-конвертов</li><li>frontend — становится полноценной криптографической частью системы, а не просто UI</li></ul><p>Второй инсайт: мессенджер — это не "чат с WebSocket". В E2EE-модели это система доставки зашифрованных конвертов с адресацией по устройствам. Как только это принимаешь, многие странные на первый взгляд решения становятся логичными.</p><h2>Репозиторий</h2><p>Код открыт: <a href="https://github.com/vaazhen/chaos-messenger">github.com/vaazhen/chaos-messenger</a></p><p>В репозитории есть README на русском и английском, диаграммы, скриншоты, security audit, Docker Compose и запуск одной командой.</p><p>Проект не претендует на уровень production-криптомессенджера вроде Signal. Это учебный и инженерный open-source прототип, цель которого — показать, как E2EE меняет архитектуру backend, frontend и realtime-доставки.</p><p>Если вы делали что-то похожее — особенно интересно сравнить подходы к ротации prekey-ов, хранению non-extractable ключей в браузере и реализации DH ratchet step. Вопросы и критика приветствуются.</p>]]></content:encoded>
    </item>
    <item>
      <title>pgBackRest перестали поддерживать — главный open-source бэкап PostgreSQL остался без мейнтейнера</title>
      <link>https://tproger.ru/news/pgbackrest-perestali-podderzhivat-glavnyj-open-source-bekap-po</link>
      <comments>https://tproger.ru/news/pgbackrest-perestali-podderzhivat-glavnyj-open-source-bekap-po?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/pgbackrest-perestali-podderzhivat-glavnyj-open-source-bekap-po</guid>
      <description><![CDATA[<p>Дэвид Стил после 13 лет разработки прекратил работу над pgBackRest. Главный open-source бэкап Postgres помечен obsolete. Разбираем альтернативы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/pgbackrest-perestali-podderzhivat-glavnyj-open-source-bekap-po">pgBackRest перестали поддерживать — главный open-source бэкап PostgreSQL остался без мейнтейнера</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 27 Apr 2026 09:40:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если у вас на проде PostgreSQL под защитой <a href="https://github.com/pgbackrest/pgbackrest">pgBackRest</a> — обновлений и security-патчей больше не будет. Сегодня, 27 апреля 2026 года, автор инструмента <b>David Steele</b> добавил в README репозитория блок «NOTICE OF OBSOLESCENCE» и <a href="https://github.com/pgbackrest/pgbackrest">архивировал репозиторий</a> на GitHub.</p><p>pgBackRest — основной open-source инструмент резервного копирования и восстановления PostgreSQL последние ~10 лет: parallel backup, асинхронная архивация WAL, шифрование, поддержка S3/Azure/GCS-хранилищ, до десяти одновременно поддерживаемых major-версий Postgres (политика 5 supported + 5 EOL). Текущий стабильный релиз — <a href="https://github.com/pgbackrest/pgbackrest/releases/tag/release/2.58.0">v2.58.0</a>, выпущен в январе 2026.</p><ul><li>Дата объявления: 27 апреля 2026 года</li><li>Мейнтейнер: David Steele, 13 лет разработки</li><li>Репозиторий помечен archived — release-веток и патчей больше не будет</li><li>Текущий стабильный релиз: v2.58.0 (январь 2026)</li><li>Главные альтернативы: <a href="https://github.com/wal-g/wal-g">wal-g</a>, <a href="https://pgbarman.org/">Barman</a></li><li>Автор просит форки выбирать новое имя</li></ul><h2>Почему закрывают</h2><p>Прямой повод — продажа компании <a href="https://www.crunchydata.com/">Crunchy Data</a>, в которой David Steele работал и которая корпоративно спонсировала разработку pgBackRest. После сделки автор искал позицию, которая позволила бы продолжить работу над проектом, и параллельно собирал спонсорство — но обе попытки оказались безуспешны.</p><blockquote>pgBackRest 13 лет был моим личным проектом. После продажи Crunchy Data я искал позицию, позволяющую продолжать работу, и пытался собрать спонсорство — но усилий не хватило, чтобы сделать проект жизнеспособным. Как и всем остальным, мне нужно зарабатывать. Лучше сделать жёсткий стоп, чем тянуть проект кое-как.</blockquote><h2>Что это значит для пользователей</h2><p>Существующие установки продолжат работать — релиз v2.58.0 не отзывают. Но дальше будет так:</p><ul><li>Security-патчей больше нет. Если в pgBackRest найдут CVE, никто не выпустит фикс — придётся либо мигрировать, либо патчить самим в форке.</li><li>Поддержки следующих major-версий Postgres не будет. v2.58.0 уже поддерживает PG13–18, но когда выйдет PG19 (ожидается осенью 2026), pgBackRest не получит обновлённых WAL-форматов и сломается на новых кластерах.</li><li>Открытые issues (68 на момент архивации) останутся без ответов. Pull-request-ы тоже.</li><li>Документация на <a href="https://pgbackrest.org">pgbackrest.org</a> пока на месте, но судьба сайта после ухода автора неясна.</li></ul><h2>Альтернативы pgBackRest</h2><h3>wal-g</h3><p><a href="https://github.com/wal-g/wal-g">wal-g</a> — продолжатель WAL-E, создан в Citus Data в 2017 (Daniel Farina + Katie Li). Активная разработка сейчас спонсируется <a href="https://yandex.cloud/">Yandex Cloud</a>, поддерживается распределённой командой и сообществом. Поддерживает PostgreSQL, MySQL/MariaDB, MS SQL Server, MongoDB и Redis (последние два — beta). Бэкап в S3/GCS/Azure/Swift, параллельная обработка, delta-копии. Релизы выходят регулярно.</p><h3>Barman</h3><p><a href="https://pgbarman.org/">Barman</a> — инструмент от <a href="https://www.enterprisedb.com/">EDB</a> (бывший 2ndQuadrant). Делает full и incremental бэкапы, point-in-time recovery, поддерживает streaming-репликацию и WAL-archiving. Сильнее других ориентирован на on-prem-сценарии и enterprise-сетапы. У EDB есть коммерческие подписки на Barman — это снижает риск похожего сценария.</p><h3>pg_basebackup</h3><p><a href="https://www.postgresql.org/docs/current/app-pgbasebackup.html">pg_basebackup</a> — встроенный инструмент Postgres. Подходит для небольших БД, простых сетапов, разовых снимков. С PG17 умеет page-level incremental backup (через summarize_wal и pg_combinebackup), но без удобной обвязки. Не покроет parallel backup, multi-repo retention и продвинутые retention-полиси.</p><h2>Что делать прямо сейчас</h2><ol><li>Проверьте текущую версию pgBackRest на серверах: pgbackrest version</li><li>Подпишитесь на список рассылки <a href="https://www.postgresql.org/list/pgsql-announce/">pgsql-announce</a> — туда придут уведомления о CVE Postgres, требующих внимания и от backup-tooling.</li><li>Запланируйте миграцию на wal-g или Barman в течение 6–12 месяцев. До PG19 (релиз ожидается осенью 2026) — окно есть, после — будет жать.</li><li>Если рассматриваете форк pgBackRest — David Steele явно просит дать форку новое имя. Это не хулиганство, а защита пользователей от путаницы между поддерживаемой и заброшенной кодовой базой.</li><li>Перед миграцией протестируйте новый инструмент на staging: восстановление до точки, retention-полиси, скорость parallel backup на ваших объёмах. У wal-g и Barman разная философия — на каких-то нагрузках различия в скорости в разы.</li></ol><h2>Выводы</h2><p>История pgBackRest — это не «open-source умер», это про то, что donations и star-driven sponsorship не работают как модель устойчивости infrastructure-проектов. 13 лет работы, страница на <a href="https://github.com/sponsors/dwsteele">GitHub Sponsors</a> — и всё равно один человек на длинной дистанции не вытягивает. Backup-инструмент Postgres-уровня требует коммерческого стейкхолдера. У wal-g он есть (Yandex Cloud, исторически Citus Data), у Barman — <a href="https://www.enterprisedb.com/">EDB</a>, у pgBackRest был Crunchy Data, и его не стало. Похожую модель устойчивости open-source проектов мы недавно разбирали на примере <a href="https://tproger.ru/news/raswirenie-honker-vstroilo-v-sqlite-ochered-zadach-i-pub-sub">расширения honker для SQLite</a> — где спонсорство сразу зашито в распределённую команду.</p><p>Для DBA практический вывод простой: ревизия инфры на «один человек = один мейнтейнер = single point of failure» и проверка, кто поддерживает критичные инструменты — продуктовая компания или энтузиаст в свободное время.</p>]]></content:encoded>
    </item>
    <item>
      <title>Российские BI-платформы: обзор лучших решений для обработки, анализа и визуализации данных</title>
      <link>https://tproger.ru/articles/rossijskie-bi-platformy-obzor-luchwih-rewenij-dlya-obrabotki-ana</link>
      <comments>https://tproger.ru/articles/rossijskie-bi-platformy-obzor-luchwih-rewenij-dlya-obrabotki-ana?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rossijskie-bi-platformy-obzor-luchwih-rewenij-dlya-obrabotki-ana</guid>
      <description><![CDATA[<p>Протестировали BI-платформы по трём критериям: консолидация источников, дашборды без аналитика и автоматизация отчётов. Разбираем Visary BI, Visiology, DataLens и Luxms — с ценами и кейсами.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rossijskie-bi-platformy-obzor-luchwih-rewenij-dlya-obrabotki-ana">Российские BI-платформы: обзор лучших решений для обработки, анализа и визуализации данных</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Apr 2026 12:22:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы протестировали несколько платформ для работы с данными и смотрели на одно и то же: как справляются с консолидацией из разных источников, насколько легко собрать дашборд без аналитика и как настроить автоматизацию отчётов.</p><p>Инструменты в подборке закрывает эти задачи по-разному, поэтому для каждого разбираем не только список функций, но и где это работает.</p><h2>1. Visary BI: облачная BI-платформа для анализа и визуализации данных</h2><p><a href="https://npc.ba/development/bi?utm_source=tprog&amp;utm_medium=rate&amp;utm_campaign=bi">Visary BI</a> — платформа бизнес-аналитики от НПЦ «БизнесАвтоматика», в реестре отечественного ПО с декабря 2023 года (реестровый номер №20974). По данным TAdviser, система на втором месте по доле на российском рынке BI за 2022–2024 годы. Поставляется в двух форматах: облако с соответствием 152-ФЗ или серверный дистрибутив — для тех, у кого данные за периметр корпоративной сети не выходят.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/942c38db-e3a6-4ea9-86c9-06b76ef36346.webp" alt="" /></figure><h3>Что внутри</h3><p>В основе три инструмента: конструктор дашбордов, конструктор отчётов и визуальный конструктор запросов.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/ec9d6933-9650-4058-b9d4-da07aef5ab42.webp" alt="" /></figure><p>Конструктор запросов подходит — для аналитиков, которые в целом умеют писать SELECT, но не хотят разбираться в диалекте каждой конкретной базы. Объединить 1С, Excel и CRM в один источник можно визуально, без разработчика.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/04e8c047-4597-40a0-94f1-a97de36f28cd.webp" alt="" /></figure><p>No-code здесь топ-фича: источники данных добавляются без написания кода, связи между источниками настраиваются через визуальный конструктор. При необходимости поддерживается и стандартное написание SQL-запросов к БД. Периодичность обновления данных в дашбордах и отчётах задаётся системными настройками. Среднее время запуска, по данным вендора, около недели.</p><p>Отдельно стоит сказать про разграничение прав доступа — оно работает на трёх уровнях: система, дашборд, конкретный объект. Плюс полное логирование действий пользователей.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/4d19288b-3e7a-4d91-9dfd-a34822998498.webp" alt="" /><figcaption>Настройка доступа к дашборду</figcaption></figure><p>Из того, что встречается реже, чем хотелось бы в других BI-инструментах: интеграция с видеокамерами и компонент геоаналитики «Карта».</p><h3>Источники данных, интеграции и экспорт</h3><p>Для источника данных подключаются внешние ERP, WMS, 1С и другие системы: Visary BI поддерживает типовые коннекторы к реляционным СУБД (MS SQL, Oracle Database, PostgreSQL и др.), работает с файловыми форматами (Excel, CSV, Google Sheets и др.).</p><p>Из ОС поддерживаются Windows и AstraLinux — второе актуально для организаций, которые переходят на отечественный стек. Экспорт готовых отчётов — PDF, XLS, XLSX, DOCX, RTF, MHT, HTML, CSV, изображения.</p><p>Visary BI — часть экосистемы Visary Cloud, что это значит: корпоративный чат, видеосвязь, файловое хранилище и онлайн-редактор документов подключаются бесплатно в базовой поставке, а не продаются отдельными сервисами сверху. Если нужна трансформация данных перед загрузкой в BI — есть отдельный платный модуль Visary ETL.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/cb03d89e-c805-4eea-84b2-7d8d4c1d799a.webp" alt="" /></figure><h3>Где это используется</h3><p>Мы попросили вендора привести конкретные примеры, что уже происходило у клиентов.</p><p>Первый кейс — розничная сеть. Владелец нескольких точек не понимал, какие товары реально прибыльные с учётом логистики и акций: данные из 1С расходились с Excel, а сводить их вручную занимало несколько дней. Подключили оба источника и CRM. Аналитик за один рабочий день собрал дашборд с маржинальностью по категориям, выполнением плана по точкам и динамикой продаж.</p><p>Настроили ежедневную рассылку в Telegram — теперь руководитель видит актуальные данные без обращения к аналитику.  От подключения источников до рабочего дашборда — три дня.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/a6de40f6-6c0b-42b8-a92c-23a608c19385.webp" alt="" /><figcaption>Пример дашборда сводки продаж</figcaption></figure><p>Второй кейс — производственное предприятие. Три отдела работали в изоляции: производство в ERP, склад в WMS, бухгалтерия в MSSQL. Сводный P&amp;L собирался вручную две недели. После объединения источников через визуальный SQL-конструктор аналитики без помощи программистов создали OLAP-куб с разбивкой себестоимости по цехам, партиям сырья и временным периодам. Разграничили доступ: цех видит только свои показатели, финансисты — детализацию по статьям затрат, директор по производству — сводную. P&amp;L теперь формируется за один день вместо двух недель. Попутно нашли систематический перерасход сырья в одном из цехов — следующий квартал закрыли с экономией 15%.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/799675cc-f375-4a1f-b4ef-b6242bc77808.webp" alt="" /></figure><p>Пример дашборда мониторинга финансов</p><h3>Деньги</h3><p>Бесплатной версии нет. От 2 000 рублей за пользователя в месяц, тариф «Корпоратив» — 1 600 рублей. Полная сетка с детализацией по функциям — на <a href="https://visary.cloud/tariffs">visary.cloud/tariffs</a>. Оплата через расчётный счёт для юридических лиц.</p><p>Для небольших команд или тех, кто хочет сначала потрогать инструмент перед покупкой, — порог входа будет ощутимым. Бесплатного пробного периода в открытом доступе нет, условия уточняются у вендора напрямую.</p><h3>Поддержка и документация</h3><p>Поддержка работает по Telegram, почте и телефону. Документация на русском языке, видеоуроки в открытом доступе — можно разбираться самостоятельно. По запросу проводятся очные и онлайн-курсы, что актуально, когда нужно обучить несколько команд одновременно. В роадмапе — интеграция AI-инструментов для прогнозной и предиктивной аналитики, а также развитие концепции Action BI: система не только фиксирует проблему, но и предлагает действия для решения. Например, если заметит отставания по срокам — автоматически предложит собрать совещание или пересмотреть направление проекта.</p><h2>2. Visiology: корпоративная BI-платформа с собственным аналитическим движком</h2><p><a href="https://ru.visiology.su/" rel="nofollow">Visiology </a>работает с 2015 года. 500+ клиентов, 2000+ специалистов в сообществе. Трижды побеждала в «BI-круге Громова» (2019, 2021, 2022), взяла номинацию «Драйвер BI» на «Битве BI» при поддержке Минцифры и выиграла конкурс «Лучшие цифровые решения» Аналитического центра при Правительстве РФ.</p><h3>Что внутри</h3><p>В основе платформы аналитический движок ДанКо. Он берёт на себя хранение, вычисления и управление доступом, а поверх него работают два продуктовых модуля.</p><p><b>Visiology Dashboards</b> — среда для построения дашбордов и регламентных отчётов. Интерфейс работает в браузере на любой ОС. Поддерживается синтаксис DAX: аналитик строит сложные расчётные показатели прямо в конструкторе, без правок на уровне витрин DWH и без JS- или Python-кода. Новые представления создаются бизнес-пользователями в режиме конструктора — программирование не нужно. Виджеты переиспользуются между проектами или берутся из маркетплейса. По данным вендора, первый дашборд — через два дня после начала обучения.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/a922b308-3b5d-42fa-92ff-b0cd7a7cca0b.webp" alt="" /></figure><p><b>Visiology Smart Forms </b>закрывает задачу сбора данных с филиалов и подразделений. Форма открывается в браузере на компьютере или мобильном, вводить данные можно или вручную, или загрузкой Excel. Для каждого поля задаются допустимые значения и формат — выбросы система отправляет на уточнение до попадания в хранилище. После заполнения данные сразу попадают в ДанКо, без ручного импорта. Каждый пользователь видит только те ячейки, которые ему открыты по правам доступа.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/b5a53c3c-33a0-4d04-a3e1-8634f31beeb3.webp" alt="" /></figure><p>Разграничение прав работает на уровне движка ДанКо: RLS-политики применяются автоматически, один и тот же дашборд покажет аналитику полную картину, а рядовому сотруднику — только его данные.</p><h3>Источники данных, интеграции и экспорт</h3><p>Экспорт дашбордов: PDF, PPTX, PNG. Регламентные отчёты формируются на основе шаблона Excel и можно использовать для печати. Дашборды публикуются на любой внутренний или внешний портал.</p><h3>Экосистема</h3><p>Self-Service ETL закрывает предобработку данных до загрузки в ДанКо — без ETL-инженера. В маркетплейсе Visiology есть готовые виджеты и решения партнёров. Для крупных внедрений есть услуги архитектурного и стратегического сопровождения.</p><h3>Поддержка и документация</h3><p>YouTube-канал с обучающими материалами в открытом доступе, база знаний, документация, Telegram-сообщество — вендор называет его самым активным среди российских корпоративных BI-платформ. Есть учебник по Visiology 3, история релизов и публичная дорожная карта. Подготовка специалистов — при поддержке вендора.</p><h2>3. Yandex DataLens: облачный BI от Яндекса с встроенным ИИ-аналитиком</h2><p><a href="https://datalens.ru/" rel="nofollow">Yandex DataLens</a> — продукт Яндекса, включён в реестр отечественного ПО, работает на сертифицированной облачной платформе и часто проходит пентесты. Поставляется в двух форматах: облако с быстрым стартом или развёртывание в собственной инфраструктуре.</p><h3>Что внутри</h3><p>Конструктор визуализаций работает в браузере. Дашборды собираются в визуальном редакторе, без программирования, готовые шаблоны доступны в <a href="https://datalens.ru/gallery" rel="nofollow">Галерее</a> — 91 пример по категориям: продажи, маркетинг, HR, геоаналитика, маркетплейсы.</p><p>Для сложных расчётов есть встроенный DataLens Formula Language. Когда формульного подхода недостаточно — подключается Editor: JavaScript-кастомизация визуализаций и обработка данных кодом. Там же доступны API-коннекторы для работы с BI как с кодом.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/3e0588a2-545c-488e-bc55-a909ac1f8f5b.webp" alt="" /><figcaption>Источник: Fresh Go: Комплексная аналитика сервиса доставки</figcaption></figure><p>Отдельная фича, которая в других российских BI-системах пока редкость: встроенный ИИ-агент Нейроаналитик. Он создаёт вычисляемые поля в синтаксисе DataLens, пишет JavaScript для Editor и суммаризирует данные для быстрых инсайтов. Работает прямо в интерфейсе.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/e2ea02a8-130d-43c3-a0ad-1f4c2a8704c2.webp" alt="" /></figure><p>Права доступа настраиваются через SSO или Яндекс ID, гибко — для групп и отдельных пользователей.</p><h3>Источники данных, интеграции и экспорт</h3><p>Больше 30 источников: от загрузки Excel и CSV до нативных коннекторов к ClickHouse и другим СУБД. Модель данных описывается через схемы «звезда» и «снежинка» с оптимизацией связей или через нативный SQL там, где это нужно.</p><p>Экспорт дашбордов: PDF, PPTX, PNG. Готовые дашборды публикуются через iframe в корпоративные порталы, CRM и ERP. Рассылка — по расписанию или по событию, в том числе в Telegram. Интерфейс адаптирован под мобильные устройства.</p><h3>Экосистема</h3><p>Внешний вид платформы кастомизируется под корпоративный бренд. On-Premises поставляется как архив с Docker-контейнерами и Helm-чартами для развёртывания на k8s/k3s, с регулярными обновлениями и ранним доступом к новым функциям. Сеть из 30+ партнёров с сертифицированными специалистами берётся за внедрение под ключ.</p><h3>Деньги</h3><p>Два варианта. Облако — 990 рублей за рабочее место в месяц, для индивидуального использования бесплатно, пробный период 30 дней. On-Premises — от 1,6 млн рублей в год, доступна как годовая подписка, так и бессрочная лицензия.</p><h4>Поддержка и документация</h4><p>Telegram-сообщество насчитывает больше 14 000 участников — по этому показателю DataLens заявляет лидерство среди российских BI-платформ. Есть программа сертификации специалистов, вебинары и книга «От дашборда к системе: как построить операционную аналитику в компании» в открытом доступе. Поддержка облачной версии — от Yandex Cloud, on-premises — через авторизованных партнёров и дистрибьюторов.<br /></p><h2>4. Luxms BI: платформа бизнес-аналитики с 20-летней историей и лицензией ФСТЭК</h2><p><a href="https://luxmsbi.ru/" rel="nofollow">Luxms BI </a>— платформа ГК Luxms, работает на рынке больше 20 лет. Внесена в реестр российского ПО, имеет лицензию ФСТЭК на безопасную разработку — по этому показателю вендор заявляет первое место среди российских BI-систем. В рейтинге «Созвездие BI — 2025» платформа вошла в топ-3, заняла второе место по приросту функционала за год и первое по доле прироста в стратегии развития.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/d5190b95-ce3d-48b7-892a-b63ff9ea1acf.webp" alt="" /></figure><h3>Что внутри</h3><p>Платформа покрывает полный цикл работы с данными: получение и подготовка, встроенное хранилище, визуализация, отчётность, администрирование и кастомизация. Self-Service позволяет бизнес-пользователям строить дашборды самостоятельно.</p><p>Отдельный продукт внутри экосистемы — <b>Luxms Data Boring,</b> встроенный ETL/ELT-инструмент. Он закрывает задачу предобработки данных до загрузки в платформу. Есть даже поддержка write-back (обратная запись данных через формы ввода прямо в дашбордах), графовые базы данных для анализа связей, предиктивное обслуживание оборудования через интеграцию с IoT-датчиками.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-04-17/b33992aa-558d-49ca-83fc-840a89ec54ea.webp" alt="" /></figure><p>Безопасность настраивается через продвинутую ролевую модель с детализацией до уровня конкретного показателя. В системе есть полный аудит действий пользователей и функционал согласования данных по бизнес-правилам.</p><h3>Источники данных, интеграции и экспорт</h3><p>Платформа подключается к CRM, ERP, реляционным СУБД, Excel и внешним API. Есть совместимость с Arenadata Prosperity и Tantor Certified 15. Среди форматов работы с данными: массовая загрузка из Excel, реестровый сбор через веб-формы, интеграция с LoRaWAN-датчиками.</p><h3>Поддержка и документация</h3><p>Документация разделена на три роли: оператор, аналитик, администратор. Обучение проводится очно, есть официальный Telegram-канал и отдельное комьюнити для пользователей платформы. Услуги включают внедрение, техподдержку, технический аккаунт-менеджмент и миграцию с Qlik, Power BI и SAP.</p><h3>Вместо вывода</h3><p>На что смотреть в первую очередь: формат поставки, скорость первого результата и стоимость владения с учётом всей команды, а не одного аналитика. Разница между «попробовать» и «внедрить» здесь бывает ощутимой — у части платформ бесплатного периода нет вообще, условия уточняются только через запрос.</p><p>Если нужна точка входа и быстрое решение: Visary BI стартует от 2 000 рублей за пользователя в месяц, среднее время от подключения источников до рабочего дашборда по данным вендора — около трёх дней. Для команды, которая хочет сначала увидеть результат, а потом принимать решение о масштабировании, это конкретный ориентир. Остальное зависит от задачи: объём данных, инфраструктурные требования, нужен ли ETL внутри платформы или он уже есть.</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>Паттерны управления трафиком к PostgreSQL в production</title>
      <link>https://tproger.ru/translations/patterny-upravleniya-trafikom-k-postgresql-v-production</link>
      <comments>https://tproger.ru/translations/patterny-upravleniya-trafikom-k-postgresql-v-production?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/patterny-upravleniya-trafikom-k-postgresql-v-production</guid>
      <description><![CDATA[<p>Практические паттерны на Go для контроля нагрузки на Postgres: SQLCommenter-теги, изоляция сервисов через роли, лимиты по тарифам и обработка SQLSTATE 53000. Разбираем с кодом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/patterny-upravleniya-trafikom-k-postgresql-v-production">Паттерны управления трафиком к PostgreSQL в production</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 Apr 2026 11:30:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Один неудачный аналитический запрос способен положить весь checkout. PlanetScale предлагает решение — Database Traffic Control: ресурсные бюджеты для разных «слоёв» трафика к Postgres. Разбираем паттерны на Go, которые можно перенести на любой стек.</p><ul><li>SQLCommenter — формат тегов в SQL-комментариях, по которым Traffic Control различает запросы</li><li>Изоляция микросервисов через Postgres-роли и application_name</li><li>Автоматическая маркировка запросов по HTTP-роутам через middleware</li><li>Контроль новых деплоев и фича-флагов через теги feature</li><li>Tier-based лимиты для мультитенантных SaaS-приложений</li><li>Обработка ошибки SQLSTATE 53000 при блокировке запроса</li></ul><p><i>Перевод статьи <a href="https://planetscale.com/blog/patterns-for-postgres-traffic-control">Patterns for Postgres Traffic Control</a> Джоша Брауна из блога PlanetScale.</i></p><h2>Настройка: SQLCommenter и передача тегов через контекст</h2><p>Большинство паттернов опираются на пользовательские теги, прикреплённые к запросам. Traffic Control читает их в формате <a href="https://google.github.io/sqlcommenter/">SQLCommenter</a> — это SQL-комментарий с URL-кодированными парами ключ=значение, добавляемый в конец запроса:</p><p>Эти теги затем доступны для правил Traffic Control. Вот минимальный хелпер на Go, который добавляет теги в этом формате:</p><p>Если вы используете pgx с включённым PrepareThreshold, комментарий SQLCommenter станет частью ключа кэша prepared statement. Это может привести к разрастанию кэша планов. Решение — отключить PrepareThreshold для подключений с тегированием или использовать SimpleProtocol.</p><p>Примеры кода рассчитаны на Go 1.22+. В частности, r.Pattern (поле http.Request) и range по целому числу (for attempt := range maxRetries) появились именно в этой версии.</p><p>Также понадобится способ пробрасывать теги через стек вызовов без изменения каждой сигнатуры функции. Ключ контекста отлично подходит для этого:</p><p>С этими двумя хелперами паттерны ниже просто устанавливают ключи и значения в контексте. Тегирование происходит автоматически при выполнении запроса.</p><h2>Изоляция сервисов через Postgres-роли</h2><p>В микросервисной архитектуре один «взбесившийся» сервис не должен деградировать все остальные сервисы, использующие ту же базу данных. Простейший способ изолировать сервис — создать правило Traffic Control на основе уникальной строки подключения или application_name.</p><p>Бюджет на username='pscale_api_123abc' изолирует весь трафик от этой роли. Это также помогает при инцидентах — можно мгновенно ограничить долю ресурсов сервиса без передеплоя.</p><p>Имя пользователя — это внутреннее Postgres-имя роли, а не имя роли в дашборде. Также можно целиться в кастомные роли, созданные через CREATE ROLE, если ваши микросервисы строго разделяют права на таблицы.</p><p>Также можно использовать application_name, добавив его к строке подключения:</p><h2>Маркировка запросов по HTTP-роутам</h2><p>Когда вы запускаете монолит или крупный API-сервис, проблема обычно не в целом сервисе — а в конкретных роутах. Эндпоинт /api/export, генерирующий CSV-отчёты, не должен убивать /api/checkout.</p><p>HTTP-middleware может инжектировать роут в контекст во время выполнения, до запуска любого обработчика:</p><p>Оберните вызовы к базе данных, чтобы они автоматически подхватывали теги:</p><p>Теперь каждый запрос несёт информацию о роуте, из которого пришёл. Можно создать бюджет Traffic Control для route='/api-export' и задать ему консервативный лимит CPU.</p><p>Это также упрощает управление инцидентами. Если вы видите всплеск и не знаете, какой роут виноват — график нарушений в Traffic Control покажет, какой именно тег route достигает лимитов.</p><h2>Фича-флаги и новые деплои</h2><p>Выкатка новой фичи в production всегда несёт риск. Может, новый паттерн запросов нормально работает под тестовой нагрузкой, но становится дорогим на масштабе. Traffic Control позволяет ограничить радиус поражения до того, как ситуация превратится в инцидент.</p><p>Простейшая версия устанавливает тег из переменной окружения при старте:</p><p>Установите DEPLOYMENT_TAG=new_checkout_v2 при раскатке новых подов и оставьте переменную пустой на старых. Traffic Control может иметь бюджет на feature='new_checkout_v2' в режиме Warn с первого дня — так вы увидите, как новый код себя ведёт, прежде чем он вызовет проблемы.</p><p>Для фича-флагов, управляемых в рантайме, подход тот же, но определяется результатом проверки флага:</p><h2>Tier-based лимиты для мультитенантных приложений</h2><p>В SaaS-приложении пользователи бесплатного тарифа не должны деградировать работу enterprise-клиентов. Traffic Control позволяет обеспечить это на уровне базы данных, а не только на уровне приложения.</p><p>Инжектируйте тариф пользователя в SQL-теги сразу после аутентификации:</p><p>В middleware аутентификации:</p><p>Теперь создайте два бюджета Traffic Control:</p><ul><li>tier='free' — консервативные лимиты на долю сервера и максимальное число параллельных запросов</li><li>tier='pro' — умеренные лимиты</li></ul><p>Enterprise-трафик оставьте без бюджета или задайте высокий потолок. Когда пользователь бесплатного тарифа запускает тяжёлый дашборд или триггерит медленный запрос — бюджет сбросит этот трафик до того, как он затронет enterprise-нагрузки.</p><p>Паттерны можно комбинировать. Бюджет tier='free' AND route='api-export' будет строже, чем бюджет только на tier='free'. Enterprise-экспорты получат больше ресурсов, чем бесплатные.</p><h2>Фоновые задачи и скрипты</h2><p>Фоновые задачи — частая причина инцидентов с базой данных. Миграция, ночная синхронизация или одноразовый бэкфилл данных могут случайно насытить БД, если выполняются быстрее ожидаемого. Traffic Control — чистый способ задать потолок ресурсов без настройки таймаутов на уровне каждого запроса.</p><p>Для долгоживущих фоновых воркеров используйте выделенный пул подключений с отдельным application_name:</p><p>Функция newJobDB принимает DSN базы и устанавливает application_name в background-jobs перед подключением. Максимум подключений ограничен четырьмя, чтобы фоновая задача не занимала больше воркеров, чем положено.</p><p>Установка application_name на уровне строки подключения в коде гарантирует, что имя всегда задано для этого сервиса — независимо от конкретного запроса или переменных окружения. Это можно комбинировать с SQL-комментариями для ещё более гранулярного контроля.</p><p>Для одноразовых скриптов и миграций — аналогичный подход. Здесь идентичность скрипта кодируется прямо в строке подключения:</p><p>Создайте бюджет Traffic Control для application_name='background-jobs' в режиме Warn. Понаблюдайте, сколько ресурсов базы обычно потребляет фоновая работа. Затем переключите на Enforce, чтобы ограничить её на уровне, при котором она не сможет вытеснить интерактивный трафик.</p><h2>Обработка заблокированных запросов</h2><p>Когда Traffic Control в режиме Enforce и запрос превышает бюджет, Postgres возвращает SQLSTATE 53000 с сообщением, начинающимся с [PGINSIGHTS] Traffic Control:. Приложение должно обрабатывать это без падения.</p><p>С pgx/v5:</p><p>Правильная реакция зависит от роли запроса в приложении. Для некритичных нагрузок — аналитики, отчётов — возвращайте 503 или закэшированный результат:</p><p>Для критичных путей можно реализовать короткий retry с экспоненциальным backoff:</p><h3>Наблюдение за Warn-режимом</h3><p>Прежде чем переключить бюджет в Enforce, запустите его в режиме Warn. В этом режиме запросы выполняются успешно, но драйвер получает Postgres-notice. С pgx/v5 можно логировать их, чтобы понять, что именно будет заблокировано:</p><p>Соберите логи за несколько часов репрезентативного трафика. Паттерн срабатываний подскажет, нужно ли корректировать лимиты.</p><h2>Собираем всё вместе</h2><p>Паттерны компонуются. В реальном приложении можно наслоить несколько из них:</p><p>Traffic Control видит всё это как комбинацию тегов. Бюджет на tier='free' покрывает весь free-трафик независимо от роута. Бюджет на route='api-export' AND tier='free' — конкретную комбинацию. Несколько совпадающих бюджетов применяются одновременно, и запрос должен удовлетворять каждому из них.</p><p>Начните в режиме Warn, понаблюдайте, какие бюджеты срабатывают при нормальной нагрузке, ужесточайте лимиты, пока не будут триггериться только патологические случаи — затем переключите на Enforce.</p><h2>Выводы</h2><p>Разница между падением базы и деградированным опытом часто сводится к тому, решили ли вы заранее, какой трафик сбрасывать. Traffic Control делает это решение явным и конфигурируемым — вместо того чтобы оставлять его на милость гонки за ресурсы.</p><p>Полный текст оригинальной статьи — в <a href="https://planetscale.com/blog/patterns-for-postgres-traffic-control">блоге PlanetScale</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>SQL: полный путеводитель — от первых запросов до оконных функций</title>
      <link>https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij</link>
      <comments>https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij</guid>
      <description><![CDATA[<p>Полный гайд по SQL: команды, транзакции ACID, нормализация, оконные функции, PostgreSQL, защита от инъекций. Разберитесь в SQL от нуля до уверенного уровня.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij">SQL: полный путеводитель — от первых запросов до оконных функций</a>»</p>]]></description>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 Apr 2026 03:12:28 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>SQL</b> (Structured Query Language) — язык запросов для работы с реляционными базами данных, который появился больше 50 лет назад и остаётся одним из самых востребованных навыков в IT. По данным <a href="https://survey.stackoverflow.co/2024/technology/">Stack Overflow Developer Survey 2024</a>, SQL стабильно входит в тройку самых используемых языков — его применяют бэкендеры, аналитики данных, дата-инженеры и тестировщики.</p><p>Этот путеводитель — не просто список ссылок. Каждая секция содержит самостоятельный разбор темы: от истории SQL и принципов работы реляционных баз до транзакций, нормализации и защиты от инъекций. Там, где тема заслуживает глубокого погружения, мы даём ссылку на отдельную статью. Цель — дать полную карту знаний, по которой можно выстроить обучение от нуля до уверенного уровня.</p><p>— SQL — фундаментальный навык для любого, кто работает с данными: от джуна до архитектора</p><p>— Основные команды (SELECT, JOIN, GROUP BY) покрывают 80% повседневных задач</p><p>— Порядок выполнения запроса (FROM → WHERE → GROUP BY → SELECT) — ключ к пониманию SQL</p><p>— Транзакции, ACID и уровни изоляции гарантируют надёжность данных</p><p>— Оконные функции, CTE и хранимые процедуры — продвинутый уровень для карьерного роста</p><p>— PostgreSQL — СУБД №1 в 2024 по Stack Overflow Survey, обогнавшая MySQL</p><p>— SQL не устареет: стандарт развивается, появляются JSON-запросы и графовый SQL</p><h2>Что такое SQL и зачем его учить</h2><p><b>SQL</b> (Structured Query Language) — декларативный язык для работы с реляционными базами данных. «Декларативный» означает, что вы описываете <i>что</i> хотите получить, а не <i>как</i> это сделать. Вы пишете «дай мне все заказы за март», а СУБД сама решает, в каком порядке обходить таблицы и какие индексы использовать.</p><p>Краткая история: в 1970 году Эдгар Кодд из IBM опубликовал реляционную модель данных. В 1974 Дональд Чемберлин и Рэймонд Бойс создали язык SEQUEL (Structured English Query Language) для работы с этой моделью. Позже его переименовали в SQL из-за торговой марки. В 1986 году ANSI принял SQL как стандарт, а последняя версия — SQL:2023 — добавила поддержку JSON и графовых запросов.</p><p>Его используют бэкендеры, аналитики, дата-инженеры и даже тестировщики. И в обозримом будущем SQL никуда не денется — язык продолжает развиваться вместе со стандартом.</p><h2>Как работает SQL: от запроса до результата</h2><p>Когда вы отправляете SQL-запрос, внутри СУБД происходит цепочка шагов:</p><ol><li><b>Парсинг</b> — СУБД разбирает текст запроса, проверяет синтаксис и строит дерево разбора</li><li><b>Анализ</b> — проверяет, существуют ли таблицы и столбцы, есть ли у пользователя права доступа</li><li><b>Оптимизация</b> — самый важный этап. Оптимизатор строит несколько вариантов плана выполнения и выбирает самый дешёвый по стоимости (I/O, CPU, память)</li><li><b>Выполнение</b> — движок исполняет выбранный план: сканирует таблицы, применяет фильтры, объединяет результаты</li><li><b>Возврат результата</b> — СУБД формирует набор строк и отправляет клиенту</li></ol><h3>Логический порядок выполнения запроса</h3><p>SQL-запрос пишется в одном порядке, а выполняется в другом. Вот реальная последовательность обработки:</p><ol><li>FROM / JOIN — определяется источник данных, выполняются соединения</li><li>WHERE — фильтрация строк (до группировки)</li><li>GROUP BY — группировка</li><li>HAVING — фильтрация групп (после группировки)</li><li>WINDOW — вычисление оконных функций</li><li>SELECT — выбор столбцов, вычисление выражений и алиасов</li><li>DISTINCT — удаление дублей</li><li>ORDER BY — сортировка (по стандарту SQL единственное место, где гарантированно работает алиас из SELECT (в PostgreSQL и MySQL алиасы также работают в GROUP BY))</li><li>LIMIT / OFFSET — ограничение количества строк</li></ol><p>Из-за этого порядка нельзя использовать алиас из SELECT в WHERE — на момент фильтрации SELECT ещё не выполнен. А HAVING работает после GROUP BY, поэтому в нём доступны агрегатные функции.</p><p>Именно благодаря оптимизатору SQL остаётся эффективным: вы пишете простой запрос, а СУБД сама выбирает, использовать ли индекс, в каком порядке объединять таблицы, нужна ли сортировка. Увидеть план выполнения можно командой EXPLAIN ANALYZE — это один из главных инструментов оптимизации.</p><h2>Основные команды SQL</h2><p>Любое знакомство с SQL начинается с четвёрки CRUD: SELECT (чтение), INSERT (создание), UPDATE (изменение), DELETE (удаление). К ним добавляются DDL-команды для управления структурой: CREATE TABLE, ALTER TABLE, DROP TABLE, TRUNCATE TABLE (быстрое удаление всех строк без логирования каждой).</p><p>Реальная мощь SQL раскрывается в объединениях через JOIN (INNER, LEFT, RIGHT, FULL), группировке с GROUP BY и фильтрации агрегатов через HAVING. Пример: найти средний чек по городам, где было больше 100 заказов: А также CROSS JOIN (декартово произведение всех строк) и SELF JOIN (соединение таблицы с собой — например, для поиска сотрудников и их руководителей).</p><p>На практике эти команды покрывают примерно 80% задач. Полный разбор с примерами — в нашем <a href="https://tproger.ru/translations/sql-recap">гайде по основным командам SQL</a>. Статью прочитали полтора миллиона раз.</p><h2>Типы данных и ограничения SQL</h2><p>Правильный выбор типов данных — основа производительной и надёжной базы. Базовые типы SQL:</p><ul><li><b>Числовые:</b> INTEGER, BIGINT, DECIMAL(10,2), FLOAT</li><li><b>Строковые:</b> VARCHAR(255), TEXT, CHAR(10)</li><li><b>Дата и время:</b> DATE, TIMESTAMP, INTERVAL</li><li><b>Логический:</b> BOOLEAN</li><li><b>JSON:</b> JSON / JSONB (PostgreSQL) — для полуструктурированных данных</li></ul><p>Ограничения (constraints) — это правила, которые СУБД проверяет автоматически при каждой вставке и обновлении:</p><p>PRIMARY KEY гарантирует уникальность строки. FOREIGN KEY связывает таблицы и не даёт создать «висячие» ссылки. NOT NULL запрещает пустые значения. CHECK валидирует данные по условию. Вместе эти ограничения защищают целостность данных на уровне структуры — СУБД не позволит вставить строку, нарушающую правила.</p><h2>Операторы и выражения</h2><p>За базовыми командами идут операторы, которые делают запросы по-настоящему гибкими. WHERE фильтрует строки, LIKE ищет по шаблону с подстановочными знаками (% — любая подстрока, _ — один символ), IN проверяет вхождение в список, BETWEEN задаёт диапазон.</p><p>Отдельного внимания заслуживает CASE WHEN — условная логика прямо внутри запроса:</p><p>Подробный разбор LIKE с примерами — в <a href="https://tproger.ru/articles/like-sql">отдельной статье</a>.</p><h3>NULL: подводные камни</h3><p>NULL — не значение, а отсутствие значения. NULL = NULL возвращает не TRUE, а NULL. Единственный способ проверки — IS NULL / IS NOT NULL.</p><h3>Функции даты и времени</h3><p>Работа с датами — повседневная задача аналитика:</p><ul><li>NOW() / CURRENT_DATE — текущий момент / дата</li><li>DATE_TRUNC('month', ts) — округление до начала периода</li><li>EXTRACT(YEAR FROM ts) — извлечение части даты</li><li>ts + INTERVAL '7 days' — арифметика с датами</li></ul><h3>Строковые и математические функции</h3><p>Помимо дат и агрегатов, SQL предоставляет богатый набор функций для работы со строками и числами. Строковые функции: CONCAT — склейка строк, SUBSTRING — извлечение подстроки, LENGTH — длина строки, UPPER / LOWER — смена регистра, REPLACE — замена подстроки, TRIM — удаление пробелов по краям. Математические: ROUND — округление, ABS — модуль числа, CEIL / FLOOR — округление вверх и вниз. Эти функции работают одинаково в PostgreSQL, MySQL и других СУБД (с минимальными различиями в именах).</p><h3>Операторы множеств: UNION, INTERSECT, EXCEPT</h3><p>Эти операторы объединяют результаты нескольких запросов:</p><ul><li>UNION — объединение с удалением дубликатов. UNION ALL — без удаления (быстрее)</li><li>INTERSECT — пересечение (строки из обоих запросов)</li><li>EXCEPT — разность (строки из первого, которых нет во втором)</li></ul><h2>Агрегатные функции SQL</h2><p>Агрегатные функции вычисляют одно значение по набору строк: COUNT, SUM, AVG, MIN, MAX. Работают в связке с GROUP BY.</p><p>Нюансы, которые часто путают:</p><ul><li>COUNT(*) считает все строки (включая NULL). COUNT(column) — только строки, где column не NULL</li><li>COUNT(DISTINCT column) — количество уникальных значений</li><li>AVG игнорирует NULL — если NULL означает «0», результат будет завышен</li></ul><h2>Подзапросы, CTE и представления</h2><p>Когда запрос становится сложным, его нужно декомпозировать. Для этого есть три инструмента.</p><h3>Подзапросы</h3><p>Запрос внутри запроса. Бывают скалярные (возвращают одно значение), табличные (набор строк) и коррелированные (ссылаются на внешний запрос):</p><h3>CTE (Common Table Expressions)</h3><p>Конструкция WITH позволяет дать имя подзапросу и переиспользовать его. CTE делают сложные запросы читаемыми, а рекурсивные CTE позволяют обходить деревья и графы:</p><h3>Рекурсивные CTE</h3><p>Рекурсивные CTE обходят деревья и графы — например, оргструктуру компании или вложенные категории:</p><h3>Представления (Views)</h3><p>CREATE VIEW создаёт «виртуальную таблицу» — именованный запрос, к которому можно обращаться как к обычной таблице. Это удобно для инкапсуляции сложной логики и разграничения доступа. Материализованные представления (MATERIALIZED VIEW в PostgreSQL) хранят результат физически и обновляются по команде — полезно для тяжёлых аналитических запросов.</p><h2>Хранимые процедуры и функции</h2><p>Хранимые процедуры и функции — SQL-код, сохранённый на сервере СУБД. Функция возвращает значение и вызывается в SELECT, процедура выполняет действия и вызывается через CALL.</p><p>Когда использовать:</p><ul><li>Инкапсуляция бизнес-логики на уровне базы (расчёт скидок, начисление бонусов)</li><li>Повторяющиеся многошаговые операции (ежемесячные отчёты, архивация)</li><li>Безопасность: SECURITY DEFINER позволяет давать доступ к функции, не давая доступ к таблицам</li></ul><p>Когда <b>не</b> использовать:</p><ul><li>Логику приложения лучше держать в коде — её проще тестировать и деплоить</li><li>Тяжёлые вычисления: масштабировать сервер СУБД дороже, чем сервер приложения</li><li>Бизнес-логика, которая часто меняется — миграции хранимых процедур болезненнее, чем код</li></ul><p>Триггеры — особый тип: они срабатывают автоматически при INSERT/UPDATE/DELETE. Полезны для аудита (логировать все изменения) и автоматических вычислений, но злоупотреблять не стоит — скрытая логика усложняет отладку.</p><h2>Оконные функции SQL</h2><p>Оконные функции — это то, что отделяет новичка от уверенного SQL-разработчика. Они выполняют вычисления по «окну» строк, не сворачивая результат как GROUP BY. Вы получаете и агрегат, и исходные строки одновременно.</p><p>Ключевые функции: ROW_NUMBER() для нумерации, RANK() / DENSE_RANK() для ранжирования, LAG() / LEAD() для сравнения с соседними строками, агрегатные функции с OVER() для скользящих средних и нарастающих итогов.</p><p>Типичные задачи: топ-N в каждой группе, рост метрики месяц к месяцу, скользящее среднее за 7 дней. Без оконных функций эти задачи требуют громоздких подзапросов.</p><p>RANK() пропускает позиции после одинаковых значений (1, 2, 2, 4), а DENSE_RANK() — нет (1, 2, 2, 3). Для скользящих агрегатов используется конструкция ROWS BETWEEN — например, ROWS BETWEEN 6 PRECEDING AND CURRENT ROW для скользящего среднего за 7 дней.</p><p>Детальный разбор с визуальными примерами — в нашей <a href="https://tproger.ru/translations/sql-window-functions">статье об оконных функциях SQL</a>.</p><h2>Транзакции и ACID в SQL</h2><p>Транзакция — группа операций, которые выполняются как единое целое: либо всё, либо ни одна. Классический пример — перевод денег:</p><p>Если между двумя UPDATE произойдёт сбой, ROLLBACK откатит обе операции — деньги не потеряются и не удвоятся. Для частичного отката используется SAVEPOINT: можно откатить транзакцию не целиком, а до определённой точки (ROLLBACK TO SAVEPOINT имя).</p><p>Свойства ACID гарантируют надёжность транзакций:</p><ul><li><b>Atomicity</b> (атомарность) — транзакция неделима: либо выполнена полностью, либо отменена целиком</li><li><b>Consistency</b> (согласованность) — после транзакции база остаётся в корректном состоянии, все ограничения соблюдены</li><li><b>Isolation</b> (изоляция) — параллельные транзакции не мешают друг другу. Уровни: от READ UNCOMMITTED (быстро, но грязные чтения) до SERIALIZABLE (безопасно, но медленно)</li><li><b>Durability</b> (долговечность) — после COMMIT данные сохранены даже при аварии сервера</li></ul><p>ACID — фундамент надёжности реляционных баз данных. Именно эти свойства гарантируют, что данные не потеряются и не «рассинхронятся» даже при сбоях и параллельных запросах.</p><h3>Уровни изоляции</h3><p>Свойство Isolation на практике настраивается через уровни изоляции. Каждый уровень — компромисс между корректностью и производительностью:</p><ul><li><b>READ UNCOMMITTED</b> — самый слабый: видны незакоммиченные изменения других транзакций (dirty reads). Практически не используется</li><li><b>READ COMMITTED</b> — видны только закоммиченные данные. <b>По умолчанию в PostgreSQL</b>. Достаточно для большинства приложений</li><li><b>REPEATABLE READ</b> — повторное чтение строки всегда даёт тот же результат. <b>По умолчанию в MySQL</b>. Защищает от non-repeatable reads</li><li><b>SERIALIZABLE</b> — максимальная изоляция, транзакции ведут себя как последовательные. Нужен для финансовых операций и бронирований</li></ul><h2>Нормализация и проектирование схем</h2><p>Нормализация — процесс организации таблиц так, чтобы минимизировать дублирование данных и аномалии при вставке, обновлении и удалении.</p><p>Три ключевые нормальные формы:</p><ol><li><b>1NF</b> — каждая ячейка содержит одно атомарное значение. Никаких «Москва, Питер» в одном поле — разносим по строкам или связанным таблицам</li><li><b>2NF</b> — все неключевые столбцы зависят от всего первичного ключа, а не от его части. Актуально для составных ключей</li><li><b>3NF</b> — неключевые столбцы не зависят друг от друга. Если город определяет страну, нужна отдельная таблица городов</li></ol><p>Пример: таблица заказов до и после нормализации до 3NF:</p><p>В этом примере мы устранили дублирование данных клиента (2NF). Для полной 3NF нужно было бы вынести и города в отдельную таблицу, если город определяет дополнительные атрибуты (страну, регион).</p><p>На практике большинство баз проектируют в 3NF. Но иногда данные намеренно денормализуют — например, в аналитических хранилищах (OLAP), где скорость чтения важнее экономии места. Схемы «звезда» и «снежинка» в data warehouse — это контролируемая денормализация.</p><h2>Производительность и оптимизация</h2><p>Когда таблица вырастает до миллионов строк, наивные запросы начинают тормозить. Первый инструмент диагностики — EXPLAIN ANALYZE: он показывает, какой план выбрал оптимизатор, сколько строк просканировал и где узкое место.</p><p>Типичные антипаттерны:</p><ul><li>SELECT * вместо конкретных столбцов — читает больше данных, чем нужно</li><li>Отсутствие индекса на столбцах в WHERE и JOIN — приводит к полному сканированию таблицы (Seq Scan)</li><li>Функции на индексированных столбцах: WHERE UPPER(email) = ... — индекс не используется</li><li>N+1 запросы из ORM — 1 запрос за список + N запросов за детали каждой записи</li></ul><p>Индексы — главный способ ускорения. B-tree индекс (по умолчанию) подходит для большинства задач: точные совпадения, диапазоны, сортировка. PostgreSQL также поддерживает GiST (геоданные), GIN (полнотекстовый поиск, JSONB) и BRIN (временные ряды).</p><p>Глубокий разбор типов индексов и их применения — в <a href="https://tproger.ru/articles/indeksy-v-postgresql">нашей статье об индексах PostgreSQL</a>.</p><h2>Безопасность: SQL-инъекции</h2><p>SQL-инъекция — одна из самых опасных уязвимостей веб-приложений, стабильно входящая в <a href="https://owasp.org/Top10/">OWASP Top 10</a>. Суть: если пользовательский ввод подставляется в запрос без обработки, злоумышленник может изменить логику запроса.</p><p>Классический пример — форма логина:</p><p>Защита проста и надёжна — <b>параметризованные запросы</b> (prepared statements):</p><p>Пароли в реальных приложениях никогда не хранят и не сравнивают в открытом виде — их хешируют (bcrypt, argon2), а проверку выполняет код приложения, не SQL-запрос.</p><p>При использовании ORM (SQLAlchemy, Django ORM, Prisma) параметризация происходит автоматически. Если пишете raw SQL — никогда не вставляйте пользовательский ввод через конкатенацию строк или f-строки.</p><h3>Управление доступом: GRANT и REVOKE</h3><p>Вторая линия защиты — принцип минимальных привилегий. Приложению не нужен суперпользователь базы данных:</p><p>REVOKE отзывает права. В PostgreSQL также доступна Row-Level Security (RLS) — ограничение видимости строк в зависимости от роли: каждый менеджер видит только своих клиентов.</p><h2>Современный SQL: JSON, диалекты и стандарт SQL:2023</h2><p>SQL — не замороженный язык из 80-х. Стандарт активно развивается, и последняя версия SQL:2023 (опубликована в июне 2023) принесла два крупных нововведения:</p><ul><li><b>SQL/JSON</b> — стандартизированные функции для работы с JSON прямо в SQL-запросах. PostgreSQL поддерживает JSONB с 2014 года, а теперь аналогичные возможности появляются и в других СУБД</li><li><b>SQL/PGQ</b> (Property Graph Queries) — графовые запросы внутри SQL. Можно искать пути и паттерны в связанных данных без отдельной графовой базы</li></ul><p>На практике каждая СУБД имеет свой диалект:</p><ul><li><b>PostgreSQL</b> — PL/pgSQL, JSONB, массивы, расширения (PostGIS, pg_trgm). Ближе всего к стандарту</li><li><b>MySQL</b> — оконные функции появились поздно — только в версии 8.0 (2018), LIMIT вместо FETCH FIRST</li><li><b>T-SQL</b> (Microsoft SQL Server) — TOP вместо LIMIT, IDENTITY вместо SERIAL, мощные CTE</li><li><b>PL/SQL</b> (Oracle) — ROWNUM, CONNECT BY для иерархий, пакеты (packages)</li><li><b>Cloud SQL</b> — BigQuery, Redshift, Snowflake имеют свои расширения, но базовый SQL везде одинаков</li></ul><p>Хорошая новость: базовый синтаксис (SELECT, JOIN, GROUP BY, оконные функции) одинаков во всех диалектах. Освоив стандартный SQL на PostgreSQL, вы легко перейдёте на любую другую СУБД.</p><h2>PostgreSQL и MySQL</h2><h3>PostgreSQL</h3><p>PostgreSQL — самая популярная реляционная СУБД для новых проектов. Полная поддержка SQL-стандарта, JSONB для полуструктурированных данных, расширения (PostGIS для геоданных, pg_trgm для нечёткого поиска), продвинутая система типов и отличная производительность.</p><p>15 самых полезных команд PostgreSQL — от размера базы до профилирования запросов — в нашей <a href="https://tproger.ru/translations/useful-postgresql-commands">подборке</a>. А для оптимизации больших таблиц — <a href="https://tproger.ru/articles/indeksy-v-postgresql">разбор индексов PostgreSQL</a>.</p><h3>MySQL</h3><p>MySQL — одна из старейших популярных open-source СУБД, движок WordPress и множества legacy-систем. Проще в настройке, но имеет подводные камни: неявное приведение типов, особенности GROUP BY, различия между InnoDB и MyISAM.</p><p>Самые частые ошибки — от кодировок до потери данных — в нашей <a href="https://tproger.ru/translations/troubleshoot-common-errors-in-mysql">статье о типичных ошибках MySQL</a>.</p><h2>Выбор СУБД: SQL vs NoSQL</h2><p>SQLite — для встраиваемых сценариев: мобильные приложения, Electron, edge computing, прототипы (вся база в одном файле). MySQL — проверенный выбор для веб-приложений, на нём работают GitHub и Booking.com. PostgreSQL — универсальный вариант для новых проектов, от стартапов до enterprise. Детальное сравнение с бенчмарками — в <a href="https://tproger.ru/translations/sqlite-mysql-postgresql-comparison">нашем обзоре трёх СУБД</a>.</p><p>Когда данные неструктурированные или нужна горизонтальная масштабируемость, рассмотрите NoSQL: MongoDB (документы), Redis (ключ-значение), Cassandra (колонки), Neo4j (графы). Подробнее — в <a href="https://tproger.ru/translations/sql-nosql-database-models">статье о моделях баз данных</a>.</p><h2>SQL на собеседованиях</h2><p>SQL-вопросы — обязательная часть собеседований для бэкенд-разработчиков, аналитиков и дата-инженеров. Типичный формат: дают схему из 2–3 таблиц и просят написать запрос. Темы: JOIN-ы, GROUP BY, оконные функции, подзапросы, нормализация.</p><p>Ключ к успеху — практика на реальных задачах. Интервьюеры оценивают умение декомпозировать задачу, выбрать правильный тип JOIN и грамотно обработать NULL.</p><p>27 самых распространённых вопросов с ответами — в <a href="https://tproger.ru/articles/sql-interview-questions">нашей подборке</a>. Для практики — <a href="https://tproger.ru/articles/5-zadanij-po-sql-s-realnyh-sobesedovanij">5 заданий с реальных собеседований</a> с разбором решений.</p><h2>Куда двигаться дальше</h2><p>SQL — это фундамент, но не потолок. Направления для роста:</p><ol><li><b>Администрирование БД</b> — репликация, бэкапы, мониторинг, настройка производительности</li><li><b>Дата-инженерия</b> — ETL-пайплайны, dbt, Airflow, data warehouse (BigQuery, Snowflake)</li><li><b>Аналитика данных</b> — SQL + Python (pandas), визуализация, A/B-тесты</li><li><b>Бэкенд-разработка</b> — ORM (SQLAlchemy, Prisma, GORM), миграции, проектирование схем</li><li><b>Data Science</b> — feature engineering, работа с большими датасетами</li></ol><p>Главный совет: практикуйтесь на реальных данных. Поднимите PostgreSQL локально, загрузите публичный датасет и решайте задачи. Ресурсы для старта:</p><ul><li><b><a href="https://sqlbolt.com/">SQLBolt</a></b> — интерактивные уроки SQL в браузере, от нуля</li><li><b><a href="https://pgexercises.com/">PostgreSQL Exercises</a></b> — задачи на реальной схеме (клуб, бронирования)</li><li><b>LeetCode / HackerRank</b> — SQL-задачи для подготовки к собеседованиям</li><li><b><a href="https://www.kaggle.com/datasets">Kaggle Datasets</a></b> — открытые датасеты для импорта в PostgreSQL и экспериментов</li></ul>]]></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>Что такое SQL: основы языка запросов для начинающих</title>
      <link>https://tproger.ru/articles/chto-takoe-sql--osnovy-yazyka-zaprosov-dlya-nachinayushhih</link>
      <comments>https://tproger.ru/articles/chto-takoe-sql--osnovy-yazyka-zaprosov-dlya-nachinayushhih?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-takoe-sql--osnovy-yazyka-zaprosov-dlya-nachinayushhih</guid>
      <description><![CDATA[<p>SQL — язык запросов к базам данных. Разбираем SELECT, INSERT, JOIN, WHERE с примерами, типы данных, сравнение СУБД. Начните писать запросы уже сегодня.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-takoe-sql--osnovy-yazyka-zaprosov-dlya-nachinayushhih">Что такое SQL: основы языка запросов для начинающих</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 29 Mar 2026 05:09:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Каждый разработчик рано или поздно сталкивается с базами данных. Неважно, пишете ли вы веб-приложение, мобильный сервис или скрипт для анализа данных — в основе почти всегда лежит реляционная база данных, а значит, SQL. Этот язык не устаревает десятилетиями: он появился в 1970-х годах и до сих пор остаётся стандартом де-факто для работы с данными. По данным опроса Stack Overflow Developer Survey 2023, SQL занимает третье место среди профессиональных разработчиков — его используют 51,5% из них (Stack Overflow Developer Survey 2023).</p><p><b>SQL (Structured Query Language)</b> — это декларативный язык запросов для управления реляционными базами данных. С его помощью можно создавать таблицы, добавлять, изменять и удалять данные, а также делать выборки по заданным условиям. SQL стандартизирован организацией ISO и поддерживается всеми основными СУБД: PostgreSQL, MySQL, SQLite, Microsoft SQL Server и Oracle.</p><p>- SQL расшифровывается как Structured Query Language — язык структурированных запросов.</p><p>- Язык создан в 1973 году в IBM, стандарт ISO принят в 1987 году.</p><p>- SQL используют 51,5% профессиональных разработчиков по всему миру (Stack Overflow, 2023).</p><p>- Основные операции: SELECT, INSERT, UPDATE, DELETE — охватывают 90% повседневных задач.</p><p>- SQL работает с реляционными базами данных, где данные хранятся в связанных таблицах.</p><p>- Один SQL-запрос может обработать миллионы строк за доли секунды.</p><h2>Зачем нужен SQL — где используется и кому пригодится</h2><p>SQL нужен везде, где есть структурированные данные. Вот лишь несколько примеров из реальной практики:</p><ul><li><b>Веб-разработка</b> — интернет-магазины, блоги, социальные сети хранят пользователей, товары и записи в реляционных БД.</li><li><b>Аналитика данных</b> — аналитики используют SQL для агрегации, фильтрации и построения отчётов.</li><li><b>Backend-разработка</b> — серверные приложения взаимодействуют с PostgreSQL или MySQL через SQL-запросы.</li><li><b>Data Science</b> — учёные по данным выгружают датасеты из хранилищ (Redshift, BigQuery) с помощью SQL.</li><li><b>DevOps и администрирование</b> — DBA оптимизируют запросы, настраивают индексы, следят за производительностью.</li></ul><p>SQL востребован как у начинающих разработчиков, так и у опытных инженеров. По данным Glassdoor, знание SQL входит в топ-3 навыков для вакансий Data Analyst и Backend Developer в 2024 году. Даже фронтендеры, которые редко работают напрямую с БД, рано или поздно сталкиваются с SQL при отладке или настройке.</p><h2>Основные команды SQL</h2><p>Все команды SQL делятся на группы. Самые важные — это DDL (Data Definition Language) для создания структур и DML (Data Manipulation Language) для работы с данными. Рассмотрим ключевые команды подробнее.</p><h3>SELECT — выборка данных</h3><p>SELECT — самая используемая команда SQL. Она позволяет извлекать данные из одной или нескольких таблиц. Базовый синтаксис:</p><p>Звёздочка * означает «все столбцы», но на практике лучше перечислять нужные явно — это ускоряет запрос и делает код читаемым. Чтобы отфильтровать дубликаты, используют SELECT DISTINCT.</p><p>Можно также ограничить количество строк в результате:</p><h3>INSERT, UPDATE, DELETE — изменение данных</h3><p>Три команды, отвечающие за создание, изменение и удаление записей:</p><p><b>Важно:</b>
Всегда используйте WHERE в командах UPDATE и DELETE. Без условия изменения применятся ко всем строкам таблицы, и восстановить данные без бэкапа не получится.</p><h3>CREATE TABLE — создание таблиц</h3><p>Прежде чем работать с данными, нужно создать таблицу. Команда CREATE TABLE задаёт структуру: имена столбцов, их типы и ограничения:</p><p>SERIAL (или AUTO_INCREMENT в MySQL) автоматически генерирует уникальный числовой идентификатор. PRIMARY KEY — уникальный ключ строки. REFERENCES создаёт внешний ключ — связь между таблицами.</p><h3>JOIN — объединение таблиц</h3><p>Реляционные базы данных хранят информацию в нескольких связанных таблицах. Чтобы получить данные из нескольких таблиц одним запросом, используется JOIN. Существует несколько видов объединений:</p><ul><li>INNER JOIN — только совпадающие строки из обеих таблиц.</li><li>LEFT JOIN — все строки из левой таблицы, совпадения из правой (или NULL).</li><li>RIGHT JOIN — все строки из правой таблицы, совпадения из левой (или NULL).</li><li>FULL OUTER JOIN — все строки из обеих таблиц, NULL там, где нет совпадений.</li></ul><h3>WHERE, ORDER BY, GROUP BY — фильтрация и сортировка</h3><p>Три важнейших инструмента для управления результатом выборки. Подробный разбор ORDER BY с примерами читайте в нашем <a href="https://tproger.ru/articles/sortirovka-v-sql--order-by--asc-i-desc-s-primerami">гайде по сортировке в SQL</a>.</p><p>Ключевое отличие: WHERE фильтрует строки <i>до</i> группировки, HAVING — <i>после</i>. Агрегатные функции (COUNT, SUM, AVG, MIN, MAX) работают с группами строк.</p><h2>Типы данных в SQL</h2><p>При создании таблицы каждому столбцу нужно указать тип данных. Правильный выбор типа экономит место на диске и ускоряет запросы. Основные типы:</p><ul><li><b>Числовые:</b> INT / INTEGER — целые числа; BIGINT — большие целые; DECIMAL(p,s) — дробные с фиксированной точностью; FLOAT — числа с плавающей запятой.</li><li><b>Строковые:</b> VARCHAR(n) — строка до n символов; TEXT — строка без ограничений; CHAR(n) — строка фиксированной длины.</li><li><b>Дата и время:</b> DATE — дата (YYYY-MM-DD); TIME — время; TIMESTAMP — дата и время; INTERVAL — интервал.</li><li><b>Логический:</b> BOOLEAN — значения TRUE / FALSE / NULL.</li><li><b>Специальные:</b> UUID — уникальный идентификатор; JSON / JSONB — JSON-данные (PostgreSQL); ARRAY — массив значений.</li></ul><p>Практическое правило: используйте наименьший подходящий тип. Для возраста достаточно SMALLINT, для идентификатора пользователя — INT, для финансовых сумм — DECIMAL, а не FLOAT (чтобы избежать ошибок округления).</p><h2>SQL vs NoSQL — когда что использовать</h2><p>SQL-базы данных хранят данные в таблицах с фиксированной схемой. NoSQL-базы (MongoDB, Redis, Cassandra) используют другие модели: документы, ключ-значение, графы, колонки. Вот когда выбирать каждый подход:</p><ul><li><b>SQL подходит, когда:</b> данные структурированы и схема стабильна; важна целостность и транзакции (банки, интернет-магазины); нужны сложные запросы с JOIN и агрегацией; команда умеет работать с реляционными БД.</li><li><b>NoSQL подходит, когда:</b> структура данных гибкая или меняется часто; нужна горизонтальная масштабируемость под огромные объёмы; данные неструктурированы (логи, события, JSON); требуется сверхнизкая латентность (кэш в Redis).</li></ul><blockquote>SQL и NoSQL — не конкуренты, а инструменты для разных задач. В одном проекте вполне можно использовать PostgreSQL для бизнес-данных и Redis для кэша.</blockquote><h2>Популярные СУБД: PostgreSQL, MySQL, SQLite, MS SQL</h2><p>SQL-синтаксис стандартизирован, но каждая СУБД добавляет свои расширения. Вот краткое сравнение четырёх самых популярных:</p><ul><li><b>PostgreSQL</b> — мощная open-source СУБД с богатым набором типов данных, поддержкой JSON, полнотекстового поиска и оконных функций. Лучший выбор для серьёзных проектов. Подробнее читайте в нашем <a href="https://tproger.ru/articles/osnovy-postgresql-dlya-nachinayuschih--rukovodstvo-s-primerami">руководстве по PostgreSQL для начинающих</a>.</li><li><b>MySQL / MariaDB</b> — самая распространённая СУБД для веб-приложений, особенно в связке с PHP (WordPress, Drupal). Простая в настройке, быстрая для чтения.</li><li><b>SQLite</b> — встроенная база данных в одном файле, без сервера. Идеально подходит для мобильных приложений, тестирования и небольших проектов. Используется в Android, iOS, браузерах.</li><li><b>Microsoft SQL Server</b> — корпоративная СУБД от Microsoft, тесно интегрированная с экосистемой .NET и Azure. Популярна в крупных компаниях.</li></ul><p>Если вы только начинаете, рекомендуем PostgreSQL или SQLite. PostgreSQL — для полноценной разработки, SQLite — для обучения без установки сервера.</p><h2>Как начать учить SQL — ресурсы, песочницы, советы</h2><p>SQL — один из самых практичных языков для изучения. Базовые команды можно освоить за неделю, а первые реальные запросы писать уже через несколько часов практики.</p><p>Подробную дорожную карту с последовательностью тем и рекомендуемыми ресурсами смотрите в нашей <a href="https://tproger.ru/articles/dorozhnaya-karta-sql-dlya-nachinayuschih-v-2024-godu">дорожной карте SQL для начинающих</a>.</p><ul><li><b>SQLiteOnline.com</b> — онлайн-песочница без регистрации. Запустите первый запрос прямо в браузере за 30 секунд.</li><li><b>SQLBolt.com</b> — интерактивный курс с упражнениями от SELECT до сложных JOIN. Полностью бесплатный, на английском.</li><li><b>Stepik.org</b> — бесплатный курс «Введение в базы данных» на русском языке с практическими заданиями.</li><li><b>LeetCode / HackerRank</b> — задачи на SQL для подготовки к техническим собеседованиям.</li><li><b>Официальная документация PostgreSQL</b> — самый полный и точный источник по возможностям СУБД.</li></ul><p>Советы для эффективного обучения: практикуйтесь на реальных данных (импортируйте CSV-файл в SQLite), сразу изучайте индексы — они кардинально влияют на производительность. Читайте наш материал об <a href="https://tproger.ru/articles/sql-indeksy-za-10-minut--kak-uskorit-zaprosy-v-baze-dannyh">SQL-индексах за 10 минут</a> и <a href="https://tproger.ru/articles/optimizaciya-sql-zaprosov--10-sovetov-dlya-nachinayushhih">10 советов по оптимизации запросов</a>.</p><h2>Выводы</h2><p>SQL — фундаментальный навык для любого, кто работает с данными. За полвека существования язык не только не устарел, но и стал ещё более востребованным: облачные хранилища BigQuery и Redshift, аналитические инструменты, современные ORM — всё это работает поверх SQL или совместимо с ним.</p><p>Что делать дальше:</p><ol><li>Установите PostgreSQL или откройте SQLiteOnline.com и напишите первый SELECT.</li><li>Пройдите интерактивный курс на SQLBolt.com — займёт 3–5 часов.</li><li>Попрактикуйтесь на реальных данных: загрузите любой CSV-датасет с Kaggle.</li><li>Изучите индексы — это самый быстрый способ ускорить запросы.</li><li>Посмотрите нашу дорожную карту SQL и двигайтесь по ней системно.</li></ol><p>SQL знают и продолжают учить потому, что он действительно работает. Сотни миллионов строк в банках, маркетплейсах и SaaS-сервисах каждый день обрабатываются именно с помощью SQL-запросов. Это инвестиция в навык, который окупится независимо от выбранного стека.</p>]]></content:encoded>
    </item>
    <item>
      <title>Полнотекстовый поиск на Go без Elasticsearch — гайд по Bleve</title>
      <link>https://tproger.ru/translations/polnotekstovyj-poisk-na-go-bez-elasticsearch---gajd-po-bleve</link>
      <comments>https://tproger.ru/translations/polnotekstovyj-poisk-na-go-bez-elasticsearch---gajd-po-bleve?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/polnotekstovyj-poisk-na-go-bez-elasticsearch---gajd-po-bleve</guid>
      <description><![CDATA[<p>Bleve — встраиваемый полнотекстовый движок для Go. Разбираем кастомные маппинги, мультиязычные индексы, курсорную пагинацию и настройку Scorch для продакшена.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/polnotekstovyj-poisk-na-go-bez-elasticsearch---gajd-po-bleve">Полнотекстовый поиск на Go без Elasticsearch — гайд по Bleve</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 28 Mar 2026 15:25:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда в проекте появляется задача полнотекстового поиска, первая мысль — поставить <a href="https://www.elastic.co/elasticsearch">Elasticsearch</a> или <a href="https://www.meilisearch.com/">Meilisearch</a>. Оба инструмента отлично справляются. Но что, если вы не хотите зависеть от внешнего сервиса — или вам нужен полный контроль над хранением и обработкой данных?</p><p>В Go для этого есть <a href="https://blevesearch.com/">Bleve</a> — файловая библиотека полнотекстового индексирования. Она умеет индексировать любые Go-структуры с разумными настройками по умолчанию, поддерживает встроенный язык запросов в стиле Google, работает с миллионами записей и не требует отдельного сервера.</p><p>В этой статье — практический гайд: от простого индекса до кастомных анализаторов, мультиязычного поиска, пагинации курсором и тонкой настройки производительности.</p><blockquote><b>Ключевые выводы</b><br /><br />- Bleve — встраиваемый полнотекстовый движок для Go: не нужен отдельный сервер, достаточно одной зависимости<br />- Кастомные маппинги позволяют настроить анализатор, стемминг и стоп-слова для каждого поля отдельно<br />- IndexAlias объединяет несколько индексов (например, по языкам) в один виртуальный — с единым интерфейсом поиска<br />- Курсорная пагинация через SearchAfter / SearchBefore работает стабильно даже при обновлении индекса между запросами<br />- Scorch-настройки (воркеры, размер сегментов, порог мёржа) критичны для производительности под нагрузкой</blockquote><h2>Создаём простой индекс</h2><p>Начнём с минимального примера. Два базовых действия — <b>индексирование</b> (сохранение документа для последующего поиска) и <b>запрос</b> (извлечение документов, отсортированных по релевантности).</p><p>Несколько важных деталей:</p><ul><li><b>bleve.New vs bleve.Open</b> — New создаёт новый индекс по указанному пути, Open открывает существующий. Паттерн из примера (сначала New, при ошибке — Open) — идиоматический способ обработки первого и повторных запусков.</li><li><b>NewIndexMapping()</b> — возвращает маппинг по умолчанию: текстовые поля токенизируются, приводятся к нижнему регистру и фильтруются через список стоп-слов английского языка.</li><li><b>Автоматическое обнаружение полей</b> — Bleve использует рефлексию для анализа структуры. Все экспортируемые поля автоматически токенизируются и становятся доступными для поиска.</li><li><b>Уникальные ID документов</b> — строковый идентификатор, передаваемый в Index, используется для обновлений и удалений. Повторный вызов Index с тем же ID заменяет документ.</li><li><b>SearchRequest.Fields</b> — по умолчанию Bleve возвращает только ID и релевантность. Укажите имена нужных полей или []string{"*"}, чтобы получить все.</li><li><b>hit.Score</b> — каждый результат содержит числовой показатель релевантности на основе BM25. Чем выше — тем точнее совпадение.</li></ul><h2>Кастомные маппинги полей</h2><p>Маппинг по умолчанию подходит для быстрого старта, но в реальных проектах нужен контроль над тем, как Bleve анализирует и хранит каждое поле. <b>Маппинг</b> определяет тип поля, анализатор для токенизации, необходимость хранения оригинального значения и включение в индекс.</p><p>Маппинги позволяют:</p><ul><li><b>Управлять токенизацией</b> — разбивать текст на термы по пробелам, языковым правилам, edge n-граммам и другим стратегиям</li><li><b>Фильтровать входные данные</b> — приводить к нижнему регистру, удалять HTML, применять стоп-слова и стемминг (чтобы «running» и «runs» находились по запросу «run»)</li><li><b>Исключать поля из индекса</b> — пропускать чувствительные или нерелевантные данные для экономии дискового пространства</li><li><b>Создавать кастомные анализаторы</b> — комбинировать любой токенизатор с произвольной цепочкой фильтров</li></ul><p>Пример ниже применяет стемминг английского языка к полям Text и Title, а поле с сырым HTML исключает из индексирования:</p><p>Результат buildIndexMapping() передаётся в bleve.New или bleve.NewUsing при создании индекса. Маппинги закрепляются за индексом на этапе создания и не могут быть изменены позже. Чтобы применить новый маппинг, нужно создать свежий индекс и переиндексировать все документы.</p><h2>Мультиязычный поиск</h2><p>Bleve умеет прозрачно работать с несколькими индексами одновременно через <a href="https://pkg.go.dev/github.com/blevesearch/bleve/v2#IndexAlias">IndexAlias</a>. Алиас — это виртуальный индекс, который отправляет запрос во все реальные индексы и объединяет результаты в единый ранжированный список.</p><p>Это особенно полезно, когда у каждого языка свой индекс с собственным анализатором (английский стемминг, французские стоп-слова, кастомная токенизация), а искать нужно по всем сразу:</p><p>Алиасы также упрощают горячую замену (hot-swap). Когда нужно перестроить индекс (например, применить новый маппинг), можно собрать новый индекс в фоне, а затем атомарно подменить его вызовом alias.Swap(newIndexes, oldIndexes). Текущие запросы завершатся на старом индексе, новые сразу пойдут на свежий — без даунтайма.</p><h2>Пагинация с курсором</h2><p>У SearchRequest в Bleve есть поле From для офсетной пагинации: 0 для первой страницы, 20 для второй и так далее. Это работает, но имеет серьёзную проблему: Bleve вынужден оценивать и сортировать <i>все</i> совпавшие документы вплоть до From + Size на каждый запрос. Глубокие страницы становятся всё дороже по памяти и CPU.</p><p>Хуже того, если между двумя запросами в индекс были добавлены новые документы, смещение сдвигается — и пользователь видит дубликаты или пропуски.</p><p>Правильный подход — курсорная пагинация через <a href="https://pkg.go.dev/github.com/blevesearch/bleve/v2#SearchRequest.SetSearchAfter">SearchAfter</a> и <a href="https://pkg.go.dev/github.com/blevesearch/bleve/v2#SearchRequest.SetSearchBefore">SearchBefore</a>. Эти методы продолжают выдачу с известной позиции, а не пересканируют результаты с начала:</p><p>На что обратить внимание:</p><ul><li><b>Стабильная сортировка обязательна.</b> SearchAfter использует ключ сортировки последнего результата в качестве курсора. Если ключ нестабилен, курсор станет невалидным.</li><li><b>Sort — всегда []string.</b> Даже при сортировке по числовому полю Bleve сериализует ключ в строку. Читайте курсор из hit.Sort и передавайте напрямую в SetSearchAfter.</li><li><b>SearchBefore работает аналогично,</b> но в обратном направлении — полезно для кнопки «предыдущая страница».</li></ul><h2>Оптимизация производительности</h2><p>Настройки производительности Bleve не слишком хорошо документированы, но существенно влияют на работу под нагрузкой. Конфигурация передаётся как map[string]any в <a href="https://pkg.go.dev/github.com/blevesearch/bleve/v2#NewUsing">NewUsing</a> или <a href="https://pkg.go.dev/github.com/blevesearch/bleve/v2#OpenUsing">OpenUsing</a> вместо обычных New / Open.</p><p>Эти параметры относятся к Scorch — дефолтному бэкенду хранения Bleve. Полный список доступных опций и значений по умолчанию можно найти в <a href="https://github.com/blevesearch/bleve/blob/master/index/scorch/persister.go#L67">исходном коде персистера</a>.</p><h3>Пакетная индексация</h3><p>Если нужно проиндексировать большой объём данных, используйте Batch вместо одиночных вызовов Index. Пакетная запись группирует операции в одну транзакцию, что значительно снижает нагрузку на диск:</p><p>Оптимальный размер пакета зависит от объёма документов и доступной памяти. Как правило, пакеты по 100-1000 документов дают хороший баланс между скоростью и потреблением ресурсов.</p><h2>Выводы</h2><p>Bleve — одна из недооценённых жемчужин экосистемы Go. Библиотека позволяет добавить полнотекстовый поиск в приложение без сложной инфраструктуры. Настройки по умолчанию дают рабочий результат за минуты, а кастомные маппинги, композитные запросы и тонкая настройка Scorch — инструменты для решения специфических задач оптимально.</p><p>Официальная документация местами неполна, но issues на GitHub и реальные open-source-проекты отлично её дополняют. Рабочий пример всех описанных концепций можно найти в <a href="https://github.com/asciimoo/hister/tree/master/server/indexer">пакете indexer</a> проекта Hister.</p><p><i>Адаптированный перевод статьи <a href="https://hister.org/posts/data-indexing-in-golang">Data Indexing in Golang</a> из блога Hister.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Хакер собрал публичную базу «навайбкоженных» приложений с сотнями уязвимостей</title>
      <link>https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej</link>
      <comments>https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej</guid>
      <description><![CDATA[<p>Хакер собрал публичный реестр iOS-приложений, созданных вайб-кодингом с ИИ, где нашли сотни уязвимостей и открытые базы данных</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/haker-sobral-publichnuyu-bazu--navajbkozhennyh--prilozhenij-s-sotnyami-uyazvimostej">Хакер собрал публичную базу «навайбкоженных» приложений с сотнями уязвимостей</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Firebase]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 22 Jan 2026 10:42:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Анонимный хакер <a href="https://firehound.covertlabs.io/">запустил</a> публичный реестр небезопасных iOS-приложений, созданных с помощью вайб-кодинга.</p><p>Судя по всему, это те самые приложения, которые были собраны на скорую руку с помощью ИИ. В базе уже <b>167 приложений</b>. Проект опубликован на платформе <b>Firehound</b> и активно обсуждается в <a href="https://www.reddit.com/r/iosdev/comments/1qhw9by/a_hacker_is_making_a_list_of_vibecoded_apps_198/">сообществе</a> iOS-разработчиков на <b>Reddit</b>.</p><h2>Что именно нашли</h2><p>Firehound сканирует iOS-приложения и ищет публично доступные базы данных и файлы — без взлома, логинов и обхода защиты. Речь идет о классической ошибке конфигурации: бэкенд приложения открыт для всех желающих.</p><p>В реестре уже есть приложения с:</p><ul><li>десятками миллионов записей в открытых базах;</li><li>доступными коллекциями profiles, posts, comments, likes;</li><li>утекшими email-адресами, никнеймами, метаданными активности.</li></ul><p>Один из лидеров антирейтинга — приложение <i>Adult Coloring Book – Pigment</i>. У него <b>более 7,7 млн документов</b> оказались доступны без какой-либо аутентификации.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-22/77f179d5-9a1e-470f-b146-6617e72e50b0.jpeg" alt="" /></figure><h2>Причем тут вайб-кодинг</h2><p>По словам автора проекта, большинство уязвимостей выглядят одинаково: разработчики используют ИИ для генерации кода и инфраструктуры, но не понимают, <b>что именно деплоят в прод</b>.</p><p>Типичный сценарий:</p><ul><li>ИИ предлагает использовать Firebase, Supabase или MongoDB.</li><li>Конфигурация безопасности либо отсутствует, либо остается дефолтной.</li><li>Ключи и переменные окружения попадают в клиентский код.</li><li>База становится публичной — иногда буквально в один клик.</li></ul><p>Как подчеркивают участники обсуждения на Reddit, проблема не в ИИ как таковом, а в том, что вайб-кодинг часто заканчивается <b>полным отсутствием базовой гигиены кибербезопасности</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-22/64f6ee24-b42d-4286-b0b1-a34e198067f5.jpeg" alt="" /></figure><h2>Это не взлом — и в этом главная проблема</h2><p><b>Важно:</b> Firehound не эксплуатирует уязвимости. Он лишь показывает то, что уже открыто. Данные в публичной версии интерфейса частично замаскированы, но сам факт доступности никто не отрицает.</p><p>Именно это делает ситуацию неприятной: формально никто ничего не «ломал», но пользовательские данные все равно утекли.</p>]]></content:encoded>
    </item>
    <item>
      <title>Платформы администрирования и мониторинга баз данных на основе PostgreSQL</title>
      <link>https://tproger.ru/articles/platformy-administrirovaniya-i-monitoringa-baz-dannyh-na-osnove-postgresql-259927</link>
      <comments>https://tproger.ru/articles/platformy-administrirovaniya-i-monitoringa-baz-dannyh-na-osnove-postgresql-259927?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/platformy-administrirovaniya-i-monitoringa-baz-dannyh-na-osnove-postgresql-259927</guid>
      <description><![CDATA[<p>Как выбрать инструмент для администрирования PostgreSQL — разбираем коммерческие решения от российских вендоров.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/platformy-administrirovaniya-i-monitoringa-baz-dannyh-na-osnove-postgresql-259927">Платформы администрирования и мониторинга баз данных на основе PostgreSQL</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Dec 2025 12:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Управление базами данных — это не только написание SQL-запросов. Здесь нужно разворачивать кластеры, настраивать мониторинг, понимать, когда надо срочно обновлять СУБД, если найдены уязвимости, организовывать резервное копирование, распределять права доступа между командой — и при этом не тратить недели на изучение документации.</p><p>На российском рынке доступно несколько инструментов, которые решают эти и многие другие задачи, связанные с администрированием PostgreSQL-инфраструктуры. Каждый — со своими функциональными и архитектурными особенностями.</p><h2>1. Платформа Tantor</h2><p><a href="https://tantorlabs.ru/products/platform?utm_source=tproger&amp;utm_medium=native">Платформа Tantor</a> позволяет осуществлять управление,  администрирование и мониторинг множества корпоративных баз данных на PostgreSQL и любых его форках (Tantor Postgres, PostgresPro, Pangolin и других). Объединяет в одном интерфейсе инструменты для конфигурирования, обслуживания, профилирования запросов и работы с кластерами Patroni. Все функции доступны из браузера без установки дополнительного ПО на рабочее место администратора. Продвинутая система алертов (оповещений) в платформе Tantor автоматически отслеживает метрики и уведомляет администраторов о потенциальных проблемах, позволяя максимально быстро на них реагировать.</p><h3>Для кого это работает</h3><ul><li><b>DBA</b> используют платформу как центр управления всеми PostgreSQL-инстансами: мониторят нагрузку, блокировки и репликацию, настраивают параметры через группы конфигураций, планируют регламентные работы.</li><li><b>SRE и дежурные инженеры</b> следят за дашбордами по доступности кластеров, работают с алертами на превышение порогов по времени ответа или лагу репликации. При инцидентах используют алерты и алгоритмический ассистент для расшифровки ошибок и базовой диагностики.​</li><li><b>Разработчики</b> заходят эпизодически — посмотреть профиль нагрузки своих сервисов, разобрать планы выполнения проблемных запросов или получить  SQL-выборку по описанию на естественном языке через алгоритмический ассистент.​</li><li><b>Команды безопасности</b> настраивают маскирование конфиденциальных данных для тестовых контуров и проверяют аудит действий пользователей.</li></ul><h2>Алерты (оповещения)</h2><ul><li><b>Непрерывный мониторинг:</b> агенты платформы постоянно собирают метрики (например, загрузку процессора, состояние процессов БД) и анализируют эти данные на предмет аномалий. Можно редактировать условия срабатывания. Например, система может автоматически создать алерт, если загрузка процессора сервера БД долгое время превышает 80%, а при сбое в отказоустойчивом Patroni-кластере алерт мгновенно уведомит администратора о необходимости вмешательства. Также если запланированная задача (например, резервное копирование) не выполнилась или завершилась с ошибкой, в интерфейсе появится соответствующее уведомление.</li><li><b>Классификация по критичности:	</b>алерты имеют цветовую индикацию: красный — высокая критичность, желтый — предупреждение. Все алерты отображаются в едином интерфейсе (меню «колокольчик»), где их можно фильтровать, сортировать и просматривать детали.</li><li><b>Внешние уведомления:</b> интеграции позволяют направлять алерты в Telegram, электронную почту, Mattermost. Алерты разного уровня критичности можно направлять в разные каналы.</li><li><b>Анализ и история: </b>для каждого алерта доступны детали (метрики, хост), связанные события и полный журнал изменений (Events Log).</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/85f40b8c-6c71-46d5-a6ab-b40c960d849b.png" alt="" /></figure><h3>Управление Patroni-кластерами</h3><p>Платформа визуализирует топологию кластера: кто лидер, кто реплика, какой lag, статус health. Плановый switchover выполняется из интерфейса без ручных команд. Если одна из реплик отстаёт или упала, система фиксирует это на дашборде и отправляет алерт.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/3cc2b2ff-2a45-48c0-9f11-13d9e3f11dd3.png" alt="" /></figure><h3>Профилирование и оптимизация запросов</h3><p>Query Profiler на базе pg_stat_statements собирает статистику по запросам на выбранном промежутке времени. Группирует их, показывает время выполнения, количество вызовов, детализацию по каждому.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/ddc4b638-72cd-481d-bbdf-4f3247f1ab43.png" alt="" /></figure><p>Для «тяжелых» запросов формирует визуализацию планов и рекомендации по оптимизации — добавить индекс, переписать join, изменить параметры планировщика.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/82a2d54b-0b3e-4e9c-8998-104d25600cae.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/24a5901b-ee50-473a-9b1e-68744897354c.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/aec374a5-a91e-48ae-b676-0ef71c05bc95.png" alt="" /></figure><h3>Конфигурирование СУБД под разные профили нагрузки</h3><p>Платформа Tantor позволяет из одной точки управлять конфигурациями кластеров и инстансов. Кроме этого, у пользователя есть возможность создать типовые профили нагрузки, например 1С или BI-платформу, автоматизированную банковскую систему или иные ресурсоемкие бизнес-приложения. Это позволяет более тонко управлять имеющимися ресурсами хранения данных и их вычисления за счет возможности сконфигурировать сразу большую группу инстансов одной конфигурацией с помощью групповых параметров.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/97769833-6578-48d0-8227-ab30b4208d5d.jpg" alt="" /></figure><h3>Анонимизация данных</h3><p>Модуль на основе pg_anon ищет конфиденциальную информацию в таблицах и создаёт анонимизированные дампы. Настраиваются правила маскирования для конкретных полей, после чего формируется выгрузка или копия базы для передачи разработчикам. Данные остаются репрезентативными по объёму и структуре, но без реальных значений.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/3f1161b9-6fc6-45ee-bd71-1c0e012272ee.png" alt="" /></figure><h3>Планировщик и автоматизация</h3><p>Создание задач для выполнения SQL-скриптов или команд ОС по расписанию или с указанием периодичности. Подходит для регламентных работ — vacuum, analyze, проверка bloat, архивирование логов. История выполнения и результаты сохраняются в интерфейсе.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/1c615cf7-6207-4d49-8e40-41af87e70889.png" alt="" /></figure><h3>Лог-аналитика</h3><p>Платформа собирает и хранит логи СУБД с возможностью поиска по тексту, пользователям, объектам БД и кодам ошибок. При разборе инцидентов это позволяет связать проблемы на уровне приложения с реальными событиями в базе без grep по десяткам файлов.</p><h3>Алгоритмический ассистент</h3><p>Взаимодействует с метаданными БД, логами, оптимизатором запросов и метриками. Выполняет семантический поиск, классифицирует данные, генерирует SQL по текстовому описанию, предлагает оптимизации и помогает интерпретировать планы выполнения.</p><h3>Технические детали</h3><ul><li>Веб-интерфейс, доступный из браузера на любой ОС.</li><li>Развёртывание on-premise через docker-compose на Linux (включая Astra Linux).</li><li>Поддержка всех версий PostgreSQL и коммерческих форков.</li><li>REST API для экспорта метрик и выборок данных.</li><li>Интеграция с SIEM через syslog, с мессенджерами (Telegram, Mattermost) и почтой.</li><li>Ролевая модель доступа, рабочие пространства, журнал событий.​</li></ul><h3>Лицензирование</h3><p>Коммерческая лицензия по количеству серверных ядер обслуживаемых (наблюдаемых ) СУБД. Бесплатная полнофункциональная версия работает до 180 дней. Включена в Единый реестр российского ПО (запись 12905).</p><h3>Поддержка</h3><p>Документация полностью на русском языке, есть обучающие материалы на <a href="https://youtube.com/@tantorlabs/playlists">YouTube</a>, <a href="https://rutube.ru/channel/31876555/playlists/">Rutube</a> и <a href="https://vk.com/tantorlabs">VK</a>. Компания проводит вендорские курсы и сертификацию через авторизованные учебные центры. Для корпоративных клиентов доступна техподдержка 24/7 с SLA от 2 часов в зависимости от критичности запроса.</p><h2>2. Platform V Kintsugi</h2><p><a href="https://platformv.sbertech.ru/products/rabota-s-dannymi/kintsugi">Инструмент</a> для мониторинга и сопровождения СУБД, основанных на PostgreSQL, который позволяет обслуживать тысячи баз данных и выполнять задачи администрирования в едином интерфейсе. Продукт зарегистрирован в Едином реестре российских программ и позиционируется как альтернатива Oracle Enterprise Manager Cloud Control.</p><h3>Для кого это работает</h3><p>Platform V Kintsugi также подходит для компаний, которые ищут замену инструментам мониторинга иностранных вендоров. Решение масштабируется от среднего бизнеса с небольшими объёмами баз данных до крупных компаний с высоконагруженными системами — продукт выдерживает промышленные нагрузки Сбера.</p><h3>Централизованное наблюдение</h3><p>Оперативный центр даёт возможность получать информацию о состоянии множества СУБД в одном окне. Предустановлены панели мониторинга с основными метриками, есть опция добавления собственных метрик мониторинга.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/84e2e366-818e-4075-bbfa-af5e9f9b983f.png" alt="" /></figure><p>В оперативном центре можно отслеживать события БД практически в режиме реального времени, чтобы контролировать инциденты до их эскалации.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/9343e428-1fc8-40d4-95de-ec09ee7a7593.png" alt="" /></figure><h3>Работа с экземплярами БД</h3><p>Обзорная панель СУБД проводит постоянный мониторинг экземпляров и отправляет важную информацию о статусе баз данных в одном месте. Функциональность решения ускоряет обслуживание инфраструктуры и автоматизирует повторяющиеся задачи по сопровождению СУБД.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/e58dbfcb-ff6e-4b12-b091-8de529c97683.png" alt="" /></figure><h3>SQL-интерфейс с аудитом</h3><p>Безопасный терминал для выполнения запросов оснащен функцией аудита действий пользователя, что повышает уровень безопасности при работе с данными. Решение соответствует стандартам защищённости в каждой функциональной части и гарантируют безопасность при работе с критической инфраструктурой.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/df2ad528-54bc-4849-983d-3c9f21dfa67c.png" alt="" /></figure><h3>Анализ производительности</h3><p>История активности сессий помогает оптимизировать производительность любой PostgreSQL-подобной СУБД без необходимости использования дополнительного программного обеспечения. В интерфейс продукта интегрированы отчёты pg_profile. Решение помогает анализировать и проводить диагностики без влияния на производительность СУБД.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/9b3f1f1d-fd23-4904-964f-4edc08b0b379.png" alt="" /></figure><h3>Визуализация и оптимизация запросов</h3><p>Понятная визуализация планов для подробного анализа пользовательских запросов, чтобы улучшить понимание и оптимизацию выполнения. Инструмент собирает и обрабатывает метрики баз данных и находит узкие места в работе системы.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/afc70e0e-10a7-422f-b80f-bf9f76830eb1.png" alt="" /></figure><h3>Лицензирование</h3><p>Продукт зарегистрирован в Едином реестре российских программ для ЭВМ и баз данных. Реестровая запись: №18302 от 12.07.2023.</p><h3>Особенности архитектуры</h3><p>Инструмент оснащен изменяемой информационной моделью и широким интеграционным слоем. Совместим с 80+ решениями Platform V. Встроена поддержка отечественной СУБД Platform V Pangolin DB для высоконагруженных систем, при этом поддерживается работа с любыми PostgreSQL-like СУБД. Документацию можно изучить <a href="https://platformv.sbertech.ru/docs/public/DBM/1.8.0/index.html">здесь</a>.</p><h2>3. Postgres Pro Enterprise Manager</h2><p><a href="https://postgrespro.ru/products/PPEM">PPEM</a> — графическая платформа для управления базами данных Postgres Pro через веб-интерфейс. Инструмент обеспечивает мониторинг, диагностику и управление множеством экземпляров Postgres Pro в рамках собственной инфраструктуры.​</p><h3>Снижение порога входа</h3><p>Понятная структура интерфейса, визуализация данных и подробная информация о статусе операций снижают порог вхождения в администрирование СУБД. Для выполнения рутинных операций не требуется знать команды SQL. Автоматизация задач, визуализация метрик и планов запросов, интеграция с pgpro_pwr и pg_probackup ускоряют работу и упрощают анализ производительности.​</p><h3>Централизованный дашборд</h3><p>На главном дашборде отображается основная информация о базах данных, подключённых к PPEM: общий размер, последние сообщения из журналов, статус выполнения задач. Обеспечивается постоянный контроль в режиме реального времени 24/7.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/f576e598-f144-4cf4-9204-eb406de1796c.png" alt="" /></figure><h3>Управление экземплярами</h3><p>Раздел «Экземпляры» показывает список всех подключённых баз данных с основной информацией: версия PostgreSQL, каталог данных, порт, сервер, роль (standalone), количество баз данных, транзакций в секунду, соединений. Доступны базовые действия: остановка, запуск, резервное копирование, настройки. PPEM работает с любой редакцией Postgres Pro.​</p><p>Инструмент поддерживает автоматическое обнаружение экземпляров в сети (autodiscovery-режим), что сокращает время подключения новых баз и упрощает масштабирование.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/d283e8aa-89aa-48cd-931f-12cae76c09d1.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/fba56782-20a4-41e6-ad71-ec75e6261eb4.png" alt="" /></figure><h3>Мониторинг и диагностика</h3><p>Для каждого экземпляра доступны графики ключевых метрик производительности, информация по сеансам БД и событиям ожидания, выполняющимся SQL-запросам. Можно просматривать и редактировать параметры экземпляра. Есть возможность добавлять собственные показатели производительности и адаптировать мониторинг под особенности инфраструктуры.​</p><h3>Работа с базами данных</h3><p>Список баз данных предоставляет детальную информацию: объём, количество таблиц и индексов, bloat (коэффициент распухания), wraparound (предупреждение о зацикливании счётчика транзакций). Это помогает выявлять узкие места и реагировать до появления проблем.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/25a5c007-5afc-4e86-ae2a-3525b430601a.png" alt="" /></figure><h3>Интеграция с pgpro_pwr</h3><p>Встроенный диагностический профайлер нагрузки формирует историю статистики. Модуль pgpro_pwr автоматически создаёт снимки, строит и визуализирует отчёты. Можно конфигурировать целевые серверы, настраивать расписание снимков и срок хранения данных. Это позволяет анализировать наиболее ресурсоёмкие операции в базе данных.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/cc52bf19-b2c6-47d1-8573-b7688d8e194a.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/e45828c7-0a95-4db6-b831-3973be4a58f2.png" alt="" /></figure><h3>Управление табличными пространствами</h3><p>Возможность создания, редактирования и удаления Tablespace. При создании табличного пространства настраиваются параметры: название, каталог, владелец, seq_page_cost, random_page_cost, effective_io_concurrency, maintenance_io_concurrency, compression.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/331b29c9-e63a-42d5-a55d-2a7be740e013.png" alt="" /></figure><h3>Резервное копирование и восстановление</h3><p>Интеграция с pg_probackup позволяет настраивать резервное копирование по расписанию и восстанавливать данные за несколько кликов. В интерфейсе отображается список резервных копий с информацией: ID, размер, начало и окончание выполнения, режим (FULL), хранилище, экземпляр, статус, пользователь, статус валидации, начало и окончание валидации. Можно посмотреть детальный журнал выполнения или вызвать форму восстановления из выбранной резервной копии.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/905c5ebf-93bc-43e4-af1d-8bc18b32573d.png" alt="" /></figure><h3>Планирование и автоматизация</h3><p>Настройка расписаний для обслуживания базы: вакуум, анализ, реиндексация и другие операции. Все процессы прозрачны — в консоли заданий видны статус, длительность и результат выполнения. Это ускоряет обслуживание инфраструктуры и автоматизирует рутинные повторяющиеся задачи.​</p><h3>Журнал событий</h3><p>Графический интерфейс к журналу событий экземпляра БД с возможностями выбора временнóго интервала, фильтрации и текстового поиска. Журнал показывает детали каждого события: дата, время, экземпляр, пользователь, база данных, тип, сообщение.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/caeb041b-2ef0-4b82-84b6-d0bbe0886f12.png" alt="" /></figure><h3>Управление доступом</h3><p>Система ролей и встроенная аутентификация позволяют точно настроить права доступа. Гибкое распределение ролей помогает ограничить доступ к важным данным и избежать случайных ошибок. Все действия — от задач до изменений в конфигурации — фиксируются в истории. Можно интегрировать PPEM с LDAP для централизованной аутентификации.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-24/d7ff1bf7-a4cf-4591-bff0-8ce48f40468b.png" alt="" /></figure><h3>Лицензирование</h3><p>Postgres Pro Enterprise Manager входит в состав всех редакций Postgres Pro и не имеет ограничений на количество ядер процессора или сервера и количества пользователей. Регистрация (№104 в Едином реестре российского ПО).</p><h3>Особенности развёртывания</h3><p>PPEM не требует внедрения сторонних решений — всё в одном инструменте, без дополнительных затрат и рисков. Можно развернуть в изолированной среде без доступа в интернет. Интуитивно понятная структура, ролевая модель доступа, встроенная история действий и консоль заданий обеспечивают удобную и безопасную работу с БД.</p><h2>В результате</h2><p>Если у вас уже есть коммерческая СУБД одного из российских вендоров, то вы вместе с ней в комплекте скорее всего получили и графическую платформу управления БД. Но если текущая платформа вас не устраивает, то можете выбрать из обзора.</p>]]></content:encoded>
    </item>
    <item>
      <title>СУБД 2026: что выбирают российские компании</title>
      <link>https://tproger.ru/articles/subd-2026--chto-vybirayut-rossijskie-kompanii</link>
      <comments>https://tproger.ru/articles/subd-2026--chto-vybirayut-rossijskie-kompanii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/subd-2026--chto-vybirayut-rossijskie-kompanii</guid>
      <description><![CDATA[<p>5 систем управления базами данных, которые закрывают разные сценарии: от транзакционных нагрузок до аналитики петабайтных хранилищ.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/subd-2026--chto-vybirayut-rossijskie-kompanii">СУБД 2026: что выбирают российские компании</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Dec 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Российский рынок СУБД за последние годы изменился. Компании ищут решения, которые закрывают требования по импортозамещению, сертификации и работе с персональными данными, но при этом не уступают по функциональности привычным системам.</p><p>В этой подборке — пять системы управления базами данных, которые закрывают разные сценарии: от транзакционных нагрузок до аналитики петабайтных хранилищ. Каждый продукт решает свой класс задач — одни оптимизированы под OLTP с частыми операциями чтения-записи, другие под OLAP с обработкой миллиардов строк, третьи дают задержки в миллисекунды для real-time систем.</p><h2>1. РЕД База Данных: реляционная СУБД с режимом встраивания</h2><p>Тип: реляционная СУБД общего назначения, OLTP</p><p><a href="https://rdb.red-soft.ru/?utm_source=tproger&amp;utm_medium=issledovanie&amp;utm_campaign=obzor_SUBD_tproger">РЕД База Данных</a> — реляционная OLTP-система общего назначения, которая включена в реестр российского ПО и имеет сертификат ФСТЭК России по 4 классу защиты. Команда разрабатывает продукт параллельно с Firebird уже 20 лет: общие ошибки исправляются в обеих ветках, доработки переносятся между проектами.​</p><h3>Где используют</h3><p>Один из публичных кейсов — АИС ФССП России. СУБД работает с терабайтными базами данных, скорость обработки запросов сопоставима с другими реляционными OLTP-системами на рынке.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-23/fe3d2fad-75ea-4a00-a490-a0251cb3de11.jpeg" alt="" /></figure><h3>Два режима работы</h3><p>РЕД База Данных может работать как классическая серверная СУБД или в режиме встраивания — без выделенного сервера, как SQLite. В встраиваемом режиме функциональность сохраняется полностью, кроме сетевого доступа. Это позволяет использовать одну СУБД и для серверных задач, и для локальных приложений.</p><p>Поддерживаются Windows, Linux (включая РЕД ОС, Альт Линукс, AstraLinux, ROSA) и Android. Архитектуры: x86_64 (Intel, AMD), Эльбрус (e2k), Байкал (aarch64), ARM.</p><h3>Отказоустойчивость и репликация</h3><p>Есть три режима репликации: синхронная, асинхронная и адаптивная. Адаптивная репликация переключается в асинхронный режим при проблемах со связью и возвращается обратно после восстановления. Отказоустойчивый кластер включён в текущую версию, шардинг планируется в версии 6.​</p><p>Механизм записи страниц БД позволяет СУБД восстанавливаться сразу после сбоя без длительной фазы recovery, которая есть в системах с журналом упреждающей записи. Поддерживаются логический бэкап, файловый бэкап консистентной БД и инкрементальные бэкапы.</p><h3>Сборка мусора и метаданные</h3><p>Сборка мусора работает автоматически в разных режимах и не требует блокировки таблицы. Механизм сборки промежуточных версий снимает проблему версионного сервера и длительных транзакций. Метаданные можно обновлять на лету, без блокировки таблицы для запросов.​</p><p>Многопоточная архитектура позволяет запускать множество транзакций в рамках одного подключения и поддерживать несколько подключений одновременно.​</p><h3>Интеграция и инструменты</h3><p>В экосистеме РЕД Базы Данных есть два основных инструмента:</p><p><a href="https://rdb.red-soft.ru/product/expert/">РБД Эксперт</a> для разработки и администрирования баз данных</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-22/3aee94b5-509b-42c0-8599-9773b641907e.png" alt="" /></figure><p><a href="https://rdb.red-soft.ru/product/monitor/">РБД Монитор</a> для мониторинга.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-22/4ddb8d2a-8620-4fb1-b9fc-56ee8c0ccee4.png" alt="" /></figure><p>СУБД имеет сертификаты совместимости с 80+ продуктами: медицинские информационные системы, банковское ПО, СКАДА-системы, системы резервного копирования. Полная совместимость с другими продуктами РЕД СОФТ (РЕД Виртуализация, РЕД ОС, РЕД Платформа и другие) позволяет собирать инфраструктуру на базе одного вендора.</p><p>Поддерживаются популярные языки и фреймворки: Java (Spring, Hibernate, Liquibase, FlyWay), NodeJS, Python (Django, SQLAlchemy), Ruby (Active Record), GO (GORM), C, C++, .NET, Rust, QT, ODBC, OLE DB, PHP, Erlang.</p><h3>Доступность и поддержка</h3><p>Продукт представлен в облаках VK Cloud и Яндекс Облако. Для VK Cloud есть бесплатная версия для тестирования. Покупка через <a href="https://rdb.red-soft.ru/product/buy/">интеграторов</a>, лицензирование поядерное — минимум 2 ядра на установку. Для разработчиков прикладного ПО предусмотрена отдельная лицензия без ограничений.​</p><p>Техническая поддержка работает на двух уровнях: стандартном и расширенном. Для пользователей доступны <a href="https://rdb.red-soft.ru/product/docs/">техническая документация</a> и <a href="https://rdb.red-soft.ru/base/">база знаний</a>, статьи на Хабре, каналы на RuTube и Дзен, чат в Telegram с разработчиками. Ежегодно проводится конференция, посвящённая Firebird, где можно пообщаться с командой напрямую.​</p><h3>Что будет в версии 6</h3><p>Шестая версия запланирована на 2026 год с фокусом на производительность и новые функции. В релиз войдут: геометрические типы данных, гетерогенные запросы, ROW-тип данных, партиционирование, катастрофоустойчивый кластер, восстановление на точку во времени, создание и удаление индексов без блокировки, улучшенные JSON-функции, новые методы доступа (HASH/MERGE OUTER JOIN, HASH GROUP BY), общий кеш метаданных и поддержка TRUNCATE.</p><h2>2. Tantor Postgres: СУБД для высоких нагрузок и защищённых систем, в том числе 1С</h2><p>Тип: универсальная СУБД на базе PostgreSQL</p><p><a href="https://tantorlabs.ru/products/dbms">Tantor Postgres</a> — это СУБД для высоконагруженных систем на основе PostgreSQL с глубокими доработками. Продукт выпускается в четырёх редакциях: Special Edition для нагруженных OLTP-систем и корпоративных хранилищ до 100 ТБ, Special Edition 1C с оптимизацией под приложения 1С, Certified с сертификацией ФСТЭК для защищённых ГИС и КИИ, и Basic Edition с базовыми улучшениями и поддержкой вендора.</p><h3>Где применяют</h3><p>СУБД Tantor Postgres в различных редакциях, включая сертифицированную ФСТЭК, используется в большинстве ключевых отраслей бизнеса, коммерческих и государственных организациях, в том числе на объектах КИИ. Так, правительство одного из крупнейших городов России использует продукты Tantor в большинстве комитетов, а АО "Губернские аптеки" — крупнейшая аптечная госсеть Красноярского края — мигрировала на Tantor Postgres при объёме данных свыше 2 ТБ и более 17 млн совершаемых транзакций в день. Проект охватил более 2000 рабочих мест. Инструменты мониторинга Tantor помогли выявить неоптимальные запросы и передать данные 1С-разработчикам для доработки, и в результате время массовых расчётов и перепроведения документов в 1С сократилось на 50%, что сэкономило массу времени десяткам бухгалтеров.</p><h3>Производительность под 1С</h3><p>Tantor располагает собственным центром экспертизы 1С, который решает технические вопросы клиентов и ставит конкретные задачи по развитию СУБД под специфику 1С. Для крупных внедрений 1С предлагается машина баз данных Tantor XData. С СУБД Tantor Postgres для 1С пройдены тесты на высоконагруженных системах: 30 000 одновременных пользователей 1С с APDEX 0.859 на МБД Tantor XData 2Y, 20 000 одновременных пользователей с APDEX 0.846 на МБД Tantor XData 2B, и 15 000 одновременных пользователей с APDEX 0.950 на МБД Tantor XData 2Y в альтернативном тестировании.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-13/771f3461-b4df-4d15-bd68-c4b239166343.png" alt="" /><figcaption><br /></figcaption></figure><h3>Отличия от PostgreSQL</h3><p>Полный список отличий от "ванильной" версии доступен в <a href="https://docs.tantorlabs.ru/tdb/ru/17_7/se/differences.html">документации</a>.</p><p>Среди реализованных в 2025 году технологий и оптимизаций – технология Transparent Data Encryption (TDE) для прозрачного шифрования данных на диске + шифрование WAL, поддержка протокола аутентификации 0Auth 2.0, новый механизм работы с временными таблицами, улучшенная поддержка широких таблиц и таблиц с неравномерным распределением значений, множество оптимизаций производительности для систем «1С», оптимизация обработки дизъюнкций подзапросов, расширенная поддержка параллельного выполнения операций с временными таблицами, раздельное управление детализацией статистики для постоянных и временных таблиц. Таким образом, СУБД Tantor Postgres глубоко оптимизирована для более высокой производительности, в том числе для высоконагруженных систем 1С.</p><ul><li>Расширение Tantor PipelineDB обеспечивает агрегацию и вычисления на данных в реальном времени.</li><li>Расширение columnar предоставляет колоночное хранение и обработку данных с возможностью транзакционного выполнения операций UPDATE и DELETE.</li><li>Расширение transp_anon реализует динамическую анонимизацию данных.</li></ul><p>В каждую редакцию СУБД Tantor Postgres входит графическая Платформа Tantor для администрирования и мониторинга баз данных на основе PostgreSQL.</p><p>Стратегическим направлением развития СУБД Tantor Postgres является реализация технологии разделения вычислений и хранения для независимого масштабирования под высокие и смешанные нагрузки (НТАР), адаптация к облачному использованию и использованию с ИИ.</p><h3>Новые расширения в релизах 17.7 и 16.11</h3><ul><li><b>pg_stat_kcache</b> фиксирует физические операции чтения и записи, позволяя выявлять узкие места производительности, недоступные для обнаружения другими инструментами мониторинга.</li><li><b>pgvector</b> предоставляет тип данных vector и оптимизированные алгоритмы поиска по сходству для работы с многомерными представлениями данных.</li><li><b>pg_ivm</b> реализует инкрементальные материализованные представления, обновляя их по мере изменения данных в исходных таблицах.</li><li><b>pg_throttle</b> позволяет ограничивать скорость выполнения отдельных запросов и создавать пользовательские профили для управления ресурсами путём контроля нагрузки на систему.</li><li><b>pg_trace</b> обеспечивает глубокий анализ и профилирование SQL-запросов.</li><li><b>pg_archive </b>автоматически архивирует исторические данные из партиционированных таблиц.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-13/8d3fcf6c-1c1f-4cd5-bafe-b81f9d9e0cb5.png" alt="" /><figcaption><br /></figcaption></figure><h3>Отказоустойчивость и надёжность</h3><p>Для гарантии надёжности используются pg_cluster и wal-g. Эти инструменты отвечают за механизмы отказоустойчивости, резервное копирование и восстановление после сбоев.</p><h3>Безопасность и сертификация</h3><p>Модуль ЗСУБД операционной системы Astra Linux Special EditionLSE 1.8 имеет сертификацию ФСТЭК по 1 категории, редакция Tantor Certified сертифицирована ФСТЭК по 4 категории. Поддерживается прозрачное шифрование данных (Transparent Data Encryption, TDE).</p><p>СУБД совместима с ОС Astra Linux Special Edition во всех режимах функционирования. Отдельное приложение pg_sec_check проводит комплексный аудит безопасности СУБД. Протокол аутентификации OAuth 2.0 позволяет приложениям получать защищённый доступ к данным без передачи паролей пользователей.</p><p>Реализован контроль целостности баз данных и конфигурации СУБД, удаление объектов баз данных без возможности восстановления: очистка файлов во внешней памяти перед удалением, очистка версий строк, очистка страниц перед удалением, очистка оперативной памяти перед освобождением, очистка журнала упреждающей записи перед удалением или перезаписью.</p><h3>Экосистема и совместимость</h3><p>Платформа Tantor, входящая в поставку каждой редакции, обеспечивает самый широкий функционал для администрирования и управления БД среди решений для PostgreSQL.</p><p><b>Поддерживаемые ОС:</b> Astra Linux, Alt Linux, МСВСфера, Ред Софт, CentOS, Red Hat, Rocky Linux, Ubuntu, Debian, Oracle Linux.</p><p>Tantor предоставляет единое окно технической поддержки для продуктов Tantor и «Группы Астра», что обеспечивает качество и скорость решения вопросов. Вендорская поддержка доступна для всех редакций СУБД, полное описание <a href="https://docs.tantorlabs.ru/tdb/ru/17_7/se/limits.html">ограничений СУБД</a> опубликовано в документации.</p><h3>Лицензирование</h3><p>Классическая модель — поядерное лицензирование физических или виртуальных ядер сервера. Для СУБД под 1С есть адаптированная схема для SMB-рынка, где стоимость лицензии рассчитывается исходя из количества работников заказчика.</p><h3>Планы на 2026 год</h3><p>Запланирована сертификация ФСТЭК для Tantor Postgres 17.x, выпуск СУБД Tantor Postgres 18, выпуск редакции с разделением Compute и Storage. В разработке интеграция RocksDB, реорганизация таблиц без блокировок, реализация Tantor Postgres DBaaS в Astra Cloud, развитие PipelineDB в сторону более тесной интеграции с Columnar, поддержка сжатия на уровне JDBC-драйвера.</p><h2>3. Postgres Pro: форк PostgreSQL с российской разработкой и встроенным кластером</h2><p>Тип: реляционная СУБД общего назначения на базе PostgreSQL</p><p><a href="https://postgrespro.ru/">Postgres Pro</a> — российская разработка на основе PostgreSQL. Компания объединяет 70% российских контрибьюторов PostgreSQL, входит в ТОП-5 мировых разработчиков этой СУБД. Продукт включён в реестр российского ПО, сертифицирован ФСТЭК России. На рынке 10 лет, в команде более 400 специалистов.</p><h3>Где используют</h3><ul><li>Один из масштабных кейсов — миграция ГИС ГМП Федерального казначейства на Postgres Pro Shardman. Система обрабатывает платежи национального масштаба и работает в распределённой архитектуре.</li><li>«Авито» перенесли базы данных 1С с Microsoft SQL Server на Postgres Pro Enterprise. Объём данных — более 10 ТБ. Платформа обрабатывает 220 млн объявлений ежемесячно, обслуживает 62 млн пользователей и до 10 сделок в секунду.</li><li>Газпромбанк мигрировал ключевую АБС с Oracle на Postgres Pro Enterprise. Проект потребовал перестройки архитектуры и детального тестирования под пиковыми нагрузками.</li><li>«Росатом» развернул автоматизированную систему управления финансами и перенёс СЭД на Postgres Pro Enterprise Certified. Решение обслуживает более 250 предприятий атомной отрасли.</li></ul><h3>Редакции и специализация</h3><p>Линейка включает пять основных редакций:</p><ul><li><b>Postgres Pro Enterprise</b> — флагманская версия для высоконагруженных систем с более чем 100 дополнительными функциями относительно PostgreSQL. Поддерживает до 10 000 одновременно работающих пользователей.</li><li><b>Postgres Pro Enterprise для 1С</b> — оптимизирована под платформу 1С. Ускоряет ключевые операции, закрыть месяц можно до 10 раз быстрее по сравнению с базовыми решениями.</li><li><b>Postgres Pro Enterprise Certified</b> — сертифицированная ФСТЭК версия Enterprise со встроенными средствами защиты.</li><li><b>Postgres Pro Standard </b>— улучшенная версия PostgreSQL с повышенной производительностью и полнотекстовым поиском.</li><li><b>Postgres Pro Certified</b> — сертифицированная ФСТЭК версия Standard.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-22/cfecb81e-4106-440f-aade-7a7c506f0fd5.png" alt="" /></figure><h3>BiHA: встроенный отказоустойчивый кластер</h3><p>BiHA (Built-in High Availability) — встроенный отказоустойчивый кластер, работает «из коробки» без внешних компонентов. При сбое основного узла система автоматически переключается на реплику. Механизм не требует отдельной настройки Pacemaker, Corosync или других решений для управления кластером — всё интегрировано в ядро СУБД.</p><h3>Масштабирование: Shardman и Citus</h3><p>Для горизонтального масштабирования доступны две технологии:</p><p><b>Postgres Pro Shardman</b> — распределённая СУБД с автоматическим управлением шардами. Данные распределяются по узлам, система сама отслеживает топологию и балансирует нагрузку. Использовался в проекте миграции ГИС ГМП.</p><p><b>Citus</b> — расширение для распределённых запросов и параллельной обработки. Подходит для аналитических задач и работы с большими объёмами данных.</p><h3>Proxima и управление жизненным циклом данных</h3><p><b>Proxima</b> — встроенный пулер соединений и прокси-сервер. Оптимизирует управление подключениями, снижает накладные расходы на создание новых сессий.</p><p><b>ILM (Information Lifecycle Management)</b> — управление жизненным циклом данных. Позволяет автоматически перемещать старые или редко используемые данные на более дешёвые носители без остановки системы.</p><h3>Миграция с Oracle и других СУБД</h3><p>Postgres Pro включает инструменты для упрощённой миграции с Oracle: поддержка PL/SQL-совместимого языка, эмуляция пакетов Oracle, совместимость типов данных.</p><h3>Экосистема инструментов</h3><p><b>Postgres Pro Enterprise Manager (PPEM)</b> — графическая платформа для управления кластерами, мониторинга производительности и резервного копирования. Интерфейс позволяет управлять несколькими инстансами одновременно.</p><p><b>Postgres Pro Backup Enterprise</b> — инструмент для инкрементального резервного копирования. Поддерживает восстановление на точку во времени (PITR) и сжатие данных.</p><h3>Техническая поддержка и документация</h3><p>Техническая поддержка работает 24/7, два уровня: базовая и расширенная. Расширенная включает решение задач, требующих изменений в ядре СУБД. Доступен портал техподдержки с личным кабинетом и базой знаний.</p><p>Документация включает книги, курсы, демобазу для обучения, глоссарий и HOW-TO видео. Для студентов и вузов есть отдельные программы.</p><h3>Доступность</h3><p>Продукты доступны через интеграторов и дистрибьюторов. Лицензирование поядерное. Для разработчиков прикладного ПО предусмотрены отдельные условия. Можно протестировать через личный кабинет на сайте.</p><p>Компания проводит регулярные мероприятия: PGPro TechDay, PGMeetup по шардированию и другим техническим темам.</p><h2>4. Tarantool DB: in-memory СУБД для real-time систем</h2><p>Тип: NoSQL in-memory СУБД, key-value/документная</p><p><a href="https://www.tarantool.io/ru/tarantooldb/">Tarantool DB</a> — российская in-memory СУБД с открытым кодом, разработка VK. Включена в реестр отечественного ПО (№ 23005 от 28.06.2024), сертифицирована ФСТЭК России. Основной фокус — системы реального времени с требованиями к задержке в единицы миллисекунд.</p><h3>Где используют</h3><ul><li>Tarantool применяют как кэш-слой для автоматизированных банковских систем и дисковых СУБД. Вместо полной замены core-систем создаётся быстрый промежуточный слой, который снижает нагрузку на основное хранилище.</li><li>В банковской архитектуре СУБД работает как оперативное хранилище между клиентскими приложениями и базовой АБС. Это позволяет обрабатывать запросы без обращения к медленным дисковым системам.</li><li>В телекоме и ритейле используют для организации «золотой записи» клиента, цифрового профиля, единой авторизации и real-time биллинга. В e-commerce — для обработки потоков событий и маркетинга в реальном времени.</li></ul><h3>Drop-in замена Redis</h3><p>В поставке есть механизм замены Redis с минимальными изменениями кода. Поддерживаются 60+ команд Redis, типы данных Redis, Redis ACL для управления доступом и настройки, совместимые с Redis.</p><p>Есть логирование событий и шифрование TLS. Переход с Redis на Tarantool не требует переписывать клиентское приложение — достаточно изменить конфигурацию подключения.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-22/57280546-f3d5-4168-986f-c54349f2572a.png" alt="" /></figure><h3>Схемы данных и работа с памятью</h3><p>Tarantool поддерживает несколько схем: key-value, таблицы и документы. Данные хранятся в оперативной памяти с возможностью сжатия для экономии ресурсов.</p><p>Для сохранности предусмотрена упреждающая журнализация (WAL) и создание снимков состояния БД. При сбое система восстанавливается быстро благодаря механизму быстрого восстановления.</p><p>CRUD-операции работают с объектами в кластерном хранилище. Поддерживаются вторичные индексы и управление временем жизни данных (TTL). Справочники можно хранить прямо в кластере.</p><h3>Репликация и шардирование</h3><p>Доступна синхронная и асинхронная репликация. Шардирование (сегментирование данных) встроено в платформу — не нужны внешние инструменты для горизонтального масштабирования.</p><p>Failover для отказоустойчивости работает автоматически: при падении узла система переключается на реплику. Управление кластером реализовано через собственную технологию Tarantool.</p><h3>API и интеграция</h3><p>Для работы с данными из бизнес-приложений есть коннекторы на Java и Go. API поддерживает чтение и запись данных в кластерное хранилище.</p><p>Метрики мониторинга экспортируются в Prometheus и Grafana. Развёртывание возможно в Kubernetes. Поддерживаются российские ОС: Astra Linux и РЕД ОС.</p><h3>Экосистема продуктов</h3><p>Помимо Tarantool DB, в экосистеме есть:</p><ul><li>Tarantool Enterprise Edition — коммерческая версия с расширенной поддержкой</li><li>Tarantool CDC — Change Data Capture для синхронизации с другими системами</li><li>Tarantool Graph DB — графовая база данных</li><li>Tarantool Queue Enterprise — система очередей</li><li>Tarantool Column Store — колоночное хранилище для аналитики</li><li>Tarantool Clusters Federation — управление федерацией кластеров</li><li>Tarantool Kubernetes Operator — оператор для Kubernetes</li><li>Tarantool Cloud Edition — облачная версия</li></ul><h3>Горизонтальное масштабирование</h3><p>Переход с вертикального масштабирования (более мощное железо) на горизонтальное (больше узлов) снижает расходы на оборудование. Создание копий данных с быстрым доступом распределяет нагрузку между серверами.</p><p>Встроенные инструменты шардирования автоматически распределяют данные по узлам. Не нужно вручную настраивать балансировку или разбивать таблицы.</p><h3>Документация и поддержка</h3><p>Техническая документация доступна на русском языке. Есть руководства по началу работы для Enterprise Edition и Community Edition, документация по модулям и Data Grid.</p><p>Сообщество общается в Telegram, VK, GitHub и Stack Overflow. Есть блог с техническими статьями.</p><h2>5. ClickHouse: колоночная СУБД для аналитики</h2><p>Тип: колоночная OLAP-СУБД для онлайн-аналитической обработки</p><p><a href="https://clickhouse.com/docs/ru/intro">ClickHouse</a> — колоночная СУБД для аналитических задач, доступна как open-source проект и облачный сервис. Разработка началась в Яндексе, сейчас развивается как независимый проект. Основной фокус — обработка больших объёмов данных в режиме реального времени с возвратом результата за время менее секунды.</p><h3>OLAP vs OLTP</h3><p>ClickHouse решает задачи онлайн-аналитической обработки (OLAP): SQL-запросы со сложными вычислениями, агрегациями и арифметикой по миллиардам и триллионам строк. Аналитические запросы обрабатывают большие объёмы данных, в отличие от транзакционных (OLTP), которые читают и записывают несколько строк за запрос.</p><h3>Колоночное хранение</h3><p>Таблицы хранятся как набор столбцов: значения каждого столбца располагаются последовательно. Это затрудняет восстановление отдельных строк (между значениями строк появляются разрывы), но операции над столбцами — фильтрация, агрегация — выполняются значительно быстрее, чем в построчной базе.</p><p>При выполнении запроса с диска читаются только те столбцы, которые требуются. Если в таблице 100 столбцов, а запрос обращается к пяти, остальные 95 не загружаются в память. В построчной СУБД даже при обращении к одному столбцу приходится загружать данные всей строки, так как блоки на диске содержат значения всех столбцов вместе.</p><h3>Производительность</h3><p>На примере реальных данных веб-аналитики: запрос по 100 миллионам строк с фильтрацией и группировкой выполняется за 92 миллисекунды. Пропускная способность — около 1 миллиарда строк в секунду или около 7 ГБ данных в секунду.</p><h3>Приблизительные вычисления</h3><p>ClickHouse может жертвовать точностью ради производительности. Некоторые агрегатные функции вычисляют приблизительное количество различных значений, медиану и квантили. Запросы можно выполнять по выборке данных для быстрого получения приблизительного результата.</p><p>Агрегацию можно выполнять с ограниченным числом ключей вместо всех. При смещённом распределении ключей это даёт достаточно точный результат при меньших затратах ресурсов по сравнению с точным расчётом.</p><h3>SQL и стандарт ANSI</h3><p>ClickHouse поддерживает декларативный язык запросов на основе SQL, который во многих случаях соответствует стандарту ANSI SQL. Поддерживаются GROUP BY, ORDER BY, подзапросы в FROM, JOIN, оператор IN, оконные функции и скалярные подзапросы.</p><p>Синтаксис знаком разработчикам, работавшим с реляционными СУБД, но внутренняя логика выполнения запросов отличается из-за колоночного хранения.</p><h3>Репликация и целостность данных</h3><p>Используется асинхронная мультимастерная схема репликации для избыточного хранения данных на нескольких узлах. После записи на любую доступную реплику остальные реплики в фоновом режиме получают копию. Система поддерживает одинаковое состояние данных на разных репликах.</p><p>Восстановление после большинства сбоев выполняется автоматически или полуавтоматически в сложных случаях. Ролевое управление доступом (RBAC) реализовано через SQL-запросы, аналогично стандарту ANSI SQL и популярным реляционным СУБД.</p><h3>Адаптивные алгоритмы соединения</h3><p>ClickHouse адаптивно выбирает алгоритм соединения таблиц: начинает с быстрых хеш-соединений и переходит к merge-соединениям, если в запросе участвует более одной крупной таблицы. Система сама определяет оптимальную стратегию на основе характеристик данных.</p><h3>Сценарии использования</h3><p>ClickHouse применяют для веб-аналитики, логирования событий, мониторинга инфраструктуры, анализа временных рядов, обработки данных с датчиков IoT. Везде, где нужно агрегировать большие объёмы данных с низкой задержкой.</p><p>Типичный паттерн — сбор событий в реальном времени (клики, просмотры, логи) и построение дашбордов с обновлением каждые несколько секунд. ClickHouse обрабатывает миллиарды записей и возвращает результаты агрегации быстрее, чем традиционные хранилища данных.</p><h3>Open-source и облако</h3><p>Проект доступен на GitHub под лицензией Apache 2.0. Есть коммерческое облачное предложение ClickHouse Cloud с управляемой инфраструктурой. Можно развернуть на собственных серверах или использовать облачный вариант без управления кластером.</p><p>Выбор СУБД зависит от типа задач и архитектуры проекта. Для транзакционных систем с частыми операциями чтения-записи подходят РЕД База Данных и Postgres Pro — обе работают по модели OLTP, поддерживают ACID и совместимы с существующими инструментами разработки. Универсальная СУБД Tantor Postgres имеет специализированную версию для работы с 1С, производительность которой подтверждена тестами с одновременной работой десятков тысяч пользователей. Tarantool закрывает сценарии, где критична задержка в миллисекунды: кэширование, сессии, real-time биллинг. ClickHouse и Arenadata DB решают аналитические задачи, но по-разному: первый оптимизирован под скорость отдельных запросов с колоночным хранением, второй — под корпоративные хранилища данных с MPP-архитектурой и полной совместимостью с PostgreSQL.</p>]]></content:encoded>
    </item>
    <item>
      <title>7 облаков, которые не падают в проде</title>
      <link>https://tproger.ru/articles/7-oblakov--kotorye-ne-padayut-v-prode</link>
      <comments>https://tproger.ru/articles/7-oblakov--kotorye-ne-padayut-v-prode?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-oblakov--kotorye-ne-padayut-v-prode</guid>
      <description><![CDATA[<p>Сравнение 7 российских облачных платформ: от быстрых PaaS-решений до отказоустойчивых IaaS и выделенных серверов. На что смотреть при выборе облака для продакшена.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-oblakov--kotorye-ne-padayut-v-prode">7 облаков, которые не падают в проде</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Dec 2025 10:29:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой подборке мы собрали российские облачные платформы и хостинг-решения, которые закрывают самые разные задачи — от быстрого старта стартапа до масштабирования нагруженных корпоративных сервисов. Здесь есть сервисы с упором на полную автономию, отказоустойчивость, гибкую инфраструктуру и мощные bare metal-конфигурации, чтобы вы могли выбрать именно ту платформу, которая подойдёт вашему проекту по мощности, надёжности и бюджету.</p><h2>1. H3LLO.CLOUD</h2><p><a href="https://h3llo.cloud/">H3LLO.CLOUD</a> — молодая, но амбициозная облачная платформа гиперскейлерского уровня, построенная с нуля без легаси и на передовом железе. Облако уже находится в боевой эксплуатации, с гарантированным SLA 99.97% и возможностью масштабирования клиентских нагрузок в 10 раз и более в моменте. Команда обещает бенчмарк на уровне 1 миллиарда запросов в секунду — подобную нагрузку держит только AWS. Пока кейсы клиентов в процессе подготовки, платформа уже показывает уверенную стабильность: с момента запуска не было зафиксировано ни одного падения нагрузки в проде. Под капотом — каналы до 800 Гбит/с, внутренние сети на 400 Гбит/с, балансировщик нагрузки, автоскейлинг (в разработке), быстрый отклик техподдержки (от нескольких минут до пары часов).</p><p>H3LLO.CLOUD предлагает IaaS и PaaS: виртуальные машины, объектное хранилище (S3), DNS, балансировщики, базы данных, Kubernetes, очереди и SOC — всё на собственной платформе без OpenStack. В архитектуре предусмотрено размещение в трёх дата-центрах: два в IXCellerate (Москва) и один собственный, до конца года появятся еще пять региональных площадок. Используются серверы последнего поколения HP Proliant Gen11 на процессорах Intel Gen6 и памяти DDR5 — это дороже, но в 3 раза быстрее, обеспечивая до 40% экономии для клиента.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/9a3ed893-3771-493b-b243-513a0e3a3c59.png" alt="" /><figcaption>скриншот интерфейса</figcaption></figure><p>Условия тарификации прозрачны: базовый набор ресурсов (2 vCPU, 4 ГБ RAM, 40 ГБ диска, белый IP, база данных, 100 ГБ S3 и Load Balancer) предоставляется на год бесплатно при пополнении баланса всего на 5000₽. Управление — через собственную панель с мониторингом, поддержка API и скриптов для автоматизации.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/d86a7432-6d5a-46d0-8937-14e048691381.png" alt="" /></figure><h2>2. L1veStack</h2><p><a href="https://l1vestack.ru/">L1veStack</a> — бессерверная PaaS-платформа, созданная для быстрого развёртывания, управления и масштабирования приложений на базе Docker-контейнеров. Это решение фокусируется на упрощении работы DevOps-инженеров и разработчиков: запуск микросервисов происходит за секунды, а мониторинг и настройка портов — через интуитивную панель. SLA платформы составляет 99.97%, показатели отказоустойчивости и масштабируемости соответствуют продакшен-нагрузкам. Кейсы клиентов находятся в процессе, однако инфраструктура уже стабильно работает в разных сценариях: от слабонагруженных Dev-сред до боевых систем с нестабильным трафиком.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/b7fc746e-8a06-47b0-9f2e-2ab0807ebceb.png" alt="" /><figcaption>скриншот панели проектов</figcaption></figure><p>L1veStack подходит для тех, кто ищет баланс между простотой VPS и возможностями облачной архитектуры. Платформа реагирует на пиковые нагрузки, адаптируясь под разные среды: dev, stage, прод и внутренние сервисы. Средний аптайм — 99.97%, масштабирование происходит гибко и без участия пользователя.</p><p>Цены прозрачны:</p><ul><li>1%vCPU (High Performance) — 0,45 ₽/час</li><li>MB RAM (DDR5) — 0,00085 ₽/час</li><li>GB SSD (3xReplicated) — 0,015 ₽/час</li><li>IPv4 Public IP — 0,015 ₽/час</li></ul><p>Сейчас проект в бете: все ресурсы предоставляются бесплатно, а ранние пользователи получат бонусы. Управление — через удобную визуальную панель со статусами контейнеров и настройкой в пару кликов.</p><h2>3. Incloud</h2><p><a href="https://incloud.ru/">Incloud</a> — облачная платформа для бизнеса любого масштаба, работающая на отказоустойчивом кластере VMware с использованием Enterprise-СХД NetApp и HPE 3PAR. Вся инфраструктура резервирована: дублируются сетевые устройства, питание обеспечивается двумя вводами от разных подстанций и собственными дизельными генераторами. Это гарантирует стабильность и защищённость сервисов, что подтверждается аптаймом 100% за последние 12 месяцев при SLA 99.95%.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/3ae34478-fae1-45ba-b9ac-a51cf0d35d2f.png" alt="" /><figcaption>тест платформы</figcaption></figure><p>На платформе развёрнуты десятки проектов малого и среднего бизнеса, в том числе NT-IT — IT-аутсорсер, обслуживающий клиентов с разнообразной инфраструктурой. До перехода в облако Incloud компании приходилось сталкиваться с разрозненными системами и частыми инцидентами у разных провайдеров. После миграции в Incloud удалось централизовать управление пулами ресурсов, сократить сроки запуска новых проектов с нескольких дней до часов и снизить число простоев до минимума. Инженеры NT-IT отмечают быстрый отклик поддержки и возможность гибкого масштабирования без расширения штата.</p><p>Incloud предоставляет IaaS и SaaS-решения, включая корпоративную почту Exchange, базы данных и 1С. Масштабирование происходит мгновенно за счёт резерва мощностей: в любой момент можно увеличить ресурсы под пиковую нагрузку. Среднее время реакции техподдержки на инциденты — 15 минут.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/d99d2e13-2e4a-4718-8bf0-872152e5eb31.png" alt="" /></figure><p>Тарифы прозрачны: базовый CPU — от 250 ₽, RAM — от 200 ₽ за 1 ГБ, диски — от 4 ₽ за 1 ГБ (SATA) до 12 ₽ (SSD/NVMe), резервные копии — 2 ₽ за 1 ГБ. Для производительных конфигураций CPU доступен от 500 ₽ за ядро и RAM — от 250 ₽. Калькулятор для расчёта доступен на <a href="https://incloud.ru/cloud">сайте</a>.</p><h2>4. Cloud.ru</h2><p><a href="https://cloud.ru/evolution">Cloud.ru Evolution</a> — это масштабируемая облачная платформа, построенная на собственных технологиях и открытых компонентах. Пользователям доступны десятки IaaS- и PaaS-сервисов: от виртуальных машин и управляемых баз данных до платформы для ML-задач и AI-инструментов. Облачная инфраструктура размещена в дата-центрах Tier III на территории РФ, соответствует требованиям 152-ФЗ и аттестована по УЗ-1. SLA — 99.95%.</p><p>Платформа работает по модели «pay-as-you-go» и предлагает гибкую архитектуру: Managed Kubernetes, бессерверные контейнеры, балансировщики нагрузки, геораспределённые хранилища и поддержку Terraform. Есть и физические выделенные серверы, и мощные вычислительные ресурсы с GPU. Новые пользователи получают грант в 4000 бонусов и доступ к free tier. В числе PaaS-инструментов — Kafka, Redis, PostgreSQL, ArenadataDB, Spark, Trino и платформа AI Factory с LLM, инференсом, агентами и обучением ML-моделей в распределённой среде. Панель управления объединяет весь стек облачных сервисов и даёт полный контроль над расходами, доступами и ресурсами.</p><p>Cloud.ru подходит как для построения базовой инфраструктуры проекта, так и для сложных AI- и data-driven-сценариев. Среди преимуществ — поддержка контейнеров, работа с Terraform и CLI, встроенные инструменты безопасности и быстрое масштабирование.</p><p>Узнать цену для своего сервиса можно через <a href="https://cloud.ru/calculator">калькулятор</a>.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/c35eef73-0e6b-4244-90bc-03fd1088feee.png" alt="" /></figure><h2>5. Selectel</h2><p><a href="https://selectel.ru/services/cloud/private-cloud/">Частное облако Selectel</a> — решение для проектов со строгими требованиями к информационной безопасности и кастомизации. Оно может быть развернуто как на инфраструктуре Selectel, так и on-premise, с полным сопровождением инженеров 24/7, лицензированием по модели «за хост» и временем реакции на критические инциденты от 15 минут. Облако полностью совместимо с OpenStack и входит в реестр российского ПО.</p><p>Selectel проектирует архитектуру под конкретные задачи клиента: гибкая настройка железа (Intel Xeon, AMD EPYC, NVIDIA GPU), интеграция с СХД, конвергентное и гиперконвергентное хранение на базе Ceph. Возможны сценарии с геораспределённостью и гибридной инфраструктурой. Поддерживаются масштабируемые отказоустойчивые базы данных (PostgreSQL, Kafka, Redis и др.) и Managed Kubernetes до 1 500 нод с GPU-кластерами.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/78b63ed6-0f2f-4dc0-b5bb-ed26b39787c6.png" alt="" /><figcaption>информация с сайта</figcaption></figure><p>Компания также реализует меры защиты данных под любые регуляторные требования: 152-ФЗ, ФСТЭК №17/21, ГОСТ Р 57580, PCI DSS 4.0. Selectel помогает пройти аттестацию до К-1/УЗ-1 и развивать инфраструктуру с ежемесячными обновлениями и SLA до 99.98%. Это облако для тех, кому нужно не просто IaaS, а стабильная и безопасная цифровая среда, полностью адаптированная под бизнес.</p><p>Цены рассчитываются индивидуально.</p><h2>6. VK Cloud</h2><p><a href="https://cloud.vk.com/">VK Cloud</a> — универсальная облачная платформа, включающая широкий спектр IaaS- и PaaS-сервисов для разработки, хранения данных, масштабирования и построения отказоустойчивой cloud-native инфраструктуры. Платформа подходит как для стартапов, так и для крупных корпоративных заказчиков, предлагая гибкие условия подключения, бесплатную миграцию и сертифицированную безопасность.</p><p>VK Cloud предоставляет виртуальные серверы, сети, объектное хранилище, управляемые базы данных, Kubernetes-кластеры, а также решение VK Data Lakehouse для работы с большими данными. Вся инфраструктура размещена в дата-центрах уровня Tier III в России и соответствует требованиям 152-ФЗ, ГОСТ Р 57580, ISO, PCI DSS. Облачные серверы аттестованы по 152-ФЗ.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/d3b82010-3ce1-4100-9368-1d0717e9d4e9.png" alt="" /><figcaption>интерфейс</figcaption></figure><p>Платформа построена на OpenSource и российском ПО, обеспечивает единое резервируемое окружение, автоматическое масштабирование, плановые бэкапы и послеаварийное восстановление. SLA — 99,95% с финансовыми гарантиями. Поддержка 24/7 и «IT-служба одного окна» делают VK Cloud удобным выбором для любых сценариев.</p><p>Дополнительно: приветственный бонус 5000 ₽ для новых аккаунтов (до 12 000 ₽ — для юрлиц), гранты до 2 млн ₽ для стартапов и 10 000 ₽/мес. для благотворительных фондов.</p><h2>7. Timeweb.Cloud</h2><p><a href="https://timeweb.cloud/">Timeweb.Cloud</a> предлагает аренду выделенных серверов (bare metal) в дата-центрах уровня Tier III в России и Европе с гарантированным SLA до 99,98%. Это решение для тех, кто ищет высокую производительность, изолированную инфраструктуру и максимальную гибкость в управлении.</p><p>Вы получаете физический сервер полностью в своё распоряжение: root-доступ, KVM-консоль в панели управления, возможность установить любое ПО и ОС, а также подключать дополнительные процессоры, диски и шлюзы. Вся настройка доступна на уровнях сервера, железа и сети — вплоть до объединения в приватную сеть между регионами и провайдерами.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-03/27d92b8d-a909-41cd-9ad2-41d8ae3f7e92.png" alt="" /><figcaption>интерфейс</figcaption></figure><p>Timeweb.Cloud предоставляет мощные конфигурации на базе процессоров Intel Xeon Gold, AMD Ryzen 9 и EPYC, с NVMe-дисками и премиальными сборками от Supermicro и Gigabyte. Быстрый запуск готовых конфигураций — от 1 часа, индивидуальные — за 1 день.</p><p>Техподдержка — сильная сторона сервиса: персональный менеджер, ответы по телефону и в чате — за минуту, в тикетах — до 15 минут. Надёжность подтверждена соответствием 152-ФЗ, PCI DSS и ISO. Timeweb.Cloud — подходящее решение для разработчиков и бизнеса, которым нужно больше, чем просто «облако», и которые ценят контроль, мощность и поддержку.</p><h2>На что ориентироваться при выборе облака</h2><p>Универсального «идеального» облака не существует: платформа должна соответствовать именно вашим задачам. Для стартапов и быстрых MVP подойдут решения с простым управлением и гибкой тарификацией вроде L1veStack или H3LLO.CLOUD. Если ключевую роль играет отказоустойчивость и предсказуемый SLA — обратите внимание на Incloud, Cloud.ru или Selectel. Для работы с большими данными, ML и высоконагруженными сервисами удобнее использовать экосистемы уровня VK Cloud. А если требуется полный контроль над железом и гарантированная изоляция, оптимальным выбором станут выделенные серверы Timeweb.Cloud.</p><p>При выборе облака важно учитывать три фактора: технические возможности (производительность, поддержка контейнеров, интеграция с CI/CD), надёжность (аптайм, резервирование, дата-центры Tier III) и экономику (модель тарификации, стоимость ресурсов, наличие грантов и бонусов). Сравнив эти параметры в разрезе реальных сценариев, вы сможете выбрать платформу, которая не подведёт именно в вашем продакшене.</p>]]></content:encoded>
    </item>
    <item>
      <title>Хакеры взломали создателей единого реестра воинского учета РФ. И удалили данные оттуда</title>
      <link>https://tproger.ru/news/hakery-vzlomali-sozdatelej-edinogo-reestra-voinskogo-ucheta-rf--i-udalili-dannye-ottuda</link>
      <comments>https://tproger.ru/news/hakery-vzlomali-sozdatelej-edinogo-reestra-voinskogo-ucheta-rf--i-udalili-dannye-ottuda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/hakery-vzlomali-sozdatelej-edinogo-reestra-voinskogo-ucheta-rf--i-udalili-dannye-ottuda</guid>
      <description><![CDATA[<p>Хакеры взломали «Микорд» — разработчика реестра воинского учета РФ, заявив об удалении данных и доступе к исходникам и документации</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/hakery-vzlomali-sozdatelej-edinogo-reestra-voinskogo-ucheta-rf--i-udalili-dannye-ottuda">Хакеры взломали создателей единого реестра воинского учета РФ. И удалили данные оттуда</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Dec 2025 13:31:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Анонимная хакерская группировка заявила о крупной кибератаке на компанию «Микорд», которую СМИ называют одним из ключевых разработчиков единого цифрового реестра воинского учета.</p><p>Согласно имеющимся данным, злоумышленники проникли во внутренние системы компании и находились там несколько месяцев.</p><p>Хакеры утверждают, что получили доступ к исходному коду, технической документации, рабочим перепискам и внутренним сервисам.</p><p>Более того, они заявили, что удалили часть инфраструктуры, включая базы данных, которые, по их словам, были связаны с воинским учетом.</p><p>Пока не ясно, насколько масштабным было удаление — речь может идти как о фрагментах, так и о значительной части рабочих ресурсов компании.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-11/9d9ee223-aaf2-4c46-a4d4-6528b1597214.jpeg" alt="" /><figcaption>Сайт «Микорда» выдает пока что лишь это</figcaption></figure><h2>«Микорд» подтвердил факт взлома, но от комментариев уклонился</h2><p>По данным СМИ, директор «Микорда» Рамиль Габдрахманов подтвердил факт кибератаки, но отметил лишь, что «подобное случается со многими компаниями». От каких-либо уточнений он отказался.</p><p>Эта формулировка оставляет ситуацию неопределенной: нет публичных доказательств масштаба ущерба, но сам факт проникновения подтвержден.</p><h2>Что известно о самом реестре</h2><p>Единый цифровой реестр воинского учета создается с 2023 года. В проекте участвуют Минцифры, Ростелеком и подрядчики, среди которых пресса неоднократно упоминала «Микорд».</p><p>Ключевые даты:</p><ul><li>апрель 2023 — старт инициативы;</li><li>февраль 2024 — Ростелеком назначен единственным исполнителем госконтракта, срок завершения — 31 декабря 2024 года;</li><li>планировалось запустить систему осенью 2024 года, но полноценный запуск состоялся лишь в 2025-м;</li><li>с октября 2025 года военкоматы десятков регионов начали размещать электронные повестки, а четыре региона полностью отказались от бумажных носителей.</li></ul><p>Если данные, действительно удаленные хакерами, были связаны с реестром, это может привести к нарушению процессов уведомления, работе военкоматов и корректности сведений о призывниках.</p>]]></content:encoded>
    </item>
    <item>
      <title>Управляем несколькими СУБД из одного интерфейса: тестируем сервис</title>
      <link>https://tproger.ru/articles/upravlyaem-neskolkimi-subd-iz-odnogo-interfejsa--testiruem-servis</link>
      <comments>https://tproger.ru/articles/upravlyaem-neskolkimi-subd-iz-odnogo-interfejsa--testiruem-servis?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/upravlyaem-neskolkimi-subd-iz-odnogo-interfejsa--testiruem-servis</guid>
      <description><![CDATA[<p>Проверили инструмент для управления несколькими СУБД через один веб-интерфейс
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/upravlyaem-neskolkimi-subd-iz-odnogo-interfejsa--testiruem-servis">Управляем несколькими СУБД из одного интерфейса: тестируем сервис</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Dec 2025 10:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Развернуть кластер СУБД в продакшене, настроить мониторинг, организовать резервное копирование и распределить права доступа между командой — задачи, на которые уходит неделя, если делать всё вручную.</p><p>А если в проекте несколько кластеров на разных контурах и разные типы СУБД, время на администрирование бесполезно увеличивается. Проверили RT.ClusterManager — инструмент для управления несколькими СУБД через один веб-интерфейс</p><h2>Зачем нужен менеджер кластеров</h2><p>Типичная задача DBA выглядит так: развернуть кластер, настроить мониторинг метрик, организовать бэкапы, раздать права доступа разным специалистам команды. Для кластерных и MPP-решений добавляются риски — при обновлении ПО, изменении настроек или масштабировании можно сломать кластер, даже если вы действуете чисто по документации.​</p><p>Проблема масштабируется с количеством кластеров. Если у вас один Greenplum-кластер на проде, можно обойтись Ansible-скриптами и ручными операциями через psql. Но когда кластеров несколько — dev, stage, prod, плюс разные СУБД для логов и Hadoop для озера данных, — переключение между инструментами и повторение одних и тех же операций убивает время.</p><p>Чек-лист, когда нужен один интерфейс:</p><ul><li>У вас несколько кластеров на разных контурах (разработка, тестирование, продакшен)</li><li>В проекте используются разные типы СУБД — MPP для аналитики, колоночные для быстрых агрегаций, NoSQL для метаданных</li><li>С кластерами работают специалисты с разным уровнем доступа: разработчики могут читать метрики, DBA — масштабировать, поддержка — только просматривать логи</li><li>Требуется автоматизировать рутинные операции: развертывание новых нод, создание бэкапов по расписанию, установку расширений</li></ul><h2>Что решает RT.ClusterManager</h2><p>Управление базами данных в продакшене — это не только написание SQL-запросов. Типичная задача выглядит так: развернуть кластер, настроить мониторинг, организовать бэкапы, раздать права доступа разным специалистам. Если у вас несколько кластеров на разных контурах и разные типы СУБД, время на администрирование растёт кратно.​</p><p>RT.ClusterManager автоматизирует развёртывание и управление несколькими типами СУБД через веб-интерфейс. Инструмент работает с RT.Warehouse (на базе Greenplum), RT.WideStore (Clickhouse), RT.DataLake (Hadoop) и RT.KeyValue (Cassandra). Помимо СУБД, управляет другими решениями платформы TData: RT.MDM, RT.DataGovernance, RT.Streaming, RT.DataVision. Для хранения метаданных использует PostgreSQL.</p><p>Основной сценарий использования — когда команде нужно управлять несколькими кластерами на разных контурах без переключения между инструментами. Вместо ручного подключения к каждой ноде вы делаете операции через интерфейс.</p><h2>Как работает развёртывание</h2><p>Развёртывание происходит через протестированные Ansible-скрипты, собранные в плагины для работы с конкретным продуктом. При установке плагина и инсталляции продукта система сама проверяет готовность серверов перед установкой и сообщит об ошибках конфигурации, учтёт все зависимости компонентов и выдаст подробный лог установки.​</p><p>Помимо on-premise, RT.ClusterManager подготовлен для работы в облачных средах — включает плагины на базе Terraform для управления облачной инфраструктурой и взаимодействия с платформами контейнеризации.​</p><h2>Функции администрирования</h2><p>Инструмент покрывает стандартные операции DBA:​</p><ul><li><b>Масштабирование. </b>Горизонтальное и вертикальное масштабирование делается через интерфейс. Для MPP-кластеров это нужно — неправильная последовательность действий может привести к недоступности данных.​</li><li><b>Резервное копирование.</b> Создание резервных копий настраивается в интерфейсе. Можно автоматизировать бэкапы по расписанию.​</li><li><b>Расширения. </b>Можно устанавливать расширения вроде PostGIS или DiskQuota через интерфейс. Не нужно подключаться к нодам вручную.​</li><li><b>Мониторинг. </b>Встроен в веб-интерфейс — доступны метрики серверов и системных таблиц ядра Greenplum. Если стандартного набора метрик недостаточно, их можно расширить через модуль RT.Monitoring на базе Grafana.​</li><li><b>Настройка политик.</b> Можно настраивать парольные политики и контролировать данные. Задания по обслуживанию СУБД создаются в крон-формате из интерфейса.​</li></ul><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-08/17cfa27c-2ed9-4978-9018-86c770b8b5a1.png" alt="" /></figure><h2>Ролевая модель и доступы</h2><p>Можно настроить права для разных специалистов, по умолчанию доступны роли: Пользователь, Поддержка, Администратор, Супер-Администратор, Менеджер. Например, сотруднику поддержки можно дать доступ только на просмотр без возможности изменений. При необходимости создаются кастомные роли с уникальными правами.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-08/58332b38-675a-4e6f-9184-ba775995747b.png" alt="" /></figure><p>Ещё одна фишка — возможность разделить роли между продуктами. Администраторы СУБД не получат доступ к продуктам визуализации или управления данными, если это не требуется.​</p><p>Авторизация работает через локальные учётные записи или Active Directory по протоколу LDAP. Кластеры дополнительно поддерживают керберизацию.​</p><h2>RT.Warehouse: MPP-СУБД для аналитических нагрузок</h2><p>RT.Warehouse — это доработанная версия Greenplum 6.26.1 от вендора TData. СУБД ориентирована на аналитические задачи с большими объёмами данных и работает по архитектуре MPP (Massively Parallel Processing) — запросы распределяются между несколькими узлами для параллельной обработки.​</p><p>Основной сценарий использования — когда нужно обрабатывать петабайты данных и выполнять сложные аналитические запросы. Работа с данными происходит через стандартный SQL, что снижает порог входа для команд, знакомых с реляционными СУБД. Для интеграции с другими источниками данных доступны коннекторы и протоколы, включая кастомизированный PXF с шифрованием паролей JDBC-подключений.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-12-08/1823ba2a-312d-4b71-8853-4f384c790f4c.png" alt="" /></figure><p>RT.Warehouse поддерживает RBAC (Role-Based Access Control) — можно ограничить доступ к конкретным колонкам и определённым SQL-командам. Это важно, когда с одной базой работают разные отделы, и каждому нужен свой уровень доступа к данным.​</p><h2>Технические детали и масштабируемость</h2><p>Инструмент работает с кластерами любого размера — от одной ноды до десятков нод суммарным объёмом на сотни терабайт. Производительность интерфейса при этом не меняется. Доступны две темы оформления: светлая и тёмная.​</p><p>Развёртывание возможно в облаке, on-premise или в гибридной модели. Поддерживаются отечественные операционные системы: RedOS, Astra, ALT Linux. Продукт зарегистрирован в реестре российского ПО и имеет сертификат ФСТЭК-УД4.​</p><h2>Лицензирование и поддержка</h2><p>RT.ClusterManager лицензируется по инстансам и предоставляется условно бесплатно при оформлении основного продукта, например RT.Warehouse.​</p><p>RT.Warehouse лицензируется по ядрам CPU на сегмент-серверах. Лицензия предоставляется бессрочно или в формате годовой подписки. При покупке лицензии с технической поддержкой утверждается SLA реакции на инциденты и временем исправления.​</p><p>Доступны тестовые лицензии на срок до 90 дней с развёртыванием on-premise в инфраструктуре заказчика или в облаке вендора.​</p><p>Документация, интерфейс и техническая поддержка доступны на русском языке. TData совместно с партнёрами — учебными центрами, обладающими необходимыми лицензиями и компетенциями в продуктах — проводит обучение и сертификацию по продуктам платформы по запросу. Компания поддерживает канал в Telegram и публикует материалы на Rutube.​</p><h2>Когда имеет смысл использовать</h2><p>Единый интерфейс управления кластерами оправдан в нескольких сценариях:</p><ol><li><b>Несколько кластеров и разные СУБД</b>. Если у вас Greenplum для аналитики, Clickhouse для логов, Hadoop для озера данных — переключение между инструментами отнимает время. Единый интерфейс ускоряет рутинные операции.</li><li><b>Требования к сертификации.</b> Когда проект требует использования ПО из реестра российских решений или сертификата ФСТЭК, RT.ClusterManager и RT.Warehouse закрывают эти требования.​</li><li><b>Команда с разными ролями.</b> Если с кластерами работают разработчики, DBA, поддержка и менеджеры, ролевая модель позволяет разграничить доступ без дополнительных инструментов.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Создание простой поисковой системы, которая действительно работает</title>
      <link>https://tproger.ru/articles/sozdanie-prostoj-poiskovoj-sistemy--kotoraya-dejstvitelno-rabotaet</link>
      <comments>https://tproger.ru/articles/sozdanie-prostoj-poiskovoj-sistemy--kotoraya-dejstvitelno-rabotaet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sozdanie-prostoj-poiskovoj-sistemy--kotoraya-dejstvitelno-rabotaet</guid>
      <description><![CDATA[<p>Создайте свою собственную поисковую систему на PHP без внешних сервисов. Используйте токенизацию, веса и реляционные базы данных для точного и быстрого поиска по тексту. Полное руководство по реализации, индексированию и поиску.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sozdanie-prostoj-poiskovoj-sistemy--kotoraya-dejstvitelno-rabotaet">Создание простой поисковой системы, которая действительно работает</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Рекомендательные системы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Nov 2025 09:12:42 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Зачем строить свой собственный?</h2><p>Зачем вообще делать что-то своё?</p><p>Я знаю, что вы можете подумать: «Почему бы просто не использовать Elasticsearch?» или «А что насчёт Algolia?» Это вполне рабочие решения, но у них есть нюансы. Нужно разбираться с их API, поддерживать инфраструктуру под них и учитывать все тонкости их работы.</p><p>Но иногда хочется чего-то более простого — такого, что:</p><ul><li>работает прямо с вашей текущей базой данных;</li><li>не требует сторонних сервисов;</li><li>легко понять и отладить;</li><li>действительно выдаёт релевантные результаты.</li></ul><p>Поэтому я и сделал свою систему поиска — такую, которая использует вашу существующую БД, вписывается в архитектуру проекта и даёт полный контроль над тем, как она работает.</p><h2>Основная идея</h2><p>Концепция проста: разбить текст на токены, сохранить их, а затем при поиске сопоставлять токены запроса с токенами в индексе.</p><p>Процесс выглядит так:</p><ul><li>Индексация. Когда вы добавляете или обновляете данные, система разбивает текст на токены (слова, префиксы, n-граммы) и сохраняет их вместе с весами.</li><li>Поиск. Когда пользователь вводит запрос, он проходит такую же токенизацию. Затем система ищет совпадающие токены и подбирает подходящие документы.</li><li>Оценка. Сохранённые веса используются для расчёта итоговой релевантности.</li></ul><p>Вся суть — в том, как выполняется токенизация и как рассчитываются веса. Сейчас я покажу, что именно имеется в виду.</p><h2>Строительный блок 1: схема базы данных</h2><p>Для начала нам нужны всего две таблицы: index_tokens и index_entries.</p><h2>index_tokens</h2><p>В этой таблице хранятся все уникальные токены вместе с их весами, полученными от разных токенизаторов.</p><p>Важно: один и тот же токен может встречаться несколько раз с разными весами — по одному для каждого токенизатора.</p><figure><img src="https://media.tproger.ru/user-uploads/134517/2025-11-19/9429ca06-ac31-48ea-857e-70fab73c92e8.png" alt="" /></figure><h2>Почему так?</h2><p>Потому что разные токенизаторы создают один и тот же токен, но с разным весом.</p><p>Например, токен parser:</p><ul><li>WordTokenizer → вес 20</li><li>PrefixTokenizer → вес 5</li></ul><p>Чтобы итоговый механизм оценки релевантности работал правильно, нужны отдельные записи.</p><p>Ограничение уникальности в этой таблице — (name, weight).</p><p>То есть имя токена может повторяться, но вес — нет.</p><h2>index_entries</h2><p>Эта таблица связывает:</p><ul><li>токен</li><li>документ</li><li>конкретное поле документа</li></ul><p>…и хранит итоговый вес, который нужен для процедуры ранжирования.</p><h2>Структура таблицы index_entries</h2><figure><img src="https://media.tproger.ru/user-uploads/134517/2025-11-19/3cd82554-37a8-4530-90a6-173ef6613753.png" alt="" /></figure><h2>Что такое weight?</h2><p>Это итоговый вычисленный вес токена для конкретного поля конкретного документа.</p><p>Формула:</p><p>Он уже включает всё, что понадобится позже при начислении очков.</p><h2>Какие индексы добавляем?</h2><p>Чтобы поиск работал быстро:</p><ul><li>(document_type, document_id) — для быстрого получения документов</li><li>token_id — чтобы быстро находить все документы по токену</li><li>(document_type, field_id) — для поиска по конкретному полю</li><li>weight — для фильтрации по весам</li></ul><h2>Почему именно такая схема?</h2><p>Потому что она:</p><ul><li>простая</li><li>эффективно ложится на реляционные БД</li><li>использует сильные стороны SQL</li><li>позволяет масштабировать алгоритм без усложнений</li></ul><h2>Блок 2: токенизация</h2><h2>Что такое токенизация?</h2><p>Это процесс разбивки текста на более мелкие части — токены, удобные для поиска.</p><p>Например, слово «parser» можно разбить разными способами:</p><ul><li>Как одно целое: ["parser"]</li><li>На префиксы: ["par", "pars", "parse", "parser"]</li><li>На n-граммы (последовательности символов): ["par", "ars", "rse", "ser"]</li></ul><h2>Зачем несколько токенизаторов?</h2><p>Разные задачи требуют разных подходов к поиску:</p><ul><li>Один токенизатор для точных совпадений</li><li>Другой — для частичных совпадений</li><li>Третий — для учёта опечаток</li></ul><p>Каждый из них играет свою роль в итоговом ранжировании.</p><h2>Общий интерфейс токенизатора</h2><p>Все токенизаторы реализуют простой интерфейс:</p><p>Простой и расширяемый контракт.</p><h2>Токенизатор слов (WordTokenizer)</h2><p>Разбивает текст на отдельные слова. Слово «parser» превращается в</p><p>Этот метод отлично подходит для точных совпадений.</p><p>Вес: 20 — высокий, для точных совпадений.</p><h2>Префиксный токенизатор (PrefixTokenizer)</h2><p>Создаёт префиксы слов, например:</p><p>→</p><p>(минимальная длина префикса — 4).</p><p>Это полезно для поиска по частям слова и автодополнения.</p><p>Вес: 5 — средний, для частичных совпадений.</p><p>Зачем минимальная длина?</p><p>Чтобы избежать слишком большого количества коротких токенов — префиксы короче 4 символов обычно слишком распространены и малоэффективны.</p><h2>Токенизатор n-грамм (NGramsTokenizer)</h2><p>Создаёт последовательности символов фиксированной длины (обычно 3).</p><p>Например,</p><p>→</p><p>.</p><p>Это помогает улавливать опечатки и частичные совпадения.</p><p>Вес: 1 — низкий, но улавливает редкие случаи и опечатки.</p><p>Почему длина 3?</p><p>Это компромисс между слишком большим количеством совпадений и пропущенными вариантами из-за опечаток.</p><h2>Блок 3: Система весов</h2><p>В нашей системе есть три уровня весов, которые работают вместе, чтобы определить важность каждого токена при поиске:</p><ol><li>Вес поля — например, заголовок, основное содержание или ключевые слова. Разные части документа могут иметь разный приоритет.</li><li>Вес токенизатора — каждый тип токенизатора (слово, префикс, n-грамма) имеет свой вес. Эти веса хранятся в таблице index_tokens.</li><li>Вес документа — итоговый вес для конкретного токена в конкретном документе. Хранится в index_entries и рассчитывается по формуле:</li></ol><h2>Как рассчитывается итоговый вес?</h2><p>Во время индексации для каждого токена мы считаем вес так:</p><p>Например:</p><ul><li>Вес поля заголовка: 10</li><li>Вес токенизатора слов: 20</li><li>Длина токена «parser»: 6</li></ul><p>Тогда итоговый вес:</p><h2>Почему используется ceil(sqrt())?</h2><ul><li>Более длинные токены обычно более специфичны и важны — например, «parser» конкретнее, чем «par».</li><li>Но мы не хотим, чтобы очень длинные токены имели слишком большой вес — 100-символьный токен не должен давать вес в 100 раз больше, чем короткий.</li><li>Функция квадратного корня даёт убывающую доходность — вес растёт с длиной, но не линейно.</li><li>ceil() округляет результат вверх, чтобы сохранить веса целыми числами.</li></ul><h2>Настройка весов под свои задачи</h2><p>Вы можете гибко настраивать веса под свои нужды:</p><ul><li>Увеличить вес поля — например, если заголовки для вас важнее всего.</li><li>Изменить вес токенизатора — повысить для точных совпадений (слов), понизить для менее важных (n-граммы).</li><li>Изменить формулу для длины токена — вместо ceil(sqrt()) можно использовать логарифм или линейную функцию, чтобы по-другому влиять на вес длинных токенов.</li></ul><p>Таким образом, вы можете точно контролировать, какие части текста и какие типы совпадений важнее при поиске, и подстроить систему под свои требования.</p><h2>Блок 4: Служба индексирования</h2><p>Служба индексирования отвечает за обработку документов и сохранение всех их токенов в базе данных для последующего быстрого поиска.</p><h2>Интерфейс для документов</h2><p>Чтобы документ мог индексироваться, он должен реализовать интерфейс</p><p>с тремя методами:</p><ul><li>getDocumentId() — возвращает уникальный идентификатор документа.</li><li>getDocumentType() — возвращает тип документа (например, статья, пост, комментарий).</li><li>getIndexableFields() — возвращает поля документа, которые нужно индексировать, вместе с их весами.</li></ul><p>Пример реализации для статьи:</p><h2>Когда индексируем?</h2><ul><li>При создании или обновлении документа (например, через события).</li><li>По командам в консоли — например, app:index-document или app:reindex-documents.</li><li>Через задачи cron для массовой переиндексации.</li></ul><h2>Как работает индексирование — шаг за шагом</h2><ol><li>Получаем данные документа: его тип, ID и поля с весами.</li><li>Удаляем старый индекс для этого документа. Это важно, чтобы избежать дублирования данных.</li><li>Для каждого поля запускаем все токенизаторы, которые разбивают текст на токены.</li><li>Для каждого токена:Находим или создаём его в таблице токенов (чтобы не хранить одинаковые токены несколько раз).Рассчитываем итоговый вес по формуле:вес_поля × вес_токенизатора × ceil(квадратный_корень_из_длины_токена) Добавляем информацию в пакет для массовой вставки.Вставляем все новые записи в базу данных одним запросом — так быстрее и эффективнее.</li><li>Находим или создаём его в таблице токенов (чтобы не хранить одинаковые токены несколько раз).</li><li>Рассчитываем итоговый вес по формуле:вес_поля × вес_токенизатора × ceil(квадратный_корень_из_длины_токена) Добавляем информацию в пакет для массовой вставки.Вставляем все новые записи в базу данных одним запросом — так быстрее и эффективнее.</li></ol><h2>Зачем искать или создавать токены?</h2><p>Токены — это общие элементы для всех документов. Если токен уже есть, используем его повторно, чтобы не хранить дубли и сэкономить место и время.</p><ol><li>Ключевые моментыСтарый индекс удаляется перед созданием нового — это упрощает обновление.Используется пакетная вставка для производительности.Токены ищутся или создаются, чтобы избежать дубликатов.Итоговый вес считается динамически при индексации.</li><li>Ключевые моментыСтарый индекс удаляется перед созданием нового — это упрощает обновление.Используется пакетная вставка для производительности.Токены ищутся или создаются, чтобы избежать дубликатов.Итоговый вес считается динамически при индексации.</li><li>Старый индекс удаляется перед созданием нового — это упрощает обновление.</li><li>Используется пакетная вставка для производительности.</li><li>Токены ищутся или создаются, чтобы избежать дубликатов.</li><li>Итоговый вес считается динамически при индексации.</li></ol><h2>Блок 5: Служба поиска</h2><p>Поисковый сервис принимает строку запроса, разбивает её на токены, ищет эти токены в индексах и возвращает список документов, отсортированных по релевантности.</p><h2>Как это работает — шаг за шагом</h2><ol><li>Токенизация запроса</li></ol><p>Запрос разбивается на токены с помощью того же набора токенизаторов, который использовался при индексации документов. Это важно, чтобы поиск и индексирование были синхронизированы.</p><p>Пример:</p><ul><li>Индексация создала токены: par, pars, parse, parser (префиксный токенизатор).</li><li>Поиск тоже использует префиксный и обычный токенизатор — так мы найдём не только точное слово parser, но и все его варианты.</li></ul><p>Если запрос пустой (нет токенов), возвращаем пустой результат.</p><ol><li>Уникальные токены</li></ol><p>Из всех токенов берём только уникальные значения, чтобы не искать одинаковые токены по несколько раз.</p><ol><li>Сортировка токенов</li></ol><p>Токены сортируются по длине — сначала самые длинные. Это важно, потому что более длинные токены — более конкретные и дают более точные совпадения.</p><ol><li>Ограничение количества токенов</li></ol><p>Если пользователь отправит очень длинный запрос, мы ограничиваем число токенов (например, максимум 300), чтобы избежать нагрузок на систему.</p><ol><li>Выполнение поискового SQL-запроса</li></ol><p>Далее строится и выполняется оптимизированный SQL-запрос, который:</p><ul><li>Ищет документы, где встречаются эти токены.</li><li>Считает оценку релевантности для каждого документа.</li><li>Сортирует результаты по убыванию оценки.</li><li>Возвращает ограниченное число результатов (например, топ-10).</li></ul><h2>Как считается оценка релевантности?</h2><p>Оценка складывается из нескольких факторов:</p><ul><li>Базовый балл — сумма весов всех найденных токенов в документе.</li><li>Разнообразие токенов — документы с большим количеством разных токенов получают бонус (логарифмическая шкала, чтобы не давать слишком большой перевес).</li><li>Качество совпадений — чем выше средний вес токенов, тем лучше (например, совпадение в заголовке важнее, чем в теле текста).</li><li>Штраф за длину документа — чтобы длинные документы не имели слишком большое преимущество.</li></ul><p>В итоге оценка нормализуется на максимальное значение, чтобы можно было сравнивать разные поисковые запросы.</p><h2>Почему нужен подзапрос с весом токенов?</h2><p>В подзапросе проверяется, что документ содержит хотя бы один токен с весом выше порогового. Это исключает из результатов документы, которые совпадают только по «шумным» токенам с очень маленьким весом (например, незначительным n-граммам), что улучшает качество поиска.</p><h2>Пример возвращаемого результата</h2><p>Поиск возвращает список таких объектов — ID документа и его релевантность.</p><h2>Как получить сами документы?</h2><p>Мы берём ID из результатов поиска, и через репозиторий загружаем реальные объекты документов, сохраняя порядок релевантности.</p><p>Репозиторий гарантирует, что документы вернутся в том же порядке, что и результаты поиска (используется SQL-функция</p><h2>Итог</h2><p>В результате вы получаете мощную и гибкую поисковую систему, которая:</p><ul><li>Быстро находит релевантные документы через индексы в базе данных.</li><li>Обрабатывает опечатки и частичные совпадения с помощью n-грамм и префиксных токенизаторов.</li><li>Придаёт больше веса точным совпадениям (например, полным словам).</li><li>Работает без внешних сервисов — только с базой данных.</li><li>Легко отлаживается и настраивается за счёт прозрачного SQL и гибких весов.</li></ul><h2>Расширение системы</h2><h2>Добавление нового токенизатора</h2><p>Чтобы добавить новый способ разбиения текста на токены (например, стемминг, лемматизацию, синонимы и т.д.), нужно:</p><ul><li>Реализовать интерфейс TokenizerInterface, например:</li></ul><p>Зарегистрировать этот токенизатор в конфигурации сервиса — и он автоматически будет использоваться и для индексации, и для поиска.</p><h2>Добавление нового типа документа</h2><p>Чтобы индексировать новый тип документов (например, комментарии, статьи, профили), реализуйте интерфейс:</p><h2>Изменение весов и формул</h2><ul><li>Вес токенизаторов и полей легко настраивается через конфигурацию.</li><li>Формулы подсчёта релевантности находятся в SQL-запросе — вы можете его изменить, чтобы подстроить оценивание под свои задачи.</li></ul><h2>Заключение</h2><ul><li>Это простая и понятная поисковая система — нет сложных «черных ящиков» и магии.</li><li>Она легко контролируется, настраивается и отлаживается.</li><li>Подходит для большинства приложений, где не нужна гигантская инфраструктура типа Elasticsearch.</li><li>Главное — вы полностью управляете системой, понимаете каждый её шаг и можете улучшать её под свои нужды.</li></ul><p>Берите и делайте под себя — это ваш поиск, и он должен работать так, как вам нужно.</p>]]></content:encoded>
    </item>
    <item>
      <title>Генерируем CRUD для gRPC по схеме БД следуя Google AIP</title>
      <link>https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd</link>
      <comments>https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Украинский]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd</guid>
      <description><![CDATA[<p>Как с помощью db-exporter автоматизировать процесс генерации CRUD-операций для gRPC, соблюдая стандарт Google AIP</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/generiruem-crud-dlya-grpc-po-sheme-bd">Генерируем CRUD для gRPC по схеме БД следуя Google AIP</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[gRPC]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 20 Nov 2025 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>К сожалению, жизнь разработчика не всегда полна сложными и интересными задачами, время от времени мы все-таки пишем CRUD'ы.</p><p>Задача в целом проста:</p><ol><li>Открыть структуру таблицы</li><li>Скопировать названия колонок</li><li>Соотнести типы, которые существуют в спецификации (gRPC, OpenAPI, и т.п.)</li><li>Описать API метод</li><li>Проверить на соответствие стайл-гайду</li></ol><p>Но это утомительно и отнимает драгоценное время разработчиков. Данную  инструкцию за нас может выполнить инструмент <b>db-exporter. </b>В этой статье рассмотрим, как с его помощью автоматизировать процесс генерации CRUD-операций для gRPC, соблюдая <a href="https://google.aip.dev/121">стандарт</a> Google AIP по ресурсно-ориентированному дизайну.</p><p>В последующих разделах мы подробно рассмотрим:</p><ul><li>Принцип работы db-exporter</li><li>Процесс настройки и конфигурации</li><li>Примеры генерации различных типов операций</li><li>Валидацию сгенерированных proto файлов</li><li>Как внедрить инструмент для постоянной работы с ним</li></ul><h2>Знакомимся с инструментом</h2><p>db-exporter — это Open Source утилита для генерации кода и документации к схеме базы данных. «Экспортировать» можно в различные распространенные форматы: диаграмма классов, protobuf, код на Go и другие. На данный момент инструмент поддерживает PostgreSQL и MySQL. Реализована поддержка основных операционных систем. Инструмент достаточно молодой и активно развивается.</p><figure><img src="https://media.tproger.ru/user-uploads/133667/2025-10-31/fefdf04a-7291-41f2-9722-23a28266595f.png" alt="" /><figcaption>Принцип работы db-exporter</figcaption></figure><p>Для начала работы с db-exporter необходимо скачать его со страницы релизов. Далее разархивировать и переместить в /usr/local/bin. Или выполнить всё одной командой.</p><p><b>Mac OS</b></p><p><b>Linux</b></p><p>Теперь у нас установлен инструмент и мы почти готовы его запускать, но перед этим разберемся, составим пример таблицы, над которой будем проводить эксперименты.</p><h2>Составим пример</h2><p>Договоримся, что нашим примером для генерации кода будет являться таблица пользователей. У пользователей есть: id, имя, отчество, дата создания, статус (активен, заблокирован) и дата удаления.</p><p>Итого, схема выглядит так:</p><p>Данного примера достаточно для того, чтобы рассмотреть ключевые моменты:</p><ul><li>Генерация первичных ключей (поле id)</li><li>Генерация опциональных полей (поле middle_name)</li><li>Генерация временных меток (поля created_at, deleted_at)</li><li>Генерация енамов (поле status, енам user_status)</li><li>Работа с soft-delete</li></ul><h2>Генерируем protobuf</h2><p>Для того, чтобы запустить db-exporter необходимо описать конфигурацию —делается это декларативно, в yaml-файле. db-exporter оперируют задачами, в которых описаны:</p><ul><li>Формат, в котором нужно выполнить генерацию. В нашем случае — это grpc-crud<br /></li></ul><ul><li>Директория, в которую сохранить файлы</li><li>Специфичные формату параметры (далее: спека задачи)</li></ul><p>Также важно не забыть указать подключение к базе данных. В нашем примере, используется PostgreSQL на 5432 порту. Для успешного запуска стоит убедиться, что БД запущена и в ней есть схема с таблицами.</p><p>Итого, конфигурация, описывающая перечисленные требования, выглядит следующим образом:</p><p>Сохраняем этот файл, как .db-exporter.yaml.</p><p>Далее запускаем инструмент, выполняя команду db-exporter и получаем отчет о проделанной работе — db-exporter сообщает о том, какие файлы были созданы и какой они имеют вес.</p><figure><img src="https://media.tproger.ru/user-uploads/133667/2025-11-10/8ccb11d3-2595-4782-95ef-d920d8f76a0c.png" alt="" /><figcaption>Результат выполнения db-exporter</figcaption></figure><h3>Разбираемся, что получили на выходе</h3><p>В результате выполнения команды был сгенерирован файл users.proto, в котором используется синтаксис соответствует proto3. Файл содержит:</p><ul><li><b>UsersService</b> с методами <i>List</i>, <i>Get</i>, <i>Delete</i>, <i>Undelete</i>, <i>Create</i>, <i>Patch</i></li><li>Сообщение <b>User</b>, отражающее таблицу users</li><li>Енам <b>UserStatus</b></li></ul><h4>Сообщение User и enum UserStatus</h4><p>Сообщение User отражает структуру таблицы users и имеет вид:</p><p>Что здесь видим?</p><ol><li>id<i> </i>- uuid'ы генерируются, как строки. Первичный ключ помечается, как OUTPUT_ONLY, говоря о том, что поле используется только для ответов.</li><li>name, email сгенерированы, как строки</li><li>Поля created_at, deleted_at обернуто в гугловый Timestamp<i><br /></i></li><li>Для статуса пользователя сгенерирован енам UserStatus</li></ol><p>UserStatus выглядит следующим образом</p><h4>Метод для получения списка пользователя</h4><p>Метод List принимает на вход ListUsersRequest и возвращает ListUsersResponse</p><p>Запрос включает в себя поле с массивом идентификаторов пользователей. db-exporter добавляет в тело запроса первичный ключ, если первичный ключ состоит из одного поля. Также в запросе присутствует флаг <i>show_deleted</i>, как того требует стандарт <a href="https://google.aip.dev/132">AIP-132</a>, при работе с сущностями, поддерживающими soft-delete: по умолчанию сервер возвращает список активных пользователей, например, используя sql-запрос с фильтром deleted_at is null.</p><p>По умолчанию db-exporter добавляет token-based пагинацию, описанную в <a href="https://google.aip.dev/158">AIP-158</a>. Такая пагинация удобна для межсервисного взаимодействия. Но если основной клиент вашего API — это фронтенд, то вероятнее всего, вам нужна офсетная пагинация. Ее можно включить, добавив в спеку задачи pagination: offset. Если пагинация уж совсем не требуется, то pagination: none.</p><p>В ответе же список пользователей и токен следующей страницы.</p><h4>Метод получения пользователя</h4><p>Стандарт <a href="https://google.aip.dev/131">по получению ресурса</a> описывает достаточную простую конструкцию — Метод Get принимает на вход GetUserRequest и отдает на выход сообщение User.</p><p>Тело запроса включает в себя поле id, так как оно является первичным ключом.</p><h4>Методы удаления и восстановления пользователя</h4><p>Стандарт <a href="https://google.aip.dev/164">AIP-164</a> гласит: мало того, что сущность удаляется методом <b>Delete</b>, так еще нужно и мочь ее восстанавливать с помощью метода <b>Undelete</b>, если таблица поддерживает soft-delete.</p><p>Поэтому в результате генерации мы получаем методы Delete и Undelete: db-exporter самостоятельно определяет поддержку soft-delete у таблиц, смотря на поля <i>deleted_at</i> и <i>delete_time</i>.</p><p>Метод <b>Delete</b> принимает на вход DeleteUserRequest и отдает на выход DeleteUserResponse. Метод <b>Undelete </b>принимает UndeleteUserRequest и возвращает восстановленный ресурс User.</p><p>Тела запросов также, как и для метода Get, содержат поле первичного ключа — id.</p><p>По умолчанию возвращается <i>google.protobuf.Empty</i>, как требуется в стандарте<i>. </i>Возможна генерация пустого сообщения<i> DeleteUserResponse </i>— для этого нужно добавить параметр в спеку:</p><h3>Методы создания и обновления пользователя</h3><p>По стандартам <a href="https://google.aip.dev/133">AIP-133</a> и <a href="https://google.aip.dev/134">AIP-134</a> методы<b> Create</b> и <b>Update</b> имеют похожие сигнатуры.</p><p>Тела запросов также схожи, включают в себя ресурс User и возвращают его обновленную версию.</p><p>По стандарту поле update_mask предполагается использовать для частичного обновления сущности. <b>FieldMask</b> содержит в себе список полей, которые необходимо обновить у сущности User.</p><h3>Добавляем HTTP пути к методам</h3><p>В gRPC есть полезная опция <i>google.api.http</i>, с помощью которой можно указать HTTP адрес для метода. Ее полезно использовать, если вы используете REST поверх gRPC сервисов — например, с помощью grpc-gateway.</p><p>Наверняка, мы хорошие разработчики и версионируем свой API: установим версию v1 в параметре path_prefix.</p><p>И получаем вот такой результат:</p><h2>Валидируем результат</h2><p>Теперь, когда у нас есть файл users.proto — важно проверить, что он корректен синтаксически. Для этого соберем go-клиент, используя утилиту protoc.</p><h3>Указываем Go пакет</h3><p>Выше мы обсуждали gRPC контракты без привязки к конкретному стеку. Ну что ж, время пришло!</p><p>Для генерации Go-клиента в .proto файле необходимо указать опцию <b>go_package</b>. Мы можем сами поправить .proto файл, но при частом использовании db-exporter это будет не так удобно, поэтому скажем экспортеру, какой пакет нам нужен. Для этого нужно указать опцию в спеке задачи .db-exporter.yaml:</p><p>Нам остается еще раз сгенерировать users.proto, используя уже знакомую команду db-exporter.</p><h3>Собираем зависимости</h3><p>Сгенерированный users.proto импортирует зависимости <i>google.api </i>для указания HTTP методов/путей, обязательности полей. Их можно скачать с GitHub <i>googleapis</i>: <a href="https://github.com/googleapis/googleapis/blob/master/google/api/http.proto">http.proto</a>, <a href="https://raw.githubusercontent.com/googleapis/googleapis/refs/heads/master/google/api/field_behavior.proto">field_behavior.proto</a> и <a href="https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto">annotations.proto</a>.</p><p>Скачать зависимости можем следующим скриптом:</p><p>Итого мы должны были организовать следующую структуру файлов:</p><p>Теперь запустим генерацию гошного кода:</p><p>В результате выполнения команды в наш проект добавились 2 новых файла:</p><ul><li>pkg/api/users.pb.go — структуры для ресурса, запросов и ответов</li><li>pkg/api/users_grpc.pb.go — rpc-сервис UserService и клиент к нему</li></ul><p><b>Вывод</b>: из сгенерированного db-экспортером .proto файла можно сгенерировать валидный програмнный код. Считаем проверку успешно выполненной</p><h2>Непрерывная генерация</h2><h3>Перезапись файлов</h3><p>Собранная нами конфигурация отлично подходит для «одноразовых генераций», но со временем, когда сервис обрастет новыми методами, использовать генератор будет неудобно из-за того, что он по умолчанию перезаписывает уже существующие файлы. Чтобы избежать такой ситуации, необходимо указать генератору, что мы не хотим перезаписывать файлы. Сделать это можно, добавив опцию <i>skip_exists</i>.</p><p>Теперь db-exporter не будет перезаписывать уже существующие файлы и будет генерировать только новые.</p><h3>Генерация лишних таблиц</h3><p>По умолчанию db-exporter генерирует файлы по всем таблицам из схемы БД. В проекте может десяток или десятки таблиц, не для всех из них нужна генерация CRUD-операций. Генератору можно передать список таблиц, по которым необходимо генерировать файлы.</p><p>Но править постоянно конфиг не очень удобно. Укажем переменную.</p><p>Теперь мы можем запускать генерацию по конкретным таблицам, например вот так:</p><p>Или обернуть это в Makefile:</p><p>Использовать эту конструкцию можно следующим образом:</p><h2>Что в итоге?</h2><p>В итоге мы собрали рабочую конфигурацию db-exporter, которая позволяет генерировать CRUD по схеме БД в валидный .proto файл, включая полезные опции: <i>google.api.field_behavior</i> и <i>google.api.http</i>. Собранную конфигурацию и необходимое окружение вы сможете найти по <a href="https://github.com/ArtARTs36/db-exporter/tree/master/examples/grpc-crud">этой ссылке</a>.</p><p>Надеюсь, этот пост был для вас полезным и поможет ускорить разработку крудов. Если у вас есть предложения по улучшению/расширению кодо-генератора, добро пожаловать в <a href="https://github.com/ArtARTs36/db-exporter">репозиторий</a>.</p><p>В репозитории вы также сможете найти примеры генерации диаграмм классов, mermaid, markdown и так далее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие приложения установить на Windows и macOS</title>
      <link>https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos</link>
      <comments>https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos</guid>
      <description><![CDATA[<p>Список разбит по категориям: от браузеров и гейминга до утилит безопасности и инструментов для продуктивности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos">Какие приложения установить на Windows и macOS</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Slack]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Windows 10]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Управление проектами]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Xbox]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Firefox]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[Avast]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Epic Games]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Safari]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[PlayStation]]></category>
      <category><![CDATA[Microsoft Edge]]></category>
      <category><![CDATA[Discord]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[RPA]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Steam]]></category>
      <category><![CDATA[GPU]]></category>
      <category><![CDATA[iPhone]]></category>
      <category><![CDATA[MacBook]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Итак, вы только что настроили новый компьютер. Операционная система установлена, драйверы обновлены, и теперь пора заняться самым интересным — установкой программ. Но с чего начать? Какие приложения действительно необходимы, а какие просто занимают место?</p><p>Редакция Tproger сделала и адаптировала <a href="https://www.techspot.com/article/2974-desktop-software-essentials/">перевод подборки  программ для Windows и macOS</a>. Здесь вы найдёте проверенные временем решения для работы, развлечений и повседневных задач. Мы сосредоточились на бесплатных и условно-бесплатных приложениях с отличной репутацией, которые решают реальные задачи без навязывания ненужных функций.</p><p>Список разбит по категориям: от браузеров и гейминга до утилит безопасности и инструментов для продуктивности.</p><p>Неважно, опытный вы пользователь или новичок — здесь найдётся что-то полезное для каждого.</p><h2>Браузеры</h2><p>Браузер — это, пожалуй, самое важное приложение на вашем компьютере. Именно через него проходит большая часть вашей цифровой жизни: работа, развлечения, коммуникации. Выбор браузера влияет не только на скорость загрузки страниц, но и на конфиденциальность, безопасность и удобство работы.</p><ul><li><b>Большинство пользователей:</b> Chrome, Edge или Safari</li><li><b>Защита приватности: </b>Firefox, Brave, Ungoogled Chromium</li><li><b>Опытные пользователи:</b> Vivaldi</li><li><b>Максимальная анонимность: </b>Tor Browser</li></ul><h3>Google Chrome</h3><p>Chrome остаётся самым популярным браузером в мире — и не просто так. Он быстрый, стабильный и отлично интегрируется с экосистемой Google. Огромная библиотека расширений из Chrome Web Store позволяет настроить браузер под любые задачи. Синхронизация между устройствами работает безупречно: вкладки, пароли, закладки и история всегда под рукой.</p><p>Минус один, но существенный: Chrome прожорлив. Если у вас открыто больше десятка вкладок, он может съесть несколько гигабайт оперативной памяти. На компьютерах с 8 ГБ RAM и меньше это становится проблемой.</p><h3>Mozilla Firefox</h3><p>Firefox — это выбор тех, кто ценит приватность и открытость. Mozilla не зарабатывает на продаже ваших данных, а сам браузер активно развивается сообществом. Встроенные инструменты защиты от трекинга работают из коробки, блокируя рекламные сети и скрипты слежения.</p><p>По скорости Firefox не уступает Chrome, а по потреблению памяти даже выигрывает. Библиотека расширений чуть меньше, чем у Chrome, но все основные инструменты доступны.</p><h3>Microsoft Edge</h3><p>Edge построен на том же движке Chromium, что и Chrome, но при этом лучше оптимизирован для Windows. Microsoft вложилась в производительность: браузер работает быстро, потребляет меньше ресурсов и отлично интегрируется с системой.</p><p>Особенно приятны функции вроде Collections (коллекции вкладок для организации исследований), режим чтения и встроенный скриншотер. Edge поддерживает все расширения Chrome, так что переход безболезненный.</p><h3>Brave</h3><p>Brave — это Chrome на стероидах приватности. Браузер блокирует рекламу и трекеры по умолчанию, что делает сёрфинг быстрее и безопаснее. При этом он полностью совместим с расширениями Chrome.</p><p>Есть интересная фишка: Brave Rewards позволяет зарабатывать криптовалюту за просмотр приватной рекламы (если захотите её включить). Спорная механика, но как опция — почему нет. Для тех, кто хочет Chrome без Google и с упором на приватность, Brave — отличный выбор.</p><h3>Safari (только macOS)</h3><p>Если у вас Mac, Safari заслуживает внимания. Это самый энергоэффективный браузер для macOS: на MacBook он даёт ощутимо больше автономности по сравнению с Chrome или Firefox. Интеграция с экосистемой Apple безупречна: Handoff, синхронизация через iCloud, Reading List, автозаполнение паролей.</p><p>Safari быстрый, безопасный и не перегружен функциями. Единственный минус — библиотека расширений заметно скромнее, чем у конкурентов. Но для большинства задач базового функционала хватает.</p><h3>Ungoogled Chromium</h3><p>Для ультраосторожных Ungoogled Chromium удаляет всё отслеживание и сервисы Google — но вам придётся настраивать всё самостоятельно, так как в нём нет автообновлений или встроенной синхронизации.</p><p>Для максимально осторожных пользователей — это Chrome, из которого убрали всю телеметрию Google, отслеживание и облачные сервисы. Браузер работает, но требует ручной настройки: отсутствуют автоматические обновления и встроенная синхронизация между устройствами.</p><h3>Tor Browser</h3><p>Выводя приватность на следующий уровень, Tor Browser маршрутизирует ваш трафик через сеть Tor, анонимизируя ваш IP и многократно шифруя соединение. Он медленнее по задумке, но идеален, если ваш приоритет — максимальная анонимность, а не скорость или удобство.</p><h3>Vivaldi</h3><p>Vivaldi — браузер мечты для тех, кто хочет полного контроля. Стекирование вкладок, тайлинг, кастомные горячие клавиши, встроенная почта и календарь, веб-панели — это полноценный десктопный опыт внутри браузера. Хотите боковую панель браузера, открывающую ваши заметки, RSS-ленты или любой нужный сайт? Vivaldi это умеет.</p><h3>Arc</h3><p>Наконец, Arc — когда-то новичок на рынке браузеров, нацеленный на переосмысление UX: замена традиционной панели вкладок на боковую панель, акцент на веб-приложениях, интегрированные разделённые виды и easels для заметок и доски. К сожалению, компания за Arc прекратила разработку, чтобы полностью переключиться на ИИ с новым браузером, который сейчас в закрытой бета-версии.</p><h2>Управление паролями</h2><ul><li><b>Лучший бесплатный выбор:</b> Bitwarden</li><li><b>Также отлично:</b> 1Password, Dashlane, KeePass</li></ul><p>Миллионы людей продолжают использовать одни и те же слабые пароли на всех сайтах — или, что ещё хуже, держатся за классику вроде «123456». Даже сильные пароли мало помогают, если их повторяют или забывают. Конечно, большинство браузеров предлагают встроенные менеджеры паролей, но они ограничены, привязаны к одному браузеру и менее безопасны, чем специализированные решения.</p><p>Также не будем забывать о passkeys (ключах доступа). Если говорить практически, можно сказать, что passkeys объединяют концепцию пароля и двухфакторной аутентификации (2FA) в одно плавное действие, но гораздо безопаснее и гораздо менее раздражающе.</p><h3>Bitwarden</h3><p>Полностью опенсорсный, зашифрованный и щедрый даже в бесплатной версии. Вы получаете неограниченное количество паролей, синхронизацию между устройствами и приложения для всех платформ. Премиум ($10/год) добавляет безопасный обмен файлами и инструменты 2FA. Также есть доступные семейные и командные планы.</p><h3>1Password</h3><p>Премиум-решение с отполированным интерфейсом, сильной кроссплатформенной поддержкой и отличными функциями вроде Travel Mode (режим путешествий) и полной интеграцией passkeys.</p><h3>Dashlane</h3><p>Предлагает мониторинг даркнета, интеграцию VPN и плавный пользовательский опыт. Есть бесплатный тариф с ограниченными функциями, но премиум-версия конкурентоспособна.</p><h3>KeePassXC</h3><p>Отличная оффлайн-альтернатива, если хотите полного контроля и не против ручной синхронизации (или использования чего-то вроде Syncthing или Dropbox для синхронизации базы данных).</p><p>Пропустите LastPass — когда-то фаворит, он упал в немилость после повторных утечек безопасности. Для душевного спокойствия лучше поискать в другом месте.</p><h2>Продвинутые утилиты и дополнения к ОС</h2><ul><li><b>Поиск + лаунчеры:</b> Everything или Wox (Windows), Alfred или Raycast (macOS)</li><li><b>Пакетные менеджеры: </b>WinGet, Homebrew (macOS)</li><li><b>Для пользователей Windows:</b> PowerToys</li><li><b>Для пользователей Mac: </b>Rectangle</li><li><b>История буфера обмена: </b>ClipClip, Flycut (macOS)</li><li><b>Скриншоты + аннотации: </b>Monosnap</li></ul><h3>Winget</h3><p><b></b>Официальный менеджер пакетов Microsoft, встроенный в Windows 10 и 11. Работает похоже на Chocolatey, но разработан и поддерживается Microsoft. Homebrew — самый популярный менеджер пакетов для macOS. Позволяет быстро устанавливать, обновлять и управлять приложениями и CLI-инструментами с помощью команд в терминале.</p><h3>Everything</h3><p>Что касается поиска, Everything остаётся золотым стандартом сверхбыстрого поиска по именам файлов в Windows. Он индексирует диски за секунды и выдаёт почти мгновенные результаты с минимальной нагрузкой на систему. Если нужен функционал шире базового поиска, Wox использует движок Everything и добавляет мощные возможности лаунчера: поиск файлов, запуск приложений, калькулятор, перевод текста и расширения через плагины. Получается более гибкий опыт в духе Spotlight для Windows.</p><h3>Command Palette/Alfred/Raycast</h3><p>В который раз Microsoft не смогла существенно улучшить встроенный поиск Windows, хотя <b>Command Palette</b> в PowerToys даёт неплохой компромисс для тех, кто не хочет ставить сторонние утилиты.</p><p>На macOS <b>Alfred</b> по-прежнему главный лаунчер и утилита поиска. Он быстрый, интуитивный и в бесплатной версии включает историю буфера и настраиваемые поиски; расширенная автоматизация и «воркфлоу» доступны в Powerpack.</p><p>Тем, кто хочет современную облачно-интегрированную альтернативу с готовыми расширениями и встроенной поддержкой Notion, GitHub и Slack, стоит присмотреться к <b>Raycast</b> — это стильный, дружественный к разработчикам вариант, который стремительно набирает популярность.</p><h3>Менеджеры буфера обмена</h3><p>Они позволяют возвращаться к ранее скопированному — тексту, изображениям, ссылкам — и сильно ускоряют рутинные операции.</p><p>В Windows встроенная история буфера (Win + V) кое-как выручает, но продвинутым пользователям обычно хочется большего. В числе бесплатных рекомендаций — <b>ClipClip</b> для Windows и <b>Flycut</b> для macOS.</p><p>Когда речь о скриншотах и аннотациях, штатные инструменты macOS и Windows заметно выросли. Но многим всё равно удобнее сторонние решения. Нам по-прежнему нравится <b>Monosnap</b> за простоту и возможность мгновенно заливать снимки в облако для шаринга (и это бесплатно).</p><p><b>PowerToys</b> — набор полезных утилит от Microsoft для продвинутых пользователей Windows, повышающих продуктивность и упрощающих рабочие процессы. Среди инструментов: FancyZones для продвинутого раскладывания окон, PowerRename для пакетного переименования, Keyboard Manager для ремапинга клавиш, универсальный color picker и другие.</p><p><b>Rectangle</b> и <b>Magnet </b>— два самых популярных приложения на macOS для закрепления окон: быстрые выравнивание и ресайз по хоткеям или перетаскиванием, примерно как по умолчанию в Windows. Пользователям, пришедшим с Windows и скучающим по системному снапингу, одно из них жизненно необходимо.</p><p>Широко используемая альтернатива в Windows — <b>FancyZones</b> (часть PowerToys), предлагающая продвинутое управление окнами: настраиваемые сетки, зоны привязки и поддержку нескольких мониторов — поэтому это фаворит пауэр-пользователей на Windows.</p><h2>Для рутины и создания проектов</h2><ul><li><b>Бесплатные инструменты: </b>FreeOffice, LibreOffice и WPS Office</li><li>Microsoft Office за единовременную плату $49, Office 2024 — $129</li><li><b>Заметки: </b>Notion, OneNote, Obsidian</li><li><b>Бесплатный PDF-редактор: </b>PDFsam</li><li><b>Почтовые клиенты:</b> Thunderbird, eM Client</li></ul><p>Независимо от того, пишете ли вы тексты, планируете проект, кодите или наводите порядок в цифровой жизни, правильные инструменты решают многое. Сегодня выбор топовых приложений для продуктивности и разработки — часто бесплатных — лучше, чем когда-либо.</p><p><b>Microsoft Office</b> остаётся отраслевым стандартом для профессиональной продуктивности. Подписка Microsoft 365 открывает доступ к Word, Excel, PowerPoint, Outlook и включает 1 ТБ облачного хранилища.</p><p>Среди бесплатных альтернатив LibreOffice — мощный open-source комплект с сильным сообществом (хотя интерфейс некоторым кажется старомодным). Если нужна внешне более майкрософтовская альтернатива, попробуйте<b> FreeOffice </b>или <b>WPS Office Free</b> — у них хорошая совместимость.</p><p>На macOS <b>Pages</b>, <b>Numbers</b> и <b>Keynote</b> предустановлены и более чем достаточны для большинства задач, особенно если вы в экосистеме Apple.</p><h3>Знания и ведение заметок</h3><p><b>Notion</b> стал универсальной платформой организации: заметки, базы данных, to-do, управление проектами, создания совместных рабочих пространств. Если нужны более локальные заметки с синхронизацией между устройствами и поддержкой Markdown, <b>Obsidian</b> — любимец студентов и исследователей.</p><p>Для быстрых кроссплатформенных заметок <b>OneNote</b> — крепкий бесплатный вариант от Microsoft. В качестве альтернатив — <b>Simplenote</b> или open-source <b>Joplin</b>.</p><p>Если вы занимаетесь академической работой и научными статьями, <b>Zotero</b> — отличный open-source менеджер источников с интеграцией в браузер и совместными коллекциями. <b>Milanote</b> предлагает визуальный подход к заметкам и планированию — идеально для креативных пользователей.</p><h3>Работа с PDF</h3><p>Хотя Adobe Acrobat остаётся премиальным редактором PDF, бесплатные альтернативы вроде <b>PDFsam</b> позволяют без усилий объединять, разбивать, редактировать и поворачивать страницы.</p><h2>Инструменты для дизайна и создания контента</h2><p>Для дизайна два выделяющихся приложения хорошо дополняют набор продуктивности. <b>Figma Desktop</b> — совместная платформа интерфейс-дизайна, широко используемая UI/UX-дизайнерами и фронтенд-разработчиками. Десктоп-версия работает быстрее, чем браузер, и лучше интегрируется с ОС — это удобно для сложных дизайн-систем и коллаборации в реальном времени.</p><p><b>Canva</b> с интуитивным drag-and-drop превосходно чувствует себя и как десктоп-приложение. Отлично подходит для быстрых графических материалов для соцсетей, маркетинга, постеров и презентаций. Благодаря тысячам шаблонов и совместной работе это фаворит как у профи, так и у новичков.</p><h2>Почтовые клиенты</h2><p>Если вы предпочитаете отдельный почтовый клиент, у <b>eM Client</b> много функций, бесплатный — до двух аккаунтов. <b>Mozilla</b> <b>Thunderbird</b> — мощная open-source альтернатива с удобной настраиваемостью, а <b>Mailbird</b> — вариант с упором на продуктивность для тех, кого не пугает подписка.</p><h2>Инструменты разработчика</h2><ul><li><b>Редакторы кода и текста:</b> VS Code, Cursor, Sublime Text</li><li><b>Система контроля версий:</b> SourceTree, GitHub Desktop</li><li><b>Контейнеры: </b>Docker</li><li><b>Локальные LLM: </b>Ollama</li><li><b>SFTP, загрузка файлов:</b> WinSCP, Forklift</li></ul><p>Для разработчиков <b>Visual Studio Code</b> — безусловный вариант. Бесплатный, лёгкий, но мощный, кроссплатформенный — тысячи расширений покрывают практически любой язык, фреймворк или инструмент. Набирающая популярность альтернатива — <b>Cursor</b>, редактор на базе VS Code с усиленной AI-помощью. Он подходит для связки с LLM: даёт inline-подсказки, генерирует код, рефакторит и позволяет редактировать кодовую базу.</p><p>При этом<b> Sublime Text </b>остаётся для скорости и простоты, а <b>Notepad++</b> — отличный лёгкий редактор для быстрых правок в Windows.</p><p>Для Git графические клиенты <b>SourceTree</b> и <b>SmartGit</b> дают понятный интерфейс для управления репозиториями на GitHub, GitLab и не только. <b>GitHub Desktop</b> раньше был простоват и не слишком хорош, но сейчас существенно прибавил — всё ещё простой для работы, но в хорошем смысле.</p><p>Для локальных окружений, API-тестирования или терминального воркфлоу инструментов — пруд пруди. Например, <b>Docker Desktop</b> стал стандартом для тех, кто собирает и запускает контейнеризированные приложения на разных платформах. Он упрощает настройку окружений и держит систему чистой.</p><p><b>Ollama</b> позволяет запускать большие языковые модели (LLM) локально с минимальной настройкой. Поддерживает модели вроде LLaMA, Mistral и другие open-weight альтернативы GPT, так что можно работать с ИИ прямо на своём компьютере без отправки данных в облако.</p><p>Если вы работаете с облачными хранилищами или SFTP, WinSCP (Windows) и ForkLift (macOS) — отличные клиенты с двухпанельным управлением файлами, синхронизацией и автоматизацией. На Mac также популярны <b>Commander One</b> и <b>Transmit</b> — у них есть встроенные подключения к удалённым и облачным путям.</p><h3>Безопасность</h3><p>И Windows, и macOS сегодня предлагают более чем достойную встроенную защиту. С защитой в реальном времени, интеграцией с файерволом и биометрией вроде <b>Windows Hello</b> и <b>Touch ID</b>. Для обычных пользователей, которые соблюдают гигиену безопасности: не скачивают сомнительное ПО, используют менеджеры паролей и включают 2FA — встроенной защиты часто хватает.</p><p>Для продвинутых пользователей есть дополнительные варианты.</p><p>Отличное первое дополнение — <b>Malwarebytes</b>. Это давний фаворит в обнаружении и удалении malware, adware и руткитов; бесплатная версия по-прежнему хороша для ручных сканов. В платной — защита в реальном времени без ощутимой просадки производительности.</p><p>Если не хочется ставить традиционный антивирус, есть достойные альтернативы. <b>Emsisoft Emergency Kit</b> — мощный портативный сканер, который можно запускать с флешки: идеально для редких глубоких сканов или лечения заражённых систем без установки чего-либо. Просто подключаете, когда нужно.</p><p>Ещё один отличный инструмент — <b>VirusTotal</b>: бесплатный веб-сервис, который проверяет файлы и URL через десятки антивирусных движков. Прежде чем открывать подозрительную загрузку, можно залить файл на VirusTotal.com или использовать их расширение для браузера, чтобы проверять ссылки в реальном времени. Быстро, просто и удобно для осторожных пользователей.</p><p>Мы не поклонники установки антивирусов на каждый компьютер и не полностью в курсе, какие сейчас показывают лучшие результаты. Тем не менее, <b>AV-Tes</b>t давно и регулярно оценивает популярные решения, поэтому советуем смотреть их свежие отчёты. В текущем списке высокооценённых — <b>Avast, BitDefender, ESET </b>и другие; многие из них предлагают бесплатные версии для пробы.</p><h3>Удалённый доступ и вспомогательные утилиты</h3><p><b>RustDesk</b> стал современным, ориентированным на приватность аналогом <b>TeamViewer</b>. Он с открытым исходным кодом, быстрый и работает кроссплатформенно.</p><p>Тем, кому нужны более устоявшиеся коммерческие решения, подойдёт <b>AnyDesk</b>, который остаётся лёгким и надёжным вариантом для личного и командного использования.</p><p>Превращение смартфона в пульт дистанционного управления компьютером бывает невероятно удобно — будь то презентации, потоковое видео или просто навигация с дивана.</p><p><b>Remote Mouse</b> — простой и эффективный способ эмулировать мышь и клавиатуру с телефона. Для более продвинутых сценариев можно использовать приложения вроде <b>Unified Remote.</b></p><h2>Редактирование изображений и видео</h2><ul><li><b>Профессиональный видеомонтаж:</b> DaVinci Resolve</li><li><b>Простой видеомонтаж: </b>CapCut</li><li><b>Редакторы изображений:</b> GIMP, PhotoDemon, Pixelmator Pro</li><li><b>Бесплатное улучшение изображений:</b> Upscayl</li><li><b>RAW-редактирование:</b> RawTherapee</li><li><b>Видеоконвертация:</b> HandBrake</li></ul><p>Если вам нужен бесплатный инструмент для редактирования изображений, <b>GIMP</b> — один из самых мощных вариантов. Он предоставляет профессиональные возможности, такие как слои, маски и настраиваемые плагины, что делает его идеальным для продвинутых пользователей. Если вы ищете более лёгкий редактор с чистым интерфейсом, стоит обратить внимание на <b>PhotoDemon</b>. Он работает как портативное приложение на Windows, поддерживает слои и редактирование — отличный выбор для быстрых правок или ретуши.</p><p>Если вы хотите увеличивать разрешение изображений без потери качества, <b>Upscayl</b> — мощный и бесплатный инструмент для апскейла. Он кроссплатформенный, и по нашим тестам показывает результаты на уровне платных решений вроде Topaz.</p><p>Для векторной графики — логотипы, иллюстрации — <b>Inkscape</b> является достойным open-source вариантом с полной поддержкой редактирования SVG. <b>Krita</b> — ещё один отличный бесплатный инструмент, особенно подходящий для цифровой живописи и художественного творчества.</p><p>Для редактирования RAW-фотографий, <b>Darktable</b> и <b>RawTherapee</b> — два высококлассных open-source аналога Adobe Lightroom. Их широко используют фотографы, которым нужна работа с изображениями без подписки.</p><p>Для простых GIF-анимаций <b>ScreenToGif</b> — удобная утилита, мгновенно записывающая область экрана и экспортирующая в GIF или другие форматы с оверлеями.</p><p>Среди платных фоторедакторов <b>Adobe Photoshop</b> остаётся лидером, но для macOS есть <b>Pixelmator Pro</b> — мощное приложение с разовой оплатой, а <b>Affinity Photo</b> предлагает профессиональные возможности по более доступной цене.</p><h3>Видеомонтаж и конвертация</h3><p><b>DaVinci Resolve</b> считается лучшим бесплатным профессиональным ПО. Его используют и энтузиасты, и профессионалы — от простого тримминга до цветокоррекции и сложного постпродакшена.</p><p><b>Shotcut</b> и <b>Kdenlive</b> — тоже сильные бесплатные варианты, предлагают более простой фукнционал с хорошим набором функций для новичков и продвинутых пользователей. <b>CapCut</b>, изначально мобильное приложение, теперь доступен на десктопе — идеально подходит для быстрых монтажей и роликов для соцсетей.</p><p>Для пользователей macOS <b>iMovie </b>предустановлен и остаётся надёжным вариантом для базовых видео. Если вам нужно просто конвертировать или сжимать видео в современные форматы, <b>HandBrake</b> — проверенное бесплатное решение с поддержкой и вариацией входных и выходных форматов.</p><p>Тем, кто ищет топовый профессиональный монтаж, подойдут <b>Adobe Premiere Pro</b> и<b> Final Cut Pro</b>, но там есть дорогая подписка и более высокий порог входа.</p><h2>Коммуникации и совместная работа</h2><ul><li><b>Для повседневной связи: </b>WhatsApp, Messenger и Zoom, если у вас нет FaceTime</li><li><b>Для приватности: </b>Signal</li><li><b>Для работы:</b> Slack, Teams</li><li><b>Для игр и общения: </b>Discord</li></ul><p>Выбор коммуникационных и мессенджерных приложений в первую очередь зависит от того, с кем вы общаетесь — с семьёй, друзьями, коллегами или игровым сообществом. Вот актуальная картина:</p><p>Для личной переписки <b>WhatsApp</b> и <b>Facebook Messenger</b> остаются самыми массовыми платформами по всему миру. У них есть десктопные клиенты и встроенное сквозное шифрование по умолчанию. <b>Telegram</b> также крайне популярен благодаря синхронизации между устройствами и поддержке крупных чатов. Пользователи Apple продолжают активно использовать <b>iMessage</b> для приватного, шифрованного общения в экосистеме Apple.</p><p>Из видеоконференций <b>Zoom</b> остаётся одним из лидеров для групповых звонков и онлайн-ивентов, предлагая локальные записи, демонстрацию экрана и комнаты (breakout rooms). Однако бесплатный тариф ограничивает 1:1 звонки 40 минутами, если не перейти на платный план. Zoom поддерживает сквозное шифрование, но при включении E2EE отключаются некоторые функции вроде облачной записи и комнат.</p><p><b>Google Meet</b> — отличный браузерный аналог без необходимости установки, который заметно улучшился по качеству и удобству использования. Многие компании применяют Meet в ежедневной работе и гибридных форматах. Если ваша организация использует Microsoft 365, скорее всего, вы работаете в <b>Microsoft Teams</b>, который уже заменил Skype на корпоративном уровне. Teams поддерживает большие созвоны, обмен файлами и глубоко интегрирован с Office. Сквозное шифрование доступно, но только для 1:1 звонков.</p><p><b>FaceTime</b> по-прежнему отличный для пользователей Apple, и благодаря новым обновлениям к звонку теперь могут присоединяться и пользователи Android/Windows по ссылке через браузер.</p><p>Когда приватность критична, <b>Signal</b> — один из лучших вариантов. Разработан некоммерческой организацией, бесплатен, open-source, без рекламы, использует надёжное сквозное шифрование для сообщений и звонков.</p><p>Для рабочих коммуникаций<b> Slack</b> и <b>Teams</b> продолжают использоваться в бизнес-среде. Бесплатный тариф Slack ограничивает историю 90 днями и звонки, но остаётся любимцем стартапов и малых команд благодаря интеграциям и ботам. <b>Cisco Webex</b> — также крепкий вариант, особенно популярен в корпоративной среде.</p><p>Если вы работаете с креативными командами, сообществами или геймерами, <b>Discord</b> стал явным лидером. Изначально созданный для игр, он превратился в полноценную коллаборативную платформу с текстом, голосом и видео, стримингом экрана и ботами для автоматизации. Многие комьюнити — и даже IT-компании — используют Discord как основной рабочий инструмент.</p><p>Для внутриигрового голосового чата <b>TeamSpeak </b>остаётся олдскульным достойным вариантом: можно использовать анонимно и получать полный контроль над сервером. Встроенный чат Steam лучше, чем раньше, и помогает в игровой координации, но большинство всё же выбирает Discord.</p><h2>Гейминг, моддинг и стриминг</h2><ul><li><b>Игровые платформы: </b>Steam, Epic Games, EA App, Ubisoft, GOG</li><li><b>Последние драйверы для GPU:</b> Nvidia GeForce, AMD Radeon, Intel Arc</li><li><b>Стриминг:</b> OBS Studio</li></ul><p><b>Steam</b> остаётся центром PC-игр. Это не только магазин, но и социальная платформа, лаунчер и площадка с модами, облачными сохранениями и встроенным стримингом. Регулярные распродажи, поддержка контроллеров и сообщества делают его обязательным для любого PC-геймера.</p><p>Не менее важно установить Epic <b>Games Store</b>. Хотя библиотека меньше, он регулярно раздаёт бесплатные игры, доступные любому с аккаунтом Epic. Это также must-have, если вы играете в Fortnite.</p><p>Помните: не все издатели размещают игры на Steam или Epic. Для тайтлов EA понадобится <b>EA App (ранее Origin)</b>, для Ubisoft — <b>Ubisoft Connect</b>, для Blizzard/Activision — <b>Battle.net</b>, а GOG Galaxy не только предлагает DRM-free классику, но и может агрегировать игры из других лаунчеров.</p><p>Некоторые сверхпопулярные игры распространяются отдельно: Minecraft (через Minecraft.net или Microsoft Store), Roblox, League of Legends и Valorant (через лаунчер Riot Games). Если вы новичок и ищете что-то лёгкое, можно начать с free-to-play тайтлов или классики вроде <b>Brutal Chess</b> или <b>GZDoom</b>.</p><p>Если вы играете с геймпадом, Windows поддерживает Xbox-контроллеры из коробки. PlayStation-контроллеры теперь тоже отлично работают: Steam через <b>Steam Input </b>поддерживает DualShock 4 и DualSense практически во всех играх. При необходимости глубокой кастомизации можно использовать DS4Windows, но большинству хватает возможностей Steam.</p><p>Если вас интересует моддинг, хороший менеджер модов время в этой жизни:</p><ul><li><b>Mod Organizer 2</b> — лучший для RPG Bethesda (Skyrim, Fallout).</li><li><b>Vortex (от Nexus Mods)</b> — дружелюбный к новичкам и поддерживает широкий перечень игр.</li></ul><p>Для записи геймплея или стриминга <b>Nvidia ShadowPlay</b> и <b>AMD Radeon ReLive</b> подходят для простых задач. Но для стриминга с вебкой, сценами, оверлеями или многосценовым продакшеном <b>OBS Studio</b> — безальтернативный лидер. Он бесплатный, open-source и подходит как новичкам, так и про-стримерам (Twitch, YouTube, Kick и т.д.). <b>SignalRGB</b> помогает синхронизировать весь RGB-зоопарк и задавать динамические эффекты.</p><h2>Мониторинг железа и разгон</h2><ul><li><b>Мониторинг: </b>CPU-Z, HWMonitor, HWiNFO64</li><li><b>Настройка и разгон:</b> Afterburner, FanControl, ThrottleStop, SignalRGB</li></ul><p>Одно из первых дел, которое стоит сделать после сборки ПК — убедиться, что компоненты соответствуют ожиданиям и работают корректно. К счастью, существует много инструментов, позволяющих мониторить, тестировать и настраивать железо.</p><p>Начать стоит с <b>CPU-Z</b> — классического бесплатного инструмента, показывающего информацию о CPU, материнской плате, оперативной памяти и других компонентах. Он также умеет запускать простой стресс-тест и бенчмарк для проверки стабильности.</p><p>Для более широкого мониторинга <b>HWMonitor</b> показывает температуры, напряжения и скорости вентиляторов в реальном времени. Если нужно ещё глубже и с более гибким интерфейсом — <b>HWiNFO64</b> считается одним из лучших: поддерживает логирование датчиков и интеграцию с оверлеями (например, RTSS или Rainmeter).</p><p>Чтобы проверить хранилище, <b>CrystalDiskMark</b> измеряет скорость чтения/записи SSD и HDD — это помогает понять, соответствует ли диск заявленным характеристикам. Глубже оценить здоровье накопителя можно в <b>Hard Disk Sentinel</b>, который анализирует SMART-данные, оценивает срок службы и предлагает ограниченный ремонт.</p><p>С точки зрения охлаждения, всё больше геймеров используют утилиты для настройки вентиляторов. <b>FanControl</b> — актуальный бесплатный фаворит: поддерживает сложные кривые оборотов, привязку к датчикам, и совместим с большинством современных материнских плат. На Mac одной из лучших утилит остаётся<b> Macs Fan Control.</b></p><p>Для настройки видеокарт долгое время стандартом был <b>MSI Afterburner</b> — для разгона, настройки вентиляторов и мониторинга с RTSS-оверлеем. Однако из-за замедления обновлений многие сегодня используют встроенные утилиты от <b>Nvidia (GeForce Experience/Control Panel)</b> и <b>AMD (Adrenalin Software)</b>.</p><p>Если вы меняете видеокарту или подозреваете проблемы с драйверами, обязательно используйте <b>Display Driver Uninstaller</b> (DDU) — он полностью очищает систему от старых драйверов перед переустановкой.</p><p>Если вы играете на ноутбуке или хотите снизить нагрев и повысить автономность, <b>ThrottleStop</b> остаётся одним из лучших инструментов для андервольта CPU и настройки энергопрофилей.</p><p>Тем, кто серьёзно подошёл к разгону CPU и GPU, пригодятся фирменные инструменты вроде <b>Intel XTU (для Intel) и AMD Ryzen Master</b> — они дают контроль над частотами, напряжениями и лимитами мощности.</p><h2>Управление файлами</h2><ul><li><b>Поиск больших файлов:</b> SpaceSniffer, WizTree, Disk Drill (macOS)</li><li><b>Поиск дубликатов: </b>dupeGuru</li><li><b>Архивы и ZIP: </b>PeaZip, The Unarchiver</li><li><b>Очистка: </b>BCUninstaller, CCleaner Portable, AppCleaner (macOS)</li></ul><p>Чтобы грамотно управлять файлами и освобождать место, нужно понимать, что именно занимает пространство. На Windows популярны <b>WinDirStat и WizTree </b>— быстрые бесплатные инструменты для визуализации диска. <b>SpaceSniffer</b> предоставляет динамическую схему.</p><p>На macOS — <b>GrandPerspective и Disk Drill </b>предлагают аналогичный функционал, а <b>DaisyDisk</b> — один из самых красивых платных вариантов с молниеносным сканированием.</p><p>Если дубликаты засоряют диск, <b>dupeGuru</b> (open-source) отлично справляется с поиском повторяющихся изображений и музыки, даже слегка изменённых.</p><p>Для пакетного переименования файлов (например, фоточек с камеры) существует гибкий <b>Bulk Rename Utility</b>. Если нужно что-то попроще: <b>PowerRename</b> из PowerToys (Windows) или встроенный инструмент в <b>Finder</b> (macOS) подходят большинству.</p><p>Встроенный <b>File Explorer</b> в Windows недавно получил вкладки и стал удобнее, но <b>Files</b> (open-source) — современная альтернатива с улучшенным UX. Кто-то ещё пользуется <b>Total Commander</b> или <b>Directory Opus</b>, благодаря расширяемости и скриптам, хотя новичкам они кажутся устаревшими. Для просмотра изображений по-прежнему незаменим <b>IrfanView</b>.</p><p>Для работы с архивами, если не устраивает встроенный ZIP-менеджер Windows, скачайте <b>7-Zip</b> или <b>PeaZip</b>. На Mac лучшим бесплатным инструментом остаётся <b>The Unarchiver</b>.</p><p>Для очистки системы важно выбирать надёжные утилиты. На Windows, <b>BCUninstaller (Bulk Crap Uninstaller)</b> — один из самых проверенных для удаления программ и их хвостов. <b>BleachBit</b> и <b>Wise Disk Cleaner</b> — безопасные альтернативы <b>CCleaner</b> (лучше использовать Portable-версию, так как стационарная испортила репутацию). На Mac <b>AppCleaner</b> всё ещё любим за полное удаление приложений без мусора.</p><p>Если вы организуете большую библиотеку медиа, стоит взглянуть на open-source <b>TagSpaces</b>, позволяющий тегировать файлы локально, без облака.</p><h2>Облачное хранилище и резервное копирование</h2><ul><li><b>Простая синхронизация: </b>Dropbox, Google Drive</li><li><b>Фото между устройствами:</b> Apple iCloud, Google Photos</li><li><b>Приватность: </b>pCloud, Proton Drive, Internxt</li><li><b>Полные бэкапы:</b> Backblaze, IDrive</li></ul><h3>Базовое облачное хранилище</h3><p><b>Dropbox</b> — один из самых простых в использовании, хотя бесплатных 2 ГБ мало.</p><p><b>
Google Drive</b> — 15 ГБ бесплатно, используется Gmail, Docs и Photos. Идеален для Android.</p><p><b>
OneDrive</b> — идёт в комплекте с Windows и Microsoft 365. 1 ТБ включён в большинство Office-планов. Хотя по скорости и интерфейсу уступает Dropbox/Google.</p><p><b>
iCloud Drive</b> — лучший выбор для пользователей Apple, глубокая интеграция с macOS/iOS. Бесплатно 5 ГБ, далее по планам до 2 ТБ.</p><p><b>
Proton Drive</b> — шифрованная альтернатива от создателей ProtonMail.</p><h3>Фото и видео</h3><p>На macOS приложение <b>Photos</b> автоматически создаёт альбомы по людям и локациям, синхронизирует всё через iCloud.</p><p>На Windows мы часто рекомендуем <b>Google Photos</b>, который предлагает аналогичный набор функций и автоматизацию. Для пользователей Android — это стандарт по умолчанию. Да, раньше было безлимитно, теперь фото занимают общее место Google Drive (15 ГБ), которое быстро заканчивается.</p><h3>Полные бэкапы</h3><p>Если требуется сохранять всю систему, терабайты медиа, состояние дисков используйте отдельные сервисы резервного копирования.</p><p><b>Backblaze</b> — топ в этой категории: фиксированная цена (~$8/месяц за устройство), безлимитное хранилище, минимум настроек: установил и забыл.</p><p><b>IDrive</b> — более контролируемый вариант, поддерживает несколько устройств, внешние диски и версионность файлов.</p><p>Простой для не-технарей — <b>Carbonite</b>, с возможностью быстрого восстановления и круглосуточной поддержкой.</p><p>Профессионалам — <b>Acronis Cyber Protect</b>: клон дисков, анти-вымогатель, гибридное облако.</p><h3>Для особо чувствительных данных</h3><p>Если вы храните личные финансовые документы или медицинские сведения, стоит выбрать end-to-end решений.</p><p><b>pCloud</b> предлагает клиентское шифрование (через платный «Crypto»). Даже при взломе аккаунта файлы не расшифруются без ключа.</p><p><b>Proton Drive </b>— аналогичный подход, с прозрачностью open-source.</p><h2>Прочие полезные инструменты, не вошедшие в другие разделы</h2><p><b>Google Earth</b> — для любителей карт и планировки.</p><p><b>qBittorrent</b> — лучший torrent-клиент: чистый, без рекламы, с поиском. Альтернатива — легковесный Transmission или кастомизируемый Deluge.</p><p><b> iMazing</b> — must-have для владельцев iPhone: резервные копии, экспорт медиа, проверка батареи, конвертация HEIC.</p><p><b>AirDroid</b> — аналог для Android: управление файлам, уведомления, SMS с ПК.</p><p><b>Rufus</b> — лидер по созданию загрузочных USB-дисков для Windows/Linux.</p><p><b>Open Shell </b>— возвращает классическое меню «Пуск» в стиле Windows 7.</p><p><b>Stretchly</b> — напоминает делать перерывы — полезно удалёнщикам и фрилансерам.</p><p><b>AutoHotkey</b> — скриптовый движок для Windows: переназначение клавиш, макросы, автоматизация.</p><p><b>VPN: </b>бесплатные — ProtonVPN, Windscribe, TunnelBear (с лимитом). Платные — ProtonVPN, NordVPN.</p><p><b>Calibre</b> — лучшее бесплатное решение для чтения, организации и конвертации e-book (EPUB, MOBI, PDF и др.).</p><h2>Заключение</h2><p>Итак, мы прошлись по основным категориям приложений, которые стоит установить на новый компьютер. Конечно, этот список не исчерпывающий — у каждого свои задачи и предпочтения. Но если вы установите хотя бы половину из перечисленного, ваш компьютер станет гораздо удобнее и функциональнее.</p><p>Несколько советов напоследок:</p><ol><li><b>Не захламляйте систему.</b> Устанавливайте только то, что действительно используете. Чем меньше фоновых процессов — тем быстрее работает компьютер.</li><li><b>Следите за обновлениями.</b> Большинство программ обновляются автоматически, но некоторые требуют ручного апдейта. Свежие версии — это не только новые функции, но и закрытые уязвимости.</li><li><b>Делайте резервные копии.</b> Никакие утилиты не спасут от отказа жёсткого диска. Регулярный бэкап на внешний носитель или в облако — обязательная практика.</li><li><b>Экспериментируйте. </b>Попробуйте несколько браузеров, редакторов, плееров. То, что подходит большинству, может не подойти именно вам.</li><li><b>Читайте отзывы.</b> Перед установкой незнакомого приложения загляните на форумы или Reddit. Сообщество быстро выявляет проблемы и подводные камни.</li></ol><p>Теперь ваш компьютер готов к работе, учёбе, развлечениям — и чему угодно ещё. Главное — не забывайте, что инструменты важны, но ещё важнее то, как вы их используете. Удачи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Ваш код украли: как защитить права на IT-продукт и не потерять миллионы</title>
      <link>https://tproger.ru/articles/vaw-kod-ukrali--kak-zashhitit-prava-na-it-produkt-i-ne-poteryat-milliony</link>
      <comments>https://tproger.ru/articles/vaw-kod-ukrali--kak-zashhitit-prava-na-it-produkt-i-ne-poteryat-milliony?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Юлия Катковская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vaw-kod-ukrali--kak-zashhitit-prava-na-it-produkt-i-ne-poteryat-milliony</guid>
      <description><![CDATA[<p>Трудовой договор не даёт права на код вашего продукта! Юрист Сергей Соколов простыми словами объясняет, как юридически закрепить права на ПО за компанией, а не за разработчиком. Узнайте, какие документы подготовить, чтобы ваш софт не «уплыл» к конкурентам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vaw-kod-ukrali--kak-zashhitit-prava-na-it-produkt-i-ne-poteryat-milliony">Ваш код украли: как защитить права на IT-продукт и не потерять миллионы</a>»</p>]]></description>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Авторское право]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 24 Sep 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Варианты защиты результатов интеллектуальной деятельности</h2><p>Что вообще можно защитить в IT?</p><p>— В законодательстве есть собирательный термин «результаты интеллектуальной деятельности». К ним относятся произведения литературы, искусства, науки, в том числе программное обеспечение, базы данных, изобретение, полезная модель, промышленные образцы и прочее. Часть из них защищается авторским правом, а для части нужен патент.</p><p>В IT чаще всего авторское право действует на программы для ЭBM. А вот на стыке IT с инженерией могут возникнуть патенты. То есть патентным правом в большинстве случаев охраняют изобретения, способы передачи данных или другие разработки.</p><p>Авторское право и патент — в чём ключевая разница?</p><p>— Объектам авторского права ничего не нужно, чтобы получить защиту — право на них возникает сразу, как только создали произведение. Единственное, что надо учитывать, — право принадлежит непосредственному автору. Поэтому если мы говорим о служебном произведении, то сотрудник — это автор, и право возникает у него. А значит, работодатель должен учесть несколько нюансов (дальше о них поговорим).</p><p>А вот чтобы получить охрану своего изобретения, нужно регистрировать его в Роспатенте. К слову, право на программу, по желанию, тоже можно зарегистрировать. Это формирует дополнительную привлекательность для инвесторов, банков и государства.</p><p>Ключевая разница: если на авторские произведения права возникают, когда человек создал и обнародовал их, то в случае патента необходимо не только придумать и создать, но и зарегистрировать результат, чтобы получить соответствующую защиту.</p><p>Нужно ли вносить разработку в Реестр отечественного ПО и как это сделать?</p><p>— Вносить не обязательно, такого требования нет. Но чтобы получить господдержку, налоговые льготы — это нужно. Поэтому зачастую программы вносят в реестр с целью их выгоднее использовать, получить льготы для сотрудников и организации. Процедура кажется простой: подаёшь заявление, прикладываешь документы. Но есть условия: к примеру, в программе нельзя использовать западные платные источники, только открытое программное обеспечение. Также юристы рекомендуют сначала получить в Роспатенте свидетельство о том, что именно за тобой закреплено право на эту программу, а потом идти в реестр отечественного ПО.</p><h2>Работодатель vs сотрудник: как не потерять права на продукт</h2><p>Какие нюансы должен учесть работодатель, поручая сотруднику создать продукт? Нужно заключить договор о передаче авторских прав?</p><p>— Зависит от того, как работодатель оформил задание. Если это служебные произведения, значит, создавать их — обязанность работника. В этом случае, по закону, исключительное право у работодателя всегда возникает сразу после того, как задание выполнено, потому что он за это заплатил. Но надо не забыть оплатить по правилам, которые действуют в организации, по соответствующему договору.</p><p>А вот если произведение создаёт работник, в должностные обязанности которого не входит выполнять такие задания (к примеру, директор компании), тогда, даже если он работал над продуктом в офисе  и использовал рабочий компьютер, это не даёт работодателю исключительного права на его разработку. И само по себе использование ресурсов не означает, что права принадлежат работодателю. Соответственно, нужно либо забрать это право у работника по отдельному договору, либо заранее заключить договор авторского заказа на конкретное произведение.</p><p>Зачем так сложно?</p><p>— С работниками нужно регулировать эти правоотношения, чтобы у работодателя было доказательство, что конкретно эту программу он получил и оплатил по договору. Кажется, что произведение, которое работник создал по заданию, по умолчанию должно принадлежать компании, но он же может его создать дома и потом говорить, что конкретно эту программу он не делал в рамках рабочих процессов.</p><p>Если это отдельный модуль или решение, которое сотрудник создал, а работодатель не зафиксировал, что работник сделал это именно в рамках должностных обязанностей, то существует риск утратить права на произведение. Такие споры в юридической практике существуют. Особенно в случаях, когда сотрудник потом уходит работать с этим модулем на себя или «относит» его другому работодателю.</p><p>К примеру, <i>в деле N А40-202764/2018, по спору о правах на медицинский мессенджер Medsenger(спор между «Амедико» и «ТелеПат»)</i>, работодатель не смог доказать, что ему принадлежат права на программу. Суть в том, что айтишники, которые ранее работали у истца, уволились, создали собственное юрлицо и стали продавать программу, которую разработали на прежнем рабочем месте. Соответственно, бывший работодатель предполагал, что программа принадлежит ему, но доказать это не смог, хотя было понятно, что сотрудники создавали наработки на прошлом рабочем месте. Трудовой договор, который он предоставил как доказательство, оказался недостаточным аргументом в пользу работодателя, поскольку не было документов, которые подтверждали бы наличие служебного задания и доказывали бы факт создания программы в определенный период времени. Не было и актов приемки-передачи служебного произведения.</p><p>Фактически суд установил только то, что программа принадлежит самим сотрудникам, в том числе еще и потому, что они обратились в Роспатент и зарегистрировали это право.</p><p>Как нанимателю защитить себя заранее, как проверить, по каким договорам ранее работал исполнитель?</p><p>— С юридической стороны — никак, на 100% у него не получится защититься, здесь скорее вопрос того, насколько честен сотрудник. Вероятно, у нового работодателя не будет проблем, если его цель найма — создать собственный продукт, по своему уникальному заданию, а не повторить чужой. А вот если цель изначально недобросовестная и работодатель хотел схантить вместе с сотрудником часть программы, тогда надо быть готовым к претензиям и защите в суде.</p><p>Что делать, если права нарушили?</p><p>— Если нарушили твои исключительные права на произведение, то основной гражданско-правовой способ защиты — взыскать компенсацию в суде. По таким искам можно получить от 10 тыс. до 5 млн руб. А со следующего года — до 10 млн руб. Есть и другие способы расчёта — к примеру, двойная стоимость лицензии. То есть, если ты реализуешь лицензию на свою программу, а кто-то незаконно её использует, можешь отсудить у него двойную стоимость лицензии. Такой способ в основном используют в судах. Но можно разрешить спор и досудебно — подать претензию. Иногда на претензиях всё и заканчивается. Но если в претензионном порядке нарушитель не выплатит денежную компенсацию, то нужно будет обращаться в суд.</p><p>Помимо этого, есть административная и уголовная ответственность, в зависимости от того, какого объёма нарушения. То есть можно обратиться к правоохранительным органам, и они будут защищать права автора или обладателя исключительных прав.</p><p>Как разработчику и заказчику делиться правами?</p><p>— Когда разработчик выполняет заказ в частном порядке, прежде чем создавать произведение, ему необходимо урегулировать правоотношения с заказчиком по договору. В нём чётко прописать, кому будет принадлежать исключительное право и каким образом вторая сторона сможет использовать произведение — например, по лицензии. На практике бывает так, что исключительное право сохраняют за разработчиком, а заказчику передают только лицензию, потому что разработчик будет адаптировать свою же наработку под другие компании. То есть, если он хочет использовать свою наработку, блок, ядро программы в дальнейшем, то он не должен отдавать исключительное право заказчику.</p><p>Или он может отдать ядро, но тогда это будут совсем другие деньги. В этом случае необходимо сохранить за собой право использовать ядро для создания программ в дальнейшем. Это непростой вопрос, и чтобы оформить такие отношения с заказчиком, нужен юрист, потому что типовые договоры здесь не подходят, они редко решают эту задачу как нужно. В типовых договорах зачастую прописывают либо полное отчуждение прав, и вопрос лицензии практически не решают, либо наоборот, прописывают только лицензию, но неправильно определяют её объём. Поэтому важно скрупулёзно составлять индивидуальные договоры, учитывая все нюансы, которые устроят обе стороны.</p><p>Если проект финансирует инвестор, как ему вложить деньги и не остаться ни с чем?</p><p>— Инвесторам — сложнее всего. Естественно, соавторами они стать не могут, потому что соавтор — это тот, кто вместе с автором творческим трудом создал произведение, а не тот, кто профинансировал. Тем более, пока нет практики, когда исключительное право на программу или продукт принадлежит в долях. Соответственно, инвесторы не могут получить долю в непосредственном праве.</p><p>У инвестора есть два варианта. Первый — забрать исключительное право себе, потому что он заплатил за разработку. Второй — заранее в договоре определить, как будут распределять доходы от использования программы, то есть не забирать само по себе право, но поделить в долях будущий доход (неважно, будет это продажа либо лицензия).</p><h2>Особые случаи: работа с госзаказом и зарубежными клиентами</h2><p>Если айтишник работает на оборонку, — там уже действуют другие договоры, другая ответственность?</p><p>— Там, безусловно, есть дополнительная ответственность за сохранение тайны разработки. В зависимости от того, что именно выполняет специалист, вероятно, там возникнет определённая степень допуска к гостайне. В остальном, скорее всего, действует такое же право, как на остальные разработки, с такими же ограничениями.</p><p>Какие договоры нужно заключать при работе с иностранными заказчиками? Есть ли особые условия ?</p><p>— В некоторых случаях — да, в зависимости от того, дружественная или недружественная страна, и, соответственно, откуда сам разработчик будет работать. Сейчас эта сфера очень зарегулирована, каждый случай нужно разбирать отдельно — что именно подписывать.</p><p>Конечно, в меньшей степени дружественность-недружественность может повлиять на то, какие документы составлять. В целом, там всё то же самое. Разработчик, скорее всего, будет просто работать по праву той страны, с которой заключил договор. В этом случае можно обратиться к юристу, который разъяснит, какие у исполнителя есть права, потому что там совершенно другой способ регулирования.</p><p>То есть знание наших законов не убережёт от проблем?</p><p>— Принципы взаимодействия похожи, но, например, в американской системе нет неимущественных прав, есть только имущественное право на произведение. А принципы отчуждения и лицензирования схожи с российскими,  регулирование для разработчиков — тоже.</p><h2>Юридический лайфхак: храните доказательства</h2><p>Поделитесь кейсами из своей практики, когда приходилось разрешать спор между кодером и заказчиком.</p><p>— Был случай, когда кодер не смог подтвердить, что он что-то создавал, потому что не было задания. Это печальная история, потому что был договор —  кодер проделал большую работу, но не получил за неё деньги и права на свой продукт. Он передал наработки и не подписал документы в надежде на порядочность заказчика, который в итоге не заплатил, сказав, что исполнитель ничего не сделал. Через суд истребовать ничего не удалось, потому что все данные удалили, у кодера не было доступа к своей разработке, чтобы доказать, что он её создал и передал. Причём backup-версия наработки у него осталась, но мы не нашли способ доказать, что он её передал, так как никто не вёл соответствующие документы.</p><p>Договор, который они заключили, предусматривал бюрократическую процедуру подтверждения передачи результатов, то есть нужно было ставить подписи в каждой графе, а этого, естественно, никто не делал.</p><p>Можно сделать простой вывод: фиксируйте задание и результат любым способом (например, в CRM, задачах). Сохраняйте все переписки и готовые продукты в облаке с историей изменений. Технологичные способы подтверждения надёжнее бюрократии, но и договор должен соответствовать тому, что происходит в жизни.</p>]]></content:encoded>
    </item>
    <item>
      <title>«SQL хорош для данных, но плох для логики» — почему все больше разработчиков выносят бизнес-логику из базы</title>
      <link>https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy</link>
      <comments>https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy</guid>
      <description><![CDATA[<p>SQL отлично справляется с данными, но неудобен для бизнес-логики: разработчики выносят её в код ради гибкости, скорости и независимости</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy">«SQL хорош для данных, но плох для логики» — почему все больше разработчиков выносят бизнес-логику из базы</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Oracle]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 24 Sep 2025 11:06:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современные приложения все чаще используют базы данных исключительно как «хранилище», а не как движок для бизнес-логики. <i>Почему? </i></p><p>Потому что SQL, несмотря на свое превосходство в работе с данными, неудобен, ограничен и рискован в роли полноценного языка программирования.</p><h2>Логика не по адресу</h2><p>Как <a href="https://ewaldbenes.com/en/blog/why-i-keep-business-logic-out-of-sql">отмечает</a> Эвальд Бенс, фуллстек разработчик и авторов популярного блога об IT, он <b>предпочитает держать как можно больше логики в приложении</b>, а не в SQL-хранилищах, представлениях и процедурах:</p><blockquote>Я отношусь к базе как к тупому хранилищу данных. Вся логика — в коде. SQL просто не предназначен для сложных сценариев.</blockquote><p>И дело не в том, что SQL чего-то «не умеет». Умеет — особенно с расширениями вроде PL/pgSQL или Oracle PL/SQL.</p><p><b>Но выразительность этих языков — далека от Python, TypeScript, Rust или C#</b>, особенно когда речь идет о бизнес-логике, объектной модели или сложных расчетах.</p><h2>Зачем выносить логику из базы?</h2><h2>1. SQL невыразителен</h2><p>Для манипуляций с табличками и JOIN — он король. Но как только начинается рекурсия, классы, вложенные состояния или обработка ошибок — SQL превращается в монстра с BEGIN, IF, LOOP, EXCEPTION, RAISE, CURSOR, FETCH, WHILE и т.д...</p><h2>2. Развертывание — боль</h2><p>Обновить приложение можно за минуту, откатить — за две. А вот миграции на проде — это:</p><ul><li>повышенные права доступа;</li><li>согласование с DBA;</li><li>боязнь сломать что-то «наживую»;</li><li>ручной откат схем.</li></ul><h2>3. Лочит на вендора</h2><p>Логика, написанная на PL/SQL — это билет в один конец к Oracle. Переезд на PostgreSQL или SQL Server становится в 5 раз сложнее.</p><h2>4. Меньше инструментов</h2><p>Вокруг SQL есть утилиты, но полноценной среды с юнит-тестами, статическим анализом, форматтерами, профайлерами, линтерами и отладчиками — почти нет.</p><h2>А что с производительностью?</h2><p>Да, есть нюанс: <b>иногда лучше обработать данные прямо в базе</b>, чтобы не гонять десятки тысяч строк по сети. Это особенно актуально, если не хочется получить классическую проблему N+1-запросов.</p><p>Но даже в этом случае большинство специалистов советует <b>сначала делать «просто и понятно», а не «оптимально заранее»</b>. До тех пор, пока не уперлись в реальные метрики, выносить логику в базу — преждевременная оптимизация.</p><h2>Что делать?</h2><p>Подход <i>«база — хранилище, логика — в коде»</i> стал де-факто стандартом во многих командах. Но это не догма:</p><ul><li>Для отчетности или простых ETL сценариев логика в SQL может быть уместной.</li><li>Для монолитных решений без CI/CD и DevOps — процедурный SQL вполне оправдан.</li><li>Но в современной разработке с частыми релизами, микросервисами и отказоустойчивостью <b>бизнес-логика в приложении — просто удобнее и безопаснее</b>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Устраиваем свой Data QA с PyTest и фикстурами</title>
      <link>https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli</link>
      <comments>https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Якушева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli</guid>
      <description><![CDATA[<p>Рабочий подход к тестированию трансформации данных в ETL-процессах. На примере Python-проекта с pytest, allure и psycopg2 демонстрируется, как автоматизировать создание и наполнение таблиц, хранить схемы и данные, а затем сравнивать результат. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-testirovat-perenos-i-transformaciyu-dannyh-bez-boli">Устраиваем свой Data QA с PyTest и фикстурами</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Форматы хранения данных]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 01 Sep 2025 12:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как тестировать перенос и трансформацию данных без боли</h2><p>Я всё думаю над тем, о чём говорить на своём канале. Казалось бы, инфы в интернете — вагон и маленькая тележка: бери, читай, вдохновляйся. Но вот что удивительно — про то, как тестировать данные, как они перетекают из одной таблицы в другую и не превращаются в тыкву, пишут мало.</p><p>А зря.</p><p>За свою практику я встречала разные подходы к организации Data QA. В этой статье я расскажу про самый простой и быстрый вариант, который можно «собрать на коленке», а потом уже развивать. С примерами кода и тем, зачем SQL нам нужен в этой жизни.</p><p>И небольшой дисклеймер. Если вы знаете, как сделать это на Python стильно модно молодежно, обязательно напишите мне об этом в комментариях, я с удовольствием почитаю про ваш подход.</p><p>Также подписывайтесь на мой ТГ, который я почти не веду. <br /><br /></p><h2>Базовый сценарий</h2><ol><li>Есть таблица-источник source_table.</li><li>Разработчик запускает свой код (Spark, Airflow или что у него там), и данные магическим образом перекладываются + преобразуются.</li><li>На выходе получаем result_table.</li></ol><p>Вопрос: как это тестировать?</p><h3>Самый быстрый и простой путь</h3><p>Подготовка:</p><ol><li>Создаём таблицу-источник.</li><li>Наполняем её данными (синтетика или реальные примеры с прода).</li></ol><p>Действие:</p><ol><li>Запускаем ETL код.</li><li>Сравниваем данные «как было» и «как стало».</li></ol><p>После теста:</p><ol><li>Удаляем таблицу-источник.</li><li>Удаляем таблицу-приёмник.</li></ol><p>На коленке это можно собрать так:</p><ol><li>CREATE TABLE …</li><li>INSERT INTO …</li><li>Ручной запуск пайплайна (Spark/Airflow).</li><li>Какой-нибудь скрипт для сравнения результатов.</li></ol><p>Рабочая схема? Да.</p><p>Удобная? Нет.</p><h2>Где хранить эти скрипты?</h2><p>Можно, конечно, прилепить их к задаче в Jira в виде файликов. Но выглядеть это будет как «фигня на палке». Через месяц никто не вспомнит, что это было и зачем.</p><p>Поэтому я решила собрать свой Python-проект для автоматизации. А вы можете склепать себе такой же, и жизнь сразу станет легче.</p><h3>Архитектура проекта</h3><h3>Минимальный стек</h3><h3>1. Utils — мелкие, но полезные</h3><p>Здесь мы храним всякую мелочёвку. Например, функцию для открытия JSON:</p><p>Важно отметить, что данные я всегда стараюсь хранить в виде массива с json. Так удобнее использовать.</p><h3>2. APIClient — для триггеров</h3><p>Здесь всё максимально тривиально: клиент для вызова API и запуска ETL джоб.</p><h3>3. PostgreSQLClient — основной игрок</h3><p>Класс для подключения, запросов, создания таблиц, вставки данных и удаления.</p><h2>Фикстуры (conftest.py)</h2><h3>API фикстуры</h3><p>Я показываю пример, как поднимаю один API клиент. Но у вас их может быть много: например, разные сервисы или разные перекладчики.</p><h3>DB фикстура</h3><p>Пример для дефолтной PostgreSQL, но вы можете добавить фикстуры для поднятия GreenPlum или ClickHouse.</p><h2>Как хранить данные?</h2><p>А теперь самый сок, которым я обмазываюсь сейчас.</p><p>Конечно, можно создать отдельный скрипт на чистом sql для создания и редактирования своих табличек: больших и маленьких. Но, если честно, это так *цензура* неудобно.</p><p>Поэтому я придумала хранить схему и данные в отдельных json файлах и налету генерить скрипты. Да, Америку я вновь не открываю, и очень жаль.</p><p>В директории тестов я создала папку resources, где храню эти файлы.</p><p>Конечно, в таком виде вы не передадите ничего в Postgres и ничего не слепите. Так что я услужливо предоставляю вам код, чтобы вы его копировали и вдохновлялись.</p><p>Вы можете взять и пропихнуть эти куски кода прямо в тело теста, но я предпочитаю оборачивать это дело в фикстуры-управленцы, которые будут делать это за меня и записывать отдельными шагами в Алюр:</p><p>Отдельное удовольствие мне даёт вот эта строчка кода db_client:PostgreSQLClient.Она значит, что если так вышло, что у меня есть куча разных PostgesSql, я могу в эту фикстуру прокинуть нужный мне клиент без дополнительных приседаний. И это, конечно, прекрасно.</p><h3>Пример: подготовка данных</h3><p>Самые внимательные уже заметили, что в примере выше я поднимала postgres-клиента.</p><p>Так что разницы почти никакой (ну, кроме тех случаев, когда внезапно очень даже есть 🙃).</p><h3>И сам тест</h3><p>Конечно, можно сравнивать всё это дело через всякие прослойки типа Pandas.</p><p>Но, камон, у меня что, куча времени сидеть, читать доки и писать суперсложные датафреймы ради пары простых проверок? Нет.</p><p>Позвольте мне радостно строчить свой первозданный код с дефолтными проверками и быть довольной этим минимализмом.</p><p>Это я отвлеклась. Вот такой код у меня получается. Я не очень люблю сверять даты и названия таблиц, у меня генерит тест на лету:</p><h2>Итог</h2><ul><li>Ручные скрипты → боль и страдания.</li><li>Автоматизация через Python+pytest → быстро, удобно, воспроизводимо.</li><li>JSON-файлы позволяют хранить схемы и данные в читаемом виде.</li><li>Allure даёт красивые отчёты.</li></ul><p>В итоге у вас появляется настоящий фреймворк для Data QA, который легко расширять и масштабировать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Многофакторное сравнение пяти популярных вычислительных движков для больших данных</title>
      <link>https://tproger.ru/articles/mnogofaktornoe-sravnenie-pyati-populyarnyh-vychislitelnyh-dvizhkov-dlya-bolwih-dannyh</link>
      <comments>https://tproger.ru/articles/mnogofaktornoe-sravnenie-pyati-populyarnyh-vychislitelnyh-dvizhkov-dlya-bolwih-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[StarRocks]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/mnogofaktornoe-sravnenie-pyati-populyarnyh-vychislitelnyh-dvizhkov-dlya-bolwih-dannyh</guid>
      <description><![CDATA[<p>Эволюция от Hadoop к cloud‑native и ИИ‑архитектурам. Многомерное сравнение Spark, Presto, Trino, ClickHouse и StarRocks по скорости, масштабируемости, кэшам, SQL/Python, HA и др.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/mnogofaktornoe-sravnenie-pyati-populyarnyh-vychislitelnyh-dvizhkov-dlya-bolwih-dannyh">Многофакторное сравнение пяти популярных вычислительных движков для больших данных</a>»</p>]]></description>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 20 Aug 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Скорость итераций в области Big Data вновь вернулась к стремительному темпу 2015–2016 годов. Область анализа данных — самая близкая к бизнесу, часто используемая и ценная, с жёсткими требованиями к стоимости и эффективности.</p><p>Разработчики на передовой всё реже запускают новые сервисы на «тяжёлой в эксплуатации» связке сервисов Hadoop и предпочитают формат «всё в одном» — унифицированный подход, объединяющий хранение и аналитику. Если раньше архитектуру больших данных приходилось «собирать из кубиков», то теперь она всё чаще становится более монолитной архитектурой (all‑in‑one).</p><p>Кроме того, с быстрым развитием ИИ изменились и объёмы, и типы данных, поэтому на стороне вычислительных движков были проведены соответствующие оптимизации и обновления: например, для OLAP‑аналитики векторизация де‑факто стала стандартной возможностью, а форматы озёр данных эволюционируют к поддержке мультимодальности (о мультимодальном хранении — ниже).</p><p>В этой статье разберём архитектуры популярных сегодня распределённых вычислительных движков и их плюсы/минусы. Проанализировав их, мы лучше поймём, какой движок уместнее использовать в тех или иных бизнес‑сценариях.</p><p>Реализации распределённых вычислительных движков обычно состоят из компонентов «Server» и «Worker». Узлы Worker, как правило, распределяются по множеству хостов и под координацией Server выполняют параллельные вычисления. Хотя логика вычислений и оптимизации у разных движков реализована по‑разному, базовые этапы похожи.</p><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-15/587b10ca-1dff-4464-86df-9ee5f0956735.png" alt="" /></figure><h2>Базовые этапы выполнения запроса</h2><ol><li>Parsing — разбор: SQL‑запрос разбирается в синтаксическое дерево для валидации структуры и выявления задействованных таблиц.</li><li>Planning — планирование: формируется логический план, описывающий необходимые операции (например, фильтры, соединения) и их порядок.</li><li>Optimization — оптимизация: логический план преобразуется в эффективный физический план с помощью стоимостной (CBO) или правил‑ориентированной оптимизации.</li><li>Compilation — компиляция: физический план компилируется в низкоуровневые операции, байт‑код или аппаратно‑специфичные инструкции, подготавливаясь к исполнению.</li><li>Execution — исполнение: план распределяется узлам Worker, которые параллельно сканируют данные, применяют преобразования и обмениваются данными; промежуточные данные/метаданные возвращаются в главный процесс.</li><li>Result Serving — формирование и отдача результатов: результаты агрегируются, форматируются и возвращаются пользователю или нижестоящим системам (downstream).</li></ol><h2>Классификация движков по назначению</h2><ul><li>Универсальные вычислительные движки: например, Spark, Flink, MR (MapReduce), поддерживающие пакетные и сложные вычислительные задачи, различные типы данных и множество источников.</li><li>Интерактивные движки запросов: например, Presto, Trino — для ad hoc‑запросов, где важно быстро получать результаты и применять оптимизации, обеспечивая высокую скорость выполнения и интерактивность анализа.</li><li>OLAP‑движки: например, ClickHouse, StarRocks, Doris и др. — для быстрого анализа постоянно меняющихся данных. Поддерживают аналитику в реальном времени, субсекундную латентность запросов и серьёзные оптимизации в оптимизаторе выполнения.</li></ul><h3>Универсальные вычислительные движки</h3><p>Среди универсальных движков наиболее широко используется Apache Spark: он поддерживает офлайн‑вычисления, обработку, близкую к реальному времени (near real time), и интеграцию с фреймворками машинного обучения. Spark изначально создавался для преодоления ограничений Hadoop MapReduce. Spark Driver — центральный координатор Spark‑приложения: он управляет использованием CPU и памяти, широковещательными переменными (broadcast variables, для эффективного совместного использования данных между узлами Worker) и создаёт наборы данных RDD.</p><p>Ниже — схема архитектуры Apache Spark.</p><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-15/108c7e1b-ca28-48aa-9eb9-d1c3e0ef8898.png" alt="Схема технической архитектуры Apache Spark" /><figcaption>Техническая архитектура Apache Spark</figcaption></figure><h3>Интерактивные движки запросов</h3><p>PrestoDB был создан в 2012 году в Facebook (Meta)* для предоставления быстрых распределённых возможностей SQL поверх различных источников (включая HDFS, S3, MySQL и Cassandra) без перемещения или преобразования данных. Trino появился в 2019 году как форк Presto, созданный его оригинальными авторами, с фокусом на улучшении производительности и добавлении поддержки облачных и современных Lakehouse‑архитектур. Эти движки остаются очень похожими и после форка различаются лишь в деталях.</p><p>*<i>Компания Meta признана экстремистской на территории РФ и запрещена</i></p><p>На следующей схеме показана архитектура Presto/Trino. В Presto и Trino координатор парсит и планирует запрос, затем создаёт набор задач и сплитов (splits) базовых внешних хранилищ; каждый сплит передаётся рабочим узлам для чтения соответствующих данных.</p><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-15/ba93830b-dd17-4aac-a3a4-4675f70f642d.png" alt="Схема архитектуры Presto/Trino" /><figcaption>Архитектура Presto/Trino</figcaption></figure><h3>OLAP‑движки для работы в реальном времени</h3><p>StarRocks — высокопроизводительное аналитическое хранилище данных (DWH), реализующее многомерную аналитику, аналитику в реальном времени и высокую конкурентность за счёт векторизации, MPP‑архитектуры, CBO, умных материализованных представлений и колоночного движка с возможностью оперативных обновлений.</p><p>Архитектура StarRocks поддерживает две модели: Shared‑nothing и Shared‑Data. В Shared‑nothing данные загружаются в формат StarRocks и хранятся непосредственно в локальном хранилище узлов StarRocks Backend. Shared‑Data позволяет напрямую запрашивать внешние источники данных без копирования их в кластер StarRocks — аналогично Presto/Trino/Spark.</p><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-15/86fc796c-72c0-4a6d-865c-1dc2bb802738.png" alt="Схема архитектуры StarRocks" /><figcaption>Архитектура StarRocks</figcaption></figure><p>Используются два типа узлов: Frontend (FE) и Backend (BE)/Compute (CN). Узлы FE отвечают за управление метаданными и построение плана выполнения. Узлы BE исполняют план и хранят данные, ускоряя запросы за счёт локального хранения и обеспечивая высокую доступность посредством репликации. В конфигурации с общими данными (Shared‑Data) вместо BE используются вычислительные узлы (CN), которые выполняют те же функции, но не хранят данные.</p><p>ClickHouse был разработан в 2009 году, изначально для сервиса Yandex.Metrica — высоконагруженной веб‑аналитической платформы, обрабатывающей миллиарды событий в день с низкой задержкой. Существующие базы данных не справлялись с таким масштабом для аналитики в реальном времени с высокой конкурентностью, особенно на сложных фильтрах, агрегациях и соединениях. В ответ появился ClickHouse — быстрая OLAP‑СУБД для решения этих задач.</p><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-15/983e7058-86cb-4e2a-9eef-713eeed575d1.png" alt="Схема архитектуры ClickHouse" /><figcaption>Архитектура ClickHouse</figcaption></figure><p>Архитектура ClickHouse использует колоночное хранение; операции выполняются над векторами (колоночными блоками), а данные векторов размещаются в реплицируемых шардах ClickHouse, что обеспечивает быстрое выполнение запросов и отказоустойчивость. Кроме того, ClickHouse позволяет запрашивать данные из облачных хранилищ, аналогично внешним таблицам в традиционных DWH.</p><p>Каждый распределённый исполнительный движок имеет свои сильные стороны: хотя почти все исполняют один и тот же SQL, детали реализации заметно различаются — исполнительные подсистемы, подходы к оптимизациям, обработка shuffle, кэширование, уровни векторизации и т. п.</p><p>В сводной таблице ниже (по мотивам сравнения на сайте Onehouse и описанных в тексте критериев) каждому движку присваивается оценка: A = лучший вариант; B = хороший вариант; C = ниже среднего. Каждой оценке соответствует балл: A = 3, B = 2, C = 1. metascore — нормализованная сумма баллов по всем категориям.</p><h2>Сводная таблица сравнения (оценки A/B/C и metascore)</h2><p>Примечания:</p><ul><li>A = 3 балла, B = 2 балла, C = 1 балл.</li><li>metascore рассчитан как сумма баллов по 5 категориям, нормализованная к максимуму 15 (деление на 15 и умножение на 100%).</li><li>Таблица отражает выводы текста: «лучший/худший» в классе по каждой категории и качественные комментарии по архитектуре.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-15/9aeaa77a-b35f-4a37-a239-d8bbb7887046.png" alt="Analytics Engines Metascore" /></figure><h3>Рейтинг по metascore</h3><ol><li>StarRocks — 73%</li><li>ClickHouse — 73%</li><li>Presto — 67%</li><li>Apache Spark — 60%</li><li>Trino — 60%</li></ol><h3>Сравнение по ключевым критериям</h3><p><b>Скорость выполнения.</b> Одним из ключевых критериев качества вычислительного движка выступает время ответа на запрос; также важны пропускная способность, отказоустойчивость и ресурсоёмкость.</p><p>Оптимизации на базе SIMD (Single Instruction, Multiple Data), позволяющие одной инструкции CPU обрабатывать сразу несколько элементов данных, дают заметное преимущество над поэлементной обработкой.</p><p>— 🏆 Лучший в классе: StarRocks, ClickHouse</p><p>— ❌ Худший в классе: Spark</p><p><b>Масштабируемость.</b> Способность масштабировать кластер вверх/вниз на старте и по завершении запроса — важная составляющая отличной производительности и оптимизации затрат. Архитектуры с разделением хранения и вычислений упрощают масштабирование. Presto обеспечивает наиболее простую операционную модель на больших масштабах. Локальное хранение у StarRocks/ClickHouse усложняет масштабирование. Spark чаще используется для крупномасштабных ETL‑заданий и менее удобен для эластики интерактивных нагрузок.</p><p>— 🏆 Лучший в классе: Presto</p><p>— ❌ Худший в классе: Apache Spark</p><p><b>Конкурентное чтение/запись. </b>Нужна эффективная обработка больших объёмов одновременных запросов с приоритизацией, чтобы важные запросы не блокировались. ClickHouse предоставляет самый тонкий и гибкий контроль над исполнением запросов. В отношении транзакций большинство движков ориентированы на OLAP и уступают типичным OLTP/онлайн‑БД.</p><p>— 🏆 Лучший в классе: ClickHouse</p><p>— ❌ Худший в классе: Apache Spark</p><p><b>Поддержка хранения</b>. В эпоху открытых табличных форматов (Data Lake) по стратегии Lakehouse важно уметь читать/писать множество форматов. Spark поддерживает самый широкий спектр: через источники данных — Parquet, JSON, ORC, Avro, CSV и др.</p><p>— 🏆 Лучший в классе: Apache Spark</p><p>— ❌ Худший в классе: ClickHouse</p><p><b>Поддержка языков запросов.</b> В эпоху ИИ и аналитики главные способы работы — SQL и Python. Apache Spark с PySpark обеспечивает лучший опыт работы с Python и позволяет выражать бизнес‑логику в Python‑функциях; другие движки обычно требуют определять логику на SQL через клиентские обёртки. Spark можно бесшовно использовать как Python‑библиотеку и как распределённый SQL‑движок.</p><p>— 🏆 Лучший в классе: Apache Spark</p><p>— ❌ Худший в классе: Trino, Presto</p><h2>Выводы</h2><p>Выбор оптимального движка для решения бизнес‑задач не ограничивается желаемыми техническими целями — он должен учитывать будущие потребности бизнеса и направление эволюции архитектуры.</p><p>Каждый движок имеет свои сильные стороны:</p><ol><li>Apache Spark обладает самой широкой поддержкой хранилищ и языков; он может подключаться к практически любым типам данных и работать с ними.</li><li>Trino — отличный интерактивный SQL‑движок для ad hoc‑аналитики.</li><li>Presto имеет общую историю с Trino, предоставляет превосходный интерактивный SQL и эффективно масштабируется.</li><li>StarRocks предлагает сверхбыстрый векторизованный движок, но поддержка форматов файлов у него не так широка.</li><li>ClickHouse также даёт сверхбыстрый векторизованный движок для ускорения OLAP, но ему не хватает эластичности масштабирования.</li></ol><p>Независимо от выбора движка, настоящая сила — в умении комбинировать движки, масштабировать их и интегрировать с другими компонентами экосистемы под задачи бизнеса, не заковываясь в единственную архитектурную парадигму.</p>]]></content:encoded>
    </item>
    <item>
      <title>От GreenPlum к Mirrorship: Кейс трансформации Bank of Hangzhou Consumer Finance на основе архитектуры Lakehouse</title>
      <link>https://tproger.ru/articles/ot-greenplum-k-mirrorship--kejs-transformacii-bank-of-hangzhou-consumer-finance-na-osnove-arhitektury-lakehouse</link>
      <comments>https://tproger.ru/articles/ot-greenplum-k-mirrorship--kejs-transformacii-bank-of-hangzhou-consumer-finance-na-osnove-arhitektury-lakehouse?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[StarRocks]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ot-greenplum-k-mirrorship--kejs-transformacii-bank-of-hangzhou-consumer-finance-na-osnove-arhitektury-lakehouse</guid>
      <description><![CDATA[<p>Узнайте, как Bank of Hangzhou Consumer Finance решил проблемы с отслеживаемостью и real-time данными, перейдя с GreenPlum на Lakehouse-архитектуру на базе Mirrorship. Реальный кейс о трансформации дата-платформы в финтехе.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ot-greenplum-k-mirrorship--kejs-transformacii-bank-of-hangzhou-consumer-finance-na-osnove-arhitektury-lakehouse">От GreenPlum к Mirrorship: Кейс трансформации Bank of Hangzhou Consumer Finance на основе архитектуры Lakehouse</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 16 Aug 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h4>Введение: Инновационный путь, объединяющий озера данных и хранилища</h4><p>Bank of Hangzhou Consumer Finance — лицензированная организация потребительского финансирования. Столкнувшись с вызовами, связанными с быстрым ростом бизнеса, компания начала трансформацию своей инфраструктуры данных, кульминацией которой стало создание платформы GLH Lakehouse на базе Mirrorship.</p><p>Платформа GLH представляет собой результат исследований и практического внедрения архитектуры Lakehouse, служа критически важным мостом, соединяющим бизнес-операции с передовыми технологиями.</p><h2>I.Предпосылки создания платформы GLH: Инновации, продиктованные «болевыми точками» в данных</h2><h3>1. Требования бизнес-сценариев</h3><p>Как организация, чья деятельность основана на «данных, сценариях, управлении рисками и технологиях», мы столкнулись с тем, что традиционная архитектура обработки данных больше не могла справляться с растущими потребностями. Эти потребности влияли не только на повседневные операции, но и на стратегические решения и соблюдение нормативных требований.</p><ul><li>Актуальность данных для стратегий: стратегии управления финансовыми рисками требуют своевременных данных для принятия решений. Задержка даже в несколько минут может привести к сбою в контроле рисков.</li><li>Консистентность данных между таблицами: синхронизация данных между различными базами и таблицами должна поддерживать консистентность на определённый момент времени. Любое расхождение могло нарушить бизнес-логику.</li><li>Точность бизнес-данных: ежедневные отчёты для руководства должны быть точными и своевременными, так как они напрямую влияют на стратегическое направление компании.</li><li>Потребности в сверке данных: внутридневные данные необходимы для процессов сверки, и традиционные ETL-процессы не могли обеспечить требуемую оперативность.</li><li>Соблюдение нормативных требований: данные, предоставляемые регуляторам, должны соответствовать строгим стандартам своевременности и точности.</li></ul><h3>2. Анализ ключевых «болевых точек»</h3><p>При использовании традиционной архитектуры данных компания столкнулась с несколькими критическими проблемами:</p><h4>Проблема 1: Сложность отслеживания данных (Data Traceability)</h4><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/5e6fffa4-1f24-4e00-91bf-ed4c72573d88.png" alt="Сложность отслеживания данных" /><figcaption>Сложность отслеживания данных</figcaption></figure><p>Аномалии при передаче данных могли приводить к их потере. Если проблемы не обнаруживались вовремя, стоимость восстановления и отслеживания истории данных была непомерно высокой.</p><h4>Проблема 2: Отсутствие детализированных записей об изменениях</h4><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/26844bb2-cf1c-42aa-8ecf-78a5970d422e.png" alt="Отсутствие детализированных записей об изменениях" /><figcaption>Отсутствие детализированных записей об изменениях</figcaption></figure><p>Для регуляторной отчётности требовалось сообщать о каждом изменении информации о клиенте в течение дня. Однако производственная система сохраняла только конечное состояние на конец суток, не фиксируя промежуточных изменений и не удовлетворяя требованиям полной отчётности.</p><h4>Проблема 3: Неточность данных на определённый момент времени (Point-in-Time Data)</h4><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/2245e242-48fb-4cc0-9e8d-01b0957918a0.png" alt="Неточность данных на определенный момент времени" /><figcaption>Неточность данных на определенный момент времени</figcaption></figure><p>Из-за ограничений ресурсов задания по извлечению данных могли выполняться с задержкой или не выполняться вовсе, что приводило к временным лагам в синхронизации. Это вызывало несоответствие статусов одних и тех же бизнес-сущностей в разных таблицах, порождая хаос в бизнес-логике.</p><h4>Проблема 4: Проблемы с ежедневным закрытием операционного дня (Daily Cut-off)</h4><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/b4cd58fd-e5b3-4261-9215-f739bcdbdd93.png" alt="Проблемы с ежедневным закрытием операционного дня (Daily Cut-off)" /><figcaption>Проблемы с ежедневным закрытием операционного дня (Daily Cut-off)</figcaption></figure><p>В сценариях сверки транзакций по погашению платежей разные системы (например, транзакционная и бухгалтерская) обрабатывали одну и ту же операцию в разное время. Это приводило к серьёзным неточностям в данных к концу дня, что напрямую влияло на сверку.</p><p>Эти «болевые точки» были не просто техническими трудностями — они создавали прямую угрозу для развития бизнеса. Невозможность синхронизировать данные в реальном времени снижала эффективность бизнес-стратегий, несогласованность данных затрудняла сверку, низкое качество данных создавало риски для комплаенса, а сложность отслеживания делала аудиты долгими и дорогостоящими.</p><h2>II. Построение архитектуры Lakehouse с помощью Mirrorship</h2><h3>1. Техническая архитектура платформы GLH</h3><p>Платформа GLH была спроектирована с использованием четырехуровневой архитектуры:</p><ul><li>Уровень приложений (Application Layer): включает узел управления (Manager Node), узлы выполнения (Execute Nodes), кастомные плагины и узел оповещений (Alerting Node).</li><li>Уровень технических компонентов (Technical Component Layer): использует экосистему Spring Framework, MyBatis, собственный RPC-фреймворк, Log4j и др.</li><li>Уровень промежуточного ПО (Middleware Layer): задействует ZooKeeper, Kafka и MySQL.</li><li>Уровень эксплуатации (DevOps Layer): основан на Git, Jenkins, Docker &amp; Kubernetes, Maven.</li></ul><p>Эта архитектура не только отвечала функциональным требованиям, но и обеспечивала стабильность, масштабируемость и удобство сопровождения системы, заложив прочный фундамент для платформы Lakehouse.</p><h3>2. Почему для замены GreenPlum выбрали Mirrorship?</h3><p>Выбор хранилища данных был критически важным решением. После всесторонней оценки и тестирования команда выбрала Mirrorship (корпоративную версию StarRocks) в качестве основного движка для хранения и аналитики.</p><p>Выбор было продиктован насущными проблемами — производительность существующего 26-узлового кластера GreenPlum снижалась по мере роста объёма бизнеса, а расширение требовало значительных инвестиций.</p><ul><li>Снижение затрат и повышение эффективности: лицензионные платежи и стоимость горизонтального масштабирования GreenPlum были высокими. Mirrorship предложила более экономически эффективное решение, соответствующее стратегической цели компании.</li><li>Возможности ingest-а данных в реальном времени: в отличие от традиционных инструментов, таких как Hive, Mirrorship поддерживает real-time ingest и транзакционные запросы, что дает ей естественное преимущество в сценариях с данными реального времени.</li><li>Единая платформа данных: данные были разбросаны по разным системам, создавая «острова данных». Mirrorship предоставила единую платформу для хранения и вычислений, консолидировав данные и упростив доступ к ним.</li><li>Дизайн архитектуры Lakehouse на базе Mirrorship</li></ul><p>В новой архитектуре платформа GLH глубоко интегрирована с Mirrorship для создания истинной Lakehouse.</p><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/be173f03-f57e-4441-be83-147a6a1b73ba.png" alt="Lakehouse Architecture with Mirrorship" /><figcaption>Техническая архитектура платформы GLH</figcaption></figure><ul><li><b>Архитектура с разделением хранения и вычислений (Shared-Storage): в</b> качестве базового хранилища используется HDFS (с планами миграции на S3), что обеспечивает гибкость для управления ростом данных при контроле затрат и сохранении производительности.</li><li><b>Использование нескольких моделей таблиц:</b> используя возможности Mirrorship для работы с детализированными (Detail tables) и широкими таблицами (Wide tables), команда разработала кастомные структуры таблиц, поддерживающие анализ временных рядов и отслеживание данных для различных бизнес-задач.</li><li><b>Унифицированная обработка данных:</b> придерживаясь принципа «сбор один раз, обработка многократно», все данные управляются через единый конвейер обработки. Это позволило избежать дублирования разработки, значительно повысив эффективность и консистентность данных.</li><li><b>Гибкое распределение данных:</b> платформа поддерживает распределение данных в другие системы через Kafka, что обеспечивает работу сценариев, таких как Flink CDC, и создает открытую, гибкую экосистему.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/8c51e694-b410-442b-85b2-dc100b577773.png" alt="StarRocks Storage-Compute Separation" /><figcaption>StarRocks Storage-Compute Separation-in the Last 7 Days</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/116700/2025-08-06/65267eee-e8c7-41a3-b3f8-d4e65362c1a7.png" alt="StarRocks Storage-Compute Separation" /><figcaption>StarRocks Storage-Compute Separation-in the Last 1 Day</figcaption></figure><h2>III. Результаты: баланс между производительностью и экономической эффективностью</h2><p>В ходе внедрения команда накопила ценный опыт:</p><ul><li>Оптимизировали время пакетной обработки: команда применила дифференцированную стратегию синхронизации данных, настраивая интервалы в зависимости от бизнес-потребностей — от 5 секунд для одних таблиц до нескольких минут для других.</li><li>Оптимизировали партиционирование и бакетирование: анализ бизнес-характеристик позволил переработать стратегию партиционирования, чтобы уменьшить накладные расходы на уплотнение (compaction) мелких файлов, что привело к значительному повышению производительности.</li><li>Рационально распределили ресурсы: оптимизировано соотношение ресурсов между вычислительными узлами и узлами хранения. Мониторинг показал, что кластер стабильно работает с загрузкой ЦП ниже 50%, легко справляясь с пиковыми нагрузками.</li></ul><h3>Бизнес-результаты</h3><p>Платформа GLH достигла впечатляющих результатов:</p><ul><li>Полный охват данных: более 3800 таблиц из всех бизнес-систем компании подключены к real-time потоку данных.</li><li>Синхронизация на минутном уровне: время от генерации данных до их доступности сократилось до минут, что многократно повысило скорость реакции бизнеса по сравнению с традиционной моделью T+1.</li><li>Увеличение мощности пакетной обработки: платформа обрабатывает более 6500 заданий в день, включая более 800 задач для хранилища данных, со значительным ростом эффективности.</li><li>Углубление интеграции с бизнесом: снято ограничение на выполнение только пакетных запросов, благодаря открытию real-time query API, что позволило бизнес-системам напрямую получать доступ к актуальным данным.</li></ul><p>Эти достижения — не просто цифры. Они трансформировались в ускоренную реакцию бизнеса и улучшенный клиентский опыт, внеся ощутимый вклад в повышение конкурентоспособности компании.</p><h2>IV. Перспективы развития</h2><p>Платформа GLH завершила разработку основного функционала. Будущее развитие будет сосредоточено на следующем:</p><ol><li>Более открытые интерфейсы: поддержка интеграции с более широким спектром вычислительных и движков хранения.</li><li>Богатая экосистема плагинов: разработка большего количества плагинов для обработки данных.</li><li>Более глубокая интеграция с бизнес-процессами: дальнейшая интеграция с бизнес-системами для предоставления более точных данных.</li><li>Постоянное технологическое развитие: отслеживание развития технологий хранения с запланированной миграцией на объектное хранилище S3.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Куда двигаться после изучения Django: советы для Python-разработчиков</title>
      <link>https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299</link>
      <comments>https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгения Епихина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299</guid>
      <description><![CDATA[<p>В статье разбираемся, почему Django — далеко не финиш в карьере, и в каких направлениях можно двигаться Python-разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299">Куда двигаться после изучения Django: советы для Python-разработчиков</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Neo4j]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 Aug 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Django — это веб-фреймворк на языке Python, который позволяет быстро создавать сложные веб-приложения. Он включает в себя готовые компоненты для работы с базами данных, маршрутизацией URL, обработкой форм, аутентификацией пользователей и админ-панелями, что значительно ускоряет разработку и упрощает поддержку проектов.</p><p>Владение Django — это старт, а не финиш. Чтобы оставаться востребованным, нужно постоянно расширять знания и навыки. В этой статье разберем пути и направления для улучшения своих компетенций.</p><h2>Почему владение Django — не предел для разработчика</h2><h2>Особенности Django</h2><p>Django используют для разработки веб-приложений разной сложности: при работе с большими базами данных, для создания сервисов, способных обслуживать большое количество пользователей. На нём создают соцсети, новостные сайты, веб-версии приложений, онлайн-магазины.</p><p>Основные плюсы:</p><ul><li><b>Полноценный стек</b>: ORM для работы с базой, мощная система маршрутизации URL, шаблоны для рендеринга, встроенная админка, формы, система аутентификации и авторизации.</li><li><b>Архитектура MTV (Model-Template-View)</b>: похожа на классический MVC, но с особенностями, которые упрощают разделение логики, представления и данных.</li><li><b>Безопасность</b>: Django автоматически защищает от CSRF, XSS, SQL-инъекций и других распространенных атак. Не нужно писать много дополнительного кода.</li><li><b>Активное сообщество и экосистема</b>: тысячи сторонних пакетов, расширений и готовых решений.</li><li><b>Поддержка нескольких баз данны</b>х: PostgreSQL, MySQL, SQLite, Oracle и др.</li></ul><p>Ограничения:</p><ul><li><b>Синхронная природа Django</b>.</li><li><b>Монолитность</b>: архитектура фреймворка ориентирована на создание крупных приложений, но в микросервисах может быть избыточна.</li><li><b>Ограниченная гибкость ORM</b>: нестандартные SQL-запросы иногда сложно выразить средствами ORM, приходится использовать raw SQL или сторонние библиотеки для запросов.</li><li><b>Строгие правила организации кода</b>: требуют дисциплины и могут ограничивать свободу в архитектурных решениях.</li><li><b>Недостаточная производительность</b>: уступает лёгким асинхронным фреймворкам (например, FastAPI), особенно под высокими нагрузками. Но для большинства проектов пока это не критично.</li></ul><h2>В каком направлении двигаться после изучения Django</h2><blockquote>Задача — создавать продукт, который будет нужен конечному потребителю.</blockquote><h3>Первое направление для развития — расширить инструментарий для решения разных задач в веб-разработке</h3><p>Возможные пути:</p><ul><li>Изучить другие веб-фреймворки (Flask, FastAPI)</li><li>Углубиться в асинхронное программирование (asyncio, aiohttp)</li><li>Работать с API и микросервисами</li></ul><h4>Flask и FastAPI</h4><p>Flask — минималистичный микрофреймворк, даёт полную свободу в выборе компонентов. Используют для небольших приложений и микросервисов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-12/bbe7c040-14de-426d-9a10-c556f7319bee.png" alt="" /><figcaption>Пример простой команды на Flask</figcaption></figure><p>FastAPI — современный асинхронный фреймворк, ориентирован на создание высокопроизводительных API. Поддерживает стандарт OpenAPI и автоматическую генерацию документации. Он быстрее Flask и Django благодаря asyncio и Pydantic.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-12/33a27277-5136-4a03-8af2-f436db42fa99.png" alt="" /><figcaption>Пример простого API на FastAPI</figcaption></figure><h4>Асинхронное программирование</h4><p>Веб-разработка всё активнее использует асинхронные технологии. Django не всегда справляется с задачами высокой конкурентной нагрузки.</p><p>Поэтому изучение asyncio — стандартной библиотеки Python для асинхронного программирования — откроет перед вами новые возможности. Вместе с aiohttp или тем же FastAPI вы сможете создавать приложения, которые обрабатывают тысячи одновременных соединений. Это особенно важно для real-time сервисов, чат-приложений и систем с интенсивным обменом данными.</p><h3>Второе направление — расширить навыки в смежных областях</h3><p>Можно пойти по пути расширения компетенций за пределы основной специализации. Важно не только уметь писать код, но и понимать, как приложения разворачиваются и работают в продакшене. Знание DevOps-практик помогает наладить эффективное взаимодействие между разработкой и эксплуатацией.</p><h4>Изучение DevOps и контейнеризации</h4><p>Контейнеры позволяют запускать приложения в изолированной среде, это упрощает настройку и развертывание. Например, Docker помогает упаковать приложение с зависимостями в один контейнер, а Kubernetes — управлять такими контейнерами в продакшене. Знание этих технологий улучшит взаимодействие с операционной командой и ускорит выпуск новых версий приложений.</p><h4>CI/CD и автоматизация процессов</h4><p>Непрерывная интеграция (Continuous Integration) и непрерывное развертывание (Continuous Deployment) — ключевые практики современной разработки ПО. Они позволяют автоматизировать сборку, тестирование и доставку приложений, масштабировать процессы.</p><p>Инструменты CI/CD (например, Jenkins, GitLab CI/CD, GitHub Actions) помогают настроить автоматические пайплайны, которые обеспечивают быструю обратную связь и минимизируют человеческий фактор в релизах. Автоматизация процессов снижает количество ошибок и позволяет сосредоточиться на разработке новых функций.</p><p>Настройка непрерывной интеграции и доставки (Continuous Integration / Continuous Delivery) снижает поток ошибок при релизах и экономит время. Пример: GitHub Actions для автоматического запуска тестов и сборки проекта при каждом коммите.</p><h4>Больше знаний в области баз данных</h4><p>Помимо классических реляционных баз данных (PostgreSQL, MySQL), современные приложения часто используют NoSQL для специфичных задач. MongoDB, Redis, Cassandra обеспечивают гибкость в хранении данных, горизонтальное масштабирование и высокую производительность при работе с большими объемами информации.</p><p>Графовые базы данных (Neo4j, ArangoDB) предназначены для эффективного хранения и анализа связей между объектами, что важно для социальных сетей, рекомендательных систем и других приложений с богатой структурой.</p><p>Так, Redis хорошо подходит для кэширования данных, а Neo4j — для сложных связей между объектами.</p><h3>Третье направление — переход к другим аспектам Python-разработки</h3><p>Рассмотрим четыре варианта карьерного развития для Python-программиста: Data Science и машинное обучение, автоматизация бизнес-процессов, разработка десктопных приложений и встраиваемые системы (IoT).</p><p>Почему стоит попробовать?</p><ul><li>Высокий спрос на специалистов. Они востребованы в банках и инвестиционных компаниях, в сфере медицины и биотехнологии, в консалтинге,  автомобильной промышленности и т.д..</li><li>Широкий набор библиотек: pandas, NumPy, scikit-learn, TensorFlow, PyTorch.</li><li>Возможность работать с реальными задачами: от бизнеса до науки.</li></ul><h4>Автоматизация и скрипты для бизнеса</h4><p>Python часто используется для автоматизации рутинных задач: парсинга данных, обработки файлов, интеграции систем, генерации отчетов. Создание скриптов для автоматизации бизнес-процессов помогает повысить эффективность работы и снизить количество ошибок.</p><p>Знание таких библиотек, как openpyxl (работа с Excel), requests (HTTP-запросы), BeautifulSoup и Scrapy (парсинг веб-страниц), а также умение писать скрипты под конкретные задачи, делают разработчика ценным специалистом в корпоративной среде.</p><p>Примеры задач:</p><ul><li>Автоматическая загрузка данных из Excel и их преобразование</li><li>Скрипты для отправки email-рассылок</li><li>Интеграция с CRM и другими сервисами через API</li></ul><h4>Разработка десктопных приложений (PyQt, Kivy)</h4><p>Хотя сейчас популярность уходит к вебу и мобильным платформам, десктопные приложения на Python востребованы в таких сферах: инструменты для анализа, редакторы, утилиты.</p><p>Инструменты для создания:</p><ul><li>PyQt — мощный фреймворк для создания кроссплатформенных GUI.</li><li>Kivy — библиотека для разработки приложений с поддержкой сенсорных экранов.</li></ul><p>Этот путь подходит тем, кто хочет создавать удобные инструменты с графическим интерфейсом для пользователей на Windows, macOS или Linux.</p><h4>Встраиваемые системы и IoT</h4><p>В области IoT и встроенных систем Python набирает популярность благодаря легкости освоения и поддержке на маломощных устройствах. Помогают в этом  платформы по типу Raspberry Pi и MicroPython.</p><p>Изучение этого направления открывает возможности работы с аппаратным обеспечением, созданием прототипов и внедрением инновационных решений в промышленности и бытовой технике.</p><p>Например, с помощью Python на Raspberry Pi можно  разрабатывать датчики для мониторинга состояния оборудования на производстве и разрабатывать прототипы носимых устройств для сбора данных о здоровье.</p><blockquote>Если рассматривать профессию “Python-разработчик на Django”, то сразу получится сужение до конкретной библиотеки на конкретном языке. Если же в резюме у специалиста стоит, что он “разработчик Python”, возможностей сильно больше. Если написать про себя “разработчик”, будет не понятно, разработчик чего. Но изменив резюме на “DevOps инженера”, становится понятен карьерный трек.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>BrOk: Как упростить работу с брокерами сообщений и REST-запросами без лишнего кода?</title>
      <link>https://tproger.ru/articles/upravlenie-populyarnymi-brokerami-soobshhenij-v-odnom-prilozhenie-</link>
      <comments>https://tproger.ru/articles/upravlenie-populyarnymi-brokerami-soobshhenij-v-odnom-prilozhenie-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Павел]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/upravlenie-populyarnymi-brokerami-soobshhenij-v-odnom-prilozhenie-</guid>
      <description><![CDATA[<p>BrOk — графический low-code инструмент для управления популярными брокерами сообщений, такими как Kafka, RabbitMQ, Artemis, NATS и Redis. Узнайте, как упростить работу с очередями, шаблонами, сценариями и REST API без лишнего кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/upravlenie-populyarnymi-brokerami-soobshhenij-v-odnom-prilozhenie-">BrOk: Как упростить работу с брокерами сообщений и REST-запросами без лишнего кода?</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 09 Aug 2025 14:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Введение</h2><p>Всем привет! Я Павел, системный аналитик. Хочу поделиться с вами своим опытом и опытом своих коллег, как мы в нашей компании «Аксеникс Инновации» упростили свою работу с брокерами сообщений и REST-запросами.</p><p>Работа с брокерами сообщений, HTTP-сервисами и СУБД часто требует множества рутинных действий: отправки тестовых сообщений, создания шаблонов, настройки интеграций между сервисами, написания скриптов для нагрузочного тестирования. Иногда это занимает больше времени, чем сама разработка.</p><p>Для решения данной проблемы, мы разработали <a href="https://axenix-innovation.pro/brok/">BrOk</a>.</p><p><b>BrOk</b> — это графический <b>low-code инструмент</b>, который помогает разработчикам, тестировщикам и системным администраторам (и не только им =) ) работать с брокерами сообщений, базами данных и веб-сервисами через <b>удобный интерфейс</b>. Он позволяет создавать сложные интеграционные процессы, запускать их по расписанию, отлаживать и сохранять шаблоны — всё это <b>без необходимости писать десятки строк кода.</b></p><p>Если вы работаете с Apache Kafka, RabbitMQ, ActiveMQ Artemis, Redis, NATS, ETCD, REST API или СУБД, то <b>BrOk</b> может стать вашим <b>единым “командным пунктом”</b> для управления этими системами.</p><p>Сразу хочу предупредить, что BrOk можно <b>бесплатно скачать </b><a href="https://axenix-innovation.pro/brok/">тут</a> и во время прочтения статьи самостоятельно просматривать функционал.</p><blockquote>Читать всего совсем не нужно, читать нужно только то, что отвечает на возникшие в душе вопросы.</blockquote><h2>Основные функции и возможности BrOk</h2><h3>1. Поддержка множества брокеров сообщений</h3><p>Первая и главная возможность BrOk — это поддержка работы с популярными брокерами сообщений:</p><ul><li>Apache Kafka</li><li>RabbitMQ</li><li>Apache ActiveMQ Artemis</li><li>Redis</li><li>NATS</li></ul><p>Вот так выглядит экранная форма для подключения брокеров.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/46bc14c7-e84d-4bb0-ae26-834e91b3dc97.png" alt="" /><figcaption>ЭФ "Управление"</figcaption></figure><p>Пример создания подключения к брокеру Apache Kafka.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/081aacd8-d147-40fb-ac1e-56e5bccca00a.png" alt="" /><figcaption>Подключение к брокеру Apache Kafka</figcaption></figure><p>Создав подключение, вы можете посмотреть топики.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/0cd2bbba-eef5-4173-89a3-2e0b3d00a5fd.png" alt="" /><figcaption>Топики брокера "kafka-dev"</figcaption></figure><p>Так же вы можете создать топик, очистить в нем сообщения, удалить топик или отправить в него сообщение.</p><p>Теперь давайте перейдем в один из топиков. В нем вы можете смотреть и отправлять сообщения.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/6720635c-687a-4830-b27b-e587bca01826.png" alt="" /><figcaption>Просмотр сообщений топика</figcaption></figure><h4>Преимущество 1</h4><p>В BrOk есть продвинутые фильтры для поиска сообщений в Kafka, Artemis, Rabbit MQ.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/2e48c1af-47fc-48f9-add6-3bb1f16709aa.png" alt="" /><figcaption>Фильтры для поиска сообщений</figcaption></figure><h4>Преимущество 2</h4><p><b>Не надо постоянно с нуля создавать сообщения</b>, так как можно создать шаблон и использовать его для быстрого создания сообщений.</p><p>На картинке ниже представлен список моих шаблонов для топика.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/52438942-4dcd-406f-9174-c20795e2701c.png" alt="" /><figcaption>Список шаблонов</figcaption></figure><p>Рассмотрим форму для отправки сообщения в топик.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/7548ed0f-a38d-4206-9bfd-6bf0c34f17bb.png" alt="" /><figcaption>Отправка сообщения</figcaption></figure><p>Вы можете нажать на кнопку “Шаблоны” и выбрать нужный из списка. После этого он автоматически подставится в соответствующие поля сообщения.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/7f1bf70d-541c-4e3a-bec6-85f233a51182.png" alt="" /><figcaption>Использование шаблона</figcaption></figure><h4>Преимущество 3</h4><p>Для создания большого количества тестовых сообщений можно использовать в шаблоне параметры. При отправке сообщения параметр заменяется на значение, зависящее от его типа.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/d8406683-1189-4101-8d10-d852972893bc.png" alt="" /><figcaption>Параметры</figcaption></figure><p>BrOk поддерживает множество различных типов параметров: от случайных строк и UUID до дат и т. д. Также он работает со словарями, из которых подставляет нужные значения.</p><h4>Преимущество 4</h4><p>При отправке сообщения можно указать, сколько раз его нужно отправить. Для этого надо заполнить поле “Количество повторений”.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/6c881136-ebb0-47ff-b77d-7451200b0ccf.png" alt="" /><figcaption>Заполняем "Количество повторений" для сообщения</figcaption></figure><h3>Мини-вывод о преимуществах</h3><p>Одна из рутинных задач при тестировании — повторная отправка однотипных сообщений. BrOk решает эту проблему за счёт сочетания упомянутых преимуществ, которые позволяют быстро создавать множество уникальных сообщений для разных брокеров. Это особенно полезно при тестировании.</p><h2>2. Работа с HTTP(s) запросами</h2><p>В BrOk вы можете использовать HTTP(s)-запросы: GET, POST, PUT и другие методы. Кроме того, доступна работа с заголовками, авторизацией и телом запроса.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/a7a39489-1a3a-45a3-9f63-ccc7351821dd.png" alt="" /><figcaption>ЭФ REST</figcaption></figure><p>Во время своей работы я часто использую возможность экспортировать или импортировать коллекцию в BrOk в формате “Postman” или “OpenApi”.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/41220416-3a72-4f6c-9abf-f682a0e31063.png" alt="" /><figcaption>Импортирование коллекции</figcaption></figure><p>Данная возможность позволяет загрузить спецификацию из Swagger в BrOk или наоборот. Поэтому не обязательно делать всё в Swagger. Можно сначала создать коллекцию в BrOk, потестировать её, а потом экспортировать в формате OpenApi.</p><h2>3. Визуальный конструктор сценариев</h2><p>Одним из ключевых преимуществ BrOk является его low-code конструктор сценариев , который позволяет строить сложные процессы взаимодействия между сервисами через удобный графический интерфейс.</p><p>Сценарии в BrOk — это не просто набор команд. Это полноценные процессы, которые могут включать отправку сообщений в брокеры сообщений, выполнение SQL-запросов к БД, REST-вызовы, паузы, обработку ошибок, запуск Groovy-скриптов и даже вызов другого сценария из основного сценария. Всё это можно собрать как конструктор, перетаскивая блоки (таски) и соединяя их линиями.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/d5ecbf5f-82c6-4511-ad13-cc56fefa770d.png" alt="" /><figcaption>Сценарий</figcaption></figure><h4>Пример использования</h4><p>Представьте, что вам нужно протестировать интеграцию между микросервисами через Kafka и PostgreSQL.</p><p>Вы создаете сценарий, в котором:</p><ul><li>Таска “Отправка сообщения” для отправки тестового сообщения в Kafka.</li></ul><ul><li>Таска “Слушатель” для ожидания ответа от другого сервиса.</li></ul><ul><li>Таска “SQL” для записи результата в БД через SQL-запрос.</li></ul><ul><li>Таска “REST” для отправки запроса, если возникнет ошибка.</li></ul><p>Сценарий действий:</p><ul><li>Отправка тестового сообщения в Kafka.</li></ul><ul><li>Ожидание ответа от другого сервиса с помощью таски “Слушатель”.</li></ul><ul><li>Запись результата в БД через SQL-запрос.</li></ul><ul><li>Если произошла ошибка — отправляется уведомление по REST API.</li></ul><ul><li>Сохраняете этот сценарий и настраиваете его запуск раз в час.</li></ul><p>Такой подход позволяет полностью автоматизировать тестирование.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/4f481d09-43b3-4406-9dd9-0b24274d0386.png" alt="" /><figcaption>Пример сценария</figcaption></figure><h2>Заключение</h2><p>BrOk — это больше, чем ещё один GUI для работы с брокерами. Это полноценное приложение, которое объединяет разрозненные технологии в единый, логичный и удобный интерфейс. Неважно, работаете ли вы с Kafka, RabbitMQ, Artemis, Redis или NATS — с помощью BrOk вы получаете не только доступ к сообщениям, но и мощный low-code конструктор сценариев, систему шаблонов и универсальный клиент для REST.</p><p>Технологии развиваются, и подходы к их использованию тоже должны меняться. Вместо написания кода ради нескольких строк — проектируйте процессы. Вместо множества приложений — работайте в одном.</p><h3>Попробуйте BrOk. Возможно, он именно то, что вам нужно.</h3><p>Официальная страница: <a href="https://axenix-innovation.pro/brok/">https://axenix-innovation.pro/brok/</a></p><p>Скачать и <b>начать</b> использовать можно <b>уже сейчас</b>!</p><p>Если у вас есть вопросы, пишите в комментариях или скачайте BrOk. Там вы найдете форму обратной связи, где можно задать свой вопрос или написать предложение по улучшению.</p><p>Чтобы открыть форму обратной связи, нажмите на иконку выпадающего списка, которая находится в правом верхнем углу приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/116123/2025-07-02/f048b4ff-8e2c-44f7-a79e-40133e2c9333.png" alt="" /><figcaption>Меню</figcaption></figure><p><b>Спасибо</b>, что прочитали статью до конца!</p>]]></content:encoded>
    </item>
    <item>
      <title>Вредные советы по работе с базами данных, или как расстроить DBA</title>
      <link>https://tproger.ru/articles/vrednye-sovety-po-rabote-s-bazami-dannyh--ili-kak-rasstroit-dba</link>
      <comments>https://tproger.ru/articles/vrednye-sovety-po-rabote-s-bazami-dannyh--ili-kak-rasstroit-dba?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vrednye-sovety-po-rabote-s-bazami-dannyh--ili-kak-rasstroit-dba</guid>
      <description><![CDATA[<p>Сборник самых раздражающих ошибок в работе с базами данных — с примерами и советами, как делать правильно. По выпуску подкаста «Техно.Логично».</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vrednye-sovety-po-rabote-s-bazami-dannyh--ili-kak-rasstroit-dba">Вредные советы по работе с базами данных, или как расстроить DBA</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Oracle]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Инновации]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 08 Aug 2025 08:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда разработчик говорит «база упала», администратор баз данных вздыхает и открывает логи. Снова кто-то решил, что временные файлы бесконечны. Или создал 47 индексов на одной таблице. Или оставил транзакцию висеть на выходные.</p><p>Классические ошибки повторяются с завидным постоянством. В недавнем выпуске подкаста «Техно.Логично» наши коллеги Владимир Герциков и Николай Волынкин как раз обсуждали типичные проблемы с базами данных — от выбора инструментов до падений в продакшне. Послушав коллег, мы решили не пересказывать их беседу целиком, а на основе их беседы сделать практический список вредных советов.</p><p>Получился антигайд: как гарантированно завалить базу данных — и что делать правильно. Если узнаете себя в этих советах, не расстраивайтесь. Через подобное проходят все. А если хотите услышать полную дискуссию о современных СУБД, инструментах и миграции на open source — послушайте <a href="https://vk.com/video-145457488_456239847?access_key=b17a8de1d4db2dde5d">оригинальный выпуск</a>.</p><h2>1. Временные файлы бесконечны — лейте терабайты джойнов</h2><p>Берите две таблицы по миллиону записей каждая, смело делайте JOIN без WHERE, сортируйте результат — и удивляйтесь, почему закончилось место под временные данные.</p><p><b>Что происходит</b>: PostgreSQL создает временные файлы в pg_tmp для обработки больших запросов. Когда места не хватает, падают конкретные запросы с ошибкой <i>No space left on device</i>, а не весь сервер. Особенно болезненно там, где несколько таких запросов запускаются параллельно — временное пространство переполняется быстрее, чем успевает сработать мониторинг.</p><p><b>Как делать правильно</b>: Планируйте размер временных данных заранее. Добавляйте фильтры перед джойнами, разбивайте сложные запросы на этапы. Настройте temp_file_limit для ограничения временных файлов на запрос и мониторинг заполнения. Если ваш запрос генерирует терабайты промежуточных результатов, скорее всего, есть способ сделать это эффективнее.</p><h2>2. Суперпользователь для всех задач — что может пойти не так</h2><p>Создайте пользователя с правами суперадминистратора, используйте его для всех подключений и смело устанавливайте любые расширения, найденные в интернете.</p><p><b>Реальная история:</b> Разработчик развернул постгрес на виртуалке с дефолтными настройками — порт 5432 открыт, пользователь <i>postgres/postgres</i> с правами суперпользователя. Через семь (!) секунд в базу начали ломиться боты. Боты сканируют интернет на стандартные порты СУБД постоянно и превращают сервер в майнинг-ферму быстрее, чем вы успеете допить кофе. Диск переполнился от созданных таблиц, установились неизвестные расширения, начались HTTP-вызовы из базы наружу. Сервер превратился в часть ботнета.</p><p><b>И так все понятно, но еще раз напомним</b>: Суперпользователь может подключить postgres_fdw, dblink и читать/писать любые базы кластера, создавая запросы, которые переполнят временное пространство за минуты. Неподписанные расширения могут содержать что угодно — от бэкдоров до майнеров. А если расширение вызовет <i>segmentation fault</i>, упадет вообще все.</p><p><b>Принцип минимальных прав:</b> Создавайте отдельных пользователей с минимально необходимыми правами. Устанавливайте только официально поддерживаемые расширения. Закрывайте базу от внешнего доступа файрволом, настройте TLS для шифрования трафика, используйте fail2ban против брутфорса и уникальные пароли. Это кажется очевидным, но количество баз с дефолтными паролями в интернете говорит об обратном.</p><h2>3. Держите транзакции открытыми — счетчик XID все стерпит</h2><p>Открывайте длинные транзакции и держите их днями. Постгерс умный, сам разберется.</p><p><b>Что сломается:</b> У PostgreSQL есть счетчик транзакций (XID), который может переполниться. Когда возраст транзакций становится критическим, сервер блокирует обычные подключения и пускает только суперпользователя для выполнения <i>VACUUM FULL</i>. Все приложения встают, начинается паника.</p><p><b>Как избежать:</b> Настройте timeout для idle in transaction состояний. Разбивайте большие батчи на маленькие операции. Мониторьте возраст самых старых транзакций. И запомните: транзакция, которая висит неделю, — это не фича, это бомба замедленного действия.</p><h2>4. На каждый SELECT — свой индекс</h2><p>Создавайте индекс под каждый запрос. Чем больше индексов, тем быстрее будет работать.</p><p><b>Почему это убивает PostgreSQL: </b>В отличие от других СУБД, PostgreSQL при UPDATE создает новую версию записи, а старую помечает как мертвую. Если у таблицы 30 индексов, каждый UPDATE генерирует 30 мертвых ссылок в индексах. VACUUM начинает работать постоянно, производительность рушится.</p><p><b>Правило 20/80: </b>Покройте индексами 20% самых частых запросов, которые дают 80% нагрузки. Остальную аналитику выносите на реплику для чтения. Регулярно анализируйте статистику использования индексов — неиспользуемые безжалостно удаляйте .</p><h2>5. Сайзинг не нужен</h2><p>Ресурсы бесконечны. А DBA разберутся, как бэкапить ваши 100 терабайт.</p><p><b>Физические ограничения:</b> Таблица в PostgreSQL не может быть больше 32 терабайт при дефолтном размере блока. Ограничение можно обойти партиционированием или пересборкой с увеличенным размером блока, но лучше планировать заранее.</p><p><b>Экономика:</b> «Эта функция будет стоить как два сервера, потому что нам нужно оборудование для бэкапа 50-терабайтной базы». В этот момент «бизнес» делает большие глаза и внезапно появляется мотивация оптимизировать архитектуру.</p><p><b>Планирование:</b> Считайте размер данных на год-два вперед. Внедряйте партиционирование с первого дня, если ожидаете рост. Архивируйте старые данные. Удалить лишнее проще, чем добыть дополнительные терабайты дискового пространства в пятницу вечером.</p><h2>6. Пихайте СУБД в контейнеры</h2><p>Kubernetes решает все проблемы! Поэтому переносим в контейнеры все, базы данных тоже. Если что-то работает на виртуалках, то в контейнерах точно будет работать лучше.</p><p><b>Проблемы слоеного пирога:</b> Мы слышали, тебе нравится виртуализация, поэтому мы добавили виртуализацию в твою виртуализацию. В результате кратное усложнение отладки. Где тормозит база: железо, гипервизор, менеджер контейнеров?</p><p><b>Где контейнер оправдан?</b>  В CI/CD, локальной разработке, тестовых средах. В продакшне контейнеры тоже работают, если использовать Kubernetes-операторы (Patroni, CloudNativePG), правильно настроить Persistent Volumes и протестировать поведение при рестартах. База должна жить в памяти, прогревать кэши, работать стабильно. Но это требует серьезной экспертизы в Kubernetes и готовности разбираться с проблемами на стыке технологий. Если команда не готова изучать все тонкости — лучше не начинать.</p><p><b>Компромисс:</b> Если выбираете контейнеры для продакшна, используйте StatefulSet, настройте правильные storage-классы и OOM-политики. Для stateless-сервисов контейнеры — отличный выбор.</p><h2>7. Всю бизнес-логику держим в хранимках — так быстрее</h2><p>Переносите всю логику в базу. Зачем нужны сервисы приложений?</p><p><b>Пример из практики:</b> Система с хранимыми процедурами Oracle обыграла Java-реализацию в тестах производительности. Логика выполнялась рядом с данными, без сетевых задержек. Но когда нагрузка выросла в разы, уперлись в лимит CPU на сервере баз данных. Добавить ресурсы оказалось сложнее, чем масштабировать stateless-сервисы.</p><p><b>Компромисс:</b> Тяжелые агрегации и отчеты делайте в функциях базы. CRUD-операции выносите в сервисы приложений. Следите за загрузкой CPU на сервере БД — когда она приближается к пределу, начинайте выносить логику наружу.</p><h2>8. Коммерческая СУБД — единственный путь</h2><p>Только коммерческие решения подходят для серьезных задач. Oracle и SQL Server проверены временем, а всякие open source базы — это для студентов и стартапов.</p><p><b>Что изменилось:</b> События последних лет заставили многие компании пересмотреть подход к выбору СУБД. Компании массово переходят на PostgreSQL Pro и другие open source решения. Тренд только усиливается — игнорировать open source значит отстать от рынка и пропустить инновации, которые часто появляются именно в открытых проектах.</p><p><b>НО:</b> Vanilla PostgreSQL без поддержки — это действительно риск. Когда расширение Oracle FDW падает с разными структурами таблиц, а автор из коммьюнити отвечает «мне в голову не приходило, что кто-то будет так делать», понимаешь ценность платной поддержки. Поэтому open source, но с поддержкой от надежных вендоров.</p><h2>Заключение</h2><p>Продовые пожары в базах данных всегда случаются в самый неподходящий момент. Но большинство из них можно предотвратить, следуя простым правилам: планировать ресурсы, ограничивать права, мониторить метрики.</p><p>Выберите один совет из этой статьи и примените его сегодня. Возможно, это сэкономит вам несколько часов сна в будущем. А коллеги-DBA скажут спасибо.</p>]]></content:encoded>
    </item>
    <item>
      <title>Хакерская атака обрушила IT-системы нескольких московских клиник</title>
      <link>https://tproger.ru/news/hakerskaya-ataka-obruwila-it-sistemy-neskolkih-moskovskih-klinik</link>
      <comments>https://tproger.ru/news/hakerskaya-ataka-obruwila-it-sistemy-neskolkih-moskovskih-klinik?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/hakerskaya-ataka-obruwila-it-sistemy-neskolkih-moskovskih-klinik</guid>
      <description><![CDATA[<p>Кибератака парализовала ИТ-системы клиник Москвы: недоступны базы пациентов, сайты и онлайн-запись, пострадали «Семейный доктор» и др</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/hakerskaya-ataka-obruwila-it-sistemy-neskolkih-moskovskih-klinik">Хакерская атака обрушила IT-системы нескольких московских клиник</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Jul 2025 14:24:24 GMT</pubDate>
      <content:encoded><![CDATA[<p><br />В Москве крупные медицинские сети — «Семейный доктор» и «Альфа‑Центр Здоровья» <a href="https://ura.news/news/1052971612">столкнулись</a> с масштабной кибератакой, которая парализовала работу их онлайн‑сервисов.</p><p>Ранее о подобной атаке заявили в «Неофарме» и аптеке «Столичка».</p><p>В «Семейном докторе» недоступна база данных пациентов, сайт вроде как отключен от хостинга, а платформа личного кабинета и онлайн-записи не функционирует. Это уже третья за день сеть медучреждений с аналогичными проблемами.</p><h2>Какие сбои уже зафиксировали</h2><p>Кроме проблем в «Семейном докторе», есть и другие пострадавшие. «Альфа‑Центр Здоровья», например, подтвердил сбои в внутренних сервисах и невозможность доступа к пациентскому порталу, также сообщая о технических неполадках сервисов онлайн-записи и личного кабинета.</p><p>По данным Regnum, в аптечных сетях пользователи потеряли возможность брони и доступа к программе лояльности.</p><h2>Прецедент: атака на «Столичку» и «Неофарм»</h2><p>Накануне аналогичные кибератаки обрушили работу аптек «Столичка» в свыше 1000 точках в 80 городах: сотрудники были освобождены от смен, клиенты не могли воспользоваться услугами. Подобным образом пострадал и «Неофарм».</p><h2>Возможные причины и мотивы</h2><p>Пока официальных данных о том, кто стоит за атакой, нет. Однако схожие атаки связывают с активистскими группами или APT‑группировками, в том числе с украинскими корнями, которые в прошлых случаях взламывали российские сервисы и базы данных.</p><h2>Что дальше?</h2><ul><li>Клиники и аптеки требуют восстановления инфраструктуры и выяснения причин инцидента.</li><li>В ближайшие дни ожидаются комментарии со стороны пострадавших организаций.</li><li>Эксперты предупреждают: атаки на критичные медицинские системы могут угрожать не только комфорту, но и здоровью населения.</li></ul><h2>Просто напоминание</h2><p><a href="https://tproger.ru/news/--hakery-unichtozhili-it-infrastrukturu--aeroflota---sboi--otmeny-rejsov-i-utechka-na-20-tb">Напомним</a>, что вчера случился один из крупнейших взломов за всю историю российской авиации.</p><p>Жертвой оказалась компания «Аэрофлот», а ответственность за атаку взяли на себя украинские хакеры.</p>]]></content:encoded>
    </item>
    <item>
      <title>Где вести базу знаний по проекту: альтернативы Notion для айтишников в 2025</title>
      <link>https://tproger.ru/articles/gde-vesti-bazu-znanij-po-proektu--alternativy-notion-dlya-ajtiwnikov-v-2025</link>
      <comments>https://tproger.ru/articles/gde-vesti-bazu-znanij-po-proektu--alternativy-notion-dlya-ajtiwnikov-v-2025?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/gde-vesti-bazu-znanij-po-proektu--alternativy-notion-dlya-ajtiwnikov-v-2025</guid>
      <description><![CDATA[<p>Обзор лучших альтернатив Notion для ведения базы знаний в IT-проектах в 2025 году. Сравнение функционала, интеграций и удобства для разработчиков и команд.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/gde-vesti-bazu-znanij-po-proektu--alternativy-notion-dlya-ajtiwnikov-v-2025">Где вести базу знаний по проекту: альтернативы Notion для айтишников в 2025</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Slack]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Управление проектами]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[На английском языке]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Jul 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>С Notion знакомы почти все, но не всем он подходит: кто-то боится блокировок (и не зря), кто-то устал от ограничений веб-интерфейса, а кому-то нужно больше гибкости в настройках и хранении данных. Мы собрали удобные альтернативы, которые помогут айтишникам вести базу знаний, управлять проектной документацией, строить внутренние вики и не бояться за свои данные. В подборке — российские и зарубежные сервисы: от on-prem-развёртывания до p2p-решений без облаков и подписок.</p><h2>1. Yonote</h2><p><a href="https://yonote.ru/">Yonote</a> — российская база знаний и система для работы с проектами. Помогает командам и отдельным пользователям собирать и систематизировать информацию, вести базы знаний, планировать проекты и обмениваться документами. Платформа сочетает гибкий интерфейс, как в Notion, и функциональность KMS-систем: блочный редактор, доски, таблицы и базы данных работают в одном окне. Отличие Yonote — бесконечные доски для визуального планирования, поддержка on-prem-развёртывания и хранение данных в России.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/cb268bc0-5d5c-42e4-add4-a48119f9d813.png" alt="" /></figure><h2>Сценарии использования</h2><p>Yonote подходит для:</p><ul><li>Командной работы: планирование задач, контроль<br />сроков, управление проектами, CRM, сбор и визуализация отчётов, хранение<br />инструкций и регламентов.</li><li>Личных целей: заметки, трекер задач,<br />бюджетирование, планирование поездок, учёба и хранение материалов.</li><li>Создания Wiki: организация базы знаний о<br />продукте с древовидной структурой, вставкой таблиц, диаграмм и медиа, историей<br />изменений и комментариями.</li><li>Ведения<br />документации: базы данных по<br />клиентам, проектам и инвентарю с таблицами, фильтрами, канбан-досками и<br />календарями, прикреплением файлов и ссылок.</li></ul><h2>Формат работы</h2><p>Yonote работает через web-интерфейс с удобным Markdown-редактором, поиском и историей изменений. Можно встраивать код, схемы и embed-ссылки из GitHub, Figma, Miro и других сервисов.<b></b></p><p>Поддерживается полный доступ по API, импорт и экспорт в Markdown и PDF, хранение на своих серверах (on-prem) и в облаке. Yonote предлагает более 30 интеграций, включая GitHub, Jira, Trello, Telegram, Miro и Airtable. Настраиваются уровни доступа: можно создавать гостевые аккаунты, разграничивать права на чтение и редактирование, делиться публичными ссылками.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/15f1bf63-f765-49ce-81c0-bb726d240417.png" alt="" /></figure><p>Yonote заменяет несколько инструментов сразу (Trello, Google Docs, Confluence, личные заметки), легко адаптируется под любые задачи, подходит для госорганизаций, частных компаний и личного использования.</p><h2>Тарифы</h2><ul><li>Базовый — бесплатно, 5 ГБ, до 5 пользователей и 10 гостей.</li><li>Старт — 149 ₽ за пользователя в месяц, 20 ГБ, до 50 гостей.</li><li>Про — 249 ₽ за пользователя в месяц. Доступен безлимит гостей, неограниченное хранилище, SSO.</li><li>Enterprise — тариф для организаций с расширенной поддержкой и контролем.</li></ul><h2>2. Anytype</h2><p><a href="https://anytype.io/">Anytype</a> — «приложение для всего», которое предлагает создать собственную локальную сеть для хранения знаний, заметок, трекеров привычек, рецептов и канбан-досок. По принципу работы похоже на Notion: блоковая структура, гибкие базы данных и визуальные представления информации.</p><p>Главное отличие — Anytype полностью локален и использует P2P-синхронизацию без серверов и посредников, данные остаются только у вас, никто не имеет к ним доступа. Приложение с открытым кодом и доступной архитектурой, работает без интернета и требует установки на устройство.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/cef4a88c-bab4-4604-ac14-954b19a6c4d7.png" alt="" /></figure><h2>Сценарии использования</h2><p><b>Личные цели:</b> создание ежедневников, трекеров привычек, расписаний, конспектов, ведение стратегических заметок в одном месте, даже без подключения к интернету.</p><p><b>Работа в команде:</b> организация командных вики и канбан-досок, совместная работа в группах, ведение календарей.</p><p><b>Сообщество и креатив:</b> управление блогом, создание лент-контента, рекомендаций и курируемых подборок, построение сообщества с объявлениями и вики-страницами.</p><h2>Формат работы</h2><p>Anytype работает офлайн на мобильных и десктопных устройствах (iOS, Android, Windows, macOS, Linux), без веб-версии. Скоростная P2P-синхронизация возможна через локальные сети.</p><p>Интерфейс основан на визуальном код-фри (no-code) редакторе: можно создавать базы данных, таблицы, канбаны, галереи и граф-связи между объектами.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/af471c87-a400-44d6-9306-9ee7905f8941.png" alt="" /></figure><p>Важно: все данные хранятся в локальном зашифрованном «хранилище» пользователя. При создании аккаунта генерируется ключ из 12 слов, который нужно хранить отдельно — без него доступ не восстановить.</p><p>Для разработчиков:</p><ul><li>Поддерживает локальное хранение данных и самостоятельный бэкап в любое место по выбору пользователя.</li><li>Нет API в привычном виде, но возможно расширить функциональность за счёт открытого кода и протоколов.</li><li>Настройки доступа гибко регулируются на уровне устройства, команды и отдельных объектов в приложении.</li></ul><h2>Цена и условия пользования</h2><ul><li>Explorer — бесплатно, подходит для личного использования.</li><li>Builder — $99 в год за пользователя, открывает расширенные функции и поддержку командной работы.</li><li>Co-Creator — $299 в год за пользователя, с расширенными возможностями и дополнительной свободой кастомизации.</li></ul><p><b>Весь интерфейс и работа — на английском языке. </b></p><h2>3. Obsidian</h2><p><a href="https://obsidian.md/">Obsidian</a> — это бесплатное и гибкое приложение для ведения заметок, личных знаний и проектного управления. Поддерживает базы знаний, связи между заметками, визуализацию в графах и публикацию вики. Главная особенность — работа локально на устройстве с хранением заметок в открытых форматах Markdown, без принудительной привязки к облаку. Обеспечивает полную приватность и контроль над данными, даже оффлайн.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/0cb8dbbd-2e8b-4122-a3d1-dc83324e73cf.png" alt="" /></figure><h2>Сценарии использования</h2><p>Есть несколько сценариев:</p><ul><li>Личные заметки и дневники: быстрый доступ к записям на устройстве, структурирование мыслей, создание связей между идеями.</li><li>База знаний и обучение: построение персональных вики с перекрёстными ссылками, графами связей и быстрым поиском.</li><li>Управление проектами и исследованиями: создание канбанов и карт идей в Canvas для планирования и брейншторминга, публикация заметок для команды</li></ul><h2>Формат работы</h2><p>Obsidian — десктопное и мобильное приложение (Windows, macOS, Linux, iOS, Android). Доступны следующие форматы:</p><ol><li>Поддержка открытых форматов файлов (Markdown), которая обеспечивает долгосрочное хранение данных без зависимости от сервиса.</li><li>С помощью Obsidian Publish можно публиковать заметки как публичную вики, документацию с настраиваемым внешним видом и быстрым поиском.</li></ol><p>Плагины позволяют создавать интеграции и автоматизировать процессы в зависимости от потребностей команды.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/6e777ea6-845b-485f-a972-68e67f4a7967.png" alt="" /></figure><p>Есть поддержка истории версий и работы с командой в рамках общих хранилищ, при этом приватность отдельных файлов сохраняется.</p><h2>Цена и условия пользования</h2><ul><li>Бесплатно: использование приложения для личных нужд, хранение данных локально.</li><li>Sync — $4 в месяц за пользователя при оплате за год, синхронизация заметок между устройствами с шифрованием, история версий, совместная работа в общих хранилищах.</li><li>Publish — $8 в месяц за сайт при оплате за год, публикация заметок на сайт без технических знаний, настройка тем и структуры.</li></ul><h2>4. Gramax</h2><p><a href="https://gram.ax/ru">Gramax</a> — платформа для подготовки документации в подходе Docs as Code. Позволяет создавать и редактировать статьи в визуальном редакторе, хранить исходники в Markdown и версионировать их с помощью Git. Подходит для тех, кто хочет управлять документами, знаниями и любым другим контентом в своей инфраструктуре гибко и безопасно.</p><p>Как и в Notion, в Gramax есть совместное использование, комментарии и AI-функции (создание и форматирование текста, перевод, поиск по статьям). Отличие — в Git‑first подходе, открытом коде и возможности использовать платформу бесплатно без ограничений.</p><h2>Сценарии использования</h2><p>Gramax особенно полезен для:</p><ul><li>Документации по продукту: создание портала с инструкциями, оформленного в корпоративном стиле, с быстрым обновлением и AI-поиском.</li><li>Внутренней проектной документации: база знаний с версиями, Merge Request, поддержкой OpenAPI и технических требований.</li><li>Базы знаний для команд: хранение описаний процессов и систем с удобным поиском и доступом через Git.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/df4821a8-42a6-4726-b608-d6c7b5fc01fd.png" alt="" /></figure><h2>Формат работы</h2><p>Gramax делится на:</p><ul><li>Редактор: web и десктоп на Win/Mac/Linux, можно использовать офлайн.</li><li>Git-хранилище: подключается GitLab, GitHub, Bitbucket и другие, команды Git встроены в интерфейс.</li><li>Портал документации: разворачивается как статический сайт или через Docker.</li></ul><p>Для разработчиков есть поддержка диаграмм (Mermaid, Draw.io, PlantUML), подсветка кода (100+ языков), механизм сравнения версий, мультиязычность. Также на портале для чтения можно отображать документацию на разные версии ПО.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/41cc26e8-09bc-4a52-8892-12d624d670e8.png" alt="" /></figure><p>Gramax также поддерживает API для передачи данных в сторонние системы и CLI для интеграции в CI/CD, позволяя автоматически собирать документацию в HTML, PDF и DOCX. Есть импорт из Confluence, Notion и Yandex Wiki, экспорт в DOCX и PDF с фирменным стилем.</p><h2>Цена и условия</h2><ul><li>Open Source — бесплатно, без ограничений. Управление доступом на уровне репозиториев.</li><li>Gramax Enterprise Server — 54 000 ₽ за редактора навсегда, первый год обновления бесплатно, далее 40% от лицензии. Управление доступом — по ролям и группам с SSO и корпоративными политиками.</li></ul><h2>5. KMS Gran</h2><p><a href="https://gran-soft.ru/kms">KMS Gran</a> — база знаний с API и выстроенными бизнес-процессами. Помогает создавать и структурировать проектную документацию, управлять знаниями в команде и автоматизировать рутину. Платформа сочетает возможности вики, систем управления документами, визуальных блок-схем и AI-инструментов для поиска и анализа.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/527d19d3-2727-484a-9f57-d28d8d042093.png" alt="" /></figure><p>Как и в Notion, в KMS Gran есть WYSIWYG-редактор, мобильная версия и AI для работы с текстом. Отличие в том, что на платформе есть модуль «Скриптинг» для построения процессов и гибкая система прав доступа. Подходит командам, которым важно хранить данные локально и быстро строить рабочую рутину.</p><h2>Сценарии использования</h2><ul><li>Вики по продуктам и техдокументация. Доступно создание структурированных статей, глоссариев, руководств и спецификаций. Удобный поиск с морфологией и AI-помощником помогает находить информацию, а кириллица поддерживается корректно.</li><li>Автоматизация бизнес-процессов. С помощью модуля «Скриптинг» можно строить визуальные блок-схемы процессов, задавать условия и добавлять к шагам инструкции и файлы. Подходит для команд поддержки и контакт-центров.</li><li>AI-помощник для пользователей. Индексирует статьи и отвечает на вопросы по проектам с указанием источников. Сохраняет контекст диалогов, позволяет оценивать ответы и формирует отчеты для анализа востребованности контента.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/c841094c-4bf8-436c-b19b-006930b7f518.png" alt="" /></figure><h2>Формат работы</h2><p>KMS Gran работает через web-интерфейс с удобным WYSIWYG-редактором, поддерживающим Markdown, и адаптирован под мобильные устройства. В системе доступен полнотекстовый поиск с морфологией и возможностью получать ответы от AI, а также версионирование с откатом и архивацией статей. Для согласования внутри команды предусмотрена отметка о прочтении. В документы можно вставлять код и схемы через интеграцию с Draw.io, но подключение embed-ссылок из GitHub и Figma не поддерживается.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/3b89b9b3-a569-427b-bc18-f39aba772be6.png" alt="" /></figure><p>Платформа поддерживает работу через API для интеграции с внешними системами, хотя CLI в ней не предусмотрен. Можно настроить подключение к Slack, GitHub, CI/CD и Jira через API. Гибкая система управления доступом позволяет задавать роли как на уровне всей системы, так и в отдельных проектах и разделах, а также управлять доступом к разным документам.</p><h2>Цена и условия</h2><ul><li>SaaS: аренда по подписке, ежемесячная оплата за пользователя. Включены базовый функционал, серверные ресурсы и поддержка 9×5, опционально AI-модуль.</li><li>On-Premise: развёртывание у заказчика, лицензия на длительный срок, поддержка AI-модуля и техподдержка.</li><li>AI-модуль доступен как в SaaS, так и On-Premise.</li></ul><p>Условия зависят от объема лицензий, срока использования и набора функций, обсуждаются индивидуально. Все тарифы включают базовый функционал.</p><h2>Как выбрать платформу для базы знаний</h2><p>Выбор платформы зависит от ваших задач. Для удобства собрали таблицу с особенностями платформ.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-29/44b09d12-0a2c-43df-b80f-5410c0c67351.png" alt="" /></figure><p>Таким образом:</p><p>Если приоритет — работа с документацией как с кодом, версионирование и публикация через Git — ваш выбор<b> Gramax</b>.</p><p>Нужна визуализация, работа с таблицами, досками и интеграции для команды — стоит обратить внимание на <b>Yonote</b>.</p><p>Если вы ищете корпоративное решение с AI, разграничением прав доступа и встроенными процессами — подойдёт <b>KMS Gran</b>.</p><p><b>Anytype</b> или <b>Obsidian</b> подойдут тем, кто ценит контроль над данными и гибкость кастомизации.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 библиотек Python, которые меняют карьеру</title>
      <link>https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru</link>
      <comments>https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru</guid>
      <description><![CDATA[<p>10 библиотек Python, которые помогут прокачаться в аналитике, ML и разработке. Как они работают и почему меняют карьеру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru">10 библиотек Python, которые меняют карьеру</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Jupyter Notebook]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Jul 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>У Python тысячи библиотек, но лишь немногие действительно меняют карьеру. Они помогают не просто решать задачи, а ускорять проекты, прокачивать навыки и выходить на следующий уровень в аналитике, машинном обучении и разработке. В этом материале мы собрали 10 библиотек, которые помогут зарабатывать на Python и развивать навыки.</p><h2>1. Pandas</h2><p>Pandas — библиотека для работы с данными в Python, позволяющая легко загружать, анализировать, очищать и преобразовывать числовую информацию в удобной табличной форме. По сути, это Excel, который смог, и позволяет делать всё автоматизировано и на порядки быстрее.</p><p>Библиотека строится вокруг двух ключевых структур: <b>Series</b> (одномерный массив с индексами); <b>DataFrame </b>(таблица с индексами и колонками).</p><h3>Какие задачи решает библиотека</h3><p>Pandas полезна для следующих задач:</p><ul><li>Сам анализ данных: можно быстро фильтровать, группировать, агрегировать и строить сводные таблицы.</li><li>Очистка данных: удаляем пустые строки, заменяем значения, приводим типы.</li><li>Загрузка данных из CSV, Excel, SQL.</li><li>Визуальная разведка данных (EDA) перед построением моделей.</li><li>Подготовка данных для ML и отчётов.</li><li>Автоматизация отчётов и ETL-пайплайнов.</li></ul><p>Благодаря Pandas аналитик превращается в инженера данных, а ML-специалист может сосредоточиться на моделях, а не на ручной подготовке датасетов.</p><h3>Как пользоваться</h3><p>Ниже разберём простейший кейс: нужно загрузить данные о зарплатах разработчиков из CSV, посчитать среднюю зарплату по языкам программирования и отобрать топ-5.</p><h3>Почему это меняет карьеру</h3><p>Работа с Pandas становится границей между знанием Python и умением решать задачи бизнеса. Для <b>джуна </b>это шанс сразу показать практическую пользу: выгрузки, отчёты и базовый анализ можно делать в десятки раз быстрее и аккуратнее, чем вручную в эксельке.</p><p>Для <b>аналитика</b> Pandas превращается в главный рабочий инструмент, позволяя не просто проверять гипотезы и делать сводные таблицы, а строить полноценные отчётные пайплайны, автоматизировать рутинные выгрузки и концентрироваться на сути данных, а не на правках ручками.</p><p>Для <b>ML-инженера</b> владеть Pandas — значит уметь готовить датасеты качественно; быстро очищать и приводить данные к нужному виду, что напрямую влияет на результат моделей. Без этого работа над проектами машинного обучения часто превращается в бесконечную возню с данными.</p><p>Наконец, даже для <b>разработчиков</b> Pandas может стать неожиданным бустом в карьере. Например, когда нужно автоматизировать отчёты для бизнеса или быстро анализировать логи и данные из БД без поднятия дашбордов — Pandas даёт гибкость и скорость, которые редко даёт что-то ещё в экосистеме Python.</p><h2>2. Django</h2><p>Django — фреймворк для веб-разработки на Python, который позволяет быстро создавать надежные и масштабируемые веб-приложения. Он следует принципам DRY (Don’t Repeat Yourself — не повторяй себя), предоставляя разработчику ORM, роутинг, систему авторизации, админку, работу с формами, шаблонами и инструментами безопасности из коробки.</p><p>Django подходит как стартапам, которым нужно быстро выйти на рынок, так и крупным проектам с миллионами пользователей. Это не просто библиотека, а полноценный каркас для построения и сопровождения веб-сервисов.</p><h3>Какие задачи решает библиотека</h3><p>Каркас, действительно, каркасный. Задачи следующие:</p><ul><li>Создание веб-приложений и API любой сложности.</li><li>Быстрая разработка MVP, прототипов и коммерческих проектов.</li><li>Упрощение работы с базами данных через ORM, без написания сырого SQL.</li><li>Построение административных панелей для управления данными без ручной разработки.</li><li>Гибкая маршрутизация и работа с формами, валидацией и шаблонами.</li><li>Реализация аутентификации, авторизации и защиты приложений.</li></ul><p>Django позволяет сосредоточиться на бизнес-логике и продукте, не тратить недели на настройку инфраструктуры.</p><h3>Как пользоваться</h3><p>Устанавливаем:</p><p>Создаем проект и приложение:</p><p>Пример модели:</p><p>Миграция базы данных:</p><p>Создание админки:</p><p>После этого можно запустить сервер:</p><p>И перейти по адресу http://127.0.0.1:8000/admin для управления записями через готовую админ-панель.</p><h2>3. PyTorch</h2><p>PyTorch — мощная библиотека Python. Она позволяет строить и обучать нейронные сети, проводить вычисления с автоматическим дифференцированием и работать с GPU для ускорения самих вычислений.</p><p>Главное отличие PyTorch от других ML-фреймворков — динамическая вычислительная графика (define-by-run): модель строится и изменяется во время выполнения кода, что даёт гибкость при создании и отладке сложных моделей.</p><p>Сегодня PyTorch используется в продакшен системах, научных исследованиях, компьютерном зрении, NLP и генеративных моделях, занимая ведущее место в индустрии.</p><h3>Какие задачи решает библиотека</h3><p>В функционал PyTorch входят:</p><ul><li>Построение нейронных сетей любой сложности (CNN, RNN, трансформеры);</li><li>Обучение и тестирование моделей на CPU и GPU;</li><li>Реализация кастомных слоёв и loss-функций;</li><li>Разработка и деплой ML/AI моделей в продакшен;</li><li>Быстрая итерация гипотез с удобной отладкой.</li></ul><p>С PyTorch можно начать с простых нейронных сетей, а затем перейти к реализации современных архитектур.</p><h3>Как пользоваться</h3><p>Установим PyTorch (на CPU, для GPU потребуется версия с CUDA):</p><p>Рассмотрим кейс обучения простой нейронной сети для классификации рукописных цифр MNIST.</p><p>После обучения можно использовать torch.save() для сохранения модели и torch.load() для загрузки в продакшн.</p><h3>Почему это меняет карьеру</h3><p>PyTorch — билет в мир современной разработки AI и машинного обучения. Владение инструментом даёт <b>разработчику</b> возможность уверенно войти в области, которые продолжают оставаться топовыми на рынке: искусственный интеллект, компьютерное зрение, NLP, генерация изображений и видео и т.д.</p><p>Для <b>начинающего ML/AI-специалиста </b>PyTorch помогает лучше понять, как устроены нейронные сети, и под капотом увидеть, как происходят вычисления. Это ускоряет рост навыков и делает разработчика востребованным в исследованиях и R&amp;D-проектах.</p><p>Для <b>дата-сайентистов</b> PyTorch позволяет превратить исследовательские ноутбуки в готовые к деплою модели, благодаря PyTorch Lightning, TorchScript и ONNX.</p><p>Для<b> разработчиков, которые хотят выйти на рынок AI</b>, PyTorch — это мастхев: проекты в стартапах и крупных компаниях всё чаще строятся вокруг него. Умение писать кастомные loss-функции, проектировать сложные пайплайны обучения, настраивать обучение на кластерах и GPU — компетенции, которые существенно бустят зарплату.</p><p>PyTorch в целом помогает расширять портфолио: с ним можно создавать генеративные модели, строить LLM, участвовать в соревнованиях и работать с самыми современными подходами в машинном обучении.</p><h2>4. Polars</h2><p>Polars — современная библиотека для обработки данных в Python, созданная как альтернатива Pandas. Она использует колоночную архитектуру и многопоточность, что позволяет работать с большими объёмами данных значительно быстрее и с меньшим потреблением памяти.</p><p>Polars вдохновлена Pandas, но её API оптимизировано для производительности и удобства, а также даёт разработчику возможность писать цепочки ленивых вычислений, которые оптимизируются перед выполнением. Это делает её отличным инструментом для аналитиков, дата-инженеров и дата-сайентистов, которым нужно обрабатывать данные быстро.</p><h3>Какие задачи решает библиотека</h3><p>Polars явно есть, чем гордиться:</p><ul><li>Загрузка, очистка и преобразование больших датасетов;</li><li>Анализ данных с использованием цепочек преобразований;</li><li>Быстрая агрегация и группировка данных;</li><li>Ленивые вычисления: построение пайплайнов преобразования данных, которые выполняются только при вызове collect().</li><li>Обработка данных, которые не помещаются в память, за счёт эффективности и колоночной архитектуры.</li></ul><p>Если Pandas начинает притормаживаться на данных в несколько гигабайт, Polars обычно продолжает работать быстро, позволяя без боли обрабатывать большие CSV.</p><h3>Как пользоваться</h3><p>Установка:</p><p>Давайте загрузим данные и проведем базовые трансформации:</p><p>А вот и пример ленивых вычислений:</p><p>В чем особенность:</p><ul><li>pl.read_csv загружает данные сразу.</li><li>pl.scan_csv создаёт план вычислений для последующей оптимизации.</li><li>Используются выражения (pl.col, .with_columns, .agg), которые композируются без создания промежуточных копий, это ускоряет процесс.</li></ul><h3>Почему это меняет карьеру</h3><p>Polars меняет карьеру, потому что даёт преимущество в скорости и эффективности при работе с данными. Там, где Pandas уже не справляется, полярный медведь приходит на помощь.</p><p>Для <b>дата-инженеров</b> Polars полезен при построении ETL и пайплайнов обработки данных, где важна скорость и предсказуемое потребление ресурсов. Его можно использовать в продакшен-скриптах, для подготовки данных к ML и для автоматизации отчётности.</p><p>Для <b>дата-сайентистов </b>Polars даёт возможность анализировать больше данных за меньшее время, быстро итерировать гипотезы и ускорять исследования. Его API достаточно близок к Pandas, поэтому переход не требует месяцев переучивания.</p><p>Освоение Polars показывает работодателям, что ты не просто знаешь стандартные инструменты, но умеешь выбирать оптимальные решения для реальных задач, повышая эффективность работы команды. В эпоху роста данных это критично для любого Python-разработчика, работающего с аналитикой и машинным обучением.</p><h2>5. FastAPI</h2><p>FastAPI — современный фреймворк для создания API на Python, заточенный под скорость, асинхронность и валидацию данных из коробки. Он построен на Starlette и Pydantic, автоматически создаёт OpenAPI-документацию, поддерживает асинхронное программирование и позволяет писать производительные REST и WebSocket API с минимальным количеством кода.</p><p>Вместо долгой настройки, как у Flask или Django, в FastAPI многое готово изначально: удобная работа с запросами и ответами, декларативная валидация, документация Swagger, асинхронность и высокая производительность без лишних усилий.</p><h3>Какие задачи решает</h3><p>Задач, действительно, много:</p><ul><li>Быстрая разработка REST API для мобильных и веб-приложений;</li><li>Создание бэкенда для ML/DS моделей (деплой моделей в виде API);</li><li>Построение микросервисов с хорошей производительностью;</li><li>Реализация websocket-серверов и асинхронных API;</li><li>Подготовка внутренних инструментов или бэкендов для MVP.</li></ul><p>FastAPI помогает быстро запускать API и уверенно масштабировать его в полевых условиях. Это один из немногих фреймворков Python, который по скорости работы сопоставим с Node.js и Go.</p><h3>Как пользоваться</h3><p>Во-первых, нужно установить FastAPI и Uvicorn (используем ASGI-сервер для запуска):</p><p>Простейший API-пример с эндпоинтом GET /:</p><p>Запускаем сам сервер:</p><p>После запуска API будет доступен по адресу http://127.0.0.1:8000/. Автоматически доступна интерактивная документация Swagger по адресу http://127.0.0.1:8000/docs.</p><p>FastAPI поддерживает валидацию параметров запроса, тел запросов и путей прямо через типы Python. Например, простой эндпоинт с параметром:</p><p>При вызове http://127.0.0.1:8000/items/10?q=test FastAPI автоматически проверит, что item_id — это число, и распарсит q как строку.</p><h3>Почему это меняет карьеру</h3><p>FastAPI — билет в мир бэкенда, где скорость и чистота кода имеют довольно высокое значение. Для <b>Python-разработчика </b>это возможность быстро освоить создание API и микросервисов, не увязнув в громоздкой настройке, как в Django, и при этом получить систему, готовую к продакшену.</p><p>Для <b>ML-специалиста</b> FastAPI становится инструментом для деплоя моделей: можно обернуть пайплайн предсказаний в API, подключить авторизацию или логирование и получить работающий сервис за считанные дни.</p><p>Вообще умение быстро поднимать и поддерживать API — навык, который ценят в бигтехе и стартапах. На разработчиков, которые владеют FastAPI, часто равняются: они умеют превращать идеи бизнеса в работающие сервисы за минимальное время.</p><h2>6. Typer</h2><p>Typer — современная библиотека для создания CLI-приложений на Python с минимальным количеством кода и автоматической генерацией документации. Автор библиотеки — Себастьян Рамирес, создатель FastAPI.</p><p>Главная особенность Typer — использование type hints для автоматического парсинга аргументов командной строки. Вы получаете удобную и читаемую CLI с поддержкой автодополнения и цветного вывода за считанные минуты.</p><h3>Какие задачи решает библиотека</h3><p>Список задач такой:</p><ul><li>Создание CLI-утилит любого уровня сложности.</li><li>Быстрое прототипирование и упаковка Python-скриптов в удобные инструменты для продакшена.</li><li>Генерация подробной справки (--help) и автодополнения команд.</li><li>Облегченная поддержка и масштабирование CLI за счёт структуры и читаемого кода.</li><li>Организация CLI с подкомандами, вложенными аргументами и обработкой ошибок.</li></ul><p>Typer использует аннотацию типов и минимум шаблонного кода.</p><h3>Как пользоваться</h3><p>Установка:</p><p>Пример минимальной CLI:</p><p>Теперь можно запустить из консоли:</p><p>Результат будет такой: Привет, Алиса! Тебе 25 лет.</p><h3>Почему это меняет карьеру</h3><p>Typer меняет карьеру тем, что открывает путь к созданию удобных CLI-инструментов, которые автоматизируют рутину и повышают продуктивность.</p><p>С Typer можно быстро превращать свои Python-скрипты в надежные утилиты, которыми удобно пользоваться и другим разработчикам, и сотрудникам из других отделов. CLI-приложения часто становятся клеем инфраструктуры: они позволяют автоматизировать деплой, миграции БД, сбор данных, интеграцию с внешними API и локальную разработку.</p><p>Если вы <b>Data Scientist или ML-инженер</b>, Typer позволяет оборачивать пайплайны в CLI, которые легко запускать из Jenkins, Airflow или вручную. Если вы <b>DevOps или Backend-инженер</b>, можете создавать CLI для работы с инфраструктурой и сервисами без сложных зависимостей.</p><p>Кроме того, работа с Typer улучшает навык структурирования кода, понимание CLI, использования type hints и разработки инструментов, которые делают работу проще для других. А это, очевидно, ценится в любой команде и повышает востребованность специалиста.</p><h2>7. Rich</h2><p>Rich — библиотека Python для красивого форматирования и интерактивного отображения информации в терминале. С её помощью можно выводить цветные таблицы, маркдаун, прогресс-бары, подсвеченный синтаксис кода, деревья каталогов и логирование в понятной и привлекательной форме.</p><p>Rich создана для того, чтобы «оживить» консоль Python, сделать логи удобными для восприятия, а CLI-инструменты — профессионально выглядящими без лишних усилий. Это библиотека, которая улучшает и UX, и DX.</p><h3>Какие задачи решает</h3><p>Про красоту не забываем! Задачи следующие:</p><ul><li>Цветное и структурированное логирование, понятное при чтении логов в реальном времени.</li><li>Отображение прогресс-баров для долгих операций.</li><li>Вывод таблиц, деревьев каталогов, JSON прямо в терминале.</li><li>Подсветка синтаксиса кода для CLI-инструментов.</li><li>Создание CLI-интерфейсов, которые выглядят профессионально и современно.</li><li>Улучшение читаемости при отладке скриптов.</li></ul><p>С помощью Rich можно быстро сделать понятными даже сложные данные при отладке или демонстрации.</p><h3>Как пользоваться</h3><p>Установка Rich:</p><p>Для примера выведем таблицу с подсветкой в консоли:</p><p>В результате в терминале получится цветная таблица, которая выглядит понятно и презентабельно.</p><h3>Почему это меняет карьеру</h3><p>Rich — это библиотека, которая помогает быстро повысить качество любого CLI-инструмента или дев-опыт в команде. <b>Разработчик</b>, который использует Rich, делает свои инструменты удобными не только для себя, но и для коллег: логирование становится понятным, а отладка скриптов — наглядной.</p><p>Во многих стартапах и продвинутых командах важна скорость обратной связи при тестировании пайплайнов и автоматизаций, и Rich помогает выводить ключевую информацию максимально читаемо.</p><p>Кроме того, Rich позволяет быстро создавать CLI-интерфейсы, которые выглядят как продакшен-продукты, даже если это внутренние инструменты. Руководство будет радоваться и думать о вас как о крутом разрабе.</p><p>Для <b>дата-инженеров и разработчиков DevOps</b> Rich полезна при создании админ-утилит и при мониторинге пайплайнов, для <b>Python-разработчиков</b> — при создании библиотек и фреймворков с CLI.</p><h2>8. LangChain</h2><p>LangChain — фреймворк для создания приложений на базе LLM, например, GPT, Claude, Mistral, Gemini. Он позволяет строить цепочки обработки запросов, интегрировать LLM с данными и инструментами, добавлять память и управление состояниями, а также связывать работу модели с внешними API и базами знаний.</p><p>LangChain предоставляет удобный слой абстракции над вызовами LLM и ускоряет разработку чат-ботов, RAG-приложений, агентов с инструментами, систем анализа документов и других AI-сервисов.</p><h3>Какие задачи решает</h3><p>Список внушительный:</p><ul><li>Интеграция LLM в Python-приложения без необходимости писать тот самый клеевой код вручную.</li><li>Построение цепочек с последовательной обработкой сообщений, включая преобразования и вызовы внешних функций.</li><li>Добавление памяти в чат-боты для сохранения истории общения и контекста.</li><li>Использование агентов для динамического вызова инструментов (веб-поиск, базы данных, API).</li><li>Создание RAG-систем с интеграцией LLM и векторных БД.</li><li>Быстрая сборка прототипов LLM-приложений, которые можно развернуть в продакшен.</li></ul><h3>Как пользоваться</h3><p>Установка:</p><p>Создадим простую цепочку с чатом GPT:</p><p>Благодаря единым абстракциям, можно гибко комбинировать цепочки, память и вызов внешних инструментов, не усложняя код.</p><h3>Почему это меняет карьеру</h3><p>LangChain меняет карьеру, потому что открывает новый пласт Python-разработки в AI и LLM-инженерии, быстро превращая пользователя GPT в создателя полноценных AI-приложений. Вместо того чтобы писать хаотичный клеевой код, вы начинаете системно проектировать цепочки запросов, учитесь строить продуманные промпты и объединять их с инструментами, памятью и внешними API.</p><p>Работа с LangChain погружает в практическую LLM-инженерию: вы начинаете создавать RAG-приложения, которые умеют искать и анализировать данные перед генерацией ответа и строить агентов. Это востребовано в продуктах, где нужно подключать ИИ к базам знаний, автоматизировать задачи и разрабатывать интерактивные системы, которые реально используют модели в продакшене.</p><p>LangChain позволяет быстро собирать и запускать MVP AI-продуктов, что дает конкурентное преимущество при создании стартапов или внутренних сервисов. А ещё учит мыслить структурами и проектировать масштабируемую архитектуру LLM-приложений и видеть, как генеративный ИИ можно превратить в рабочий инструмент.</p><h2>9. SQLAlchemy</h2><p>SQLAlchemy — это мощная ORM и toolkit для работы с базами данных в Python, позволяющая писать SQL-запросы декларативно, создавать модели таблиц и управлять транзакциями в Python-коде без ручного написания SQL.</p><p>Библиотека даёт разработчику два уровня контроля:</p><ul><li>Core: низкоуровневая работа с SQL выражениями и соединениями;</li><li>ORM: высокоуровневая декларативная работа с моделями, классами и связями между таблицами.</li></ul><p>SQLAlchemy поддерживает PostgreSQL, MySQL, SQLite, Oracle и другие СУБД, давая единую абстракцию, без привязки к конкретному движку.</p><h3>Какие задачи решает</h3><p>Пул задач следующий:</p><ul><li>Описание таблиц в виде Python-классов и управление ими через сессии;</li><li>Создание, чтение, обновление и удаление данных;</li><li>Миграция SQL на декларативный стиль без потери гибкости;</li><li>Полный контроль над транзакциями и выполнением запросов;</li><li>Работа с асинхронными приложениями при создании FastAPI/Django-приложений;</li><li>Экранирование параметров, которое снижает вероятность SQL-инъекций и ошибок.</li></ul><h3>Как пользоваться</h3><p>Создадим минимальный пример для SQLite с таблицей пользователей:</p><p>Этот код создаёт базу example.db, таблицу users, добавляет туда одного пользователя и выводит всех пользователей в базе. При необходимости можно использовать SQLAlchemy Core для написания гибких запросов вручную, если нужно работать ближе к SQL.</p><h3>Почему это меняет карьеру</h3><p>SQLAlchemy меняет карьеру <b>Python-разработчика</b> тем, что даёт понимание системной работы с данными, архитектуры приложений и взаимодействия с реальными базами данных. Вы учитесь строить продуманные бэкенды, которые работают с транзакциями, миграциями, связями между таблицами и сложными выборками.</p><p>Знание SQLAlchemy открывает дорогу в мир API, микросервисов и продуктов, где требуется качественное управление данными и гибкая логика работы с БД. Работа с SQL теперь совсем не страшная.</p><h2>10. Seaborn</h2><p>Seaborn — библиотека для визуализации данных на Python, построенная поверх Matplotlib и упрощающая создание информативных и стильных графиков с минимальным количеством кода.</p><p>Она автоматически заботится о красивых стилях, цветах, разметке графиков, легендах и позволяет легко строить распределения, линейные графики, тепловые карты и другие визуализации.</p><p>Библиотека тесно интегрируется с Pandas DataFrame, позволяя использовать колонки данных напрямую для построения графиков, что делает её идеальной для EDA (разведочного анализа данных) и подготовки визуализаций для отчётов и презентаций.</p><h2>Какие задачи решает</h2><p>Визуализация безумно важна, особенно в контексте дата-аналитики. Seaborn отвечает за:</p><ul><li>Быстрое построение информативных графиков для анализа данных и поиска инсайтов;</li><li>Автоматическую обработку ошибок отображения и масштабирования, что экономит время;</li><li>Поддержку сложных визуализаций по типу ящиков с усами или тепловых карт без десятков строк кода;</li><li>Стилизацию графиков без ручных настроек Matplotlib;</li><li>Возможность добавлять статистические элементы (линию регрессии, KDE, распределение);</li><li>Интеграцию с Jupyter Notebook для интерактивного анализа данных.</li></ul><h3>Как пользоваться</h3><p>Допустим, у нас есть датасет с данными о чаевых:</p><p>В три строки мы получаем чистый и читаемый ящик с усами, показывающий, как счет за ужин распределяется по дням недели.</p><p>Для построения более сложных графиков можно использовать диаграмму рассеяния:</p><p>Тут мы добавляем цветовую кодировку по полу, чтобы увидеть зависимости между переменными.</p><h3>Почему это меняет карьеру</h3><p>Seaborn меняет карьеру, потому что даёт навык визуального анализа данных, что критично в современной аналитике и дата-инженерии. Умение быстро строить графики и видеть аномалии, распределения и взаимосвязи между переменными превращает работу с данными из слепого копания в числах в структурный анализ.</p><p>Использование Seaborn в Python-стеке помогает выделиться среди разработчиков, которые ограничиваются Pandas и текстовыми логами, ведь визуализация часто позволяет быстрее заметить закономерности и убедить команду или заказчика в правильности гипотезы.</p><p>Seaborn также учит пониманию данных через визуальные паттерны, что улучшает навыки построения моделей машинного обучения (так понятнее, какие признаки важны), и помогает создавать наглядные отчёты для продуктовых решений, где результат анализа нужно доносить до людей не из айти-индустрии.</p><p><i>А какими библиотеками пользуетесь вы? Делитесь в комментариях!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>PostgreSQL: что нужно знать о счётчике транзакций</title>
      <link>https://tproger.ru/articles/postgresql--chto-nuzhno-znat-o-schyotchike-tranzakcij</link>
      <comments>https://tproger.ru/articles/postgresql--chto-nuzhno-znat-o-schyotchike-tranzakcij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Postgres Professional]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/postgresql--chto-nuzhno-znat-o-schyotchike-tranzakcij</guid>
      <description><![CDATA[<p>Статья погружает в сложности счетчика транзакций PostgreSQL и MVCC в условиях высокой нагрузки. Разберитесь, почему 32-битные xid создают проблемы и как 64-битные идентификаторы транзакций решают их.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/postgresql--chto-nuzhno-znat-o-schyotchike-tranzakcij">PostgreSQL: что нужно знать о счётчике транзакций</a>»</p>]]></description>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 13 Jul 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие годы считалось, что PostgreSQL не подходит для систем с высокой нагрузкой. Но на практике всё чаще встречаются ситуации, когда даже крупные компании выбирают именно эту СУБД. В результате, всё больше внимания уделяется вопросам производительности и масштабируемости PostgreSQL. Один из таких вопросов — счётчик транзакций, о котором мы сегодня и поговорим.</p><h2>Что такое счётчик транзакций и зачем он нужен?</h2><p>PostgreSQL использует механизм многоверсионности (MVCC) благодаря которому читающие транзакции не блокируют пишущие, и наоборот. Каждая транзакция работает со своей версией данных, а доступ регулируется правилами видимости.</p><p>Чтобы понять, как функционирует MVCC, представьте, что у каждого пользователя базы есть свой «моментальный снимок» данных. Когда вы начинаете работать, вы видите состояние данных на этот конкретный момент времени. Изменения, которые делают другие пользователи, не влияют на ваш снимок, пока вы не завершите свою операцию и не начнете новую. Это позволяет нескольким пользователям одновременно читать и изменять данные, не мешая друг другу.</p><p>MVCC в PostgreSQL работает похожим образом:</p><ul><li>Каждая транзакция — это как отдельный пользователь, работающий с документом. Транзакция видит «снимок» базы данных на момент своего начала.</li><li>Когда транзакция изменяет данные, она не перезаписывает старые. Вместо этого создаётся новая версия изменённых строк.</li></ul><p>Каждая версия строки имеет специальные метки:</p><ul><li>xmin — идентификатор транзакции, которая создала версию.</li><li>xmax — идентификатор транзакции, которая удалила (или обновила) версию. Если строка ещё не удалена, xmax пустой.</li></ul><p>Когда транзакция читает данные, PostgreSQL определяет, какую версию строки ей показывать, на основе правил видимости:</p><ul><li>транзакция видит строки, созданные до её начала (xmin меньше её идентификатора), и не помеченные как удалённые (xmax пустой или больше её идентификатора);</li><li>транзакция видит строки, созданные ею самой;</li><li>транзакция не видит строки, созданные транзакциями, которые начались позже неё (xmin больше её идентификатора).</li></ul><p>Пример:</p><p>Допустим, у нас есть таблица users с данными:</p><p>1. Транзакция 1 (xid=100) начинается и читает таблицу  Она видит обе строки, потому что они были созданы до её начала, и xmax у них пустой.</p><p>2. Транзакция 2 (xid=105) начинается и обновляет возраст Alice на 31. PostgreSQL не перезаписывает строку Alice, а создаёт новую версию:</p><p>3. Обратите внимание, что у старой версии Alice xmax теперь равен 105 (идентификатор транзакции 2), а у новой версии xmin равен 105.</p><p>4. Транзакция 1 снова читает таблицу.  Она по-прежнему видит старую версию Alice (возраст 30), потому что новая версия была создана транзакцией, которая началась позже (105 &gt; 100), а старая помечена как удалённая транзакцией с большим номером.</p><p>5. Транзакция 2 фиксируется.</p><p>6. Транзакция 3 (xid=110) начинается и читает таблицу  Теперь она видит новую версию Alice (возраст 31), потому что транзакция 2, которая её создала, уже зафиксирована, и её xid меньше чем у транзакции 3.</p><p>Важно: номера транзакций (xid) не стоит сравнивать как обычные числа («больше» или «меньше»). Корректнее говорить «старше» или «младше». Дело в том, что номера транзакций сравниваются по модулю 232, образуя кольцо. Транзакции, отстающие от текущей на 231 назад, считаются «старше» («в прошлом»), а на 231 вперёд — «младше» («в будущем»).</p><p>Представьте себе круг:</p><ul><li>текущая транзакция — это точка на круге;</li><li>«прошлые» транзакции — это точки слева от текущей, если двигаться против часовой стрелки;</li><li>«будущие» транзакции — точки справа.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/115310/2025-07-04/f547fb58-a54c-404c-8852-6d91fd4a8aed.png" alt="" /></figure><p>Каждая запись в базе данных имеет служебные поля xmin и xmax. В xmin записывается номер транзакции, создавшей запись, а в xmax — номер транзакции, удалившей её. Учетом этих номеров и занимается счетчик транзакций.</p><h2>Как развивался счётчик транзакций</h2><p>До версии PostgreSQL 8.2 при достижении максимального значения счётчика транзакций (примерно 4 миллиарда) PostgreSQL просто «падал». Чтобы продолжить работу, нужно было сделать дамп базы данных и создать её заново.</p><p>В версии 8.2 появился механизм циклического перезапуска счётчика. Для этого в фоновом режиме запускается процесс очистки (VACUUM).</p><p>Как это работает:</p><ol><li><b>«Заморозка» старых транзакций</b>: Когда на VACUUM передаётся значение, что счётчик транзакций скоро переполнится, он начинает помечать старые транзакции специальным идентификатором FrozenTransactionId. По сути, VACUUM говорит: «Эти транзакции настолько старые, что мы считаем их замороженными. Мы всегда будем считать их старше любых других транзакций.»</li><li><b>Счётчик эпох</b>: Чтобы PostgreSQL знал, сколько раз счётчик уже «перезапускался», используется счётчик эпох. Каждый раз, когда счётчик транзакций доходит до конца и начинает заново, счётчик эпох увеличивается на единицу.</li><li><b>Циклический перезапуск:</b> После того как VACUUM «заморозит» старые транзакции, счётчик транзакций может безопасно начать считать заново с трёх. PostgreSQL теперь знает, что все транзакции с идентификатором FrozenTransactionId старше любых других транзакций, даже если их номера меньше.</li></ol><p>Это решило проблему «падения», но возникла новая: если VACUUM не успевает отработать вовремя, сервер может остановиться и потребовать запуска в монопольном режиме для очистки, что ведёт к простою.</p><h3>В чём же проблема?</h3><p>Сам по себе механизм счётчика транзакций работает хорошо. Проблема в том, что он создавался, когда 32-битное число (более 4 миллиардов) казалось огромным. Сейчас же, в системах с высокой нагрузкой (ретейл, крупные заводы, госучреждения), счётчик может оборачиваться раз в сутки.</p><p>Дополнительные сложности:</p><p>Среди служебных данных записи есть поле флагов. Для старых записей нужно периодически запускать VACUUM FREEZE, который помечает их как «замороженные» (FrozenTransactionId).</p><p>Для стабильной работы нужно, чтобы:</p><ul><li>разница между номером текущей транзакции и номером самой старой записи не превышала 2^32;</li><li>VACUUM FREEZE выполнялся до нарушения первого условия.</li></ul><p>В реальном мире это сложно:</p><ul><li>«долгие» транзакции мешают VACUUM FREEZE;</li><li>сложно определить, когда транзакция «долгая», а когда «зависшая»;</li><li>непонятно, когда бить тревогу из-за исчерпания идентификаторов;</li><li>администратор БД несёт ответственность за потери бизнеса из-за своих действий.</li></ul><p>Если вы можете остановить кластер БД, запустить его в монопольном режиме и подождать несколько часов, эта проблема вас не касается. Но в системах с высокими требованиями к доступности простой — недопустим.</p><p>Отдельно стоит упомянуть базы данных, в которые данные только добавляются (insert-only). В них VACUUM всё равно запускается для «заморозки» старых записей.</p><h2>Решение: 64-битные идентификаторы транзакций</h2><p>Казалось бы, простое решение — увеличить размер счётчика до 64 бит. Но это сложно:</p><ul><li>весь код PostgreSQL ожидает «видеть» 32-битные числа;</li><li>в каждом кортеже (записи) хранятся xmin и xmax. Увеличение их размера с 8 до 16 байт значительно увеличит размер базы.</li></ul><p>Мы в Postgres Professional разработали реализацию 64-битных идентификаторов транзакций (xid), увеличив их количество до 18 446 744 073 709 551 615 (264). Это решение используется во многих форках PostgreSQL. Проблема переполнения счётчика становится гипотетической (при высокой нагрузке 64-битный счётчик исчерпается примерно через 400 лет).</p><p>Патч с реализацией был предложен сообществу PostgreSQL, но пока не принят из-за его сложности. Однако многие разработчики форков PostgreSQL уже заявили о поддержке 64-битных xid в своих дистрибутивах.</p><p>Цель Postgres Professional  — не продвигать свой вариант как единственно верный, а привлечь внимание к проблеме и стимулировать сообщество к поиску оптимального решения. Первая часть удалась: идея получила внимание. Но внедрение таких изменений — долгий процесс. Рост нагрузок на СУБД во всём мире показывает важность этой проблемы.</p><p>Мы надеемся, что PostgreSQL сможет адаптироваться к растущим нагрузкам и укрепить свои позиции на рынке.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что по экологии? Сколько углеродного следа оставляет ваш код</title>
      <link>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</link>
      <comments>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</guid>
      <description><![CDATA[<p>Узнайте, сколько CO₂ генерирует ваш код в 2025 году и как снизить углеродный след в IT. Практические советы по оптимизации архитектуры, выбору «зеленых» технологий и реальные кейсы компаний. Экологичное программирование — новый тренд для разработчиков и бизнеса.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod">Что по экологии? Сколько углеродного следа оставляет ваш код</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году IT-индустрия потребляет больше энергии, чем крупная европейская страна  в 2010. <a href="https://www.iea.org/">По данным IEA</a> (International Energy Agency), дата-центры и телекоммуникационные сети уже отвечают за 3,7% глобальных выбросов CO₂ — это больше, чем производит авиация.</p><p>Казалось бы, код — это просто текст. Но каждый запрос к API, каждая компиляция и даже холостой цикл требуют энергии. Например, обучение GPT-4 в 2023 году «съело» столько же электричества, сколько 120 домохозяйств за год. А теперь представьте, что таких моделей тысячи, а серверов — миллионы.</p><p>Почему это важно? Во-первых, <a href="https://digital-strategy.ec.europa.eu/">регуляторы ужесточают требования</a>: в ЕС с 2025 года IT-компании обязаны раскрывать углеродный след своих продуктов. Во-вторых, инвесторы все чаще смотрят на ESG-рейтинги — показатели экологического и ответственного производства. В-третьих, оптимизация кода снижает затраты на инфраструктуру.</p><p>Эта статья — не манифест экоактивистов, а руководство для разработчиков, архитекторов и технических директоров компаний (СТО), которые стремятся более эффективные и экологичные проекты.</p><h2>Углеродный след кода: что скрывается за строчками</h2><p>Программное обеспечение — не виртуальный конструктор. Каждая операция требует электричества, а серверы, на которых работает код, часто питаются от невозобновимых источников энергии — например, угля и газа.</p><h3>Откуда берутся выбросы</h3><p>Когда мы говорим об углеродном следе ПО, важно понимать: код не существует в вакууме. Каждая строка, каждый запрос и каждая операция требуют физических ресурсов — электричества, серверного оборудования, систем охлаждения. В 2025 году эта цепочка стала еще сложнее из-за взрывного роста облачных вычислений и ИИ.</p><p>Прямые выбросы — это энергия, которую потребляют серверы при выполнении вашего кода. Например, один средний веб-сервер на AWS EC2 (тип t3.large) в год вырабатывает около 400 кг CO₂ — как небольшой автомобиль, проехавший 2000 км. При этом нагрузка на серверы постоянно растет: с 2020 по 2025 год энергопотребление дата-центров увеличилось на 35%.</p><p>Косвенные выбросы часто упускают из виду. Производство серверного оборудования — процесс крайне энергоемкий. Для создания одной только микросхемы памяти DDR5 требуется около 200 кВт⋅ч энергии — столько же, сколько средний холодильник потребляет за год. А после выхода оборудования из строя лишь 20% компонентов перерабатывается должным образом (<a href="https://globalewaste.org/">Global E-Waste Monitor 2024</a>).</p><p>Системы охлаждения — еще один скрытый источник выбросов. Современные дата-центры работают 24/7, и даже с использованием жидкостного охлаждения на поддержание температуры уходит до 40% всей потребляемой энергии. В жарких странах, ОАЭ или Сингапуре, этот показатель может достигать 50%.</p><p>Яркий пример — крупные языковые модели. Если в 2023 году обучение GPT-4 потребовало ~10 ГВт⋅ч (эквивалент годового потребления 120 домохозяйств), то к 2025 году из-за увеличения размеров моделей этот показатель вырос в 1,5 раза. Один запрос к такому ИИ теперь генерирует около 2 г CO₂ — как если бы вы проехали 10 метров на бензиновом автомобиле.</p><p>Но проблема не только в ИИ. Обычное веб-приложение с посещаемостью 100 000 пользователей в месяц может производить до 1 тонны CO₂ в год — и это без учета мобильных клиентов и API. При этом <a href="https://www.webpagetest.org/eco/">30% этой нагрузки приходится на неоптимизированный фронтенд</a>: тяжелые изображения, избыточные JavaScript-библиотеки и частые запросы к серверу.</p><p>Ситуацию усугубляет географический фактор. Дата-центр в Норвегии, где 98% энергии поступает от ГЭС, будет «чище», чем такой же центр в Польше, где угольные электростанции дают 70% энергии. <a href="https://app.electricitymaps.com/">Разница</a> в углеродном следе может быть 20-кратной для идентичных операций.</p><p>При этом стандарты измерения все еще остаются разрозненными. PUE (Power Usage Effectiveness), который используют Google и Microsoft, учитывает только эффективность инфраструктуры, но не источник энергии. Новый стандарт CUE (Carbon Usage Effectiveness), разработанный в 2024 году, уже включает эти данные, но его поддерживают менее 30% провайдеров.</p><h2>Где код тратит энергию впустую</h2><p>Некоторые части систем особенно вредны для экологии. Главные «пожиратели» ресурсов:</p><ul><li>Неоптимизированные алгоритмы. Сортировка пузырьком (O(n²)) на большом массиве данных может потреблять в 100 раз больше энергии, чем быстрая сортировка (O(n log n)).</li><li>Микросервисный хаос. Архитектура из сотен микросервисов увеличивает нагрузку на сеть. Каждый вызов API между сервисами — это дополнительные 0,5–1 Вт⋅ч.</li><li>Облачные провайдеры. Не все одинаково зеленые. AWS и Google используют 60–70% ВИЭ (возобновляемых источников энергии), но в Азии и Африке их дата-центры часто работают на угле.</li></ul><h3>Как измерить углеродный след</h3><p>В 2025 году появились инструменты, которые помогают оценить влияние кода:</p><ul><li>Cloud Carbon Footprint — анализирует выбросы AWS, GCP и Azure.</li><li>Scaphandre — мониторит энергопотребление серверов в реальном времени.</li><li>Greenframe.io — симулирует нагрузку на веб-приложение и считает CO₂.</li></ul><p>Климатические инициативы в IT больше не просто красивые слова в корпоративных отчетах. В 2025 году за неэффективный код можно получить не только порицание сообщества, но и вполне реальный штраф.</p><p>Европейский союз уже ввел санкции против пяти крупных SaaS-компаний за превышение углеродных квот, а Amazon Web Services выплатила 2,7 млн евро штрафа за неоптимизированные алгоритмы в своих сервисах.</p><h2>Как изменились подходы к разработке</h2><p>Эти тренды нацелены на долгосрочное действие и в перспективе должны полностью изменить текущую концепцию в разработке.</p><h3>Экологичный DevOps — новая реальность</h3><p>Современные системы автоматического масштабирования стали умнее. Kubernetes Horizontal Pod Autoscaler теперь учитывает не только нагрузку на CPU, но и текущий углеродный след дата-центра. Если в регионе пиковое потребление энергии и работают угольные электростанции, система сознательно ограничивает масштабирование.</p><p><a href="https://cloud.google.com/blog">Технология, разработанная Google</a> в партнерстве с WattTime, уже снижает выбросы CO₂ на 27-33% по сравнению с традиционным подходом.</p><p>CI/CD-цепочки тоже стали «зеленее». Вместо запуска полного набора тестов при каждом коммите, современные системы определяют, какие именно модули затронуты изменениями.</p><p><a href="https://carbonrunner.io/features/github-action-runners">GitHub Actions представил Carbon-Aware Runner</a>, который планирует выполнение задач на время максимальной доступности возобновляемой энергии в регионе. По данным Microsoft, это сокращает углеродный след тестирования на 40%.</p><h3>Языки программирования: война за эффективность</h3><p>Rust продолжает набирать популярность не только из-за безопасности, но и благодаря энергоэффективности. Тесты Benchmarks Game показывают, что один и тот же алгоритм обработки данных на Rust потребляет на 38-42% меньше энергии, чем на Python. В 2025 году Rust вошел в топ-5 языков для enterprise-решений, вытеснив Java в 17% крупных проектов.</p><p>Но настоящим открытием стал <a href="https://ziglang.org/documentation/master/">Zig </a>— язык, который сочетает производительность C с простотой синтаксиса. Его компилятор потребляет в 3 раза меньше ресурсов, чем LLVM-бэкенд Rust, что делает его идеальным выбором для встраиваемых систем.</p><h3>ИИ на грани: когда меньше значит лучше</h3><p>TinyML-революция набирает обороты. Современные нейросети для микроконтроллеров занимают менее 256 КБ памяти, но справляются с задачами, которые раньше требовали облачных вычислений.</p><p>Например, новые датчики Nest анализируют звук прямо на устройстве, определяя не только дым, но и тип возгорания. Это экономит до 150 МБ трафика в месяц на одно устройство.</p><p>На фронте больших языковых моделей тоже произошли изменения. Meta* выпустила LLaMA-3 Nano — модель с 500 млн параметров, которая работает на смартфоне и по качеству ответов не уступает GPT-3.5. Ее углеродный след при обучении в 1200 раз меньше, чем у GPT-4.</p><p><i>(*Компания запрещена в РФ)</i></p><h3>Новые правила игры: регуляторы и бизнес</h3><p>С января 2025 года в Евросоюзе действует Углеродный налог на цифровые продукты (Digital Carbon Border Tax). Теперь любое ПО, продающееся в ЕС, должно иметь сертификат углеродной эффективности.</p><p>Для крупных enterprise-решений максимально допустимый углеродный след составляет 500 г CO₂ на 1000 пользователей в месяц. Нарушители платят 7% от оборота продукта в регионе.</p><p>Венчурные фонды радикально изменили подход к инвестициям. <a href="https://www.pwc.com/gx/en/services/sustainability/publications.html">Согласно отчету PwC</a>, 43% фондов требуют ESG-отчетность перед заключением сделки, а 28% вообще не рассматривают стартапы без «зеленой» стратегии. В Кремниевой долине появился первый акселератор Carbon Neutral Startups, который дает бонусы в $50 000 проектам с нулевым углеродным следом.</p><p>Корпорации тоже не остались в стороне. <a href="https://www.microsoft.com/sustainability">Microsoft ввела внутренний углеродный налог</a> — теперь каждое подразделение платит $100 за каждую тонну CO₂, связанную с его продуктами. Эти деньги идут на развитие возобновляемой энергетики.</p><p>Но самое интересное происходит на рынке труда. Разработчики с навыками «зеленого» программирования получают на 15-20% больше предложений. Появилась появилась новая категория навыков — «Устойчивая разработка ПО», а спрос на таких специалистов вырос на 300% за последний год.</p><h2>Как писать «зеленый» код</h2><p>Каждая лишняя операция в коде — это не только миллисекунды процессорного времени, но и реальные граммы CO₂. В 2025 году энергоэффективность кода перестала быть теоретической концепцией и превратилась в конкретный навык, который влияет на карьеру разработчика. Рассмотрим три ключевых направления оптимизации.</p><h3>Оптимизация запросов к базе данных</h3><p>Типичный пример — использование SELECT * вместо явного перечисления полей. Когда приложение запрашивает все поля таблицы users (включая редко используемые avatar_blob или metadata_json), сервер БД тратит дополнительные ресурсы на чтение и передачу этих данных. В крупных системах с миллионами запросов в день это приводит к значительному перерасходу вычислительных ресурсов.</p><p>Современные ORM типа Prisma и Drizzle добавили автоматическую оптимизацию запросов. Теперь при использовании select() они анализируют, какие поля действительно нужны на клиенте, и генерируют оптимальный SQL. В тестах это снижает нагрузку на БД на 12-18%.</p><h3>Работа с циклами и алгоритмами</h3><p>Классическая ошибка — продолжать перебор массива после нахождения нужного элемента. В 2025 году статический анализатор кода в WebStorm и VS Code автоматически предупреждает о таких ситуациях. Особенно критично это для мобильных приложений: лишние итерации цикла на слабых устройствах увеличивают энергопотребление на 5-7%.</p><p>Новые версии JavaScript и TypeScript ввели оптимизированные методы для массивов. Например, array.findLast() работает в 1,5 раза эффективнее ручной реализации с циклом. Для сложных алгоритмов появились «зеленые» библиотеки вроде EcoCollections для Java, которые минимизируют энергопотребление при работе с структурами данных.</p><h3>Сжатие и передача данных</h3><p>Формат Brotli стал новым стандартом для API: он обеспечивает лучшее сжатие, чем gzip, особенно для JSON-ответов. Компания Cloudflare провела эксперимент: после перехода на новую версию Brotli нагрузка на их серверы снизилась на 18%, что эквивалентно годовому потреблению энергии 2000 домохозяйств.</p><p>Но сжатие — не панацея. Грамотное проектирование API может дать больший эффект. GraphQL-подход, где клиент запрашивает только нужные данные, в среднем почти вдвое уменьшает объем передаваемой информации по сравнению с REST. А технология Server-Sent Events (SSE) для реального времени потребляет в 3 раза меньше ресурсов, чем WebSockets, когда не нужна двусторонняя связь.</p><p>Современные фреймворки начали учитывать энергоэффективность. Next.js 15 <a href="https://nextjs.org/blog">представил «зеленый» режим компиляции</a>, который оптимизирует сборку под минимальное энергопотребление. В тестах это дало 8% экономии на процессоре при работе приложения. А Deno 2.0 автоматически кэширует зависимости на уровне ОС, сокращая число повторных загрузок.</p><p>Эти изменения кажутся мелкими, но в масштабах индустрии они имеют огромное значение. Если бы все репозитории на платформе применили базовые оптимизации, глобальное энергопотребление дата-центров сократилось бы на несколько процентов. Для отрасли, которая потребляет 700 ТВт⋅ч в год, это десятки миллионов долларов и тысячи тонн CO₂.</p><h2>Выбор технологий</h2><p>В 2025 году выбор стека технологий влияет не только на производительность, но и на экологичность проекта. Разберем ключевые аспекты, которые помогут снизить углеродный след вашего приложения.</p><h3>Языки программирования: баланс между скоростью и эффективностью</h3><p>Rust и Go продолжают доминировать в высоконагруженных системах. Тесты показывают, что веб-сервер на Rust потребляет на 35-40% меньше энергии при одинаковой нагрузке по сравнению с Node.js. Особенно заметна разница в облачных средах, где каждый ватт на счету.</p><p>C++ остается выбором для задач, где важна предсказуемая производительность. Новый стандарт C++26 добавил энергоэффективные режимы работы алгоритмов STL, что особенно важно для встраиваемых систем.</p><p>Python по-прежнему хорош для прототипирования, но в продакшене его лучше заменять на компилируемые языки. PyPy 8.0 сократил энергопотребление интерпретатора на 25%, но даже с этими улучшениями Python проигрывает Rust в 3-4 раза по эффективности.</p><h3>Базы данных: от малого к большему</h3><p>SQLite — идеальный выбор для небольших проектов и edge-устройств. Его новая версия 3.45 добавила режим «энергосбережения», который снижает потребление на 15% при фоновых операциях.</p><p><a href="https://www.postgresql.org/docs/17/release-17.html">PostgreSQL 17</a> сделал большой шаг в энергоэффективности. Функция автоматического партиционирования теперь учитывает не только производительность, но и энергопотребление. В тестах это дало 20% экономии на крупных аналитических запросах.</p><p>Для высоконагруженных систем появилась альтернатива — ScyllaDB 5.0. Эта Cassandra-совместимая СУБД потребляет втрое раза меньше энергии при аналогичной нагрузке, благодаря полному переписыванию на Rust.</p><h2>Кейсы: что работает, а что нет</h2><p>Российские компании тоже внедряют экологичные IT-решения. МТС разработала мобильное приложение, где пользователи получают бонусы за раздельный сбор мусора — их можно обменять на подписки или скидки. За первый год проект привлек 500 тысяч участников и сократил количество непереработанных отходов в регионах присутствия.</p><p>НИУ ВШЭ, совместно с Росприроднадзором, автоматизировал сбор экологической отчетности с помощью ИИ. Нейросеть анализирует данные с датчиков и заполняет формы вместо специалистов. Это сократило время обработки с 100 до 10 часов в месяц и уменьшило количество ошибок.</p><p>Некоторые архитектурные решения приносят больше вреда, чем пользы. Один московский стартап без необходимости разбил монолитную систему на 50 микросервисов — в результате затраты на инфраструктуру выросли в 3 раза, а углеродный след увеличился на 180%.</p><p>Проблемы возникают и на уровне зависимостей. История с left-pad повторилась в 2024 году, когда один npm-пакет потянул за собой 80 МБ ненужных библиотек. Теперь крупные компании проверяют каждую зависимость через Bundlephobia и устанавливают лимит на размер node_modules.</p><h2>Что нас ждет</h2><p>В 2025 году отрасль стоит на пороге радикальных изменений, которые перевернут наши представления о «зеленом» программировании.</p><p>Супероблака — следующий этап эволюции распределенных вычислений. В отличие от традиционных облачных провайдеров, эти системы автоматически переносят нагрузку между дата-центрами в зависимости от доступности возобновляемой энергии.</p><p><a href="https://cloud.google.com/sustainability">Google уже тестирует эту технологию</a> в Северной Европе: когда в Норвегии дует сильный ветер и ветряные электростанции работают на пике, система переносит вычисления именно туда. По предварительным оценкам, это снижает углеродный след на 18-22% по сравнению со статичным распределением.</p><p>Но настоящий прорыв ожидается в сегменте квантовых вычислений. Хотя современные квантовые компьютеры потребляют колоссальное количество энергии (система IBM Quantum System One требует около 25 кВт⋅ч для работы одного кубита), их потенциал для оптимизации классических алгоритмов огромен.</p><p>В 2024 году исследователи из ЦЕРНа <a href="https://www.nature.com/articles/s41534-024-00859-0">предложили квантовый алгоритм</a>, который сокращает время сложных расчетов в 1000 раз при той же точности. Когда такие решения станут массовыми (прогноз — 2028-2030 годы), энергопотребление дата-центров может сократиться на 30-40%.</p><p>Государственное регулирование становится строже. В 2025 году в силу вступает EU Digital Product Passport — требование указывать углеродный след для всего ПО, продающегося в Европе.</p><p>Компании, которые не смогут предоставить эти данные, столкнутся с дополнительными налогами до 7% от оборота. В ответ на это крупнейшие IT-корпорации создали Carbon Neutral Software Alliance — консорциум по разработке единых стандартов измерения.</p><p>Не отстает и аппаратная часть. Производители чипов переходят на новые техпроцессы: TSMC анонсировала 2-нм процесс, который на 30% энергоэффективнее предыдущего поколения. А стартапы вроде британской ZeroPoint Technologies разрабатывают память с нулевым энергопотреблением в режиме ожидания — технология может сократить энергопотребление серверов на 15%.</p><p><b>Но главный тренд </b>— децентрализация вычислений. Edge-устройства (от смартфонов до промышленных датчиков) становятся мощнее и берут на себя часть нагрузки. Например, новый алгоритм Apple для обработки фото на iPhone 16 выполняет 90% операций локально, а не в облаке. По оценкам компании, это экономит сотни тысяч тонн CO₂ в год только для пользователей в США.</p><p>Однако остаются и <b>проблемы</b>. Бум генеративного ИИ привел к взрывному росту энергопотребления: одна тренировка модели Gemini Ultra потребляет столько же энергии, сколько небольшой город за месяц. OpenAI и Anthropic уже работают над более эффективными архитектурами, но прорыва пока не случилось.</p><p>В ближайшие 3-5 лет нас ждет:</p><ul><li>массовый переход на углеродно-нейтральные дата-центры — к 2027 году их доля превысит 60%;</li><li>внедрение AI-оптимизаторов кода, которые автоматически сокращают энергопотребление;</li><li>появление «зеленых» рейтингов для приложений — аналог энергоэффективности для бытовой техники.</li></ul><p>Компании, внедрившие принципы устойчивого развития в IT, уже в 2025 году получают на больше инвестиций и быстрее проходят аудит регуляторов. Экологичность перестала быть затратой — теперь это конкурентное преимущество.</p><p>Технологии будущего уже здесь. Вопрос в том, насколько быстро мы сможем их адаптировать. Как сказал Дженсен Хуанг из NVIDIA на последней конференции GTC:</p><blockquote>«Следующее десятилетие определит, станет ли IT частью климатического решения или останется проблемой. Выбор за нами».</blockquote><h2>Итоги</h2><p>Экологичность в IT — не благотворительность и не актуальная повестка, а реальная экономия. Плюс работа на перспективу. Оптимизация кода снижает счета за облака и повышает производительность.</p><p>С чего начать? Начните с малого:</p><ol><li>Запустите аудит через Cloud Carbon Footprint.</li><li>Уберите «мусор» из зависимостей.</li><li>Выберите хостинг с ВИЭ.</li></ol><p>Как говорил Дональд Кнут, автор книги «Искусство программирования»:</p><blockquote>«Преждевременная оптимизация — корень всех зол. Но и запоздалая — тоже».</blockquote><p>В 2025 году это актуально как никогда.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Зачем нам свои сети, если ими никто не пользуется? Насколько все плохо с российскими SDN</title>
      <link>https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn</link>
      <comments>https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn</guid>
      <description><![CDATA[<p>Российские сети SDN — что с ними не так и почему инфраструктура так медленно развивается. Экспертный обзор ситуации на рынке</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zachem-nam-svoi-seti--esli-imi-nikto-ne-polzuetsya--naskolko-vse-ploho-s-rossijskimi-sdn">Зачем нам свои сети, если ими никто не пользуется? Насколько все плохо с российскими SDN</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[VMware]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 20 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году программно-определяемые сети (SDN) — это не тренд, а жизненная необходимость. Мировой рынок SDN растет на 13–22% в год, а в России его объем уже превысил 15 млрд рублей. Но вот в чем подвох: пока мир переходит на «сети из кода», российские компании до сих пор настраивают VLAN вручную или цепляются за устаревшие решения VMware, американского разработчика ПО для виртуализации.</p><p>Почему так? В 2024–2025 годах США ужесточили ограничения: VMware NSX и Cisco ACI официально заблокированы. Казалось бы, идеальный момент для отечественных решений вроде Basis SDN от «Базиса». Но сегодня их доля на рынке — не выше 3%.</p><p>Выясним, почему российские SDN, несмотря на импортозамещение, пока так и не стали массовыми, и что мешает бизнесу переходить на отечественные продукты — от дефицита специалистов до проблем с legacy-инфраструктурой. Только факты, кейсы внедрений и прогнозы на 2026–2030 годы с опорой на отчеты Ростелекома, аналитику <a href="https://www.6wresearch.com/industry-report/russia-software-defined-anything-market">6Wresearch</a> и документы <a href="https://www.archivemarketresearch.com/reports/sdn-system-43385">OFAC</a>.</p><h2>SDN в России-2025: почему мир перешел на «сети из кода», а мы настраиваем маршрутизаторы вручную</h2><p>SDN (Software-defined networking) — это когда сетью управляют не железки, а код. Представьте, что вместо того, чтобы вручную прописывать правила на каждом коммутаторе, вы просто пишете скрипт, и сеть мгновенно перестраивается под ваши задачи. Контроллер SDN решает, куда направить трафик, как распределить нагрузку и какие политики безопасности применить. Все это — без манипуляций с командной строкой и конфигурационных файлов.</p><h3>Мировой контекст: SDN как новая норма</h3><p>Глобальный рынок SDN к 2025 году оценивается в $12+ млрд, а темпы роста превышают 18% в год. Причины просты:</p><ul><li>Облака и гибридные инфраструктуры требуют гибкости, которую традиционные сети дать не могут.</li><li>Киберугрозы теперь атакуют не отдельные устройства, а всю сеть. SDN позволяет изолировать зараженные сегменты за секунды — например, отрезать атакованный филиал до того, как он заразит головной офис.</li><li>5G и IoT без SDN просто не работают. Виртуальные срезы сети (network slicing) — единственный способ гарантировать приоритет критичному трафику, будь то телемедицина или беспилотники.</li></ul><p>Но главный драйвер — экономика. <a href="https://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%93%D0%BB%D0%B0%D0%B2%D0%BD%D1%8B%D0%B5_%D1%82%D0%B5%D0%BD%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B8_%D0%BD%D0%B0_%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BC_%D1%80%D1%8B%D0%BD%D0%BA%D0%B5_%D0%B4%D0%B0%D1%82%D0%B0-%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%BE%D0%B2">Компании устали переплачивать за «умное» железо</a> Cisco и Juniper, когда всю логику можно перенести в софт. К 2025 году 70% корпоративных сетей в ЕС и США управляются через SDN-контроллеры — просто потому, что это дешевле и быстрее.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-12/45a4e2ba-6d0d-4766-9673-120dca5836f6.png" alt="" /></figure><h3>Россия: технологический суверенитет vs. реальность</h3><p>В 2024–2025 годах санкции добили то, что не успели в 2022-м:</p><ul><li>VMware NSX официально заблокирован для российских компаний.</li><li>Cisco ACI и Huawei CloudFabric доступны только через «серые» схемы, но их поддержка практически не работает.</li><li>Оборудование попало под прямые ограничения: даже нейтральные производители вроде Arista отказываются поставлять коммутаторы из-за риска вторичных санкций.</li></ul><p>Казалось бы, идеальный момент для российских SDN-решений. Но доля отечественных продуктов на рынке — единицы. Причины такой ситуации вполне объективны:</p><ul><li>«Железная» зависимость. Большинство российских SDN работают только с оборудованием конкретных вендоров — YADRO, Aquarius, «Бифорком». Если у компании инфраструктура на старых Cisco или Huawei, миграция потребует полной замены «железа».</li><li>Функциональные пробелы. Тот же Basis SDN декларирует 80% функционала VMware NSX, но ключевые фичи вроде автоматического восстановления после сбоев (self-healing) или глубокой аналитики трафика через ИИ пока в разработке.</li><li>Дефицит экспертов. В России менее 1000 сертифицированных специалистов по SDN — против 25 000 в США и ЕС. Обучение нового инженера с нуля занимает 1.5–2 года — бизнес не готов ждать.</li></ul><h3>Спрос есть, но внедрять некому</h3><p>Опросы специализированных изданий показали, что более трети крупных отечественных компаний хотели бы перейти на отечественные SDN, но многие из них не верят в стабильность российских решений, не готовы инвестировать в замену инфраструктуры, не могут найти подрядчика с нужной экспертизой.</p><p>При этом Basis SDN — единственное решение, которое хоть как-то закрывает дыру. Его пилоты запустили Ростелеком, СберТех и несколько госструктур. Но даже они признают: продукту не хватает открытости API и поддержки мультивендорных сред.</p><p>Вывод: мир уже живет в эпоху «сетей как кода», а Россия только учится настраивать контроллеры. Без массовых инвестиций в R&amp;D (Research and Development, научные исследования и разработки) и образование разрыв будет расти. К 2030 году мы рискуем остаться с SDN «на бумаге», пока глобальные игроки перейдут на следующую ступень — IBN (intent-based networking) — сеть, основанную на намерениях с полной автономией ИИ.</p><h2>Свои SDN: роскошь или необходимость?</h2><p>Блокировки лишили российские компании доступа к обновлениям и техподдержке. Санкции против YADRO и других производителей сетевого оборудования усугубили проблему: даже если «железо» физически есть, его нельзя масштабировать без лицензий. Сложность в том, что технологический суверенитет нельзя купить — его нужно строить.</p><h3>Технологический суверенитет — не лозунг, а вынужденная мера</h3><p>В 2025 году термин «импортозамещение» уже не вызывает иронии. Сегодня российский бизнес столкнулся с простым фактом: зарубежные SDN-решения либо недоступны, либо работают с перебоями.</p><p>Компании, которые в 2024-м надеялись на «серые» поставки VMware NSX, теперь тратят на 40% больше на поддержку устаревших версий.</p><p>Basis SDN — пока единственная рабочая альтернатива. Разработка «Базиса» и Angie Software изначально создавалась под санкционные реалии:</p><ul><li>полная независимость от зарубежного ПО — даже гипервизор работает на KVM;</li><li>поддержка российского «железа» (YADRO, Aquarius) без необходимости доработок;</li><li>цена ниже VMware NSX до его ухода с рынка.</li></ul><p>Но главное — это не просто клон VMware, а адаптация под российские условия. Например, здесь изначально заложена поддержка требований ФСТЭК к шифрованию трафика, что для госсектора критично.</p><h2>Преимущества, которые оценит даже скептик</h2><p>Рассмотрим подробно плюсы перехода на отечественные программно-определяемые сети.</p><h3>Централизованное управление: оптимизация времени и расходов</h3><p>Вместо настройки каждого коммутатора вручную вы управляете всей сетью через одну веб-панель. Нужно изменить политику безопасности для филиала? Все делается элементарно: не надо ехать на место или объяснять по телефону — правила применяются мгновенно.</p><p>Так работает Basis SDN:</p><ul><li>единый контроллер заменяет десятки разрозненных консолей Cisco Prime или Huawei eSight;</li><li>автоматизация рутинных задач — например, выделение VLAN под новый отдел занимает минуты вместо часов;</li><li>мониторинг в реальном времени — аномалии трафика (DDoS, утечки) система обнаруживает сама и предлагает решения.</li></ul><h3>Микросегментация: безопасность без головной боли</h3><p>В 2025 году кибератаки стали точечными: злоумышленники не ломают всю сеть, а ищут слабые звенья — бухгалтерию, базы данных, IoT-устройства.</p><p>SDN позволяет изолировать критичные сегменты без физического разделения:</p><ul><li>финансовые системы можно отрезать от общего трафика, даже если они используют те же коммутаторы;</li><li>доступ к данным регулируется не только логинами, но и контекстными правилами (например, запрет копирования файлов после 18:00);</li><li>в случае атаки зараженный сегмент автоматически блокируется — без остановки всей сети.</li></ul><h2>Совместимость: работает здесь и сейчас</h2><p>Типичная претензия к российскому ПО — «а вот у Cisco…». Но Basis SDN уже сегодня поддерживает:</p><ul><li>Astra Linux и «Альт» — без костылей в виде дополнительных драйверов;</li><li>оборудование YADRO, БСТ, Aquarius — с гарантией обновлений;</li><li>облачные платформы на базе KVM и отечественных гипервизоров.</li></ul><p>При этом система не требует полного отказа от legacy-инфраструктуры. Например, можно оставить старые коммутаторы Cisco, но управлять ими через SDN-контроллер — это вдвое дешевле, чем менять все железо.</p><h2>Рыночные перспективы: куда движется отрасль</h2><p>Объем рынка SDN в России пока относительно невелик, но к 2031-му прогнозируют его рост до 32 млрд.</p><p>Основные драйверы:</p><ul><li>Госсектор: с 2024 года все госкомпании обязаны использовать «третьи ключи шифрования» — без SDN это нереализуемо.</li><li>Телеком: Ростелеком и МТС тестируют SDN для 5G-сетей — ручное управление таким трафиком уже невозможно.</li><li>Средний бизнес: облачные CRM и ERP требуют гибких сетей, а аренда VMware NSX теперь недоступна.</li></ul><h3>Вывод: свои SDN — это про выживание</h3><p>В 2025 году вопрос уже не в том, «зачем свои SDN», а в том, как быстро компании смогут перейти на них. Ожидать возвращения VMware бессмысленно и нерационально.</p><p>При этом:</p><ul><li>Basis SDN — не идеален, но это практически единственное рабочее решение;</li><li>без микросегментации скоро не получится пройти даже базовый аудит ФСТЭК;</li><li>гибридные облака без SDN превращаются в кошмар админа.</li></ul><p>Те, кто внедрит российские SDN сейчас, через 2–3 года получат снижение затрат на 25–40% по сравнению с теми, кто цепляется за «серые» Cisco и Huawei. Остальные рискуют остаться с сетью, которую некому и нечем администрировать.</p><h2>Проблемы отечественных SDN: почему российские «сети из кода» пока не взлетели</h2><p>Однако в 2025 году российские SDN-решения пока далеки от совершенства. Basis SDN от «Базиса» и аналоги от VK Tech («Спрут») — первые ласточки, но их внедрение сталкивается с тремя группами проблем: технологическими, экономическими и рыночными. Разберем каждую.</p><h3>Технологические вызовы: когда железа много, а экспертов нет</h3><p>Эта  группа проблем наиболее показательна для отечественных решений.</p><p><b>Дефицит экспертизы.</b> Для разработки конкурентоспособного SDN нужны специалисты высшего уровня, которых в РФ катастрофически не хватает.</p><p><b>Функциональные пробелы.</b> Basis SDN декларирует 80% функционала VMware NSX, но критичные фичи вроде автономного восстановления после сбоев или глубокой аналитики трафика через ИИ появятся <a href="https://ict-online.ru/news/Basis-SDN-pervoye-setevoye-resheniye-klassa-SDN-sozdannoye-pod-rossiiskikh-zakazchikov-310789">не раньше 2026 года</a>. Для корпоративных клиентов это риск: например, без self-healing атака на один сегмент может парализовать всю сеть.</p><p><b>Совместимость с legacy-инфраструктурой.</b> Большинство российских SDN работают с оборудованием YADRO, Aquarius или «Бифорком». Если у компании стоят старые Cisco или Huawei, миграция потребует полной замены «железа» — а это +30–50% к бюджету проекта.</p><p><i>Пример: В 2024 году Ростелеком-ЦОД пытался интегрировать Basis SDN с унаследованными коммутаторами Juniper. Проект забуксовал — пришлось докупать российские аналоги, что увеличило сроки внедрения на 4 месяца.</i></p><h3>Экономические и регуляторные барьеры: санкции vs. окупаемость</h3><p><b>Высокая стоимость разработки.</b> Создание Basis SDN обошлось в сотни миллионов рублей. Для сравнения: бюджет VMware NSX превышает $1 млрд, но его распределяют на глобальный рынок. Российским вендорам приходится компенсировать затраты за счет узкой локальной аудитории.</p><p><b>Давление санкций.</b> С июня 2024 года США запретили ИТ-консалтинг и облачные услуги для российских компаний. Это ударило по поддержке гибридных инфраструктур. Стало невозможно заказывать аудит сети у зарубежных вендоров, а облачные платформы вроде VMware Cloud Foundation недоступны даже через «серые» схемы.</p><p><b>Долгая окупаемость.</b> По прогнозам «Базиса», Basis SDN окупится за 2–3 года. Но малый бизнес не готов ждать — ему нужны решения здесь и сейчас.</p><h3>Рыночное недоверие: почему бизнес не верит в свои SDN</h3><p>Культ «проверенных» зарубежных решений. Даже санкционные Cisco ACI и VMware NSX остаются в топе запросов у российских интеграторов.</p><p>Причины:</p><ul><li>Документация. У Cisco — 500+ страниц детальных мануалов, у Basis SDN — 80, и половина на уровне «как включить контроллер».</li><li>Сообщество. Для VMware NSX есть 1000+ готовых скриптов на GitHub, для Basis SDN — меньше 50.</li></ul><p>Низкая осведомленность малого бизнеса. Опрос бизнес-лаборатории «КРОК» показал: 60% компаний с оборотом до 1 млрд руб. считают SDN «дорогой игрушкой для корпораций». При этом они не знают, что микросегментация в Basis SDN снижает риски утечек на 40% — но об этом не пишут в СМИ.</p><p>Российские SDN не смогут конкурировать с зарубежными, пока:</p><ul><li>не сократится разрыв в экспертизе — нужны образовательные программы уровня Cisco Networking Academy;</li><li>не появятся гарантии долгосрочной поддержки — например, госсубсидий на 5–10 лет;</li><li>не изменится восприятие рынка — тут нужны кейсы уровня «Сбербанк полностью перешел на Basis SDN».</li></ul><p>Сейчас Basis SDN остается нишевым продуктом для госсектора и Ростелекома.</p><h2>Кейсы и перспективы: где российские SDN уже работают и куда движутся</h2><p>В 2025 году российские SDN-решения перестали быть лабораторными проектами — они постепенно внедряются в реальную инфраструктуру. Но масштабы пока несопоставимы с зарубежными аналогами.</p><p>Разберем, где Basis SDN и другие решения уже доказали свою жизнеспособность, какие рынки могут стать для них перспективными и что мешает ускорить развитие.</p><h3>Basis SDN: первый крупный кейс — «Ростелеком-ЦОД»</h3><p>В мае 2025 года «Базис» <a href="https://www.cnews.ru/news/line/2025-05-28_bazis_predstavila_basis_sdn">завершил пилотное внедрение</a> своего SDN-решения в дата-центрах Ростелекома.</p><p>Проект показал:</p><ul><li>Сокращение времени настройки VLAN с 4 часов до 15 минут за счет централизованного управления.</li><li>Микросегментация финансовых сервисов — изоляция платежных систем снизила риски атак на 40% по данным внутреннего аудита.</li><li>Совместимость с оборудованием: 70% старых коммутаторов Cisco удалось интегрировать через шлюзы на базе KVM, хотя изначально Basis SDN разрабатывался для российского «железа» YADRO и Aquarius.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-12/d64df88f-43a2-4a51-967e-4e5f3967e1d5.png" alt="" /></figure><h2>Потенциальные рынки: где российские SDN могут закрепиться</h2><p>В июне 2025 года «Базис» анонсировал партнерство с телеком-оператором в ЮАР.</p><p>Причины интереса:</p><ul><li>Цена: $15 000 за контроллер против $30 000 у VMware NSX.</li><li>Санкционная нейтральность: в Африке нет давления на использование российского ПО, а китайские аналоги (например, ZTE SDN) проигрывают в функционале.</li></ul><p>Планируются поставки в Бразилию (интеграция с облачной платформой на базе OpenStack) и Казахстан (совместный проект с «Казтелеком»).</p><p><a href="https://www.moneytimes.ru/news/rynok-sdn-rossiya-2024/56918/#:~:text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA%20SDN%20%D0%BD%D0%B5%20%D1%80%D0%B0%D1%81%D1%82%D0%B5%D1%82%2C%20%D0%BD%D0%BE%20%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BE%D0%B1%D0%B5%D1%89%D0%B0%D1%8E%D1%82%20%D0%B2%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D0%BE%D0%B9%20%D1%80%D0%BE%D1%81%D1%82%20%D0%BA%202031%20%D0%B3%D0%BE%D0%B4%D1%83&amp;text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9%20%D1%80%D1%8B%D0%BD%D0%BE%D0%BA%20SDN%20%D0%BD%D0%B5%20%D1%80%D0%B0%D1%81%D1%82%D0%B5%D1%82%2C%20%D0%BD%D0%BE%20%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BE%D0%B1%D0%B5%D1%89%D0%B0%D1%8E%D1%82%20%D0%B2%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D0%BE%D0%B9%20%D1%80%D0%BE%D1%81%D1%82%20%D0%BA%202031%20%D0%B3%D0%BE%D0%B4%D1%83&amp;text=%D0%9F%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D1%8B%20iKS%2DConsulting%20%D1%83%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%20%D0%BD%D0%B0%20%D1%82%D0%BE%2C%20%D1%87%D1%82%D0%BE%20%D0%BA,%D1%8D%D1%82%D0%BE%D0%BC%20%D0%B4%D0%BE%D0%BB%D1%8F%20%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B4%D0%BE%D1%81%D1%82%D0%B8%D0%B3%D0%BD%D0%B5%D1%82%2044%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82%D0%BE%D0%B2.">Согласно прогнозам</a>, к 2031 году объем рынка SDN в РФ вырастет в 2-3 раза, но 80% спроса будет приходиться на госсектор и госкомпании.</p><p>Малый бизнес пока остается в стороне. Проблема в том, что Basis SDN ориентирован на крупные внедрения. Для малого бизнеса нет «облегченных» версий — аналогов Cisco ACI Essentials.</p><h2>Рекомендации: как сделать российские SDN массовыми</h2><p>Российские SDN-решения доказали свою жизнеспособность, но для перехода из нишевого сегмента в массовый нужны системные изменения. Рассмотрим ключевые направления, без которых не обойтись.</p><p>Кадры — основа всего. Чтобы ускорить подготовку специалистов, нужно:</p><ul><li>ввести грантовые программы по типу «Цифровых профессий», но с фокусом на сетевые технологии;</li><li>интегрировать модули по SDN в вузовские программы — пока лишь единицы технических университетов включают их в учебные планы.</li></ul><p>Без этих шагов бизнес будет сталкиваться с той же проблемой, что и сейчас: даже купив Basis SDN, компании не смогут его эффективно использовать из-за нехватки компетенций.</p><p>Госсектор стал основным драйвером спроса на отечественные SDN, но для массового внедрения нужны меры, стимулирующие переход коммерческих компаний. Опыт Китая показывает, что субсидии на 50% затрат при миграции с VMware/Cisco резко увеличивают долю локальных решений.</p><p>Кроме того, стоит рассмотреть налоговые каникулы для стартапов в области сетевой виртуализации и заняться софинансированием пилотных проектов в среднем бизнесе — например, через Фонд развития цифровой экономики.</p><p>Одна из главных претензий к Basis SDN — слабая интеграция со сторонними платформами. Для сравнения: VMware NSX поддерживал свыше 200 приложений, а у российского аналога их на порядки меньше.</p><p>Без этого Basis SDN так и останется «закрытым» продуктом для узкого круга заказчиков. Российские SDN не станут массовыми сами по себе — нужна скоординированная работа бизнеса, образовательных учреждений и регуляторов.</p><h2>Итоги: отечественные SDN требуют долгосрочной стратегии</h2><p>Российские решения вроде Basis SDN доказали, что могут работать в реальных условиях. Но чтобы конкурировать глобально, нужно:</p><ul><li>увеличить долю рынка внутри страны — пока она менее 5%;</li><li>снизить порог входа для малого бизнеса;</li><li>выйти за пределы госзаказов — иначе продукт останется нишевым.</li></ul><p>Жизнеспособность у проекта есть. Basis SDN закрывает 80% базовых потребностей бизнеса: микросегментация, централизованное управление, совместимость с российским «железом». Но критичные функции вроде автономного восстановления сетей появятся только к 2026 году.</p><p>Аналитики предсказывают рост рынка SDN в России, но это произойдет только если появятся новые фичи: например, интеграция с ИИ для прогнозирования сетевых аномалий, снизится порог входа и вырастет число специалистов.</p><p>Что может сделать каждый:</p><ul><li><b>Тестировать.</b> «Базис» активно привлекает IT-комьюнити к доработке Basis SDN. Участие в пилотах — способ повлиять на развитие продукта.</li><li><b>Развивать open-source.</b> Проекты вроде OpenDaylight и OpenStack — основа для российских SDN. Чем больше контрибьюторов, тем быстрее сократится разрыв с зарубежными аналогами.</li><li>Требовать документирования. Одна из главных претензий к Basis SDN — скудные мануалы. Если разработчики увидят запрос от сообщества на детальные гайды, они быстрее их выпустят</li></ul><p>Главный вывод: SDN — не просто технология, а новая сетевая парадигма. Россия может занять в ней свое место, но для этого нужны не точечные успехи, а системные изменения.</p><p>Больше инфоповодов — в нашем <a href="https://t.me/+WYtyV4-XYmdhZTMy">тг-канале.</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Почему ваше приложение тормозит: архитектурные bottlenecks, которые никто не замечает</title>
      <link>https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet</link>
      <comments>https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet</guid>
      <description><![CDATA[<p>Как найти и устранить архитектурные bottleneck'и: причины тормозов, типовые ошибки и пошаговая методика диагностики.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-vawe-prilozhenie-tormozit--arhitekturnye-bottlenecks--kotorye-nikto-ne-zamechaet">Почему ваше приложение тормозит: архитектурные bottlenecks, которые никто не замечает</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 19 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваше приложение тормозит, хотя сервер мощный, код вроде нормальный, а метрики — не очень-то и загружены? Возможно, вы столкнулись с архитектурным bottleneck'ом — скрытым ограничением, которое убивает производительность под нагрузкой. Вместе с Никитой Ульшиным, тимлидом команды разработки архитектурных инструментов в Т-Банк и автором тг-каналов <a href="https://t.me/ulshinblog">Никита Ульшин про IT</a> и <a href="https://t.me/tech_fit">ТехнофITнес | Никита Ульшин</a>, разбираем типовые узкие места в системах, от неэффективной аллокации до однопоточных участков, и показываем пошаговый подход к их поиску и устранению.</p><h2>Почему «тормоза» — это не всегда про код</h2><p>Когда пользователь жалуется на «медленное приложение», большинство разработчиков по привычке лезет в код. Профилируем, ищем неэффективные циклы, оптимизируем до запятых. Но в реальности причина часто не в логике, а в том, что её окружает.</p><p>Современное приложение — это сложный организм: десятки микросервисов, базы данных, кэши, брокеры, сети. И тормозить может любой из этих компонентов. А ты в это время профилируешь ни в чём не виноватый for.</p><p>Вот что тормозит, когда код ни при чём:</p><p><b>Архитектура</b></p><ul><li>Цепочки вызовов: каждый хоп — +latency.</li><li>Синхронные зависимости: завис один сервис — тормозят все.</li><li>Общие ресурсы: shared state, глобальные очереди, блокировки.</li></ul><p><b>Базы данных</b></p><ul><li>Нет индексов или плохой план запроса.</li><li>N+1-запросы — особенно при неосторожной ORM.</li><li>Частый доступ к одним таблицам — гонка за IO и блоки.</li><li>Нет шардинга или репликации в масштабируемой нагрузке.</li></ul><p><b>Сеть</b></p><ul><li>Высокая задержка между регионами (особенно multi-cloud).</li><li>Потери пакетов, DNS-проблемы, нестабильность.</li><li>Отсутствие connection reuse: TLS-handshake на каждый вызов.</li></ul><p><b>Очереди и брокеры</b></p><ul><li>Один медленный потребитель тормозит всех.</li><li>Нет защиты от от backpressure или дедупликации.</li><li>Неправильные batch- и ack-настройки.</li></ul><p><b>Аллокаторы и GC</b></p><ul><li>Фрагментация памяти, нагрузка на GC.</li><li>Финалайзеры, слабые ссылки, плохо настроенный heap.</li></ul><p><b>Конфигурации</b></p><ul><li>Маленький пул соединений — пул заканчивается, запросы ждут.</li><li>Агрессивные retry-политики — система перегружается.</li><li>CPU throttling в Kubernetes — контейнеру не хватает ресурсов.</li></ul><p><b>Сериализация и форматы</b></p><ul><li>Перегруженные JSON/Protobuf.</li><li>Вложенные base64 + gzip + JSON — боли сериализации.</li></ul><h3>Почему bottlenecks остаются невидимыми до продакшена</h3><p>Многие из них —  не баги, а последствия архитектурных решений. В дев-среде всё летает, потому что:</p><ul><li>мало данных,</li><li>нет конкуренции за ресурсы,</li><li>нет распределённой нагрузки.</li></ul><p>В проде начинается хаос. Рассмотрим на конкретных примерах:</p><ul><li>На деве — 2 запроса в секунду, в проде — миллион. Кто-то запустил маркетинговую рассылку, аналитик тащит big report, а клиент ретраит ошибки.</li><li>Архитектура «в лоб»: всё синхронно, каждый сервис вызывает по цепочке десяток других. Пока нагрузка мала — все живет. Как только одно звено не выдерживает — перестает жить.</li><li>Иллюзия масштабируемости: до 100 пользователей —  всё окей, на 1000 — каскадная деградация.</li><li>«Невидимая боль» между сервисами: каждый по отдельности быстрый, но блокирует друг друга на базе.</li></ul><h2>Слои архитектуры и где в них зарыты проблемы</h2><p>Когда приложение тормозит, мы часто копаемся в отдельных компонентах — фронте, бэке, базе. Но bottleneck может быть не внутри компонента, а между ними: в конфигурации, связях, сетевых задержках, очередях вызовов.</p><p>Чтобы понять, где искать узкое место, нужно пройтись по всей цепочке — от клиента до внешних сервисов.</p><h3>На уровне клиента</h3><ul><li>Тяжёлые бандлы. Огромный JS, куча аналитики, трекеры — и вот страница загружается 8 секунд на старом телефоне.</li></ul><ul><li>Чрезмерные запросы. После загрузки — 10 fetch в секунду. API захлёбывается, браузер — тоже.</li></ul><ul><li>Нет кеша. Даже статичные справочники каждый раз грузятся заново.</li></ul><ul><li>Лаги рендеринга. Бэкенд дал ответ за 100ms, но интерфейс лагает — сложные таблицы, графики, reflow.</li></ul><h3>На уровне API Gateway / BFF</h3><ul><li>Непрозрачная маршрутизация —  скрытые таймауты, ошибки ретраев.</li><li>Сборка ответов из микросервисов — цепочка из 5 вызовов на каждый клиентский запрос.</li><li>Синхронные вызовы без деградации — если один микросервис недоступен, падает весь endpoint.</li></ul><h3>На уровне Backend / бизнес-логики</h3><ul><li>Цепочки вызовов. Один сервис вызывает другой, тот — ещё один… И так далее.</li><li>Ограниченный пул соединений —  сервис готов работать, но все worker-ы ждут ресурсы.</li><li>Логика в цикле по данным —  N+1-запросы, сериализация, дублирование работы.</li></ul><h3>На уровне базы данных / кэша</h3><ul><li>Full table scan. Работает быстро на 1000 строках. Умирает на 10 миллионах.</li></ul><ul><li>Локи и гонка за ресурсы. Один UPDATE лочит строку, остальные ждут.</li></ul><ul><li>Кэш не промахивается, но и не помогает —  stale данные, повторные чтения, инвалидация не работают, как ожидалось.</li></ul><p><b>На уровне внешних сервисов (API, брокеры, платёжки)</b></p><ul><li>Без timeout и fallback. Внешний API залип — вы вместе с ним.</li><li>QPS-лимиты. Вы не знали, а вас уже зарейт-лимитили.</li><li>Нестабильная сеть. DNS тормозит, соединения рвутся, задержки скачут между регионами.</li></ul><p>Оптимизация кода важна. Но если система тормозит, искать нужно по всей цепочке —  от кнопки на фронте до брокера в соседнем дата-центре.</p><blockquote>Есть архитектурные паттерны риска, которые часто приводят к тормозам через полгода. Во-первых, общий ресурс на всех: один Redis, один Kafka-топик, одна таблица. Пока нагрузка маленькая — ок. Потом начинается бойня за доступ. Во-вторых, микросервисный монолит: формально разделены, но живут как один. Масштабировать невозможно. В-третьих, цепочки вызовов: 5–6 сервисов на путь одного запроса. Один подвис — и вся цепочка тормозит.</blockquote><h2>Базы данных: когда даже SELECT тормозит всё</h2><p>В бэкенде одна из самых коварных фраз — «ну это же просто SELECT, что с ним будет». Ответ — сначала ничего. Но со временем появляется 10 миллионов строк, и ваш innocuous SELECT превращается в full scan, который лочит диск, ест CPU и тормозит всё, что движется.</p><p>Типичная ситуация: в таблицу пишут JSONB без нормализации и индексов. Пока строк мало — жить можно. Но при росте объёмов каждый запрос превращается в медленное последовательное чтение. Это не просто «долго», а начинает мешать соседним транзакциям: подгружаются stale данные, вытесняется кэш, система начинает проседать вся — вплоть до API.</p><p>Отдельная ловушка — смешение OLTP и OLAP нагрузки. Днём — INSERT и UPDATE от клиентов, ночью — фоновая аналитика, высчитывающая отчёт за год с десятком JOIN и чтением всей таблицы. Если все запросы идут в один инстанс, происходит конкуренция за ресурсы: аналитика сбивает кеш, вызывает блокировки, а продакшн-метрики начинают сыпаться.</p><h3>Как понять, что тормоза идут из базы, а не из бэкенда?</h3><p>Вот несколько типичных признаков:</p><ul><li>Бэкенд «висит» на запросах к базе — в логах видно, что приложение ждёт результат запроса (долгий await, query(), findMany() и т. д.).</li></ul><ul><li>Latency растёт, а CPU и память в норме — сервис сам по себе не перегружен, но ответ приходит медленно.</li></ul><ul><li>В базе фиксируются медленные запросы — например, SELECT или JOIN занимают секунды, хотя раньше проходили за миллисекунды.</li></ul><p>Чтобы подтвердить гипотезу, можно:</p><ul><li>Включить логирование SQL-запросов с таймингом;</li><li>Посмотреть трейс: если шаг DB заметно длиннее остальных — это тревожный сигнал;</li><li>Запустить EXPLAIN ANALYZE на типовые запросы и проверить, где зарыта сложность.</li></ul><h3>Архитектура доступа к данным: как закладываются тормоза</h3><p>Архитектура доступа к данным — фундамент, на котором держится производительность всей системы. Даже идеальный алгоритм или быстрый backend не спасут, если данные извлекаются медленно, неэффективно или избыточно.</p><p>На что здесь стоит обратить внимание:</p><ul><li><b>Количество и характер обращений. </b>Один пользовательский запрос не должен порождать десятки обращений к базе. Планирование кэшей, агрегаций, prefetch, нормализация — всё это часть архитектуры.</li><li><b>Уровень абстракции над данными.</b> ORM может быть удобным, но часто скрывает десятки неэффективных SELECT’ов. Нужно понимать, какие запросы реально идут в базу, и не превращать каждый use case в потенциальный bottleneck.</li><li><b>Стратегия хранения и агрегаций.</b> Если вы пытаетесь на лету агрегировать 100 миллионов строк без шардинга и партиционирования — тормоза неизбежны. Архитектура должна учитывать нагрузку, частоту агрегаций, структуру данных.</li></ul><h2>Очереди и событийные системы: скрытые замедления</h2><p>Событийные архитектуры и очереди вроде Kafka или RabbitMQ часто воспринимаются как универсальное средство от всех проблем: «Сделаем асинхронно — и всё полетит». Но это не серебряная пуля. Очередь не решает проблему — она её откладывает. А иногда сама становится bottleneck’ом.</p><p>Типовые ситуации, когда очередь тормозит систему:</p><ul><li><b>Медленные консьюмеры.</b> Очередь принимает сообщения с высокой скоростью, но обработчики не успевают, и начинается накопление беклога. В результате задержки накапливаются, SLA летит, а вы только недоумеваете, почему всё так тормозит.</li><li><b>Неправильный размер batch’ей.</b> В Kafka и аналогах размер и частота batch'ей критичны. Слишком большие — ждём, пока соберётся партия. Слишком маленькие — тратим ресурсы на лишнюю загрузку и пересылку. В итоге получаем либо высокую задержку, либо низкую производительность.</li><li><b>Неравномерное партиционирование</b>. Если сообщения распределяются по партициям неравномерно, то часть узлов будет простаивать, а часть захлёбываться под нагрузкой. Одна горячая партиция может стать bottleneck’ом всей системы.</li><li><b>Проблемы с retry.</b> Если нет чёткой стратегии повторных попыток, логирования и DLQ (dead-letter queue), битое событие может крутиться в системе бесконечно, тормозя всё остальное. Также если что-то пошло не так и включились retry-механизмы, задержка может вырасти в разы. Особенно если есть backoff или дедлоки.</li></ul><h3>Почему «асинхронно» ≠ «мгновенно»</h3><p>Асинхронность — это не про скорость, а про отложенность. Событие отправлено — но когда оно будет обработано, никто не знает. Через секунду, через минуту, через час?</p><p>Типичные причины задержек в асинхронной обработке:</p><ul><li>Очередь перегружена, и событие просто стоит в хвосте.</li><li>Обработчик падает или рестартится, и событие ждёт.</li><li>Политики повторной обработки не настроены — событие крутится бесконечно.</li><li>Слишком много этапов внутри одного воркера: валидация, запись в БД, вызов API — всё это задержки, которые суммируются.</li></ul><h3>Что происходит, когда очередь переполнена — и почему это тяжело заметить</h3><p>Когда очередь переполняется, события в ней начинают задерживаться или теряться, в зависимости от конфигурации. Но хуже всего то, что это происходит тихо. Формально система работает: события принимаются, воркеры их обрабатывают. Но обработка начинает всё сильнее и сильнее отставать.</p><p>Очередь продолжает принимать события, но обрабатываются они с огромным отставанием. Новое сообщение встаёт в хвост и ждёт своей очереди десятки секунд или минут. Такую ситуацию легко не заметить, если у вас не настроен грамотный мониторинг.</p><p>Для защиты от переполнения очереди нужно мониторить несколько важных показателей:</p><ul><li>Глубина очереди (в Kafka — consumer lag, в RabbitMQ — queue.messages_ready или queue.messages): показывает, сколько сообщений накопилось и ждёт обработки.</li><li>Publish rate: сколько сообщений в секунду публикуется.</li><li>Processing rate: сколько сообщений в секунду обрабатывается.</li><li>Утилизация ресурсов воркеров (CPU, memory, I/O).</li><li>End-to-end latency: сколько времени проходит от публикации события до его обработки.</li></ul><blockquote>Есть самые частые причины накопления сообщений:<br /><br />1) Медленные потребители, которые не успевают обработать весь поток сообщений. <br />2) Шумная архитектура: 10 сообщений там, где можно было обойтись и одним. <br />3) Неправильное масштабирование брокера (например, неправильно выбранный ключ партиционирования в Kafka).</blockquote><h2>API и микросервисы: где тормозит взаимодействие</h2><p>Микросервисная архитектура на бумаге выглядит идеально: каждый сервис автономен, команды независимы, масштабирование прозрачно. Но на практике все часто превращается в болото синхронных вызовов, где каждый сервис делает запросы в пять других.</p><h3>Что тормозит в микросервисах?</h3><p><b>Много лишних вызовов</b></p><p>Один пользовательский запрос вызывает лавину внутренних HTTP/gRPC-запросов. Каждый из них — это:</p><ul><li>сетевые задержки (latency),</li><li>сериализация/десериализация данных,</li><li>ретраи при сбоях,</li><li>риск таймаутов и обрывов.</li></ul><p>Если таких вызовов много, задержка накапливается каскадом.</p><p><b>Цепочка зависимостей</b></p><p>Классика жанра: заказ зависит от оплаты, оплата — от биллинга, биллинг — ещё от трёх микросервисов.</p><p>Если тормозит хотя бы один, сыплется всё. Получается эффект домино и каскадные отказы, где неполадка в одном звене рвёт всю цепочку.</p><p><b>Нет fallback'а и таймаутов</b></p><p>Если вызов к нужному сервису не отвечает, а у вас нет fallback'а или таймаута — всё встаёт. Особенно плохо, если вызов синхронный и блокирует поток.</p><p><b>Наносервисы</b></p><p>Иногда архитекторы увлекаются и дробят сервисы до абсурда. Начинается с «давайте переиспользуем», а заканчивается 10 API-вызовами ради одного действия.</p><p>Вместо бизнес-логики система начинает заниматься оркестрацией — координирует сама себя.</p><h2>Кэш и CDN: почему «ускорители» тоже могут тормозить</h2><p>Кэш традиционно считается палочкой-выручалочкой для производительности. «Добавим кэш — и всё полетит», — думают команды, особенно под нагрузкой. Но в реальности кэш может не только не ускорить, но и наоборот — замедлить или даже уронить систему, если использовать его без понимания.</p><p>Вот несколько типичных ошибок, которые приводят к деградации производительности:</p><h3>Невалидные или слишком агрессивные стратегии</h3><p>Если кэш живёт слишком долго — пользователи получают устаревшие данные. Если обновляется слишком часто — создаются лишняя нагрузка на базу и почти постоянные «промахи».</p><p>А если кэш сбрасывается при каждом изменении, он вообще не успевает выполнять свою роль.
В итоге: нестабильное поведение, непредсказуемая производительность и раздражённые пользователи.</p><h3>Перегрузка кэша</h3><p>Когда кэш настолько загружен, что сам по себе начинает тормозить — это уже не помощь, а вред. Такое часто случается с Redis, Memcached или in-memory решениями, особенно если они:</p><ul><li>работают на одной машине без шардинга;</li><li>содержат тяжёлые объекты;</li><li>используются как универсальный ответ на все проблемы.</li></ul><p>В таких случаях кэш из «ускорителя» может падать под нагрузкой быстрее, чем база данных.</p><h3>Кэш-миссы и лавины запросов</h3><p>Классическая проблема: TTL у популярных ключей истекает одновременно, и тысячи запросов идут мимо кэша в базу.
Это может случиться после деплоя, сброса кэша или при пиковой нагрузке.</p><p>Вместо одного запроса вы получаете 10 000, и тормозит всё. Особенно критично это для систем с CDN, где внезапное истечение кэша популярных страниц может вызвать DDoS-подобную нагрузку.</p><h3>Несогласованность кэшей</h3><p>Если в системе несколько уровней кэширования (CDN, фронтовый кэш, Redis) и они обновляются по-разному, возникает несогласованность. Один пользователь видит новые данные, другой — старые. Один сервис работает с актуальной версией, другой — с устаревшей. Начинается охота за фантомами: баги вроде есть, но не у всех.</p><h2>Вычисления и память: что не так с аллокацией</h2><p>Почему мощные сервера с десятками ядер и гигабайтами памяти тормозят? Потому что производительность упирается не в «железо», а в то, как именно это железо используется. От плохого управления памятью до блокирующих операций — в системе может быть множество узких мест, которые незаметно душат throughput.</p><h3>Частые и крупные аллокации</h3><p>Каждый раз, когда создаётся новый объект, память выделяется из кучи. При интенсивной работе (например, при парсинге JSON или обработке больших структур) это может происходить слишком часто, и тогда запускается сборщик мусора (GC).</p><p>Сборка мусора — это не бесплатная операция: она останавливает выполнение программы. Частые GC-паузы создают «плавающую» производительность, когда всё работает быстро, но время от времени подвисает даже на секунду.</p><h3>GC-паузы</h3><p>Автоматическое управление памятью — благо, но оно же и ловушка. В языках вроде Go, Java или Python невозможно точно контролировать, когда сработает сборщик. Даже задержка в 50 миллисекунд может ощутимо ударить по RPS или нарушить real-time обработку.</p><p>Некоторые компании придумывают обходные пути. Так, в Twitch <a href="https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap/">использовали</a> технику memory ballast для Go-приложений, чтобы стабилизировать поведение GC и избежать всплесков пауз.</p><h3>Синхронные и блокирующие операции</h3><p>Если операции с файлами, сетью или базой данных выполняются синхронно, поток блокируется — и в это время не может обрабатывать другие задачи. Это особенно критично, если такой поток обслуживает пользовательские запросы.</p><p>Классический пример — однопоточный web-сервер, который просто ждёт ответ от другой системы. Или библиотека, использующая mutex.Lock() в горячем участке, из-за чего десятки горутин встают в очередь.</p><h3>Ограниченные ресурсы и очереди</h3><p>Даже в многопоточном приложении можно легко создать узкое место. Например:</p><ul><li>доступ к объекту синхронизирован через mutex или RW-lock;</li></ul><ul><li>пул соединений имеет жёсткий лимит;</li></ul><ul><li>очередь задач не может масштабироваться под нагрузку.</li></ul><p>В таких случаях нагрузка растёт, а пропускная способность — нет. Всё упирается в искусственное ограничение, введённое «на всякий случай».</p><h3>Однопоточные горячие участки</h3><p>Даже в многопоточной архитектуре может оказаться, что 80% времени тратится в одном месте, которое не масштабируется — например, в процессе сериализации, расчёта или шифрования. Иногда этот участок реализован однопоточно (особенно в Node.js, Python или старом Go-коде) и становится главным тормозом системы. Под высокой нагрузкой это становится особенно заметно.</p><h2>Что делать: подход к поиску и устранению bottlenecks</h2><p>Когда система тормозит, возникает соблазн сразу «что-то сделать» — добавить кэш, увеличить ресурсы, ускорить базу. Но без системного подхода можно попасть в замкнутый круг, где проблема будет возвращаться снова и снова. Чтобы избежать этого, лучше использовать пошаговую стратегию: зафиксировать симптомы, локализовать проблему, подтвердить и только потом оптимизировать.</p><h3>Шаг 1. Зафиксировать симптомы и контекст</h3><p>Важно понять, что именно «тормозит» и в каких условиях. Типовые вопросы:</p><ul><li>Когда проявляется проблема: под нагрузкой, в пиковые часы, у конкретных пользователей?</li><li>Что именно работает медленно: API, отчёты, фоновая обработка?</li><li>Как это влияет на систему: задержки, таймауты, ошибки?</li></ul><p>Пример: пользователи жалуются, что отчёты стали строиться дольше. Вчера — 5 секунд, сегодня — 20.</p><h3>Шаг 2. Проверить очевидные метрики</h3><p>Начинаем с того, что уже доступно в мониторинге:</p><ul><li>латентность API (p50, p95, p99);</li><li>загрузка CPU, использование памяти и диска;</li><li>глубина очередей и backlog;</li><li>паузы GC;</li><li>кэш hit/miss ratio.</li></ul><p>Если латентность растёт, а CPU загружен на 20%, это может указывать на проблемы в синхронных вызовах, аллокации или неэффективной работе кэша.</p><h3>Шаг 3. Сузить область через трейсинг и логирование</h3><p>Чтобы выяснить, не «тормозит» ли другой сервис, используйте распределённый трейсинг (Jaeger, OpenTelemetry, Sentry Performance) или логирование таймингов внутри запроса.</p><p>Пример (Go, обёртка для http.RoundTripper):</p><p>Так можно увидеть, что, например, сторонний сервис отвечает 3 секунды, или Redis стал отдавать ответ за 300 мс вместо обычных 3 мс.</p><h3>Шаг 4. Воспроизвести нагрузку</h3><p>Если проблема зависит от объёма данных, воспроизведите реальный сценарий или нагрузку:</p><ul><li>используйте инструменты вроде k6, Locust, Artillery;</li><li>проверьте реальные условия (например, отчёт за 30 дней, а не за 3).</li></ul><p>Если латентность растёт нелинейно, это может быть признаком N+1-запросов, неоптимального SQL или проблем с аллокацией.</p><h3>Шаг 5. Подтвердить проблему профилированием</h3><p>Если есть подозрение на перегрузку CPU или утечку памяти, используйте профилировщики:</p><ul><li>Go — pprof;</li></ul><ul><li>Java — JFR, VisualVM;</li></ul><ul><li>Node.js — clinic.js, chrome://inspect.</li></ul><p>Пример (Go, локальный pprof):</p><p>Профиль покажет, где тратится CPU, как распределяются аллокации, как часто запускается GC и в каком коде.</p><h3>Шаг 6. Оптимизировать, перепроверить и зафиксировать</h3><p>После подтверждения проблемы можно переходить к исправлениям:</p><ul><li>кэшировать внешний вызов;</li></ul><ul><li>заменить тяжёлую сериализацию (например, на easyjson в Go);</li></ul><ul><li>убрать блокирующую операцию;</li></ul><ul><li>перейти на batch-обработку.</li></ul><p>После изменений обязательно перепроверьте метрики, чтобы убедиться, что оптимизация действительно дала эффект — и не добавила новых узких мест.</p><h2>Итоги: как не попасть в архитектурную ловушку</h2><p>Bottleneck’и возникают даже в самых технологичных проектах. Это не всегда следствие «плохого кода» — куда чаще они появляются из-за архитектурных просчётов: недооценили нагрузку, не предусмотрели масштабирование, сделали ставку на неправильное решение.</p><p>Главная проблема в том, что узкие места проявляются не сразу, а под нагрузкой. В разработке и тестах всё летает, потому что ресурсов хватает. А вот в проде — особенно при росте аудитории — на поверхность всплывает всё, что не выдерживает реального объёма данных или конкуренции за ресурсы.</p><p>Чтобы избежать таких проблем, важно не просто писать чистый код, а мыслить системно: проектировать архитектуру так, чтобы она могла жить под давлением. Вот несколько принципов, которые помогут.</p><h3>Думайте об объёмах и росте</h3><p>Архитектура должна выдерживать не только текущую нагрузку, но и разумный рост. Строить систему на «миллиард пользователей» с первого дня — избыточно. Но если вы рассчитываете, что пользователей станет в 5 раз больше через год — закладывайте это сейчас. Узкие места не любят сюрпризов.</p><h3>Настраивайте метрики с первого дня</h3><p>Без данных вы работаете вслепую. Любой анализ будет превращаться в гадание: виноват код или Redis, где тормозит — непонятно. С самого начала следите за ключевыми метриками: latency, очереди, GC, hit/miss в кэше, ошибки. Это не «доработка потом», а часть живой системы.</p><h3>Проектируйте с учётом деградации</h3><p>Любая система может начать тормозить — вопрос в том, как она себя при этом поведёт. Важно предусмотреть мягкую деградацию: таймауты, очереди, резервные сценарии, ограничение входящего трафика.</p><h3>Не усложняйте архитектуру без повода</h3><p>Микросервисы, шины, очереди, event-driven — всё это мощные инструменты. Но сложность должна быть оправданной. Простая, понятная архитектура с мониторингом и масштабируемыми точками зачастую выигрывает у перегруженной модульной схемы, которую никто не может отладить.</p><p>Bottleneck’и — это не баг, а симптом. И хороший архитектор — это не тот, кто устраняет тормоза, а тот, кто их не допускает.</p><p>Больше боли коддеров — <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как защитить pet-проект почти бесплатно, но эффективно</title>
      <link>https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno</link>
      <comments>https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Гринь]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno</guid>
      <description><![CDATA[<p>Как эффективно защитить pet-проект: управление секретами, логирование, бэкапы, локальные туннели и другие базовые правила безопасности
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno">Как защитить pet-проект почти бесплатно, но эффективно</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Slack]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Pet-проекты помогают развивать профессиональные навыки и воплощать собственные идеи, но не стоит забывать об их информационной безопасности. Делать сервис и не думать об инфобезе — всё равно что строить дом без фундамента: выглядит добротно, но всё может рухнуть в самый неожиданный момент. Разберём, как недорого и эффективно защитить проект.</p><h2>Что такое pet-проект и зачем его защищать</h2><p><b>Pet-проект</b> (от английского pet — «домашний питомец») — тренировочный проект, который разработчик создаёт в свободное время по собственному желанию. Обычно их делают, чтобы освоить новую технологию, пополнить портфолио или поучаствовать в хакатонах.</p><p>Такие проекты часто воспринимают как что-то «несерьёзное», но пренебрежение информационной безопасностью может привести к неприятным последствиям. Злоумышленники используют уязвимости pet-проектов для получения доступа к ресурсам разработчика, кражи данных и будущих атак на более крупные цели.</p><p>Кроме того, защита pet-проекта — важный навык, который высоко ценится работодателями.</p><p>Рассмотрим основные правила кибербезопасности, которые нужно учитывать при работе над pet-проектом.</p><h2>Безопасное управление секретами</h2><p><b>Секреты</b> — это чувствительные данные, такие как пароли, токены доступа, ключи API, SSH-ключи, сертификаты и другие данные, которые обеспечивают аутентификацию и шифрование. Если добавить секреты в код, злоумышленники могут получить полный контроль над вашей инфраструктурой.</p><h3>Какие правила нужно соблюдать</h3><ul><li>Не храните секреты в коде. Храните секреты в отдельных файлах env. и добавьте эти файлы в .gitignore, чтобы они не попадали в репозиторий.</li><li>Придерживайтесь принципа минимальных привилегий. Каждый сервис должен иметь только те права, которые необходимы для выполнения своих задач.</li><li>Регулярно обновляйте секреты. Меняйте токены и пароли периодически, особенно после обнаружения утечек или изменений в проекте.</li><li>Используйте менеджеры секретов. Популярные сервисы: Doppler, HashiCorp Vault, AWS Secrets Manager, 1Password Developer Tools.</li><li>Мониторьте утечки. Можно использовать такие инструменты, как GitGuardian, TruffleHog, Gitleaks.</li><li>Шифруйте секреты. Используйте библиотеки типа cryptography в Python и подключайте шифрование на уровне операционной системы.</li></ul><h2>Безопасность CI/CD</h2><p><b>Пайплайн CI/CD</b> (Continuous Integration / Continuous Delivery) — автоматизированный процесс сборки, тестирования и развёртывания приложений. Он помогает автоматически интегрировать код и деплоить его на различные среды.</p><p>Если злоумышленник получит доступ к пайплайну, он может внедрить вредоносный код в ваше приложение, остановить весь процесс разработки или развёртывания, украсть данные пользователей и т.д.</p><h3>Способы защиты пайплайна</h3><ul><li>Моделируйте угрозы. Оцените, какие угрозы наиболее вероятны на каждом этапе пайплайна: от коммита кода до деплоя на сервер.</li><li>Проверяйте зафиксированный код. Используйте статический анализ кода для автоматического поиска уязвимостей.</li><li>Защитите Git-репозитории. Настройте двухфакторную аутентификацию (2FA), ограничьте доступ к репозиториям, используйте обязательную проверку пул-реквестов двумя разработчиками.</li><li>Изолируйте пайплайн. Не запускайте его на том же сервере, где крутится ваше продакшн-приложение.</li></ul><p>Дополнительно стоит шифровать секреты в пайплайне и минимизировать их передачу между этапами сборки.</p><h2>Сервисы мониторинга и логирования</h2><p><b>Логирование</b> — запись событий, ошибок и других данных о работе приложения в специальные файлы или базы данных. По сути, это дневник.</p><p><b>Мониторинг</b> — наблюдение за состоянием приложения, инфраструктуры или сервисов в реальном времени для своевременного выявления падения сервера, роста ошибок и других проблем.</p><p>Анализ логов помогает выявлять баги, попытки несанкционированного доступа, долгие запросы, ошибки базы данных. Мониторинг позволяет мгновенно реагировать на сбои, а также с его помощью вы узнаете, хватает ли приложению серверных мощностей.</p><h3>Примеры популярных сервисов</h3><p><a href="https://logtail.ru/">Logtail </a>— простой инструмент для сбора и анализа логов, есть бесплатный тариф.</p><p><a href="https://github.com/paper-trail-gem/paper_trail">Papertrail</a> — удобный сервис для быстрого поиска по логам, бесплатный план для небольших проектов (10 Мб в день).</p><p><a href="https://docs.sentry.io/">Sentry</a> —  хорош для отслеживания ошибок в приложениях на клиентской стороне и сервере.</p><p><a href="https://betterstack.com/">BetterStack</a> — мониторинг доступности сайтов и серверов с бесплатными уведомлениями об инцидентах по почте, через SMS и Slack.</p><p><a href="https://grafana.com/pricing/">Grafana Cloud Free</a> — мониторинг с красивыми дашбордами, бесплатный лимит ресурсов до 10 тыс. серий данных, 50 ГБ трафика.</p><p><a href="https://prometheus.io/">Prometheus</a> и <a href="https://grafana.com/">Grafana</a> — Prometheus собирает метрики, Grafana их визуализирует.</p><p><a href="https://uptimerobot.com/">UptimeRobot</a> — проверка доступности вашего проекта каждые 5 минут, бесплатный тариф на 50 мониторингов.</p><h2>Бэкап и восстановление данных</h2><p><b>Бэкап</b> — это создание резервной копии данных, которую можно использовать для восстановления в случае утраты или повреждения оригиналов. Может показаться, что для pet-проекта это излишне, однако от случайных удалений данных, взломов серверов, утечек данных никто не застрахован. А ещё можно откатиться к рабочей версии, если будут ошибки в коде и деплойменте.</p><h3>Как сделать бэкап пошагово</h3><ol><li>Определите данные, которые необходимо бэкапить: какие данные критически важны, какие можно восстановить вручную.</li><li>Выберите место хранения: облачные сервисы, собственные серверы, внешние носители, Git-репозиторий.</li><li>Выберите тип бэкапа: при полном копируются все данные целиком, при инкрементном — изменения с момента последнего копирования, при дифференциальном — изменения с момента последнего полного бэкапа.</li><li>Настройте автоматизацию, чтобы не забывать делать бэкапы вручную. Можно использовать скрипты, планировщики задач или бэкап-сервисы.</li><li>Проверьте бэкап. Проведите тестовое восстановление.</li><li>Определите частоту бэкапа. Например, можно проводить полный бэкап раз в неделю и инкрементные бэкапы каждый день.</li><li>Защитите чувствительные данные.</li></ol><h2>Локальные туннели</h2><p>При разработке pet-проекта может возникнуть необходимость показать результат внешнему миру. Кроме того, многие внешние сервисы, такие как платёжные системы и мессенджеры, тоже требуют «боевые» URL для отправки запросов. Однако открывать порты на своём устройстве напрямую небезопасно. Локальные туннели создают временный внешний URL-адрес без развертывания на реальном сервере.</p><p>Когда вы запускаете туннель через специальный инструмент, он:</p><ul><li>устанавливает зашифрованное соединение между вашим компьютером и своим публичным сервером;</li><li>создаёт внешний адрес;</li><li>пересылает все запросы, которые приходят на этот адрес, вашему локальному приложению.</li></ul><p>Трафик при этом шифруется и проходит через защищённый канал.</p><h3>Примеры инструментов</h3><p><a href="https://ngrok.com/?ref=gobigger">Ngrok </a>— самый известный инструмент для быстрого создания туннелей. Есть бесплатный тариф.</p><p>Порты от<b> VSCode</b> — отличное решение для пользователей Visual Studio Code, удобно для быстрой демонстрации.</p><p><a href="https://dev.vk.com/ru/libraries/tunnel">VK Tunnel</a> — российская альтернатива, подходит для работы через VK Cloud.</p><p><b>Tuna</b> и <a href="https://xtunnel.ru/">xTunnel </a>— простые в использовании решения, есть бесплатные тарифы.</p><h2>Чек-лист по инфобезу для тех, кто делает pet-проект</h2><ol><li>Регулярно обновляйте зависимости. Используйте автоматические инструменты, например, Dependabot или npm audit.</li><li>Настройте базовые HTTP-заголовки безопасности. Добавьте заголовки Content-Security-Policy, X-Frame-Options, Strict-Transport-Security, чтобы минимизировать риск XSS, Clickjacking и других атак.</li><li>Используйте бесплатные SSL-сертификаты. Подключите HTTPS через бесплатные сервисы, например, Let's Encrypt.</li><li>Очищайте и валидируйте ввод данных. Фильтрация и валидация данных защитит от SQL-инъекций и XSS.</li><li>Создайте отдельные учётные записи для разных сервисов. Не используйте одну и ту же учётную запись везде.</li><li>Минимизируйте доступы к базе данных. Если сервису нужно только читать, не давайте права на запись или удаление.</li><li>Используйте бесплатные инструменты для сканирования уязвимостей. Проверьте код через такие сканеры, как SonarQube Community Edition, Snyk, OWASP ZAP.</li><li>Делайте резервные копии. Настройте автоматические бэкапы базы данных и важных файлов.</li><li>Не храните секреты в коде. Используйте .env файлы и убедитесь, что они добавлены в .gitignore.</li><li>Включите двухфакторную аутентификацию (2FA). На всех сервисах, где это возможно, включите 2FA для дополнительной защиты.<br /></li></ol><p>А больше про разработку и все, что с ней связано, в нашем<a href="https://t.me/tproger_web"> тг-канале</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Неизбежность эволюции программных систем</title>
      <link>https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem</link>
      <comments>https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Межов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem</guid>
      <description><![CDATA[<p>На старте проекта хочется сделать что-то уникальное — но вместо сложной архитектуры лучше выбрать простоту и гибкость. Почему зрелые системы вырастают из минималистичных решений, когда можно позволить себе усложнение — и как понять, что пришло время для следующего шага?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/neizbezhnost-evolyucii-programmnyh-sistem">Неизбежность эволюции программных систем</a>»</p>]]></description>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 15 Jun 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие считают, что новый проект стоит начинать с простого: быстрее сделать MVP, собрать первую обратную связь, не тратить ресурсы впустую. И это разумно — зачем строить космический корабль, если он может так и не вылететь из ангара, а на его обслуживание не хватит ни людей, ни бюджета. Но почти у каждого разработчика внутри живёт желание создать что-то по-настоящему оригинальное. Так почему бы не дать волю этому порыву? Как понять, что проект созрел для нестандартных решений — и настал момент рискнуть?</p><p>На самом деле подобная постановка вопроса некорректна. Практически любое решение никогда не бывает финальным, тем более сразу. Об этом пишут многие заслуженные авторы, но самой яркая цитата, пожалуй, <a href="https://en.wikipedia.org/wiki/John_Gall_(author)#Gall's_law">закон Голла</a>.</p><blockquote>Любая работающая сложная система неизменно оказывается производной простой работающей системы.</blockquote><p>Позволю себе внести важные уточнения.</p><ul><li><i>Простота системы</i> означает не примитивизм, а наличие ограниченного числа взаимодействующих между собой элементов с понятными и прослеживаемыми связями между ними.</li><li><i>Сложность системы</i> означает не трудность организации самой системы, а её зрелость, точность модели предметной области.</li></ul><p>Таким образом, если принять неизбежность эволюционного развития систем, тогда <i>гораздо более важным аспектом выступает возможность самой эволюции.</i> Для этого нужно обеспечить, как минимум, два условия.</p><p>Во-первых, поскольку на начальных стадиях слишком много неопределенности, нужно как можно дольше сохранять свободу выбора направления развития. Во-вторых, принимаемые решения должны уточнять вектор движения для развития в желаемом направлении. Именно в этом контексте речь идет о гибкости архитектуры.</p><p><i>Гибкость архитектуры</i> — понятие ортогональное к простоте и сложности, означающее степень готовности системы к изменениям. Простая — не значит гибкая, обратное также справедливо. Гибкость становится возможной, в том числе, если система не зависит от специфических возможностей составляющих её элементов или особенностей взаимодействия между ними. Например, гибкость снижается, если появляется зависимость от уникальных особенностей определенной базы данных или зависимость этой базы данных от определённого окружения. Между тем, слишком гибкое решение — бесформенное, рыхлое, оно не может задавать структуру, обрекая весь проект на провал.</p><p>Такие размышления — не откровение, об этом давно и много говорят. Я лишь хочу подчеркнуть: задача архитектора — не просто принять логичное решение, но и просчитать его развитие. Важно думать на несколько шагов вперёд, сохраняя при этом простоту и гибкость архитектуры как можно дольше. Это, пожалуй, и есть лучший ориентир в выборе времени и уместности тех или иных решений. Каждый шаг должен вести к цели, закладывать основу для следующего и помогать точнее видеть направление движения. Если всё это соблюдается — значит, пора действовать.</p><p>Именно с такой перспективы стоит подходить к обоснованию архитектурных решений. Поэтому некоторые «аргументы», о которых пойдёт речь ниже, стоит отбрасывать сразу — несмотря на их комичность, в практике они встречаются до сих пор.</p><ul><li>Выбор технологии на основе только её популярности. («Так принято в лучших домах!», «Kafka справится с любой задачей» и т.п.)</li><li>Ориентация на скорость, обоснованная амбициями или ощущениями. («Некогда думать — надо действовать!», «Мир сам себя не захватит!»)</li><li>Неоправданное и/или преждевременное усложнение. («У меня нет задач, нужно придумать что-то интересненькое», «У меня скучные задачи, нужно добавить драйва», «Я предусмотрел обработчик на случай вторжения инопланетян!» и т.п.)</li><li>Неоправданное расширение технологического стека. («CV-Driving Development», «Решил попробовать», «Мне так удобней» и т.п.)</li></ul><p>Принимая неизбежность эволюционного развития систем, важность гибкости архитектуры на ранних стадиях, а также необходимость постоянной корректировки направления развития (стратегии), люди задают вопрос, почему кто-то начинает не с простых вещей. Почему кто-то сразу начинает с гексагональных архитектур или микросервисов?</p><p>Согласен, что иногда это и есть преждевременное усложнение. Однако, если архитектор или разработчик достаточно опытный, он может позволить себе «срезать углы», действуя на опережение. В данном случае он должен осознавать и указывать на все риски подобных действий, в том числе понимать, кто будет поддерживать и сопровождать такой продукт. Тут можно вернуться к метафоре с «космическим кораблём»: нужен ли он на старте, есть ли у вас подходящая команда, инфраструктура, ресурсы?</p><p>Я постарался описать тактику принятия решений, которой стараюсь пользоваться в работе. Было бы интересно узнать, как вы справляетесь с соблазнами несвоевременного применения понравившегося решения.</p><p><i>P.s. Если вам интересна данная тематика, присоединяйтесь к моей новостной ленте в Telegram или здесь. Буду рад поделиться опытом. 😉</i></p>]]></content:encoded>
    </item>
    <item>
      <title>7 курсов, с которых реально стартуют в IT в 2025</title>
      <link>https://tproger.ru/articles/7-kursov--s-kotoryh-realno-startuyut-v-it-v-2025</link>
      <comments>https://tproger.ru/articles/7-kursov--s-kotoryh-realno-startuyut-v-it-v-2025?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-kursov--s-kotoryh-realno-startuyut-v-it-v-2025</guid>
      <description><![CDATA[<p> Хотите начать карьеру в IT с нуля? Рассказываем, какие курсы в 2025 реально помогают попасть в IT, даже без опыта и тех.образования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-kursov--s-kotoryh-realno-startuyut-v-it-v-2025">7 курсов, с которых реально стартуют в IT в 2025</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Вебинар]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Jun 2025 15:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году старт карьеры в IT намного сложнее, чем несколько лет назад. Работодатели больше не берут новичков только за диплом или сертификат — теперь всем нужны реальные практические навыки, которые можно сравнить с опытом работы.</p><p>В этой подборке — 7 курсов, после которых реально получить первую работу в IT за 3–6 месяцев.</p><h2>Почему в 2025 попасть в IT и легче, и сложнее одновременно</h2><p>Войти в IT в 2025 реально, но рынок сильно изменился. С одной стороны, спрос на junior-специалистов вернулся: компании снова набирают новичков, открывают стажировки и гибридные программы. Но конкуренция стала выше, а фильтры — жёстче.</p><h3>Что легче</h3><ul><li>После карьерного спада 2022–2023 спрос на junior-специалистов начал восстанавливаться. Появилось больше стажировок и вакансий для начинающих. Согласно отчёту<a href="https://www.roberthalf.com/us/en/insights/research/data-reveals-which-technology-roles-are-in-highest-demand"> Robert Half</a>, начать успешную карьеру могут инженеры по данным, DevOps-инженеры и разработчики ПО. Однако конкуренция остаётся высокой, и работодатели ожидают от кандидатов не только базовых знаний, но и быстрой адаптации к новым инструментам.</li><li>Образование и работа в IT всё чаще переходят в <a href="https://trends.rbc.ru/trends/social/63a374dd9a794731007f44da">гибридный </a>формат: можно совмещать онлайн- и офлайн-обучение, работать удалённо и периодически встречаться в офисе.</li></ul><h3>Что сложнее</h3><ul><li>Конкуренция выше, чем раньше. Даже на стартовые позиции часто подаётся по сотне кандидатов.</li><li>Работодатели ждут не просто знаний или диплома, а быстрой адаптации.</li></ul><h3>Что изменилось в 2025 по сравнению с 2020–2024</h3><p>Во-первых, образование стало прагматичнее. С 2020 по 2022 год рынок был наводнен короткими курсами «на джуна». В 2025-м большинство таких школ либо закрылись, либо переформатировались: люди устали платить за теорию без практики. Сейчас ценятся программы, в которых есть командные проекты, ревью от наставников, работа с Git и проектный пайплайн, близкий к реальному.</p><p>Во-вторых, работодатели всё чаще оценивают кандидатов по их реальным навыкам и опыту, а не по формальному образованию. Согласно <a href="https://dzen.ru/a/aB4XGcZqiXGuE2wI">прогнозам</a>, 39% текущих навыков работников устареют к 2030 году, что подчеркивает необходимость постоянного обновления и адаптации.</p><p>Так, расширяются границы образования. А вместе с ними – появляются онлайн-курсы.</p><h2>7 курсов, с которых начинают карьеру в IT</h2><h3>1. Kata Academy — GO-разработчик</h3><p><a href="https://kata.academy/courses/go-backend-developer?utm_source=web&amp;utm_medium=article&amp;utm_campaign=go&amp;utm_content=tproger_11_06_25">Ссылка на курс</a></p><p>Go (Golang) — это билет в backend-разработку, где в 2025 году крутятся большие деньги и хардовые задачи. Язык, созданный Google, ценят за скорость и простоту, а компании от стартапов до гигантов вроде Яндекса выстраиваются в очередь за Go-разработчиками. Курс от Kata Academy учит писать серверный код, работать с SQL, Git, Linux и Docker, чтобы выпускники могли строить масштабируемые приложения.</p><h4>📚Что получают выпускники</h4><p>На курсе студент осваивает Go и смежные технологии, создает портфолио из практических проектов, готовится к собеседованиям с поддержкой школы и приходит к главной цели — устраивается на работу по новой специальности. Кроме этого:</p><ul><li>Есть карьерная поддержка: резюме, собеседования, вакансии;</li><li>В договоре — гарантированная зарплата от 120 000 ₽ (может быть выше).</li></ul><h4>🎓Длительность и формат</h4><p>Курс проводится полностью онлайн. Длительность обучения — 9 месяцев, включая подготовку к собеседованиям. Нагрузка: от 25 часов обучения в неделю (3-4 часа в день), есть дедлайны. Выпускник устраивается на работу после курса, в течение 1-2 месяцев (в среднем).</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/8eb864d0-b80e-40a4-9de5-df9ee68d9c5d.png" alt="" /><figcaption>Скриншот траектории обучения с сайта программы</figcaption></figure><h4>👥Кому подойдет</h4><ul><li>Новичкам без опыта в программировании;</li><li>Студентам и начинающим разработчикам, которые хотят освоить Go;</li><li>Может быть интересен тем, кто работает во фронтенде или техподдержке и хочет сменить направление.</li></ul><p>Не требует знаний математики и программирования — рассчитан на обучение с нуля.</p><h4>🏆Возможности после курса</h4><p>На сайте указано, что выпускники устраиваются в компании, такие как Яндекс, Альфа-Банк и Kaspersky, часто в течение первого месяца после завершения основной программы курса. Если выпускник не найдет работу с зарплатой от 120.000 рублей, то оплачивать обучение не придется.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/1a7f9220-659a-4942-b49a-f4cfd1c06651.png" alt="" /><figcaption>Отзывы с сайта программы</figcaption></figure><h4>💸 Стоимость и условия участия</h4><p>Есть два варианта обучения:</p><ul><li>Интенсивное (стоимость — 110 000 рублей во время учебы плюс 20% от зарплаты в первый год работы). Для тех, кто живет в Москве или Санкт-Петербурге, или готов туда переехать.</li><li>Асинхронное (стоимость — 262 000 рублей). Обучение в своем темпе, нет дедлайнов. Можно искать работу в любом городе-миллионнике, если не получится устроиться — есть гарантия возврата денег.</li></ul><h3>2. CyberEd — Пентестер</h3><p><a href="https://cyber-ed.ru/b2c-courses/pentester/?utm_medium=tproger&amp;utm_campaign=7kursov">Ссылка на курс</a></p><p>Пентест (тестирование на проникновение) — это процесс поиска уязвимостей в IT-системах путем имитации атак хакеров.</p><p>Курс обучает анализу защищенности веб-приложений, сетей и инфраструктуры, а также использованию инструментов вроде Nessus и Nmap.</p><p>В программе будут техники атак, методы их обнаружения и составление отчетов. Курс готовит специалистов к реальным задачам в области кибербезопасности для работы в топовых компаниях.</p><h4>📚Что получают выпускники</h4><ul><li>Выпускники получают диплом о профессиональной переподготовке или удостоверение о повышении квалификации (зависит от формата).</li><li>Студенты формируют цифровое резюме и портфолио на основе практических заданий.</li><li>Все студенты проходят карьерную подготовку — от тренировки прохождения собеседований до подбора стажировок и вакансий.</li></ul><h4>🎓Длительность и формат</h4><p>Обучение длится 24 недели (365 академических часов) и проходит полностью онлайн. Есть два формата:</p><ul><li>Синхронный формат — с расписанием и онлайн-занятиями в группе. Включает 24 онлайн-семинара по 4 часа, регулярную обратную связь от наставников и карьерные консультации.</li><li>Асинхронный формат — без привязки ко времени: обучение проходит в удобном для студента темпе. Доступ ко всем материалам курса, заданиям и модулям открыт сразу.</li></ul><p>Оба формата включают более 100 практических заданий, поддержку менторов и итоговый проект.</p><h4>👥Кому подойдет</h4><ul><li>Айтишникам, которые хотят научиться пентесту или прокачаться в кибербезопасности.</li><li>Системным администраторам, веб-разработчикам, специалистам по ИБ, а также джунам и миддлам из пентеста, Blue Team или AppSec.</li></ul><p>В общем, полезно будет тем, у кого уже есть хотя бы год опыта и кто хочет перейти на следующий уровень.</p><h4>🏆Возможности стажировки и трудоустройства</h4><p>Выпускники устраиваются на позиции инженеров по безопасности или пентестеров, в том числе в крупные IT-компании. По отзывам студентов, некоторые находят стажировку уже на 4 месяц обучения, а часть получает постоянные позиции в течение 1 года после финала курса.</p><h4>💸 Стоимость и условия участия</h4><p>138 000 рублей за синхронный формат, 74 000 рублей за асинхронный. Доступна рассрочка на 2 года — 6 900 рублей в месяц.</p><p>Для поступления необходимо подать заявку через сайт. Точные требования к участникам не указаны, но курс предполагает наличие базовых знаний IT.</p><h3>3. Яндекс Практикум — Инженер по тестированию</h3><p><a href="https://practicum.yandex.ru/qa-engineer/?utm_source=partners&amp;utm_medium=cpc&amp;utm_campaign=tproger_cpc_RF_Prog_qaEn_b2c_Article_None_None">Ссылка на курс</a></p><p>Инженер по тестированию (QA-инженер) проверяет качество программных продуктов: ищет ошибки  в веб-приложениях, мобильных приложениях и API.</p><p>В программе курса Яндекс Практикума будут основы ручного тестирования, работа с тестовой документацией и инструментами, базовые навыки автоматизации, а также отдельные модули по информационной безопасности, Figma, Python и SQL.</p><p>Из интересного: обучение построено по принципу симуляции стажировки: студенты работают над проектами, которые похожи на реальные рабочие задачи.</p><h4>📚Что получают выпускники</h4><ul><li>В финале курса Практикум выдаёт диплом о профессиональной переподготовке.</li><li>Также у выпускников остаётся портфолио из 7 учебных проектов (в расширенной версии курса — из 9). Среди них, например, — итоговая работа над сервисом Яндекса (тестирование Яндекс.Маршрутов и т.д.).</li><li>Дополнительно открывается доступ к модулю по YandexGPT и YandexART.</li><li>В течение семи месяцев после окончания обучения доступна карьерная поддержка. При желании можно набираться опыта в Мастерской Практикума — это агентство внутри Практикума, где выпускники работают над задачами реальных заказчиков.</li></ul><h4>🎓Длительность и формат</h4><ul><li>Курс рассчитан на пять месяцев — это 318 академических часов, в среднем около 20 часов в неделю. Обучение проходит онлайн.</li><li>Теоретическая часть будет в виде интерактивного учебника, а практические задачи выполняются по спринтам: каждые три недели — новый проект.</li><li>Воркшопы и консультации с наставниками проходят по расписанию. У студентов есть дедлайны по проектным заданиям.</li></ul><h4>👥Кому подойдет</h4><ul><li>Новичкам без опыта в IT — студентам, тем, кто хочет сменить профессию, и специалистам из смежных областей.</li><li>Техническое образование и навыки программирования не требуются, но базовый английский будет плюсом, особенно если планируете развиваться в сторону автоматизации.</li></ul><h4>🏆Возможности стажировки и трудоустройства</h4><p>После завершения программы карьерный центр помогает в трудоустройстве (доступны карьерная поддержка в течение 6+ месяцев после обучения, фриланс-трек для тех, кто хочет работать на себя, вакансии и стажировки от партнёров и мастерская проектов). В среднем, стажёры зарабатывают около 52 000 рублей, джуниоры — 76 000, мидлы — 142 000 рублей.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/20143499-8f64-456d-84d7-a9fb2f205b5f.png" alt="" /><figcaption>Отзывы студентов. Скриншот с сайта программы</figcaption></figure><h4>💸 Стоимость и условия участия</h4><ul><li>Junior-трек. Подходит для старта в тестировании. 77 000 ₽ — при полной оплате; 16 500 ₽/мес. × 5 месяцев — при рассрочке.</li><li>Расширенный трек. Тут больше практики и навыков, чтобы быстрее вырасти до мидла. 148 000 ₽ — при полной оплате; 18 500 ₽/мес. × 9 месяцев — при рассрочке.</li><li>От новичка до автоматизатора. Сразу две профессии: ручное и автоматизированное тестирование. 156 000 ₽ — при полной оплате. 20 000 ₽/мес. × 9 месяцев — при рассрочке.</li></ul><p>Перед стартом можно пройти бесплатный вводный модуль на всех треках. Также получить налоговый вычет или частично вернуть деньги, если не понравится.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/c167cf4d-f1f8-4308-ad0d-75931e3b8048.png" alt="" /><figcaption>Как выглядит вводный бесплатный модуль. Скриншот с сайта программы</figcaption></figure><h3>4. Rebrain — Мини-практикум Golang с нуля</h3><p><a href="https://rebrainme.com/golang-s-nulya/?utm_source=tproger&amp;utm_medium=post&amp;utm_campaign=devops_mako&amp;utm_content=27052025">Ссылка на курс</a></p><p>Мини-практикум от Rebrain знакомит с основами Go, включая синтаксис, работу с каналами, контекстами и микросервисами. Программа ориентирована на практическое освоение языка через выполнение задач, моделирующих реальные сценарии backend-разработки.</p><h4>📚Что получают выпускники</h4><p>Выпускники получают сертификат Rebrain, подтверждающий освоение основ Go. В программу входят более 10 практических задач, демонстрирующих навыки работы с языком и современными подходами к разработке.</p><p>Доступ к комьюнити и онлайн-мероприятиям Rebrain позволяет продолжать обучение и налаживать профессиональные связи. Теоретические материалы остаются доступными навсегда.</p><h4>🎓Длительность и формат</h4><ul><li>Курс длится около 2 недель, но продолжительность зависит от темпа студента.</li><li>Программа полностью онлайн и асинхронная, что позволяет учиться в удобное время без привязки к расписанию.</li><li>Формат текстовый, без видеолекций, с акцентом на практику (90% времени).</li></ul><p>Студенты выполняют более 10 задач, а менторы на связи для обратной связь и поддержки.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/2fcb2893-3d65-4211-a18a-2adde491fc05.png" alt="" /><figcaption>Скриншот программы практикума с сайта Rebrain</figcaption></figure><h4>👥Кому подойдет</h4><ul><li>Студентам с потенциалом для Go;</li><li>Начинающим разработчикам без практического опыта;</li><li>Специалистам из смежных IT-направлений.</li></ul><p>Здесь нужны минимальные навыки работы с системами контроля версий (GitHub/GitLab), но глубокие знания программирования не требуются.</p><h4>🏆Возможности стажировки и трудоустройства</h4><p>HR-центр Rebrain помогает выпускникам с поиском работы, предоставляя консультации по резюме и подготовке к собеседованиям.  Участники комьюнити Rebrain могут попробовать себя в хакатонах и профессиональных событиях, где легче найти работу.</p><h4>💸 Стоимость и условия участия</h4><p>Стоимость курса — 14 990 рублей при полной оплате или 1 249 рублей в месяц при рассрочке на 12 месяцев. Для поступления достаточно подать заявку через сайт; специальных требований, кроме базового понимания IT, нет. Курс подходит для самостоятельного обучения, но требует дисциплины из-за асинхронного формата.</p><h3>5. Systems.Education — Системный аналитик / Проектировщик корпоративных информационных систем</h3><p><a href="https://systems.education/systems-analyst-bootcamp?utm_source=social&amp;utm_medium=tproger&amp;utm_campaign=rp">Ссылка на курс</a></p><p>Цель программы — получить профессию системного аналитика, которая соответствует актуальным требованиям вакансий на рынке.</p><p>На курсе от Systems.Education вы за 3 месяца пройдёте реальный кейс за счёт работы с:</p><ul><li>Формальным моделированием бизнеса и бизнес-проблемы: Event Storming, BPMN, Opportunity canvas.</li><li>Разработкой пользовательских требований: Impact map, User story map, Use case diagram, Use case scenario.</li><li>Концептуальным проектированием ИТ-решений: моделирование предметной области, UML диаграмма состояний, Контекстная диаграмма, Концептуальная модель данных, Макеты приложений.</li><li>Спецификацией требований к системе: Функциональные требования к системе, Нефункциональные требования к системе, Требования к информационной безопасности, Системные алгоритмы.</li><li>Техническим проектированием ИТ-решений: Диаграмма взаимосвязи объектов, диаграммы в нотации С4, Требования к интеграции, UML диаграмма последовательности, Data flow diagram.</li></ul><h4>📚Что получают выпускники</h4><ul><li>Сертификат на основании лицензии об образовательной деятельности, подтверждающий квалификацию системного аналитика уровней 4 и 5 по российскому профстандарту.</li><li>Портфолио, включающее результаты их учебного проекта.</li><li>Демонстрацию финальных результатов кейса перед приглашенными HR и техническими специалистами из компаний-потенциальных работодателей.</li></ul><h4>🎓Длительность и формат</h4><p>Курс длится 3 месяца (200+ академических часов) и проводится полностью онлайн: 8 часов в неделю — занятия с преподавателем в Zoom, дополнительно — командные и индивидуальные созвоны с ментором. Процесс обучения осуществляется в командах, в которых участники работают над реальным кейсом.</p><p>Каждую неделю студенты взаимодействуют с заказчиком, роль которого выполняет ведущий специалист школы SE: команды проводят с ним интервью, собирают требования, выявляют проблемы бизнеса, формируют цель разработки, определяют границы проекта и утверждают концепцию решения. Под руководством ментора переходят от системного анализа к проектированию информационной системы: выбирают подходящий архитектурный паттерн и тип базы данных, проектируют поток информации через интеграции API и брокеров. Каждую неделю студенты получают обратную связь от менторов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/fba4356b-cef4-4b24-b693-1800ca41b24e.png" alt="" /><figcaption>Скриншот отзывов с сайта программы</figcaption></figure><h4>👥Кому подойдет</h4><ul><li>Не системным аналитикам, которые хотят освоить практики проектирования информационных систем и/или стать системными аналитиками.</li><li>Системным аналитикам, которые хотят получить поддержку старших коллег при отработке практик проектирования, а также систематизировать знания в области проектирования ИС.</li></ul><h4>🏆Возможности стажировки и трудоустройства</h4><ul><li>Защитите итоговый проект прямо перед HR и техспецами из компаний.</li><li>Получите портфолио из настоящих проектных документов (артефактов) — всё, что требуют работодатели на позиции младшего системного аналитика.</li><li>В течение всего обучения вас будут сопровождать менторы-практики: помогут с проектом, дадут фидбек, подготовят к собеседованиям.</li></ul><p>По статистике школы, выпускники за год могут дорасти до уровня Middle-аналитика.</p><h4>💸 Стоимость и условия участия</h4><ul><li>205 000 рублей для физических лиц</li><li>255 000 рублей для юридических лиц.</li></ul><p>Действует скидка на раннее бронирование. Потоки стартуют раз в три месяца. Для поступления требуется подать заявку через сайт. Базовые знания IT-процессов желательны, но специальных тестов нет. Гарантируется 100% возврат средств при отказе до начала обучения.</p><h3>6. Karpov.Courses — Аналитик данных</h3><p><a href="https://karpov.courses/analytics?utm_source=tproger&amp;utm_medium=partners&amp;utm_campaign=1_dscoursestartda_tproger_partners_article_course_all_ds_kc">Ссылка на курс</a></p><p>Курс от karpov.courses учит работать с Python, SQL, Power BI и другими нужными инструментами для анализа, визуализации и автоматизации. В программе много практики: решаете реальные задачи — A/B-тесты, расчёт метрик, анализ больших данных, работа с хранилищами.</p><h4>📚Что получают выпускники</h4><ul><li>Сертификат, подтверждающий освоение программы, и портфолио из более чем 10 учебных проектов, включая работу с реальными бизнес-кейсами.</li><li>Доступ к рабочей инфраструктуре и более 490 заданиям, моделирующим задачи аналитиков.</li><li>Карьерную поддержку.</li></ul><p>Материалы курса остаются доступны бессрочно.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/3c48685a-bca9-47ac-9375-9fc377a3f790.png" alt="" /><figcaption>Что предлагает программа. Скриншот с сайта Karpov.courses</figcaption></figure><h4>🎓Длительность и формат</h4><p>Курс длится 5 месяцев и проводится полностью онлайн на LMS-платформе. Студенты проходят уроки и выполняют домашние задания в удобном темпе, с ежедневной поддержкой кураторов и экспертов.</p><h4>👥Кому подойдет</h4><ul><li>Новичкам без опыта в IT, студентам, чтобы освоить аналитику данных.</li><li>Маркетологам и менеджерам, чтобы рассчитывать метрики бизнеса и их эффективность.</li><li>Специалистам с релевантным опытом (джуниорам и выше).</li></ul><p>Базовые навыки работы с данными (например, Excel или SQL) полезны, но не обязательны.</p><p>По итогу — будете уметь вытаскивать инсайты из данных, делать понятные дашборды и находить ответы для решения бизнес-задач.</p><h4>🏆Возможности стажировки и трудоустройства</h4><p>Karpov.Courses предлагает карьерную поддержку по поиску работы, чат с консультантами и доступ к вакансиям от партнеров.</p><p>Выпускники могут стать младшими аналитиками данных или Data Scientist с медианной зарплатой на старте 100–120 000 рублей, а если уровень мидл — от 180 000 рублей. По данным школы, 3 месяца — средний срок успешного трудоустройства.</p><h4>💸 Стоимость и условия участия</h4><p>Стоимость базового тарифа — 80 000 рублей при единовременной оплате. Доступна беспроцентная рассрочка на 24 месяца (платёж примерно 4 408 рублей в месяц).</p><p>Для поступления достаточно подать заявку через сайт, специальных требований или вступительных тестов нет.</p><h3>7. Нетология — Инженер по тестированию</h3><p><a href="https://netology.ru/programs/qa-middle#/program_variants">Ссылка на курс</a></p><p>Инженер по тестированию (QA-инженер) отвечает за проверку качества программного обеспечения, выявляя ошибки в веб-приложениях, мобильных сервисах и API. Курс от Нетологии обучает ручному и автоматизированному тестированию, включая работу с инструментами и языками программирования (Python, Java, JavaScript).</p><p>Программа предлагает три трека:</p><ul><li>«Ручное тестирование» для новичков;</li><li>«QA-инженер уровня Junior» с основами автоматизации;</li><li>«QA-инженер уровня Middle» с углубленным изучением JavaScript, мобильного и нагрузочного тестирования.</li></ul><p>Студенты работают над реальными кейсами от партнеров — Dragons, OneTwoTrip и GOD.</p><h4>📚Что получают выпускники</h4><ul><li>Диплом о профессиональной переподготовке и портфолио из 5 крупных проектов, включая тестирование сайтов, веб-сервисов, приложений и командный дипломный проект.</li><li>Программа включает до 74 практических заданий, моделирующих реальные задачи тестировщиков.</li><li>Карьерная поддержка предусматривает тестовые собеседования, помощь в составлении резюме и возможность стажировки у партнеров.</li><li>Дополнительно студенты проходят воркшоп по применению нейросетей для автоматизации задач.</li></ul><p>Материалы курса доступны в личном кабинете навсегда.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/0c758546-2119-4983-b661-2b66ba079d76.png" alt="" /><figcaption>Обещают официальный диплом. Скриншот с сайта курса</figcaption></figure><h4>🎓Длительность и формат</h4><ul><li>Курс проводится полностью онлайн, длительность зависит от трека: в среднем, 4–6 месяцев.</li></ul><ul><li>Занятия включают вебинары по расписанию (не чаще 2 раз в неделю после 19:00 МСК), видеолекции, тесты и практические задания.</li></ul><ul><li>На обучение требуется 8–10 часов в неделю. Формат сочетает синхронные вебинары с асинхронной работой через личный кабинет.</li></ul><h4>👥Кому подойдет</h4><ul><li>Новичкам без опыта, студентам и специалистам из смежных сфер.</li></ul><ul><li>Трек Junior подходит для начинающих, интересующихся автоматизацией, а трек Middle — для тех, кто хочет углубить навыки и претендовать на более высокие позиции. Базовый английский полезен, но программирование не обязательно для старта.</li></ul><h4>🏆Возможности стажировки и трудоустройства</h4><p>Программа позволяет начать карьеру в ручном тестировании уже через 2 месяца обучения, на фрилансе или в найме.</p><p>Выпускники трека Junior могут начать карьеру младших QA-инженеров (медианная зарплата около 76 000 рублей), а трека Middle — на более сложные роли с зарплатой от 142 000 рублей.</p><h4>💸 Стоимость и условия участия</h4><p>Стоимость зависит от трека (цены указаны с учетом скидки 40%):</p><ul><li>Ручное тестирование: 56 700 рублей (или 2 487 рублей/мес. на 24 месяца)</li><li>QA-инженер уровня Junior: 105 000 рублей (или 3 070 рублей/мес. на 36 месяцев).</li><li>QA-инженер уровня Middle: 130 500 рублей (или 3 816 рублей/мес. на 36 месяцев).</li></ul><p>Для поступления нужно подать заявку через сайт, вступительных тестов нет. Возможен возврат средств в течение 7 дней, если курс не подошел.</p><h2>Как выбрать правильный курс под себя?</h2><p>Выбор IT-курса в 2025 году зависит от ваших интересов, доступного времени и бюджета. Собрали таблицу, чтобы помочь сориентироваться среди представленных программ.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/0b69693c-0870-4afb-ae44-921e6856ade6.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-11/4a01e788-550b-4e34-adba-e1ff701d9527.png" alt="" /></figure><h2>FAQ: частые вопросы от новичков</h2><h3>Можно ли войти в IT без высшего образования?</h3><p>Да, можно. Но в некоторых крупных компаниях или госструктурах формальное образование может быть требованием. Если нет профильного образования, стоит выбирать курсы с сильной практической базой и поддержкой трудоустройства.</p><h3>Реально ли устроиться после курсов?</h3><p>Да, но результат зависит от трёх факторов: качества курса, вашей активности и текущего спроса на рынке труда.</p><h3>Что выбрать: универсальный курс или узкую специализацию?</h3><p>Зависит от вашей подготовки:</p><ul><li>Универсальный курс: подходит новичкам. Дает обзор направлений, помогая выбрать специализацию. Минус — знания менее глубокие.</li><li>Узкая специализация: для тех, кто знает, чего хочет. Дает глубокие навыки для конкретной роли, но требует начальной базы или четкой цели.</li></ul><p>Так НЕ надо:</p><ul><li>Брать узкую специализацию «потому что все советуют», без анализа своих склонностей (например, идти в кибербезопасность, хотя нравится работа с данными).</li><li>Выбирать универсальный курс в надежде потом определиться — это растягивает сроки выхода на рынок.</li></ul><p>Новичкам лучше начать с универсального курса, чтобы понять рынок, а затем углубиться в нишу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Топ-7 самых тупых хакерских атак в истории</title>
      <link>https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii</link>
      <comments>https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii</guid>
      <description><![CDATA[<p>Самые нелепые хакерские атаки в истории. Взлом через аквариум, звуковая атака ядерного объекта, загрузка отпечатков в систему и другие атаки. Ошибки и просчеты хакеров. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii">Топ-7 самых тупых хакерских атак в истории</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Оружие]]></category>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Jun 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте типичного хакера. Наверняка перед глазами возникает образ компьютерного вундеркинда в капюшоне, чьи пальцы порхают по клавиатуре, взламывая серверы Пентагона между глотками энергетика. Но реальность куда прозаичнее: большинство киберпреступников — не мифические кудесники, а обычные люди, которые иногда умудряются облажаться так эпично, что их провалы достойны отдельного топа.</p><p>В мире, где большинство успешных атак происходит из-за банальных ошибок вроде слабых паролей или непропатченного софта, находятся «особые» экземпляры. Те, кто взламывает дорожные знаки, чтобы предупредить о зомби-апокалипсисе, крадет данные клиентов, работая в отделе кибербезопасности, оставляет цифровые отпечатки там, где даже новичок догадался бы их удалить.</p><p>Эти семь историй — не просто сборник курьезов. Они наглядно показывают: главная уязвимость любой системы (не обязательно цифровой) — человеческая глупость. И хорошо, что хотя бы некоторые злоумышленники тоже подчиняются этому правилу.</p><h2>Семерка самых нелепых хакерских атак</h2><p>Хакерские атаки обычно ассоциируются с высокотехнологичными схемами и тонкими методами взлома, но иногда злоумышленники совершают настолько абсурдные вещи,  что остается только разводить руками. Одни попадаются из-за детских ошибок, другие — из-за нелепой самоуверенности, третьи умудряются навредить сами себе.</p><p>Перед вами семь самых нелепых и странных кибератак в истории — от «Годзиллы» на дорожных знаках до злоумышленников, загрузивших собственную биометрию в систему безопасности.</p><h3>Взлом казино через аквариум</h3><p>В 2017 году один из западных игорных домов (название до сих пор не раскрыто) стал жертвой атаки, которая больше похожа на сценарий абсурдного кибертриллера. Злоумышленники пробрались в сеть казино… через аквариум. Обычный, с рыбками.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-21/b206d2c6-e7e9-4f55-87d7-1e20e5e272c1.jpg" alt="" /></figure><h3>IoT-термометр как дыра в безопасности</h3><p>В холле заведения стоял «умный» аквариум с подключенными датчиками — они следили за температурой воды, уровнем чистоты и даже автоматически сбрасывали корм. Казалось бы, безобидная техника для ухода за рыбками. Но проблема в том, что эти сенсоры были частью внутренней сети казино.</p><p>Хакеры нашли уязвимость в IoT-устройстве (скорее всего, использовали стандартный пароль или эксплойт для устаревшей прошивки) и через него проникли в систему. Как позже рассказали эксперты, взломщики не просто получили доступ к аквариуму — они провели разведку, нашли другие слабые места и добрались до базы данных высокодоходных клиентов — так называемых «китов» (тоже улов своего рода).</p><h4>10 ГБ данных и финский сервер</h4><p>Зараженный термометр стал точкой входа, но дальше атака развивалась уже по классическому сценарию:</p><ul><li>сканирование сети — хакеры искали узлы с уязвимостями;</li><li>перемещение по системе — получив привилегии, они добрались до ценных данных;</li><li>эксфильтрация — украденная информация (около 10 ГБ) ушла на сервер в Финляндии.</li></ul><p>Самое забавное — после этого следы обрываются. Данные не всплыли в даркнете, их не пытались продать. Возможно, это была разведка перед более масштабной атакой, но сами злоумышленники так и не объявились. Спрашивается: зачем?</p><p>Почему это вообще сработало:</p><ul><li>Безопасность IoT в 2017 году была мифом. Умные устройства были в новинку, их редко обновляли, защищали слабыми паролями или просто забывали изолировать от корпоративной сети.</li><li>Человеческий фактор. Кто-то в казино решил, что датчик для рыб не нуждается в серьезной защите. Ошибка.</li><li>Отсутствие сегментации сети. Аквариум оказался в той же сети, что и база с данными клиентов.</li></ul><h4>Что изменилось с тех пор</h4><p>Случай с казино стал хрестоматийным примером рисков IoT. Сейчас компании чаще изолируют умные устройства в отдельных сегментах сети, запрещают дефолтные пароли и мониторят аномальную активность.</p><p>Но проблема не исчезла. В 2021 году, например, хакеры взломали систему очистки бассейна в отеле через уязвимый контроллер — и снова получили доступ к внутренним серверам.</p><p>Эта история — идеальный пример того, как человеческая беспечность и плохая настройка техники приводит к курьезным, но опасным взломам. Если ваша компания до сих пор считает, что умный чайник или датчик температуры не угрожают безопасности, вспомните казино с аквариумом. Возможно, прямо сейчас ценные данные уплывают вместе с рыбками.</p><h3>Соискатель с креативным подходом</h3><p>В 2010 году венгерский программист Аттила Немет совершил, пожалуй, самый нелепый карьерный маневр в истории киберпреступлений. Вместо того чтобы отправить резюме в отдел кадров, он взломал систему безопасности сети отелей Marriott — чтобы потом предложить свои услуги по ее защите. Получилось не совсем так, как он планировал.</p><h4>Вирус вместо сопроводительного письма</h4><p>25-летний Немет, судя по всему, искренне считал себя «белым хакером». Его план выглядел так:</p><ol><li>Взломать Marriott, показав уязвимости.</li><li>Предложить компании свои услуги по устранению этих дыр.</li><li>Получить работу в отделе кибербезопасности.</li></ol><p>Для первого пункта он выбрал классическую схему: фишинговые письма с вредоносными вложениями. Кто-то из сотрудников отеля открыл файл — и Немет получил доступ к внутренним системам. Он скопировал конфиденциальные данные, включая информацию о клиентах, но не стал их продавать или публиковать. Вместо этого хакер связался с Marriott и… предложил себя в качестве спасителя.</p><h4>«Ваша защита слабая — возьмите меня на работу»</h4><p>По версии следствия, Немет напрямую заявил представителям компании: он готов раскрыть все уязвимости, если его возьмут в штат. В Marriott идею не оценили. Вместо HR-менеджера с ним начал переписку сотрудник Секретной службы США, представившись «заинтересованным руководителем».</p><p>Хакер, не заметив подвоха, подробно описал методы взлома и даже согласился прилететь в США для личной встречи. В аэропорту его ждали не потенциальные коллеги, а полиция.</p><p>Почему это провалилось:</p><ul><li>Криминал ≠ пентест. Настоящие «этичные хакеры» не крадут данные перед тем, как предложить услуги.</li><li>Наивность. Немет всерьез верил, что компания простит взлом ради его навыков.</li><li>Юридическая безграмотность. Венгр не учел, что в США за такое сажают, даже если «хотел как лучше».</li></ul><p>Немета приговорили к 2,5 годам тюрьмы — относительно мягко, учитывая потенциальный срок за кражу данных. Marriott потратил около $1 млн на расследование и усиление защиты. Сам хакер, выйдя на свободу, исчез из публичного поля. По некоторым данным, он все же устроился в IT — но уже без креативных «испытательных заданий».</p><h4>Что было не так с его планом?</h4><p>Эксперты отмечают несколько фатальных просчетов:</p><ul><li>Нелегальный вход. Даже если цель благая, несанкционированный доступ остается преступлением.</li><li>Доказательства кражи. Скопировав данные, Немет автоматически стал нарушителем закона — никакие благие намерения это не отменяли.</li><li>Доверие к анонимам. Переписка с Marriott велась через анонимные сервисы, но хакер почему-то поверил, что это официальные представители.</li></ul><p>Как надо было поступить? Если бы Немет действительно хотел помочь и устроиться на работу, ему стоило:</p><ol><li>Найти уязвимости, не получая доступа к данным.</li><li>Связаться через официальный канал с ответственными за безопасность.</li><li>Предложить исправления, приложив резюме.</li></ol><p>Так делают настоящие исследователи — и их не арестовывают в аэропортах.</p><h4>Мораль для соискателей</h4><p>Эта история — отличный пример того, как не стоит искать работу в кибербезопасности. Хотите показать навыки? Участвуйте в баг-баунти программах, где взлом разрешен правилами. Мечтаете о карьере «белого хакера»? Получайте сертификаты, а не судимости.</p><p>Немету повезло: отделался небольшим сроком. Со следующим «креативщиком» могут поступить гораздо жестче.</p><h3>Тупейший взлом в истории: просчитались, но где?</h3><p>В 2018 году группа «киберпреступников» (если их можно так назвать) совершила то, что эксперты единогласно признали самым идиотским взломом десятилетия. Их план выглядел как сценарий для пародийного фильма: чтобы украсть товары со склада, они… загрузили свои отпечатки пальцев в охраняемую базу данных.</p><h4>Хакеры против сканеров: кто кого?</h4><p>Все началось с того, что преступники нацелились на склады компании, производящей предметы роскоши. Система безопасности использовала биометрические сканеры — без правильного отпечатка пальца внутрь не попасть.</p><p>Первая идея была в духе голливудских блокбастеров: отключить сканеры удаленно. Но тут злоумышленников ждало разочарование. Оказалось, что сканеры контролируются ИИ, который заметит любые манипуляции, а физическое отключение сразу вызовет тревогу. Тогда группа перешла к «плану Б» — и вот здесь началось самое интересное.</p><h4>«Давайте добавим свои отпечатки в базу!»</h4><p>Вместо того чтобы искать обходные пути, хакеры решили действовать напролом:</p><ol><li>Взломали базу данных с отпечатками сотрудников.</li><li>Удалили несколько «лишних» слепков.</li><li>Загрузили туда свои собственные пальцы.</li></ol><p>Логика была проста: сканер запрашивает базу, видит «своих» и открывает дверь. Что могло пойти не так?</p><p>Почему это был худший план в истории:</p><ol><li>Отпечатки — это улика. В отличие от анонимных логинов, пальцы нельзя сменить или стереть.</li><li>База синхронизировалась с архивами. Удаленные отпечатки не исчезли навсегда — их восстановили за минуты.</li><li>Сотрудники заметили пропажу. Когда люди перестали проходить сканеры, охрана забеспокоилась раньше, чем воры добрались до склада.</li></ol><p>Система безопасности компании не просто хранила отпечатки — она вела журнал всех изменений. Как только хакеры загрузили свои данные, ИИ отметил неавторизованный доступ к базе, подозрительные правки и самое главное — новые отпечатки, которых нет в кадровых документах. Полиция сравнила свежие «слепки» с криминальной базой и нашла полное совпадение. Всех участников группы задержали в течение суток.</p><h4>Что не так с их логикой?</h4><p>Эксперты до сих пор удивляются, как вообще можно было придумать такой план:</p><ul><li>Биометрия = паспорт. Даже начинающие хакеры знают: подделывать отпечатки — все равно что оставлять автограф на месте преступления.</li><li>Резервные копии. Любая серьезная система делает бэкапы. Удалить данные навсегда практически невозможно.</li><li>Слишком много шагов. Проще было взломать дверь кувалдой, чем лезть в базу.</li></ul><p>Что стало с «гениями»:</p><ul><li>Главарь группы получил 4 года за взлом и кражу данных.</li><li>Компания усилила защиту, добавив двухфакторную аутентификацию для доступа к биометрии.</li><li>Этот случай теперь разбирают на курсах кибербезопасности как пример «как не надо делать».</li></ul><p>Мораль для будущих хакеров: Если ваш план включает пункт «загружаем свои отпечатки», он точно провалится. Иногда старомодный взлом замка — куда более разумный выбор.</p><h3>Рок против ядерки: как хакеры заставили ядерный объект играть AC/DC</h3><p>Если бы кто-то в 2012 году предложил иранским инженерам послушать хард-рок вместо ночной смены, они бы наверняка отказались. Но хакеры не спрашивали разрешения.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-21/3d9dee02-e29f-44e7-8411-e6b27d159961.jpg" alt="" /></figure><p>Летом того года на двух ядерных объектах Ирана внезапно заиграла «Thunderstruck» — культовая песня легендарной группы AC/DC. Громкость была выставлена на максимум, динамики орали «THUN-DAH!» в ночной тишине, а персонал никак не мог это остановить. Так, вирус Stuxnet, уже хорошо известный в мире кибербезопасности, добавил к своей репутации еще и музыкальный троллинг.</p><h4>Взлом с саундтреком</h4><p>Stuxnet — один из самых сложных червей в истории. Его создавали для физического разрушения оборудования: он менял скорость вращения центрифуг, на которых иранцы обогащают уран, выводя их из строя, и маскировал атаку, подделывая данные мониторинга. Но в какой-то момент кто-то решил, что просто ломать машины — скучно.</p><p>Анонимный сотрудник иранской АЭС написал исследователю Микко Хиппонену: система управления периодически отключалась, а из динамиков гремел AC/DC. Тегеран официально отрицал инцидент, но детали всплыли в переписке техников. Вирус явно модифицировали — помимо основной нагрузки, он включал медиаплеер и запускал трек в случайное время.</p><p>Почему именно «Thunderstruck»? Возможно, из-за названия: «Пораженный громом» звучало как намек на ядерный удар. Или потому, что гитарный рифф идеально подходил для психологического давления.</p><h4>Кто стоял за атакой?</h4><p>Stuxnet приписывают совместной разработке США и Израиля (<a href="https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%C2%AB%D0%9E%D0%BB%D0%B8%D0%BC%D0%BF%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B%C2%BB">операция «Олимпийские игры»</a>). Но музыкальный «апгрейд» — дело рук других исполнителей.</p><p>Эксперты предполагают, что это могли сделать:</p><ul><li>гражданские хакеры — в знак протеста против ядерной программы;</li><li>внутренние саботажники — чтобы деморализовать персонал;</li><li>сами разработчики Stuxnet — в качестве «пасхального яйца».</li></ul><p>Интересно, что атака совпала с ужесточением санкций против Ирана. Громкий рок стал своеобразным медийным сигналом: «Мы контролируем ваши системы».</p><p>Обычно хакеры стараются оставаться незамеченными. Здесь же они:</p><ul><li>использовали уязвимость Windows (CVE-2010-2568) для распространения;</li><li>внедрили двойную нагрузку: саботаж плюс звуковое воздействие;</li><li>не стали скрывать факт взлома — будто хотели, чтобы об этом говорили.</li></ul><p>Для воспроизведения музыки вирус либо содержал MP-файл внутри кода, либо скачивал его с зараженного сервера. Версия с AC/DC так и не была найдена в открытых образцах Stuxnet — возможно, ее «дорабатывали» уже на месте.</p><h4>Последствия: смех или паранойя?</h4><p>Иранские власти заявили, что атака не нанесла ущерба. Но психологический эффект переоценить сложно:</p><ul><li>персонал не мог отключить музыку — только глушил динамики физически;</li><li>трек включался ночью, нарушая режим работы;</li><li>слухи о взломе подрывали доверие к системе безопасности.</li></ul><p>Этот случай вошел в историю не только из-за технической стороны, но и из-за абсурдности. Хакеры доказали: даже в кибервойне есть место черному юмору.</p><p>Stuxnet стал первым вирусом, который физически разрушал инфраструктуру. А его музыкальная версия показала, что хакеры умеют добывать не только данные, но и портить нервы. Говорят, после этого случая иранские ядерные объекты перешли на компьютеры без звуковых карт. Но это уже другая история.</p><h3>«Годзилла нападает!»: цифровой хаос на дорогах США</h3><p>В 2014 году водители в Сан-Франциско получили необычное предупреждение: электронное табло на трассе внезапно замигало сообщением «GODZILLA ATTACK – TURN BACK!». Никакой паники не случилось — большинство решило, что это чья-то шутка. Но за этим стояла реальная хакерская атака, которая вскрыла уязвимости критической инфраструктуры.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-21/e608e9ce-d461-4f0b-9c06-ac91363930d9.jpg" alt="" /></figure><h4>Как взламывали дорожные знаки</h4><p>Электронные дорожные табло в США управлялись (а возможно, управляются до сих пор) через примитивные системы, часто с заводскими паролями вроде «admin» или «1234». Хакеры, обнаружившие эту лазейку, подключались к знакам через открытые порты или уязвимости в протоколах. Иногда даже не требовалось сложных инструментов — достаточно было мобильного модема и стандартного ПО для управления сетевыми устройствами.</p><p>После взлома злоумышленники меняли сообщения на абсурдные: предупреждали о зомби-апокалипсисе, просили «спасти заложников на фабрике знаков» или просто выводили бессмысленный набор символов. В Техасе, например, однажды появилось сообщение: «СЛЕДИТЕ ЗА ДОРОГОЙ, А НЕ ЗА ТЕЛЕФОНОМ» — ироничный намек на проблему невнимательности, которая как раз и позволила хакерам провести атаку.</p><h4>Почему это стало возможным?</h4><p>Основная причина — беспечность муниципальных служб. Многие дорожные системы десятилетиями работали на устаревшем ПО, а пароли к ним никогда не менялись. Как позже выяснилось, часть оборудования даже не была защищена брандмауэрами.</p><p>Федеральное управление автомобильных дорог США (FHWA) после инцидента выпустило рекомендации по усилению безопасности, но исправлять ситуацию пришлось годами. В 2016 году исследователи из Университета Мичигана провели аудит дорожной инфраструктуры и обнаружили, что 40% систем по-прежнему уязвимы к простейшим атакам.</p><h4>Последствия и уроки</h4><p>К счастью, никто не пострадал — большинство водителей просто игнорировали странные сообщения. Однако атака показала, как легко можно посеять хаос, если критическая инфраструктура не защищена.</p><p>Сейчас подобные взломы стали редкостью, но не исчезли полностью. В 2020 году в Огайо хакеры вывели на табло фразу «COVID-19 — это обман», а в 2022-м в Калифорнии знаки призывали «готовиться к вторжению пришельцев».</p><p>Главный вывод прост: даже самые невинные устройства, подключенные к сети, могут стать оружием в руках злоумышленников. И если дорожные знаки взламывают ради шутки, то что мешает кому-то устроить настоящий хаос?</p><h3>«Этичный хакер» с двойной жизнью: как специалист по безопасности стал киберпреступником</h3><p>Пепейн Ван дер Стап выглядел идеальным кандидатом для работы в сфере кибербезопасности — молодой, талантливый, увлеченный технологиями. Днем он помогал компаниям защищать данные, а ночью взламывал их, сливая конфиденциальную информацию на даркнет-форумы. Его арест в 2023 году стал одним из самых громких случаев двойной игры в IT-индустрии.</p><h4>Как его поймали</h4><p>Все началось с жалобы амстердамской компании, которая обнаружила утечку данных. Расследование привело к Ван дер Стапу — сотруднику Hadrian Security, фирмы, специализирующейся на пентестах (тестировании систем безопасности) и защите от кибератак. Злая ирония в том, что он сам годами использовал те же инструменты, которые по задумке должны были защищать системы от взлома.</p><p>Следствие выяснило, что с 2020 по 2023 год оборотень с ноутбуком и его сообщники взломали десятки компаний, вымогали деньги под угрозой утечки данных и заработали на этом более 2,6 млн евро. При обыске у Ван дер Стапа нашли базы с персональными данными миллионов людей, готовые для продажи на RaidForums и BreachForums — двух крупнейших хакерских площадках, ныне закрытых.</p><h4>Почему он это делал?</h4><p>В интервью DataBreaches.net Ван дер Стап утверждал, что начал заниматься взломами до работы в кибербезопасности, а потом «хотел завязать». Но цифры говорят обратное: его активность совпадала с периодом трудоустройства в Hadrian Security. Возможно, доступ к внутренним данным клиентов сделал атаки проще.</p><p>Его мотивы банальны — деньги и азарт. Он продавал украденные данные, торговал доступом к корпоративным сетям и даже консультировал других хакеров. При этом успел поработать волонтером в Голландском институте раскрытия уязвимостей (DIVD), что добавляет ситуации еще немного абсурда.</p><h4>Что не сработало в его схеме</h4><p>Главная ошибка Ван дер Стапа — уверенность в анонимности. Он использовал ники вроде «Espeon» и «Rekt», но криптовалютные транзакции и логи подключений его выдали. В 2023 году правоохранители синхронизировали данные с закрытых форумов и вышли на него.</p><p>Еще один провал — масштаб. Он не ограничился мелкими взломами, а атаковал крупные компании, привлекая внимание регуляторов. Когда ущерб исчисляется миллионами, следствие действует жестче.</p><h4>Последствия и уроки</h4><p>Суд дал ему 4 года тюрьмы. Но важнее другое: случай показал, как легко «белые» хакеры могут скатиться в преступность. Компании до сих пор плохо проверяют сотрудников, работающих с критической инфраструктурой.</p><p>После этого скандала в Нидерландах ужесточили контроль за специалистами по кибербезопасности. Например, Hadrian Security ввела аудит действий сотрудников, а DIVD теперь требует раскрытия прошлой активности волонтеров.</p><h3>Как хакеры качали топливо с АЗС обычным пультом</h3><p>В 2019 году во Франции раскрыли аферу, больше похожую на сценарий криминальной комедии, чем на реальное преступление. Группа из пяти человек за год украла более 120 тысяч литров бензина, используя… обычный пульт управления заправочной колонкой.</p><h4>Пароль «0000» — мечта хакера</h4><p>Все началось с того, что злоумышленники обнаружили: на некоторых АЗС Total топливные колонки защищены стандартным PIN-кодом «0000». Персонал заправок не удосужился его изменить, а производитель оборудования не требовал обязательной смены пароля при вводе в эксплуатацию.</p><p>Купив на теневых форумах сервисный пульт (предназначенный для технического обслуживания), преступники научились разблокировать колонки без оплаты, обнулять стоимость топлива, отключать лимиты на подачу горючего.</p><p>Группа работала слаженно. Первый автомобиль подъезжал к АЗС – водитель с помощью пульта «взламывал» колонку. Затем подъезжал фургон с цистерной и закачивал до 3000 литров за раз.</p><p>Украденное топливо сбывали через соцсети по заниженным ценам. За год схема принесла им около $170 000, пока полиция не вышла на след. В этом случае тупыми оказались не столько хакеры, которые не особенно даже скрывались, а сотрудники безопасности, допустившие подобный беспредел. Тупым был способ, но не результат.</p><p>Почему это сработало:</p><ul><li>Халатность — Total подтвердила, что на оборудовании использовались заводские настройки.</li><li>Отсутствие контроля — на небольших АЗС пропажу замечали только через недели.</li><li>Уязвимость ПО — колонки считали «просто железом», но их софт оказался уязвим.</li></ul><p>Всех пятерых задержали за кражу и взлом. Total экстренно обновила прошивки и обязала менять пароли.</p><p>Как оказалось, это был не единичный подобный случай.  В 2021 году в США хакеры через уязвимость в ПО вызвали дефицит бензина на Восточном побережье. А в 2023-м исследования показали, что 20% европейских АЗС до сих пор используют устаревшее ПО.</p><h4>Технические детали</h4><p>Преступники использовали пульт Gilbarco Passport — стандартное устройство для обслуживания колонок. Его можно было купить на eBay за $300-500. Подключившись через ИК-порт, система запрашивала PIN-код, который часто оставался заводским.</p><p>Новые модели уже имели принудительную смену пароля при первом запуске, ограничение попыток ввода кода, систему оповещений о подозрительной активности.</p><h4>Как защититься?</h4><p>Владельцам АЗС эксперты рекомендуют обязательно менять стандартные пароли, регулярно обновлять ПО, устанавливать камеры с аналитикой и сегментировать сеть, изолируя колонки.</p><p>Этот случай — идеальный пример, как халатность открывает двери для примитивных, но прибыльных атак. Если ваш бизнес использует IoT-устройства, проверьте — возможно, они до сих пор на пароле «0000»?</p><h2>Итоги</h2><p>Эти истории доказывают: даже в мире высоких технологий человеческий фактор остается главной уязвимостью. Хакеры, о которых мы рассказали, обладали навыками, но им не хватило элементарной логики. Одни забывали скрыть следы, другие выбирали абсурдные цели, третьи — сами себя подставляли.</p><p>Главный урок? Безопасность — это не только сложные алгоритмы, но и здравый смысл. И если даже злоумышленники порой действуют настолько нелепо, то компаниям точно не стоит расслабляться. В конце концов, следующий «гений» может оказаться чуть удачливее — или чуть менее смешным.</p><p>Когда код уже не компилится, остаётся только смеяться. Самые айтишные мемы <a href="https://t.me/+9NN_uyMiOas5NWU6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Цель — ваша компания: как защитить данные от кибератак</title>
      <link>https://tproger.ru/articles/cel---vawa-kompaniya--kak-zashhitit-dannye-ot-kiberatak</link>
      <comments>https://tproger.ru/articles/cel---vawa-kompaniya--kak-zashhitit-dannye-ot-kiberatak?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/cel---vawa-kompaniya--kak-zashhitit-dannye-ot-kiberatak</guid>
      <description><![CDATA[<p>Алексей Власов, партнер и коммерческий директор ИТ-интегратора Notamedia, рассказывает, с какими киберугрозами сталкиваются B2B- и B2G-сектора и как организациям защитить свои данные.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/cel---vawa-kompaniya--kak-zashhitit-dannye-ot-kiberatak">Цель — ваша компания: как защитить данные от кибератак</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>Thu, 29 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Только за первый квартал 2025 года крупные отечественные компании <a href="https://www.cnews.ru/news/top/2025-05-14_v_rossii_vyroslo_kolichestvo">подверглись</a> более чем 270 млн кибератакам. В зоне риска — маркетплейсы, базы авиакомпаний и транспортных организаций. В случае успешной атаки бизнесу грозят штрафы до 15 млн рублей. Злоумышленники используют сложные схемы: от вымогателей до APT-группировок и supply chain-атак. Алексей Власов, партнер и коммерческий директор ИТ-интегратора Notamedia, рассказывает подробнее об актуальных киберугрозах и как от них защититься.</p><h2>ЦЕЛЕНАПРАВЛЕННЫЕ АТАКИ (APT-ГРУППЫ)</h2><p>APT-атака (Advanced Persistent Threat — продолжительная атака повышенной сложности) — это длительная, целенаправленная и скрытая кибератака, при которой злоумышленники получают доступ к информационным системам и остаются незамеченными, чтобы собрать конфиденциальные данные или нанести другой ущерб.</p><p>APT-атаки используются против ключевых секторов: промышленность, финансы, энергетика и госсектор. В 2024–2025 особенно активными стали китайские, северокорейские и неизвестные группировки. Целенаправленные атаки — особая категория угроз, исключительно против конкретной организации или государственного учреждения.</p><p>Цель злоумышленников —  получить разные конфиденциальные сведения: коммерческую тайну, персональные данные пользователей, материалы под грифом «секретно», данные о стеке ИТ-решений или оборудовании, стратегические документы. Нередко объектом атаки становятся системы жизнеобеспечения компаний, веб-сайты организаций или отдельные элементы ИТ-инфраструктуры.</p><h3>Как это работает</h3><p>Проникнув внутрь защищенного периметра предприятия, преступники активно исследуют само устройство, через которое удалось организовать доступ, и определяют степень уязвимости используемых в компании технологий и сервисов. Важнейшую роль играет сбор внутренних данных, находящихся на компьютерах сотрудников: файлы конфигурации, личные профили, базы данных, хранящиеся локально. Подобная информация позволяет злоумышленникам глубже понимать структуру организации и планировать дальнейшие шаги атаки.</p><h3>Как распознать и защититься</h3><h4>Фишинговые электронные письма</h4><p>Чтобы получить несанкционированный доступ к корпоративным сетям, киберпреступники часто прибегают к использованию целевого фишинга. Они проводят небольшое «расследование» и получают все нужные данные, чтобы придумать привлекательные для сотрудников заголовки писем.  В таких посланиях могут быть вредоносные вложения или ссылки с программами-шпионами, которые позволяют  злоумышленникам контролировать систему. Лучшая защита от них — повысить осведомленность сотрудников и регулярно обучать их кибербезопасности, так как подходы атак постоянно меняются.</p><h4>Скомпрометированные учетные записи</h4><p>Постоянно контролируя статистику посещаемости внутренней сети, можно заметить отклонения от привычного подключения к ней сотрудников. Например, попытки входа вне рабочего графика или повышенная активность требуют особого внимания. Особенно критично отслеживать подобные действия, если они совершаются от имени представителей топ-менеджмента, у которых есть привилегированный уровень доступа к данным. Обращайте внимание на локацию, из которой совершается подключение, и время посещения ресурса. Особо уязвимые периоды для подобных проникновений — ночь, выходные или праздничные дни, когда офис пуст и вероятность обнаружить постороннее присутствие крайне мала.</p><p>Чтобы не допустить целенаправленные атаки, нужно сегментировать сеть (разделять инфраструктуру на изолированные зоны с различными уровнями доверия, доступ между которыми строго контролируется, чтобы ограничить движение трафика) и контролировать привилегии доступа, а также внедрять Zero Trust политику.</p><h4>Перемещение данных</h4><p>Цель злоумышленников — похитить критически важную для бизнеса или госсектора информацию. Поэтому любые массовые передачи значительных объемов данных, перемещение документов между серверами или изменение места хранения файла заслуживают пристального внимания. Необходимо следить за внутренними потоками данных, а также подключением внешних устройств и активностью отправки данных за пределы защищенного корпоративного периметра. Регулярно отслеживайте соединения с внешними ресурсами, обращайте особое внимание на нестандартные подключения.</p><h2>ШИФРОВАЛЬЩИКИ / ВЫМОГАТЕЛИ (RANSOMWARE)</h2><p>Подобные программы продолжают вызывать сбои работы предприятий, особенно в секторах ритейла и промышленности. В прошлом году число атак с помощью шифровальщиков увеличилось на <a href="https://www.rbc.ru/technology_and_media/16/12/2024/675ed7419a79475fb7eb1cb3">44%</a>.</p><p>Примечательно, что в каждом десятом таком инциденте злоумышленников интересовала не кража данных с целью получения выкупа, а намеренное нанесение максимального вреда выбранному для атаки объекту.</p><p>Цели — шантаж и нарушение работы сервисов. С помощью вирусов-вымогателей киберпреступники ежегодно зарабатывают порядка 2 миллиардов долларов. В большинстве случаев злоумышленники, используя вирусы-шифровальщики, блокируют доступ к важным данным на устройстве, вынуждая платить за восстановление. Обычно такие программы запрещают владельцам пользоваться собственными файлами и информацией до момента уплаты требуемого выкупа. Однако обещанный возврат доступа не гарантируется — зачастую злоумышленники нарушают данное слово.</p><p>Наряду с прямыми денежными убытками, жертвы сталкиваются с серьезными последствиями в виде сбоев в работе ИТ-инфраструктуры, падения продуктивности и сильного психологического напряжения. Дополнительно киберпреступники нередко шантажируют потерпевших раскрытием приватных данных или продажей ценной информации третьим лицам.</p><h3>Как это работает</h3><p>Излюбленный метод злоумышленников — социальная инженерия: один из работников компании, не распознав угрозу, переходит по специально подготовленной фальшивой ссылке и автоматически устанавливает вредоносное ПО, обеспечивая нелегальный доступ к чувствительным данным компании.</p><h3>Как распознать и защититься:</h3><ul><li>Один из первых признаков заражения вирусом-вымогателем — потеря доступа к файлам, базам и документам. Пользователь замечает, что некоторые из них неожиданно перестали открываться или требуют ввода пароля несмотря на отсутствие настроек парольной защиты.</li><li>Другой яркий признак — появление незнакомых расширений у инфицированных файлов, например, “.locked” или “.encrypted”. При этом обычные программы перестают распознавать и открывать такие объекты.</li><li>Кроме того, в затронутых папках начинают появляться специальные инструкции, подробно объясняющие процедуру восстановления данных и требования к выплате компенсации за разблокировку.</li><li>Рабочий стол компьютера также может подвергнуться изменениям: стандартная картинка заменяется сообщением с предупреждением о шифровании данных и требованиями о предоставлении выкупа.</li><li>Наконец, антивирусные решения и прочие инструменты информационной безопасности могут подавать тревожные сигналы о наличии подозрительных процессов и действий в операционной системе.</li></ul><p>Во всех перечисленных случаях не рекомендую идти на поводу у злоумышленников и спешить уплачивать требуемую сумму. Сначала проверьте в открытом доступе, нет ли декриптора, который помог бы вам расшифровать файлы. Есть как платные, так и бесплатные программы, однако не все они могут расшифровать изощренные пароли вредителей. Лучше вложить средства в превентивные меры защиты от действий RANSOMWARE. Например:</p><ul><li>Регулярно создавать архивные копии критически важных файлов. Наличие дубликатов ваших данных на дополнительном жестком диске или в облаке позволит восстановить информацию после устранения угрозы шифровальщика.</li><li>С осторожностью открывать вложения в письмах от неизвестных отправителей, избегать переходов на ненадежные сайты и загрузок программного обеспечения с посторонних источников. Нужно доверять только официальным магазинам приложений и страницам производителей.</li><li>Использовать качественное антивирусное ПО для дополнительной защиты устройства или EDR-системы.</li><li>Обновлять ПО и операционные системы на постоянной основе.</li><li>Обучать персонал основам информационной безопасности.</li></ul><h2>АТАКИ НА ЦЕПОЧКУ ПОСТАВОК (SUPPLY CHAIN ATTACKS)</h2><p>Прогнозируется, что к 2031 году убытки компаний от атак на  цепочки поставок программного обеспечения <a href="https://go.cyberproof.com/hubfs/CyberProof_2025_Global_Threat_Intelligence_Report.pdf">увеличатся</a> до колоссальных 138 миллиардов долларов ежегодно, превысив показатели предыдущих лет: 60 миллиардов долларов в 2025-м и 46 миллиардов долларов в 2023 году, учитывая постоянный годовой прирост на 15%.</p><p>Supply chain attack — относительно новый тип угроз, который нацелен на разработчиков ПО и поставщиков услуг или технологий. Они вошли в перечень наиболее распространенных угроз только в прошлом году из-за увеличившегося в три раза числа инцидентов по сравнению с 2023 годом.</p><p>Злоумышленники используют эти атаки, чтобы получить доступ к исходному коду, процессам разработки или механизмам обновления и распространить вредоносное ПО, заразив установленные программы.</p><p><b>Цели: </b></p><ul><li>Дестабилизация деятельности компании — утечка конфиденциальных данных способна нанести удар по репутации и финансам, создать юридические риски.</li><li>Общественная реакция — распространение фейков или компромата через соцсети формирует негативный фон вокруг компании и подрывает доверие клиентов.</li><li>Информационное давление на сотрудников — персонал компании подвергается угрозам раскрытия личной информации или шантажу, вынуждая руководство идти на уступки ради сохранения репутации.</li><li>Шифрование данных и вымогательство — установка вредоносных программ-шифровальщиков приводит к блокировке критичных информационных активов, лишая предприятие возможности полноценно функционировать вплоть до выплаты крупного выкупа.</li></ul><h3>Как это работает</h3><p>При осуществлении атаки на поставщиков ПО злоумышленники выбирают путь наименьшего сопротивления, проникая в защищенную сеть через слабое звено — небольшую фирму-подрядчика или разработчика программного обеспечения. Подобные нападения осуществляются двумя основными способами:</p><ol><li>Компрометация службы или продукта: нападение на мелких поставщиков или партнеров, обладающих низким уровнем киберзащиты, позволяющим злоумышленнику незаметно внедряться в инфраструктуру основной фирмы. Типичный пример — компрометация ПО компании на аутсорсе, работающей с более крупным бизнесом (который и становится конечной целью атаки).</li><li>Внедрение вредоносного кода непосредственно в само ПО, распространяемое среди множества конечных потребителей. Пользователи, устанавливающие обновление, сами открывают дверь в свою ИТ-инфраструктуру для дальнейших проблем.</li></ol><h3>Как распознать и защититься</h3><p>Опознать supply chain-атаку можно, если внимательно следить за сетевой активностью — она может показать необычные подключения или передачу больших объёмов данных. Также важно постоянно мониторить действия пользователей и систем — подозрительное поведение, редкие попытки доступа или запуск необычных процессов могут быть сигналом. Ещё один способ — отслеживать изменения в файлах, чтобы заметить несанкционированные вмешательства.</p><p>Вот несколько превентивных мер, чтобы защититься от supply chain attack:</p><ul><li>Регулярно проверяйте и контролируйте контрагентов, проводите обязательную верификацию.</li><li>Используйте SBOM (Software Bill of Materials — перечень всех модулей и библиотек, необходимых для сборки программного продукта, а также указания их связи друг с другом). Он помогает команде видеть, где могут скрываться уязвимости — и заранее обновлять или заменять слабые места до того, как они станут проблемой.</li><li>Реализовывайте политику обновлений с инспекцией. Например, отключите автоматическое обновление системы и программного обеспечения, с осторожностью устанавливайте апдейты вручную и тщательно тестируйте их работу перед использованием.</li><li>Сегментируйте бизнес-процессы: так вы минимизируете возможные последствия кибератак: если одна зона подвергнется воздействию, остальные останутся надежно изолированными и сохранят свою безопасность. Сегментация помогает навести порядок в доступах: каждый видит только то, что нужно для работы — это снижает риск утечек и ошибок.</li></ul><p>Сегодня компании и организации в РФ сталкиваются не с одной, а со множеством киберугроз, которые становятся только изощреннее. Но просто реагировать на инциденты недостаточно: нужно мониторить, работать на опережение и минимизировать риски.  Поэтому подход к кибербезопасности должен быть стратегическим, техническим и операционным одновременно. Кольцевая защита, Zero Trust, повышение осведомленности персонала и контроль подрядчиков — то, без чего не обойтись.</p>]]></content:encoded>
    </item>
  </channel>
</rss>