<?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>React</title>
    <description/>
    <link>https://tproger.ru/tag/react</link>
    <atom:link href="https://tproger.ru/tag/react/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 09:29:50 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>React</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Metro 0.87.1 добавил поддержку URI-схем и исправил Fast Refresh</title>
      <link>https://tproger.ru/news/metro-0-87-1-dobavil-podderzhku-uri-shem-i-ispravil-fast-refresh</link>
      <comments>https://tproger.ru/news/metro-0-87-1-dobavil-podderzhku-uri-shem-i-ispravil-fast-refresh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/metro-0-87-1-dobavil-podderzhku-uri-shem-i-ispravil-fast-refresh</guid>
      <description><![CDATA[<p>Metro 0.87.1, сборщик JavaScript для React Native, получил поддержку собственных резолверов URI-схем, исправления Fast Refresh и более экономный FallbackWatcher.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/metro-0-87-1-dobavil-podderzhku-uri-shem-i-ispravil-fast-refresh">Metro 0.87.1 добавил поддержку URI-схем и исправил Fast Refresh</a>»</p>]]></description>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 13 Sep 2026 13:59:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Metro — сборщик JavaScript для разработчиков приложений на React Native. 13 сентября вышел Metro 0.87.1. Разработчики могут подключать собственные обработчики для спецификаторов с URI-схемой, например foo:bar, через настройку resolver.schemeResolvers. Импорты вида metro:babel-runtime/&lt;path&gt; теперь разрешаются во внутреннюю зависимость Metro от @babel/runtime.</p><p>Обновление затрагивает проекты, которые используют Metro для разработки и сборки. В релизе исправили Fast Refresh с ленивыми сегментированными бандлами, пропуск файлов, записанных в каталог во время его обхода FallbackWatcher, ошибки сокета при записи через HttpStore и обработку выражений с Platform.OS и Platform.select.</p><p>FallbackWatcher стал экономнее: потребление RSS при обходе файлов снизилось примерно на 34%, а пиковое использование heap — примерно на 41%. Также Metro отказался от зависимости image-size в пользу встроенных парсеров, чтобы устранить предупреждения CVE.</p><p>Перед обновлением стоит отдельно проверить экспериментальные настройки сериализатора и файловой карты. Авторы предупреждают, что такие возможности не покрываются правилами семантического версионирования и могут измениться без сохранения совместимости.</p><h2>Источники</h2><ul><li><a href="https://github.com/react/metro/releases/tag/v0.87.1">Release v0.87.1 · react/metro · GitHub</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Переход с React на Angular в 2026: как перестроить мышление и не сгореть</title>
      <link>https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne</link>
      <comments>https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дима Дмитриев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne</guid>
      <description><![CDATA[<p>Разбор перехода с React на Angular: архитектура компонентов, ООП вместо хуков, RxJS и поиск циклических зависимостей. Узнайте, когда брать Angular.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne">Переход с React на Angular в 2026: как перестроить мышление и не сгореть</a>»</p>]]></description>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 31 Jul 2026 05:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда я говорю, что перешёл с React на Angular обычно в ответ у коллег слишком много вопросов и ни одного ответа. Если открыть типичные статьи, там везде предлагают React, Next.js и React Native. Про переход с Angular на React вы наверняка уже читали и смотрели много гайдов, а вот обратный путь почти никто не описывал.</p><p>Мне пришлось разбираться самому, когда я пришёл на новый проект, где на этапе знакомства с системой я понял: сделать её на React технически можно, но нужно постоянно собирать структуру с нуля. Angular с его сложной архитектурой, сервисами и строгой типизацией казался оптимальным решением для такого масштаба.</p><p>Теоретически получить базовое понимание фреймворка можно за десять дней курсов, но у меня ушло минимум полтора месяца, чтобы перестать мысленно переводить конструкции React на Angular и начать просто писать код.</p><h2>Разделение ответственности и файловая структура</h2><p>Главный сдвиг в голове при переходе с React — смена подхода, где компоненты несут всю нагрузку, на архитектуру, построенную на классах и ООП. В React привыкаешь думать компонентами: каждый кусок интерфейса представляет собой функцию, которая принимает пропсы и возвращает разметку. Вся логика и JSX-шаблон живут в одном файле, всё плоское и перед глазами. В Angular приходится перестраиваться и думать объектами и иерархиями.</p><p>Разделение на файлы поначалу вызывает раздражение. Вместо одного файла здесь сразу три: отдельный HTML-шаблон, стили и TypeScript-класс компонента, взаимодействующие через декораторы. Если нужно сделать маленький компонент-иконку для рендеринга SVG, Angular всё равно потребует три файла. Инлайн-шаблоны сделать можно, но это считается плохой практикой. Переключение между файлами поначалу отвлекает, но когда шаблон становится большим и сложным, работать с ним как с отдельным документом оказывается удобно.</p><p>Проект в Angular организуется по строгой структуре: сначала выделяются библиотеки (libs), внутри них — фичи (features), и только внутри фич живут компоненты. В React всё обычно проще и ограничивается папками с компонентами, которые используют друг друга.</p><h2>От функций и хуков к ООП и наследованию</h2><p>В React для переиспользования похожей логики создается несколько компонентов, а общее состояние выносится в кастомный хук. Из-за этого в крупном проекте бывает легко потерять связь и перестать понимать, откуда именно берутся данные. В Angular эта задача решается через классическое наследование классов.</p><p>Архитектура строится вокруг базовых классов с общими методами и свойствами, от которых наследуются конкретные сущности. Если создать базовый класс Animal, дочерние классы Cat, Duck или Elephant получат его функциональность и добавят собственные уникальные атрибуты, не затрагивая родительский код. Когда нужно исправить или обновить базовую логику, нужно только внести изменения в одном месте, и они автоматически разойдутся по всей иерархии.</p><h2>Асинхронные данные и реактивные потоки RxJS</h2><p>Больше всего при переходе на Angular пугает RxJS. В React мы привыкли явно запрашивать данные и ждать ответа, а здесь приходится подписываться на поток и реагировать на каждое его изменение. Данные идут сами и непрерывно, а главная задача разработчика — правильно их направить: отфильтровать лишнее, объединить несколько потоков в один и вовремя отписаться, чтобы избежать утечек памяти.</p><p>В реальном коде это выглядит как цепочка операторов, модифицирующих данные до их попадания в компонент. Проблема в том, что в RxJS около 50 операторов, и для нормальной работы нужно сходу знать хотя бы 10-15 из них, без этого читать чужой код не получится.</p><p>На адаптацию уходит время: сначала приходишь в документацию за каждым оператором, а затем вырабатывается инстинкт. Начинаешь сразу видеть, где применить switchMap, а где добавить takeUntilDestroyed для автоматической очистки ресурсов. Это похоже на изучение иностранного языка — сначала переводишь каждое слово, а потом начинаешь думать на нем.</p><h2>Встроенный tooling: формы, CLI и декораторы</h2><p>Когда от стадии “отрицания” переходишь к “принятию” подхода, начинаешь замечать вещи, за которые Angular хочется любить. Первое, что бросается в глаза после React, — работа с формами. В React каждый раз приходится выбирать между React Hook Form, Formik и другими решениями, разбираясь в новой библиотеке на каждом проекте. В Angular работы с формами встроена в сам фреймворк: есть задокументированные Template-driven и Reactive Forms. Реактивные формы позволяют прописать объект FormGroup и всю валидацию прямо в TypeScript. В сложных конструкторах с вложенной логикой и зависимыми полями это полностью закрывает задачи без поиска сторонних пакетов на npm.</p><p>Следом привыкаешь к CLI, который буквально не даёт сделать что-то неправильно. Для нового компонента достаточно выполнить ng generate component auth-form — инструмент сам создаст файлы и зарегистрирует компонент в модуле. Точно так же одной командой генерируются сервисы и модули с маршрутизацией. Инструмент выполняет рутину по единственному правильному шаблону, который при необходимости можно настроить под проект.</p><p>Приятно удивляет и декоратор @HostBinding. Если в React для добавления CSS-класса по условию приходится писать логику в JSX или выносить её в отдельную функцию, то в Angular достаточно повесить одну строчку над свойством класса. Класс сам появляется или исчезает на хост-элементе в зависимости от значения, не создавая лишнего шума в шаблоне.</p><h2>Диагностика циклических зависимостей</h2><p>Самая противная проблема в Angular — циклические зависимости. Это ситуация, когда Сервис А зависит от Сервиса Б, а Сервис Б где-то дальше по цепочке ссылается на Сервис А. Фреймворк далеко не всегда ясно указывает на место ошибки: приложение может просто упасть при старте или вывести в консоль сбой, указывающий совсем не на ту причину.</p><p>На поиск подобного бага можно легко убить полдня, если перебирать компоненты вручную. В React такие проблемы возникают реже — там меньше неявных связей, а ошибка обычно располагается ближе к источнику. В Angular нужно учиться думать деревьями и графами.</p><p>Для выхода из этой ситуации есть инструмент Nx и команда nx dep-graph (или nx graph). Она визуализирует интерактивную карту проекта прямо в браузере, рисуя дерево связей между всеми библиотеками. Если в проекте появился закольцованный цикл, команда автоматически подсвечивает его красным цветом.</p><h2>Критерии выбора стека под задачи</h2><p>Angular точно не подходит на роль первого фреймворка для новичка. Это логичный следующий шаг, если хочется развиваться в сторону фуллстека или бэкенда: Java и Go тоже используют классы, объекты и dependency injection как стандартную практику. Год работы с Angular помогает легче понимать паттерны того же Spring Boot, потому что основные концепции уже отработаны на фронтенде.</p><p>Если задача — быстро собрать MVP, стартап, лендинг или небольшое приложение, объективно проще взять React. Там меньше формальностей и ниже порог входа на старте. Когда же предстоит развивать сложную долгоживущую систему с крупной командой, Angular оказывается практичнее: через год любой новый разработчик сразу поймёт структуру без дополнительных объяснений.</p><p>По этой причине Angular часто выбирают для разработки крупных распределённых платформ и корпоративных экосистем — например, в <a href="https://centicore.ru/">Centicore Group</a>, где есть сложные стандарты архитектуры и строгая типизация, чтобы поддерживать порядок в масштабных проектах.</p><h2>Итого</h2><p>В итоге переход с React на Angular сильно расширяет инженерные мозги. В какой-то момент начинаешь понимать, почему в больших системах выбирают именно эту экосистему, а не собирают очередной конструктор из десятка библиотек на React.</p><p>Да, поначалу три файла на один маленький компонент и десятки операторов RxJS откровенно бесят и кажутся какой-то лютой бюрократией. Но когда дискомфорт уходит, а в проекте появляется куча людей, ты просто перестаёшь тратить время на споры о структуре папок, выборе стейт-менеджера или библиотек для форм. Код становится прозрачным и понятным по умолчанию.</p><p>Для меня этот опыт стал крутым шагом вперед. Ты перестраиваешь мышление с коротких функций на нормальное ООП, начинаешь нативно понимать архитектурные паттерны и уже без страха смотришь в сторону того же бэкенда. Так что если представится шанс пощупать Angular на реальном проекте — не бойтесь, оно того стоит.</p>]]></content:encoded>
    </item>
    <item>
      <title>React-паттерн, который все используют, но он убивает производительность</title>
      <link>https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite</link>
      <comments>https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite</guid>
      <description><![CDATA[<p>Почему React.memo перестаёт работать из-за inline-пропсов и как это исправить. Разбираем на примере со 200 строками и замерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/react-pattern-kotoryj-vse-ispolzuyut-no-on-ubivaet-proizvodite">React-паттерн, который все используют, но он убивает производительность</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Jul 2026 04:56:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы обернули список в React.memo, добавили useCallback на обработчики и ждёте, что интерфейс полетит. Но при каждом вводе в поисковую строку список всё равно тормозит, а Profiler показывает 200 лишних рендеров. Чаще всего виноват не React, а один крошечный JSX-паттерн, который встречается в каждом втором компоненте.</p><p>В статье разбираем, почему React.memo сравнивает пропсы по ссылке, как inline-объекты и inline-функции обнуляют эту оптимизацию, и какие два простых приёма действительно возвращают производительность.</p><p>React.memo пропускает рендер только тогда, когда все пропсы равны по Object.is. Для объектов и функций это проверка по ссылке.</p><p>Inline-объекты и inline-колбэки в JSX создают новую ссылку на каждый рендер родителя, поэтому memo видит «новые» пропсы и снова рисует дочерний компонент.</p><p>В эксперименте со 200 memoизированными строками это дало 243,9 мс на один keystroke; после стабилизации ссылок — 6 мс.</p><p>Сначала выносите статические объекты за пределы компонента, а useCallback применяйте только там, где колбэк действительно пересекается с memoизированным потомком.</p><p>Оптимизировать всё подряд не нужно: измеряйте в Profiler, а не добавляйте хуки «на всякий случай».</p><h2>Как React решает, рендерить компонент заново или нет</h2><p>Когда родитель перерисовывается, React не делает послаблений дочерним элементам только потому, что они обёрнуты в React.memo. Он сравнивает новые пропсы со старыми. Если каждый проп проходит проверку Object.is, React может «отказаться» от рендера — bailout. Если хотя бы один проп не равен, компонент рисуется заново.</p><p>Для примитивов Object.is работает очевидно: 1 === 1 и 'hello' === 'hello'. А вот для объектов и функций сравнение идёт по ссылке.</p><p>Два объекта с одинаковым содержимым — это разные объекты в памяти. То же самое с функциями. Поэтому, когда вы пишете style=\{\{ padding: 16 \}\}, React получает новую ссылку на каждом рендере и считает проп изменившимся.</p><h2>Почему inline-пропсы — это не микрооптимизация, а поломка контракта</h2><p>Сам по себе объект в JSX не вреден. Если компонент дешёвый, редко перерисовывается и не обёрнут в memo, inline-пропсы почти не влияют на скорость. Проблема появляется, когда три условия накладываются друг на друга:</p><ul><li>родитель перерисовывается часто — поиск, скролл, фильтры, live-данные;</li><li>дочерний компонент или поддерево достаточно тяжёлые, чтобы лишний рендер был заметен;</li><li>вы уже добавили React.memo и ожидаете, что React будет пропускать работу.</li></ul><p>В такой ситуации нестабильные ссылки не просто добавляют накладных расходов — они полностью отменяют ту оптимизацию, ради которой вы взяли React.memo. UI продолжает работать, но лагает ввод, тормозят списки, а в Profiler видно, что дерево горит жёлтым при каждом чихе.</p><h3>Классический опасный пример</h3><p>Представьте список товаров из 200 строк. Каждая строка обёрнута в memo, но в месте вызова передаются inline-пропсы:</p><p>Здесь style и onAddToCart создаются заново при каждом рендере ProductList. Для memo это сигнал, что у каждой строки изменились пропсы, и все 200 компонентов рисуются снова.</p><h2>Эксперимент: от 243,9 мс до 6 мс на один keystroke</h2><p>Автор оригинальной статьи собрал контрольный пример: поисковый интерфейс со 200 memoизированными строками. Все строки получают одинаковые логические значения, но новые ссылки на объекты и функции. Результат после шести введённых символов: каждая видимая строка отрендерилась 14 раз.</p><p>В React DevTools Profiler один keystroke дал коммит длительностью 243,9 мс, в котором подсветились все 200 волокон строк. Инструмент @welldone-software/why-did-you-render прямо указал причину: props.style — «different objects that are equal by value», props.onAddToCart — «different functions with the same name».</p><p><b>Почему 14 рендеров?</b><br />
Каждый ввод в поиск меняет searchTerm, родитель перерисовывается, и inline-пропсы дают строкам новые ссылки. Счётчик рендеров растёт на каждый keystroke, даже если отфильтрованные товары не изменились.</p><h2>Как починить: два приёма вместо дюжины хуков</h2><p>Чтобы восстановить bailout, нужно сделать так, чтобы неизменяющиеся значения не получали новую ссылку на каждом рендере. Правило простое: сначала вынести, потом закешировать.</p><h3>1. Статические объекты — за пределы компонента</h3><p>Если объект не зависит от пропсов и состояния, создайте его один раз на уровне модуля. Это дешевле любого хука и не требует dependency-массива.</p><h3>2. Динамические колбэки — useCallback</h3><p>Если функция передаётся в memoизированный компонент и не должна меняться без причины, оберните её в useCallback со стабильным массивом зависимостей.</p><p>После этих двух изменений в эксперименте время рендера упало с 243,9 мс до 6 мс, счётчики строк застыли на 2, а Why Did You Render замолчал — avoidable re-renders исчезли.</p><h2>Когда не нужно ничего стабилизировать</h2><p>Главная ошибка — оборачивать в useCallback каждую функцию и выносить каждый объект за компонент. React сам по себе быстрый, а мемоизация — это контракт, а не стиль кодирования.</p><ul><li>Компонент дёшев и редко перерисовывается — не тратьте когнитивный бюджет команды.</li><li>Дочерний элемент не обёрнут в React.memo — тогда стабильные ссылки ничего не экономят.</li><li>Значение зависит от часто меняющегося состояния — useCallback с нестабильным массивом зависимостей всё равно будет пересоздаваться.</li><li>Вы ещё не замерили в Profiler — оптимизация без измерений почти всегда лишняя работа.</li></ul><p>React Compiler, который сейчас выходит в стабильное состояние, автоматически мемоизирует многое из того, что раньше делали вручную. Но и он не отменяет понимания ссылочной стабильности: useMemo и useCallback остаются полезными, когда нужен точный контроль, например для зависимостей эффектов.</p><h2>Часто задаваемые вопросы</h2><h2>Выводы</h2><p>Inline-объекты и inline-колбэки в JSX — не антипаттерн сами по себе. Они становятся проблемой только на границе memoизации, где React ожидает стабильные ссылки. Как только вы понимаете это правило, многие «таинственные» лишние рендеры перестают быть таинственными.</p><ol><li>Профилируйте до оптимизации, а не после.</li><li>Вынесите статические объекты за компонент — это самый дешёвый способ стабилизации.</li><li>Применяйте useCallback только для колбэков, которые уходят в memoизированные потомки.</li><li>Проверяйте себя через React DevTools Profiler и Why Did You Render.</li><li>Не забывайте про React Compiler, но не полагайтесь на него как на волшебную палочку.</li></ol><blockquote>Мемоизация — это контракт. Если потомок рассчитывает на стабильные ссылки, родитель должен их обеспечить. Нарушение этого контракта стоит намного дороже, чем отсутствие мемоизации вовсе.</blockquote><p><b>Источник:</b> <a href="https://blog.logrocket.com/react-pattern-everyone-uses-kills-performance/" rel="noopener noreferrer">LogRocket — The React pattern everyone uses that kills performance</a>.</p><p>Проверьте свой текущий проект: откройте React DevTools Profiler, введите что-нибудь в поиск и посмотрите, сколько компонентов подсветится жёлтым только из-за новой ссылки в пропсах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как исправить hydration-ошибки RSC в Next.js: практический гид</title>
      <link>https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid</link>
      <comments>https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid</guid>
      <description><![CDATA[<p>Разбираем, почему возникают hydration mismatches в React Server Components и Next.js App Router, и как находить, исправлять и предотвращать их в production.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ispravit-hydration-owibki-rsc-v-next-js-prakticheskij-gid">Как исправить hydration-ошибки RSC в Next.js: практический гид</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 21 Jul 2026 11:37:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Hydration mismatch в Next.js легко поймать в next dev, но в production он превращается в минимизированный код ошибки React и ссылку на декодер. В статье разбираем, почему ошибки гидратации особенно болезненны в приложениях с React Server Components, какие причины встречаются чаще всего и какой рабочий процесс помогает находить и предотвращать такие баги.</p><p>Речь пойдёт не о теории reconcile-алгоритма, а о практике: что проверять первым делом, как изолировать проблему через Suspense, куда смотреть в production-логах и как писать тесты, которые ловят регрессии до попадания к пользователям.</p><h2>Что такое hydration mismatch</h2><p>Гидратация — это процесс, при котором React берёт серверный HTML и навешивает на него обработчики событий, после чего страница становится интерактивной. React ожидает, что дерево, которое он отрендерил на клиенте, точно совпадёт с тем, что пришло с сервера. Если строки, атрибуты или структура различаются, возникает hydration mismatch.</p><p>В development-режиме React покажет предупреждение, текст расхождения и стек компонента. В production всё сводится к коротким кодам вроде #418 или #425. Без телеметрии вы не узнаете, на каком маршруте, в каком компоненте и из-за каких данных произошёл сбой.</p><h2>Почему это больно именно в RSC</h2><p>В классическом SSR обычно один серверный рендер и один клиентский проход гидратации. App Router добавляет Server Components, Client Components, потоковую передачу, Suspense-границы, динамические данные маршрута и RSC payload, который едет рядом с HTML.</p><p>Когда несовпадение происходит вне Suspense-границы, React может отбросить весь серверный HTML и перерендерить дерево на клиенте. Приложение заплатило цену серверного рендера, а пользователь не получил ни производительности, ни преимуществ стриминга. Это не просто предупреждение в консоли, а реальная потеря производительности.</p><h2>Ключевые выводы</h2><ul><li>Hydration mismatch в production без телеметрии почти невозможно локализовать: нужна инструментация на клиенте.</li><li>Основные причины: browser-only API, дата/время/локаль, состояние авторизации, невалидный HTML, расширения браузера, CSS-in-JS.</li><li>Граница 'use client' — это не только маркер сборки, но и граница гидратации: серверный рендер должен быть детерминирован.</li><li>Suspense-границы помогают изолировать сбой и не давать ему сломать всё дерево.</li><li>Проверяйте hydration только на production-сборке: next dev ведёт себя иначе.</li><li>Добавьте Playwright-smoke-тесты на критичные маршруты, чтобы ловить регрессии в CI.</li></ul><h2>Самые частые причины</h2><p>Перед тем как копать RSC payload или сравнивать HTML, стоит проверить шесть типовых сценариев. Они покрывают подавляющее большинство production-инцидентов.</p><ul><li><b>Browser-only API во время рендера:</b> window, document, localStorage, navigator — сервер не знает об этих значениях.</li><li><b>Дата, время и локаль:</b> Date, Intl.DateTimeFormat, относительное время — сервер обычно в UTC, пользователь в своей зоне.</li><li><b>Состояние авторизации:</b> сервер рендерит выклогнутый UI, клиент сразу видит авторизованного пользователя.</li><li><b>Невалидный HTML:</b> браузер чинит DOM до гидратации, а React сравнивает с исходным деревом.</li><li><b>Расширения и middleware:</b> браузерные плагины и edge-переписывания меняют HTML.</li><li><b>CSS-in-JS и порядок классов:</b> styled-components и Emotion могут генерировать разные имена классов при стриминге.</li></ul><h3>Browser-only API и сторонние провайдеры</h3><p>Самая частая причина — не ваш собственный код, а сторонний провайдер, который читает localStorage, window или navigator при инициализации. Под это попадают аналитика, фичер-флаги, A/B-тесты, session replay и персонализация.</p><p>Проблемный вариант: провайдер читает localStorage прямо при рендере.</p><p>Исправление: серверные флаги передаются в Client Component, а локальные оверрайды применяются после гидратации.</p><p><b>Принцип:</b> серверный и первый клиентский рендер должны получить одинаковый результат. Браузерные оверрайды включаются в useEffect после монтирования.</p><h3>Дата, время и локаль</h3><p>Сервер часто работает в UTC, а пользователь — в своей зоне. Date.toLocaleString(), Intl.DateTimeFormat и функции вроде formatDistanceToNow() дают разные строки в зависимости от часового пояса и времени между рендером и гидратацией.</p><p>Проблемный вариант: относительное время считается на сервере.</p><p>Исправление: сервер отдаёт стабильную абсолютную дату, клиент заменяет её на относительную после монтирования.</p><p>suppressHydrationWarning здесь уместен, потому что расхождение ожидаемо, ограничено листовым элементом  и управляется явно. Но оборачивать им большой контейнер, чтобы скрыть неизвестную ошибку, — значит замазать баг, а не починить его.</p><h3>Состояние авторизации</h3><p>Типичный сценарий: сервер рендерит UI для неавторизованного пользователя, потому что маршрут статический или не читает куки, а клиент сразу видит залогиненного пользователя. При каждой загрузке страница перерендеривается.</p><p>Решение — читать куки на сервере через cookies() из next/headers.</p><p>С cookies() маршрут становится динамическим — это обычно правильный компромисс для UI, зависящего от авторизации. Начиная с Next.js 15, cookies() асинхронный и требует await. В Next.js 16 синхронный доступ к request-time API полностью уходит.</p><h3>Невалидный HTML</h3><p>Браузер молча чинит невалидную вёрстку. React же гидратирует не исходную строку, а DOM, который построил браузер. Классический пример —  внутри <p></p>: браузер закроет параграф до div, и React увидит другое дерево.</p><p>Браузер превратит это в примерно такую структуру:</p><p>Если HTML приходит из CMS или редактора, валидируйте и нормализуйте его на сервере. Для собственных компонентов следите за предупреждениями validateDOMNesting в DevTools.</p><h3>Расширения браузера и middleware</h3><p>Менеджеры паролей, переводчики, грамматические плагины и другие расширения могут вставлять или переупорядочивать узлы до гидратации. Edge middleware и CDN-трансформации тоже могут переписывать HTML в пути.</p><p>Если несовпадение затрагивает только &lt;html&gt; или &lt;body&gt;, сначала подозревайте расширения. React 19 стал терпимее к инъекциям в head/body, но на старых версиях такие ошибки особенно шумные.</p><p>suppressHydrationWarning на корневых элементах — документированный escape hatch, но он работает только на один уровень вглубь и не должен использоваться для сокрытия неизвестных расхождений в продуктовом UI.</p><h3>CSS-in-JS и порядок классов</h3><p>В проектах со styled-components или Emotion имена классов могут зависеть от порядка рендера. Стриминг и Suspense меняют этот порядок, поэтому нужен registry с useServerInsertedHTML.</p><h2>Production workflow для отладки</h2><p>Не начинайте с diff-а огромных HTML-документов. Работайте по порядку, сужая область поиска.</p><ol><li>Настройте клиентскую телеметрию: перехватывайте console.error и отправляйте hydration-ошибки на свой endpoint.</li><li>Воспроизводите баг на production-сборке: next build &amp;&amp; next start, а не next dev.</li><li>Используйте Suspense-границы, чтобы изолировать проблемный участок и понять, в каком поддереве ошибка.</li><li>Сравнивайте серверный HTML (curl) и клиентский DOM после гидратации.</li><li>Когда найдёте расходящийся элемент, проверьте: browser-only API, дата/время, авторизацию, HTML-вложенность, расширения, стили.</li></ol><h3>Инструментация: instrumentation-client.ts</h3><p>Файл instrumentation-client.ts в Next.js запускается после загрузки документа, но до гидратации React. Это удобная точка для лёгкой клиентской телеметрии.</p><p>Если используете LogRocket, Sentry или другой инструмент, прикрепите тот же payload к текущей сессии — тогда можно будет увидеть, как выглядела страница в момент сбоя.</p><h3>Изоляция через Suspense</h3><p>Suspense-границы не только показывают fallback при загрузке. Если hydration mismatch случается внутри границы, React может ограничить восстановление этим поддеревом, а не переключать весь root на клиентский рендер.</p><p>Оберните поочерёдно основные секции. Если страничная ошибка исчезает после оборачивания конкретной секции, баг почти наверняка внутри неё.</p><h3>Сравнение HTML и DOM</h3><p>Получите серверный HTML через curl с нужными куками:</p><p>В Chrome DevTools после загрузки страницы скопируйте живой DOM:</p><p>Сохраните результат в /tmp/client-render.html и сравните:</p><p>Этот метод хорошо ловит HTML-слой, но может пропустить расхождения на уровне reconciler-а и RSC payload. Если raw HTML совпадает, проверяйте Client Components и браузерное состояние.</p><h2>Профилактика</h2><p>Лучше не допускать ошибки, чем потом их чинить. Несколько практик, которые помогают держать серверный и клиентский рендер синхронизированными.</p><ol><li>Server Component должен быть детерминированным: одни и те же входные данные дают одни и те же выходные HTML и RSC payload.</li><li>Все browser-only API, куки, заголовки, локаль и время должны оставаться за границей 'use client' или читаться через request-time API на сервере.</li><li>Для клиентского UI сначала рендерите стабильный baseline, а улучшения добавляйте в useEffect после гидратации.</li><li>Валидируйте HTML из внешних источников до того, как React его увидит.</li><li>Тестируйте hydration на production-сборке в CI.</li></ol><h3>Пример: стабильный baseline + клиентское улучшение</h3><p>Скелетон — это стабильная базовая разметка. Карточки товаров появляются после монтирования. Сервер и первый клиентский рендер совпадают, а пользователь получает нужный контент чуть позже.</p><h3>Smoke-тесты в CI</h3><p>Ручное тестирование пропустит регрессии. Добавьте Playwright-тест на критичные маршруты.</p><p>Запускайте такой тест только против production-сборки, никогда против next dev. Сделайте его обязательной проверкой для маршрутов, где hydration failure критичен: продуктовые страницы, дашборды, чекаут, личный кабинет.</p><h2>FAQ</h2><h2>Выводы</h2><p>Hydration mismatch — не придирка React, а реальный баг производительности и корректности. Каждое несовпадение означает, что приложение могло отбросить серверный HTML, за который уже заплатило ресурсами.</p><p>В приложениях с React Server Components, где цель — меньше клиентского JavaScript и более ранний стриминг полезного UI, hydration failures тихо отменяют эти преимущества. Поэтому важно держать браузерную логику за границей 'use client', рендерить стабильные серверные baseline и проверять гидратацию в production-условиях до того, как ошибку найдут пользователи.</p><blockquote>Hydration errors should be fixed, not ignored — официальная позиция React.</blockquote><p><b>Источник:</b> <a href="https://blog.logrocket.com/how-fix-rsc-hydration-mismatches-next-js/" rel="noopener noreferrer">LogRocket Blog — How to fix RSC hydration mismatches in Next.js</a>.</p><p>Проверьте свои критичные маршруты на production-сборке, настройте телеметрию и не давайте hydration-ошибкам копиться в консоли.</p>]]></content:encoded>
    </item>
    <item>
      <title>«Почему стоит перестать деструктурировать всё в JavaScript»</title>
      <link>https://tproger.ru/articles/pochemu-ya-perestal-destrukturirovat-vsyo-v-javascript</link>
      <comments>https://tproger.ru/articles/pochemu-ya-perestal-destrukturirovat-vsyo-v-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-ya-perestal-destrukturirovat-vsyo-v-javascript</guid>
      <description><![CDATA[<p>Разбираем, когда деструктуризация объектов в JS и React упрощает код, а когда делает его труднее для чтения. Практические правила от Мэтта Смита.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-ya-perestal-destrukturirovat-vsyo-v-javascript">«Почему стоит перестать деструктурировать всё в JavaScript»</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 20 Jul 2026 05:40:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы пишете на JavaScript, скорее всего, деструктуризация — один из первых паттернов, который вы используете каждый день. Но что, если автоматическая деструктуризация делает код не короче, а труднее для чтения?</p><p>В своей статье разработчик Мэтт Смит объясняет, почему перестал раскладывать объекты на переменные по умолчанию и как это изменило его подход к читаемости кода.</p><p><b>Деструктуризация — инструмент, а не норма.</b> Её стоит применять там, где она правда упрощает код, а не просто экономит символы.</p><p><b>Объект хранит контекст.</b> project.status понятнее, чем голая переменная status, особенно в больших функциях.</p><p><b>Вложенные объекты раскрывайте поэтапно.</b> Сначала доберитесь до нужного уровня, а потом уже извлекайте поля.</p><p><b>Деструктурируйте позже, а не раньше.</b> Сохраняйте исходный объект до тех пор, пока он действительно не понадобится в разобранном виде.</p><p><b>Каждая новая переменная — когнитивная цена.</b> Если имя не добавляет смысла, лучше обратиться к свойству объекта напрямую.</p><h2>Деструктуризация — не религия</h2><p>Несколько лет назад Мэтт Смит деструктурировал почти всё: объекты, пропсы, параметры, возвращаемые значения. Если встречался объект — он его раскладывал. Это перестало быть осознанным решением и превратилось в привычку: так пишет «современный JavaScript».</p><p>Сейчас он всё ещё использует деструктуризацию, но уже не автоматически. Причина простая: возвращаясь к старому коду, Смит тратит больше времени, чем ожидает, чтобы понять, откуда взялась та или иная переменная. Ему приходится мысленно собирать исходный объект обратно, прежде чем разобраться, что происходит.</p><p>В какой-то момент до него дошло: он оптимизировал процесс написания, а не чтения. Экономия нескольких нажатий клавиш сегодня оборачивалась дополнительными минутами разбора завтра.</p><h2>Не бойтесь повторов</h2><p>Один из самых распространённых паттернов — вынесть поля из объекта, а потом передать их как пропсы в компонент:</p><p>С этим ничего не случилось. Но сегодня автор с большей вероятностью напишет так:</p><p>Да, здесь повторяется post. Но когда он вернётся к этому коду через месяц, ему не придётся вспоминать, откуда взялись title или author. Контекст остаётся на виду.</p><h2>Объект несёт контекст</h2><p>Это особенно заметно в длинных функциях. Представьте, что в начале файла вы написали:</p><p>А сто строк ниже встретили такой код:</p><p>Моментальная пауза: «archived»… что именно? Сравните с вариантом, где объект сохраняет свою форму:</p><p>Объект по-прежнему несёт полезный контекст. Лишние символы редко замедляют чтение. А вот необходимость помнить, к какой сущности относится переменная, замедляет гораздо сильнее.</p><h2>Вложенность лучше раскрывать поэтапно</h2><p>Раньше автор считал вложенную деструктуризацию элегантной. Сейчас она часто кажется попыткой понять всю структуру объекта ещё до того, как начал решать задачу.</p><p>Автор предпочитает писать иначе:</p><p>Так лучше отражается мышление о данных: сначала интересует профиль, а уже потом, если нужно, из него извлекают конкретные поля.</p><h2>Деструктурируйте позже, а не раньше</h2><p>С параметрами компонентов ситуация похожа. Для маленьких компонентов деструктуризация пропсов отлично работает:</p><p>Но по мере роста компонента автор чаще пишет так:</p><p>Ему нравится держать исходный объект под рукой до тех пор, пока он действительно не понадобится в разобранном виде. Это также упрощает понимание того, что получил компонент.</p><h2>Каждая переменная — цена для читателя</h2><p><b>Каждая локальная переменная просит читателя запомнить ещё одно имя.</b> Иногда это стоит того, иногда — нет.</p><p>Если новая переменная обозначает осмысленную концепцию, автор с удовольствием её вводит. Имя вроде billingAddress становится частью словаря функции.</p><p>Но если автор просто превращает project.status в status, уверенности, что код стал читабельнее, нет. Полезное правило большого пальца: если деструктуризация даёт коду лучший словарь — использует её. Если она только экономит несколько символов — обычно нет.</p><h2>Когда деструктуризация всё ещё уместна</h2><p>Всё вышесказанное — не аргумент против деструктуризации. Автор по-прежнему применяет её постоянно.</p><p>Эти случаи локальны, сфокусированы и убирают шум. Есть и другие исключения. При маппинге массива я спокойно пишу:</p><p>Объект существует всего несколько строк, поэтому автор не чувствует, что теряет контекст. Иногда имеет смысл даже переименовать извлечённое свойство: const { status: projectStatus } = project;.</p><p>Такое имя сохраняет больше контекста, чем просто status. Но если автор всё равно несёт имя объекта в переменную, часто оказывается, что project.status читается естественнее. Не нужно придумывать новое имя, а связь с объектом остаётся очевидной.</p><p>Разница в том, что автор больше не деструктурирует просто потому, что объект существует.</p><h2>Главный вопрос</h2><p>Автор всё ещё любит деструктуризацию. Есть множество мест, где она заметно очищает код. Просто он больше не хватается за неё автоматически.</p><p>Перед тем как убрать объект, он спрашивает себя: удаление объекта действительно облегчает понимание или просто делает код короче?</p><blockquote>Если деструктуризация даёт коду лучший словарь — автор её использует. Если она только экономит несколько символов — обычно нет.</blockquote><h2>Выводы</h2><p>Деструктуризация остаётся одним из самых полезных синтаксических улучшений JavaScript. Но удобство записи не должно превращаться в удобство только для автора. Читаемость кода измеряется не количеством символов, а скоростью, с которой человек понимает, что происходит.</p><p>Сохраняйте объекты там, где они несут контекст. Раскрывайте вложенность поэтапно. Вводите переменные, только если они добавляют смысла. И не забывайте главный вопрос: вы делаете код понятнее или просто короче?</p><p><b>Источник:</b> <a href="https://allthingssmitty.com/2026/07/13/i-stopped-destructuring-everything/">Matt Smith — I stopped destructuring everything</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare переписала Next.js за $1 100: как ИИ сломал модель коммерческого open source</title>
      <link>https://tproger.ru/translations/cloudflare-perepisala-next-js-za-1-100-kak-ii-slomal-model-ko</link>
      <comments>https://tproger.ru/translations/cloudflare-perepisala-next-js-za-1-100-kak-ii-slomal-model-ko?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/cloudflare-perepisala-next-js-za-1-100-kak-ii-slomal-model-ko</guid>
      <description><![CDATA[<p>Cloudflare за неделю создала vinext — замену Next.js на Vite. Один инженер и $1 100 на токены ИИ. Разбираем технику vinext и последствия для open source.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/cloudflare-perepisala-next-js-za-1-100-kak-ii-slomal-model-ko">Cloudflare переписала Next.js за $1 100: как ИИ сломал модель коммерческого open source</a>»</p>]]></description>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 10 May 2026 06:02:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Cloudflare потратила одну рабочую неделю и $1 100 на токены ИИ, чтобы переписать Next.js — один из самых сложных web-фреймворков с десятилетней историей. Инструмент получил название vinext, работает на Vite вместо проприетарного Turbopack и разворачивается в Cloudflare Workers одной командой. Этот эксперимент ставит под вопрос фундамент, на котором стоят коммерческие open source-компании.</p><p>Разбираем ситуацию по материалу <a href="https://blog.pragmaticengineer.com/the-pulse-cloudflare-rewrites-next-js-as-ai-rewrites-commercial-open-source/">Pragmatic Engineer</a> — охватывает технические подробности vinext, экономику и последствия для коммерческого open source.</p><p>Cloudflare выпустила <b>vinext</b> — замену Next.js на базе Vite, которая деплоится в Cloudflare Workers одной командой.</p><p>Один инженер + ИИ-агент OpenCode + Opus 4.5 = одна рабочая неделя вместо <b>нескольких лет</b> инженерного труда.</p><p>По заявлению Cloudflare: сборка до <b>4 раз быстрее</b>, клиентские бандлы на <b>57% меньше</b>.</p><p>vinext покрывает <b>94% API Next.js</b>, но официально экспериментальна: не прошла нагрузочного тестирования.</p><p>ИИ удешевил переписывание сложного ПО примерно в <b>100 раз</b> — под угрозой оказались проприетарные «рвы» коммерческих open source-проектов.</p><p>Vercel ($9 млрд оценка) потеряла ключевое конкурентное преимущество: уникальный формат билда Next.js.</p><h2>Next.js и Vercel: как устроен коммерческий «ров»</h2><p>Next.js — самый популярный полностековый React-фреймворк. По данным Stack Overflow Developer Survey 2025, его используют около половины разработчиков на React. Проект открытый, но содержится преимущественно силами <a href="https://vercel.com">Vercel</a>.</p><p>Хитрость в том, что Next.js собирает проекты с помощью <b>Turbopack</b> — опционального инструмента Vercel, написанного на Rust (используется прежде всего в dev-режиме). Результат сборки — проприетарный, недокументированный формат. Инженер Netlify Эдуардо Боукаш объяснял это так:</p><blockquote>Формат вывода сборки Next.js является проприетарным и недокументированным — он используется в деплоях Vercel для инициализации нужной инфраструктуры. Это означает, что любые другие хостинг-провайдеры вынуждены опираться на недокументированные API, которые могут менять поведение без предупреждения в минорных и патч-релизах.</blockquote><p>В итоге сложилась система: Next.js бесплатен и открыт, но наилучший опыт разворачивания — только на Vercel. Альтернативные провайдеры вынуждены угадывать поведение недокументированного формата. Это умная стратегия, превращающая open source-проект в воронку монетизации.</p><p>Чтобы сломать эту схему, нужно заменить Turbopack на стандартный инструмент — например, <b>Vite</b>, который лидирует в экосистеме JS по данным State of JS 2025. Именно это и сделал Cloudflare.</p><h2>Что такое vinext и как его создали</h2><p>Идея проста: убрать Turbopack, поставить Vite, сделать так, чтобы приложения на Next.js собирались в стандартный формат и деплоились на любой платформе — в том числе на Cloudflare Workers.</p><p>Cloudflare публично заявила, что на это ушла одна рабочая неделя одного инженера, который использовал агент <a href="https://opencode.ai">OpenCode</a> (open source coding agent) совместно с моделью Claude Opus 4 (в источнике — «Claude Opus 4 (в источнике — «Opus 4.5»)»; такой модели в публичном портфеле Anthropic нет, по всей видимости имеется в виду Opus 4):</p><blockquote>На прошлой неделе один инженер и модель ИИ с нуля пересобрали самый популярный front-end фреймворк. Результат — vinext (произносится «ви-некст»): drop-in замена Next.js на Vite, которая деплоится в Cloudflare Workers одной командой. В ранних бенчмарках сборка production-приложений ускорилась до 4 раз, а клиентские бандлы уменьшились до 57%. И у нас уже есть клиенты, которые запустили его в production. Вся работа обошлась примерно в $1 100 на токены.</blockquote><p>Ядро Next.js за 10 лет выросло примерно до 194 000 строк кода. vinext занимает около 67 000 строк — более компактная реализация, которая не поддерживает устаревшие API и охватывает 94% публичного API Next.js. Оставшиеся 6% — сложные граничные случаи.</p><h3>Что именно сделал Cloudflare</h3><ul><li>Взял публичный API Next.js</li><li>Переписал поведение через Vite</li><li>Создал формат вывода сборки, совместимый с поведением оригинала</li><li>Добавил <b>Agent Skill</b> для миграции существующих Next.js-проектов одной командой</li></ul><p>Миграционный скилл — отдельная деталь, показательная для эпохи ИИ. Он работает с Claude Code, OpenCode, Cursor, Codex и другими агентами:</p><p>Cloudflare не только использовала ИИ для создания vinext, но и встроила ИИ в процесс его распространения — чтобы миграция клиентских проектов тоже была автоматической.</p><h2>ИИ делает «невозможное» тривиальным</h2><p>До появления современных ИИ-агентов переписать Next.js «с нуля» было теоретически возможным, но практически исключённым. Это требовало бы многолетних усилий команды инженеров. При этом сообщество сомневалось бы в долгосрочной поддержке любого форка — Vercel доказывала свою надёжность 10 лет, а любой новый игрок не имеет этого кредита доверия.</p><p>Теперь ситуация изменилась. По оценке Pragmatic Engineer, ИИ ускорил создание vinext примерно в <b>100 раз</b>. Cloudflare завершила проект, измеряемый в инженерных годах, за одну инженерную неделю.</p><p>Важно, что всеобщий рост продуктивности от ИИ в среднем куда скромнее. По данным The Pragmatic Summit (Сан-Франциско, 2026), самооценка разработчиков даёт около 10% прироста. Ключевое условие для 100-кратного ускорения — наличие <b>полного тестового покрытия</b>, которое позволяет ИИ-агентам верифицировать каждый шаг.</p><blockquote>ИИ во много раз эффективнее на «механических» задачах, где корректность можно проверить тестами, по сравнению с открытыми задачами или теми, что требуют творчества.</blockquote><p>Сам факт, что Next.js имеет исчерпывающее тестовое покрытие — это одновременно его сила и слабость: ИИ использовал тест-сюит как спецификацию для переписывания. Cloudflare даже поблагодарила команду Vercel в объявлении:</p><blockquote>Мы хотим отметить команду Next.js. То, что их API хорошо задокументирован, а тест-сюит настолько полный, — один из главных факторов, которые сделали этот проект возможным.</blockquote><h2>Качество под вопросом: экспериментальность vs маркетинг</h2><p>Cloudflare открыла своё объявление сильным тезисом: «клиенты уже запустили в production». Vercel немедленно указала на уязвимости в безопасности, а CEO Гильермо Рауч связал проект со стереотипом «вайб-кодинга» — небрежной работы без понимания деталей.</p><p>Претензия оказалась обоснованной: важная деталь про «production» была закопана в тысяче слов после начала объявления:</p><blockquote>Мы хотим быть честными: vinext экспериментален. Ему ещё нет недели, и он не прошёл реального нагрузочного тестирования. (...) Мы работаем с National Design Studio на одном из их <b>бета-сайтов</b>, CIO.gov.</blockquote><p>«Клиент в production» у Cloudflare — это бета-сайт без значимого трафика. Это нетипично для компании, обычно отличающейся точностью формулировок. Vercel имела право поднять вопрос безопасности.</p><p>Тем не менее это не отменяет главного вывода: ИИ способен снизить стоимость разработки примерно в 100 раз и выдать работоспособный результат за приемлемую сумму. Доработка безопасности и надёжности потребует дополнительного времени — но это уже другой разговор.</p><h2>Новая угроза для коммерческого open source</h2><p>Cloudflare и Vercel — известные соперники в борьбе за платформу разработчиков. CEO обеих компаний регулярно обмениваются ударами в публичном пространстве.</p><p>Но реальная ставка здесь — бизнес-модель коммерческого open source. Стратегия Vercel была классической:</p><ol><li>Создать и поддерживать Next.js, обеспечив лучший developer experience.</li><li>Оптимизировать Vercel под специфический (и недокументированный) формат вывода Next.js.</li><li>Большинство разработчиков, выбравших Next.js, деплоят на Vercel — ради лучшей интеграции.</li><li>Повторять годами, пока бизнес не оценят в $9 млрд (оценка октября 2025 года).</li></ol><p>В основе стратегии лежали два предположения: (1) переписать Next.js дорого и (2) даже если кто-то это сделает, разработчики усомнятся в жизнеспособности альтернативы. ИИ обнулил оба предположения.</p><h3>Аналогия с WordPress и WP Engine</h3><p>Похожая история произошла с WordPress и WP Engine в 2024 году. WP Engine «пиратила» усилия Automattic: почти не вкладывалась в R&amp;D, зато продавала WordPress как managed service — дешевле, чем Automattic, тратящая на разработку сотни миллионов.</p><p>Разница в том, что Vercel удавалось избегать «фрирайдеров» — благодаря проприетарному формату билда. Теперь этого барьера больше нет: Cloudflare будет синхронизировать каждое обновление Next.js с vinext через ИИ-агентов, и это не потребует серьёзных инвестиций.</p><h2>Как защититься: стратегии для коммерческих open source-проектов</h2><p>Если ИИ позволяет конкурентам тривиально переписать ваш продукт, каковы варианты защиты?</p><h3>Закрыть тест-сюит</h3><p>Один из очевидных ответов — сделать тесты приватными. SQLite, например, держит свой наиболее полный тест-сюит (TH3) закрытым и продаёт доступ к нему как сервис. Open source-проект для визуального редактирования tldraw объявил о переносе тестов в закрытый репозиторий (хотя потом оказалось, что это была шутка).</p><p>Саймон Виллисон прокомментировал тренд:</p><blockquote>За последние несколько месяцев стало очевидно, что полный тест-сюит достаточен для написания совершенно новой реализации любой open source-библиотеки с нуля — потенциально на другом языке.</blockquote><h3>Другие варианты защиты</h3><ul><li><b>Уменьшить open core, увеличить закрытую часть.</b> Перенести расширенные сервисы из source available в полностью закрытый код.</li><li><b>Профессиональный support.</b> ИИ может повысить качество поддержки при правильном применении — а это сложно скопировать.</li><li><b>Живое сообщество.</b> Meetup'ы и реальная аудитория создают связь, которая выходит за рамки кода. Трудно представить встречи vinext-пользователей — а встречи Next.js-разработчиков уже существуют.</li><li><b>Инфраструктура как ров.</b> В мире, где ПО легко скопировать, владение и управление инфраструктурой становится важнейшим преимуществом: меньшая задержка, выше надёжность, лучшая цена.</li></ul><h2>Что это значит для индустрии</h2><p>Для не-коммерческого open source перспективы выглядят иначе. ИИ упрощает создание и поддержку форков, перенос проектов на другие языки и добавление новых функций. Это может означать расцвет открытых проектов, которые не зависят от коммерческой логики.</p><p>С другой стороны, появится класс «миграционных агентов», которые провайдеры будут создавать для перетягивания клиентов. Cloudflare уже встроила такой агент в vinext. Это «AI-native» стратегия захвата рынка, которую скопируют другие.</p><p>Конкуренция в технологической индустрии становится жёстче и быстрее. По словам Laura Tacho с The Pragmatic Summit:</p><blockquote>ИИ — это ускоритель, мультипликатор, и он движет организации в разных направлениях.</blockquote><p>В частном случае vinext — пока неясно, насколько популярным он станет и насколько глубок «ров» Vercel вокруг экосистемы Next.js в целом. Переписать фреймворк — не то же самое, что стать жизнеспособной платформой-as-a-service. Доверие, стабильность, поддержка и developer experience накапливались 10 лет.</p><h2>Выводы</h2><p>Cloudflare переписала Next.js не из любви к open source, а чтобы разрушить конкурентное преимущество Vercel. Это честная бизнес-война. Но побочный эффект оказался важнее самого конфликта: стало ясно, что ИИ-агенты превращают переписывание сложного ПО из многолетней инвестиции в задачу одной недели.</p><p>Для разработчиков это хорошая новость: экосистема Next.js получила стандартизированный формат сборки, а деплой на разные платформы станет проще. Для компаний, строящих бизнес на коммерческом open source, — сигнал тревоги: проприетарные технические «рвы» больше не защищают так, как раньше.</p><p>Что по-настоящему защищает — живое сообщество, инфраструктура мирового класса, качество поддержки и репутация, накопленная годами. vinext может стать удобной альтернативой деплоя. Но стать полноценной заменой экосистемы Next.js — задача несравнимо более сложная.</p><p>Как вы оцениваете угрозу, которую ИИ создаёт для коммерческого open source? Читайте также: <a href="https://tproger.ru/">другие материалы об ИИ и open source на tproger.ru</a>.</p><p>Источники: <a href="https://blog.pragmaticengineer.com/the-pulse-cloudflare-rewrites-next-js-as-ai-rewrites-commercial-open-source/">Pragmatic Engineer — The Pulse</a>; <a href="https://blog.cloudflare.com/vinext/">Cloudflare блог — объявление vinext</a>; State of JS 2025.</p>]]></content:encoded>
    </item>
    <item>
      <title>30 дней: блочный конструктор README — один DOM, два хозяина</title>
      <link>https://tproger.ru/articles/30-dnej-blochnyj-konstruktor-readme-odin-dom-dva-hozyaina</link>
      <comments>https://tproger.ru/articles/30-dnej-blochnyj-konstruktor-readme-odin-dom-dva-hozyaina?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Islam Mada]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/30-dnej-blochnyj-konstruktor-readme-odin-dom-dva-hozyaina</guid>
      <description><![CDATA[<p>Блочный конструктор README-файлов написанный с нуля за 30 дней: кастомный WYSIWYG без сторонних редакторов, своя Markdown Object Model на TypeScript, contenteditable в связке с React, немного боли от браузерных API и ноль.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/30-dnej-blochnyj-konstruktor-readme-odin-dom-dva-hozyaina">30 дней: блочный конструктор README — один DOM, два хозяина</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 07 May 2026 03:15:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы живём в эпоху когда можно написать в чат «сделай мне CRUD» и получить рабочий код через десять секунд что в принципе удобно. И это, если честно, главная причина почему я периодически намеренно лезу в что-то сложное руками — чтобы не разучиться думать о том что происходит внутри.</p><p>ИИ я использую. Но в этом проекте он был исключительно быстрой документацией — особенно когда добрался до selection/range API, про которые до этого знал чуть меньше чем ничего. Реализация все равно была за мной.</p><p>Так вот — ReadGen. Блочный конструктор README-файлов. Месяц, 2-3 часа в день, React и TypeScript и небольшая пачка дополнительных библиотек для разумного облегчения жизни. Важно понимать что это <b>не коммерческий продукт и не претендует на решение чьей-то боли.</b> Просто техническая задача которую я давно хотел разобрать.</p><p>Демо:<a href="http://readgen-eight.vercel.app"> readgen-eight.vercel.app</a></p><p><a href="http://readgen-eight.vercel.app"></a>Репозиторий:<a href="https://github.com/islamxm/readgen"> github.com/islamxm/readgen</a></p><h2>Почему</h2><p>contenteditable — старый добрый дед среди браузерных API. То что он старый - это да, а вот доброта - под вопросом.</p><p>Он искренне хочет помочь, сам расставляет &lt;div&gt; и &lt;br&gt;, сам решает что делать с Enter, сам форматирует как считает нужным. Проблема в том что его никто не спрашивал. Когда тебе нужен предсказуемый блочный редактор с контролируемой структурой данных — такая самодеятельность становится основным источником боли.</p><p>Готовые текстовые движки эту боль скрывают. Я хотел её почувствовать лично. Понять где именно браузер начинает делать по-своему и что с этим делать. Это и был настоящий вопрос проекта.</p><p>Поначалу казалось что задача не супер сложная, но довольно быстро понял что полноценный текстовый редактор это бесконечные edge cases которые не влезут ни в какой месяц. Граница была проведена жёстко: плоская структура блоков, никакой иерархии. Всё остальное — потом, в другой жизни.</p><p>Так задача сузилась до честного и реалистичного объёма, блочный конструктор README без вложенности, с предсказуемым ядром и нормальным экспортом.</p><h2>Три OM</h2><p>Между реальным DOM и виртуальным DOM React затесался ещё один — MOM, Markdown Object Model. Пафосное название для того что по сути является flat map структурой документа. Но только по сути — на деле это целое ядро, состоящее из парсера, валидатора, гардов, движка, сериализатора. Это по сути модули без внешних зависимостей (кроме dexie.js в подмодуле storage) которые принимают данные, делают свое дело и отдают, впрочем как и принято в среде порядочных разработчиков.</p><p>Архитектурно MOM живёт как отдельный изолированный модуль — ведёт себя как shared слой в FSD, но это не набор утилит а самостоятельное ядро. Всё остальное приложение построено на гибриде FSD и layered подхода, но MOM существует по своим правилам.</p><h2>Один DOM, два хозяина</h2><p>Вот где настоящий конфликт. Структурой документа, порядком блоков, состоянием UI управляет React. Но внутри редактируемых блоков он полностью отступает. Там нет react рендеринга, только innerHTML и чистый DOM. Синхронизация происходит в эффекте, источник истины — содержимое contenteditable, и именно оттуда формируется MOM.</p><p>Два хозяина поделили территорию. React взял всё снаружи, DOM взял всё внутри. С одной стороны казалось бы все круто, так и должно быть, но на самом деле это порождает новый пласт проблем.</p><p>Отдельная история внутри этой истории — курсор. Позицию нужно постоянно сохранять и восстанавливать через selection/range API, и синхронизировать это с React. Это отдельная боль внутри общей боли.</p><p>Деструктивная синхронизация DOM — innerHTML = '' перед каждой манипуляцией выглядит грубо, зато работает. Можно было конечно написать свой reconciliation но учитывая исходные рамки по времени я решил отказаться.</p><h2>Генераторы в сериализаторе</h2><p>Экспорт документа в .md — финальная точка всей архитектуры. MOM → Serializer → файл. Впервые за все время своего осознанного программирования я решил тут применить генераторы в деле.</p><p>Каждый тип узла имеет свою функцию-генератор. Первый yield — контент блока, второй yield "" — пустая строка-разделитель. Тут мы избавляемся от аккумулятора который нужно тащить в глубь и код делаем более плоским и понятным. Array.from(gen).join("\n") в конце собирает всё в строку.</p><h2>Drag and drop на Pointer Events</h2><p>Кастомный drag and drop с анимацией как отдельный хук. И тут я познакомился с довольно таки мощными событиями класса pointer</p><p>о существовании которого я знал но почему то всегда обходился с touch</p><p>и <i>mouse</i> ивентами.</p><p>Pointer Events унифицируют всё что раньше требовало отдельных mouse и touch обработчиков. Без pointercancel drag зависает если браузер решает прервать жест сам. setPointerCapture — чтобы события не терялись когда курсор уходит за пределы контейнера.</p><h2>Компромиссы</h2><p>MOMRaw — честное признание границы. Все что не попало в текущую версию движка (таблицы, инлайн-картинки, инлайн-код и т.д.) живёт в одном компромиссном блоке. Вставляй сырой Markdown или HTML, смотри превью через внешнюю библиотеку в изолированном Shadow DOM.</p><p>То же самое с блоком кода - MOMCode. Для этого я подключил библиотеку uiw, думаю в будущем заменю его на более современное и понятное решение.</p><p>Виртуализации нет, README на 10 000 блоков не существует в природе, проблема надуманная ну или просто не успел (выбирайте сами).</p><p>Мелочи которые просто есть и работают: менеджер глобальных шорткатов, тултипы для вставки блоков, эмодзи и форматирования текста, миниатюры документов через modern-screenshot, хранение в IndexedDB без бэкенда.</p><h2>Заключение</h2><p>Месяц закончился. contenteditable я теперь знаю лично — и он знает меня. Selection/Range из страшного незнакомца превратился в рабочий инструмент. Понял где React уместен, а где лучше отойти и дать DOM делать своё дело. Нашёл наконец задачу где генераторы оказались не паттерном ради паттерна а реально лучшим решением.</p><p>Демо:<a href="http://readgen-eight.vercel.app"> readgen-eight.vercel.app</a></p><p><a href="http://readgen-eight.vercel.app"></a>Репозиторий:<a href="https://github.com/islamxm/readgen"> github.com/islamxm/readgen</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Inline-пропсы в React тихо обнуляют memo: разбор на 200 строк, как чинить</title>
      <link>https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k</link>
      <comments>https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k</guid>
      <description><![CDATA[<p>Контролируемый эксперимент LogRocket: 200 memoized React-строк, inline объекты в JSX делают коммит 244 мс на нажатие. Простой фикс снижает до 6 мс. Разбор.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/inline-propsy-v-react-tiho-obnulyayut-memo-razbor-na-200-strok-k">Inline-пропсы в React тихо обнуляют memo: разбор на 200 строк, как чинить</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 May 2026 11:30:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Совет по производительности React обычно сводится к набору рецептов: оборачиваем дорогие дочерние компоненты в React.memo, добавляем useCallback к обработчикам, useMemo к вычислениям — и идём дальше. На практике эти инструменты работают только тогда, когда передаваемые через них значения действительно стабильны. Если родитель пересоздаёт объект или функцию на каждом рендере, React видит новую ссылку и memoization-граница перестаёт делать полезную работу.</p><p>В <a href="https://blog.logrocket.com/react-pattern-everyone-uses-kills-performance/">материале на блоге LogRocket</a> разобран один из самых частых React-паттернов, который в неподходящем контексте оказывается одним из самых дорогих, — передача inline-объектов, массивов и колбэков прямо в месте вызова компонента. Контролируемый эксперимент с 200 memoized строк показывает, как это превращает один keystroke в коммит на 243,9 мс — и как простой рефактор возвращает время до 6 мс.</p><p><b>React.memo сравнивает по ссылке.</b> Внутри React работает Object.is: {padding:16} и {padding:16} — это разные ссылки, значит «изменилось».</p><p><b>Inline-объекты в JSX обнуляют memo.</b> Каждый рендер родителя создаёт новый объект/функцию, мемоизированный дочерний компонент видит «новые пропсы» и перерисовывается заново. Оптимизация, которую вы планировали, не срабатывает.</p><p><b>Цена в живом коде.</b> Эксперимент: 200 memoized строк, поиск, inline style и onAddToCart. После 6 нажатий — счётчик рендеров каждой строки = 14, на keystroke коммит 243,9 мс.</p><p><b>Фикс простой.</b> Статичный объект — в module scope. Динамический колбэк — в useCallback с пустыми зависимостями. После: коммит 6 мс, счётчик рендеров = 2, Why Did You Render молчит.</p><p><b>React Compiler не отменяет понимания.</b> Он автоматизирует много memoization, но useMemo/useCallback остаются escape hatch для случаев, когда нужен точный контроль (например, dependency для Effect).</p><h2>Как работает bailout у React</h2><p>React.memo оборачивает компонент в memoization-границу. Когда родитель ререндерится, React не пропускает дочерний автоматически только потому, что он мемоизирован. Вместо этого сравниваются новые пропсы со старыми. Если каждый пропс считается равным — bail out, переиспользуем предыдущий результат. Если хотя бы один не равен — рендер. По умолчанию React сравнивает попропсово через Object.is.</p><p>Эта деталь критична, потому что для объектов и функций Object.is — это, по сути, проверка по ссылке:</p><p>Содержимое выглядит идентичным, но ссылки разные. React поэтому считает их изменёнными. Именно по этой причине inline-объекты и колбэки оказываются скрытой причиной того, что мемоизированный дочерний компонент продолжает ререндериться.</p><p>Та же логика объясняет, зачем нужны useCallback и useMemo. По <a href="https://react.dev/reference/react/useCallback">документации React</a>, useCallback кеширует определение функции между рендерами, а useMemo — результат вычисления. Оба помогают только тогда, когда зависимости остаются достаточно стабильными, чтобы React переиспользовал предыдущее значение. Если положить в массив зависимостей нестабильный объект, React видит новую зависимость на каждом рендере и пересчитывает заново.</p><p>Это и объясняет, почему баг ощущается запутанным в реальном приложении. Значения «выглядят» неизменными для человека: у style-объекта те же ключи, тело колбэка идентично, config всё ещё говорит то же самое. Но React не сравнивает намерение или структуру — он сравнивает идентичность.</p><h2>Когда inline-пропсы реально становятся проблемой</h2><p>Стоит провести границу между теоретической и практической ценой. Inline-колбэк сам по себе — не баг производительности. Если ребёнок дешёвый, частота рендера низкая и memoization-границы вокруг нет, измеримого отрицательного эффекта может вообще не быть. И в документации React, и в гайдах LogRocket по производительности — общее место: оптимизация работает там, где есть реальные узкие места, а не гипотетические.</p><p>Проблема начинается, когда сходятся три условия одновременно:</p><ul><li>Родитель ререндерится часто (поиск, скролл, фильтры, анимация, live data).</li><li>Дочерний компонент или поддерево большое — лишняя работа заметна.</li><li>Вы уже добавили memoization и ждёте, что React пропустит работу, когда «ничего важного не изменилось».</li></ul><p>В такой связке нестабильные inline-ссылки не просто добавляют немного оверхеда — они <b>обнуляют ту оптимизацию, которую вы намеренно ввели</b>. И этот паттерн коварен в продакшене: он не объявляет себя багом. UI работает, исключений нет, предупреждений нет, и без профилировщика часто нет очевидного запаха. Цена проявляется иначе: тормозящая фильтрация списков, лаг ввода, шумные flame-графы и компонентные деревья, которые продолжают перерисовываться, даже когда осмысленные данные не менялись.</p><h2>Контролируемый эксперимент: 200 memoized строк</h2><p>Чтобы не спорить «плохо или нормально», автор поста собрал контролируемый тест: поисковый список товаров с 200 memoized строками, где каждая строка получает одинаковые логические значения, но новые ссылки на объект и функцию на каждом рендере родителя. Это позволяет напрямую увидеть, делает ли React.memo bail out или всё поддерево ререндерится на каждое нажатие клавиши.</p><p>Представьте storefront UI с 200 memoized ProductRow. Родитель — ProductList — хранит searchTerm в state. Каждое нажатие апдейтит state, ререндерит ProductList и снова прогоняет JSX, который мапает отфильтрованные товары. В эксперименте каждая ProductRow обёрнута в memo и помечена whyDidYouRender = true, но получает два inline-пропса в месте вызова:</p><p>Это ровно тот случай, о котором React предупреждает при передаче функций в memoized-компоненты: свежая функция или объект, созданные во время рендера, не пройдут сравнение пропсов, если ссылку не стабилизировать.</p><p>В эксперименте эффект становится виден почти мгновенно. Объект style и колбэк onAddToCart пересоздаются каждый раз, когда ререндерится ProductList, поэтому memo-обёртка видит изменённые пропсы для каждой строки на каждом нажатии. Счётчик рендеров делает это конкретным: после шести нажатий каждая видимая строка показывает <b>Renders: 14</b>. React Profiler затем показывает рантайм-цену ошибки: одно нажатие порождает коммит, в котором ProductList занимает <b>243,9 мс</b> и все 200 row-fibers светятся в flame-графе.</p><p>Здесь React Developer Tools отрабатывают по полной. По официальной документации, React DevTools позволяют инспектировать компоненты, редактировать пропсы и state, а также находить проблемы производительности. Профайлер также доступен программно через &lt;Profiler&gt;, но интерактивный вид DevTools обычно используется командами для отладки.</p><p><a href="https://github.com/welldone-software/why-did-you-render">Why Did You Render</a> делает корневую причину ещё нагляднее. Пакет модифицирует React и сообщает о потенциально избегаемых ререндерах. В этом примере он рапортует props.style как «different objects that are equal by value» и props.onAddToCart как «different functions with the same name» — ровно тот референциальный мисматч, который мы и ожидаем. Это диагностический инструмент только для разработки, не для прода, но крайне эффективный для выявления этого класса багов.</p><h2>Рефакторинг, который реально решает проблему</h2><p>Чтобы остановить каскад рендеров, нужны стабильные ссылки. Концептуально фикс прост: значения, которые не меняются, не должны пересоздаваться во время рендера; колбэки, которым нужно жить через рендеры, должны быть memoized, когда ребёнок зависит от референциальной стабильности.</p><p>Вынос ROW_STYLE в module scope решает проблему на самом дешёвом уровне: React никогда не видит новую ссылку на объект, потому что он создаётся один раз вне компонента. Использование useCallback для handleAddToCart даёт ребёнку стабильную ссылку на функцию между рендерами, пока массив зависимостей не меняется. Это и есть тот случай, для которого React документирует useCallback при передаче функций в мемоизированных детей.</p><p>В эксперименте стабилизация ссылок восстанавливает bail-out. Измеренный результат впечатляет: ProductList падает с 243,9 мс до <b>6 мс</b>, бейджи рендеров остаются на <b>2</b> сколько ни печатай, и Why Did You Render замолкает — избегаемых референциальных мисматчей больше нет.</p><h2>Когда стабилизировать ссылки, а когда — нет</h2><p>Это часть, которая часто теряется в дискуссиях про производительность. Урок не «никогда не используй inline-объекты» и не «оборачивай всё в useCallback». Урок: <b>memoization — это контракт</b>. Если ребёнок полагается на референциальное равенство, чтобы пропустить работу, родитель обязан этот контракт уважать и передавать стабильные ссылки.</p><p>Но это не значит, что каждому компоненту нужна агрессивная мемоизация. Современные рекомендации React всё ещё трактуют memoization как точечную оптимизацию, а не дефолтный стиль. Если рендер дешёвый, поддерево маленькое или ребёнок не memoized, стабилизация ссылок может добавить сложности без реальной выгоды. Поэтому большинство гайдов по React performance, включая обзоры LogRocket, акцентируют профилировку прежде, чем механически оптимизировать.</p><p>Полезное правило большого пальца: <b>сначала перенеси, потом мемоизируй</b>. Если значение статично — вынеси его за пределы тела компонента, прежде чем тянуться к хукам. Это даёт референциальную стабильность почти без когнитивной или рантайм-нагрузки. useCallback и useMemo — только когда значение реально динамическое и ребёнок выигрывает от стабильной идентичности.</p><h2>Меняет ли это React Compiler</h2><p>Один актуальный нюанс — <a href="https://react.dev/learn/react-compiler">React Compiler</a>. Документация описывает его как стабильный билд-тайм инструмент, который автоматически оптимизирует React-приложения и по умолчанию мемоизирует код на основе анализа и эвристик. Это уменьшает потребность в ручных useMemo, useCallback и React.memo, особенно в новом коде.</p><p>Но это не делает референциальную стабильность нерелевантной. Документация также отмечает, что useMemo и useCallback остаются полезными как escape hatch для случаев, когда разработчику нужен точный контроль — например, чтобы держать memoized-значение стабильным как зависимость для Effect. Так что даже в кодовых базах, переходящих на React Compiler, всё равно полезно понимать, как нестабильные ссылки влияют на ререндеры, результаты профайлера и кейсы, где ручной контроль ещё нужен.</p><h2>Итог</h2><p>Inline-объекты и inline-колбэки — не плохой React-код по умолчанию. Чаще всего это просто обычные JavaScript-выражения внутри JSX. Проблема появляется, когда они пересекают memoization-границу и вы ждёте, что React воспримет «то же значение» как «тот же пропс». По умолчанию React сравнивает пропсы и зависимости хуков через Object.is, поэтому для объектов и функций новой ссылки достаточно, чтобы React счёл значение изменившимся.</p><p>Этот паттерн заслуживает большего внимания, чем обычно получает. Это не пустяковая микрооптимизация. Это один из самых простых способов случайно обнулить React.memo — особенно в фильтруемых списках, дашбордах, search-heavy UI и компонентных деревьях с дорогими потомками. Код выглядит чистым, приложение работает, но оптимизация, на которую вы рассчитывали, исчезает.</p><p>Практический вывод для команд, строящих быстрые React-интерфейсы: <b>профилируй сначала</b>. Если memoized поддерево всё ещё ререндерится слишком часто — проверь пропсы прежде, чем винить React. Перенеси статичные объекты из render-пути. Мемоизируйте колбэки только тогда, когда ребёнок реально выигрывает. Используй React DevTools и Why Did You Render, чтобы подтвердить, что именно изменилось и почему. Делай это последовательно — и React.memo перестанет быть декоративным куском кода и начнёт делать свою работу.</p><p>Источник: <a href="https://blog.logrocket.com/react-pattern-everyone-uses-kills-performance/">The React pattern everyone uses that quietly kills performance — LogRocket Blog</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я написал 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[Сервер]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Grafana]]></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>TanStack съедает экосистему React, и никто об этом не говорит</title>
      <link>https://tproger.ru/translations/tanstack-sedaet-ekosistemu-react-i-nikto-ob-etom-ne-govorit</link>
      <comments>https://tproger.ru/translations/tanstack-sedaet-ekosistemu-react-i-nikto-ob-etom-ne-govorit?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/tanstack-sedaet-ekosistemu-react-i-nikto-ob-etom-ne-govorit</guid>
      <description><![CDATA[<p>Перевод колонки разработчика: как TanStack за два года из одной библиотеки (Query) превратился в полную платформу из восьми библиотек, которая вытесняет Next.js, Redux и React Router.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/tanstack-sedaet-ekosistemu-react-i-nikto-ob-etom-ne-govorit">TanStack съедает экосистему React, и никто об этом не говорит</a>»</p>]]></description>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Apr 2026 11:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы пишете на React и давно не пересматривали свой стек — загляните в package.json. Велика вероятность, что половина ваших зависимостей уже из семейства TanStack, а вы этого не планировали. Публикуем перевод <a href="https://dev.to/harsh2644/tanstack-is-eating-reacts-ecosystem-and-nobody-is-talking-about-it-10n0">колонки разработчика Harsh с dev.to</a> о том, как за два года TanStack превратился из одной библиотеки в полноценную платформу, которая вытесняет Next.js, Redux и React Router.</p><p>Полгода назад я бы посмеялся над таким заголовком. TanStack? Это же ребята, которые делают React Query. Съедают экосистему? Я много лет пользовался React Query, любил его, рекомендовал всем — но воспринимал TanStack как одну библиотеку. Отличную библиотеку, не больше.</p><p>Потом я обновил проект в прошлом месяце и заметил кое-что. Я уже использовал TanStack Query, TanStack Router и TanStack Table. TanStack Form начал заменять React Hook Form в новых проектах. А TanStack Start полностью вытеснил мой Next.js-сетап. Я открыл package.json — и почувствовал странное: половина моего стека оказалась TanStack. Не потому что я так планировал, а потому что по одной библиотеке за раз, месяц за месяцем, TanStack просто становился лучшим выбором. И я шёл за лучшим выбором, не задумываясь, куда это меня ведёт.</p><ul><li>TanStack превратился из одной библиотеки (Query) в полноценную платформу из восьми взаимосвязанных продуктов: Query, Router, Table, Form, Start, Store, DB и AI</li><li>По State of React 2026 (~3700 разработчиков) у TanStack Query 68% использования и всего 1% негатива, у Next.js — те же ~80% охвата, но в 17 раз больше негатива</li><li>Главное отличие философии: все библиотеки TanStack headless — они делают логику, а UI и рендеринг остаются за вами</li><li>TanStack Router и TanStack Start дают сквозную типизацию по всему приложению — от search params до server functions</li><li>Реальность: TanStack Start ещё RC, TanStack DB — в бете, TanStack AI — в альфе. На прод сейчас безопасно только Query/Router/Table/Form/Store</li><li>Рекомендация автора: Query ставьте уже сегодня, Router — на новом greenfield-проекте, Start — пока наблюдайте</li></ul><h2>Что сейчас вообще такое TanStack</h2><p>Два года назад TanStack означал одно: React Query — лучшая библиотека для фетчинга данных в экосистеме React. Простая, мощная, решала реальную проблему. Сегодня TanStack — это восемь взаимосвязанных библиотек, которые вместе образуют полноценную фронтенд-платформу.</p><ul><li><a href="https://tanstack.com/query"><b>TanStack Query</b></a> — заменяет ручной fetch + useEffect. Стабильна, 68% использования</li><li><a href="https://tanstack.com/router"><b>TanStack Router</b></a> — заменяет React Router и роутинг Next.js. Стабильна</li><li><a href="https://tanstack.com/table"><b>TanStack Table</b></a> — заменяет все табличные библиотеки сразу. Стабильна</li><li><a href="https://tanstack.com/form"><b>TanStack Form</b></a> — заменяет React Hook Form. Стабильна</li><li><a href="https://tanstack.com/start"><b>TanStack Start</b></a> — заменяет Next.js и Remix. RC, активно растёт</li><li><a href="https://tanstack.com/store"><b>TanStack Store</b></a> — заменяет Zustand и Redux. Стабильна</li><li><a href="https://tanstack.com/db"><b>TanStack DB</b></a> — заменяет Firebase и Supabase-клиенты. Бета</li><li><b>TanStack AI</b> — заменяет AI SDK других вендоров. Альфа</li></ul><p>Два года назад — одна библиотека. Сегодня — целая платформа, которая может заменить ваш фреймворк. И почему-то большинство разработчиков до сих пор спят.</p><h2>Момент, который всё изменил</h2><p>Восемь месяцев назад я дебажил проблему с роутингом в проекте на Next.js. Конкретно — URL search params. Это когда фильтры, пагинация и сортировка живут в URL, чтобы пользователи могли делиться ссылками, а кнопка «Назад» работала правильно.</p><p>В Next.js для этого нужно жонглировать тремя хуками:</p><p>Работало. Но многословно. И не типобезопасно: searchParams.get('category') возвращает string | null, и TypeScript не знает, какие значения валидны. А потом я увидел, как коллега делает ровно то же самое через TanStack Router:</p><p>TypeScript точно знал, какого типа category и page. Он упал бы при компиляции, если бы я попытался установить невалидное значение. Состояние URL и типы TypeScript были в идеальной синхронизации. Я долго смотрел на этот код, потом открыл новую ветку и начал миграцию.</p><h2>Цифры — State of React 2026</h2><p>Здесь история перестаёт быть моей личной и становится чем-то большим. Опрос <a href="https://2026.stateofreact.com/">State of React 2026</a> — более 3700 разработчиков, опубликован в феврале 2026 — дал показательные результаты.</p><p>Next.js, который когда-то казался стандартом для фулстек-React, широко используется, но не особо любим: 80% респондентов им пользовались, у 17% — негативное отношение, основные жалобы на избыточную сложность и слишком тесную интеграцию с главным спонсором (Vercel).</p><p>А вот цифры по TanStack Query: 68% использования, 42% позитивного отношения, <b>1% негативного</b>. Один процент негатива у библиотеки, которой пользуется 68% React-разработчиков. Это ненормально хорошие цифры. Для сравнения: у Next.js в 17 раз больше негатива при примерно том же охвате. Экосистема говорит. Большинство просто пока не слушает.</p><h2>Почему TanStack выигрывает</h2><p>После нескольких месяцев размышлений я для себя так это сформулировал: TanStack выигрывает потому, что у него есть философия — и эта философия лучше той, которую он заменяет.</p><p>Философия звучит так: <b>владей своим кодом, а не фреймворком</b>. Каждая библиотека TanStack — headless by design, то есть без встроенного UI: она занимается логикой, а вёрстку и стили делаете вы. Нет никакого готового TanStack-компонента, который нужно подгонять под свой дизайн. Нет TanStack-стилей, с которыми нужно воевать. Нет мнения TanStack о том, как должно выглядеть ваше приложение.</p><p>Сравните это с Next.js — там ваши &lt;Image&gt;, шрифты, роутинг и серверное поведение контролируются фреймворком. Вы получаете мощь, но платите вендор-лок-ином. «Vendor lock-in, сложные API и слишком много шума в экосистеме Next.js — для меня это no-go», — так сформулировал один из респондентов опроса. Ответ TanStack на эту жалобу — архитектурный: это не фреймворк, а набор строительных блоков. Код — ваш, решения — ваши, а TanStack просто берёт на себя сложные части.</p><h2>Ключевые библиотеки, которые стоит знать прямо сейчас</h2><h3>1. TanStack Query — вы наверняка уже им пользуетесь</h3><p>Если вы ещё не используете <a href="https://tanstack.com/query">TanStack Query</a> — остановитесь и поставьте его прямо сейчас: npm i @tanstack/react-query плюс обернуть приложение в QueryClientProvider. Я подожду.</p><p>Кеширование, фоновые рефетчи, stale-while-revalidate (показываем старые данные, пока подгружаются свежие), оптимистичные обновления, бесконечный скролл, devtools — всё в комплекте. Это точка входа в экосистему TanStack — именно с Query начинают большинство.</p><h3>2. TanStack Router — тот, который удивит больше всего</h3><p>Это библиотека, которая окончательно перетянула меня на сторону TanStack. Полная сквозная типизация по всему слою роутинга — не только пути, но и search params, контекст маршрута, данные лоадеров — всё типизируется от маршрута до компонента.</p><p>Если у вас хоть раз был баг из-за того, что useParams() вернул undefined, а TypeScript не предупредил — TanStack Router и есть ответ.</p><h3>3. TanStack Form — наследник React Hook Form</h3><p>React Hook Form — отличная библиотека. TanStack Form — это то, чем был бы React Hook Form, если бы его писали сегодня, с TypeScript-first подходом. Никаких строковых register('email') — все имена полей проверяются типами.</p><h3>4. TanStack Start — альтернатива Next.js, которую никто не ждал</h3><p>Это самое новое и самое спорное пополнение. TanStack Start — это меньше магии и больше контроля: вы сами решаете, как грузятся данные, где они запускаются и что рендерится. Типобезопасность отличная, и Start прекрасно дружит со всей остальной экосистемой TanStack. Полноценный fullstack-фреймворк поверх TanStack Router — SSR, стриминг, server functions, всё как в Next.js, но без привязки к Vercel и с end-to-end типизацией.</p><p>Больше не нужно гадать, что возвращает ваш API: типы текут от базы данных до компонента без единой ручной аннотации.</p><h3>5. TanStack DB и AI — будущее, которое строится прямо сейчас</h3><p>У TanStack есть несколько проектов на ранних стадиях: помимо стабильных Query/Router/Table/Form/Store, в бете — TanStack DB, в альфе — TanStack AI, а ещё есть TanStack CLI со встроенным MCP-сервером (Model Context Protocol) для работы с ИИ-агентами.</p><p>TanStack DB — реактивное клиентское хранилище данных: что-то вроде Firebase, но без привязки к вендору. TanStack AI — унифицированный интерфейс к разным ИИ-провайдерам: один и тот же API, независимо от того, дёргаете ли вы Claude, GPT-4 или Gemini. И то, и другое пока не прод — но они показывают, куда движется TanStack. Это уже не библиотеки, это платформа.</p><h2>Честный контраргумент</h2><p>Я выставил TanStack серебряной пулей. Это не так. Если ваша команда хорошо знает Redux и React Router, потеря продуктивности на изучение новых инструментов может не окупиться. У Next.js годы боевой эксплуатации на проде. Redux-разработчиков на рынке больше, чем TanStack-разработчиков, — это важно для найма. Если вам нужна скучная и предсказуемая технология, оставайтесь на привычном стеке.</p><p>Ещё один момент: если вам нужны React Server Components с полной прод-поддержкой уже сегодня — Next.js всё ещё ответ. И если ваша команда глубоко в Redux, а переход на новое означает месяцы переобучения, — цена, возможно, не оправдана. TanStack — отличный инструмент, но не всегда правильный выбор. Используйте его, когда его сильные стороны совпадают с вашими задачами.</p><h2>Так стоит ли переходить</h2><p>Честная рекомендация после шести месяцев жизни в экосистеме TanStack:</p><ul><li><b>Ставьте Query уже сегодня.</b> Если вы ещё не пользуетесь — это самое выгодное по ROI изменение, которое можно сделать в React-кодбазе. Минимум риска, моментальный эффект, плюс это ворота в понимание философии TanStack</li><li><b>Попробуйте Router на следующем greenfield-проекте</b> (то есть новом, с чистого листа). Не мигрируйте существующее приложение — ценность яснее всего видна, когда вы стартуете с типобезопасности с первого дня</li><li><b>Наблюдайте за Start.</b> Он ещё не так стабилен, как Next.js. Но траектория понятна: разработчики, которые изучат его сейчас, получат заметное преимущество, когда он дойдёт до 1.0</li><li><b>Следите за DB и AI.</b> Оба слишком ранние для прода. Но они показывают амбиции команды TanStack — и, судя по её послужному списку, получатся отлично, когда будут готовы</li></ul><h2>Что всё это значит</h2><p>TanStack выигрывает не потому, что маркетит себя лучше Next.js, и не благодаря виральным твитам или докладам на конференциях. Он выигрывает, потому что решает проблему, которая реально болит у React-разработчиков в 2026 году: слишком много магии, слишком много вендор-лок-ина, слишком много сложности, которая живёт не в вашем коде, а в фреймворке.</p><p>TanStack возвращает вам контроль. Полную типобезопасность. Никакого скрытого поведения. Никакой зависимости от вендора. Просто хорошо спроектированные примитивы, которые делают ровно то, что написано на коробке. В эпоху, когда ИИ пишет всё больше кода за нас, эта ясность важнее, чем когда-либо: ИИ-инструменты работают лучше с явным типизированным кодом, чем с магическими конвенциями фреймворков. TanStack не планировал съесть экосистему React. Он просто построил инструменты получше — и разработчики пошли за лучшими инструментами. Так экосистемы и меняются на самом деле — не анонсами, а пул-реквестами.</p><p>Источник: колонка <a href="https://dev.to/harsh2644/tanstack-is-eating-reacts-ecosystem-and-nobody-is-talking-about-it-10n0">TanStack is eating React's ecosystem and nobody is talking about it</a> на dev.to. Автор: разработчик <a href="https://dev.to/harsh2644">harsh2644</a>. Перевод сокращён и адаптирован, авторские мнения сохранены.</p>]]></content:encoded>
    </item>
    <item>
      <title>Railway ушёл с Next.js — время сборки сократилось с 10 минут до 2</title>
      <link>https://tproger.ru/news/railway-uwyol-s-next-js-vremya-sborki-sokratilos-s-10-minut-do</link>
      <comments>https://tproger.ru/news/railway-uwyol-s-next-js-vremya-sborki-sokratilos-s-10-minut-do?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/railway-uwyol-s-next-js-vremya-sborki-sokratilos-s-10-minut-do</guid>
      <description><![CDATA[<p>Облачная платформа Railway перевела весь фронтенд с Next.js на Vite + TanStack Start и ускорила сборку в 5 раз. Разбираем причины и тренд ухода с Next.js.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/railway-uwyol-s-next-js-vremya-sborki-sokratilos-s-10-minut-do">Railway ушёл с Next.js — время сборки сократилось с 10 минут до 2</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Apr 2026 12:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваш фронтенд собирается дольше 10 минут — возможно, дело не в коде, а во фреймворке. Облачная платформа <a href="https://railway.com">Railway</a> перевела свой фронтенд с Next.js на Vite + TanStack Start — и сократила время сборки с 10+ минут до менее 2.</p><p><a href="https://railway.com">Railway</a> — облачная PaaS-платформа (аналог Heroku), которую используют десятки тысяч разработчиков для деплоя приложений. Их собственный фронтенд — дашборд, документация, маркетинговые страницы — работал на Next.js.</p><ul><li>Railway перевёл весь фронтенд с Next.js на Vite + TanStack Start</li><li>Время сборки сократилось с 10+ минут до менее 2 минут</li><li>Это часть тренда: крупные проекты всё чаще уходят с Next.js из-за сложности сборки и несоответствия App Router их архитектуре</li><li>Railway — не первые: с Next.js публично уходили Kent C. Dodds и другие команды</li></ul><h2>Почему ушли с Next.js</h2><p>По словам команды Railway, основные проблемы были связаны с временем сборки и сложностью инфраструктуры. Next.js-приложение Railway разрослось до такого масштаба, что каждый билд занимал более 10 минут — это тормозило CI/CD-пайплайн и замедляло итерации.</p><p>Дополнительные факторы:</p><ul><li>Несоответствие App Router модели Railway — у них client-first продукт, а App Router ориентирован на server-first подход</li><li>Сложность конфигурации Next.js для нестандартных кейсов — когда приложение выходит за рамки «блога на Vercel», настройка становится нетривиальной</li><li>Размер бандла и время cold start при серверном рендеринге</li></ul><h2>Что получили</h2><p>После миграции время сборки упало с 10+ минут до менее 2 — ускорение более чем в 5 раз. Для команды, которая деплоит десятки раз в день, это означает экономию часов ежедневно.</p><p>Публикация <a href="https://railway.com/blog">вызвала</a> бурное обсуждение на Hacker News (206 очков, 188 комментариев). Мнения разделились: одни поддержали решение, другие указали, что проблема не в Next.js, а в архитектуре конкретного приложения.</p><h2>Часть тренда</h2><p>Railway — не первые, кто публично уходит с Next.js. За последний год аналогичные решения приняли:</p><ul><li><a href="https://kentcdodds.com">Kent C. Dodds</a> — публично отказался от Next.js в пользу Remix, который позже влился в React Router 7</li><li>Многие команды переходят на Vite + React или SvelteKit для ускорения сборки</li></ul><p>Общая тенденция: Next.js отлично подходит для проектов, которые деплоятся на Vercel и укладываются в стандартные паттерны. Для крупных client-first приложений с нестандартной инфраструктурой издержки фреймворка начинают перевешивать преимущества.</p><p>Для фронтенд-разработчиков это повод задуматься: фреймворк — инструмент, а не религия. Если сборка тормозит, DX деградирует, а большая часть фич фреймворка не используется — возможно, пора пересмотреть стек.</p>]]></content:encoded>
    </item>
    <item>
      <title>React vs Vue в 2026 году: какой фреймворк выбрать</title>
      <link>https://tproger.ru/articles/react-vs-vue-v-2026-godu--kakoj-frejmvork-vybrat</link>
      <comments>https://tproger.ru/articles/react-vs-vue-v-2026-godu--kakoj-frejmvork-vybrat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/react-vs-vue-v-2026-godu--kakoj-frejmvork-vybrat</guid>
      <description><![CDATA[<p>Сравниваем React и Vue в 2026 году по производительности, экосистеме, рынку вакансий и порогу входа. Актуальные данные и рекомендации по выбору фреймворка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/react-vs-vue-v-2026-godu--kakoj-frejmvork-vybrat">React vs Vue в 2026 году: какой фреймворк выбрать</a>»</p>]]></description>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 28 Mar 2026 15:32:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>React или Vue — вечный спор среди фронтенд-разработчиков. Одни клянутся гибкостью React и его экосистемой, другие ценят элегантность Vue и низкий порог входа. Но в 2026 году оба фреймворка серьёзно изменились: React получил Server Components и Compiler, Vue готовит революционный Vapor Mode. Разберёмся на актуальных данных, какой инструмент подойдёт именно вам.</p><p><b>React</b> — JavaScript-библиотека для создания пользовательских интерфейсов, разработанная Meta (ранее Facebook). <b>Vue.js</b> — прогрессивный фреймворк для создания UI, созданный Эваном Ю (Evan You). Оба инструмента используют компонентный подход и виртуальный DOM, но различаются в философии, синтаксисе и экосистеме.</p><p>— React лидирует по npm-загрузкам (429 млн/мес против 47 млн у Vue) и рынку вакансий</p><p>— Vue проще в освоении и имеет более целостную экосистему «из коробки»</p><p>— React 19.2 принёс Activity, Performance Tracks и useEffectEvent</p><p>— Vue Vapor Mode обещает производительность без виртуального DOM</p><p>— Для крупных корпоративных проектов React остаётся безопасным выбором</p><p>— Для быстрого старта и небольших команд Vue даёт преимущество в скорости разработки</p><h2>React в 2026 — что нового</h2><p>React продолжает эволюционировать. В 2025–2026 годах произошло несколько значимых событий, которые определили направление развития библиотеки.</p><h3>React 19 и Server Components</h3><p>React 19 стал самым масштабным обновлением со времён хуков. <b>Server Components (RSC)</b> — компоненты, которые рендерятся на сервере и не увеличивают клиентский бандл — перешли из экспериментального статуса в стабильный. Это позволяет снизить объём JavaScript, отправляемого клиенту, на 30–50% в типичных приложениях.</p><p>Ключевые нововведения React 19:</p><ul><li><b>Actions</b> — встроенная обработка форм с серверными и клиентскими экшенами</li><li><b>useOptimistic</b> — хук для оптимистичных обновлений UI</li><li><b>use()</b> — новый хук для чтения промисов и контекста в рендере</li><li><b>Нативная поддержка метаданных</b> — title, meta, link можно рендерить прямо в компонентах</li><li><b>Улучшенная поддержка Web Components</b> — полная интеграция с кастомными элементами</li></ul><h3>React 19.2 и Compiler v1.0</h3><p>Вышедший в 2026 году React 19.2 добавил экспериментальные фичи: <b>Activity</b> (управление жизненным циклом скрытых компонентов), <b>React Performance Tracks</b> (интеграция с DevTools для профилирования) и <b>useEffectEvent</b>.</p><p>Отдельное событие — выход <b>React Compiler v1.0</b>. Компилятор автоматически мемоизирует компоненты, устраняя необходимость ручного использования useMemo, useCallback и React.memo. По данным Meta, это сократило количество ре-рендеров в их приложениях на 40%.</p><h3>React Foundation и Linux Foundation</h3><p>В 2025 году React перешёл под управление <a href="https://react.dev/blog">React Foundation</a> при Linux Foundation. Это означает более открытое управление проектом и снижение зависимости от одной компании. Для разработчиков это сигнал долгосрочной стабильности.</p><h2>Vue в 2026 — что нового</h2><p>Vue тоже не стоит на месте. Хотя темп обновлений ниже, чем у React, каждый релиз Vue приносит продуманные и обратно совместимые улучшения.</p><h3>Vue 3.5 — стабильность и производительность</h3><p>Вышедший в сентябре 2024 года Vue 3.5 ("Tengen Toppa Gurren Lagann") сфокусирован на внутренних улучшениях производительности. Реактивная система была оптимизирована для более точного отслеживания зависимостей, а потребление памяти снижено на 56% по данным бенчмарков команды Vue.</p><p>Ключевые улучшения Vue 3.5:</p><ul><li><b>useTemplateRef()</b> — типобезопасные ссылки на элементы</li><li><b>Deferred Teleport</b> — телепортация контента с отложенным рендерингом</li><li><b>Lazy Hydration</b> — ленивая гидратация для SSR-приложений</li><li><b>useId()</b> — генерация стабильных уникальных ID для SSR</li><li><b>Улучшенный watch</b> — deep watch с поддержкой паузы и возобновления</li></ul><h3>Vapor Mode — будущее без виртуального DOM</h3><p><b>Vapor Mode</b> — экспериментальный режим компиляции Vue, который генерирует код без виртуального DOM. Вместо создания виртуального дерева и его сравнения (diffing) Vapor Mode компилирует шаблоны в прямые DOM-операции. Это аналог подхода <a href="https://svelte.dev/">Svelte</a>, но с сохранением API Vue.</p><p>По предварительным бенчмаркам, Vapor Mode показывает прирост производительности в 2–3 раза на операциях обновления. Проект находится в активной разработке на <a href="https://github.com/vuejs/core-vapor">GitHub</a> (2400+ звёзд), но пока не рекомендован для продакшена.</p><h3>Nuxt 4 — полная переработка</h3><p><b>Nuxt 4</b> вышел в 2025 году и уже добрался до версии 4.4. Это полная переработка мета-фреймворка для Vue с улучшенной архитектурой, нативной поддержкой серверных компонентов и обновлённым Nuxt UI v4. Для Vue-экосистемы Nuxt 4 — это то же, что Next.js для React.</p><h2>Сравнение по критериям</h2><p>Рассмотрим ключевые метрики, которые помогут сделать осознанный выбор. Все данные актуальны на март 2026 года.</p><p><b>Критерий / React / Vue</b></p><h3>Производительность</h3><p>В стандартных бенчмарках (js-framework-benchmark) React и Vue показывают сопоставимые результаты. React с Compiler v1.0 автоматически оптимизирует ре-рендеры, Vue 3.5 имеет более эффективную реактивную систему. На практике разница в производительности редко становится решающим фактором — оба фреймворка достаточно быстры для подавляющего большинства задач.</p><p>Реальная разница появляется в экстремальных сценариях: Vue Vapor Mode (когда выйдет из эксперимента) обещает преимущество за счёт отказа от виртуального DOM, а React Server Components снижают нагрузку на клиент, перенося логику на сервер.</p><h3>Порог входа</h3><p>Vue традиционно считается более дружелюбным к новичкам. Однокомпонентные файлы (SFC) с секциями &lt;template&gt;, &lt;script&gt; и &lt;style&gt; интуитивно понятны. Документация Vue — одна из лучших в индустрии.</p><p>React требует понимания JSX, хуков и однонаправленного потока данных. С приходом Server Components и Compiler порог входа вырос — нужно разбираться, какие компоненты серверные, а какие клиентские. По данным State of JS 2024, React назвали "избыточно сложным" чаще других фреймворков.</p><h3>Экосистема</h3><p>React обладает самой большой экосистемой в мире фронтенда. <b>Next.js</b>, <b>Remix</b>, <b>React Native</b>, тысячи UI-библиотек (Material UI, Ant Design, Chakra UI, shadcn/ui) — для любой задачи найдётся готовое решение. Обратная сторона — проблема выбора: для одной задачи существует десяток конкурирующих библиотек.</p><p>Vue предлагает более целостный подход. Официальные решения покрывают большинство потребностей: <b>Vue Router</b>, <b>Pinia</b> (стейт-менеджмент), <b>Nuxt</b> (SSR/SSG), <b>Vuetify</b> и <b>PrimeVue</b> (UI). Меньше выбора, но меньше и головной боли.</p><h3>Рынок вакансий</h3><p>По данным npm, React скачивают <b>429 млн раз в месяц</b> против <b>47 млн у Vue</b> — разрыв примерно в 9 раз. На GitHub суммарно у React <b>244 000</b> звёзд, у Vue — <b>263 000</b> (с учётом Vue 2 и Vue 3 репозиториев). Однако звёзды на GitHub не отражают реальное использование в продакшене.</p><p>На рынке труда React доминирует. По данным <a href="https://survey.stackoverflow.co/2024">Stack Overflow Developer Survey 2024</a>, React используют на работе значительно чаще, чем Vue. На hh.ru и LinkedIn вакансий с React в 3–4 раза больше, чем с Vue. Это важно для тех, кто строит карьеру.</p><h3>Размер бандла</h3><p>Минифицированный и сжатый (gzip) размер:</p><ul><li><b>React</b> (react + react-dom): ~44 КБ</li><li><b>Vue 3</b>: ~33 КБ</li></ul><p>Vue компактнее на ~25%. С React Server Components часть кода не попадает в клиентский бандл вовсе, что может нивелировать эту разницу. Vue Vapor Mode в будущем обещает ещё меньший размер за счёт tree-shaking рантайма виртуального DOM.</p><h3>Поддержка TypeScript</h3><p>Оба фреймворка отлично работают с TypeScript, но подходы различаются.</p><p>Vue 3 написан на TypeScript и предоставляет первоклассную типизацию «из коробки». &lt;script setup lang="ts"&gt; в SFC — лаконичный и типобезопасный способ писать компоненты. IDE-поддержка через Volar (теперь часть Vue Language Tools) значительно улучшилась.</p><p>React исторически использует .tsx файлы и имеет зрелую систему типов через @types/react. Типизация хуков и контекста может быть многословной, но хорошо документирована. React Compiler v1.0 полностью поддерживает TypeScript.</p><h2>Когда выбрать React</h2><p>React — оптимальный выбор в следующих ситуациях:</p><ul><li><b>Крупный корпоративный проект</b> — максимальная экосистема, проще найти разработчиков</li><li><b>Нужен React Native</b> — единая кодовая база для веб и мобильных приложений</li><li><b>Server-side rendering</b> — Next.js с React Server Components даёт лучший в классе SSR</li><li><b>Большая команда</b> — огромное сообщество, много документации и готовых решений</li><li><b>Карьерные перспективы</b> — React-вакансий на рынке в 3–4 раза больше</li><li><b>Сложные интерактивные интерфейсы</b> — дашборды, real-time приложения, графические редакторы</li></ul><p>React подходит тем, кто готов инвестировать время в изучение экосистемы и не боится "усталости от выбора" (framework fatigue). Если команда уже знает React — смена на Vue ради смены не имеет смысла.</p><h2>Когда выбрать Vue</h2><p>Vue — лучший выбор, когда:</p><ul><li><b>Быстрый старт проекта</b> — от идеи до прототипа за минимальное время</li><li><b>Небольшая команда</b> — целостная экосистема снижает время на принятие решений</li><li><b>Постепенная миграция</b> — Vue можно внедрять по частям в существующий проект</li><li><b>Обучение фронтенду</b> — низкий порог входа, отличная документация</li><li><b>Проекты на Laravel/Django/Rails</b> — Vue традиционно хорошо интегрируется с серверными фреймворками</li><li><b>Китайский рынок</b> — Vue крайне популярен в Китае (Alibaba, Baidu, Xiaomi используют его)</li></ul><p>Vue идеально подходит для команд, которые ценят прагматичность и хотят сфокусироваться на продукте, а не на выборе инструментов. Если проект не требует React Native или React-специфичных библиотек — Vue даст результат быстрее.</p><h2>Выводы</h2><p>В 2026 году и React, и Vue — зрелые, стабильные инструменты с активным развитием. Спор «что лучше» не имеет универсального ответа — выбор зависит от контекста проекта, команды и задач.</p><blockquote>React и Vue решают одну задачу разными способами. Важен не фреймворк, а то, как вы его используете. Выбирайте инструмент под задачу, а не задачу под инструмент.</blockquote><p><b>Выбирайте React</b>, если вам нужна максимальная экосистема, React Native, Server Components или вы ориентируетесь на рынок труда. <b>Выбирайте Vue</b>, если цените скорость разработки, целостный developer experience и низкий порог входа.</p><p>Оба фреймворка продолжают развиваться: React движется в сторону серверного рендеринга и компиляции, Vue — в сторону максимальной производительности через Vapor Mode. Следите за обновлениями обоих проектов и выбирайте то, что делает вашу команду продуктивнее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Headless WordPress: архитектура с Next.js, GraphQL и Cloudflare</title>
      <link>https://tproger.ru/articles/headless-wordpress--arhitektura-s-next-js--graphql-i-cloudflare</link>
      <comments>https://tproger.ru/articles/headless-wordpress--arhitektura-s-next-js--graphql-i-cloudflare?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Пехота]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/headless-wordpress--arhitektura-s-next-js--graphql-i-cloudflare</guid>
      <description><![CDATA[<p>Разбираем headless WordPress на практике: Next.js, Cloudflare Workers, GraphQL и архитектура быстрых и масштабируемых сайтов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/headless-wordpress--arhitektura-s-next-js--graphql-i-cloudflare">Headless WordPress: архитектура с Next.js, GraphQL и Cloudflare</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[WordPress]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Mar 2026 11:29:45 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Почему WordPress?</h2><p>WordPress часто не любят backend-разработчики, и у каждого на это есть свои причины. Кому-то не нравится функциональный стиль разработки, кто-то критикует form-builder и экосистему плагинов. У других WordPress как CMS и PHP как язык программирования до сих пор ассоциируются со стереотипами 10–15-летней давности - будто они устарели и уступают современным технологиям.</p><p>При этом реальность такова, что и PHP, и WordPress - отличные и современные инструменты, которые очень хорошо выполняют свои задачи. Опустим PHP - статья не об этом. Что же можно сказать про WordPress как про продукт и как CMS?</p><p>WordPress по‑прежнему остаётся самой популярной системой управления контентом. Согласно данным команды WordPress, платформа обслуживает более 43% всех веб-сайтов и занимает долю в 61% на рынке CMS. Также статистика показывает, что WordPress используется примерно на 59% сайтов, где известна CMS (это около 42% всего веба).</p><p>Данные были взяты из официального блога WordPress и сайта w3techs.com:</p><ul><li><a href="https://wordpress.com/blog/2025/04/17/wordpress-market-share/" rel="nofollow">https://wordpress.com/blog/2025/04/17/wordpress-market-share/ </a></li><li><a href="https://w3techs.com/technologies/overview/content_management" rel="nofollow">https://w3techs.com/technologies/overview/content_management</a></li><li><a href="https://w3techs.com/technologies/details/cm-wordpress" rel="nofollow">https://w3techs.com/technologies/details/cm-wordpress</a></li></ul><p>При этом, традиционный WordPress объединяет CMS, шаблоны на PHP и монолитные темы. Такая связка усложняет разработку с использованием современных JS фреймворков, а также затрудняет независимое масштабирование фронтенда и бэкенда, и оптимизацию производительности и безопасности. Жёсткая связка страниц, устаревшие PHP‑функции и не самый удобный девелоперский опыт часто заставляют команды искать альтернативы.</p><p>Headless WordPress решает эти проблемы: CMS становится админ-панелью для управления контентом, а отдельный фронтенд отвечает за UI. Такое разделение обязанностей даёт несколько преимуществ: четкое разделение ответственности, независимое масштабирование интерфейса и CMS, упрощенную локальную разработку и CI/CD. CMS превращается в API‑ориентированное хранилище, а современные фреймворки вроде Next.js берут на себя маршрутизацию и рендеринг.</p><h2>Headless WordPress с использованием WPGraphQL</h2><p>Чтобы использовать WordPress как headless‑CMS, нужен API. Также есть интересный пост про headless wordpress в их <a href="https://wordpress.com/blog/2025/03/20/headless-wordpress/" rel="nofollow">официальном блоге</a>.</p><p>В WordPress из коробки есть REST API, но для frontend и mobile приложений часто удобнее использовать GraphQL. <a href="https://wordpress.org/plugins/wp-graphql/" rel="nofollow">WPGraphQL</a> - это open source плагин, который добавляет GraphQL API в WordPress. Используя WPGraphQL, мы получаем:</p><ul><li>Гибкие запросы к таким сущностям, как посты, страницы, произвольным типам постов, таксономиям и пользователям.</li><li>Систему расширений которая позволяет расширять функционал GraphQL бекенда и таким образом поддерживать популярные плагины, тем самым позволяя возвращать дополнительные поля которые не относятся к стандартным полям Wordpress.</li><li>GraphQL API, который даёт очень удобный формат для интеграции фронтенд фреймворков таких как Next.js, Astro и SvelteKit.</li><li>Оптимизацию производительности, поскольку клиент запрашивает только нужные поля и данные делая один запрос вместо группы REST запросов + отдельный фронтенд забирает на себя часть запросов.</li></ul><p>В дополнение к доступному функционалу WPGraphQL можно добавлять дополнительные плагины-расширения, такие как <a href="https://wordpress.org/plugins/add-wpgraphql-seo/" rel="nofollow">WPGraphQL Yoast SEO</a> и <a href="https://woographql.com/" rel="nofollow">WooGraphQL</a> (WPGraphQL для WooCommerce). Таким образом добавив несколько плагинов в базовую инсталляцию CMS можно из коробки получить полностью функциональный GraphQL бекенд, который может покрыть запросы для блога, сео функционал, онлайн-магазин и тд.</p><p>Важно отметить, что изначальная идея использовать WPGraphQL пришла из статьи в блоге <a href="https://vercel.com/kb/guide/wordpress-with-vercel" rel="nofollow">Vercel</a>.</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/838bc085-bfe5-4888-a326-6dcc00b0aaf5.webp" alt="Сравнение традиционного WordPress и headless WordPress: монолитная CMS с PHP темами против архитектуры с WPGraphQL API и Next.js фронтендом" /><figcaption>Традиционный WordPress vs Headless WordPress: разделение CMS и frontend через API (WPGraphQL + Next.js)</figcaption></figure><h2>Фронтенд на Next.js</h2><p><a href="https://nextjs.org/" rel="nofollow"> Next.js</a> - production-ready React-фреймворк, который разрабатывается компанией Vercel. Многие используют его по умолчанию для разных headless‑проектов. Наш пример headless-wordpress не исключение. Фреймворк предлагает удобную <a href="https://nextjs.org/docs/pages/building-your-application/routing" rel="nofollow">маршрутизацию</a> на базе файловой системы, где любой файл в папке pages автоматически становится маршрутом и поддерживает несколько стратегий рендеринга:</p><ul><li>Server‑side rendering (SSR) позволяет генерировать HTML при каждом запросе.</li><li>Статическая генерация (включая [Incremental Static Regeneration])</li><li>React Server Components, стратегия которая дает гибкость в балансировании производительности и кэширования.</li></ul><p>Это делает Next.js хорошей платформой для работы с GraphQL API и рендеринга страниц React‑компонентами. Если у вас нет опыта с <a href="http://nex.js">Next.js</a> и React, то это не повод не попробовать набросать POC в свободное время. Современные <a href="http://next.js">Next.js</a> и React templates + хороший AI agent помогут адаптировать UI под GraphQL для вас.</p><h2>Почему Cloudflare?</h2><p>Vercel очень часто является платформой по умолчанию для Next.js‑приложений. Более того Next.js адаптирован для запуска из коробки на серверах Vercel. При этом нужно добавить, что идея этой статьи не в том чтобы как-то компрометировать Vercel. Что же нужно знать про Cloudflare чтобы обратить внимание на этот сервис с точки зрения альтернативы для хостинга Next.js?</p><p>Согласно <a href="https://w3techs.com/technologies/details/cn-cloudflare" rel="nofollow">статистике</a>, реверс-прокси сервисы Cloudflare используются примерно на 21,9% всех сайтов в интернете, а это более 82% сайтов, где используется прокси‑сервисы в принципе. Такая распространённость говорит о масштабе, надежности и глобальном охвате сервиса. Но Cloudflare - это не только reverse-proxy. Компания разрабатывает целую группу облачных сервисов, включая такие сервисы, как Cloudflare Pages - альтернатива Github Pages, Workers - Serverless functions (по аналогии с AWS Lambda), Контейнеры, Очереди, AI сервисы, R2 Object Storage, и другие. В дополнение ко всему, компания предоставляет такие сервисы, как защита сайта (site-protection), VPN и капча (human-detection captcha). Такое разнообразие сервисов делает сервис очень распространенным.</p><h2>Лимиты бесплатного тарифа Cloudflare</h2><p>Одним из самых интересных аргументов в пользу Cloudflare можно считать их бесплатный тариф. Защита от DDoS, Universal SSL и глобальную CDN доступны бесплатно. Также бесплатный тариф включает большинство из вышеперечисленных облачных сервисов. Например, Cloudflare Workers, который можно использовать для хостинга Next.js-проектов, бесплатно даёт 100,000 запросов в день. Или R2 object storage - альтернатива S3 по умолчанию дает 10GB пространства, которое можно использовать для хранения статики или других данных. Этого более чем достаточно чтобы поэкспериментировать на выходных с новым стеком и вполне достаточно для того, чтобы бесплатно хостить ваш проект до тех пор пока у вас не пойдет серьезный трафик. Ниже приведена таблица с некоторыми из Cloudflare сервисов и что включено в бесплатный тариф.</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/826d92c6-cecd-4d70-a2ee-78733a324a70.webp" alt="Таблица сервисов Cloudflare (Workers, KV, D1, R2 и др.) с лимитами бесплатного тарифа и их назначением" /><figcaption>Cloudflare free tier: сервисы и лимиты, достаточные для запуска headless WordPress + Next.js проекта. Взято с https://dev.to/ioniacob/which-cloudflare-services-are-free-2025-free-tier-guide-53jl.</figcaption></figure><h2>Запуск Serverless функций на edge-серверах</h2><p>Cloudflare Workers позволяют запускать серверлесс‑код по всей сети Cloudflare. Ниже приведено изображение показывающее как работает Edge CDN, когда например статика продублирована на все доступные сервера и таким образом пользователь получает ресурсы с самого близлежащего сервера.</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/6c12d101-f282-4d1a-8d7a-b4119fabdfda.webp" alt="Схема работы CDN: пользователи обращаются к ближайшим edge-серверам, которые кешируют контент и уменьшают нагрузку на origin-сервер" /><figcaption>Как работает CDN: пользователь получает контент с ближайшего edge-сервера, снижая задержку и нагрузку на origin. Источник: https://www.cloudflare.com/learning/cdn/what-is-a-cdn/</figcaption></figure><p>Эта картинка хороша тем, что аналогично CDN статике на этих же серверах можно запускать и Workers (Lambda) функции, тем самым ускоряя вашу инфраструктуру еще больше.</p><p>Одной из интересных особенностей Workers-функций является отсутствие cold-starts. Любой cloud provider обычно подымает docker container или виртуализированное окружение в момент первого запуска программы, а это всегда задержка. Минусом Workers-функций является тот факт что их Runtime API требует чтобы код мог использовать их Web platform APIs. А это в свою очередь ограничивает выбор языка программирования: Javascript, Typescript и WebAssembly. Но благодаря такому подходу Workers используют изолированную модель запуска  и могут быть прогреты еще до момента запуска кода этого воркера. Прогрев начинается еще на этапе TLS-соединения между клиентом и серверами Cloudflare. Полный текст статьи можно почитать в их <a href="https://blog.cloudflare.com/eliminating-cold-starts-with-cloudflare-workers/" rel="nofollow">блоге</a>.</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/4bcd2a0a-5161-46f5-984c-87f4097411dc.webp" alt="Схема работы Cloudflare Workers: прогрев (warmup) и загрузка воркера происходят во время TLS handshake до выполнения HTTP-запроса" /><figcaption>Как Cloudflare Workers устраняют cold-start: прогрев воркера происходит ещё на этапе TLS-соединения.</figcaption></figure><p>Воркеры выполняются на edge-серверах, которые находятся ближе всего к пользователям, тем самым уменьшая задержку и разгружая origin‑сервер (в нашем случае WordPress backend). По аналогии с другими cloud-провайдерами, код внутри Workers Runtime может использовать другие сервисы Cloudflare, такие как:</p><ul><li><a href="https://developers.cloudflare.com/workers/runtime-apis/cache/" rel="nofollow">Cache API</a> - позволяет читать и записывать данные в глобальный edge‑кэш через caches.default, что удобно для кэширования GraphQL‑ответов или страниц Next.js.</li><li><a href="https://developers.cloudflare.com/kv/" rel="nofollow">Workers KV</a> - распределенное key‑value‑хранилище для конфигурации и небольших наборов данных; можно хранить и получать данные глобально с низкой задержкой.</li><li><a href="https://developers.cloudflare.com/workers/configuration/cron-triggers/" rel="nofollow">Cron Triggers</a> - можно сопоставить cron‑выражение с обработчиком scheduled(), чтобы запускать периодические задачи, например, уборку кэша или обновление данных. Триггеры выполняются на малоиспользуемых машинах, максимизируя эффективность.</li></ul><p>Наличие доступа к дополнительным сервисам, таким как базы данных (D1), объектное хранилище (R2), очереди и AI даёт свободу строить более сложные и гибкие архитектуры, что очень полезно в дальнейшем на больших масштабах.</p><h2>OpenNext: мост между Next.js и Cloudflare</h2><p>Самостоятельный деплой Next.js на разные платформы непрост, поскольку среда исполнения Vercel отличается от других. Можно поднять Next.js на Node‑сервере, но его работа отличается от edge‑режима Vercel. OpenNext - это проект с открытым исходным кодом, который адаптирует Next.js для разных серверлесс‑платформ. Важно сказать что у Next.js нет нативного способа само разворачивания на других платформах, кроме Vercel; существующие отдельные адаптеры разрознены и сложны в поддержке. <a href="https://opennext.js.org/" rel="nofollow">OpenNext</a> объединяет усилия в одном адаптере, переводя выход сборки Next.js в формат, совместимый с основными облачными платформами. Проект поддерживают сообщество SST (AWS), команда Cloudflare и Netlify. Соответственно, с помощью OpenNext можно развернуть Next.js на Cloudflare Workers, сохраняя SSR, статическую генерацию и API‑маршруты.</p><p>Cloudflare‑адаптер устанавливается через @opennextjs/cloudflare. Далее следует установить<a href="https://developers.cloudflare.com/workers/wrangler/"> Wrangler</a>, настроить wrangler.toml с вашим Account ID и создать open-next.config.ts для управления кэшем и ассетами. Адаптер собирает приложение Next.js под среду Cloudflare, создает edge‑воркер и конфигурирует кэш для статики и ISR‑страниц (например, используя R2). После публикации Git‑интеграция Cloudflare автоматически разворачивает приложение при каждом пуше в GitHub или GitLab, а для pull‑request создает превью.</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/ffd3d8f8-9e94-4ee2-b1b8-7b7d075a9bbd.webp" alt="Логотипы OpenNext, Cloudflare, AWS Amplify и Netlify, показывающие поддержку деплоя Next.js на разные cloud-платформы" /><figcaption>OpenNext как единый адаптер для деплоя Next.js приложений на разные платформы: Cloudflare, AWS и Netlify</figcaption></figure><h2>Кэширование и уровни производительности</h2><p>Архитектура headless WordPress + Next.js + Cloudflare обычно включает несколько уровней кэша:</p><ol><li>Кэш браузера - стандартный HTTP‑кэш на стороне клиента.</li><li>Кэш edge‑рантайма - Cache API Cloudflare Workers сохраняет HTML‑страницы или GraphQL‑ответы рядом с пользователем; при попадании в кэш контент отдаётся мгновенно, а промахи идут к воркеру или origin.</li><li>Кэш ISR Next.js - технология Incremental Static Regeneration сохраняет отрендеренные страницы на сервере и обновляет их по запросу, снижая нагрузку на WordPress API.</li><li>Кэш GraphQL - API WPGraphQL может реализовывать кэширование по времени или тегам (например, через WPGraphQL Smart Cache), чтобы управлять сроком жизни ответов.</li></ol><p>Эта многоуровневая иерархия кэша обеспечивает, что большинство запросов вообще не доходят до вашего WordPress‑сервера, повышая производительность и снижая нагрузку.</p><p>Пример конечной архитектуры показан на изображении ниже.</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/37141150-e160-423b-a8cd-3784117e6499.webp" alt="" /><figcaption>Архитектура headless WordPress + Next.js на Cloudflare: edge-рендеринг, многоуровневый кэш и взаимодействие с WPGraphQL</figcaption></figure><h2>Автоматизация периодических задач</h2><p>Headless‑сайтам часто требуются периодические действия - например, обновление кэша ISR или синхронизация данных. Cron Triggers Cloudflare позволяют планировать запуск воркера по cron‑выражению. Обработчик scheduled() срабатывает по расписанию и подходит для обслуживания и получения сторонних данных. Триггеры выполняются на малоиспользуемых машинах по всему миру и легко управляются через Wrangler или панель Cloudflare.</p><h2>Модернизация PHP‑стека с Roots toolkit</h2><p>Хотя headless WordPress переносит рендеринг на JavaScript, CMS всё ещё нужно поддерживать. В качестве бонуса хочется порекомендовать экосистему <a href="https://roots.io/" rel="nofollow">Roots</a>, которая предлагает современный инструментарий для разработки на WordPress:</p><figure><img src="https://media.tproger.ru/user-uploads/136948/2026-03-25/27e070e5-39c8-425b-8142-b0b2ce0af69d.webp" alt="Скриншот сайта Roots с описанием инструментов для разработки WordPress: Bedrock, Sage, Trellis и Acorn" /><figcaption>Roots — современный инструментарй для разработки WordPress с использованием Composer, Blade и автоматизированного деплоя. Источник: Roots - https://roots.io/</figcaption></figure><ul><li><a href="https://roots.io/bedrock/" rel="nofollow">Bedrock</a> - шаблон WordPress, которая устанавливает ядро, плагины и темы через Composer. Таким образом Bedrock дает современную для PHP проектов структуру проекта, улучшает структуру папок, использует концепты Двенадцать факторов для конфигурации приложения с помощью .env‑файлы и тд. Более того, управление зависимостями через Composer повышает надежность и позволяет делать деплой приложения на разные сервера без страха что-то забыть или упустить.</li><li><a href="https://roots.io/sage/" rel="nofollow">Sage</a> - стартовая тема WordPress, использующая Blade от Laravel для шаблонов и интегрирующая Tailwind CSS. Sage автоматически генерирует theme.json из конфигурации Tailwind, поддерживает live preview блокового редактора с Vite и позволяет создавать компоненты на Blade. Это помогает фронтенд‑разработчикам отойти от устаревших подходов для разработки тем Wordpress с нуля.</li><li><a href="https://roots.io/trellis/" rel="nofollow">Trellis</a> - DevOps‑инструмент на базе Ansible, который поднимает серверы и автоматизирует деплой. Trellis предоставляет LEMP‑стек (Ubuntu 24.04, Nginx, PHP 8.3, MariaDB), выполняет деплой без downtimes и из коробки поддерживает SSL‑сертификаты. CLI помогает создавать и настраивать серверы, а также разворачивать проекты с атомарными релизами и откатами.</li><li><a href="https://roots.io/acorn/" rel="nofollow">Acorn</a> - интеграция, позволяющая использовать функционал Laravel в WordPress. С Acorn становятся доступны такие инструменты как Blade‑шаблоны, миграции, роутинг, кэширование и Artisan‑подобный CLI внутри WordPress. Это позволяет разработчикам строить плагины и фичи WordPress с использованием современных PHP‑подходов и современного фреймворка .</li></ul><p>Эти инструменты показывают, что экосистема WordPress продолжает развиваться и хорошо сочетается с современными подходами. Иными словами, WordPress - отличное решение, если знать, как его правильно готовить.</p><h2>Собираем всё вместе</h2><p>Архитектура приложения headless WordPress + Next.js + Cloudflare выглядит приблизительно так:</p><ol><li>WordPress (headless) - работает на традиционном сервере или в контейнере. Редакторы управляют контентом в админке. WPGraphQL и его расширения предоставляют GraphQL‑endpoint с данными, SEO и другой информацией, например данными о магазине.</li><li>Next.js фронтенд - React‑приложение, которое получает данные через GraphQL, рендерит страницы на сервере (SSR) или статически (ISR/SSG) и обрабатывает маршрутизацию и взаимодействие с клиентом. Код хранится в Git и автоматически разворачивается благодаря Git‑интеграции Cloudflare.</li><li>Cloudflare Workers - размещают приложение Next.js на edge через OpenNext. Workers исключают cold-starts и работают по аналогии с CDN как можно ближе к пользователю. Они также выполняют кэширование, обрабатывают API‑маршруты и запускают cron‑задачи.</li><li>Кэш на edge и в браузере - несколько уровней кэша гарантируют быструю отдачу статики и отрендеренных страниц. KV, R2 или D1 могут хранить дополнительные данные вроде сессий или объектов.</li></ol><h2>Заключение</h2><p>Headless‑архитектура объединяет универсальность WordPress и гибкость современных JavaScript‑фреймворков. Экспонируя контент через WPGraphQL и потребляя его в Next.js, можно получить больше контроля над рендерингом и тем самым улучшить производительность. Размещение фронтенда на Cloudflare Workers через OpenNext позволяет приблизить фронтенд код к пользователям, устраняет cold-starts, позволяет использовать free-tier и продвинутые уровни кэширования. Инструменты вроде Bedrock, Sage, Trellis и Acorn модернизируют PHP/Wordpress‑сторону и делают CMS такой же удобной в работе, как и современный Next.js/React-фронтенд. Вместе эти технологии создают мощный стек для создания быстрых, масштабируемых и безопасных сайтов, будь то хакатон, pet‑проект или серьёзный продакшн.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мы разрабатываем систему голосового управления презентациями на базе Whisper и GigaChat</title>
      <link>https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat</link>
      <comments>https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Киприн]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat</guid>
      <description><![CDATA[<p>Как создать инструмент, который позволяет переключать слайды с помощью голосовых команд и контекстного анализа речи. В статье разбирается микросервисная архитектура на React и Python (FastAPI), использование модели OpenAI Whisper для транскрибации в реальном времени и интеграция LLM GigaChat для интеллектуального ведения презентации. Также описываются проблемы нестабильности нейросетей в живых выступлениях и реализованные решения: режим байпаса и навигация по ключевым словам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ai-kliker--kak-my-razrabatyvaem-sistemu-golosovogo-upravleniya-prezentaciyami-na-baze-whisper-i-gigachat">Как мы разрабатываем систему голосового управления презентациями на базе Whisper и GigaChat</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 27 Dec 2025 11:40:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Наша команда разрабатывает инструмент для интеллектуального управления презентациями.</p><p>Пользователь может транслировать презентацию через "AI Кликер", а сервис будет записывать и транскрибировать речь спикера и аудитории. Спикер может переключать слайды простыми голосовыми командами или ключевыми словами, привязанными к конкретным слайдам.</p><p>Интеграция LLM позволяет реализовать интеллектуальные функции - переключение слайдов по описанию, контексту, генерация нового контента в реальном времени. Целевая аудитория — учителя, преподаватели и спикеры, на постоянной основе работащие с презентациями.</p><h2>Архитектура решения</h2><p>Наша команда использует JavaScript с React на фронтенде и Python c FastAPI на бэкенде. Мы используем PosgtreSQL как базу данных и S3 как объектное хранилище для хранения презентаций. Мы строим микросервисную архитектуру в нашем приложении.</p><p>Первый сервис - REST API для авторизации, управления личным кабинетом и контентом пользователя. Развернут на отдельном дешевом сервере за прокси NGINX, запросы шифруются HTTP</p><figure><img src="https://media.tproger.ru/user-uploads/135058/2025-12-16/91ac9c1a-c7e9-46e6-903d-8224c80bf981.png" alt="" /><figcaption>Архитектура REST API</figcaption></figure><p>Второй сервис - API трансляции презентации. Двустороннее взаимодействие браузера и этого сервиса (передача звука и отдача команд по переключению слайдов) идет по протоколу WebSocket Secure. Отдельный сервис для трансляции позволяет нам динамически управлять дорогими серверами с GPU, уничтожать их, поднимать, экспериментировать с конфигурациями, не переживая о сохранности основного приложения. Модель OpenAI Whisper используется для транскрибации речи и GigaChat от Сбера как LLM для анализа контекста выступления и генерации команд и контента.</p><figure><img src="https://media.tproger.ru/user-uploads/135058/2025-12-16/4ef40e63-5b61-4e65-997d-ff80ac16061b.png" alt="" /><figcaption>Архитектура сервиса трансляции</figcaption></figure><h2>Работа Whisper</h2><p>В AI-кликере распознавание речи - фундамент всей системы. Пока человек говорит, система должна получить текст, проверить команды, сопоставить с ключевыми словами, передать в LLM. Для этого обычного Whisper недостаточно — он отлично работает с файлами, но плохо подходит для живого потока.</p><p>Поэтому в проекте используется связка Whisper + <a href="https://github.com/QuentinFuxa/WhisperLiveKit">WhisperLiveKit</a> — библиотека, которая позволяет кормить модель аудио чанками в реальном времени, а не загружать готовые записи.</p><h2>Байпас: ручное управление голосом</h2><p>Одна из ключевых фич — байпас-режим. Это механизм, который позволяет управлять презентацией жёсткими голосовыми командами, в обход всей нейросетевой логики.</p><p>Когда Whisper отдаёт текст, он сначала проверяется не через LLM, а через механизм сопоставления фраз:</p><p>Дальше всё работает просто:</p><ul><li>если пользователь сказал фразу, похожую на “кликер вперёд” → слайд листается вперёд;</li><li>если “кликер назад” → слайд листается назад.</li></ul><p>Данная реализация позволяет пользователю в любой момент перебить автоматику и принудительно перелистнуть слайд. Это критично для надёжности: если LLM вдруг “поплыла”, у спикера всегда есть жёсткий голосовой руль.</p><h2>Ключевые слова: автоматический переход на нужный слайд</h2><p>Вторая важная часть — режим ключевых слов. Это уже не просто “вперёд/назад”, а сопоставление речи с конкретными слайдами.</p><p>Логика такая:</p><ol><li>Для презентации загружается набор ключевых фраз, который группируется по номеру слайда.</li><li>Когда приходит новый фрагмент речи — он сравнивается с ключевыми словами и в случае успеха отправляет команду на переключение:</li></ol><p>То есть фактически система работает как голосовой навигатор по презентации:</p><ul><li>сказал фразу, связанную со слайдом 5 → система предлагает перейти на 5;</li><li>сказал фразу из блока 10 → прыжок сразу туда</li></ul><p>При этом переход отправляется в очередь и дополнительно проверяется по порогу уверенности:</p><p>Слайд переключается только если вероятность достаточная. Это защищает от случайных совпадений и шумов.</p><h2>Работа с LLM (Гигачат) - промпты, контексты, очереди</h2><p>Если Whisper в AI-кликере отвечает за то, чтобы услышать, то GigaChat отвечает за то, чтобы понять, о чём сейчас говорит спикер и какой слайд этому соответствует. Вся работа с LLM построена асинхронно: распознанная речь не блокирует систему, а складывается в очередь и обрабатывается в фоне. Каждый фрагмент речи:</p><ul><li>попадает в очередь,</li><li>добавляется в историю пользователя,</li><li>отправляется в GigaChat,</li><li>а результат в виде вероятностей по слайдам уходит дальше в очередь переключения.</li></ul><p>Такой подход позволяет не тормозить распознавание речи, не зависеть от времени ответа нейросети, обрабатывать несколько фрагментов параллельно.</p><h2>В чём возникла основная проблема?</h2><p>Текущая концепция работы LLM строится на предугадывании номера слайда по смыслу речи. И именно здесь в реальных условиях всплыла главная боль проекта. На живых выступлениях выяснилось, что GigaChat может путаться между похожими слайдами и менять своё решение от фразы к фразе. В итоге презентация иногда начинала хаотично перелистываться, даже если спикер говорил последовательно и спокойно. Для пользователя это выглядит как будто “нейросеть сошла с ума и живёт своей жизнью”.</p><p>Пока проблема не решена полностью, в системе есть страховочный механизм — временное отключение GigaChat при ручном управлении. Если пользователь даёт жёсткую голосовую команду (байпас), то нейросеть временно игнорируется, а управление полностью возвращается человеку. Через несколько секунд автоматика включается обратно, что позволяет не ломать выступление даже в моменты, когда LLM начинает вести себя нестабильно</p><p>Практика показала, что угадывать слайд по смыслу — слишком нестабильная стратегия для живого продукта. Поэтому сейчас происходит переход к новой модели:</p><ul><li>было - нейросеть угадывает номер следующего слайда.</li><li>станет - нейросеть находит слайд по его описанию. После определенной команды, система слушает пользователя, пока он не закончит предложение (как умная колонка) и тогда один раз выбирает и переключает слайд. Это снижает вероятность случайных переключений и делает поведение системы более предсказуемым.</li></ul><h2>Итоги</h2><p>Мы продолжаем реализацию проекта и планируем скорый выход на рынок. Реализация местами еще сырая, но мы стараемся тестировать решение с фокус-группой профессионалов, работающих с презентациями, чтобы выработать лучшие решения, удобные для них. У нас получилось выиграть небольшой студенческий грант на реализацию, это поможет нам оплатить сервера и работу разработчиков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Самое нужное для фронтендера в 2025: честный взгляд изнутри индустрии</title>
      <link>https://tproger.ru/articles/samoe-nuzhnoe-dlya-frontendera-v-2025--chestnyj-vzglyad-iznutri-industrii</link>
      <comments>https://tproger.ru/articles/samoe-nuzhnoe-dlya-frontendera-v-2025--chestnyj-vzglyad-iznutri-industrii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[MCN Telecom]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/samoe-nuzhnoe-dlya-frontendera-v-2025--chestnyj-vzglyad-iznutri-industrii</guid>
      <description><![CDATA[<p>За последние пару лет роль фронтенд-разработчика заметно изменилась. То, что раньше считалось “плюсом”, теперь стало обязательной базой, а сами интерфейсы окончательно превратились в сложные приложения, которые порой работают быстрее десктопных программ.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/samoe-nuzhnoe-dlya-frontendera-v-2025--chestnyj-vzglyad-iznutri-industrii">Самое нужное для фронтендера в 2025: честный взгляд изнутри индустрии</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Dec 2025 10:20:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние пару лет роль фронтенд-разработчика заметно изменилась. То, что раньше считалось “плюсом”, теперь стало обязательной базой, а сами интерфейсы окончательно превратились в сложные приложения, которые порой работают быстрее десктопных программ.</p><p>2025 год особенно интересен: требования растут, стек стремительно обновляется, а вокруг — десятки новых инструментов, которые одновременно и вдохновляют, и заставляют чувствовать себя не в своей тарелке. Так что давайте спокойно и по-человечески разберёмся, что сегодня действительно важно, а что можно смело откладывать.</p><h2>Как изменилась профессия и что теперь требуют от фронтендера</h2><p>Если лет пять назад от вас ждали уверенную верстку, JavaScript и один фреймворк, то сегодня к этому прибавились архитектура, серверные рендеринги, работа с AI-инструментами и понимание, как всё это уживается на проде. Современный фронтенд стал более инженерным: теперь вы не просто “собираете интерфейс”, а участвуете в создании части системы.</p><p>Эта эволюция кажется пугающей только на первый взгляд. На самом деле она отражает главный тренд — интерфейсы стали критически важными для пользователей и бизнеса. А значит, и навыки разработчиков должны подтягиваться до нового уровня.</p><h2>Стек, который в 2025 уже обязателен</h2><p>Начнём с основы — технологий, без которых трудно представить работу фронтендера.</p><p>TypeScript окончательно стал стандартом. Это уже не “приятное дополнение”, а часть культуры. Большие команды без типизации работать не могут — слишком дорого обходятся ошибки и непредсказуемые зависимости.</p><p>JavaScript тоже не стоит на месте: ежегодно появляются полезные нововведения, которые упрощают работу с асинхронностью, структурами данных и синтаксисом. Те, кто следят за ECMAScript, всегда ощущают себя увереннее остальных: код становится чище, а решения — элегантнее.</p><p>Во фронтенде всё больше внимания уделяется браузерным API. WebGPU, новые возможности Storage, нативные анимации — всё это сильно снижает потребность в тяжёлых библиотеках и позволяет делать вещи, которые раньше были попросту невозможны. Чем лучше вы понимаете браузер, тем реже сталкиваетесь с ограничениями.</p><h2>Фреймворки: что происходит, и куда всё движется</h2><p>React по-прежнему доминирует, но теперь уже невозможно говорить о React в отрыве от Next.js или серверных компонентов. Это целая новая парадигма, где часть логики уезжает на сервер, а приложение начинает работать быстрее и экономнее. Для многих разработчиков переход на RSC становится точкой, где React ощущается как совершенно другой инструмент.</p><p>Параллельно растет популярность SvelteKit. Он проще, легче и зачастую приятнее в работе, особенно в небольших командах и стартапах, где важна скорость разработки. Vue 3 остается стабильным и очень комфортным выбором — его любят команды, которые ценят предсказуемость и мягкий порог входа.</p><p>Angular в 2025 году остаётся выбором крупных компаний и проектов, где важны строгая структура и предсказуемость. Благодаря встроенному DI, мощному CLI и единому стилю разработки он помогает быстрее масштабировать команды и поддерживать большие приложения.</p><h2>Архитектура: что фронтендер обязан понимать в 2025</h2><p>Современная разработка уже не обходится без SSR, SSG или ISR. Рендеринг стал частью оптимизации, а значит нужно понимать, почему одни страницы стоит отдавать с сервера, а другие — генерировать заранее.</p><p>Edge-функции — еще одно направление, которое стремительно набирает обороты. Когда код выполняется ближе к пользователю, интерфейс работает быстрее, а логика становится гибче. Если раньше подобные вещи интересовали только backend-разработчиков, то теперь это важный элемент фронтенд-экосистемы.</p><p>Микрофронтенды остаются актуальными для крупных команд. Они не всегда нужны, но если продукт растет, а структура усложняется, этот подход заметно снижает хаос.</p><h2>Как AI меняет работу разработчика</h2><p>AI перестал быть экспериментом — он стал полноценным участником рабочего процесса. Хорошие специалисты уже воспринимают его не как угрозу, а как инструмент.</p><p>Он помогает быстрее проектировать, находить ошибки, генерировать тесты и даже анализировать архитектуру. Но чтобы это работало эффективно, приходится учиться формулировать точные запросы, проверять ответы и комбинировать идеи модели со своим опытом.</p><p>Компании в 2025 году всё чаще спрашивают не “умеете ли вы пользоваться AI”, а “как именно он встроен в ваш рабочий процесс”.</p><h2>Ключевые навыки, без которых сейчас не обойтись</h2><p>Первое — производительность. Пользователи стали очень нетерпеливыми: если интерфейс притормаживает, они просто уходят. Поэтому важно понимать, как распределяется нагрузка, почему лишний ререндер может быть дорогим и что делать, чтобы сайт оставался быстрым даже на слабых устройствах.</p><p>Второе — доступность. A11y перестала быть “бонусом”. Это требование. Интерфейс должен быть удобен всем пользователям, независимо от их ограничений, и компании всё чаще контролируют этот аспект.</p><p>Третье — автоматизация. CI/CD, базовая работа с пайплайнами, понимание, как собирается и проверяется код — всё это экономит время и снижает число ошибок. Чем сильнее разработчик в автоматизации, тем надёжнее продукт.</p><h2>Софт-скиллы, о которых всё чаще говорят</h2><p>Поскольку команды становятся более распределенными, важным навыком стала коммуникация — умение четко формулировать свои мысли, обсуждать решения и объяснять сложные вещи так, чтобы вас понимали.</p><p>Еще одна ключевая компетенция — умение учиться. Обновления приходят настолько быстро, что способность адаптироваться становится не менее важной, чем знание фреймворков.</p><p>И, конечно, продуктовое мышление. Хороший фронтендер давно перестал цениться только за чистый код. Намного важнее, когда вы понимаете, какие решения действительно улучшают продукт, а какие — лишь выглядят технологично.</p><h2>Заключение</h2><p>2025 год стал переломным для фронтенда. Порог входа вырос, но вместе с этим вырос и потенциал — теперь разработчик может влиять на продукт намного сильнее. “Самое нужное для фронтендера в 2025” — это не столько конкретный стек, сколько способность мыслить шире: понимать архитектуру, разбираться в инструментах, не бояться AI и постоянно развиваться.</p><p>Если смотреть на профессию не как на бесконечный список требований, а как на путь, то изменения перестают пугать. Они открывают новые возможности — и именно это делает работу фронтенд-разработчика такой захватывающей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Андрей Карпати выложил LLM Council — инструмент, где ИИ спорят и выбирают лучший ответ</title>
      <link>https://tproger.ru/news/so-osnovatel-openai-karpati-vylozhil-llm-council---instrument--gde-ii-sporyat-i-vybirayut-luchwij-otvet</link>
      <comments>https://tproger.ru/news/so-osnovatel-openai-karpati-vylozhil-llm-council---instrument--gde-ii-sporyat-i-vybirayut-luchwij-otvet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/so-osnovatel-openai-karpati-vylozhil-llm-council---instrument--gde-ii-sporyat-i-vybirayut-luchwij-otvet</guid>
      <description><![CDATA[<p>Андрей Карпати выложил LLM Council — инструмент, где несколько ИИ спорят, оценивают ответы друг друга и формируют общий «советский» финальный вывод</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/so-osnovatel-openai-karpati-vylozhil-llm-council---instrument--gde-ii-sporyat-i-vybirayut-luchwij-otvet">Андрей Карпати выложил LLM Council — инструмент, где ИИ спорят и выбирают лучший ответ</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 24 Nov 2025 02:52:30 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Андрей Карпати</b> <a href="https://github.com/karpathy/llm-council?tab=readme-ov-file">выложил</a> в открытый доступ <b>LLM Council</b> — локальное веб-приложение, в котором <b>несколько ИИ-моделей отвечают на один вопрос, спорят между собой и выбирают финальный ответ</b>.</p><p>Проект выглядит как ChatGPT, но под капотом — работа через OpenRouter и цепочка из трех этапов: сбор ответов, взаимная оценка и «решение совета» ﻿.</p><p>Карпати честно пишет, что это <b>«на 99% вайб-кодинг»</b>, субботний хак для души. И он не планирует развивать проект. Но сообщество уже разнесло репозиторий по соцсетям — идея демократичного «совета ИИ» оказалась вирусной.</p><h2>Как работает LLM Council</h2><p>По задумке Карпати, механизм должен показать, как <b>разные модели видят одну и ту же задачу</b> — и что они думают о чужих ответах.</p><p><b>1. Первая стадия — мнения.</b> Каждая модель получает вопрос и генерирует свой ответ. В интерфейсе они показываются в отдельных вкладках, чтобы можно было сравнить.</p><p><b>2. Взаимные ревью.</b> Затем модели получают ответы своих «коллег», но с анонимизацией имен, чтобы не было фаворитизма. Каждая модель ранжирует остальные по точности и полезности ﻿.</p><p><b>3. Финальное решение.</b> Выбранный «председатель» — любая из моделей, которую укажет пользователь — собирает всю критику, мнения и свои выводы в итоговый ответ. Получается что-то вроде консенсуса.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-11-24/9719d6c3-fbe4-412b-b59d-60732c6acbb0.jpeg" alt="" /></figure><h2>Что внутри</h2><p>В README Карпати описывает минималистичный стек:</p><ul><li><b>Backend:</b> FastAPI + async httpx, работа через OpenRouter API.</li><li><b>Frontend:</b> React + Vite, рендеринг через react-markdown.</li><li><b>Хранилище:</b> JSON-файлы в data/conversations/.</li><li><b>Управление проектом:</b> uv для Python, npm для фронтенда .</li></ul><p>Пользователь добавляет свой OPENROUTER_API_KEY и при желании меняет «состав совета». По умолчанию туда входят <b>GPT-5.1</b>, <b>Gemini 3 Pro Preview</b>, <b>Claude Sonnet 4.5</b> и <b>Grok-4</b>.</p><h2>Зачем это вообще нужно</h2><p>Карпати пишет, что пилил проект для совместного с LLM чтения книг и сравнения, как разные модели анализируют один и тот же материал. Но по факту инструмент получился куда интереснее:</p><ul><li>это способ быстро оценить качество моделей;</li><li>это визуализатор «множественного ИИ-мышления»;</li><li>это мини-демонстрация того, как устроены будущие агентные системы, где несколько моделей принимают решения совместно.</li></ul><p>И да, все это — буквально субботний хак, который уже <a href="https://github.com/karpathy/llm-council?tab=readme-ov-file">набрал</a> несколько тысяч звезд на GitHub.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла Fedora 43: новый веб-инсталлятор Anaconda WebUI и GNOME на Wayland. Разобрались, что нового</title>
      <link>https://tproger.ru/news/vywla-fedora-43--novyj-veb-installyator-anaconda-webui-i-gnome-na-wayland--razobralis--chto-novogo</link>
      <comments>https://tproger.ru/news/vywla-fedora-43--novyj-veb-installyator-anaconda-webui-i-gnome-na-wayland--razobralis--chto-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywla-fedora-43--novyj-veb-installyator-anaconda-webui-i-gnome-na-wayland--razobralis--chto-novogo</guid>
      <description><![CDATA[<p>Вышла Fedora 43: новый веб-инсталлятор Anaconda WebUI, GNOME только на Wayland, RPM 6.0, ускоренный DNF и улучшенная безопасность</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywla-fedora-43--novyj-veb-installyator-anaconda-webui-i-gnome-na-wayland--razobralis--chto-novogo">Вышла Fedora 43: новый веб-инсталлятор Anaconda WebUI и GNOME на Wayland. Разобрались, что нового</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 30 Oct 2025 04:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект <b>Fedora</b> <a href="https://www.neowin.net/news/fedora-43-is-now-available-with-rpm-60-and-more/">выпустил</a> свежий релиз <b>Fedora 43</b>, который стал одним из самых заметных обновлений за последние годы.</p><p>Помимо стандартной редакции Workstation, обновление получили и все спины, лаборатории и атомарные сборки.</p><p>Пользователи Fedora 42 уже начали получать уведомления о доступности апдейта, но при желании систему можно обновить вручную — через <b>GNOME Software</b> или с помощью командного обновления.</p><h2>Новый веб-инсталлятор Anaconda WebUI</h2><p>Главное нововведение Fedora 43 — это <b>новый веб-инсталлятор Anaconda WebUI</b>, который теперь используется <b>по умолчанию во всех сборках дистрибутива</b>.</p><p>Ранее он тестировался только в <b>Fedora Workstation 42</b>, а теперь стал стандартом. Новый интерфейс написан с нуля на <b>React</b> и <b>PatternFly</b> и работает через локальный веб-сервер.</p><p>Это делает установку визуально современной и удобной — пользователи получают пошаговый процесс в браузерном окне с возможностью настройки дисков, локализации и сетевых параметров.</p><p>Разработчики отмечают, что Anaconda WebUI будет проще адаптировать под новые сценарии — например, автоматическую установку на серверах или в контейнерах.</p><h2>GNOME теперь только на Wayland</h2><p>Fedora 43 полностью <b>отказалась от Xorg</b> в пользу <b>Wayland</b>. Это изменение следует за решением GNOME upstream, где X11 был отключен на этапе сборки GNOME 49.</p><p>Теперь Fedora Workstation запускается <b>исключительно на Wayland</b>, что должно улучшить безопасность, поддержку HiDPI-экранов и работу с сенсорными устройствами.</p><p>При этом Xwayland по-прежнему остается в системе для совместимости со старыми приложениями.</p><h2>Что нового под капотом</h2><ul><li>Fedora 43 перешла на <b>RPM 6.0</b>, что принесло новые механизмы безопасности, включая поддержку <b>мультиподписей пакетов</b> — шаг к внедрению <b>постквантовых криптографических ключей OpenPGP</b>.</li><li>Обновления <b>Fedora CoreOS</b> теперь распространяются <b>только в формате OCI-образов</b>, а устаревший механизм <b>OSTree</b> окончательно выведен из обращения.</li><li>Улучшена интеграция с Flatpak и Podman, а также ускорена работа DNF при разрешении зависимостей.</li></ul><h2>Как установить Fedora 43</h2><p>Пользователи Fedora 42 могут выполнить обновление в несколько кликов через центр обновлений GNOME или в терминале командой:</p><p>Для чистой установки рекомендуется воспользоваться <b>Fedora Media Writer</b> — он доступен для Windows, macOS и Linux.</p>]]></content:encoded>
    </item>
    <item>
      <title>Безопасные методы работы с массивами в JavaScript</title>
      <link>https://tproger.ru/articles/bezopasnye-metody-raboty-s-massivami-v-javascript</link>
      <comments>https://tproger.ru/articles/bezopasnye-metody-raboty-s-massivami-v-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bezopasnye-metody-raboty-s-massivami-v-javascript</guid>
      <description><![CDATA[<p>Безопасные методы работы с массивами в JavaScript: toSorted(), toReversed() и toSpliced() вместо мутирующих sort(), reverse() и splice(). Примеры использования в React, сравнение методов и поддержка браузерами. Как писать чистый код без побочных эффектов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bezopasnye-metody-raboty-s-massivami-v-javascript">Безопасные методы работы с массивами в JavaScript</a>»</p>]]></description>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Oct 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это <a href="https://allthingssmitty.com/2025/09/08/finally-safe-array-methods-in-javascript/">перевод статьи</a> Мэта Смитта (<a href="https://allthingssmitty.com/">Matt Smith</a>) — веб-разработчика, фронтенд-инженера и UX-дизайнера.</p><p>Есть веская причина, по которой многие разработчики задумываются, прежде чем использовать в JavaScript методы .sort(), .reverse() или .splice(): эти методы изменяют исходный массив. Такой побочный эффект может привести к скрытым, трудноуловимым ошибкам — особенно в приложениях с общим или реактивным состоянием.</p><p>Хорошая новость в том, что за последние пару лет в JavaScript появились новые методы работы с массивами, которые делают этот процесс более безопасным и чистым, полностью избегая мутаций:</p><ul><li>toSorted()</li><li>toReversed()</li><li>toSpliced()</li></ul><p>Эти методы возвращают копии массивов, вместо того чтобы изменять оригинал. Это небольшое, но важное обновление синтаксиса — особенно для разработчиков на React, где неизменяемость данных (immutability) — ключ к правильному управлению состоянием.</p><h2>Проблема методов, изменяющих массив «на месте»</h2><p>В JavaScript традиционные методы, такие как .sort(), .reverse() и .splice(), модифицируют сам массив, на котором были вызваны:</p><p>В таких фреймворках, как React, это может привести к непредсказуемому поведению при обновлении состояния, поскольку прямое изменение массивов не вызывает повторный рендер.</p><h2>Сравнение старых и новых методов</h2><ul><li>Для сортировки вместо arr.sort(), который изменяет исходный массив, теперь можно использовать arr.toSorted(), возвращающий новый.</li><li>Для обратного порядка вместо arr.reverse() следует применять arr.toReversed(), чтобы сохранить оригинал.</li><li>Для удаления или вставки элементов вместо arr.splice() можно использовать arr.toSpliced(), который создаёт копию массива с изменениями, не трогая исходный.</li></ul><p>Эти новые методы работают так же, как и их «изменяющие» аналоги, но вместо модификации исходного массива возвращают новый.</p><p>⚠️ Важно: это <a href="https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy">поверхностные копии</a>, поэтому если массив содержит объекты, сами объекты останутся теми же ссылками, а не новыми экземплярами.</p><h2>Решение: безопасные, не изменяющие оригинал методы</h2><p>В стандарте ES2023 появились новые версии привычных методов массивов, которые не изменяют исходный массив:</p><p>toSorted() — создаёт отсортированную копию массива, не затрагивая оригинал.</p><p>Вы также можете передать собственную функцию сравнения — точно так же, как в методе .sort():</p><p>toReversed() — возвращает обратную копию массива, не изменяя исходный порядок элементов в оригинале.</p><p>Отлично подходит для случаев, когда нужно вывести список в обратном порядке, не изменяя исходный массив.</p><p>toSpliced() — это более безопасная альтернатива методу .splice(). Она возвращает новый массив с добавленными или удалёнными элементами, не затрагивая оригинал.</p><p>Напоминание: метод .splice() возвращает удалённые элементы, а .toSpliced() — обновлённый массив.</p><h2>Почему это важно в React</h2><p>В React неизменяемость данных — ключевой принцип, который обеспечивает обновление компонентов и предсказуемость состояния.</p><p>Новые методы позволяют работать с массивами как с неизменяемыми структурами данных, не прибегая к использованию structuredClone() или сложных обходных решений для глубокой копии.</p><h2>Практический пример: сортировка задач в React</h2><p>Вот как можно использовать toSorted() или toReversed() в компоненте, чтобы безопасно отображать динамические списки, не изменяя исходные данные:</p><p>Такой подход избегает изменения массива tasks, что особенно важно, если он передан через props или вычисляется из state — в противном случае могут возникнуть ошибки. Кроме того, использование операторов опциональной цепочки (?.) и объединения с null (??) помогает предотвратить сбои, если tasks окажется undefined.</p><p>И это ещё не всё! Оба этих оператора — опциональная цепочка и nullish coalescing — улучшения синтаксиса, делающие код более надёжным и устойчивым к ошибкам во время выполнения, приближая его к современному стандарту JavaScript.</p><h2>Маленькое изменение в синтаксисе — большое улучшение</h2><p>Эти методы не требуют нового подхода к мышлению — это просто безопасные, неизменяемые версии уже привычных вам инструментов. Если вы работаете в современной среде (или используете сборщики вроде Babel или SWC), вы можете начать применять их уже сегодня.</p><h2>Поддержка браузерами</h2><p>Методы toSorted(), toReversed() и toSpliced() поддерживаются во всех современных средах:</p><p>✅ Chrome / Edge — с версии 110+</p><p>✅ Safari — с версии 16+</p><p>✅ Firefox — с версии 115+</p><p>✅ Node.js — с версии 20+</p><p>Для старых окружений можно использовать полифил, например, из библиотеки <a href="https://www.npmjs.com/package/core-js">core-js</a>.</p><h2>Основные выводы</h2><p>Метод .toSorted() возвращает отсортированную копию массива, не изменяя оригинал. Метод .toReversed() создаёт новый массив в обратном порядке, также без мутаций исходного. Метод .toSpliced() возвращает изменённую копию массива — с добавленными или удалёнными элементами, но оригинальный массив остаётся нетронутым.</p><p>ES2023 принёс не только заметные обновления вроде опциональной цепочки и<a href="https://allthingssmitty.com/2025/06/16/using-await-at-the-top-level-in-es-modules/"> top-level await,</a> но и такие, казалось бы, мелкие улучшения, которые делают код чище, понятнее и безопаснее. Попробуйте использовать новые методы в своих проектах — и вы больше не будете смотреть на .sort() с тем же доверием.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Bun 1.3: full-stack рантайм, поддержка Redis и новый SQL API. Разобрались, что еще нового</title>
      <link>https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo</link>
      <comments>https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo</guid>
      <description><![CDATA[<p>Bun 1.3 стал full-stack рантаймом с Redis, SQL API, поддержкой MySQL и PostgreSQL, новым тест-раннером и ускорением сборки до 2,5 раз</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-bun-1-3--full-stack-rantajm--podderzhka-redis-i-novyj-sql-api--razobralis--chto-eshhe-novogo">Вышел Bun 1.3: full-stack рантайм, поддержка Redis и новый SQL API. Разобрались, что еще нового</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 13 Oct 2025 04:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда <b>Oven</b> <a href="https://bun.com/blog/bun-v1.3">представила</a> <b>Bun 1.3</b> — крупнейший релиз в истории JavaScript-рантайма.</p><p>Теперь Bun официально позиционируется как <b>full-stack платформа</b> для фронтенда и бэкенда. И она объединяет сервер, сборщик, менеджер пакетов вместе с тест-раннером в одном инструменте.</p><p>В новую версию добавлены десятки ключевых функций: встроенные клиенты для <b>Redis</b>, <b>MySQL</b>, <b>PostgreSQL</b> и <b>SQLite</b>, единый <b>SQL API</b>, улучшенные <b>WebSocket-модули</b>, переработанный <b>тест-раннер</b> и поддержка <b>VSCode Test Explorer</b>.</p><h2>Full-stack по-умному</h2><p>Главное новшество — режим <b>full-stack Bun.serve()</b> с поддержкой роутинга, cookies и WebSockets.</p><p>Теперь фронтенд и бэкенд можно запускать в одном процессе без проблем с CORS, а приложение собрать в <b>единый исполняемый файл</b> с помощью bun build --compile.</p><p>Разработчики могут напрямую импортировать HTML, запускать React-приложения с хот-перезагрузкой и собирать проект одной командой bun init --react. По данным команды, скомпилированные React-приложения в Bun работают <b>до 1,8 раза быстрее, чем через nginx</b>.</p><h2>Новый SQL и встроенный Redis</h2><p>Bun 1.3 представил унифицированный <b>Bun.SQL API</b> — теперь один и тот же код работает с MySQL, PostgreSQL, SQLite и MariaDB. Добавлен хелпер sql.array() для работы с массивами в PostgreSQL, улучшена поддержка JSON и Unix-сокетов.</p><p>Кроме того, в рантайм встроен <b>Redis-клиент</b>, который поддерживает 66 команд, автоматическое переподключение, очереди сообщений и Pub/Sub. По данным разработчиков, он <b>значительно быстрее ioredis</b>, а поддержка кластеров и Lua-скриптов появится в будущих релизах.</p><h2>Новые возможности</h2><p>Среди прочих улучшений — <b>Zstandard-сжатие</b>, нативная поддержка <b>YAML</b>, API для безопасного хранения секретов (<b>Bun.secrets</b>), и серьезный прирост производительности: операции с криптографией ускорены <b>до 400х</b>, установка пакетов — <b>до 2,5х</b>.</p><p>Также обновлен менеджер пакетов с <b>интерактивным bun update</b>, изолированными установками и API для проверки безопасности зависимостей.</p><h2>Почему это важно</h2><p>Bun 1.3 превращает экспериментальный рантайм в <b>полноценную платформу для веб-разработки</b>, способную заменить Node.js, Vite и Redis-CLI одновременно.</p><p>Разработчики называют релиз «началом новой эпохи», цель которой — сделать Bun лучшим способом писать и развертывать JavaScript-приложения.</p>]]></content:encoded>
    </item>
    <item>
      <title>Руководство по промптам GPT-5: практики для агентов, кодирования и управляемости</title>
      <link>https://tproger.ru/articles/rukovodstvo-po-promptam-gpt-5--praktiki-dlya-agentov--kodirovaniya-i-upravlyaemosti</link>
      <comments>https://tproger.ru/articles/rukovodstvo-po-promptam-gpt-5--praktiki-dlya-agentov--kodirovaniya-i-upravlyaemosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rukovodstvo-po-promptam-gpt-5--praktiki-dlya-agentov--kodirovaniya-i-upravlyaemosti</guid>
      <description><![CDATA[<p>Руководство по промптам GPT-5: практики для агентов, кодирования и управляемости от OpenAI. Готовые шаблоны промптов, настройка reasoning_effort, работа с Responses API и советы по созданию приложений. Повысьте стабильность и эффективность ваших ИИ-решений.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rukovodstvo-po-promptam-gpt-5--praktiki-dlya-agentov--kodirovaniya-i-upravlyaemosti">Руководство по промптам GPT-5: практики для агентов, кодирования и управляемости</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Промпты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Oct 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы перевели <a href="https://cookbook.openai.com/examples/gpt-5/gpt-5_prompting_guide">статью</a> Ануп Кота, Джулиан Ли, Эрика Закариассон из OpenAI. Статья написана для разработчиков агентных систем, инженеров ИИ-продуктов, команд фронтенда/бэкенда, редакторов кода с ИИ.</p><p>GPT-5 — флагманская reasoning-модель с упором на агентные сценарии, кодинг, интеллект и управляемость. «Из коробки» она хорошо решает широкий спектр задач, но качественные промпты (подсказки) заметно повышают стабильность, скорость и соблюдение инструкций. Ниже — проверенные практики, готовые шаблоны и заметки по параметрам API (reasoning_effort, verbosity, Responses).</p><h2>Предсказуемость агентного рабочего процесса</h2><h2>Используйте API Responses для агентов</h2><p>Responses сохраняет логические следы между вызовами инструментов: это снижает задержку, экономит токены и повышает качество планов за счёт механизма previous_response_id.</p><h2>Контролируйте «рвение» агента</h2><p>Сдержанный режим (меньше вызовов, ниже задержки):</p><ul><li>Установите reasoning_effort=low|medium.</li><li>В подсказке ограничьте глубину поиска контекста и задайте ранние критерии остановки.</li></ul><h2>Проактивный режим (больше автономии и настойчивости):</h2><ul><li>Поднимите reasoning_effort.</li><li>Включите явное требование «не возвращаться к пользователю до полного решения».</li></ul><p>Если вы готовы к максимально строгому регулированию, то можете установить фиксированный бюджет на вызовы инструментов, как показано ниже. Бюджет, естественно, может варьироваться в зависимости от желаемой глубины поиска.</p><p>При ограничении основного поведения сбора контекста полезно явно предоставить модели запасной вариант, облегчающий выполнение более короткого этапа сбора контекста. Обычно это делается в виде условия, позволяющего модели продолжать работу в условиях неопределенности, как «even if it might not be fully correct» в примере выше.</p><p>С другой стороны, если вы хотите поощрить автономность модели, увеличить настойчивость в вызове инструментов и сократить количество уточняющих вопросов или иных случаев возврата информации пользователю, рекомендуется увеличить reasoning_effort и использовать такой промпт, чтобы поощрить настойчивость и тщательное выполнение задачи:</p><p>Хорошая практика — чётко указать условия остановки задач агента, обозначить безопасные и небезопасные действия и определить, когда, если это вообще возможно, модель может вернуть данные пользователю. Например, в наборе инструментов для покупок инструменты оформления заказов и оплаты должны явно иметь более низкий порог неопределённости, требующий пояснений пользователя. В то же время инструмент поиска должен иметь чрезвычайно высокий порог; аналогично, в конфигурации кодинга инструмент удаления файлов должен иметь гораздо более низкий порог, чем инструмент поиска grep.</p><h2>«Преамбулы» к инструментам (чтобы пользователь понимал, что происходит)</h2><p>GPT-5 обучен предоставлять чёткие предварительные планы и последовательные обновления о ходе работы с помощью сообщений «преамбулы инструмента».</p><p>Вы можете управлять частотой, стилем и содержанием преамбул инструментов в вашем запросе — от подробных объяснений каждого вызова инструмента до краткого предварительного плана. Вот пример качественной преамбулы:</p><p>Вот пример преамбулы инструмента, которая может быть выведена в ответ на такой запрос. Такие преамбулы могут значительно улучшить способность пользователя следить за работой вашего агента по мере её усложнения:</p><h2>Усилия рассуждения и повторное использование контекста</h2><ul><li>reasoning_effort регулирует интенсивность размышлений и готовность к вызову инструментов. Значение по умолчанию — medium. Но для многошаговых задач повышайте этот показатель.</li><li>Разбивайте сценарий на несколько ходов агента с сохранением previous_response_id в Responses — модель не тратит токены на перестройку плана.</li><li>Настоятельно рекомендуют использовать API Responses в GPT-5, чтобы улучшить потоки агентов, снизить затраты и повысить эффективность токенов в приложениях. Авторы отмечают, что наблюдали статистически значимые улучшения в оценках при использовании API Responses по сравнению с завершением чата. Например, рост оценки Tau-Bench Retail с 73,9% до 78,2% был только благодаря переходу на API Responses и включению previous_response_id (функции передачи предыдущих элементов рассуждений в последующие запросы). Это позволяет модели ссылаться на предыдущие трассировки рассуждений, экономя токены и устраняя необходимость перестраивать план с нуля после каждого вызова инструмента, что снижает latency. Эта функция доступна всем пользователям API Responses.</li></ul><h2>Максимизация продуктивности в кодинге</h2><p>GPT-5 умеет работать с крупными кодовыми базами, накатывать многофайловые изменения, рефакторить и строить новые приложения.</p><h2>Рекомендованный стек для фронтенд-приложений</h2><ul><li>Фреймворк: Next.js (TypeScript), React, HTML</li><li>Стили/UI: Tailwind CSS, shadcn/ui, Radix themes</li><li>Иконки: Lucide / Heroicons / Material Symbols</li><li>Анимации: Framer Motion</li><li>Шрифты: Inter, Geist, Mona Sans, IBM Plex Sans, Manrope</li></ul><h2>Разработка приложений с нуля</h2><p>GPT-5 отлично подходит для создания приложений за один раз. В ходе ранних экспериментов с моделью пользователи обнаружили, что подсказки, подобные приведённой ниже, — где модель итеративно выполняет задания, используя самостоятельно разработанные критерии качества, — повышают качество результатов благодаря использованию возможностей GPT-5 в области тщательного планирования и самоанализа.</p><h2>Соответствие стандартам разработки</h2><p>При внедрении постепенных изменений и рефакторинга в приложения, код, написанный на основе модели, должен соответствовать стандартам стиля и дизайна и максимально аккуратно вписываться в кодовую базу. Без специальных подсказок GPT-5 автоматически ищет справочный контекст в кодовой базе, например, читая package.json для просмотра уже установленных пакетов. Но это поведение можно улучшить с помощью подсказок, обобщающих ключевые аспекты, такие как принципы разработки, структура каталогов и передовой опыт кодовой базы.</p><p>Фрагмент подсказки ниже демонстрирует один из способов организации правил редактирования кода для GPT-5: не стесняйтесь изменять фактическое содержание правил в соответствии со своими предпочтениями в программном дизайне.</p><h2>Форматирование Markdown</h2><p>По умолчанию GPT-5 в API не форматирует свои окончательные ответы в Markdown, чтобы обеспечить максимальную совместимость с разработчиками, чьи приложения могут не поддерживать рендеринг Markdown. Тем не менее, запросы, подобные следующему, в значительной степени успешно обеспечивают иерархические окончательные ответы в Markdown.</p><p>Иногда соблюдение инструкций Markdown, указанных в системном запросе, может ухудшаться в течение длительного разговора. Если вы столкнулись с такой ситуацией, стабильное соблюдение инструкций Markdown будет работать при добавлении их к каждому 3–5 пользовательскому сообщению.</p>]]></content:encoded>
    </item>
    <item>
      <title>«Началась эра очистки ИИ-кода»: разработчики жалуются на всплеск неработающих проектов</title>
      <link>https://tproger.ru/news/-nachalas-era-ochistki-ii-koda---razrabotchiki-zhaluyutsya-na-vsplesk-nerabotayushhih-proektov</link>
      <comments>https://tproger.ru/news/-nachalas-era-ochistki-ii-koda---razrabotchiki-zhaluyutsya-na-vsplesk-nerabotayushhih-proektov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-nachalas-era-ochistki-ii-koda---razrabotchiki-zhaluyutsya-na-vsplesk-nerabotayushhih-proektov</guid>
      <description><![CDATA[<p>Разработчики фиксируют всплеск неработающих ИИ-проектов: код медленный, сырой и опасный, а спрос на «очистку» и ручное ревью растёт</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-nachalas-era-ochistki-ii-koda---razrabotchiki-zhaluyutsya-na-vsplesk-nerabotayushhih-proektov">«Началась эра очистки ИИ-кода»: разработчики жалуются на всплеск неработающих проектов</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 06 Oct 2025 04:21:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики по всему миру <a href="https://bytesizedbets.com/p/era-of-ai-slop-cleanup-has-begun">отмечают</a> <b>новый тренд</b>: растет количество заказов на переделку и «очистку» проектов, написанных с помощью ИИ.</p><p>Как рассказал один из инженеров из Европы, за последние месяцы ему регулярно приходят стартапы <b>с кодом, который не работает</b>: ошибки, медлительность, утечки данных, слабая архитектура.</p><p>Компании платят <b>огромные деньги</b> за ИИ-продукты, а потом ищут фрилансеров, чтобы починить их.</p><h2>«Код ужасен»</h2><p>Другой разработчик из Сан-Франциско признался, что ему <b>пришлось удалить 90 файлов из 100</b> в React-проекте, созданном дизайнером через <b>ИИ-редактор Cursor</b>.</p><p>Проблема, по его словам, системная: большинство моделей обучаются на среднем по качеству открытом коде, и, как следствие, генерируют посредственные решения.</p><p>ИИ хорошо пишет <b>шаблонный код</b>, но <b>не понимает архитектуру</b> и не способен отличить хорошее решение от плохого.</p><h2>Давление и технический долг</h2><p>Многие компании требуют от программистов <b>«ускоряться с ИИ»</b>, но не умеют оценивать последствия. В итоге <b>растет количество ошибок</b> и <b>технический долг</b> — исправление становится дороже, чем ручная разработка.</p><p>Эксперты советуют ужесточить ревью и использовать ИИ не для написания, а для анализа кода. Первое правило — не доверять искусственному интеллекту ядро системы. <b>«Пусть делает рутину, но не логику»</b>, — заявляют многие опытные разработчики.</p><h2>Новый рынок</h2><p>Парадоксально, но именно <b>происходящее создает новый рынок</b>: спрос на специалистов, способных «расчистить» ИИ-проекты, стремительно растет.</p><p>А это значит, что мы вступаем в эпоху, когда <b>за чистый код снова будут хорошо платить</b>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Лучшие практики для ускорения фронтенда: чек-лист 2025 года</title>
      <link>https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda</link>
      <comments>https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda</guid>
      <description><![CDATA[<p>Ускорьте свой сайт с помощью чек-листа по оптимизации фронтенда: от HTML и CSS до изображений и серверов. Практические советы для повышения скорости, SEO и конверсий в 2025 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda">Лучшие практики для ускорения фронтенда: чек-лист 2025 года</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 Oct 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это перевод <a href="https://crystallize.com/blog/frontend-performance-checklist">статьи</a> с сайта компании Crystallize. Можете поделиться своим мнением в комментариях!</p><h2>Почему скорость сайта так важна</h2><p>В мире, где внимание пользователей <a href="https://time.com/3858309/attention-spans-goldfish/">рассеивается</a> за восемь секунд, быстрая загрузка сайта становится критически важной. Статистика подтверждает: <a href="https://www.thinkwithgoogle.com/consumer-insights/consumer-trends/mobile-site-load-time-statistics/#:~:text=Google%20www.thinkwithgoogle.com%20%2053,statistics%20on%20Think%20with%20Google">53% мобильных пользователей покидают сайт</a>, если он грузится дольше 3 секунд, а 70% потребителей <a href="https://unbounce.com/page-speed-report/#:~:text=Nearly%2070%25%20of%20consumers%20admit%20that%20page%20speed%20influences%20their,time%20is%20slower%20than%20expected.">отмечают</a>, что скорость влияет на их решение о покупке. Walmart, например, <a href="https://wpostats.com/2015/11/04/walmart-revenue/#:~:text=Walmart%20saw%20up%20to%20a,increase%20in">зафиксировал</a> рост конверсий на 2% за каждую секунду сокращения времени загрузки.</p><p>Быстрые сайты обеспечивают:</p><ul><li>Долгое пребывание пользователей на сайте;</li><li>Больше просмотров страниц благодаря быстрой навигации;</li><li>Меньше отказов из-за медленных загрузок;</li><li>Выше конверсии и доходов, так как скорость напрямую влияет на покупки;</li><li>Лучшую удовлетворенность и удержание пользователей;</li><li>Рост органического трафика, так как Google учитывает Core Web Vitals в SEO-ранжировании;</li><li>Экономию на CDN и трафике, ведь оптимизированные сайты потребляют меньше данных;</li><li>Повышение качества рекламы в Google Ads, так как быстрые страницы снижают стоимость кликов.</li></ul><p>Оптимизация фронтенда — это не просто техническая задача, а способ повысить лояльность пользователей и бизнес-показатели.</p><h2>Как измерить производительность сайта</h2><p>Прежде чем оптимизировать, <a href="https://crystallize.com/blog/frontend-performance-measuring-and-kpis">измерьте</a> текущую производительность сайта, чтобы выявить узкие места. Используйте комбинацию лабораторных и полевых инструментов:</p><ul><li><a href="https://pagespeed.web.dev/">Google PageSpeed Insights</a>: быстрый аудит Core Web Vitals с рекомендациями.</li><li><a href="https://developers.google.com/web/tools/lighthouse">Chrome Lighthouse</a>: встроенный в DevTools инструмент для анализа производительности, SEO и лучших практик.</li><li><a href="https://www.webpagetest.org/">WebPageTest</a>: детализированные метрики, визуализация загрузки и советы по оптимизации.</li><li><a href="https://gtmetrix.com/">GTmetrix</a>: анализ скорости загрузки с рекомендациями.</li><li><a href="https://developer.chrome.com/docs/crux/methodology/tools">CrUX в Google Search Console</a>: реальные данные пользовательского опыта (Core Web Vitals) для SEO.</li></ul><p>Лабораторные инструменты дают контролируемые метрики, а мониторинг реальных пользователей (через <a href="https://github.com/GoogleChrome/web-vitals">Web Vitals JS</a>, <a href="https://www.speedcurve.com/">SpeedCurve</a> или <a href="https://calibreapp.com/">Calibre</a>) показывает, как сайт работает в реальных условиях. Это поможет определить приоритеты для оптимизации.</p><h2>Чек-лист оптимизации фронтенда 2025</h2><p>Производительность — это командная работа. Бэкенд должен быть масштабируемым, UX-дизайнеры — балансировать визуал и скорость, а фронтенд-разработчики — реализовывать оптимизированный код. Этот чек-лист подходит для любой платформы: от Next.js и Astro до WordPress и PHP. Адаптируйте его под ваш проект, уделяя внимание ключевым метрикам, таким как LCP, CLS и INP (новый показатель, заменивший FID в 2024 году).</p><h3>HTML</h3><p>HTML — основа страницы, и его оптимизация ускоряет загрузку и улучшает пользовательский опыт.</p><ul><li>Приоритизируйте критический HTML: доставляйте HTML для верхней части страницы первым, чтобы браузер начал рендеринг. Фреймворки вроде Next.js или Astro с SSR/SSG рендерят HTML на сервере, улучшая First Contentful Paint.</li><li>Удаляйте лишний код: уберите ненужные теги, комментарии и пробелы. Компактный HTML загружается быстрее, особенно в мобильных сетях.</li><li>Включите сжатие: используйте GZIP или Brotli, чтобы уменьшить размер HTML. Большинство серверов и CDN это поддерживают.</li><li>Оптимизируйте загрузку ресурсов: размещайте CSS в &lt;head&gt; для быстрого рендера, а скрипты — перед &lt;/body&gt; или с атрибутами async/defer, чтобы не блокировать разбор HTML.</li><li>Минимизируйте iframe: они загружают дополнительные страницы, замедляя сайт. Используйте loading="lazy" для iframe ниже линии сгиба или загружайте их по клику.</li></ul><p><b>Совет:</b> держите DOM компактным. Например, Astro разбивает страницы на «островки», минимизируя гидратацию JavaScript, что ускоряет рендеринг.</p><h3>CSS</h3><p>CSS может блокировать рендеринг, если не оптимизирован. Вот как сделать стили быстрее:</p><ul><li>Удаляйте неиспользуемый CSS: используйте PurgeCSS или Chrome DevTools, чтобы убрать мертвый код, особенно в проектах с Tailwind.</li><li>Модуляризуйте стили: разделяйте CSS по страницам или функциям, загружая только необходимое. Критические стили встраивайте в &lt;head&gt;, остальное загружайте асинхронно.</li><li>Избегайте @import: он создает дополнительные запросы и блокирует рендеринг. Используйте &lt;link rel="stylesheet"&gt; или объединяйте CSS при сборке.</li><li>Используйте критический CSS: встраивайте стили для верхней части страницы в HTML, а остальное загружайте позже (например, через media="print"). Инструменты вроде Critical помогут это автоматизировать.</li><li>Минимизируйте CSS: убирайте пробелы и комментарии с помощью Clean-CSS или cssnano.</li><li>Предварительно загружайте ключевые стили: используйте &lt;link rel="preload" as="style"&gt; для важных CSS-файлов.</li><li>Упрощайте селекторы: избегайте сложных вложенных цепочек, чтобы ускорить вычисления стилей. Например, .headline лучше, чем body div#main article h1.</li><li>Применяйте современный CSS: используйте content-visibility: auto для отложенного рендера контента за пределами экрана. Это ускоряет начальную загрузку и снижает потребление памяти.</li></ul><h2>JavaScript</h2><p>JavaScript часто замедляет страницы из-за объема и времени выполнения. Оптимизируйте его так:</p><ul><li>Заменяйте JS на HTML/CSS: используйте CSS-анимации, &lt;details&gt; или валидацию форм вместо JS, где возможно.</li></ul><ul><li>Минимизируйте фреймворки: избегайте тяжелых библиотек для простых задач. Проверяйте сторонние скрипты (аналитика, реклама) и удаляйте ненужные.</li><li>Разделяйте код: используйте динамический import() или возможности фреймворков для загрузки JS по необходимости.</li><li>Предварительно загружайте важные скрипты: используйте &lt;link rel="preload" as="script"&gt; для ключевых JS-файлов.</li><li>Применяйте async/defer: добавляйте эти атрибуты к &lt;script&gt;, чтобы не блокировать рендеринг. Defer сохраняет порядок выполнения, async подходит для независимых скриптов.</li><li>Минимизируйте JS: используйте UglifyJS или tree shaking для удаления неиспользуемого кода. Настраивайте сборку для ES-модулей.</li><li>Обновляйте зависимости: новые версии фреймворков (esbuild, SWC) часто быстрее. Используйте Renovate или Dependabot для автоматизации.</li><li>Выбирайте подходящий фреймворк: Next.js с React Server Components или Astro с «островковой» архитектурой сокращают объем JS на клиенте, ускоряя загрузку.</li></ul><h2>Изображения</h2><p>Изображения — один из главных факторов загрузки страниц. Оптимизируйте их так:</p><ul><li>Используйте правильный размер: не загружайте изображения больше, чем нужно для отображения. Инструменты вроде ImageMagick или Sharp помогут автоматизировать ресайз.</li><li>Применяйте адаптивные изображения: используйте &lt;img srcset&gt; или &lt;picture&gt; для доставки изображений в зависимости от устройства.</li><li>Сжимайте изображения: используйте ImageOptim, mozJPEG для JPEG, PNGQuant для PNG или SVGO для SVG.</li><li>Предварительно загружайте ключевые изображения: используйте &lt;link rel="preload" as="image"&gt; или fetchpriority="high" для баннеров, влияющих на LCP.</li><li>Откладывайте загрузку: добавляйте loading="lazy" для изображений ниже линии сгиба.</li><li>Используйте WebP/AVIF: эти форматы обеспечивают лучшее сжатие, чем JPEG/PNG. CDN и фреймворки вроде Next.js автоматизируют конвертацию.</li><li>Указывайте размеры: добавляйте width и height или CSS aspect-ratio, чтобы избежать сдвигов макета (CLS).</li><li>Автоматизируйте оптимизацию: используйте Next.js &lt;Image&gt;, Astro или CDN (Cloudinary, Imgix) для автоматической обработки изображений.</li></ul><h2>Видео</h2><p>Видео могут быть тяжелее изображений, поэтому требуют особого внимания:</p><ul><li>Сжимайте видео: используйте Handbrake для MP4/WebM, снижая битрейт или разрешение (например, 720p вместо 1080p).</li><li>Используйте современные кодеки: WebM (VP9) или AV1 обеспечивают лучшее сжатие, чем MP4 (H.264).</li><li>Настройте предварительную загрузку: используйте preload="metadata" или none для видео, чтобы не загружать лишние данные.</li><li>Откладывайте загрузку: применяйте loading="lazy" для iframe или загружайте видео по клику/прокрутке.</li><li>Удаляйте ненужное аудио: уберите звуковую дорожку из фоновых видео с помощью FFmpeg.</li><li>Используйте потоковую передачу: для длинных видео применяйте HLS или DASH для адаптивной загрузки.</li><li>Оптимизируйте сторонние видео: используйте облегченные встраивания (например, lite-youtube-embed) для YouTube/Vimeo.</li></ul><h2>Шрифты</h2><p>Пользовательские шрифты улучшают брендинг, но могут замедлить рендеринг. Оптимизируйте их так:</p><ul><li>Ограничьте количество шрифтов: используйте минимум семейств и начертаний, чтобы сократить запросы.</li><li>Применяйте WOFF2: этот формат компактнее TTF или WOFF и поддерживается всеми браузерами.</li><li>Предварительно подключайтесь к источникам: используйте &lt;link rel="preconnect"&gt; для Google Fonts или других хостов.</li><li>Используйте font-display: swap: это предотвращает FOIT (невидимый текст) и улучшает пользовательский опыт.</li><li>Избегайте сдвигов макета: подбирайте резервные шрифты с похожими метриками или используйте font-size-adjust.</li><li>Рассмотрите переменные шрифты: один файл заменяет несколько начертаний, снижая объем данных.</li><li>Используйте системные шрифты: они не требуют загрузки и работают мгновенно.</li></ul><h2>Хостинг и сервер</h2><p>Конфигурация сервера напрямую влияет на скорость загрузки:</p><ul><li>Используйте HTTPS: это не только безопасно, но и быстрее, благодаря HTTP/2+. Google учитывает HTTPS для SEO.</li><li>Сократите HTTP-запросы: удаляйте ненужные ресурсы и минимизируйте сторонние скрипты.</li><li>Перейдите на HTTP/2 или HTTP/3: HTTP/2 поддерживает мультиплексирование, HTTP/3 (QUIC) ускоряет соединение, особенно на мобильных сетях.</li><li>Используйте CDN: кэшируйте ресурсы на серверах по всему миру для снижения задержек.</li><li>Настройте кэширование: используйте Cache-Control для статических ресурсов и кэширование на уровне приложения.</li><li>Оптимизируйте сервер: держите TTFB ниже 200 мс, оптимизируя запросы к базе данных и вычисления.</li><li>Применяйте статическую генерацию: используйте SSG или ISR (Next.js) для доставки готовых HTML-страниц через CDN.</li></ul><h2>Быстрые улучшения</h2><p>Эти небольшие оптимизации дают заметный эффект:</p><ul><li>Избегайте сдвигов макета: резервируйте место для изображений, iframe и динамического контента, чтобы минимизировать CLS.</li><li>Используйте приоритеты: применяйте fetchpriority="high" для ключевых ресурсов и low для некритических.</li><li>Сократите сторонние запросы: откладывайте загрузку аналитики или рекламы до взаимодействия пользователя.</li><li>Используйте один протокол: избегайте смешанного контента (HTTP/HTTPS).</li><li>Настройте кэширование: используйте длительный max-age для статических ресурсов с хэшами в именах файлов.</li><li>Предварительно загружайте страницы: используйте &lt;link rel="prefetch"&gt; для вероятных переходов.</li><li>Применяйте Service Workers: кэшируйте ресурсы для мгновенной загрузки и оффлайн-доступа.</li></ul><p>Оптимизация фронтенда — это непрерывный процесс, который требует внимания всей команды. Скорость сайта напрямую влияет на пользовательский опыт, SEO и бизнес-показатели. Используйте этот чек-лист, чтобы выявить слабые места и сократить миллисекунды загрузки. Комбинируйте лабораторные тесты и мониторинг реальных пользователей, чтобы отслеживать прогресс. Сделайте скорость приоритетом — ваши пользователи и бизнес скажут спасибо!</p>]]></content:encoded>
    </item>
    <item>
      <title>10 VSCode расширений, которые реально повышают продуктивность</title>
      <link>https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost</link>
      <comments>https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost</guid>
      <description><![CDATA[<p>Топ-10 расширений VSCode для повышения продуктивности: форматирование, тестирование API, управление проектами и многое другое. Ускорьте свою разработку с лучшими инструментами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost">10 VSCode расширений, которые реально повышают продуктивность</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Visual Studio Code — мощный редактор, который становится ещё лучше с правильными расширениями. В этой подборке мы собрали 10 инструментов, реально ускоряющих разработку: они избавляют от рутины и помогают сосредоточиться на главном — качественном коде.</p><h2>1. TabNine</h2><p>Если вам важна скорость — <a href="https://www.tabnine.com/">TabNine</a> стоит попробовать хотя бы ради этого. Расширение —  лёгкий AI-ассистент, который работает как умный автодополнитель кода, непохожий на аналоги вроде Codeium или Copilot.</p><p>TabNine обучен на миллионах строк открытого кода и умеет предсказывать, что вы напишете дальше, с учётом контекста проекта и языка. Отлично справляется с рутинными вещами: автозавершает функции, переменные, конструкции — всё быстро и чаще всего в тему.</p><p><b>Кому подойдёт</b>: тем, кто хочет ускорить набор кода, но не готов передавать весь проект в облако или открывать чат с Copilot. Поддерживает офлайн-режим и локальное обучение модели.</p><p>Плюсы:</p><ul><li>Работает из коробки, не требует тонкой настройки;</li><li>Есть локальная версия — удобно для закрытых проектов;</li><li>Поддерживает большинство языков и фреймворков.</li></ul><p><b>Чем полезен:</b> экономит время на повседневной разработке — особенно когда вы не хотите отвлекаться на документацию или поиск нужной переменной в другом файле.</p><h2>2. GitLens</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens">GitLens</a> встраивает историю изменений прямо в VSCode — и делает это максимально удобно. Показывает, кто и когда изменил строку, коммит-месседж, хэш, ветку и другие детали. Можно не уходить в консоль или отдельный Git-клиент для поиска информации.</p><p>Особенно полезен, когда работаете с чужим кодом или хотите быстро вспомнить, зачем вы сами что-то написали месяц назад.</p><p><b>Кому подойдёт</b>: тем, кто работает в команде, часто читает историю изменений или ревьюит чужие коммиты. Также пригодится в проектах с долгой историей или нестабильным кодом.</p><p>Плюсы:</p><ul><li>Информация о коммитах отображается прямо в редакторе под строкой;</li><li>Есть таймлайн изменений файла;</li><li>Удобный diff по коммитам, авторам, веткам и даже фрагментам кода.</li></ul><p><b>Чем полезен:</b> помогает быстрее разбираться в чужом коде, искать причины бага или откатывать ошибки. Особенно ценится за то, что делает Git прозрачным и доступным прямо в процессе разработки.</p><h2>3. Error Lens</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens">Error Lens</a> выводит диагностику ошибок и предупреждений прямо в строке кода. Это расширение превращает сообщения линтеров и компиляторов в наглядные подсказки, позволяя сразу видеть, что пошло не так.</p><p>Можно настроить отображение: выделять ошибки цветом, добавлять иконки или даже показывать краткие подсказки с предложениями по исправлению. Поддерживает большинство языков и линтеров, включая ESLint, TypeScript и других.</p><p><b>Кому подойдёт:</b> разработчикам, которые хотят моментально видеть ошибки в коде, и тем, кто ценит визуальную чистоту и скорость отладки.</p><p>Плюсы:</p><ul><li>Ошибки и предупреждения отображаются прямо в редакторе, рядом со строкой кода;</li><li>Гибкая настройка стилей и уровня детализации сообщений;</li><li>Ускоряет процесс отладки, особенно при работе с большими файлами.</li></ul><p><b>Чем полезен:</b> минимизирует время на поиск и анализ ошибок, позволяя сразу фокусироваться на их исправлении. Это особенно ценно, когда вы пишете код в реальном времени или работаете с новыми библиотеками, где легко допустить мелкие недочёты.</p><h2>4. Path Intellisense</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense">Path Intellisense</a> — одно из тех расширений, которое просто работает и экономит кучу времени. Оно автоматически подсказывает пути к файлам, папкам и модулям в вашем проекте, как только вы начинаете их набирать. Поддерживает абсолютные и относительные пути, учитывает структуру проекта и форматирует предложения так, как это принято в выбранном языке.</p><p>Работает особенно хорошо в проектах с вложенной структурой, когда нужно быстро сослаться на компоненты, конфиги или ассеты.</p><p><b>Кому подойдёт</b>: всем, кто устал вручную прописывать длинные relative-пути или путаться в структуре проекта. Особенно выручает на фронтенде, где модулей десятки и легко ошибиться в названии.</p><p>Плюсы:</p><ul><li>Подсказки появляются автоматически при наборе пути;</li><li>Поддерживает большинство языков и фреймворков;</li><li>Учитывает jsconfig.json и tsconfig.json при работе с alias-ами.</li></ul><p><b>Чем полезен</b>: снижает количество опечаток и неверных импортов, ускоряет переход между файлами и помогает писать код чуть быстрее.</p><h2>5. TODO Highlight</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight">TODO Highlight</a> подсвечивает комментарии с задачами (например, TODO, FIXME, NOTE) прямо в коде, делая их заметными и удобными для отслеживания. Расширение помогает не терять важные заметки, которые вы оставляете в коде, и быстро находить места, требующие доработки.</p><p>Можно настроить ключевые слова, цвета подсветки и даже добавить свои собственные метки. Работает с любыми языками программирования и интегрируется с панелью задач VSCode для удобного обзора всех TODO в проекте.</p><p><b>Кому подойдёт</b>: разработчикам, которые оставляют заметки в коде, и командам, которым нужно быстро находить задачи или недочёты в проекте.</p><p>Плюсы:</p><ul><li>Яркая подсветка TODO-комментариев прямо в редакторе;</li><li>Гибкая настройка ключевых слов и стилей;</li><li>Интеграция с панелью задач для быстрого обзора.</li></ul><p><b>Чем полезен</b>: экономит время на поиск и управление задачами в коде, помогая не упустить важные доработки или напоминания. Особенно удобно в больших проектах, где комментарии могут затеряться среди строк.</p><h2>6. Prettier – Code formatter</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier</a> — расширение, которое автоматически приводит ваш код к единому стилю, избавляет от ручной правки отступов, кавычек и переносов. Оно поддерживает множество языков (JavaScript, TypeScript, CSS, HTML и другие) и интегрируется с линтерами, чтобы ваш код был не только красивым, но и консистентным.</p><p>Можно настроить правила форматирования под ваш проект или использовать готовые пресеты. Prettier форматирует код при сохранении файла или по команде, а также работает с выделенными фрагментами.</p><p><b>Кому подойдёт</b>: разработчикам, которые хотят экономить время на форматировании, и командам, стремящимся к единообразию кода.</p><p>Плюсы:</p><ul><li>Автоматическое форматирование при сохранении или по хоткеям;</li><li>Поддержка множества языков и кастомных настроек;</li><li>Интеграция с ESLint и другими инструментами для проверки кода.</li></ul><p><b>Чем полезен:</b> убирает рутину ручного форматирования, снижает количество ошибок в стиле кода и помогает сосредоточиться на логике, а не на внешнем виде. Идеально, чтобы ускорить работу и поддерживать чистоту в больших проектах.</p><h2>7. Live Server</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer">Live Server </a>запускает локальный сервер прямо из VSCode, позволяя просматривать изменения в HTML, CSS и JavaScript в браузере в реальном времени. После сохранения файла страница автоматически обновляется, что исключает необходимость ручного перезапуска или обновления браузера.</p><p>Поддерживает кастомные порты, HTTPS, и работает с любыми фронтенд-проектами, от простых HTML-страниц до сложных приложений на React или Vue. Можно настроить, чтобы сервер открывался автоматически при запуске проекта.</p><p><b>Кому подойдёт</b>: фронтенд-разработчикам, которые работают над веб-интерфейсами и хотят мгновенно видеть результат изменений без лишних действий.</p><p>Плюсы:</p><ul><li>Автоматическое обновление страницы при изменении кода;</li><li>Простая настройка и поддержка HTTPS для безопасного тестирования;</li><li>Лёгкий запуск сервера прямо из редактора.</li></ul><p><b>Чем полезен</b>: ускоряет цикл разработки и тестирования веб-приложений, избавляет от ручного обновления страниц. Это особенно экономит время при частых правках в стилях или скриптах, так как можно сразу видеть результат в браузере.</p><h2>8. Project Manager</h2><p>Если работаете над несколькими проектами одновременно — это расширение сэкономит вам часы. <a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager">Project Manager</a> позволяет создавать список избранных проектов и открывать их в один клик, без ручного поиска папок и недавних вкладок.</p><p>Можно задать свои алиасы, группировать по папкам, запускать с хоткеев — особенно удобно, если у вас десятки репозиториев на локалке или вы фрилансите на несколько команд.</p><p><b>Кому подойдёт</b>: разработчикам, которые ведут сразу несколько проектов, часто переключаются между ними и устали искать нужный путь через File &gt; Open Folder.</p><p>Плюсы:</p><ul><li>Быстрое переключение между проектами через интерфейс или хоткеи;</li><li>Поддержка избранного и тэгов;</li><li>Можно автоматически подтягивать все папки из заданной директории.</li></ul><p><b>Чем полезен:</b> избавляет от рутинных действий при переходе между проектами — особенно когда важно не терять фокус и не сбиваться с рабочего темпа.</p><h2>9. Code Spell Checker</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker </a>выявляет орфографические ошибки в комментариях, строках и именах переменных прямо в редакторе VSCode. Расширение подчёркивает опечатки волнистой линией и предлагает варианты исправления через Ctrl+. или Cmd+., что позволяет быстро исправить ошибки.</p><p>Поддерживает множество ЯП и словари для разных языков (английский, русский, немецкий — с дополнительными расширениями). Можно добавлять свои слова в пользовательский словарь или игнорировать определённые термины, чтобы адаптировать проверку под проект. Работает с camelCase и snake_case, не помечая их как ошибки.</p><p><b>Кому подойдёт</b>: разработчикам, которые пишут много комментариев или документации в коде, и тем, кто хочет избежать опечаток в строках, API или логах, чтобы повысить читаемость.</p><p>Плюсы:</p><ul><li>Мгновенное обнаружение ошибок с подсказками для исправления;</li><li>Гибкая настройка словарей и игнорируемых слов;</li><li>Поддержка технических терминов и различных стилей написания кода.</li></ul><p><b>Чем полезен:</b> экономит время на поиск и исправление опечаток, особенно в документации или пользовательских сообщениях, которые могут повлиять на восприятие проекта.</p><h2>10. REST Client</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client">REST Client </a>позволяет отправлять HTTP-запросы и просматривать ответы непосредственно в VSCode. Достаточно создать файл с расширением .http или .rest, написать запрос в простом текстовом формате, и вы увидите кнопку Send Request для моментального выполнения.</p><p>Поддерживает все типы запросов (GET, POST, PUT, DELETE и другие), авторизацию (Basic, OAuth, JWT), переменные окружения и даже генерацию кода на разных языках. Запросы можно сохранять в репозиторий, что удобно для командной работы. Расширение также позволяет использовать динамические переменные по типу {{$timestamp}} или {{$guid}}, всё для гибкой настройки запросов.</p><p><b>Кому подойдёт</b>: тем, кто работает с REST API и хочет тестировать эндпоинты прямо в VSCode, сохранять запросы в проекте и почти не переключаться между инструментами.</p><p>Плюсы:</p><ul><li>Простая отправка запросов через .http или .rest файлы с кнопкой Send Request;</li><li>Поддержка переменных окружения и авторизации для сложных API;</li><li>Возможность сохранять запросы в репозитории для совместной работы.</li></ul><p><b>Чем полезен:</b> ускоряет тестирование API, устраняет необходимость в сторонних приложениях. Запросы хранятся рядом с кодом, что упрощает документирование и повторное использование, особенно в проектах, где API-вызовы нужно часто проверять или делиться ими с командой.</p><p><i>А какими расширениями пользуетесь вы? Пишите в комментариях!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Как Web3 меняет разработку веб-приложений: от серверов к блокчейну</title>
      <link>https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu</link>
      <comments>https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Диана Тажетдинова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu</guid>
      <description><![CDATA[<p>Поговорили с экспертом и узнали, где Web3 даёт практическую пользу разработчикам: сравниваем подходы, исследуем рынок вакансий и особенности новой реальности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu">Как Web3 меняет разработку веб-приложений: от серверов к блокчейну</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[Ethereum]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[смарт-контракты]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Раньше, чтобы запустить приложение, приходилось настраивать сервер и базу данных. В Web3 всё по-другому: вместо серверов — смарт-контракты, вместо базы — блокчейн. <a href="https://www.esparkinfo.com/web3/statistics">По прогнозам</a>, объём рынка Web3‑разработки вырастет с $4,43 млрд в 2024 году до $6,15 млрд в 2025. Кейсы<a href="https://ru.wikipedia.org/wiki/Plume_Network_%E2%80%93_The_Future_of_Real-World_Assets_on_Web3_%F0%9F%8C%90?utm_source=chatgpt.com"> Plume Network</a> и<a href="https://en.wikipedia.org/wiki/The_Graph?utm_source=chatgpt.com"> The Graph</a> показывают, что Web3 уже работает в реальных продуктах. Что, если нас уже сегодня ждет backend в виде блокчейна? Давайте разберём, как меняются инструменты, архитектуры и карьерные треки.</p><h2>Главные отличия Web3 от Web2</h2><p>Перед тем как углубиться в код и практику, полезно увидеть основные различия между привычной Web2-разработкой и новой логикой Web3.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-09-22/3fa1cc2a-0755-4b71-af24-9b8a6f9d22ea.png" alt="" /></figure><p>Представим себе простой сервис для задач. В классическом Web2 его работа привычна: сервер обрабатывает запросы, база данных хранит задачи, а пользователь авторизуется через почту и пароль. Всё централизовано и зависит от владельца сервера.</p><p>В Web3 логика сильно меняется. Пользователь входит в систему с помощью криптокошелька, например, MetaMask. Каждая задача создаётся транзакцией и записывается в смарт‑контракт, а значит становится частью блокчейна. Удалить её уже нельзя — только отметить статус выполнения. Такой подход даёт прозрачность: любой участник сети может проверить, что задача действительно существует, и её статус изменён честно.</p><h2>Стек Web3: что понадобится на практике</h2><p>Чтобы построить работающий DApp, важно понимать, чем он отличается от обычного приложения. DApp — это децентрализованное приложение, в котором логика хранится в смарт-контрактах на блокчейне, а данные — в распределённых хранилищах, а не на сервере компании. Поэтому одного знания блокчейна мало: нужен полный набор инструментов — от языков и фреймворков до кошельков и сервисов подключения.</p><ul><li>Блокчейн: Ethereum, Layer‑2 (Arbitrum, Optimism, Base, Polygon), Solana.</li><li>Языки: Solidity (EVM), Rust (Solana), Go (инфраструктура и сервисы).</li><li>Библиотеки: ethers.js, wagmi.</li><li>Фреймворки: Hardhat, Foundry, Truffle.</li><li>Хранилища: IPFS/Arweave для файлов и метаданных.</li><li>Кошельки/подключение: MetaMask, WalletConnect (v2/WalletConnect Network), Web3Auth.</li></ul><blockquote>Точка входа для новичка — Alchemy, а также ethers.js.</blockquote><p><b>Пример.</b> Быстрое подключение кошелька (ethers.js).</p><h2>Архитектура DApp: из чего состоит современное Web3‑приложение</h2><p>Любое Web3‑приложение строится из нескольких слоёв, каждый со своей ролью. Фронтенд остаётся привычным SPA, но работает не с сервером, а напрямую с кошельком и смарт-контрактами. Контракты содержат бизнес‑логику и хранят ссылки на данные в децентрализованных хранилищах. Оракулы обеспечивают связь с внешним миром, например, передают цены или сообщения между разными блокчейнами. Важную часть играет off‑chain слой — сервисы вне блокчейна (индексаторы, аналитика), которые помогают быстрее искать и обрабатывать данные, при этом не перегружать сеть.</p><p><b>Пример.</b> Возьмём DeFi‑приложение. Пользователь открывает фронтенд и инициирует операцию swap(). В ответ фронтенд обращается к смарт‑контракту, который выполняет обмен токенов. Чтобы определить курс, контракт тянет актуальные данные через оракул. При этом тяжёлые артефакты, изображения или отчёты не хранятся в блокчейне напрямую — они лежат в IPFS. Сам контракт содержит только контент‑идентификаторы CID. Таким образом, получаем баланс: блокчейн отвечает за логику и безопасность, а децентрализованное хранилище — за данные.</p><h2>Практика: ваш первый DApp за вечер</h2><p>Давайте попробуем собрать простейшее приложение своими руками.</p><p><b>Шаг 0. Подготовка</b></p><p>Сначала убедитесь, что у вас стоит Node.js LTS и Git. Также нужен браузер с установленным MetaMask, где можно создать тестовый аккаунт. Чтобы оплачивать транзакции в тестовой сети, заранее возьмите немного тестовых монет через faucet — например, для Sepolia или Polygon Amoy.</p><p><b>Шаг 1. Проект</b></p><p>Создадим новый проект и установим Hardhat вместе с тулзами. Эта среда нужна для компиляции и деплоя контрактов.</p><p><b>Шаг 2. Контракт</b></p><p>В папке contracts/ создаём файл TaskTracker.sol и копируем туда код смарт-контракта из первого раздела. Это и будет бизнес-логика нашего приложения.</p><p><b>Шаг 3. Сценарий деплоя</b></p><p>Пишем скрипт, который разворачивает контракт в сети. Это простой скрипт на JavaScript, который вызывает методы Hardhat.</p><p><b>Шаг 4. Конфиг сети</b></p><p>В файле hardhat.config.js добавляем настройки для подключения к тестовой сети. Используем RPC-URL от Alchemy или Infura и приватный ключ от тестового аккаунта — его можно экспортировать из MetaMask, но использовать только для тестовой сети.</p><p><b>Шаг 5. Деплой в тестнет</b></p><p>Теперь запускаем скрипт деплоя. После выполнения увидите адрес контракта — он понадобится для фронтенда.</p><p><b>Шаг 6. Фронтенд (React + ethers.js + wagmi)</b></p><p>Собираем простое SPA: форма, чтобы добавить задачи, и кнопка «complete». Здесь мы используем ethers.js для обращения к контракту. Сделайте вызовы addTask и completeTask.</p><h2>Подводные камни Web3-разработки и что с ними делать</h2><p><b>Комиссии (gas): </b>любая запись в блокчейн стоит денег и иногда комиссия выше ценности операции — например, $10 за простую задачу.</p><ul><li>Что делать: использовать Layer-2 (Arbitrum/Optimism/Base/Polygon), выбирать сети с низкими комиссиями (Solana, Avalanche), оптимизировать контракты и батчи транзакций.</li></ul><p><b>Скорость: </b>подтверждение транзакции занимает секунды или десятки секунд, что заметно медленнее обычного сервера.</p><ul><li>Что делать: показывать «оптимистичный UI», кешировать данные, переносить часть логики off-chain, использовать быстрые сети (Solana, Near, Aptos).</li></ul><p><b>Безопасность:</b> код контракта неизменяем, и одна ошибка может стоить миллионов.</p><ul><li>Что делать: проходить аудит (CertiK, Trail of Bits), использовать проверенные библиотеки (OpenZeppelin), писать тесты в тестовых сетях (Goerli, Sepolia), внедрять баг-баунти и ролевую модель доступа.</li><li>Ресурс:<a href="https://consensys.io/diligence/smart-contract-security-best-practices/"> ConsenSys Diligence — Smart Contract Security Best Practices</a>.</li></ul><p><b>UX:</b> вход через кошелёк сложнее привычного логина/пароля. Нужно ставить расширение, пополнять баланс и подтверждать каждую транзакцию.</p><ul><li>Что делать: использовать аккаунт-абстракцию (ERC-4337), социальный логин, gasless транзакции через Paymaster, улучшать UI (подсказки, авто-фокус на MetaMask).</li></ul><p><b>Регуляция: </b>законы о Web3 пока разные в каждой стране. Легальное в одной юрисдикции может быть запрещено в другой (например, токенизация акций без лицензии).</p><ul><li>Что делать: консультироваться с юристами, следить за изменениями. Например, MiCA в ЕС — “Markets in Crypto-Assets Regulation” —  это единый регламент по криптоактивам в Евросоюзе.</li></ul><blockquote>Безопасность всегда должна быть на первом месте, потому что в Web3 есть риск потерять реальные деньги пользователей.</blockquote><h2>Карьерные возможности и перспективы</h2><p>Web3‑разработчиков уже активно ищут: <a href="https://web3.career/learn-web3/web3-intelligence-report">зарплаты в среднем предлагают выше</a>, чем у Web2‑коллег. Кроме программистов, востребованы смежные роли: аудиторы смарт‑контрактов, специалисты по безопасности, а также продакт‑менеджеры и аналитики, которые понимают специфику блокчейна.</p><p>Чтобы войти в профессию, начните с изучения Solidity и базовых паттернов смарт‑контрактов. Сделайте пару пет‑проектов и выложите код в GitHub. Отличный вариант прокачки — участвовать в хакатонах и грантовых программах от Ethereum Foundation или Solana Grants. Это даёт и опыт, и контакты, и иногда финансирование.</p><blockquote>Пара пет‑проектов + понимание блокчейна — хороший старт в Web3‑команду.</blockquote><h2>Будущее Web3</h2><p>Web3 не вытеснит Web2 полностью, но поменяет привычный подход к разработке. Разработчику это открывает новые вызовы: комиссии, безопасность и UX, но одновременно и новые возможности — прозрачные данные, токенизация, децентрализованные бизнес‑модели.</p><p>Для тех, кто только входит в сферу, это шанс попасть в индустрию на раннем этапе и быстро нарастить экспертизу. Простые пет‑проекты, хакатоны и знакомство с инструментами дают ощутимый старт.</p><p>Web3 будет развиваться параллельно с Web2, усиливая те области, где важны децентрализация, доверие и контроль за данными. Попробуйте задеплоить первый контракт — и вы сами почувствуете, что это не просто мода, а новый уровень возможностей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Будущее фронтенда: куда движется React, Vue и Angular</title>
      <link>https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular</link>
      <comments>https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular</guid>
      <description><![CDATA[<p>Как изменились React, Vue и Angular за последние 5-10 лет? Эксперты ответили, что будет с фронтенд-разработкой в 2026 году и стоит ли переходить на фреймворки без VDOM и гидратации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular">Будущее фронтенда: куда движется React, Vue и Angular</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Паттерны проектирования]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние пять лет IT-сфера изменилась так сильно, что джун из 2020 года сегодня бы не прошёл собеседование на ту же позицию.</p><p>Если вы фронтенд-разработчик или только планируете им стать, эта публикация поможет вам сориентироваться в текущей ситуации:</p><ul><li>Узнаете, какие крупные изменения произошли в React, Vue и Angular за последние 5-10 лет.</li><li>Поймёте, стоит ли учить новые фреймворки без виртуального DOM или лучше углубиться в проверенные решения.</li><li>Разберётесь, почему компании продолжают требовать знание React, хотя Solid.js работает быстрее.</li></ul><p>Тимлид и разработчики рассказали, как они видят будущее профессии. Объяснили, почему джуну недостаточно знать только JS, какие навыки помогут вам зарабатывать больше и оставаться востребованным специалистом.</p><p>ℹ️ <i>После прочтения вы сможете принять взвешенное решение: продолжать углубляться в текущий стек, осваивать новые инструменты или развивать смежные навыки.</i></p><h2>Как изменились React, Vue и Angular за последние 5-10 лет?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/f488b013-32ed-47d0-ada9-3a1c3a84b59f.jpg" alt="" /></figure><h3>React</h3><p>До 2019 года разработчики писали объёмные классы с методами жизненного цикла. Они управляли состоянием через setState и передавали данные через пропсы. Потом появились <b>хуки </b>— с тех пор логику помещают в функции, состоянием управляют через useState и useReducer, побочные эффекты контролируют через useEffect.</p><p>Серверные компоненты решили проблему первой загрузки. Тяжёлые части приложения обрабатывает сервер и отправляет клиенту уже готовыми. Конкурентный режим разбивает отрисовку на части и расставляет приоритеты для обновлений — интерфейс не виснет, когда нагрузка возрастает.</p><h3>Vue</h3><p>Composition API сделал организацию кода более гибкой. Логику теперь группируют по функциональности, а не по типам опций. Ещё реактивность переписали с нуля на прокси-объектах, что ускорило отслеживание изменений.</p><p>Компилятор научился оптимизировать шаблоны на этапе сборки. Телепорты решили проблему с модальными окнами и всплывающими подсказками — компоненты отрисовываются в нужном месте DOM-дерева независимо от родителя.</p><p><a href="https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy">В какую сторону развивается Vue и есть ли ему современные альтернативы</a></p><h3>Angular</h3><p>Каждый компонент сам определяет свои зависимости, поэтому пропала необходимость в модулях. <b>Сигналы</b> заменили зонную детекцию изменений. Теперь Angular точно знает, какие части интерфейса нужно обновлять.</p><p>Строгая типизация и декораторы сделали код более предсказуемым. Встроенные инструменты покрывают все потребности крупных проектов: формы с валидацией, маршрутизация с ленивой загрузкой, HTTP-клиент с перехватчиками.</p><p>Фреймворки уходят от сложных решений к более простым. Тренд последних лет — делать приложения быстрее для пользователей и удобнее для разработчиков.</p><p>Пока большая троица занималась «работой над ошибками», появился запрос на <a href="https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya">что-то</a> более лёгкое и быстрое.</p><h2>Фронтенд-фреймворки кажутся избыточными — возвращаемся к ванильному JS?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/1af1ebd0-69e3-4f07-8d6d-053e8c3e70bb.jpg" alt="" /></figure><blockquote>Тот, кто попробовал фреймворки, никогда не вернется к чистому ванильному JS 🙂 Меняются и развиваются сами фреймворки, но тренда на отказ от них точно нет.</blockquote><p>Несмотря на тенденцию упрощения, разработчики сходятся во мнении, что полного отказа от фреймворков не произойдёт.</p><blockquote>В моде решения на основе концепции «исчезающих фреймворков», которые на выходе выдают почти чистый императивный JS-код. Дело в том, что это общий тренд в IT, где вся сложность и расчёты уходят в инфраструктуру, собирая минимальный бандл, где нет ничего лишнего для клиентов.</blockquote><p>Фреймворки — это ещё и способ стандартизации разработки в командах.</p><blockquote>Фреймворки никогда не будут избыточными. Один из первых вопросов на собеседовании —  инструмент, с которым ты умеешь работать. Больший пласт знаний сегодня — это фреймворк. Остальное, чаще всего, бизнес-логика того или иного проекта.</blockquote><p>Из-за критики традиционных фреймворков появился новый класс решений. Больше всего ругают VDOM и гидратацию, хотя они считались неотъемлемой частью современных SPA.</p><h2>Стоит ли переходить на фреймворки без VDOM и гидратации?</h2><p>Solid.js и Svelte уже несколько лет развивают концепцию тонкой реактивности. В 2021 году появился Qwik, который вообще отказался от гидратации.</p><blockquote>SolidJS хорош для аналогов десктопных приложений в браузере — Figma, Miro. Здесь приложение загружается один раз, а потом работает долго и должно быть максимально отзывчивым. Qwik отлично подойдёт, если вы создаёте сайт, куда пользователь приходит за контентом, и важно показать ему этот контент мгновенно.</blockquote><p>При этом массового перехода на новые фреймворки пока не происходит. Компании продолжают искать React и Vue разработчиков — проекты на Solid.js и Qwik остаются экспериментальными.</p><blockquote>Сами по себе фреймворки мало значат для коммерческой разработки без сторонних библиотек вокруг них. Вот когда критическая масса разработчиков популярных библиотек мигрирует на Qwik, а вместе с ними и сообщество, что-то сдвигается.</blockquote><p>Проблема новых фреймворков — это отсутствие экосистемы. React и Vue окружены тысячами готовых библиотек для любых задач. На Solid.js и Qwik большинство решений придётся писать самостоятельно.</p><blockquote>Без поддержки сообщества пользователей ни один инструмент не сможет стать массовым. Даже если работаешь в заказной разработке и есть возможность расширить кругозор команды, сомнительно брать на тест инструмент, под который придётся писать до 30% базового функционала.</blockquote><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/74e9b111-b93b-4fdf-a8b5-9db67bf7e95e.jpg" alt="" /></figure><p>Команды, которые захотят перейти на новые фреймворки, столкнутся с дополнительными сложностями. Разработчикам придётся учить новые концепции и подходы, а компаниям — тратить время и деньги на переобучение.</p><blockquote>У новых фреймворков высокий порог входа: вас ждёт переобучение команды и сложности ручной оптимизации.</blockquote><p>Технологии развиваются циклично. То, что сейчас кажется инновацией, переосмысливает старые подходы.</p><blockquote>Во времена DDR/DDR2 было сложно выполнять клиентский рендеринг, а вот серверам ресурсов хватало. Разработчики как могли воплощали подход, который сейчас называется SSR, и возвращали на клиент готовую разметку для компонентов. И никакого тебе VDOM.</blockquote><p>Пока новые фреймворки остаются нишевыми инструментами. React, Vue, Angular продолжат доминировать в коммерческой разработке за счёт экосистемы и сообщества.</p><h2>Как изменится роль фронтенд-разработчика в 2026 году?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/6027e94f-65a4-4ab2-9364-6f5e322267f1.jpg" alt="" /></figure><p>В 2020 году джуниор находил работу, если знал HTML, CSS и основы JS. Сегодня работодатели требуют от новичков React или Vue, TypeScript, системы сборки — и это не конец списка. Ещё и вакансий на всех начинающих не хватает, компании сразу ищут мидлов.</p><p>Инструменты с искусственным интеллектом — Copilot, ChatGPT, Cursor — ускоряют работу. Они же повышают планку: если джун с помощью ИИ работает как мидл, то мидл должен демонстрировать более глубокие знания. Работодатели стали больше ценить тех, кто понимает принципы работы кода, а не просто копирует готовые решения.</p><blockquote>Зная JavaScript и любой инструмент даже не из большой тройки, с использованием AI можно быстро погрузиться в другой нужный инструмент.</blockquote><p>Чёткой границы между фронтендом и бэкендом больше нет. От фронтенд-разработчика ждут, что тот разбирается в серверной части, умеет настраивать процессы непрерывной интеграции и доставки, работает с базами данных.</p><h2>Какие навыки развивать разработчику, чтобы оставаться востребованным?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/d62a3715-b713-4af3-8658-3ff4a6df7d85.jpg" alt="" /></figure><p>Технические навыки — это основа. Когда понимаете алгоритмы и структуры данных, вы пишете быстрый код. Когда знаете паттерны проектирования, ваши приложения легко поддерживать.</p><p><b>Учитесь быстро разбираться в новых инструментах вместо того, чтобы зацикливаться на одном фреймворке</b>.</p><blockquote>По мне так лучше быть фреймворк-агностиком, нежели фанатом одного, которого легко чем-то обидеть.</blockquote><p>Архитектурное мышление отличает <b>«</b>сильного<b>»</b> разработчика:</p><ul><li>Как организовать код, чтобы его легко поддерживать?</li><li>Как спроектировать API, чтобы оно не ломалось при изменениях?</li><li>Как построить систему, которая выдержит рост нагрузки?</li></ul><p>Те, кто решают эти вопросы, получают офферы с космическими зарплатами.</p><p><b>Софт-скиллы</b> тоже влияют на карьерный рост:</p><ul><li>Объясните техническую проблему менеджеру простыми словами.</li><li>Проводите код-ревью так, чтобы не обидеть коллегу, но улучшить код.</li><li>Оценивайте сроки и управляйте ожиданиями.</li><li>Аргументируйте выбор технологии.</li></ul><p>Когда вы понимаете бизнес, вы становитесь партнёром. Почему мы делаем эту фичу? Как она повлияет на метрики? Какие есть альтернативы? Разработчик, который мыслит категориями бизнеса, становится незаменимым.</p><p>Рынок вынуждает постоянно учиться, потому что индустрия меняется каждый год. Кто застревает в зоне комфорта — отстаёт.</p><p><i>Как ChatGPT повлиял на ценность вашего труда? Успеваете подстраиваться под требования рынка, параллельно работать и пробовать новые технологии? Делитесь в комментариях.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик объяснил, почему React тормозит развитие фронтенда</title>
      <link>https://tproger.ru/news/razrabotchik-obyasnil--pochemu-react-tormozit-razvitie-frontenda</link>
      <comments>https://tproger.ru/news/razrabotchik-obyasnil--pochemu-react-tormozit-razvitie-frontenda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-obyasnil--pochemu-react-tormozit-razvitie-frontenda</guid>
      <description><![CDATA[<p>Разработчик заявил, что React тормозит развитие фронтенда: фреймворк выбирают «по умолчанию», игнорируя более быстрые и современные альтернативы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-obyasnil--pochemu-react-tormozit-razvitie-frontenda">Разработчик объяснил, почему React тормозит развитие фронтенда</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Инновации]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Sep 2025 11:01:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>React, один из самых популярных JavaScript-фреймворков, перестал побеждать за счет технических преимуществ и теперь «побеждает по умолчанию». К такому выводу пришел разработчик Лорен Стюарт в своей свежей <a href="https://www.lorenstew.art/blog/react-won-by-default/">статье</a>.</p><h2>«Выбор React — это рефлекс»</h2><p>Автор утверждает, что команды слишком часто выбирают React не потому, что он подходит под задачи, а потому, что «все его знают».</p><p>Это, по его словам, убивает конкуренцию и мешает развитию альтернатив — таких как Svelte, Solid или Qwik. Эти фреймворки предлагают новые архитектурные модели, быстрее работают в ряде сценариев, но редко получают шанс, потому что выбор уже сделан заранее.</p><h2>Технологии 2013 года в 2025-м</h2><p>React до сих пор использует концепции, созданные более 10 лет назад: виртуальный DOM, эффект-хуки, ререндеринг через reconcile.</p><p>Хотя команда React продолжает развивать фреймворк (например, через Server Components и React Compiler), сам подход остается сложным и неэффективным — особенно в сравнении с конкурентами, которые перераспределяют нагрузку на этапе сборки и избегают избыточных вычислений в браузере.</p><h2>Проблема — не в React, а в «React-по-умолчанию»</h2><p>По мнению автора, React сам по себе не плох. Проблема — в «монокультуре», которая блокирует инновации.</p><p>Меньше внимания уделяется веб-стандартам, большинство вакансий требует именно React, а университеты ориентируются на рынок, а не на фундаментальные знания.</p><h2>Что делать</h2><p>Разработчик призывает руководителей и команды делать выбор не по инерции, а осознанно: оценивать реальные требования проекта, пробовать альтернативы, не бояться использовать Svelte, Solid или Qwik хотя бы в отдельных модулях.</p><p>В противном случае, предупреждает он, вся фронтенд-экосистема будет развиваться медленнее — а значит, в убытке окажутся все.</p>]]></content:encoded>
    </item>
    <item>
      <title>SolidJS и Qwik: фронтенд нового поколения</title>
      <link>https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya</link>
      <comments>https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya</guid>
      <description><![CDATA[<p>Обзор SolidJS и Qwik — плюсы и минусы фреймворков. Сравнение SolidJS и Qwik, практические рекомендации по переходу и тенденция отказа от React/Vue.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya">SolidJS и Qwik: фронтенд нового поколения</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Помните, когда впервые попробовали React/Vue после JS и jQuery?</b> Тот момент, когда всё встало на свои места, и вы поняли — вот оно, будущее фронтенда. В 2025 году разработчики <a href="https://www.reddit.com/r/solidjs/comments/1m4hlzj/im_really_impressed_with_solid/">испытывают</a> похожие чувства с SolidJS и Qwik.</p><h2>Последний рубеж React и Vue</h2><p><b>Согласны, что VDOM превратился в бюрократическую прослойку?</b> Изменили состояние в одном месте — получите полный пересчёт дерева компонентов. Фреймворки заставляют загружать всё сразу, тащат багаж служебного кода. И пока этот код не загрузится, пользователь смотрит на белый экран.</p><p>SSR <a href="https://tproger.ru/translations/rendering-on-the-web">ускоряет</a> загрузку страницы: сервер рендерит HTML, пользователь видит контент и пытается с ним взаимодействовать. Но пока JavaScript не загрузится, ничего не заработает.</p><p>Потом JS наконец подгружается и начинает гидратацию. По сути, он заново создаёт в памяти то же дерево компонентов, которое сервер уже отрендерил в HTML. Выполняется двойная работа. Кстати, в это время пользователь тыкает неработающие кнопки — дотерпит ли он до полной загрузки?</p><p>Системные проблемы не исправить очередным хуком или новой версией фреймворка, поэтому появление SolidJS и Qwik — было вопросом времени.</p><blockquote>Поиск новых решений — здоровый признак развития фронтенда. В конце концов, и Vue был создан потому, что Эвану Ю не хватало облегченной альтернативы AngularJS. Большая тройка фреймворков решает огромный спектр задач, имеет колоссальную поддержку сообщества, но их нельзя назвать идеальным инструментом на все случаи жизни.</blockquote><h2>Обзор SolidJS</h2><p>SolidJS во многом похож на React. Самое интересное — его подход к обновлению интерфейса:</p><ul><li><b>Отсутствие виртуального DOM</b> — Solid напрямую обновляет только те DOM-узлы, которые действительно изменились.</li><li><b>Компоненты как функции инициализации</b> — каждый компонент вызывается только один раз для настройки реактивности.</li><li><b>Сигналы вместо хуков</b> — состояние управляется через createSignal(), который возвращает геттер/сеттер пару.</li></ul><p>Например, когда срабатывает счётчик, Solid не перерисовывает весь компонент. Он точечно обновляет только текст внутри &lt;p&gt;, где используется count():</p><h3>Преимущества SolidJS</h3><p>👍 <b>Производительность и размер бандла</b></p><p>Благодаря отсутствию виртуального DOM и мелкозернистым обновлениям, приложения <a href="https://www.reddit.com/r/reactjs/comments/tsx8hw/solidjs_devex_compared_to_react/?tl=ru">работают</a> быстрее аналогов на React.</p><p>👍 <b>Простота освоения</b></p><p>Синтаксис SolidJS похож на React. Функциональные компоненты, JSX, концепции вроде Suspense и Error Boundaries — всё это есть в Solid. Изучение основ <a href="https://www.reddit.com/r/solidjs/comments/1len1pf/comment/myi8qci/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">займёт</a> 1-2 дня, если есть опыт с MobX/effector/RxJS.</p><p>👍 <b>Стабильность</b></p><p>Фреймворк находится на стабильной версии 1.x. Это означает отсутствие кардинальных изменений API, в отличие, например, от ситуации со Svelte, где сосуществуют версии 4 и 5 с разными подходами.</p><p>👍 <b>Совместимость с React</b></p><p>SolidJS совместим с экосистемой React. Можно переиспользовать дизайн-системы и компоненты в legacy-приложениях.</p><p>👍 <b>Удобное управление состоянием</b></p><p>Функционал сигналов и сторов покрывают 90% потребностей в управлении состоянием без необходимости подключать внешние библиотеки.</p><h3>Минусы SolidJS</h3><p>👎 <b>Ограниченная экосистема</b></p><p>Выбор готовых компонентов и библиотек значительно меньше, чем у React. Команды тратят больше времени на создание компонентов с нуля: тяжко при работе с таблицами, гридами, формами, валидацией.</p><p>👎 <b>Кривая обучения</b></p><p>Несмотря на знакомый синтаксис, модель реактивности SolidJS отличается от React. Разработчики должны усвоить следующие принципы:</p><ul><li>Избегать условных конструкций непосредственно в компонентах.</li><li>Не деструктурировать пропсы и сторы, чтобы сохранить реактивность.</li><li>Не использовать асинхронный код внутри createEffect.</li></ul><p>👎 <b>Проблемы с инструментарием</b></p><p>Возникают сложности с настройкой компилятора в нестандартных окружениях — монорепозиториях, при запуске тестов или интеграции с другими инструментами. DevTools не дотягивает до аналога у React.</p><p>👎 <b>SolidStart всё ещё развивается</b></p><p>SSR-решение SolidStart пока не достигло зрелости Next.js или Nuxt. Разработчики <a href="https://www.reddit.com/r/solidjs/comments/1len1pf/comment/myml5tt/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">сообщают</a> о проблемах с гидратацией и других сложностях при работе с серверным рендерингом.</p><h2>Обзор Qwik</h2><p>Qwik — это проект Мишко Хевери (создателя Angular). Идея фреймворка заключается в возможности возобновить работу приложения на клиенте без повторного выполнения кода, который уже был выполнен на сервере.</p><p>В Qwik радикально решили проблему гидратации — полностью отказались от неё. Время до интерактивности (TTI) падает в разы. Пользователь может кликать на кнопки сразу после загрузки HTML, без ожидания разогрева всего приложения.</p><p>Qwik автоматически разбивает код на мелкие чанки и загружает их только при необходимости. Символ $ в коде указывает на границы ленивой загрузки.</p><h3>Плюсы Qwik</h3><p>👍 <b>Мгновенная загрузка</b></p><p>Практически нулевой JavaScript при первоначальной загрузке, следовательно отличные показатели Core Web Vitals.</p><p>👍 <b>Автоматическая оптимизация</b></p><p>Оптимизация на уровне компилятора, умная предзагрузка критических ресурсов. Не нужно думать о разделении кода — Qwik делает это автоматически.</p><p>👍 <b>Знакомый синтаксис</b></p><p>👍 <b>Спасибо за SEO</b></p><p>Быстрая загрузка улучшает ранжирование за счёт полноценного SSR из коробки.</p><h3>Минусы Qwik</h3><p>👎 <b>Молодая экосистема</b></p><p>Ограниченное количество библиотек, мало готовых решений и компонентов. Небольшое сообщество разработчиков (если сравнивать с React/Vue).</p><p>👎 <b>Кривая обучения</b></p><p>Придётся изучать новые концепции. Из-за ленивой загрузки усложняется отладка.</p><blockquote>Qwik — это радикально новая ментальная модель. У фреймворка высокий порог входа: вас ждёт переобучение команды и сложности ручной оптимизации. Чтобы Qwik работал идеально, разработчик должен вручную указывать, что можно лениво загружать, а что нет.</blockquote><p>👎 <b>Сложность интеграции</b></p><p>Трудно интегрировать существующие React/Vue компоненты и ограниченная поддержка сторонних библиотек. Скорее всего, придётся с нуля переписывать код существующего проекта.</p><h2>Экосистема и готовность к продакшену</h2><p>Если сравнивать с React, то экосистема — самое слабое место обоих фреймворков.</p><p>SolidJS имеет SolidStart — метафреймворк с роутингом, SSR и серверными функциями. <a href="https://docs.solidjs.com/quick-start">Документация</a> качественная, сообщество активное. Большинство React-библиотек можно адаптировать без особых проблем, для популярных UI-китов есть готовые порты.</p><p>Qwik развивается в связке с <a href="https://qwik.dev/docs/qwikcity/">Qwik City</a>, который покрывает типовые задачи веб-разработки. <a href="https://www.builder.io/m/qwik">Builder.io</a> активно инвестирует в экосистему, регулярно выходят обновления и новые интеграции.</p><p>Риски есть, но они управляемые. Меньший размер сообщества означает меньше готовых решений и ответов на Stack Overflow. Если не боитесь изучать новое, то выигрыш в производительности перевесит неудобства.</p><h2>Сравнение SolidJS и Qwik</h2><p>SolidJS повышает производительность обновлений. Если данные меняются часто и непредсказуемо — графики, мониторинги, редакторы — Solid даст максимальную отзывчивость.</p><p>Qwik повышает производительность загрузки. Если бизнес зависит от первого впечатления, Qwik обеспечит мгновенный старт.</p><p><b>Медиа</b>, <b>блоги</b> с жёсткими требованиями к TTFB/TTI/INP будут лучше работать на Qwik. Пользователи смогут читать и скроллить без задержки. Интерактив добавляется дозированно — это лучшая стартовая стоимость.</p><p><b>E-commerce</b>, <b>каталоги </b>с SEO и карточками рекомендуется разрабатывать на Qwik. Особенно если на главной тяжёлые модули, а клиенты приходят с поисковиков. Вы выигрываете у конкурентов буквально на первом взаимодействии.</p><p><b>Сложный SPA</b> или <b>дашборд </b>с живыми виджетами и апдейтами будет лучше работать на SolidJS. Точечная реактивность упростит жизнь и снизит цену апдейтов. Solid сияет в проектах, где происходят сотни мелких изменений в секунду.</p><blockquote>Solid хорош для аналогов десктопных приложений в браузере — Figma, Miro. Здесь приложение загружается один раз, а потом работает долго и должно быть максимально отзывчивым. Также Solid будет хорош там, где важна плавность анимаций.</blockquote><p><b>Лэндинги</b>, <b>мобильные приложения</b>, <b>визитки</b> — здесь Solid даст сверхбыструю реактивность и облегчит сборку.</p><p>Оба фреймворка умеют SSR/SSG и стриминг. Solid снижает стоимость обновлений, Qwik — стоимость старта. Для LCP/TTI/INP в контентных сценариях выигрывает Qwik. Для интенсивных интерактивных сценариев Solid удерживает FPS и снижает CPU.</p><p>Оба дружат с серверными платформами. SolidStart имеет адаптеры для Vercel/Netlify, Qwik City — тоже.</p><blockquote>Выбирайте Solid.js, если вы создаете сервис, куда пользователь заходит надолго, и ему важна отзывчивость после загрузки. Выбирайте Qwik, если вы создаете сайт, куда пользователь приходит за контентом, и важно показать ему этот контент мгновенно.</blockquote><p>Немного выводов:</p><ul><li>Solidjs быстрее Qwik при рендеринге. Qwik быстрее Solidjs при загрузке страниц.</li><li>У Solidjs документация лучше, чем у Qwik.</li><li>С нуля код на Qwik писать проще и быстрее, чем на SolidJS.</li><li>Typescript в SolidJS может быть головной болью, в Qwik об этом можно не беспокоиться.</li></ul><h2>Практические рекомендации по переходу на SolidJS и Qwik</h2><ol><li><b>Начните с аудита текущих проблем</b>. Посмотрите метрики сайта: сколько времени занимает гидратация? Тормозят ли обновления интерфейса? Где именно проблема — на старте или в процессе работы?</li><li><b>Выберите изолированную часть проекта</b>. Возьмите один виджет, одну страницу, один компонент и реализуйте его на новом фреймворке. Измерьте разницу в производительности и удобстве разработки.</li><li><b>Если проблема в медленной загрузке</b> — попробуйте Qwik. Соберите прототип лендинга или каталога, включите SSG с resumability и протестируйте на медленном соединении.</li><li><b>Если проблема в тормозах интерфейса</b> — попробуйте Solid. Перепишите самый страдальный компонент с частыми обновлениями, уберите мемоизации и посмотрите на результат.</li></ol><p>Оба фреймворка собираются через Vite, имеют TypeScript из коробки и хорошую интеграцию с популярными инструментами. Стоимость эксперимента низкая, а потенциальная выгода высокая.</p><h2>Тенденция отказа от React/Vue</h2><blockquote>Компании и разработчики не столько отказываются от популярных решений, сколько перестают использовать их для всех задач подряд. Раньше выбора практически не было, и эти фреймворки были молотком, для которого любая задача — гвоздь.</blockquote><p><i>А вы что думаете? Готовы попробовать модные фреймворки SolidJS и Qwik в следующем проекте?</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Карьера через пет-проект: как выбрать идею и довести до результата</title>
      <link>https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata</link>
      <comments>https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata</guid>
      <description><![CDATA[<p>Разбираемся, как создать пет-проект и не выгореть: идея, MVP, обратная связь и упаковка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/karera-cherez-pet-proekt--kak-vybrat-ideyu-i-dovesti-do-rezultata">Карьера через пет-проект: как выбрать идею и довести до результата</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как найти идею для пет-проекта</h2><p>Новички, когда сталкиваются с пет-проектами, бросаются в две крайности. Создают очередной To-Do list, который ничем не выделяется, либо пытаются сделать что-то слишком сложное, например, убийцу Notion, и забрасывают работу на полпути. Так как же выбрать идею, которую получится довести до конца?</p><h3>Ключевые нюансы при выборе идеи пет-проекта</h3><p>Сначала надо подумать, какая у вас или вашего окружения есть проблема, которую вы могли бы решить своим проектом? Учите английский и любите сериалы? Так почему бы не сделать телеграм-бота, который будет присылать отрывки с определённой лексикой? Считаете своё резюме и портфолио слишком скучными? Можно оформить их в виде современного лендинга, правда придётся прикрутить интересные фичи, иначе это не пет-проект. Например, если вы фронтенд-разработчик, то можно сделать необычную анимацию, добавить несколько цветовых тем, демонстрацию проектов прямо на странице, интерактивную карту навыков и опыта.</p><p>Ваш «питомец» должен решать какую-то проблему и выделяться фишкой, иначе он никого не впечатлит.</p><blockquote>Впечатляют проекты, которые выглядят как реальные продукты. Например, когда кандидат делает пет-проект под конкретную потребность: финтех-дашборд, Telegram-бот или полноценное веб-приложение, которым уже пользуются или которое может быть полезно.</blockquote><blockquote>Как-то я пришёл на хакатон — занимался рекомендательными системами. Тогда был пик популярности Word2Vec — это модель, которая переводит слова в векторы и позволяет находить между ними смысловую близость. Я посмотрел на статистику и увидел: на одном из сайтов 25% запросов не давали результатов. Тут возникла идея, как это улучшить.<br /><br />Решил собрать демку и сделал прототип: например, на запрос «кресло из крокодиловой кожи» модель показывала зелёные кожаные кресла. Не крокодиловые, но всё равно релевантные запросу.<br /><br />За неделю допилил прототип до презентабельного состояния, показал коллегам и руководителю. Они дали «зелёный свет», через 2 месяца была первая MVP, которую уже начали продавать существующим клиентам. Ещё через месяц — первый клиент, интеграция, запуск.<br /><br />Спустя ~5 лет количество клиентов уже измерялось сотнями :)</blockquote><p><b>Подумайте, какие навыки хотите показать</b></p><p>Если делаете проект для портфолио, то можно выбрать несколько вакансий, на которые вы претендуете. Какие там требования к стеку, какие нужны навыки?</p><p>Например, если хотите работать фронтенд-разработчиком в онлайн-школе, то почему бы не сделать простое образовательное приложение на React и заточить его под себя? Смотрите, кого ищет рынок, и подстраивайтесь под его запросы.</p><p><b>Не затягивайте со сроками</b></p><p>Если рекрутер увидит, что вы полгода делали дизайн кнопки для сайта, то, скорее всего, подумает, что не умеете планировать работу и доводить проекты до конца.</p><p>Выбирайте несложный и интересный проект, который вы не затяните и который будет вам по силам.</p><blockquote>Основная ошибка — это незаконченные, «сырые» решения. HR смотрят на проекты, в том числе, как на способность завершать начатое. Если в портфолио много таких работ, это наводит на мысли, что разработчик быстро теряет интерес, плохо планирует время или бросает задачи при первых трудностях.</blockquote><p><b>Не используйте учебные работы, либо используйте их правильно</b></p><p>Многие онлайн-школы обещают готовое портфолио по окончании обучения, но оно обычно состоит из учебных проектов. В целом, это неплохо, но есть пара нюансов:</p><ol><li>У вас и ваших одногруппников эти работы одинаковые. Представьте лицо HR, когда он увидит несколько похожих проектов в разных резюме.</li><li>Учебные проекты не совсем ваши, ведь вы повторяли код и основные конструкции за преподавателями. Работодателю важно, как вы пишете сами, а не копируете.</li></ol><p>Следует разделять учебные проекты и пет-проекты. В первом случае вы осваиваете новые навыки и технологии, во втором стараетесь их показать. Выбрасывать работы с учёбы тоже не нужно, просто надо подумать, как их можно улучшить, какую фишку добавить, как переработать, чтобы отличиться от десятка таких же работ. Как пример, можно изменить фронтенд, добавить новую логику в бэкенд, разработать уникальную фичу.</p><h2>Всё равно не могу ничего придумать, что делать?</h2><p>Если самостоятельно не получается что-то придумать, то можно спросить у ИИ.</p><p>ChatGPT и другие языковые модели отлично умеют генерировать идеи на заданную тему. Часто в ответах появляются нестандартные, свежие задачи, которые вам бы и не пришли в голову. Даже если сгенерированные проекты кажутся банальными — всегда можно докрутить, добавить свою логику или фишку. Но используйте ИИ как вдохновителя, не просите его написать код проекта за вас — это будет заметно и станет не преимуществом, а «красным флагом».</p><p>Пример промпта для идеи пет-проекта:</p><p><b>Возьмите задачу с фриланса</b></p><p>Зайдите на любую фриланс-биржу и полистайте разделы с небольшими заказами. Часто там попадаются простые, но жизненные — например, сделать мини-сервис для бронирования столиков или инструмент для учёта личных трат. Никто не обязывает брать заказ — достаточно посмотреть, что нужно заказчикам, и сделать что-то подобное для портфолио.</p><p><b>Спросите друзей или аудиторию в соцсетях</b></p><p>Иногда самая классная идея приходит от окружения. Просто расскажите друзьям, что хотите сделать проект, и спросите, с какими неудобствами в жизни, работе или учёбе они сталкиваются. Кто-то устал вручную напоминать детям делать домашку — тут можно создать бота. Кто-то жалуется на путаницу в личных финансах — почему бы не собрать на эту тему простое приложение? Иногда полезные задачи всплывают и в тематических чатах или сообществах.</p><blockquote>У меня был разработчик, уставший от хаоса в списках фильмов, которые он хочет посмотреть. Сделал пет-проект — личный медиапланировщик с нейтральным UI. Проект не стал стартапом, но в портфолио смотрелся отлично. Если сложно — можно взять существующую идею и улучшить. Например, сделать привычный To do-лист с уклоном в UX, нейросети или интеграции. Главное — показать свою силу, а не сделать ещё один клон.</blockquote><h2>Как довести пет-проект до конца и не забросить его</h2><p>Вы выбрали идею для проекта, прикинули стек, сроки, пошли писать код и… забросили. Часто бывает, что вначале полны энтузиазма, а под конец либо ничего не получается, либо появляются мысли, что проект — пустая трата времени. Чтобы такого не было, лучше соблюдать следующие правила:</p><p><b>Чтобы сделать пет-проект, не делайте его.</b> По крайней мере, сразу. Мотивация — вещь непредсказуемая: сегодня идея кажется классной, а завтра — сущей ерундой. Не спешите сразу бросаться на проект, лучше дайте идее «настояться» неделю или две. Если прошло прилично времени, а руки всё ещё чешутся, то это хороший знак — за проект можно браться.</p><p><b>Определите для себя MVP</b> — минимальный рабочий продукт, который точно сможете довести до релиза. Всё, что не критично для запуска, сразу откладывайте, иначе перфекционизм и погоня за новыми фичами утащат вас на дно.</p><p>Например, если вы хотите сделать кроссплатформенный видеоплеер для изучения языков, то можно откинуть идею со встроенным ИИ, голосовым ассистентом и автоматической генерацией субтитров. Конечно, это всё здорово, но затягивает процесс. Простого перевода субтитров и автоматического создания карточек на первом этапе будет уже достаточно.</p><p><b>Разбейте проект на задачи и подзадачи.</b> Например, дизайн плеера, его вкладок, основная логика, подключение API, отладка.</p><p>Не забывайте отмечать выполненные задачи, когда мотивация вас покинет, у вас перед глазами будет уже какой-то прогресс, из-за которого жалко бросать работу на полпути.</p><p><b>Определитесь со сроками.</b> Пусть они будут примерными — главное, чтобы был ориентир. Например, дать себе месяц на MVP, неделю на запуск базовой версии, пару дней на исправление багов. Без сроков любая задача может растянуться, а когда есть конечная точка, появляется стимул не бросать начатое.</p><blockquote>Один из основных критериев — полезность продукта. Нет смысла изобретать велосипед. То, что вы создаёте, должно быть либо лучшего того, что уже есть, либо вообще уникальным. И тут не важно, в какой сфере вы решите это всё произвести, главное, чтобы было чёткое понимание, зачем это делается и какой будет итог. Проще говоря, без плана не нужно начинать, иначе велик риск всё забросить. Большая часть тех, кто начал и не закончил, как раз не прорабатывали свои идеи.</blockquote><p><b>Используйте знакомый стек.</b> Если этот проект нужен для портфолио, то лучше выбрать стек, в котором вы уже уверенно работаете. Иначе утонете в новом, не доведёте до конца, либо получите в итоге что-то непрезентабельное.</p><p>Конечно, это правило не абсолютное, использовать новые для вас технологии можно, просто это надо делать дозировано.</p><p>Если очень грубо, то ориентир выглядит так: 80% кода — это знакомый нам стек, 20% — место для экспериментов и обучения. Такой подход позволяет прокачать новые навыки и довести проект до финала без выгорания.</p><p><b>Занимайтесь регулярно по чуть-чуть.</b> Берегите себя, отдыхайте, не надо сидеть по 5 часов в день над проектом, если за него не платят. Вначале можно выезжать на мотивации, но со временем это приведёт к выгоранию.</p><p>Лучше постараться выработать привычку и заниматься петом, например, каждый день по 30 минут. Не можете соблюдать эту привычку по каким-то причинам? Не проблема, вместо 30 минут найдите 5. Да, за это время вы ничего не успеете, но сохраните «регулярность» —  на следующий день будет проще.</p><p><b>Делитесь результатами.</b> Не держите всё в столе, делитесь ходом работы и результатом. Покажите ваш MVP друзьям, обсудите его на форуме, заведите репозиторий на GitHub. Без обратной связи можно легко что-то упустить.</p><p>Аналогично с трудностями. Если сталкиваетесь с багами или просто чего-то не понимаете, то спрашивайте. В том же телеграм есть тематические чаты по пет-проектам, где можно запросить обратную связь.</p><p>А вот ещё несколько советов от Анастасии Егоровой — фронтенд-разработчика, автора  программы курса SkillBox по Vue 3 и ведущей ютуб-канала <a href="https://www.youtube.com/@CosyFrontendNastia">CosyFrontend</a>.</p><blockquote>Проблема пет-проектов в том, что их редко доводят до конца. Нет дедлайнов, нет ответственности перед руководством и коллегами, нет мотивации в виде будущей оплаты. Особенно сложно становится, когда пет-проект тянется уже не первую неделю, а первоначальная архитектура оказывается совсем неподходящей для дальнейшей разработки, что нередко бывает, когда мы пробуем новые технологии.<br /><br />У некоторых разработчиков количество таких заброшенных и недоделанных проектов — десятки штук. Что можно придумать для того, чтобы большинство ваших домашних проектов доводились бы до конца?<br /><br />1. Фиксировать прогресс, например, на доске Trello, чтобы самому видеть продвижение по проекту. Не забывать коммитить в гит. Некоторым разработчикам помогает отписываться о состоянии проекта в личный блог.<br /><br />2. Избегать перфекционизма — сначала сделать рабочую версию, а потом постепенно ее улучшать.<br /><br />3. Возвращаться без чувства вины — забросить проект может любой разработчик, у каждого из нас бывают авралы на работе, активности в жизни, выгорания, моменты прокрастинации.<br /><br />P.S. Когда мы обсуждали тему пет-проектов и их забрасывания в одном из айтишных чатов, один из разработчиков отметил: «А никак не нужно доводить их до конца — пет-проекты для того и существуют, чтобы попробовать на них новую идею и забросить». Так что такое мнение тоже есть, но справедливо ли оно для вас — решайте сами 😀</blockquote><h2>Как оформить пет-проект</h2><p>Для работодателя важен не столько масштаб проекта, сколько подход к работе, качество кода и умение доводить дело до конца, поэтому проект должен выглядеть презентабельно.</p><p><b>Поработайте над UI/UX.</b> Приятный и удобный интерфейс — ваш первый плюс в глазах работодателя. Потратьте время на то, чтобы кнопки, цвета и структура приложения были понятны с первого взгляда.</p><p>Чтобы убедиться, что пользователям удобно использовать сервис — запросите обратную связь у знакомых, коллег и родственников. Учтите их замечания.</p><p><b>Упакуйте проект в GitHub.</b> Если у вас пустой репозиторий, который называется my project, то проект никто не оценит. У HR большой поток откликов, иногда они принимают решение за пару секунд, поэтому очень важно, чтобы по вашему репозиторию как можно быстрее можно было понять, что вы сделали, как это работает и какие технологии вы использовали.</p><p>Сделайте подробное описание readme —  в паре абзацев расскажите, что это за проект, для кого, какие проблемы решает. Добавьте описание стека архитектуры. Чем подробнее, тем лучше.</p><p>Добавьте скриншоты, гифки, видео работы сервиса. А ещё лучше его демоверсию.</p><p>Постарайтесь проработать структуру проекта, чтобы она была логичной. В нём не должно быть дублей и мусора. Если кто-то впервые откроет ваш репозиторий, ему должно быть понятно, что это за проект.</p><p>То же самое с историей коммитов. Сделайте её читаемой с внятными комментариями, чтобы рекрутер видел не только ваш проект, но и процесс создания.</p><p>Опишите результаты  по конкретным метрикам, если, конечно, это возможно. Опубликовали приложение в Google play и получили хорошее удержание пользователей? Расскажите об этом. Вашу фичу оценили в социальных сетях? Поделитесь приятным фидбеком. Метрик нет, делали проект только под себя? Расскажите, как он помог вам решить проблему.</p><blockquote>Лучше всего оформить проект на GitHub с описанием задач, технологий и особенностей реализации. Выделяются разработчики, которые показывают, что не просто пишут код, но и обосновывают решение и объясняют, как всё устроено.<br /><br />Желательно, чтобы код был чистым, с продуманной архитектурой и, по возможности, прошёл ревью опытных коллег. Будет плюсом, если в проекте видно, что разработчик следит за качеством: пишет документацию и покрывает код тестами.</blockquote><p><b>Распишите проект как кейс.</b> Подготовьте шпаргалку. Это мини-история, где вы рассказываете о проекте. Какая проблема побудила вас его сделать, какие возникли трудности на этапе разработки, как их решали, какой получили результат. У вас получится подробное описание пути разработки от идеи до финала.</p><p>Это можно расписать в виде заметки, сделать пост в социальных сетях, опубликовать статью. Вы получите подробную шпаргалку, которую можно использовать для презентации проекта в портфолио или на собеседованиях.</p><p>Главное, не делайте проект ради проекта, старайтесь принести какую-то пользу и здраво оценивайте свои возможности.</p>]]></content:encoded>
    </item>
    <item>
      <title>Типизированная навигация в React Router</title>
      <link>https://tproger.ru/articles/tipizirovannaya-navigaciya-v-react-router</link>
      <comments>https://tproger.ru/articles/tipizirovannaya-navigaciya-v-react-router?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Михаил Сахаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tipizirovannaya-navigaciya-v-react-router</guid>
      <description><![CDATA[<p>Когда прочитаете эту статью, сможете настроить типобезопасную навигацию в своем проекте, забудете про сломанные ссылки после рефакторинга и перестанете нервничать на релизах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tipizirovannaya-navigaciya-v-react-router">Типизированная навигация в React Router</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 16 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Типизированная навигация в React Router решает классические проблемы фронтенд-разработки: опечатки в путях, сломанные ссылки после рефакторинга и отсутствие автокомплита. Это полезно и джунам, которые хотят избежать глупых ошибок, и сеньорам, проектирующим большие проекты. Инструмент превращает строковые пути в типобезопасную систему навигации.</p><p>Представьте: пятница, 18:30. Релиз через час. Вы меняете один роут в конфиге — и внезапно половина приложения отлетает. Поздравляем, вы только что познакомились с классической болью фронтендеров.</p><p>Проблема кроется в самой природе JavaScript. Строковые пути вроде /users/profile/${id} существуют в коде как обычные строки — без проверок, автокомплита и гарантий корректности. Опечатался в /usres вместо /users — и твоя навигация сломалась, а TypeScript молчит как рыба.</p><p>Двадцать лет назад мы кликали по window.location.href, десять лет назад — радовались React Router, а сегодня пора переходить на типизированные решения.</p><p>Когда прочитаете эту статью, сможете настроить типобезопасную навигацию в своем проекте, забудете про сломанные ссылки после рефакторинга и перестанете нервничать на релизах.</p><h2>Суть проблемы</h2><p>Проблема очевидна: путь /admin/products размазан по всему коду. TypeScript не знает, что эти строки связаны с определенной директорией, поэтому не проверяет их корректность. Опечатка в product вместо products — и вылетает ошибка 404.</p><p>В больших проектах эта проблема критична. Приложение с 200+ путями, где навигация разбросана по сотне компонентов, превращается в минное поле. Один программист меняет структуру URL, а остальные даже не подозревают об этом. Команды используют TypeScript для типобезопасности, но навигация остается уязвимой.</p><h2>Что такое типизированная навигация?</h2><p>Типизированная навигация превращает строковые пути в типизированные объекты. Вместо /admin/products/123/edit программист работает с функциями, которые знают структуру приложения и проверяют корректность написания путей на этапе компиляции.</p><p>Представьте GPS-навигатор, который знает все адреса в городе. Вы не можете ввести несуществующую улицу — система сразу выдаст ошибку. Так работает типизированная навигация: TypeScript проверяет, что путь существует, параметры переданы правильно, а структура URL соответствует пути.</p><p>Три ключевых преимущества: автокомплит в IDE, проверка на этапе компиляции и безопасный рефакторинг. Поменяете пути в коде — TypeScript сразу покажет все места, которые нужно обновить.</p><p>Польза зависит от уровня разработчика:</p><ul><li>Джуны получают защиту от опечаток и автокомплит — меньше глупых ошибок и быструю разработку.</li><li>Миддлы ускоряют разработку благодаря надежному рефакторингу — можно смело менять структуру URL без страха что-то сломать.</li><li>Сеньоры используют типизацию для построения архитектуры приложения — создают переиспользуемые компоненты навигации, проверяют параметры и строят масштабируемые системы путей и директорий.</li></ul><p>Типизированная навигация превращает хрупкий код в надежную систему, где ошибки находятся до деплоя.</p><h2>Как использовать React Router вместе с TypeScript</h2><p>Для базовой типизации в React Router v6 сначала определите структуру путей. Создайте интерфейс, который описывает все пути в приложении:</p><p>Типизация параметров URL решает проблему с useParams. Вместо any получаете конкретные типы:</p><p>Query-параметры типизируются аналогично через useSearchParams. Создайте интерфейс для каждой страницы с query-параметрами и оберните хук.</p><p>Так система будет дополнять код в IDE, проверять все пути на этапе компиляции и защитит от опечаток. Полчаса настройки сэкономят вам часы отладки и целый вагон нервов.</p><h2>Как внедрить типизированную навигацию в проекты</h2><p>Централизованная система маршрутов облегчает управление навигацией в больших приложениях. Создайте отдельный файл с конфигурацией всех путей:</p><p>Конфигурация избавит от нужды дублировать код при генерации типов. TypeScript автоматически выведет все возможные пути и их параметры из одного объекта.</p><p>Современные библиотеки решают проблему из коробки.<a href="https://tanstack.com/router"> Например, Tanstack Router</a> предоставляет полностью типизированную систему путей с автогенерацией типов, а<a href="https://github.com/typehero/type-route"> Type-route</a> создает типобезопасные пути через API.</p><p>Библиотека<a href="https://github.com/typesafe-routes/typesafe-routes"> typesafe-routes</a> внедряется даже в крупные проекты без необходимости менять сотни строк кода.</p><p>Выбор инструмента зависит от размера программы. Если у вас небольшое приложение — быстрее написать хук в пару строк. Но если разрабатываете сложный сервис — используйте библиотеки.</p><h2>Как не сломать код при использовании типизированной навигации</h2><p>Не пытайтесь переписать весь проект за раз — создайте типизированные хуки для новых фич, а старый код обновляйте по мере рефакторинга.</p><p>Чеклист для код-ревью поможет не уронить прод:</p><ul><li>Все новые navigate() и  используют типизированные версии;</li><li>Параметры путей явно типизированы;</li><li>Нет магических строк в навигации;</li><li>Query-параметры описаны интерфейсами.</li></ul><p>Важно: не используйте одновременно строки и типизированные пути — выберите один подход для проекта и не допускайте высокого уровня вложенности в объектах.</p><p>Автоматизация упрощает процесс. ESLint правило no-hardcoded-routes запретит использование строк в навигации. Код-генераторы создают типы из OpenAPI схем или конфигурации роутера.</p><p>Производительность не страдает — типы исчезают после компиляции. Теряется немного времени на компиляцию TypeScript, но экономия на отладке перекрывает затраты.</p><h2>Где применять типизированную навигацию</h2><p>SPA-приложения получают максимальную пользу от типизированных путей. В дашбордах с десятками страниц навигация становится еще важнее — один сломанный путь может уронить проект.</p><p>E-commerce проекты выигрывают от типизации каталогов и фильтров. Пути вроде /catalog/:category/:subcategory?filters=price,brand содержат много параметров, которые легко сломать при рефакторинге.</p><p>Интеграция с Redux и Zustand упрощает синхронизацию состояния с URL. Типизированные селекторы автоматически обновляются при изменении роутов:</p><p>Вложенные директории требуют особого внимания. Каждый уровень вложенности усложняет типизацию — планируйте структуру заранее, а не рефакторьте задним числом.</p><p>Типизированная навигация — стандарт современной разработки. Команды, которые до сих пор полагаются на строковые пути, тратят лишнее время на поиск багов. Программисты увереннее рефакторят код, не боятся мелких ошибок и не роняют прод в пятницу вечером из-за одного символа в пути.</p>]]></content:encoded>
    </item>
    <item>
      <title>Техлиды и продуктовые менеджеры — всё? Зачем нужны Technical Owner и Unit-лид в IT-командах</title>
      <link>https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah</link>
      <comments>https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah</guid>
      <description><![CDATA[<p>Что приходит на смену классическим техлидам и продакт-менеджерам в IT: рассказываем, зачем нужны Technical Owner и Unit-лид, какие проблемы они решают в реальной разработке и как меняются роли в командах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tehlidy-i-produktovye-menedzhery-vsyo--zachem-nuzhny-technical-owner-i-unit-lid-v-it-komandah">Техлиды и продуктовые менеджеры — всё? Зачем нужны Technical Owner и Unit-лид в IT-командах</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[5g]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Jul 2025 10:24:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект выстрелил, команда растёт, но вместе с этим растёт и хаос. Интеграция с другим отделом не работает, бизнес хочет новую фичу, где надо впихнуть невпихуемое, а старый код висит на балансе неизвестно у кого.</p><p>Всё это — обычная история для быстрорастущих IT-компаний. Пока команда маленькая, хватает одного тимлида. Но когда людей становится больше, старые процессы начинают сбоить.</p><p>Здесь и появляются новые роли — Technical Owner и Unit-лид. Их задача — взять на себя куски ответственности, которые раньше выпадали из поля зрения команды.</p><blockquote>В российских компаниях эти роли пока не получили широкого распространения, особенно в небольших и средних организациях, где функции часто распределены между тимлидами, продакт-оунерами и проектными менеджерами. Однако в крупных IT-компаниях и продуктовых командах, таких как Avito и другие, Unit-лид и Technical Owner становятся всё более востребованными, поскольку помогают разграничить ответственность и повысить прозрачность управления сложными продуктами и командами.</blockquote><h2>Technical Owner: кто это и зачем нужен</h2><p>Представим ситуацию: компания разрабатывает маркетплейс на Python и React, всё вроде идёт по плану, пока менеджеры не просят срочно добавить новую систему оплаты. Они не вникают, что для этого придётся переделать схему платежей, разнести микросервисы, рискуя уронить старые заказы. Разработчики объясняют, что быстро не выйдет, но их не слышат — и в итоге проект зависает между требованиями бизнеса и возможностями команды. Именно в таких случаях нужен Technical Owner.</p><h3>Кто это такой</h3><p>У такого специалиста обычно есть технический бэкграунд, он хорошо понимает, что под капотом, и может общаться с командой разработки на одном языке. Также разбирается в бизнес-процессах, понимает дорожную карту развития продукта. За счёт этих особенностей технический владелец может переводить язык разработчиков на язык бизнеса и обратно, избегая недопониманий.</p><h3>Какие у него обязанности</h3><p>Вот примерный список того, что делает ТО:</p><ul><li>Консультирует заказчиков и владельцев по техническим вопросам.</li><li>Составляет дорожную карту развития проекта, с учётом требований к разработке.</li><li>Помогает с разработкой решений, начиная с архитектуры.</li><li>Участвует в расстановке приоритетов.</li><li>Поддерживает команды и отслеживает их зависимости.</li></ul><p>Это неполный список, и обязанности отличаются в разных компаниях, всё зависит от специфики продукта и процессов.</p><h3>Чем отличается от продуктового менеджера, техлида и архитектора</h3><p><b>Чем ТО отличается от продуктового менеджера</b></p><p>Продуктовый менеджер обычно больше фокусируется на управлении командой. Он отвечает за общее видение продукта, общение с клиентами, организацию и сроки. Но чем сложнее продукт и процессы, тем сильнее нужен человек, который сможет управлять и разработкой, и продуктом в целом. Для таких задач есть ТО, который, с одной стороны, понимает, куда движется продукт, какое его позиционирование, с другой — знает, какие нюансы в разработке могут возникнуть и как продукт лучше всего спроектировать.</p><p><b>Чем отличается от тимлида, техлида и архитектора</b></p><p>Тимлид, техлид — это руководители команды, которые отвечают только за её задачи. TO, хоть и глубоко понимает техническую сторону, но его роль шире —  он связывает технику с бизнесом и даже консультирует клиентов. Technical Owner отвечает за общее техническое и архитектурное видение продукта. Масштаб его ответственности больше.</p><p>В отличие от архитектора, технический владелец не только принимает участие в проектировании, но и доносит эти решения до клиентов и руководства.</p><blockquote>Technical Owner (Технический владелец) ответственен за долгосрочное здоровье и развитие конкретного компонента/системы/продукта. Фокус на технической стратегии, архитектуре, надёжности и поддержке в течение всего жизненного цикла.<br /><br />Техлид руководит командой, отвечающей за разработку. Фокус на распределении задач, наставничестве и решении технических проблем.<br /><br />Архитектор решений определяет технологический стек и взаимодействие компонентов. Фокус на общей структуре и дизайне решения.<br /><br />Технический владелец может делегировать задачи техлиду и руководствоваться архитектурой, предложенной архитектором, но конечная ответственность за успех компонента лежит на нём.</blockquote><h2>Сколько зарабатывает и какие нужны навыки, чтобы стать ТО</h2><p>Если мы сейчас пойдём на hh.ru и введём в поиск Technical Owner, то, в лучшем случае, найдём только пару вакансий. Technical Owner нужен для больших продуктов в крупных компаниях, поэтому должность встречается на рыке редко и пробиться туда сложно.</p><p>Зарплата и навыки зависят от конкретной компании, её процессов и задач. Обычно это что-то на уровне топ-менеджмента. Вот пример заработной платы в одной из <a href="https://getmatch.ru/vacancies/24808-technical-owner-disk">вакансий</a> от Яндекс 360:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/37fe6863-ca0d-432e-8285-fbb18098f941.jpg" alt="" /><figcaption>Пример зарплаты на вакансию Technical Owner от Яндекс 360</figcaption></figure><p>А вот так выглядят обязанности и необходимые навыки:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/ff7d27db-b585-4548-80c6-4432b0110a14.jpg" alt="" /><figcaption>Описание задач для Technical Owner</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/e680ef81-cb5c-4a13-8c73-02b17ec95ce3.jpg" alt="" /><figcaption>Требования к Technical Owner</figcaption></figure><p>Вот пример ещё одной такой <a href="https://volgograd.hh.ru/vacancy/121349277?query=Itransition+Technical+Owner&amp;hhtmFrom=vacancy_search_list">вакансии</a> от компании Itransition:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/c548e397-d04a-4bb1-9db5-8e6137079283.jpg" alt="" /><figcaption>Требования к Technical Owner в вакансии от Itransition</figcaption></figure><p>Как видно, здесь есть требования к опыту работы в качестве продуктового менеджера и аналитика, технической подкованности и определённому стеку.</p><p>Чтобы стать таким специалистом, нужно хорошо разбираться в разработке, подходить по стеку и иметь опыт управления командой.</p><h2>Кто такой Unit-лид, зачем он нужен</h2><h3>Кто это такой</h3><p>Юнит-лид — это руководитель, который возглавляет «юнит» – объединение нескольких команд (обычно 3-5), работающих над частью общего продукта или бизнес-направления. Он отвечает за стратегию и бизнес-результаты своего юнита.</p><blockquote>В последние полгода в нашей компании появилась новая управленческая роль — Unit Lead. Это ответственный руководитель,который координирует работу всего юнита: от стратегии до найма и развития сотрудников. Мы внедрили эту модель не просто ради структуры — она стала ответом на быстрый рост бизнеса и усложнение внутренних процессов.<br /><br />Что такое юнит? Это самостоятельный бизнес-модуль, включающий несколько стримов (направлений). Каждый стрим, в свою очередь, состоит из команд по 5-10 человек. Таким образом, один юнит может объединять от 5 до 12 команд, представляющих разные IT-направления: фронтенд, бэкенд, мобайл и др.</blockquote><h3>Какие у него обязанности</h3><p>Обязанности юнит-лида очень обширны и зависят от типа юнита:</p><p><b>Стратегическое развитие и планирование</b>: юнит-лид определяет общую стратегию развития своего юнита, составляет планы проектов, согласовывает их со стейкхолдерами.</p><p><b>Управление командами и сотрудниками</b>: управляет командами, например, аналитиков, разработчиков, QA-инженеров, занимается развитием их компетенций, формирует портфель проектов, следит, чтобы эти проекты были реализованы.</p><p><b>Взаимодействие со стейкхолдерами</b>: активно общается со множеством внутренних и внешних заказчиков, лидерами бизнеса и продукта, регулирующими органами и партнёрами. Он занимается привлечением и защитой необходимых ресурсов, которые нужны для продукта.</p><p><b>Ответственность за результаты</b>: вся ответственность за вектор развития и конечный результат юнита лежит на юнит-лиде. Иногда на нём висит даже отчётность по финансовым результатам.</p><p><b>Разработка и развитие продуктов/инструментов</b>: юнит-лиды могут адаптировать существующие инструменты, разрабатывать новые под потребности команд, а также создавать внутренние платформы и технически сложные продукты.</p><h3>Чем отличается от продуктового менеджера и тимлида</h3><p>Роль юнит-лида схожа с некоторыми другими позициями, но всё же от них отличается. Рассмотрим несколько таких отличий.</p><p><b>Что делает продуктовый менеджер</b></p><p>Продуктовый менеджер (PM или Product Owner) отвечает за конкретный продукт или его отдельные части. Его главная задача — понять, что нужно пользователям и бизнесу, сформировать требования и приоритеты, а затем воплотить эти требования в жизнь. PM постоянно держит руку на пульсе метрик, проводит A/B-тесты и собирает обратную связь.</p><p><b>Что делает тимлид</b></p><p>Тимлид — это руководитель разработки внутри одной команды. Он отвечает за техническое качество кода, выполнение задач в срок и развитие команды. Его основная забота — чтобы код был качественным, архитектура — адекватной, а команда справлялась с поставленными задачами без перегрузок и постоянных авралов.</p><p><b>Чем занимается юнит-лид</b></p><p>Юнит-лид работает на другом уровне. Если представить компанию как армию, то тимлид руководит взводом, продуктовый менеджер отвечает за успешность операции, а юнит-лид — полковник, который решает, какие операции вообще нужны, какими силами их проводить и как это повлияет на общую картину. Он отвечает за бюджет, координацию нескольких команд и стратегическое развитие целого направления.</p><p>Например, в Avito есть <a href="https://habr.com/ru/companies/avito/articles/885968/">аналитический юнит-лид</a>, который управляет одной командой аналитики и двумя техническими. Первая команда занимается ценами: изучает разные способы образования цен на услуги Avito, анализирует результаты изменения цен, оценивает эффективность промокампаний.</p><p>Две другие команды отдают цены в другие сервисы, организуют скидки, интегрируют новые категории товаров и услуг в систему.</p><blockquote>Unit-лид — это такая гибридная роль, которая объединяет менеджерские навыки с техническим пониманием. От тимлида он отличается тем, что не погружается в код-ревью и техническую детализацию спринтов, а больше занимается координацией между командами. <br /><br />В отличие от обычного проектного менеджера, Unit-лид разбирается в архитектурных решениях и может принимать технические решения сам, без долгих согласований. Он следит за тем, чтобы команда двигалась в рамках продуктовой стратегии, а не только закрывала текущие задачи по списку. Такой специалист становится связующим звеном между разными уровнями управления.<br /><br />В нашей практике в Юнисофт мы сталкивались с ситуацией, когда отсутствие такой роли приводило к хаосу и потере общего видения проекта.</blockquote><h3>Сколько зарабатывает unit-лид, какие нужны навыки и как им стать</h3><p>Наткнуться на вакансию юнит-лида на просторах hh.ru тоже непросто. Это новая роль, которая нужна только для сложных продуктов в крупных IT-компаниях.</p><p>С зарплатой и обязанностями всё индивидуально, зависит от компании. Вот пример одной из <a href="https://getmatch.ru/vacancies/14624-unit-lead">вакансий</a> от Купера:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/3d95de82-4238-4845-96c0-5026093fe9b4.jpg" alt="" /><figcaption>Пример зарплаты юнит-лида в Купере</figcaption></figure><p>Зарплата вполне на уровне топ-менеджмента. А вот обязанности и ожидания:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/fc1da5fa-ed76-47ee-a599-3339cee29908.jpg" alt="" /><figcaption>Обязанности и ожидания юнит-лида</figcaption></figure><p>Как видим, помимо менеджерских навыков здесь тоже нужно понимание стека. Но в отличие от Technical Owner, юнит-лид больше сфокусирован на управлении продуктом, чем на его технической составляющей.</p><p>А вот ещё один пример обязанностей и ожиданий в <a href="https://yandex.ru/jobs/vacancies/yunitlid-v-komandu-postavki-dannih-v-crm-31805">другой вакансии</a>, на этот раз от Яндекса:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-24/96ce7071-00ca-4bbe-ad2b-e660bad75e85.jpg" alt="" /><figcaption>Описание задач для юнит-лида</figcaption></figure><p>Как видно из обеих вакансий, для того чтобы стать юнит-лидом нужно иметь технический бэкграунд, но при этом обладать опытом управления командами, работать с процессами, ставить и выполнять задачи.</p><h2>Где и когда эти роли реально нужны (а где — нет)</h2><h3>Какие компании и проекты выигрывают от появления таких ролей</h3><p>Technical Owner и Unit-лид подходят не всем. В стартапах и небольших командах, где каждый знает свои задачи и зоны ответственности, эти позиции будут избыточными и просто усложнят работу.</p><p>Но в крупных компаниях и быстрорастущих проектах, которые уже переросли старые схемы управления, эти роли реально помогают. Если проект вырос до нескольких команд, которые работают над разными продуктами или направлениями, то Unit-лид поможет держать фокус на стратегических целях. Technical Owner пригодится, когда задачи настолько усложнились, что нужен человек, который свяжет технические решения и требования бизнеса, предотвращая недопонимания.</p><h3>Сигналы, что команде пора подумать о Technical Owner или Unit-лиде</h3><p>Есть несколько явных признаков, когда стоит задуматься о введении этих ролей:</p><ul><li>Постоянные споры о том, кто должен заниматься интеграциями, техническим долгом и сложными архитектурными вопросами.</li><li>Регулярные задержки и проблемы с релизами из-за несогласованности между командами.</li><li>Непонимание между менеджерами и разработчиками: одни требуют невозможного, другие объясняют технические сложности.</li><li>Наличие нескольких продуктовых направлений, для которых нужны люди, умеющие координировать работу сразу нескольких команд.</li></ul><blockquote>Создание этих ролей актуально, когда бизнес выходит за рамки одной команды и одного продукта. Если у компании несколько направлений, которые требуют отдельного фокуса и развития, то Unit-лид — необходимый управленец для децентрализации и роста. <br /><br />Technical Owner нужен, когда продукт становится достаточно сложным, и необходимо, чтобы один человек держал в фокусе его техническую эволюцию, а не просто оперативную реализацию. Это позволяет стратегически управлять качеством кода, архитектурой и техническими рисками<b>.</b></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>5 инструментов, которые используют айтишные команды</title>
      <link>https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy</link>
      <comments>https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy</guid>
      <description><![CDATA[<p>Показываем, какими инструментами пользуются внутри айтишных команд и какие можно использовать для себя здесь и сейчас или внедрить в свою команду.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy">5 инструментов, которые используют айтишные команды</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В статье собрали 5 решений — от трекеров задач и онлайн-досок до комплексных платформ для управления проектами. Инструменты помогут закрывать горящие дедлайны, ускорять разработку и четко распределять задачи — все то, что используют в больших командах. Рассказываем, что делать с этими фичами и как их использовать.</p><h2>1. МояДоска</h2><p><a href="https://moyadoska.com/">«МояДоска»</a> — это российский SaaS-сервис для совместной работы и визуализации идей. У онлайн-доски бесконечный размер: это значит, что вы можете размещать сколько угодно элементов и никогда не упретесь в границу. Так, команды, преподаватели и креативные специалисты могут проводить брейнштормы, планирования, презентации и обучение в одном пространстве.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/4fe2215f-6b29-4d0c-a490-281b2d045ddc.jpeg" alt="" /></figure><h3>Что под капотом</h3><p>Фронт написан на React + PixiJS, а бэк — Node.js + PostgreSQL. Это обеспечивает быстрый и понятный интерфейс и стабильную работу даже при большом объёме объектов на доске. Команда выпускает обновления несколько раз в месяц, а о новинках можно узнать в <a href="https://t.me/moyadoska">Telegram-канале</a> сервиса. Например, в недавнем апдейте появилась возможность превратить фрейм в таблицу или тетрадь за пару кликов, а еще задать нужное число столбцов, колонок, толщину границ и цвет.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/0f1a8489-ffe3-4003-8ecc-09d25bbba3b3.png" alt="" /></figure><p><b>Из главных функций:</b></p><ul><li>Понятный интерфейс</li><li>Совместная работа в реальном времени</li><li>Привычные инструменты: фигуры, стрелки, стикеры, текст, загрузка файлов, маркер, карандаш</li><li>Обрезка фото прямо на доске, воспроизведение аудио, поддержка PDF</li><li>Гибкое управление доступом</li><li>Возможность повторного использования шаблонов</li><li>Поддержка фреймов и создание логичных пространств для разных задач</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/21a6ecbd-a6b5-40c9-ae19-71a85b919c46.png" alt="" /></figure><h3>Переезд на сервис</h3><p>«МояДоска» интегрируется в процессы на разных этапах, упрощая жизнь команде. Например, сама команда сервиса перешла с Miro на свою доску для стратегического планирования. С помощью стикеров и стрелок они построили дерево решений, чтобы лучше расставить приоритеты. А одно маркетинговое агентство перевело все документы и сессии планирования на доску, отказавшись от Google Docs и таблиц. Это ускорило принятие решений: сотрудники работали с данными в одном формате, точно собрались в одном кабинете перед маркерной доской.</p><h2>2. METEOR</h2><p><a href="https://u-meteor.ru">METEOR</a> — инструмент управления проектами. Это трекер задач с дашбордами, досками канбан, диаграммами Ганта и API, который работает в виде веб-приложения как в облаке, так и на своих серверах. Продукт создавался как универсальный центр управления задачами: он объединяет в себе все — от разработки и тестирования до маркетинга и поддержки. Сейчас его используют более 250 команд и свыше 2000 пользователей ежедневно.</p><h3>Что под капотом</h3><p>В основе — стек Ruby on Rails, React и TypeScript, PostgreSQL и Redis, плюс современная инфраструктура на Docker и Kubernetes.</p><p>Система разбита на микросервисы — за фоновую обработку, нотификации и работу с файлами отвечает отдельный функционал. Авторизация построена через OAuth 2.0 (Google, Yandex), а для аналитики используется Posthog и ELK-стек. Мониторинг реализован на Prometheus + Grafana. Обновления выходят каждую неделю, а обратная связь приходит разработчикам METEOR через Telegram-бот.</p><p><b>Вот главные функции:</b></p><ul><li>Гибкие доски задач (Kanban, Scrum) — 6 видов.</li><li>Списки задач с группировками и иерархией.</li><li>Автоматические отчеты (ежедневные/еженедельные сводки).</li><li>Умные напоминания (Telegram-бот, email).</li><li>Глубокая аналитика (время выполнения задач, загрузка команды).</li><li>Потоковая автоматизация процессов</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/60e0eb0a-c1b1-473b-b343-1c4fb1b3fbd6.png" alt="" /><figcaption>Упрощенная схема сущностей системы</figcaption></figure><p>METEOR — мощный инструмент для автоматизации процессов, с триггерами, серверными функциями и ИИ-аналитикой. Он позволяет гибко настраивать сложные операции.</p><p>Все данные анализируются, и внутри самого сервиса можно понять, как работает команда: кто загружен, сколько времени уходит на задачи, где стопперы в процессе.</p><p>Разработчики используют METEOR для линковки задач с pull-requests и контроля бэклога. Менеджеры получают отчеты автоматически и не тратят часы, чтобы собрать всю информацию вручную. QA ведут тест-кейсы и баги в удобных досках, а DevOps отслеживают инциденты и шаги деплоя. Даже HR подключаются — через систему проходят кандидаты и стажеры.</p><h3>Переезд на сервис</h3><p>После внедрения METEOR команды замечают, что продуктивность их работы сильно повышается:</p><ul><li>скорость выполнения задач увеличивается в среднем на 25% — благодаря автоматическим напоминаниям и чётким процессам;</li><li>количество потерянных задач снижается на 70% — исчезают хаотичные чаты и забытые письма;</li><li>на составление отчетов и сбор метрик уходит не 5 часов, а всего 30 минут в неделю;</li><li>а экономия времени — около 75 часов в месяц на команду из 10 человек.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/f3f086f0-5846-4a35-adba-dc4fbe17f1c0.png" alt="" /><figcaption>Карточка задачи</figcaption></figure><p>METEOR не просто помогает контролировать задачи — он становится частью операционного «ядра» команды, избавляя от хаоса, ускоряя работу и делая все немного спокойнее.</p><h2>3. Gitlife</h2><p><a href="https://gitlife.ru">GitLife</a> — это универсальная платформа для хостинга репозиториев и построения полного DevOps-процесса внутри компании. Разработана с прицелом на закрытые контуры, импортозамещение и гибкость — подходит как для современных Git-проектов, так и для инфраструктур, где все еще используется SVN.</p><p>Помимо самого Gitlife, разработчики делают Gitlife AI, в котором есть доступ к топовым ИИ-моделям и инструментам, чтобы разрабатывать ИИ-решения.</p><h3>Что под капотом</h3><p>Внутри Gitlife собраны модули для:</p><ul><li>Кода — репозитории, ветвление.</li><li>Задач — бэклоги, спринты, дашборды.</li><li>Документации — совместное редактирование документов, управление правами.</li><li>Аналитики — карты потока ценности, качество кода, метрики по инженерам.</li><li>Пайплайны — модуль «Конвейер» управляет сборками и CI/CD.</li></ul><p>Gitlife используется ИТ-отделами и R&amp;D-подразделениями в компаниях с высокими требованиями к информационной безопасности. Подходит как для небольших команд, так и для распределённых корпораций с десятками проектов.</p><p>Что решает:</p><ul><li>Безопасный и полностью локальный хостинг исходного кода (Git + SVN)</li><li>Управление задачами и CI/CD в одном месте</li><li>Централизованный доступ, права, аудиты и история изменений</li><li>Полная поддержка DevOps-процессов на российском ПО</li><li>Альтернатива GitHub, GitLab и Bitbucket в условиях ограниченного доступа и санкционных рисков</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/bb3f815f-ce07-4c9d-9243-7ace4b14d5ba.png" alt="" /><figcaption>Создание пайплайна</figcaption></figure><h3>Переезд на сервис</h3><p>Инструмент подходит практически всем командам — от инди-разработчиков до крупных проектов с множеством ролей. Например, гейм-девелопер может разрабатывать персональный проект и хранить код бесплатно, стартап — разрабатывать MVP, а крупный бизнес — управлять большими командами и проектами максимально безопасно.</p><h2>4. Cerebro</h2><p><a href="https://cerebrohq.com/ru/">Cerebro</a> — профессиональная система для совместной работы и управления проектами. Она помогает ставить задачи, планировать этапы, следить за выполнением, обмениваться файлами и комментировать их прямо в системе. Особенно полезна для команд, которые делают VFX, 3D, анимацию или дизайн — но при этом легко адаптируется и под другие команды.</p><p>Платформа охватывает полный цикл — от первых идей и планирования до комментирования финальных шотов (отдельных сцен или кадров в видео/анимации) и соблюдения дедлайнов. Такой подход помогает команде ускорить работу на 20%, сократить время на правки и держать весь процесс под контролем — от начала до сдачи проекта.</p><p>Cerebro подходит для команд от 1 до 1000+ человек с задачами на проекте от 1 до 10000+. Сервис работает с 2009 года, сейчас им пользуются более 400 команд в России и СНГ.</p><h3>Что под капотом</h3><p>Cerebro поддерживает десктоп (Windows, Mac и Linux), веб-версию и мобильное приложение, локальное, облачное и гибридное развертывание. Инструмент построен на клиент-серверной архитектуре — она гибкая, поэтому можно настраивать конфиги исходя из потребностей бизнеса.</p><p>Из технологий:</p><ul><li><b>Backend:</b> C, C++, Python, SQL</li><li><b>Frontend:</b> JS, TypeScript, ReactJS, Qt, PyQt</li><li><b>Мобильные клиенты:</b> React Native</li><li><b>БД: </b>PostgreSQL с проприетарными расширениями + SQLite</li><li><b>Файловое хранилище:</b> Cargador</li><li><b>Плагины: </b>Tentaculo (встраивается в производственные программы)</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/d51c709f-2b9c-4e0b-95c0-2b78d61f5c1e.png" alt="" /></figure><p>Cerebro покрывает весь пайплайн — от идеи до финала. Вот основные возможности сервиса:</p><ul><li>Множественные уровни вложенности задач — подходит для сложных иерархий продакшена</li><li>Планирование с помощью диаграммы Ганта и специального инструмента «План»</li><li>Канбан-доска для визуального контроля задач</li><li>Инструмент «Моё пространство» — для персонализированной фильтрации и отбора задач</li><li>Уровни доступа и ролевое управление</li><li>Расширенная статистика по проектам, командам, сотрудникам</li><li>Совместная работа над большими файлами (видео, изображения, 3D) — Mirada позволяет комментировать, делать подрисовки, оставлять голосовые заметки</li><li>Интеграция с пакетами Adobe, Autodesk и мессенджерами, возможность встраивать в любые пайплайны</li><li>Удобное подключение фрилансеров</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/5411ad9d-a74b-46ed-9774-61d60ff69885.png" alt="" /><figcaption>Навигатор и форум</figcaption></figure><h3>Переезд на сервис</h3><p>Обычно внедрение начинается еще на этапе препродакшена — во время разработки концепции и четкого плана действий. Затем система сопровождает проект на всех стадиях, вплоть до постпродакшена (финального тестирования и релиза), где она закрывает 80-100% задач. Cerebro позволяет собирать всё в одном месте: задачи, правки, сроки, бюджеты, загрузку сотрудников и статус проекта в целом.</p><p>После переезда снимается много рутинных задач: больше не нужно вручную назначать исполнителей, комментировать медиаконтент, передавать файлы между программами и так далее. В среднем проекты выполняются на 20% быстрее, без потери качества. В больших студиях объем выпускаемых шотов может вырасти до 20+ тысяч — это уже работает у других клиентов, среди которых СберМаркетинг, Sinners, Black Point и другие. Cerebro также помогает переехать с других такс-трекеров и систем для управления проектами.</p><h2>5. Replit Teams</h2><p><a href="https://replit.com/teams">Replit Teams</a> — это платформа для совместной разработки в реальном времени. По сути, это интегрированная IDE + git-репозиторий + система управления задачами — и все доступно через браузер. Подходит как для командной работы в стартапах, так и для образовательных проектов, хакатонов и небольших продуктовых команд.</p><p>А главная фишка — встроенный ИИ, к которому можно обращаться прямо во время написания кода. Инструмент разработан с акцентом на простоту входа, командную работу и быстрое прототипирование. Поддерживает более 50 языков программирования и позволяет запускать полноценные веб-приложения в облаке.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/70b00e25-9ec7-4858-911c-b2d7a181104e.png" alt="" /></figure><h3>Что под капотом</h3><p>Внутри Replit Teams есть интерфейсы для:</p><ul><li>Кода — редактор с автокомплитом, подсветкой синтаксиса, терминалом и интеграцией с Git.</li><li>Задач — встроенный таск-менеджер с распределением задач по участникам.</li><li>Общения — встроенные комментарии в коде, возможность ревью и обсуждений.</li><li>CI/DevOps — запуск и отладка приложений без настройки окружения.</li><li>Доступа — гибкие роли, приглашения по ссылке, настройки приватности.</li></ul><h3>Переезд на сервис</h3><p>Replit Teams позволяет моментально начать работу: не нужно ставить зависимости, конфигурировать CI или закупать сервера. Подходит как для быстрой прокачки навыков, так и для реальных командных проектов в продакшене.</p><p>Сейчас инструмент активно используют в стартапах — для быстрого MVP, парного программирования, хакатонов и удаленных командах — как замена локальным IDE и конфигурациям.</p><p>Рассказывайте в комментариях, какими сервисами пользуетесь вы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мы строим агрегатор финансовых продуктов в Казахстане: история Finance.kz</title>
      <link>https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz</link>
      <comments>https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Жандос Байдильденов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz</guid>
      <description><![CDATA[<p>Как из обычного сайта-витрины вырастить финтех-продукт? Расскажу, как строится агрегатор финансовых продуктов в Казахстане.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-my-stroim-agregator-finansovyh-produktov-v-kazahstane--istoriya-finance-kz">Как мы строим агрегатор финансовых продуктов в Казахстане: история Finance.kz</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 22 Jun 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я — Жандос, руководитель проекта <a href="https://finance.kz">Finance.kz</a>. Последний год активно развиваем агрегатор финансовых продуктов в Казахстане, и за это время рынок изменился кардинально. Хочу поделиться опытом создания финтех-решения с нуля и рассказать, как мы конкурируем с зарубежными игроками за счёт глубокой локализации.</p><h2>Откуда началось: мой путь в финтех</h2><p>До Finance.kz я работал в казахстанских финтех-проектах — bai.kz и finbee.kz. Там понял, что рынок агрегаторов в Казахстане находится в зачаточном состоянии. Пользователи мучились, сравнивая предложения банков вручную, а сами финансовые организации не умели эффективно работать с цифровыми каналами привлечения клиентов.</p><p>Finance.kz существовал уже более 3 лет, но работал как классический сайт-витрина. Когда я пришёл в проект год назад, стало ясно: нужно полностью переосмыслить подход и создать технологическое решение нового поколения.</p><h2>Состояние рынка: от монополии к жёсткой конкуренции</h2><p>Казахстанский рынок агрегаторов финансовых продуктов переживает бум. Ещё два года назад здесь было 2-3 локальных игрока с простейшим функционалом. Сегодня ситуация кардинально изменилась — зашли зарубежные команды: vbr.kz, fintree.kz, moneypanda.com и другие.</p><p>Эти компании привозят готовые решения, которые хорошо работали в России или других рынках. На первый взгляд их продукты выглядят более зрелыми — красивые интерфейсы, отработанные воронки конверсии. Но у импортных решений есть критический недостаток: они плохо адаптированы под специфику казахстанского рынка.</p><h2>Технологические вызовы: интеграция с госсервисами и банками</h2><p>Главная боль при разработке агрегатора в Казахстане — это интеграции. В отличие от рынков СНГ, здесь нельзя обойтись простым партнёрским трафиком. Пользователи хотят получить продукт онлайн, полностью, без походов в офисы.</p><h3>API-интеграции с банками и МФО</h3><p>За год мы реализовали прямые API-интеграции с крупнейшими игроками рынка. Это означает, что пользователь может не просто сравнить условия кредитов, но и подать заявку, пройти скоринг и получить одобрение, не покидая наш сайт.</p><p>Техническая сложность — в разнородности API. Каждый банк использует собственные протоколы, форматы данных и методы аутентификации. Пришлось создать унифицированный слой-адаптер, который «переводит» наши запросы в формат, понятный конкретной финансовой организации.</p><h3>Интеграция с госорганами</h3><p>Finance.kz интегрируется с государственными сервисами eGov и Палаты предпринимателей (ПКБ). Это позволяет автоматически подтягивать справки о доходах, данные о трудоустройстве и другие документы, необходимые для получения кредита.</p><p>Работа с госAPI — отдельная история. Протоколы меняются, документация часто устаревает, а техподдержка работает в режиме «как получится». Но результат того стоит: время оформления кредита сокращается с нескольких дней до 15-30 минут.</p><h2>Архитектура продукта: ставка на микросервисы</h2><p>При проектировании архитектуры Finance.kz мы отказались от монолитного подхода в пользу микросервисов. Это решение диктовалось спецификой агрегатора — нам нужно было обеспечить высокую доступность при интеграции с десятками внешних систем.</p><h3>Backend</h3><p>Основные сервисы написаны на Node.js с использованием Express.js. Для работы с базами данных используем PostgreSQL для транзакционных данных и Redis для кэширования. Очереди сообщений реализованы через RabbitMQ — это критично для обработки заявок пользователей.</p><p>Отдельно выделили сервис интеграций, который отвечает за взаимодействие с внешними API. Он построен по принципу circuit breaker — если один из банков не отвечает, это не ломает работу всего агрегатора.</p><h3>Frontend</h3><p>Фронтенд построен на React с использованием Next.js для серверной отрисовки. Это важно для SEO — львиная доля трафика приходит из поисковых систем по запросам типа «кредит онлайн».</p><h2>Стратегия «единого окна»: от поиска до получения</h2><p>Наша главная идея — превратить агрегатор из витрины в полноценный финтех-сервис. Пользователь должен получить продукт полностью онлайн: от сравнения условий до перечисления денег на карту.</p><p>Для этого мы реализовали несколько ключевых функций:</p><ul><li>Умный подбор продуктов на основе данных пользователя и машинного обучения</li><li>Предварительный скоринг для оценки вероятности одобрения ещё до подачи заявки</li><li>Автоматическое заполнение анкет с подтягиванием данных из госсервисов</li><li>Отслеживание статуса заявки в реальном времени</li></ul><h2>Монетизация: CPS как основа устойчивого бизнеса</h2><p>Мы работаем по модели CPS (Cost Per Sale) — получаем комиссию только за успешно выданные продукты. Для кредитов это 2% от суммы, для микрозаймов — фиксированная сумма от 7 до 15 тысяч тенге.</p><p>Такая модель выгодна всем участникам: банки платят только за результат, пользователи получают продукт бесплатно, а мы мотивированы повышать качество трафика и конверсию.</p><h2>Конкурентные преимущества: локализация против красивых интерфейсов</h2><p>Главное отличие Finance.kz от зарубежных конкурентов — интеграция в казахстанскую финтех-экосистему. Пока они тратят месяцы на адаптацию готовых решений, мы изначально строили продукт под местную специфику.</p><h3>Что даёт локальный подход:</h3><ul><li>Знание рынка: мы понимаем особенности работы казахстанских банков и МФО</li><li>Связи с регуляторами: легче договариваться об интеграциях с госорганами</li><li>Техническая экспертиза: наша команда уже прошла путь интеграции с местными API</li><li>Гибкая настройка продукта под изменения законодательства и требований ЦБ</li></ul><h3>Результаты и метрики</h3><p>За год активного развития мы достигли:</p><ul><li>150 000 уникальных пользователей в месяц</li><li>Интеграция с 15+ финансовыми организациями</li><li>Конверсия заявка-выдача на уровне 35-40% (против 15-20% у конкурентов)</li><li>Средний чек по кредитам — 1,2 млн тенге, по микрозаймам — 85 тысяч</li></ul><h2>Планы на будущее: от агрегатора к экосистеме</h2><p>Ближайшие 1-2 года будут критичными для всего рынка. Мы видим несколько ключевых направлений развития:</p><h3>Расширение продуктовой линейки</h3><p>Планируем добавить страхование, депозиты и инвестиционные продукты. Цель — стать единой точкой входа для всех финансовых потребностей пользователя.</p><h3>Внедрение ИИ и машинного обучения</h3><p>Работаем над персонализацией предложений и предиктивной аналитикой. Хотим научиться предлагать продукты до того, как пользователь их осознанно найдет.</p><h3>Международная экспансия</h3><p>Рассматриваем возможность выхода на рынки Узбекистана и Кыргызстана. Наша технологическая платформа легко масштабируется на соседние рынки.</p><h3>Собственные финансовые продукты</h3><p>В долгосрочной перспективе планируем получить лицензию МФО и предлагать собственные займы наиболее качественным клиентам.</p><h2>Уроки и выводы</h2><p>Главный урок последнего года: в финтехе побеждает не тот, у кого красивее интерфейс, а тот, кто лучше решает реальные проблемы пользователей. Красивый дизайн можно скопировать за месяц, а на создание качественной технологической интеграции уходят годы.</p><p>Второй важный момент — команда решает всё. Мы собрали людей, которые понимают как технологии, так и специфику финансового рынка. Это даёт нам фору перед конкурентами, которые пытаются адаптировать готовые решения силами удалённых команд.</p><p>Рынок агрегаторов в Казахстане только формируется, и впереди ещё много интересных вызовов. Уверен, что следующие два года покажут, кто готов строить долгосрочный бизнес, а кто просто пытается заработать на хайпе.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сделать код-ревью, чтобы тебя не возненавидели?</title>
      <link>https://tproger.ru/articles/kak-sdelat-kod-revyu--chtoby-tebya-ne-voznenavideli-</link>
      <comments>https://tproger.ru/articles/kak-sdelat-kod-revyu--chtoby-tebya-ne-voznenavideli-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-sdelat-kod-revyu--chtoby-tebya-ne-voznenavideli-</guid>
      <description><![CDATA[<p>Как делать код-ревью без токсичности: что говорить, как формулировать замечания и не разрушать отношения в команде. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-sdelat-kod-revyu--chtoby-tebya-ne-voznenavideli-">Как сделать код-ревью, чтобы тебя не возненавидели?</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[React]]></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>Mon, 16 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>«Почему ты так написал?» — если ваш комментарий в код-ревью начинается с таких слов, будьте готовы к тому, что коллеги разочаруются. Жёсткая критика без контекста, замечания о стиле вместо архитектуры и тон преподавателя, а не ментора, превращают ревью в стресс. Но можно иначе: находить реальные баги, а не придираться к неймингу; объяснять, а не указывать; замечать хорошие решения. Рассказываем, как делать код-ревью так, чтобы ваш фидбек ждали, а не проклинали.</p><h2>Почему код-ревью — не про власть, а про заботу</h2><p>Код-ревью — процесс, который помогает проекту и команде расти. И подходить к нему стоит не с позиции «сейчас найду ошибку», а с установки «сделать вместе с разработчиком лучше». На зачем он вообще нужен?</p><ul><li>чтобы заметить ошибки до продакшена, а не после;</li><li>чтобы синхронизировать стиль и подходы в команде;</li><li>чтобы разработчик не оставался наедине с кодом и сомнениями.</li></ul><p>Хорошее ревью по сути — это дополнительная пара глаз. Но часто оно воспринимается как экзамен, особенно у джунов. Почему? Комментарии звучат категорично, без объяснений, а ревью превращается в поиск опечаток, а не обсуждение архитектуры. В итоге весь процесс теряет смысл: вместо совместной работы над улучшением кода получается конфликт интересов. В таком случае оптику нужно менять.</p><h3>Что на самом деле проверяется</h3><p>В код-ревью обычно проверяется:</p><ul><li>Понятность и читаемость — сможет ли через месяц любой член команды понять, что происходит.</li><li>Надёжность — не развалится ли всё, если пойти по нестандартному сценарию.</li><li>Согласованность — насколько код вписывается в архитектуру и договорённости команды.</li><li>Перспектива — насколько удобно будет этот код поддерживать, масштабировать или переписывать через год.</li></ul><p>Задача здесь — дать взгляд со стороны, нащупать правильные вопросы, увидеть то, что автор кода мог не заметить. Но как это сделать правильно?</p><h2>Чек-лист для ревьюера: что смотреть в коде, чтобы все прошло гладко</h2><p>Хороший ревьюер не выискивает опечатки, а помогает сделать код лучше. Рассмотрим, что необходимо проверять.</p><h3>Логика: всё ли понятно и предсказуемо?</h3><p>Проверка логики — про то, чтобы прочитать код и сразу понять, зачем он написан именно так. Без нужды лезть в историю коммитов или в личные сообщения к программисту. Вот на что стоит обратить внимание:</p><h4>Код решает задачу или обходит её?</h4><p>Иногда разработчик может использовать запутанные конструкции, прибегать к костылям и лишним условиям. Здесь стоит спрашивать самого себя:</p><ul><li>«А зачем тут это условие?»</li><li>«Можно ли решить задачу проще?»</li><li>«Это бизнес-логика или побочный эффект бага?»</li></ul><h4>Всё ли предсказуемо?</h4><p>Хорошая логика — это ожидаемое поведение. Когда видишь функцию getUserRoles, и она действительно возвращает роли пользователя, а не делает лишний лог (или хуже, мутирует глобальное состояние).</p><p>Нужно проверить:</p><ul><li>Есть ли неожиданные побочные эффекты?</li><li>Не делает ли функция всё подряд?</li><li>Можно ли использовать этот код повторно?</li></ul><h4>Учитываются ли граничные случаи?</h4><p>Тестировать happy path — это приятно. Но ревью — момент, когда нужно быть немного параноиком и задавать себе вопросы:</p><ul><li>«А что, если в массиве будет null?»</li><li>«Что вернётся, если база пустая?»</li><li>«Что произойдёт, если API не ответит?»</li></ul><p>Если логика ломается при первой же нестандартной ситуации — это нерабочая логика.</p><h4>Видна ли связь между частями?</h4><p>Чем сложнее фича, тем важнее понимать, как всё взаимодействует. Хороший код складывается в историю: ты читаешь файл, и у тебя в голове выстраивается картинка. Если же приходится постоянно прыгать между файлами и держать всё в голове — это тревожный сигнал.</p><h3>Архитектура: насколько код ложится в общую картину?</h3><p>Ревью — про то, как новая часть кода вписывается в уже существующую систему. Даже идеально написанное решение может быть неуместно, если оно идёт вразрез с архитектурой проекта. На что обращать внимание:</p><h4>Живёт ли код в вакууме</h4><p>Каждый новый модуль, компонент или класс должен:</p><ul><li>быть в нужном слое архитектуры (не пишем, например, SQL-запросы в React-компоненте),</li><li>располагаться там, где его логически ожидаешь (не прячем бизнес-логику в утилитах),</li><li>использовать существующие механизмы, а не дублировать их.</li></ul><h4>Следует ли код соглашениям команды</h4><p>Хорошая архитектура держится на дисциплине. Если вы договорились, что у каждого эндпоинта есть слой сервисов — не нужно вызывать репозиторий напрямую из контроллера. Иначе проект превращается в сборную солянку: один разработчик пишет по паттернам, другой — по наитию.</p><p>Нужно проверить:</p><ul><li>используются ли принятые в команде подходы;</li><li>поддерживаются ли слои;</li><li>повторяет ли структура проекта предыдущие решения.</li></ul><h3>Безопасность: нет ли уязвимосей?</h3><p>Код должен не только работать корректно, но и быть защищённым. Даже в небольших задачах могут скрываться уязвимости — особенно там, где данные приходят извне или есть доступ к чувствительной информации. На что обращать внимание:</p><h4>Пользовательский ввод</h4><p>Всё, что приходит от пользователя (формы, параметры URL, тело запроса), требует внимания. Здесь могут возникнуть SQL-инъекции, XSS и т.д. Поэтому стоит проверить:</p><ul><li>Есть ли валидация данных на стороне сервера?</li><li>Используются ли подготовленные запросы или ORM?</li><li>Обрабатываются ли потенциально опасные символы?</li><li>Предусмотрена ли защита от исполнения произвольного кода?</li></ul><h4>Доступ к данным и авторизация</h4><p>Если код взаимодействует с базой, файлами или персональными данными, важно удостовериться, что доступ предоставляется только тем, кому он положен. Проверяем:</p><ul><li>Есть ли проверка прав пользователя перед выполнением запроса?</li><li>Реализована ли проверка не только на фронте, но и на сервере?</li><li>Используются ли идентификаторы, которые нельзя легко перебрать?</li></ul><h3>Тесты: можно ли быть уверенным, что всё работает?</h3><p>Хороший тест — реальная гарантия, что при следующем изменении код не сломается. Здесь важно понять, действительно ли тесты покрывают важные сценарии и защищают от регрессий:</p><h4>Есть ли вообще тесты?</h4><p>Начнём с очевидного. Прежде чем обсуждать качество, стоит выяснить: тесты вообще написаны? Если в задаче меняется логика или добавляется новая функциональность — это почти всегда повод что-то протестировать.</p><p>Проверяем:</p><ul><li>Есть ли новые юнит- или интеграционные тесты?</li><li>Актуальны ли существующие — не остались ли висящими после изменений?</li><li>Упали ли какие-нибудь тесты в CI — и если да, то почему?</li></ul><h4>Тестируется ли то, что нужно?</h4><p>Иногда тесты есть, но проверяют слишком очевидное или не покрывают рисковые места. На что обратить внимание:</p><ul><li>Проверяются ли граничные случаи (например, пустой ввод, null, некорректные данные)?</li><li>Есть ли тесты на негативные сценарии — когда функция должна вернуть ошибку?</li><li>Покрыта ли новая логика?</li></ul><h4>Понятны ли сами тесты?</h4><p>Тесты тоже часть кода, и их читают люди. Если логика проверок неочевидна, тесты будут мешать. При ревью задаем вопросы:</p><ul><li>Говорят ли названия тестов, что именно они проверяют?</li><li>Можно ли по коду теста быстро понять, зачем он нужен?</li><li>Нет ли странных чисел или непонятных моков?</li></ul><p>Так, хороший код-ревьюер фокусируется на смысловых точках риска. Но как указывать на эти точки? Рассмотрим стратегии взаимодейтсвия с разработчиком во время код-ревью (чтобы последний не возненавидел любую возможность писать код и самого ревьюера).</p><h2>Как давать комментарии и не звучать резко</h2><p>Хорошее ревью — это про диалог, в котором оба участника заинтересованы в улучшении кода. Чтобы комментарии воспринимались конструктивно, а не как придирки, важно держать тон и структуру. Разберем четыре простых ориентира.</p><h3>Начните с положительного: что в этом коде уже хорошо</h3><p>Хорошее ревью начинается с признания сильных сторон. Это легальный способ показать, что вы оцениваете работу комплексно. Когда автор видит, что вы заметили не только недочеты, но и удачные решения, он/она с большей вероятностью воспримет все конструктивно.</p><p>К тому же, положительные комментарии помогают закрепить результат: человек будет знать, что именно сработало — и использовать это снова.</p><p>Что можно хвалить:</p><ul><li>чистую и понятную структуру;</li><li>удачные названия переменных или функций;</li><li>хорошую обработку исключений или пограничных случаев;</li><li>то, что код хорошо ложится в текущую архитектуру.</li></ul><p>Примеры фраз:</p><ul><li>«Здорово, что ты вынес логику в отдельный хелпер — теперь это читается в разы легче».</li><li>«Классная идея использовать (вставьте код),а не (вставьте код)— так гораздо понятнее».</li><li>«Круто, что добавил тест на этот кейс — про него часто забывают».</li></ul><h3>Замечания: только по делу и с предложением, как исправить</h3><p>Чтобы код-ревью было конструктивным, нужно не просто указывать на проблему, а помогать найти решение. Комментарии без объяснения или контекста могут звучать как придирки, особенно если ревью получает менее опытный разработчик. А вот если вы объясняете, почему что-то не так, и что можно сделать по-другому — это уже наставничество, а не критика.</p><p>Так НЕ надо:</p><ul><li>«Плохо читается».</li><li>«Переделай»</li><li>«Зачем???»</li></ul><p>Так лучше:</p><ul><li>«Можно упростить, если разделить условие на два блока — сейчас выглядит довольно сложно».</li><li>«Тут, кажется, можно обойтись без цикла: достаточно метода (вставьте метод)— он короче и лучше читается»..</li><li>«В этом месте можно потенциально получить undefined. Может, стоит добавить проверку?»</li></ul><h3>Говорите прямо, без намёков и иронии</h3><p>Код-ревью — не место для недосказанностей и полутонов. Комментарии вроде «Ну, если так РЕАЛЬНО работает — ок» звучат пассивно-агрессивно и только создают напряжение. Получивший такое замечание будет гадать: это одобрение, сарказм или тонкий намёк, что я всё сделал не так?</p><p>Вместо этого — формулируйте замечания ясно и по существу:</p><ul><li>«В этом месте поведение функции может быть неочевидным — можешь уточнить название или добавить комментарий?»</li><li>«Пока непонятно, почему именно такое условие — можешь пояснить, пожалуйста?»</li><li>«Похоже, тут можно упростить: если заменить на (вставьте код) логика станет короче».</li></ul><p>Если вы не уверены, как ваша реплика будет воспринята — переформулируйте. В ревью лучше не пошутить, чем задеть человека, особенно если вы не на 100% уверены в уровне вашей взаимной иронии.</p><h3>Делайте фокус на код, а не на человека</h3><p>Хорошее ревью — это не про то, чтобы указать, что человек сделал плохо, скорее про то, что в этом месте можно улучшить. Разница тонкая, но критически важная. Комментарии не должны звучать как обвинения, даже если баг очевидный.</p><p>Так НЕ надо:</p><ul><li>«Ты опять забыл обработать ошибку».</li><li>«Почему ты так сделал?!»</li><li>«Это неправильно».</li></ul><p>Лучше так:</p><ul><li>«Похоже, здесь не хватает обработки ошибки — может быть сбой».</li><li>«Можешь, пожалуйста, уточнить логику? Кажется, тут может возникнуть исключение».</li><li>«Вот так решение будет стабильнее: предлагаю…»</li></ul><p>Когда мы говорим о коде, а не о человеке, снижается напряжение. Человек не чувствует, что его «проверяют», он чувствует, что с ним вместе улучшают результат.</p><h2>Как сделать код-ревью полезным и для себя</h2><p>Код-ревью часто воспринимается как обязанность: проверил pull request, поставил галочку, пошел дальше. Но на самом деле это отличная возможность прокачиваться не только тому, чью работу вы смотрите, но и вам самим. Даже если задача кажется простой, внимательно просмотрев чужой код, можно узнать что-то новое и лучше понять архитектуру проекта. Рассмотрим, как превратить свой ревьюерский труд в пользу.</p><h3>Учитесь новому: чужой код — тоже учебник</h3><p>Читая чужие решения, можно заметить многое: библиотеку или инструмент, который вы раньше не использовали; необычную структуру функции или способ организации логики; паттерн, который вы обычно не применяете, но он к месту и т.д. Это особенно полезно, если вы работаете в мультистековой команде. Кто-то пишет на Python, вы — на C++, но идеи и архитектурные подходы легко переносятся между языками. Подмечайте, как другие подходят к задачам, даже если в целом всё вам понятно — детали часто дают самые интересные инсайты.</p><p>Заведите привычку задаваться вопросом: «Что здесь сделано хорошо и почему я сам так не пишу?». Или наоборот — «Почему мне этот кусок кажется странным и как бы я сделал иначе?». Такие наблюдения дают гораздо больше, чем кажется на первый взгляд.</p><h3>Задавайте вопросы, даже если всё понятно</h3><p>Иногда вы смотрите код — и вроде всё чисто, логично. Но это как раз повод не просто молча одобрить, а пообщаться с проггером. Почему? Потому что вопросы — не всегда сигнал о проблеме: иногда это инструмент обучения.</p><p>Например:</p><ul><li>«А почему решили использовать именно этот метод?»</li><li>«Это кастомное решение или такой подход у нас принят в проекте?»</li><li>«Я раньше делал по-другому — есть ли причины, почему здесь выбрали такой путь?»</li></ul><p>Такие вопросы помогают вам лучше понять чужой ход мыслей; показывают автору, что вы включены в процесс, а не просто пробежались глазами; создают пространство для обсуждения и обмена опытом.</p><p>Важно: вопросы должны звучать как приглашение к диалогу, а не как скрытая критика. Если вы спрашиваете «Зачем это вообще нужно?», лучше замените на «Помоги разобраться, почему выбрали такой подход — интересно сравнить с тем, как делал раньше».</p><h3>Прокачивайте навык объяснять</h3><p>Хороший разработчик умеет не только писать код, но и объяснять, почему он написал именно так. Код-ревью — отличная тренировка этого навыка.</p><p>Когда вы оставляете комментарий — попробуйте объяснить, в чём именно суть проблемы и почему стоит внести изменения. Это заставит вас сформулировать мысль чётко, логично и по делу — а это критически важный навык для тимлида, ментора и любого разработчика, который находится в команде.</p><p>Например, вместо «Это плохой способ», напишите: «Такой подход может усложнить отладку, потому что данные не логируются. Предлагаю использовать вот такой паттерн (укажите паттерн), он делает поведение функции более прозрачным».</p><p>Почему это работает:</p><ul><li>вы тренируете навык аргументации — полезно и в коммуникации, и на технических собеседованиях;</li><li>автор кода быстрее понимает, что именно стоит изменить, и почему;</li><li>вы сами начинаете глубже понимать, почему какой-то код не совсем правильно написан.</li></ul><p>И ещё один плюс: если ваш комментарий требует объяснения — это повод задуматься, действительно ли замечание по делу. Иногда, пока формулируешь аргументы, понимаешь, что лучше промолчать. И это тоже рост.</p><p>Код-ревью — не ритуал и не повод самоутверждаться. Это способ сделать код лучше, команду сильнее, а продукт стабильнее. Хорошее ревью помогает не только найти баги, но и передать знания, улучшать архитектуру, учиться объяснять мысли и замечать собственные пробелы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Гайд: Как использовать ChatGPT, чтобы стать программистом</title>
      <link>https://tproger.ru/articles/kak-ispolzovat-chatgpt-dlya-obucheniya-programmirovaniyu</link>
      <comments>https://tproger.ru/articles/kak-ispolzovat-chatgpt-dlya-obucheniya-programmirovaniyu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ispolzovat-chatgpt-dlya-obucheniya-programmirovaniyu</guid>
      <description><![CDATA[<p>ChatGPT для обучения программированию. Показываем, как стать программистом, используя ChatGPT. Рассматриваем пошаговую инструкцию и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ispolzovat-chatgpt-dlya-obucheniya-programmirovaniyu">Гайд: Как использовать ChatGPT, чтобы стать программистом</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Промпты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как формулировать вопросы для максимальной пользы</h2><h3>Конкретика вместо общих фраз</h3><p>Чтобы эффективно использовать ChatGPT, важно понимать, как он обрабатывает запросы. Принцип работы ИИ чат-ботов напоминает усложнённую версию Т9. Если упрощать, то нейросеть обучают на текстовых данных, где она находит связи между словами.</p><p>Когда мы отправляем наш текст, ГПТ его считывает, сопоставляет со своей базой и связями, которые он выучил. Далее, отталкиваясь от структуры и последовательности слов в нашем запросе, ИИ определяет оптимальную последовательность символов, слов и фраз, которые с ним связаны. Так формируется ответ.</p><p>У ChatGPT и аналогичных моделей обычно большие базы данных. Та же ChatGPT 3 имела 175 млрд параметров. ИИ учитывает эти параметры при составлении ответа. Слова в нашем запросе помогают нейросети правильно ориентироваться в данных: чем конкретнее запрос, тем более релевантную информацию ИИ сможет вытащить из базы. Благодаря чёткому и структурированному запросу мы как бы сужаем фокус поиска и помогаем сформулировать подходящий ответ.</p><h3>Как написать промт</h3><p>Наиболее распространённый способ написать рабочий промт — придерживаться следующей структуры:</p><ul><li>Контекст.</li><li>Роль.</li><li>Цель и задача.</li><li>Дополнительные детали.</li></ul><p>Благодаря такому подходу мы можем «сузить фокус» нейросети и получить более предсказуемый результат. Кратко рассмотрим элементы структуры промпта на примерах:</p><p><b>Контекст</b></p><p>В контексте мы описываем нашу ситуацию. Что мы делаем, для чего, с какими трудностями сталкиваемся и так далее.</p><p>Например:</p><blockquote>Я начинающий веб-разработчик, изучаю Python и фреймворк Flask. Для практики и закрепления полученных знаний я хочу создать своё первое небольшое, но полноценное веб-приложение — «Менеджер задач» (To-Do List). Я хочу продумать его структуру и основной функционал, прежде чем приступать к написанию кода.</blockquote><p><b>Роль с опытом</b></p><p>Далее прописываем нейросети роль. Мы прямо указываем, с позиции какого эксперта или персонажа нейросеть должна нам отвечать. Это помогает адаптировать стиль, глубину и направленность ответа. Например, объяснение для новичка тоном «ментора» будет отличаться от технического анализа от «старшего разработчика». Поэтому важно указать правильную роль под нашу задачу.</p><p>Пример:</p><blockquote>Представь, что ты опытный Full-stack разработчик и ментор. У тебя за плечами более 10 лет создания веб-приложений на Python (включая Flask и Django), и ты успешно наставлял многих начинающих разработчиков в их первых проектах. Ты знаешь, с какими типичными трудностями они сталкиваются и как лучше спланировать проект для эффективного обучения.</blockquote><p>Роль необязательно должна быть одна, мы их можем комбинировать. При этом важно прописывать каждой роли конкретные характеристики. Это могут быть примеры проектов, сфера деятельности, навыки и так далее.</p><p><b>Цель и задачи</b></p><p>Теперь, когда у нас есть контекст и роль, нужно чётко обозначить, чего мы ждём от чата ГПТ, какая у нас цель и как должен выглядеть итоговый результат.</p><p>Пример:</p><blockquote>Цель — получить подробный план и рекомендации для создания веб-приложения «Менеджер задач» на Flask. Задачи:<br /><br />Основные функции и MVP: Предложи ключевой набор функций для MVP (минимально жизнеспособного продукта) такого приложения (например, создание, просмотр, отметка о выполнении задач).<br /><br />Структура проекта и технологии: Опиши рекомендуемую структуру папок для Flask-приложения и посоветуй основные технологии (например, какую БД использовать для начала, что взять для простого фронтенда).<br /><br />Потенциальные сложности: Укажи на наиболее вероятные проблемы, с которыми я, как новичок, могу столкнуться при разработке.</blockquote><p>В сложных запросах полезно разбивать задачи на дополнительные подзадачи. Так, у нас будет ещё больше контроля, и мы получим более предсказуемый результат.</p><p><b>Дополнительные детали</b></p><p>Это последний штрих, который поможет получить ответ, максимально соответствующий нашим ожиданиям. Сюда можно добавить любую специфическую информацию: примеры, антипримеры, рекомендации, прочие нюансы.</p><p>Пример:</p><blockquote>Перед тем, как давать полный ответ, пожалуйста, кратко перечисли шаги (подумай шаг за шагом), которые ты предпримешь, чтобы ответить на мой запрос. Отвечай по существу, избегая излишне пространных введений, но при этом давая достаточно деталей по каждому пункту моих задач. Если предлагаешь какие-то конкретные библиотеки или инструменты (кроме Flask), давай краткое пояснение, почему они подходят для новичка в этом проекте.</blockquote><p>Иногда нейросети могут выдавать плохой ответ, даже на хорошо структурированный и конкретный запрос. Если ИИ капризничает, то это нормально, надо просто поиграться с уточнениями и формулировкой промпта.</p><h2>Лучшие практики обучения с ChatGPT</h2><h3>Искать баланс между конкретикой, структурой и краткостью</h3><p>Эффективное обучение с Chat GPT часто зависит от баланса между конкретикой и объёмом. Наш промпт получился довольно большим, но вполне конкретным. Важная оговорка: такие большие и сложные запросы не всегда уместны для мелких задач. Если мы учим английский для работы в IT и нам нужно перевести слово, или если мы хотим запомнить синтаксис цикла for в Python, то писать такую простыню текста будет избыточно. ИИ прекрасно справится с задачей без этих заморочек. Мы можем написать промпт по такому же подходу, но поменьше:</p><p>Пример:</p><blockquote>Я учу язык Python, сейчас прохожу циклы. Представь, что ты ментор, который специализируется на Python. Объясни, как устроен цикл for, когда его уместно использовать? Отвечай кратко.</blockquote><p>Либо, можно вообще отойти от такой структуры:</p><blockquote>Объясни, как устроен цикл for в Python.</blockquote><p>Нужно искать баланс между детализацией запроса и его сложностью. Чем труднее задача, тем конкретнее будет промпт и наоборот.</p><h3>Использовать разные чаты для разных задач</h3><p>Ещё важный нюанс: у чат-ботов обычно есть память. Они запоминают ход диалога, и это тоже влияет на качество ответов. Поэтому иногда чат может засориться. Например, мы генерируем программу обучения Python, потом просим дать задачки по алгоритмам на C#, потом закидываем кучу документации по react. При формировании ответов ИИ всё это помнит и сбивается. Поэтому под разные задачи стоит использовать отдельные чаты.</p><p>Кстати, по этой же причине не надо каждый раз прописывать контекст и роль в рамках одного диалога. Достаточно сделать это один раз, нейросеть всё запомнит.</p><p>Например, если мы хотим продолжить обсуждать цикл for, то нам уже не надо заново прописывать контекст и роль:</p><blockquote>Придумай 5 упражнений с циклом for.</blockquote><h3>Постепенно усложнять свои вопросы и пробовать альтернативные подходы</h3><p>Допустим, мы при обучении пишем функцию и она выдаёт ошибку. Вместо того чтобы писать один огромный промпт, мы можем разбить задачу на шаги и начать с малого. Сперва попросим объяснить конкретные части кода, потом перейдем к общей логике и разберем всю функцию, попросим подробнее разобрать ошибку и так далее.</p><p>После того как мы разобрались с нашей проблемой в коде, поняли, как он работает, можно попросить ИИ предложить альтернативные подходы. Например, спросить, как можно написать код по-другому.</p><h3>Использовать мета-промты</h3><p>Нам необязательно составлять промт самостоятельно, мы можем сделать универсальный шаблон для генерации запросов и отдать его ИИ. Промпт, который написал ИИ, принято называть мета-промтпом. Вот пример шаблона для генерации, его можно сохранить себе и адаптировать под свои задачи:</p><blockquote>Я начинающий {Указать специализацию}. Мне регулярно приходится изучать что-то новое, планировать структуру проектов, писать код, работать с документацией. В работе я использую нейросети, но на написание структурированных запросов уходит много времени.<br /><br />Представь, что ты опытный промпт-инженер, который специализируется на IT-проптинге и образовательных проектах. Ты регулярно пишешь конкретные, подробные и хорошо структурированные запросы для генерации кода, создания структуры, объяснения сложных тем по программированию.<br /><br />Твоя цель — помочь мне составить продуманный промпт для {описание задачи}. Я должен получить максимально подходящий и контролируемый результат. <br /><br />Для этого: составь подробный, структурированный и конкретный запрос для нейросети по следующей логике:<br />Контекст — здесь описана моя ситуация.<br />Роль — надо прописать роль или несколько ролей, которые обладают достаточными навыками и знаниями для решения моей задачи.<br />Цель и задача — здесь мы описываем желаемый результат, задачу, подзадачи.<br />Дополнительные детали — уточняем нюансы, требования, даём примеры, антипримеры и другую полезную информацию, которая поможет получить отличный результат.<br /><br />В качестве примера можешь опираться на структуру и детализацию этого запроса:<br />«Я начинающий веб-разработчик, изучаю Python и фреймворк Flask. Для практики и закрепления полученных знаний я хочу создать своё первое небольшое, но полноценное веб-приложение — «Менеджер задач» (To-Do List). Я хочу продумать его структуру и основной функционал, прежде чем приступать к написанию кода.<br />Представь, что ты опытный Full-stack разработчик и ментор. У тебя за плечами более 10 лет опыта создания веб-приложений на Python (включая Flask и Django), и ты успешно наставлял многих начинающих разработчиков в их первых проектах. Ты знаешь, с какими типичными трудностями они сталкиваются и как лучше спланировать проект для эффективного обучения.<br />Цель — получить подробный план и рекомендации для создания веб-приложения «Менеджер задач» на Flask. Основные задачи:<br /><br />Основные функции и MVP: Предложи ключевой набор функций для MVP (минимально жизнеспособного продукта) такого приложения (например, создание, просмотр, отметка о выполнении задач).<br /><br />Структура проекта и технологии: Опиши рекомендуемую структуру папок для Flask-приложения и посоветуй основные технологии (например, какую БД использовать для начала, что взять для простого фронтенда).<br /><br />Потенциальные сложности: Укажи на наиболее вероятные проблемы, с которыми я, как новичок, могу столкнуться при разработке.<br />Перед тем как давать полный ответ, пожалуйста, кратко перечисли шаги (подумай шаг за шагом), которые ты предпримешь, чтобы ответить на мой запрос. Отвечай по существу, избегая излишне пространных введений, но при этом давая достаточно деталей по каждому пункту моих задач. Если предлагаешь какие-то конкретные библиотеки или инструменты (кроме Flask), давай краткое пояснение, почему они подходят для новичка в этом проекте.»<br />Не придумывай факты обо мне. Будь пытливым, задавай дополнительные вопросы, чтобы лучше прописать промпт. Дай знать, если тебе понятна твоя задача.</blockquote><p>Другой способ упростить себе жизнь — использовать Gpts. Это пользовательские боты, которые сделаны под определённые задачи. Например, есть боты, которые специализируются на составлении запросов:</p><ul><li>Prompt Perfect.</li><li>Super Prompter.</li><li>Prompt Wizard.</li></ul><p>А вот ещё несколько полезных GPTs для разработчиков:</p><ul><li>Code Copilot — бот для программирования.</li><li>Code Tutor — ИИ, который учит программированию.</li></ul><ul><li>Python GPT — бот для программирования на Python.</li></ul><h2>Как использовать память и модели  ChatGPT для обучения</h2><h3>Что такое память и зачем она нужна</h3><p>Некоторые нейросети, как Gemini, Grok, ChatGPT, позволяют настроить глобальную память, что может быть полезно при обучении. Мы просто вписываем важную информацию в специальные формы в настройках. При работе во всех чатах ИИ помнит про эту информацию и пытается генерировать более персонализированные ответы. Вспомним, как мы пишем контекст в запросах.</p><p>Память — это что-то наподобие контекста, просто универсального. Мы можем добавить информацию о нашем стеке, должности, месте работы, нише и так далее. Вот пример настроенной памяти в ChatGPT:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/5019be01-2544-4124-932c-1270264cd35e.png" alt="ChatGPT для обучения программированию" /><figcaption>Настройка памяти ChatGPT: ввод данных и предпочтений</figcaption></figure><p>Также у GPT есть более глобальная память — возможность попросить что-то запомнить или забыть прямо в чате. Мы можем рассказать, чем занимаемся, что планируем, какие форматы ответов любим. ИИ будет учитывать эту информацию при формировании ответов в других диалогах.</p><p>Благодаря памяти мы можем настроить GPT под свои задачи при обучении программированию. Например, попросить отвечать кратко, либо объяснять информацию не сразу, а через намёки и подсказки, чтобы мы лучше усваивали материал.</p><h3>Какие в ChatGPT есть модели, для каких задач они подходят</h3><p><b>Модельный ряд Open AI</b></p><p>В чате ГПТ много моделей. Здесь есть GPT-4o, 4o mini, 4.5, o3, o4-mini, o4 mini-high, o3-mini, o1 / o1-mini.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/0460b5b7-213f-4ef0-96a9-da6aab6b7cf3.png" alt="Как стать программистом с ChatGPT" /><figcaption>Варианты моделей в Chat GPT</figcaption></figure><p>Для обучения программированию будет достаточно базовой GPT-4o. Её можно использовать вместо поисковика или ментора, чтобы разобраться в сложных темах.</p><p><b>Какие модели подойдут для разработки</b></p><p>Для разработки лучше подойдёт Gpt o3 или 4.1. Они хорошо справляются с задачами по математике и программированию. Правда, доступны только при платной подписке. Как альтернатива — в бесплатной версии можно использовать o4 mini-high. Но это не лучшая модель на рынке.</p><p>Если не хотите платить, то, возможно, стоит присмотреться к конкурентам Open AI. Тот же Google раздаёт свою топовую модель Gemini 2.5 Pro бесплатно в <a href="https://aistudio.google.com/app/library">AI Studio</a>. Согласно бенчмарку <a href="https://lmarena.ai/">lmarena</a>, Gemini 2.5 Pro обходит нейросети от Open AI в задачах по программированию. Также в кодинге себя хорошо показывает Grok3 и Cloude 3.7 Sonnet. Не стоит забывать и про китайские модели, прежде всего, DeepSeek.</p><h2>Основные сценарии использования ChatGPT с примерами промптов</h2><p>Итак, мы разобрались, как правильно составлять промпты, когда они уместны, как настроить ChatGPT и какие модели использовать для тех или иных задач. Рассмотрим несколько сценариев изучения программирования, при помощи ИИ чат-ботов.</p><h3>Объяснение сложных тем «на простом языке»</h3><p>Мы можем использовать нейросеть вместо поисковика, учебника или наставника. В программировании много непонятных для новичков тем: рекурсии, ООП, функциональное программирование. В базе ботов есть в том числе учебные материалы. ИИ может их достать и объяснить простым языком, адаптируя информацию под наш уровень.</p><p><b>Пример: объясни, что такое рекурсия</b></p><blockquote>Я начинающий Python-разработчик, сейчас разбираю тему рекурсий. Не могу понять, чем они отличаются от циклов. Представь, что ты опытный ментор, который уже 5 лет обучает новичков программированию на Python. Объясни, что такое рекурсия, чем она отличается от цикла и когда её лучше всего использовать. Ответ должен быть не сильно большим, используй примеры кода.</blockquote><p>Вот такой ответ от нейросети получим:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/4081b4f5-444b-4f99-9d00-952787b53770.png" alt="ChatGPT для обучения программированию" /><figcaption>Объяснение рекурсий от Chat GPT</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/6b6f0b5e-13e0-461b-ba10-ca8e26fcb47b.png" alt="Как стать программистом с ChatGPT" /><figcaption>Объяснение рекурсий от Chat GPT</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/e49075a3-7b33-419d-90e1-fca6bf2ce13f.png" alt="ChatGPT для обучения программированию" /><figcaption>Объяснение рекурсий от Chat GPT</figcaption></figure><h3>Помощь в написании и отладке кода</h3><p><b>Пример: помоги написать функцию сортировки</b></p><p>Допустим, мы учим питон и хотим попрактиковаться на простых задачах. Формулируем промпт так:</p><blockquote>Я учусь программировать на Python, недавно начал разбирать функции. Хочу попрактиковаться и написать функцию, которая сортирует список строк по длине (от самой короткой к самой длинной).<br /><br />Представь, что ты опытный Python-разработчик и ментор. У тебя за плечами более 10 лет опыта, ты обучаешь новичков и понимаешь, какие объяснения для них работают лучше всего.<br /><br />Моя цель — понять, как работает функция сортировки в Python. Покажи пример такой функции, объясни по шагам каждую строку.</blockquote><p>Результат:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/a1b22d5e-40e5-46a9-bb84-829887ef0561.png" alt="Как стать программистом с ChatGPT" /><figcaption>Функция сортировки на Python: ответ ChatGPT</figcaption></figure><p><b>Пример: проверь мой код на ошибки</b></p><p>Другой сценарий, это когда наш код не работает или работает не так.</p><blockquote>Я новичок в Python. Написал функцию, но она не работает — вылетает ошибка. <br />Вот код:<br />def hello(name):print("Привет," name)<br />hello("Мир")<br />Представь, что ты опытный преподаватель Python. Объясни, в чём ошибка, как её исправить и почему так нельзя писать. Дай исправленный пример.</blockquote><p>Результат:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/2800c8e4-fde8-4294-86f3-be5bda9139ba.png" alt="ChatGPT для обучения программированию" /><figcaption>Исправление ошибки в Python-коде от ChatGPT</figcaption></figure><h3>Генерация идей для проектов и упражнений</h3><p>Помимо разовых задач, ИИ может составить нам план для обучения. Это могут быть проекты, отдельные упражнения или полноценная программа.</p><p><b>Пример: составь подробный план обучения</b></p><blockquote>Я изучаю фронтенд-разработку. Уже знаю основы HTML, CSS и JavaScript. Хочу освоить React, чтобы уметь создавать интерфейсы и взаимодействовать с API.<br />Представь, что ты опытный фронтенд-разработчик и преподаватель. Составь подробный план изучения React на 3 месяца. Укажи, какие темы проходить каждую неделю, какие мини-проекты можно делать, и на что обратить особое внимание. План должен быть реалистичным для человека, который учится в свободное время (около 10 часов в неделю).</blockquote><p>Результат<b>:</b></p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/18b06e56-7922-44e4-88d0-d05a3b62ff3c.png" alt="Как стать программистом с ChatGPT" /><figcaption>план изучения React от ChatGPT: первая неделя</figcaption></figure><p><b>Пример: придумай проект под мои знания</b></p><blockquote>Я изучаю Python, прошёл основы: переменные, циклы, функции, списки. Хочу попрактиковаться на небольшом проекте, чтобы закрепить знания.<br />Представь, что ты ментор по Python с опытом преподавания. Придумай 3–5 простых проектов, которые я могу реализовать за выходные. Объясни, какую задачу решает каждый проект и какие навыки он помогает прокачать.</blockquote><p>Результат:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/5f037ff8-a7f3-4aff-a005-776095da07db.png" alt="ChatGPT для обучения программированию" /><figcaption>Идеи проектов на Python от ChatGPT</figcaption></figure><p><b>Пример: подготовь мне задания для практики</b></p><blockquote>Я изучаю JavaScript, пока прошёл только основы: переменные, функции, массивы. Хочу попрактиковаться.<br />Сыграй роль преподавателя, который даёт студенту задания для отработки материала. Придумай 5 упражнений, упорядочи их от простого к сложному. Желательно, чтобы они были с короткой формулировкой и подходили для ручной отработки без фреймворков.</blockquote><p>Результат:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/ada9e56e-2a7c-4e36-8785-f62e0bb83569.png" alt="Как стать программистом с ChatGPT" /><figcaption>Упражнения на JavaScript от ChatGPT</figcaption></figure><h2>Ограничения и как их обходить</h2><p>Хотя потенциал ChatGPT при изучении программирования огромен, важно помнить о существующих ограничениях и способах их обхода для более продуктивной работы.</p><h3>Почему важно перепроверять ответы</h3><p>ИИ чат-боты не понимают код, а просто угадывают правдоподобную последовательность символов. Обычно угадывают правильно, но иногда могут придумать несуществующие функции, запутаться в синтаксисе или предложить устаревший подход.</p><p>Поэтому важно перепроверять ответы от нейросетей. Мы должны запускать каждый кусочек кода, уточнять в документации, спрашивать, как ИИ пришла к такому результату. Как вариант, можно просить подкреплять ответы ссылками на первоисточники.</p><h3>Как использовать дополнительные источники вместе с ChatGPT</h3><p>Если нам не хватает стандартной базы знаний нейросети, то мы можем заставить их работать с нашими документами, что-то искать в интернете или в репозиториях Github.</p><p><b>Выход в интернет</b></p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/bcced5cb-2930-41eb-a767-563e23d1a1ef.png" alt="ChatGPT для обучения программированию" /><figcaption>Интерфейс Chat GPT с включенной функцией поиска в интернете</figcaption></figure><p>Некоторые модели — вроде ChatGPT, Claude, Gemini, Perplexity и Grok — поддерживают подключение к сети. Это значит, что мы можем просить их найти актуальные решения, примеры кода, ошибки, официальную документацию или свежие статьи. Они работают как поисковик, только в виде диалога.</p><p><b>Работа с файлами и контекстное окно</b></p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/ff6585d9-2541-49d6-ab23-d6e16b2daf9c.png" alt="Как стать программистом с ChatGPT" /><figcaption>Пример запроса в Chat GPT c прикреплённым документом</figcaption></figure><p>Другой важный момент — работа с файлами. Мы можем загрузить код, ТЗ, документацию, таблицы или Markdown-файл с задачами. Модель проанализирует содержимое и будет использовать его при ответах. Это удобно, когда нужно задать вопрос по проекту и не хочется копировать всё вручную.</p><p>Однако важно учитывать размер документа и контекстного окна. Контекстное окно — это максимальный объём информации, которую нейросеть может запомнить в одном диалоге. У GPT-4o и Deep Seek оно около 128 тыс токенов, у Gemini, Grok и Qwen — 1 млн, у Claude — 200 тыс.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/0ebdd3a6-142b-478c-a344-b16c736b1ac7.png" alt="ChatGPT для обучения программированию" /><figcaption>Пример работы Gemini с полуторачасовым видео</figcaption></figure><p>Чем больше окно, тем больше данных можно скормить ИИ чат-боту — например, сразу весь репозиторий, длинную спецификацию или книгу. Модели от Google могут переваривать целые часовые видео.</p><p><b>Интеграция с GitHub</b></p><p>Чат ГПТ поддерживает интеграцию с GitHub. У нас есть три способа, как работать с репозиториями.</p><p>Вариант 1 — через GPT-ботов. Мы находим специальных ботов, которые созданы для работы с Github, и используем их.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/cc1a4031-d41a-47df-8a53-445f69764075.png" alt="Как стать программистом с ChatGPT" /><figcaption>Пример GPTs для работы с GitHub</figcaption></figure><p>Вариант 2 — можем работать с GitHub при помощи глубокого поиска из любого чата. Но у этого способа есть недостаток. В бесплатной версии мы можем использовать его только 5 раз в месяц.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/16ae4152-502a-4f1f-9ba9-bd0ce5749fb2.png" alt="ChatGPT для обучения программированию" /><figcaption>Пример запроса для поиска информации в GitHub при помощи Deep research</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/3e1907bb-b4d1-4c25-9d51-254b782da15e.png" alt="Как стать программистом с ChatGPT" /><figcaption>Результат работы Deep research</figcaption></figure><p>Ещё мы можем попробовать работать с GitHub при помощи обычного режима модели GPT 4o с включённым поиском в интернете, но не факт, что ИИ возьмёт данные именно с гитхаба.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/91dca560-b2eb-4f75-a667-196c72459bfe.png" alt="ChatGPT для обучения программированию" /><figcaption>Пример поиска информации при помощи Gpt 4o</figcaption></figure><p>В ChatGPT есть возможность привязать GitHub к нашему аккаунту Open AI и работать с репозиториями, без заморочек, в чатах. Делается это через настройки учётной записи.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/47a767c9-b8a8-4501-810c-037cd37e0804.png" alt="Как стать программистом с ChatGPT" /><figcaption>Настройки Chat GPT для привязывания GitHub</figcaption></figure><h2>Отличия платной и бесплатной версии ChatGPT для обучения программированию</h2><h3>Лимиты на использование моделей в платной и бесплатной версии</h3><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/e1efd036-1ea2-415d-a23e-622207fcb26c.png" alt="ChatGPT для обучения программированию" /><figcaption>тарифные планы Chat GPT</figcaption></figure><p>Самое заметное отличие — лимиты на использование моделей. Бесплатно мы получаем доступ к флагманской GPT-4o, но с ограничениями: обычно это около 10 сообщений на 3–5 часов (точное число зависит от загрузки серверов). Если лимит исчерпан, нас автоматически переключат на менее продвинутую GPT-4.1 mini. Это значит, что разбор сложного алгоритма или отладка бага может прерваться. Придётся ждать или довольствоваться ответами модели попроще.</p><p>В платной версии (например, Plus) лимиты «вкуснее»: до 80 сообщений к GPT-4o каждые 3 часа. Этого хватает для долгих диалогов: можно глубже погружаться в темы и не экономить запросы.</p><p>Ещё один важный момент — длина контекста: объём информации, который модель «помнит» в рамках одного диалога. GPT-4o и GPT-4.1 mini в бесплатной версии работают с окном в 128 тыс токенов. Это немало, но для анализа объёмного кода, нескольких файлов проекта или длинной документации может не хватить. В платной версии у нас есть доступ к GPT-4.1 с контекстным окном до 1 млн токенов. Здесь мы уже можем скормить проекты на сотни строк кода, и ИИ это всё переварит.</p><p>Ещё одна модель, которая заслуживает внимание — GPT o3. Это «думающая модель». Когда мы пишем запрос, то ИИ начинает генерировать разные формулировки по теме, как бы рассуждая. Далее, отталкиваясь от цепочек «рассуждений», получается сформулировать более точный ответ. У неё контекстное окно поскромнее — всего 200 тыс токенов, но зато она отлично справляется с задачами по логике, математике, хорошо подходит при программировании. Доступна только в платной версии.</p><h3>Задачи и напоминания в чатах</h3><p>Приятный бонус платной подписки — напоминания и планирование задач. В бесплатной версии этого нет. А с подпиской мы можем попросить ChatGPT, например, ежедневно присылать небольшую задачку по Python или напоминать о повторении материала по JavaScript.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/0a029e9b-ef52-4243-a931-345c09ecd29b.png" alt="Как стать программистом с ChatGPT" /><figcaption>Как работают напоминания в Chat GPT</figcaption></figure><p>Это похоже на личного AI-ассистента, который помогает учиться регулярно. Для этого ChatGPT использует модели o3 или o4-mini. Одновременно может быть до 10 активных задач.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/c6a8c143-aec1-4eab-8a51-23866d5574d0.png" alt="ChatGPT для обучения программированию" /><figcaption>Напоминание от Chat GPT</figcaption></figure><p>Когда придёт время напоминания, ChatGPT отправит уведомление на смартфоне, письмо на почту и пришлёт новое сообщение в чате.</p><h3>Голосовой мод с возможностью использовать камеру и транслировать экран</h3><p>Общаться с ChatGPT голосом можно и бесплатно (Standard Voice). Но платная подписка даёт Advanced Voice: он звучит естественнее и даже передаёт эмоциональные оттенки. Это предаёт интерактивности при обучении (ногда устаёшь печатать много текста).</p><p>Ещё в платной версии во время голосового чата на мобильных устройствах можно включать камеру и делиться экраном.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-05-21/331333fd-549e-4a82-a3c8-2a53dfae9b0e.png" alt="Как стать программистом с ChatGPT" /><figcaption>Слева интерфейс голосового мода Chat GPT, после того как через камеру показали код. Справа скриншот из IDE с кодом (это два разных интерфейса, просто для визуального удобства объединили в одно изображение).</figcaption></figure><p>Например, мы можем «проговорить» с ChatGPT сложную концепцию, получить обратную связь, или, столкнувшись с багом в мобильном приложении, показать его ИИ через камеру либо трансляцию экрана, чтобы вместе разобраться. Это добавляет интерактивности и полезно тем, кому проще воспринимать информацию на слух.</p><p>А как вы используете ChatGPT или другие нейросети для изучения программирования? У вас есть свои фишки, удачные примеры или не очень? Делитесь в комментариях и подписывайтесь на наш <a href="https://t.me/+iKEwDxvulHFkZDhi">тг-канал</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как TanStack Query ускоряет работу с API и сокращает код</title>
      <link>https://tproger.ru/articles/kak-tanstack-query-uskoryaet-rabotu-s-api-i-sokrashhaet-kod</link>
      <comments>https://tproger.ru/articles/kak-tanstack-query-uskoryaet-rabotu-s-api-i-sokrashhaet-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Скляр]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-tanstack-query-uskoryaet-rabotu-s-api-i-sokrashhaet-kod</guid>
      <description><![CDATA[<p>Использование TanStack Query дает разработчикам возможность упростить работу с API, сократить дублирование кода и ускорить разработку. Рассказываем о проблемах, связанных с использованием API, и соответствующих решениях для повышения эффективности разработки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-tanstack-query-uskoryaet-rabotu-s-api-i-sokrashhaet-kod">Как TanStack Query ускоряет работу с API и сокращает код</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Xen]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 28 May 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Представьте: вы — фронтенд-разработчик, и постоянно сталкиваетесь с рядом проблем. Еще один endpoint, еще один запрос, еще десяток строк почти идентичного кода. Вручную прописываете типы, парсите ответы, обрабатываете ошибки, обновляете кэш… А через неделю бэкенд-команда меняет API — и все, что вы строили, рассыпается как карточный домик.</i></p><p><i>Так случалось, пока не появились инструменты вроде <a href="https://tanstack.com/query/latest">TanStack Query</a> и не родились «обертки», которые уменьшают объемы рутины. Как перестать тонуть в запросах на разработку API и начать дышать свободно, рассказывает Дмитрий Скляр, старший разработчик компании Axenix. </i></p><h2>API: нервная система цифрового мира</h2><p>В современном ИТ-ландшафте API давно перестал быть просто техническим термином. Теперь он — один из столпов, на котором держится цифровая цивилизация.</p><p>Философия современной разработки давно сместилась от принципа «сделай все сам» к парадигме «собери из лучших компонентов». API стал языком, на котором взаимодействуют цифровые сервисы. Он превратил ИТ-ландшафты и интернет из собрания разрозненных приложений и сайтов в единую живую экосистему, где каждый элемент может взаимодействовать с другим.</p><p>Когда разработчик использует API картографического сервиса, ему не нужно разбираться в геоданных или алгоритмах прокладки маршрутов — он просто отправляет запрос и получает готовое решение. Это похоже на то, как мы пользуемся электричеством: не нужно понимать, как работает электростанция, чтобы включить свет в комнате.</p><p>Но настоящую революцию API совершил в бизнесе, создав целые экосистемы цифровых услуг. Такие компании, как Stripe, Twilio или Plaid построили свои империи именно на API, предоставляя другим разработчикам готовые «кирпичики» для создания финансовых, коммуникационных или аналитических сервисов.</p><p>Внутри крупных компаний API выступают в роли «дипломатов» между микросервисами и ИТ-системами, позволяя разным командам работать независимо, но при этом сохранять общую согласованность. Когда маркетинговая система запрашивает данные о продажах, а сервис логистики получает информацию о новых заказах — все это происходит через четко определенные API-контракты, которые делают сложные системы управляемыми и гибкими.</p><h2>Боль, которую никто не замечает</h2><p>Но не все так просто и далеко не так радужно.</p><p>Да, формально API — это универсальный мост, например, между фронтендом и бэкендом. На практике же он часто напоминает шаткую подвесную конструкцию: данные приходят в разном формате, документация устаревает еще до релиза, а поля user_name и username существуют одновременно просто потому, что «исторически сложилось».</p><p>Типичный сценарий: вы пишете код для запроса списка товаров, все типизируя и описывая модели — 50 строк. Добавляете фильтрацию — еще 30 строк. А через месяц бэкенд меняет структуру ответа, забывает предупредить — и вы тратите день на поиск багов в трех разных местах.  И самое обидное: 80% этого кода — копипаст. Проверка ошибок, трансформация данных, инвалидация кэша — все одно и то же, но плодится как вирусы.</p><p>Сюда можно добавить также сложность поддержки — API меняется, код устаревает.</p><p>Другой момент: код для каждого API-метода имеет схожую структуру. Повторяются основные шаблоны, а различия лишь в типах данных и отдельных деталях. Чем больше API-методов, тем сложнее отслеживать изменения в коде и поддерживать его в актуальном состоянии.</p><p>В итоге — дублирование кода, которое усложняет приложение, снижает его читаемость и замедляет разработку новых функций. Документация? Либо устарела, либо ее вообще не писали.</p><h2>Спасение — в системе</h2><p>Однажды наши разработчики устали писать однотипные хуки, чинить сломанные запросы и объяснять новичкам, что где находится, почему именно так это работает и почему нельзя просто взять и использовать что-то другое. Устали писать однотипный код для каждого запроса, захотели минимизировать ошибки и ускорить разработку, а также сделать работу с API более структурированной и понятной. Также у команд назрела потребность в скорейшем включении в проект новых разработчиков. Для всех этих задач подходит одно решение: унифицированный подход к API, который также наводит порядок в данных и отчетах, упрощая аналитику и логику приложения.</p><p>Тогда и родилась идея фабрики API — слоя абстракции, который скрывает рутину. Для этого мы привлекли возможности <a href="https://tanstack.com/query/latest">TanStack Query</a>, семейство библиотек для управления состоянием данных (data fetching) в клиентских приложениях. Помимо <a href="https://tanstack.com/query/latest">TanStack Query (ранее React Query)</a>, к этому классу инструментов также относятся: RTK Query (из Redux Toolkit), Apollo Client (для GraphQL) и SWR.</p><p>Их общая философия: «делать рутину невидимой для разработчика». Рассмотрим Конкретные проблемы и их решения.</p><h3>Однотипные хуки для каждого запроса</h3><p>В большинстве проектов без дополнительной абстракции каждый хук под API-запрос пишется вручную. Меняется только URL и параметры, а структура остаётся одинаковой: queryKey, queryFn, опции запроса. Это быстро приводит к копипасту, дублированию логики и усложнению поддержки.</p><p>Например, для каждого ресурса вроде пользователей, продуктов, заказов и т.д. приходится повторять одну и ту же конструкцию. Если нужно изменить поведение запроса (например, добавить retry или staleTime), правки необходимо делать в десятках мест.</p><p><b>Решение: Универсальная обёртка над хуками TanStack Query</b></p><p>Создание единой функции-генератора для хуков позволяет избавиться от повторяющегося кода. Она принимает ключ, функцию запроса и опциональные параметры — и возвращает сразу «пачку» готовых хуков.</p><p>Такой подход:</p><ul><li>снижает количество шаблонного кода;</li><li>упрощает масштабирование;</li><li>централизует поведение всех запросов;</li><li>позволяет быстро адаптироваться к изменениям (например, добавить логирование, типизацию, трансформации и т.п.).</li></ul><h3>Хрупкость при изменении API</h3><p>В типичном приложении без централизованной трансформации мы напрямую используем ответ от бэкенда. Любое изменение формата требует правок в типах, в местах использования данных, и часто приводит к багам.</p><p><b>Решение: Централизованная трансформация данных +</b> <a href="https://github.com/typestack/class-transformer">class-transformer</a>.</p><p>С помощью <a href="https://github.com/typestack/class-transformer">class-transformer</a> можно объявить классы сущностей и задать правила преобразования один раз.</p><p>Плюсы:</p><ul><li>Все данные автоматически приходят в нужном виде;</li><li>Компоненты работают с гарантированно типизированными данными;</li><li>Один источник правды: при изменении API – правим только Entity-класс;</li><li>Удобно масштабируется, особенно если API большое и сложное.</li></ul><h3>«Мусор» в данных и отчётах</h3><p><b>Решение: Валидация данных при трансформации (например, через class-validator); автоматическая синхронизация кеша (актуальные данные во всём приложении).</b></p><p>Почему это лучше ручного подхода? Смотрите: строк кода на 1 endpoint при ручном управлении <b>потребуется 30+</b>, а <b>с фабрикой —  5-10</b>. Времени для добавления нового поля —  1<b> час вручную, с фабрикой —  5 минут</b>. Количество мест для правки при изменении API —  вручную их много, с фабрикой — лишь одно.</p><p>Реальный кейс: в проекте с 50+ endpoint’ами переход на фабрику <b>сократил код на 70%</b>. Разработчики перестают быть «переводчиками» между API и интерфейсами сервисов и приложений, а сосредотачиваются на бизнес-логике. Как сказал один тимлид: <i>«Теперь мы не фиксим баги данных, а делаем фичи, которые нравятся пользователям»</i>.</p><p>Еще пример: вместо пяти отдельных хуков для CRUD-операций фабрика дает одну функцию createApi(). Вместо ручного парсинга — автоматическую трансформацию данных через <a href="https://github.com/typestack/class-transformer">class-transformer</a>. А главное — единые правила игры для всего проекта.</p><p>Как это работает? Представьте, что вы говорите системе: «Вот endpoint для товаров, вот их модель данных, вот правила валидации» —  а все остальное она делает за вас. Хотите получить товар по ID? Пишете useGetByIDQuery. Нужно обновить? —   useUpdatetMutation. И никакого шаманства с ручным описанием каждого хука.</p><p>Но главное — когда бэкенд меняет API, правки нужны только в одном месте. А новые разработчики перестают спрашивать: <i>«Почему у нас три разных способа загрузить список пользователей?»</i>.</p><h2>Как договориться и не сойти с ума</h2><p>Проблема в том, что без четкого контракта, набора правил и подходов фронтенд- и бэкенд-разработчики живут в параллельных реальностях. Один думает, что данные придут в camelCase, другой шлет их в snake_case. Один ожидает массив, другой неожиданно подсовывает null. Итог —  бесконечные баги, исправления «на живую» и испорченные нервы.</p><p>Решение? Четкий контракт. Простой, прозрачный, однозначный. В нем должны быть:</p><ol><li>Единые правила именования — если бэкенд отдает snake_case, фронтенд не должен гадать, будут ли остальные поля в camelCase, или, например, если в одной модели данных full_name , в другой не будет fullname и так далее.</li><li>Единый формат запросов и ответов.</li><li>Договоренности о структуре URL, формате данных и кодах ошибок.</li><li>Строгая типизация — TypeScript-интерфейсы, которые знают, какие поля обязательны, а какие могут отсутствовать.</li><li>Документация, которая не врет — если Swagger говорит, что поле email есть, оно должно быть. Всегда.</li></ol><p>И самое главное — этот контракт должен соблюдаться. Если бэкендеры меняют API, они обязаны предупредить. Иначе фронтенд превращается в сапера, который каждое утро разминирует прод.</p><p>Но, как правило, контракт сделать тяжело.  Каждый видит REST по-своему: разные URL, форматы данных, обработка ошибок. Модели данных непоследовательны — поля то есть, то их нет, вложенность меняется. Документации либо нет, либо она устарела, так что API изучаем методом проб и ошибок. От такого надо отказываться сразу и стараться договорится на берегу.</p><p>Для унификации и строгого соответствия данных мы используем <a href="https://github.com/typestack/class-transformer">class-transformer</a>: автоматически приводим данные к нужным форматам, вместо работы с сырыми JSON-объектами. Так получаются экземпляры классов с методами и свойствами. Далее убираем ручную обработку и проверки данных, преобразовываем вложенные структуры и применяем кастомные трансформации.</p><h4>Что получаем в итоге?</h4><p>Когда контракт есть, а обертка API готова, магия начинает работать:</p><ul><li><b>Простота использования</b>: вместо десятков хуков — единая фабрика createApi(). Меньше boilerplate-кода.</li><li><b>Мощные возможности</b>: данные приходят уже в нужном формате без ручных проверок. Кэш, инвалидация и оптимизации —  <a href="https://tanstack.com/query/latest">TanStack Query</a> делает за вас всю грязную работу.</li><li><b>Новички влетают в проект: </b>больше не нужно объяснять, почему useGetEntity в одном компоненте работает не так, как в другом.</li><li><b>Активное сообщество: </b><a href="https://tanstack.com/query/latest">TanStack Query</a> —  тысячи разработчиков, готовых ответить на вопросы. Здесь можно найти примеры для любых кейсов: от интеграции с <a href="https://nextjs.org/">Next.js</a> до кастомного кеширования.</li><li><b>Нет ограничений по использованию: </b><a href="https://tanstack.com/query/latest">TanStack Query</a> —  не только для React, есть версии для <a href="https://tanstack.com/query/latest/docs/framework/vue">Vue</a>, <a href="https://tanstack.com/query/latest/docs/framework/svelte">Svelte</a> и даже <a href="https://tanstack.com/query/latest/docs/framework/solid">Solid.js</a>. Также работает с любым API — REST, GraphQL, WebSockets.</li><li><b>Работа с SSR без боли: </b>готовая интеграция с <a href="https://nextjs.org/">Next.js</a>, <a href="https://remix.run/">Remix</a> и другими фреймворками. При этом данные, полученные на сервере, автоматически передаются на клиент. <a href="https://tanstack.com/query/latest">TanStack Query</a> синхронизирует серверный и клиентский рендеринг.</li></ul><p>Но есть и ложка дегтя. Отладка усложняется, если что-то сломается внутри обертки — придётся копать глубже. Возникает зависимость от библиотек: <a href="https://github.com/typestack/class-transformer">class-transformer</a>, axios и сам <a href="https://tanstack.com/query/latest">TanStack Query</a> становятся обязательными.</p><p>Однако игра стоит свеч. Потому что время, сэкономленное на рутине, можно потратить на то, что действительно важно —  фичи, которые понравятся пользователям, а не бесконечные правки API-вызовов.</p><h4>Сравнительные примеры</h4><p>GET /products — Список продуктов</p><p>GET /products/:id — Один продукт по id</p><p>POST /products — Создание продукта</p><p>PUT /products/:id — Обновление продукта по id</p><p>DELETE /products/:id — Удаление продукта по id</p><h4>Как это выглядит в обертке</h4><h4>Все свойства и возвращаемые хуки и конфиги из фабрики:</h4><h4>Пример использования в компонентах:</h4><h4>Использование конфигов:</h4><h4>Для сравнения с классическим решением:</h4><figure><img src="https://media.tproger.ru/user-uploads/115291/2025-05-22/efa40892-0692-4a19-9796-8f993267a22d.png" alt="Сравнение обычного использования и фабрики" /><figcaption>Сравнение обычного использования и фабрики</figcaption></figure><h2>Когда стоит переходить на обертку?</h2><p>Не каждый проект нуждается в таком подходе к API. Если у вас два-три endpoint’а и они никогда не меняются — возможно, обертка будет избыточной. Но представьте стартап, где каждый месяц добавляются новые сущности: сначала товары, потом отзывы, потом промокоды, рекомендации, аналитика.</p><p>Вот где система раскрывается на полную! Новая сущность? Пять минут на добавление — и готовы все CRUD-операции. Изменился бэкенд? Правим в одном месте — и все работает.  Пришел новый разработчик? Он не тратит неделю на изучение особенностей API.</p><p>Правда, если бэкенд живет в мире хаотичных endpoint’ов (например, GET /fetch_items, но DELETE /removeProduct), обертка не спасет.</p><h4>Но как навести порядок?</h4><p>Главный секрет — общаться. Не ждать, пока API сломается, а сразу договориться:</p><ul><li>Какие будут названия полей (created_at vs createdAt);</li><li>Как структурированы ошибки;</li><li>Когда и как можно менять контракт.</li></ul><p>Как сказал один разработчик: «фронтенд и бэкенд — как соседи по коммуналке. Можно ругаться из-за бардака на кухне, но лучше сесть и написать правила совместного проживания».</p><p>А напоследок —  график, для закрепления разницы между работой с оберткой и без нее.</p><figure><img src="https://media.tproger.ru/user-uploads/115291/2025-05-22/5f23aca4-8353-4ff4-8923-f24685395bb2.png" alt="График сравнительного примера" /><figcaption>График сравнительного примера</figcaption></figure>]]></content:encoded>
    </item>
    <item>
      <title>Меню «Пуск» в Windows 11 оказалось лишь React Native приложением, грузящим процессор до 80%</title>
      <link>https://tproger.ru/news/menyu--pusk--v-windows-11-okazalos-liw-react-native-prilozheniem--gruzyashhim-processor-do-80-</link>
      <comments>https://tproger.ru/news/menyu--pusk--v-windows-11-okazalos-liw-react-native-prilozheniem--gruzyashhim-processor-do-80-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/menyu--pusk--v-windows-11-okazalos-liw-react-native-prilozheniem--gruzyashhim-processor-do-80-</guid>
      <description><![CDATA[<p>Меню «Пуск» в Windows 11 — это React Native-приложение, которое при открытии загружает процессор до 80%. Пользователи критикуют такой подход</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/menyu--pusk--v-windows-11-okazalos-liw-react-native-prilozheniem--gruzyashhim-processor-do-80-">Меню «Пуск» в Windows 11 оказалось лишь React Native приложением, грузящим процессор до 80%</a>»</p>]]></description>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Windows 11]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 27 May 2025 09:31:58 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пользователи соцсетей <a href="https://x.com/alxfazio/status/1926731799226462646">обратили</a> внимание на странное поведение меню «Пуск» в Windows 11. Как выяснилось, при каждом его открытии, в системе запускается полноценное приложение, написанное на React Native.</p><p>Это приложение запускается на каждый клик и может загружать до 80% одного ядра процессора. В зависимости от конфигурации ПК, это приводит к ощутимым подлагиваниям, особенно на устройствах со слабым железом.</p><h2>Почему «Пуск» вообще написан на React Native</h2><p>Microsoft уже давно использует React Native в интерфейсе Windows 11. Например, на этом же фреймворке построена страница «Ваша учетная запись» в настройках.</p><p>Компания объясняет такой выбор желанием унифицировать разработку — один код можно использовать и на десктопе, и в вебе.</p><p>Но вопрос остается: стоит ли системным элементам, вроде меню «Пуск», быть написанными на веб-технологиях, которые не славятся легкостью и быстродействием?</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-05-27/02b496b5-d0f3-47dd-8502-0faa97e8fdc4.jpeg" alt="" /></figure><h2>Упрощение разработки — за счет пользователя</h2><p>На Reddit и в X.com пользователи протестировали поведение меню с помощью инструментов мониторинга. Оказалось, что каждый вызов «Пуска» запускает тяжелый интерфейс, который обновляется как веб-страница: с анимациями, DOM-объектами и переработкой слоев.</p><p>В результате — скачки нагрузки даже на мощных системах, не говоря уже о бюджетных ноутбуках. На скриншотах пользователи показывают рост до 70–80% загрузки одного ядра при каждом открытии меню.</p><h2>Кармак был прав</h2><p>На фоне этого всплыло старое высказывание Джона Кармака — легенды геймдева и автора движка серии DOOM и Quake.</p><p>По его словам, «мир гораздо меньше зависит от передовых чипов, чем кажется». Главная проблема — не железо, а неэффективное ПО. И если рынок заставит, мы увидим настоящую революцию в оптимизации.</p><p>Меню «Пуск» в виде React-приложения — яркий пример. Зачем гонять процессор до 80% ради того, чтобы показать сетку ярлыков?</p>]]></content:encoded>
    </item>
    <item>
      <title>Как упростить работу с API в React-приложении с помощью RTK Query и OpenAPI?</title>
      <link>https://tproger.ru/articles/kak-uprostit-rabotu-s-api-v-react-prilozhenii-s-pomoshhyu-rtk-query-i-openapi-</link>
      <comments>https://tproger.ru/articles/kak-uprostit-rabotu-s-api-v-react-prilozhenii-s-pomoshhyu-rtk-query-i-openapi-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дима Державин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-uprostit-rabotu-s-api-v-react-prilozhenii-s-pomoshhyu-rtk-query-i-openapi-</guid>
      <description><![CDATA[<p>Узнайте, как упростить работу с API в React-приложении с помощью RTK Query и OpenAPI: генерация запросов, типизация и меньше ручной работы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-uprostit-rabotu-s-api-v-react-prilozhenii-s-pomoshhyu-rtk-query-i-openapi-">Как упростить работу с API в React-приложении с помощью RTK Query и OpenAPI?</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 23 May 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ручная интеграция API и веб-приложения часто приводит к проблемам с обратной совместимостью контрактов. На стороне фронтенда это приводит к падению приложения, на бекенде — к потере данных с фронтенда. Один из способов предотвратить такие сложности — кодген.</p><p>В статье мы разберёмся, как запустить кодген на основе OpenApi схемы для веб-приложения на стэке React + redux-toolkit.</p><p>Для справки: контракт — соглашение о формате данных между клиентом и сервером</p><h2>Какие проблемы решает кодген?</h2><p>Любой разработчик может совершить ошибку: неудачно разрезолвить мердж-конфликт, забыть предупредить о рефакторинге или банально опечататься.</p><p>В микро-сервисной архитектуре цена таких ошибок высока — оперативно доставить обновления многочисленным клиентам иногда бывает проблематично.</p><p><i>Кодген снижает вероятность таких ошибок, так как методы статично создаются на основе схемы, которая, в идеале, также должна генерироваться на основе кода бекенда. Рассмотрим подробнее.</i></p><h3>Синхронизация контрактов</h3><p>При активной разработке бекенд постоянно обновляет контракты. Без кодгена все обновления на стороне фронтенда синхронизируются вручную.</p><p>Также на основе контрактов создаются побочные интерфейсы, например, для redux-слайсов и react-компонентов. Ошибка в основном контракте создает цепочку проблем со связанными типами и интерфейсами.</p><p>Сочетание кодген-контрактов и typescript-утилит для создания побочных интерфейсов делает доставку обновлений простой и безопасной.</p><h3>Устранение дубликатов</h3><p>Когда проект не имеет четкой структуры, контракты оказываются разбросаны по всей кодовой базе. Разработчики, не сумев найти нужный интерфейс, просто создают свои варианты контрактов. Так рождаются дубликаты и несогласованность.</p><p><i>Кодген решает эти проблемы, создавая единую точку входа для всех методов и интерфейсов.</i></p><p><b>Совет:</b> Кодген проще и безопасней внедрять на начальных этапах разработки. А в уже написанных проектах — стоит внедрять его постепенно, например, по несколько эндпойнтов за раз.</p><h2>Что понадобиться для кодгена?</h2><p>Прежде чем запускать кодген нам нужно минимально настроить проект:</p><h3>Подготовить схему</h3><p>OpenAPI-схема в формате yaml:</p><p><b>Важно: </b>Любая ошибка в схеме приводит к поломке кодгена. Поэтому важно, чтобы ваша схема проходила валидацию.</p><p>Проверить валидность OpenAPI схемы можно на в <a href="https://editor.swagger.io">swagger редакторе</a></p><h3>Настроить Redux</h3><p>Redux-клиент для API-запросов:</p><p>Redux-слайс для хранения данных из API-запроса:</p><p>Redux-хранилище с подключенным API-клиентом и редюсером:</p><h3>Настроить кодген</h3><p>Для кодгена возьмём официальную библиотеку от Redux — <a href="https://www.npmjs.com/package/@rtk-query/codegen-openapi">@rtk-query/codegen-openapi</a></p><p><a href="https://www.npmjs.com/package/@rtk-query/codegen-openapi"></a>Затем создадим файл настройками кодгена:</p><p>Библиотека хороша тем что покрывает все основные потребности, позволяя быстро запустить когден без долгих настроек. Цена удобства — отсутствие гибкости. Адаптировать результат когдена под сложный кодстайл будет проблематично.</p><p>Если вам нужна гибкость, попробуйте использовать <a href="https://www.npmjs.com/package/@openapitools/openapi-generator-cli">@openapitools/openapi-generator-cli</a> с различными готовыми шаблонами или <a href="https://github.com/orval-labs/orval">Orval</a> от tanstack</p><h2>Запуск кодгена</h2><p>Для запуска добавим команду в package.json:</p><p>Далее заходим в корень проекта и запускаем команду:</p><p>На выходе должен получиться файл codegenApi.ts с содержимым:</p><p>Проверяем результат:</p><ul><li>Инджект кодген эндпойтов в baseApi;</li><li>Системные типы Props Response Error;</li><li>Контракт User;</li><li>RTK-query хуки.</li></ul><p><b>Совет: </b>создание кодгена можно автоматизировать, например, сделать его отдельным этапом в CI/CD, который выполняется прямо перед билдом приложения.</p><h2>Возможные проблемы</h2><h3>Необычные типы данных</h3><p>При внедрении кодгена в проект на Kotlin я столкнулся с проблемой парсинга: кодген не мог распарсить тип данных LocalDateTime, который должен возвращать строку с датой в формате ISO. Вместо строки когден возвращал пустой объект.</p><p>LocalDateTime — это класс из Java-библиотеки java.time, который представляет дату и время без учёта временной зоны.</p><p>Данную проблему я решил с помощью кодмода:</p><p>Кодмод запускается после команды codegen. Он бежит по файлу сверху вниз, находит нужный тип и меняет его значение на string.</p><p><b>Совет:</b> При добавлении кодмода в общий файл обязательно опишите проблему которую он решает. Когда кодмодов станет много и они начнут конфликтовать, вам будет проще разобраться в их работе.</p><p>Кодмоды отлично генерируются с помощью AI.</p><h2>Плюсы и минусы кодгена</h2><p>Плюсы:</p><ul><li>Генерируем API-слой всего приложения за секунды;</li><li>Получаем автоматическое строгое создание интерфейсов и типов;</li><li>Избавляемся от опечаток в URL и параметрах;</li><li>Обнаруживаем проблемы с обратной совместимостью контрактов на ранних этапах сборки;</li><li>Экономим время.</li></ul><p>Минусы:</p><ul><li>Качество кодгена зависит от качества описания OpenAPI схемы;</li><li>Если схема не генерируется в автоматическом режиме, актуальности OpenAPI схемы потребуется поддерживать вручную;</li><li>Логику нестандартных запросов придётся описывать вручную.</li></ul><p><b>Напоминание:</b> API-слой сложного проекта невозможно покрыть кодогенерацией на 100% — это нормально. Будьте готовы при помощи методов enhanceEndpoints и injectEndpoints комбинировать когден-эндпойнты с эндпойнтам написанными вручную</p><h2>Заключение</h2><p>Кодген ускоряет разработку и делает доставку изменений с бэкенда более безопасной, однако подход требует качественной спецификации, поэтому если у вас небольшой проект — скорее всего кодген для вас будет лишним усложнением.</p><p>В остальных случаях, используя кодген, вы получите предсказуемый и масштабируемый API-слой, который сэкономит сотни часов разработки и поможет вашей команде сместить фокус c рутинных задач на создание качественной бизнес-логики для вашего веб-приложения.</p><p>Ускоряй работу, автоматизируй рутину, используй лучшие тулзы. Все самые полезные инструменты <a href="https://t.me/+iKEwDxvulHFkZDhi">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Скрутка и накрутка опыта: работает ли это в айтишке</title>
      <link>https://tproger.ru/articles/skrutka-i-nakrutka-opyta--rabotaet-li-eto-v-ajtiwke</link>
      <comments>https://tproger.ru/articles/skrutka-i-nakrutka-opyta--rabotaet-li-eto-v-ajtiwke?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/skrutka-i-nakrutka-opyta--rabotaet-li-eto-v-ajtiwke</guid>
      <description><![CDATA[<p>Вместе с Акимом Саввиным, тимлидом команды бэкэнда в ВСК, разбираемся, зачем айтишники скручивают или накручивают опыт и дает ли это какие-то преимущества.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/skrutka-i-nakrutka-opyta--rabotaet-li-eto-v-ajtiwke">Скрутка и накрутка опыта: работает ли это в айтишке</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 16 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>«Чтобы попасть на работу, нужен опыт, но как я получу этот опыт, если меня никуда не берут» — этот замкнутый круг знаком каждому новичку, особенно в айти. Или обратная ситуация: откликаетесь на вакансию, проходите собеседования, а потом вас не берут, и причина — overqualified (да уж, нужно было работать поменьше).</p><p>Аким Саввин, тимлид команды бэкэнда в ВСК, ментор <a href="https://h.careers/skills?utm_source=site_tproger&amp;utm_medium=article">Эйч Навыки</a> и автор <a href="https://t.me/savvin_thoughts">тг-канала</a>, расскажет, зачем разработчики скручивают и накручивают опыт и как это помогает им попасть в компанию.</p><h2>Опыт — новая нефть</h2><p>Недавно мы <a href="https://tproger.ru/articles/it-rynok-razdulsya-i-teper-lopnul---est-li-deficit-v-it-v-2025-godu-">писали</a> про то, что рынок IT перегрет, зарплаты падают, джунов — не берут на работу. Усугубляется ситуация тем, что молодых специалистов стало очень много. Например, на hh.ru количество откликов на джуниор-вакансию может достигать нескольких тысяч. И самые банальные критерии, по которым кандидатов будут отсеивать эйчары — вуз, опыт и возраст. Даже если в объявлении указан минимальный опыт и «базовые знания», на собеседования будут звать тех, у кого был серьезный опыт в разработке — и то, далеко не всех.</p><blockquote>В такой системе скилловые ребята с меньшим стажем не могут претендовать на зарплаты, соответствующие их компетенциям, даже если они превосходят более опытных коллег. Это и подпитывает тренд на накрутку опыта: инженеры, проработавшие год-два, но активно развивавшиеся и решавшие сложные задачи, добавляют себе 2–3 года стажа, чтобы пройти отбор и попасть на собеседование.</blockquote><p>Недавно в ТикТоке завирусились видео одного «разработчика», который решил провести эксперимент, сможет ли он выдумать резюме, пройти эйчаров и попасть в компанию на зарплату 500+ тысяч. Вы не поверите, но у него получилось — он уже прошел одно техсобеседование, а скоро его ждет второе в другой компании. Отвечать на вопросы, кстати, ему помогает искусственный интеллект. Считайте, он накрутил себе огромный стаж и полностью придумал все достижения на предыдущих местах работы. Здесь возникают вопросы: по каким критериям в принципе эйчары и команда отбирают специалистов? Получается, врать в резюме — просто необходимость? И можно ли оправдать тех, кто скручивает или накручивает опыт, чтобы попасть в компанию?</p><h2>А этот опыт — он сейчас с вами в одной комнате?</h2><p>Кейс 1: у нас есть Python-разработчик Паша, которому 21 год, он прошел стажировку в крупной компании, проявил себя, быстро попал в штат и за год сделал кучу крутых фич. Он понял, что вырос из нынешних задач и зарплаты, а повышать его не хотят, потому что у компании, например, нет возможности. Паша начинает рассылать резюме в другой бигтех, но везде отказы. И причина, скорее всего, в нехватке опыта — у нашего героя его всего 1 год.</p><p>Один из простых, но не самых честных вариантов для нашего Паши — банально накинуть себе еще 1-2 года опыта. Это реальный способ пробиться через жесткие фильтры HR и ATS-систем, которые часто отсекают кандидатов с недостаточным стажем. Главное здесь — не переусердствовать, иначе этого разговора из небезызвестного фильма не избежать:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-05-12/0571d9f9-a123-4729-b4dd-caa0a34019c8.png" alt="" /></figure><blockquote>Лично я никогда не крутил опыт, но зачем другие люди это делают? Опыт крутят, чтобы было больше шансов попасть на собеседование. Задача HR’ов и нанимающих менеджеров максимально сузить круг подходящих кандидатов. Главная задача — найти самого скилового кандидата. Хороший опыт дает человеку возможность опробовать себя в разных условиях, пообщаться с разными людьми и получить больше практики на разных задачах, а, соответственно, и больше хард- и софт-скиллов.</blockquote><p>Кейс 2: Дмитрий Александрович, Java-разработчик с 20-летним стажем хочет перейти в новую компанию по личным причинам, допустим, ему наскучили задачи. Однако такой количество такого большого опыта совершенно не значит, что компании будут стучаться к нему в профиль каждые 3 минуты, поскольку это тоже может быть ред-флагом для эйчаров.</p><blockquote>Зачастую скручивают сильно опытные специалисты у кого за 10-15, а, может, и за 20 лет опыта. Мне кажется, это происходит по большей части из-за проявления эйджизма к старшему поколению. Но здесь есть определенная логика: технологии, которые были актуальны 10 лет назад, сегодня уже никому не нужны и знания человека, которые он получил в своем опыте 10-летней давности, соответственно, тоже. Поэтому стаж становится фактически не релевантным и это то же самое, что не писать в резюме опыт предыдущей профессии.</blockquote><h2>Какие в этой системе проблемы</h2><p>Манипуляции с опытом работают только в том случае, если вы действительно крутой разработчик, который постоянно развивается и готов браться за сложные задачи. Другими словами, с большим опытом приходит большая ответственность. И если со скруткой вряд ли возникнут какие-то проблемы, то с накруткой — ситуация сложная. Разбираемся со всеми рисками на вымышленных (и немного утрированных) историях.</p><h3>Потеря доверия</h3><p>Представим, Антон, 24-летний выпускник курсов по Python и стажер в небольшом стартапе, решил, что ему пора уходить в бигтех. После нескольких месяцев безуспешных откликов он решил усилить свое резюме и добавил два года вымышленного опыта работы над проектами в другом стартапе. Его план сработал: резюме прошло фильтр HR, и Антон получил приглашение на собеседование в компанию мечты. Он тщательно подготовился, выучил ответы на типичные вопросы и даже прошел техническое интервью (с трудом).</p><p>Но на финальном этапе эйчар попросил предоставить контакты для рекомендаций с «прошлого места работы». Да, такое случается редко, но это вполне возможно, особенно если компания сомневается. Антон запаниковал — никакого стартапа не существовало. Он попытался выкрутиться, придумав отговорки, но эйчар быстро заподозрил ложь. После проверки оказалось, что указанный опыт был фейковым. Антону отказали, а его имя попало в неофициальный черный список компании.</p><h3>Несоответствие ожиданиям</h3><p>Катя, начинающий фронтенд-разработчик, закончила шестимесячные курсы и уже умела создавать простые интерфейсы на React. Но конкуренция за позиции джунов была огромной, и она решила пойти на риск: в резюме Катя указала, что работала два года в роли джуна-разработчика в небольшой компании. По принципу «разберусь на месте» она прошла собеседование и получила оффер на мидла с большой зарплатой.</p><p>Но карета быстро превратилась в тыкву. На новой работе Катя столкнулась с задачами, которые требовали глубокого понимания архитектуры приложений, оптимизации производительности и работы с устаревшим кодом. Вместо работы она штудировала книжки и смотрела курсы, и как результат — сильно отставала от команды. Коллеги начали замечать, что Катя избегает сложных задач, а тимлид стал задавать вопросы о ее прошлом опыте. Выяснилось, что никакие сложные задачи она не решала, и ее уволили.</p><blockquote>Количество опыта не равно качество. Даже 15 лет стажа не гарантируют, что человек работал над сложными проектами, брал на себя интересные задачи или занимался саморазвитием в свободное время. Количество лет опыта стало условным фильтром, который часто используется эйчарами, но утратил связь с реальным уровнем навыков. Также нужно понимать последствия: кто-то это воспримет как обман, но за это вас вряд ли уволят. Уволить могут, если ты не оправдаешь ожидания, не будешь справляться с теми задачами, которые на тебя возлагают. Если ты джун и крутишь на сеньора, то, возможно, тебе понадобится больше времени для решения своих задач, возможно, понадобится ментор, а, возможно, ты и сам справишься, если займешься своим развитием — все зависит от ситуации.</blockquote><h3>Репутационные риски</h3><p>Алексей, разработчик с годом реального опыта, хотел ускорить карьерный рост. Он добавил в резюме три года работы над вымышленными проектами, включая роль лида в несуществующей компании. Его харизма и уверенные ответы на собеседовании убедили небольшую IT-компанию нанять его на позицию синьора. Алексей справлялся с задачами на базовом уровне, но его пробелы в знаниях стали очевидны, когда проект усложнился. Коллеги начали подозревать, что его опыт не соответствует заявленному, и слухи дошли до руководства.</p><p>Ситуация усугубилась, когда один из коллег Алексея решил рассказать об этом кейсе в соцсетях. Пост завирусился, эйчары писали в личные сообщения, чтобы добыть имя разработчика. Да, Алексея, может, и не уволили, но сделали джуном и понизили зарплату. А когда он решил сменить работу, некоторые компании отказали ему после этой истории.</p><h2>Вместо заключения: как сделать реальный опыт</h2><p>Накрутка и скрутка — не единственные способы вырасти в айти. Вот несколько альтернативных вариантов:</p><ol><li><b>Фриланс и open-source.</b> Новички могут брать небольшие проекты на фриланс-платформах или участвовать в open-source проектах, чтобы набраться реального опыта.</li><li><b>Стажировки.</b> Многие компании предлагают стажировки для джуниоров, которые помогают получить первый опыт без необходимости «накручивать» стаж.</li><li><b>Портфолио.</b> Хорошо оформленное портфолио с реальными или пет-проектами точно усилят ваше резюме, если будут выбирать из нескольких человек с одинаковым опытом.</li><li><b>Честная самопрезентация.</b> Если вы опытный специалист, фокусируйтесь на реальных навыках и четко объясняйте, почему предыдущий опыт не будет препятствием.</li><li><b>Нетворкинг.</b> Посещайте ярмарки вакансий, конференции и хакатоны — там вас могут заметить и позвать в команду.</li></ol><p>Мы не призываем вас производить манипуляции с опытом. Единственная ситуация, когда вам это может помочь — если вы абсолютно уверены в своих навыках. В противном случае лучше посидеть на нынешнем месте еще немного и просить дополнительные задачи, чтобы прокачать свои скиллы.</p><p>Про накрутку/скрутку мы ничего вам не скажем, но поможем с прокачкой скиллов к собеседованиям. Все самые важные инсайты собрали <a href="https://t.me/+ASS2QiT73H43MWEy">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Push-уведомления: от базовых принципов до омниканальных систем</title>
      <link>https://tproger.ru/articles/puwi-na-vse-platformy--kak-rabotaet-novyj-rossijskij-servis-multipushed</link>
      <comments>https://tproger.ru/articles/puwi-na-vse-platformy--kak-rabotaet-novyj-rossijskij-servis-multipushed?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/puwi-na-vse-platformy--kak-rabotaet-novyj-rossijskij-servis-multipushed</guid>
      <description><![CDATA[<p>Рассказываем, как push-уведомления помогают бизнесу доставлять пользователям сообщения с 99.9% вероятностью и как работают изнутри.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/puwi-na-vse-platformy--kak-rabotaet-novyj-rossijskij-servis-multipushed">Push-уведомления: от базовых принципов до омниканальных систем</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Firebase]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 13 May 2025 13:09:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Push-уведомления стали неотъемлемой частью цифровых продуктов, позволяя приложениям и сайтам оперативно взаимодействовать с пользователями. Они информируют о новостях, обновлениях или событиях в реальном времени, повышая удержание аудитории и конверсию. В отличие от email или SMS, пуши не требуют открытия отдельного приложения и появляются прямо на экране устройства, что делает их эффективным инструментом для маркетинга, уведомлений о транзакциях или системных алертах.</p><p>Рассмотрим, в чем особенность пушей и почему командам стоит к ним присмотреться.</p><h2>Почему сначала пуши, а потом СМСки</h2><p>Казалось бы, мы уже настолько привыкли к пушам из приложений, что СМСки кажутся прошлым веком. Однако многие компании продолжают ими пользоваться — это в какой-то степени логично, поскольку не все устанавливают приложения. Но часто бывает и такое, что бизнес в принципе не стал внедрять подобную функцию.</p><p>А зря: во-первых, СМС — всегда сильная зависимость от оператора связи. Пуши же — более гибкая опция, поскольку при их отправке используются ваши собственные каналы связи. Плюс стоимость отправки push-уведомлений значительно ниже, чем у СМС, при этом данные шифруются, а значит, злоумышленники не смогут украсть важные коды.</p><p>После 2022 года выбор сервисов для push-уведомлений стал сложнее из-за санкций. Долгое время компании пользовались и по инерции продолжают пользоваться сервисом Firebase Cloud Messaging от Google, но сейчас этот канал не может быть единственным для отправки push, так как могут возникнуть определенные санкционные риски и для бизнеса, а также другие проблемы:</p><ul><li>Одноразовые коды и другие уведомления — чувствительная информация. Зарубежные сервисы передают данные за пределы России, что может быть рискованно.</li><li>Условно-бесплатные аналоги, такие как FCM, не гарантируют доставку и не предоставляют аналитику.</li><li>Некоторые сервисы вовсе заблокированы в России, а другие не работают в Китае, где многие сейчас ведут бизнес.</li></ul><h2>Как работают push-уведомления: техническая основа</h2><p>Push-уведомления основаны на клиент-серверной архитектуре, где сервер отправляет данные на устройство через специализированные сервисы. Процесс начинается с регистрации: при запуске приложения устройство генерирует токен (device token) и отправляет его на сервер разработчика. Этот токен используется для маршрутизации сообщений.</p><p>Доставка происходит через платформо-зависимые сервисы:</p><ul><li>APNs (Apple Push Notification service): Для iOS и macOS, требует сертификата от Apple и поддерживает богатые уведомления с изображениями и действиями.</li><li>FCM (Firebase Cloud Messaging): Для Android, кросс-платформенный сервис от Google, интегрируется с другими каналами.</li><li>HPK (Huawei Push Kit): Альтернатива для устройств Huawei, особенно актуальна в регионах без Google Services.</li><li>RuStore и Aurora: Российские аналоги для Android, ориентированные на локальный рынок и совместимые с санкционными ограничениями.</li></ul><p>Для веб-приложений используются Web Push Notifications на базе Service Workers и протокола Push API, совместимого с браузерами Chrome, Firefox и Edge. Сообщения шифруются с помощью VAPID (Voluntary Application Server Identification) для аутентификации отправителя.</p><p>Модель Pub/Sub (Publish/Subscribe) лежит в основе масштабируемых систем: издатели публикуют сообщения в топики, а подписчики (устройства) получают их асинхронно. Это позволяет обрабатывать миллионы подключений без перегрузок. WebSocket или long-polling обеспечивают постоянное соединение для минимальной задержки – часто менее 0,1 секунды.</p><p>Вызовы включают:</p><ul><li>Оффлайн-доставку: Если устройство выключено или без интернета, сообщение может потеряться; ретраи (повторные попытки) и каскадирование (переключение на альтернативные каналы) решают эту проблему.</li><li>Географические ограничения: Сервисы вроде FCM могут блокироваться в некоторых странах, требуя омниканальных подходов.</li><li>Безопасность: Уведомления с чувствительными данными (коды аутентификации) нуждаются в end-to-end шифровании, чтобы предотвратить перехват.</li><li>Пользовательский контроль: Пользователи могут отключать пуши, поэтому важно соблюдать регуляции вроде GDPR или 152-ФЗ, избегая спама.</li></ul><p>Преимущества пушей над SMS: низкая стоимость (почти нулевая для больших объемов), мгновенная доставка, поддержка мультимедиа (изображения, кнопки действий) и аналитика (открытия, клики).</p><h2>Омниканальность и лучшие практики внедрения</h2><p>Омниканальные системы объединяют несколько каналов в единую платформу, обеспечивая доставку независимо от устройства или региона. Это включает каскад: если основной канал (например, собственный WebSocket) недоступен, система переключается на FCM или APNs. Такие подходы достигают 99,9% доставки, с ретраями и мониторингом.</p><p>При выборе системы учитывайте:</p><ul><li>Масштабируемость: Поддержка высоких нагрузок, как во время пиковых событий (распродажи, новости).</li><li>Аналитика: Реал-тайм отчеты о доставке, конверсии и отказах для оптимизации кампаний.</li><li>Кастомизация: Deeplink для перехода в конкретный раздел приложения, добавление изображений, ссылок или персонализированного контента.</li><li>Интеграция: REST API и SDK для популярных фреймворков (React Native, Flutter), чтобы внедрение заняло минимум времени.</li><li>Соответствие регуляциям: Локализация данных, сертификаты безопасности (PCI DSS, ФСТЭК) для работы с финансовыми или государственными данными.</li></ul><p>Лучшие практики: сегментируйте аудиторию по поведению, тестируйте A/B-варианты сообщений, интегрируйте с CRM для персонализации. Для бизнеса в e-commerce пуши идеальны для напоминаний о корзине, в банках – для транзакций, в медиа – для новостей.</p><h2>MULTIPUSHED как пример омниканальной платформы</h2><p>В качестве примера рассмотрим российскую систему <a href="https://multipushed.ru">MULTIPUSHED</a> от МУЛЬТИФАКТОР, ориентированную на доставку уведомлений в условиях санкций и локальных требований. Она использует SaaS-модель с инфраструктурой в дата-центрах Tier3 (DataLine, Selectel, LinxCloud), защищенной от DDoS через NGENIX.</p><p>Архитектура включает Pub для приема сообщений по HTTPS API, Broker для распределения и Router для маршрутизации по каналам: собственный PUSHED, APNs, FCM, HPK, RuStore, Aurora. Sub-серверы поддерживают WebSocket Secure для онлайн-доставки, с каскадированием для оффлайн-случаев.</p><p>Процесс: устройство регистрируется, получает токен; отправитель передает сообщение Pub; система маршрутизирует и подтверждает доставку. Совместима с iOS, Android, Aurora, РОСА МОБАЙЛ, KasperskyOS и веб. SDK для Android, iOS, React Native, Flutter, Aurora и Web упрощают интеграцию.</p><p>Функции: аналитика в реальном времени, кастомизация (deeplink, изображения), глобальная доставка (включая Китай и регионы РФ). Сообщения шифруются, соответствует 152-ФЗ и PCI DSS, внесена в реестр российского ПО.</p><h2>Итоговые рекомендации</h2><p>Push-уведомления эволюционируют в сторону омниканальности, чтобы преодолевать платформенные барьеры и обеспечивать надежность. Для бизнеса это инструмент роста вовлеченности, но успех зависит от баланса между частотой и релевантностью.</p><p>При внедрении тестируйте на реальных сценариях, мониторьте метрики и адаптируйте под регуляции – это минимизирует риски и максимизирует отдачу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Большой гайд по DevOps от Tproger: инструменты, практики, автоматизация</title>
      <link>https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya</link>
      <comments>https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya</guid>
      <description><![CDATA[<p>Собрали всё, что нужно DevOps-инженеру: CI/CD, Kubernetes, серверлесс, безопасность, мониторинг и альтернативы Docker — практично и по делу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolwoj-gajd-po-devops-ot-tproger--instrumenty--praktiki--avtomatizaciya">Большой гайд по DevOps от Tproger: инструменты, практики, автоматизация</a>»</p>]]></description>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[DevSecOps]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 10 May 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали подборку наших лучших материалов для тех, кто строит пайплайны, следит за стабильностью и разворачивает сервисы в прод. Здесь — про Docker и Podman, Kubernetes, CI/CD, DevSecOps, serverless и всё, что нужно знать DevOps-инженеру в 2025 году. Сохраняйте, пригодится не раз.</p><h2>Инструменты и окружение</h2><p>Современные DevOps-инженеры без инструментов — как админ без терминала. Вот что стоит добавить в стек:</p><p><a href="https://tproger.ru/articles/top-10-instrumentov-devops--kotorye-uprostyat-vawu-zhizn-i-izbavyat-ot-nochnyh-relizov">Топ-10 инструментов DevOps, которые упростят вашу жизнь и избавят от ночных релизов </a>— Список лучших инструментов для DevOps-инженеров, которые упрощают релизы, мониторинг и CI/CD-процессы.  От логгирования до автоматизации тестов.</p><p><a href="https://tproger.ru/articles/podman-alternativa-docker">Podman: Альтернатива Docker без daemon</a> — Знакомим с Podman, инструментом, который не требует daemon, но дает весь функционал Docker.</p><p><a href="https://tproger.ru/articles/docker-hub-v-rossii---vse--gajd--kak-obojti-blokirovku">Docker Hub в России — всё? Гайд, как обойти блокировку</a> —Объясняем, как работать с Docker Hub после блокировки: альтернативы, зеркала и решения.</p><h2>CI/CD, Kubernetes и деплой</h2><p>Когда каждое изменение должно доходить до продакшена быстро и без боли — нужна хорошая сборка:</p><p><a href="https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov">Разворачиваем инструменты CI/CD: практики от DevOps-инженеров</a> — Практическое руководство по внедрению и настройке CI/CD: инструменты, примеры, лайфхаки.</p><p><a href="https://tproger.ru/articles/kubernetes-node-js-werf">Собираем и деплоим в Kubernetes приложение на Node.js с помощью werf </a>— Пошагово показываем, как собрать и развернуть приложение на Node.js в Kubernetes с помощью инструмента werf.</p><p><a href="https://tproger.ru/articles/avtomatizaciya-deploya-s-ispolzovaniem-kubernetes---tproger">Как автоматизировать деплой с использованием Kubernetes</a> — Рассказываем, как автоматизировать процесс деплоя приложений в Kubernetes: подходы, инструменты и советы.</p><p><a href="https://tproger.ru/articles/vybiraem-optimalnuyu-arhitekturu-monitoringa--ot-legkovesnogo-servisa-do-vysokonagruzhennyh-klasterov">Выбираем оптимальную архитектуру мониторинга: от легковесного сервиса до высоконагруженных кластеров </a>—Рассматриваем варианты мониторинга от минимальных решений до сложных систем, подходящих под высокие нагрузки.</p><h2>Практики и подходы</h2><p>Не только инструменты, но и культура разработки — основа DevOps:</p><p><a href="https://tproger.ru/articles/kak-stat-devops-v-2024-godu">Как стать DevOps в 2024 году</a> — Что нужно знать, какие навыки прокачивать, с чего начать.</p><p><a href="https://tproger.ru/articles/kak-avtomatizirovat-bezopasnost-s-pomoshhyu-devsecops-i-iskusstvennogo-intellekta">Как автоматизировать безопасность с помощью DevSecOps и искусственного интеллекта</a> — Объясняем, как применить DevSecOps-подход и AI для защиты приложений на всех этапах разработки.</p><p><a href="https://tproger.ru/articles/kak-serverless-tehnologii-pomogajut-snizit-nagruzku-na-razrabotchikov">Как serverless-технологии помогают снизить нагрузку на разработчиков</a> — Разбираемся, как serverless помогает ускорить разработку, упростить масштабирование и снизить поддержку инфраструктуры.</p><p>Не забывайте читать предыдущие гайды. <a href="https://tproger.ru/articles/bolwoj-gajd-po-python-ot-tproger--topovye-instrumenty-dlya-raznyh-napravlenij">Python</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильная разработка</a>, <a href="https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger">С++</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">инструменты</a>, <a href="https://tproger.ru/articles/veb-razrabotka-i-frontend--gajd-ot-tproger">фронтенд</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Веб-разработка и фронтенд: гайд от Tproger</title>
      <link>https://tproger.ru/articles/veb-razrabotka-i-frontend--gajd-ot-tproger</link>
      <comments>https://tproger.ru/articles/veb-razrabotka-i-frontend--gajd-ot-tproger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/veb-razrabotka-i-frontend--gajd-ot-tproger</guid>
      <description><![CDATA[<p>Собрали топовые материалы по веб-разработке и фронтенду. Рассказываем, что нужно знать новичкам и опытным специалистам в 2025 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/veb-razrabotka-i-frontend--gajd-ot-tproger">Веб-разработка и фронтенд: гайд от Tproger</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 09 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы заметили, что веб-разработка и фронтенд — самая популярная тематика на Tproger. И, кажется, в айти в целом. Внутри гайда — полезные материалы по стеку с множеством инструментов.</p><ol><li><a href="https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu">Топовые инструменты для фронтенд-разработки в 2025 году</a> — собрали самые полезные инструменты, которые помогут фронтендерам работать быстрее и лучше в 2025 году.</li><li><a href="https://tproger.ru/articles/reactjs-na-izi--chto-realno-nuzhno-znat-frontend-razrabotchiku-v-2025-godu">ReactJS на изи: что реально нужно знать фронтенд-разработчику в 2025 году</a> — кратко и по делу: что должен знать разработчик, работающий с React в 2025 году. Хуки, компоненты, архитектура.</li><li><a href="https://tproger.ru/articles/frontend-2024?utm_source=tproger&amp;utm_medium=pinned&amp;utm_campaign=tag&amp;utm_term=web">Что должен знать уважаемый фронтендер в 2024 году</a> — обновленный список знаний для фронтенд-разработчиков. Современные фреймворки, DevTools и подходы.</li><li><a href="https://tproger.ru/articles/frontend-razrabotka--chem-zanimayutsya-i-skolko-zarabatyvayut-specialisty">Фронтенд-разработка: чем занимаются и сколько зарабатывают специалисты</a> — Объясняем, чем занимается фронтенд-разработчик, какие бывают задачи и сколько можно зарабатывать.</li><li><a href="https://tproger.ru/articles/kak-rabotat-s-json-v-veb-razrabotke-">Как работать с JSON в веб-разработке</a> — простое объяснение JSON: как он устроен, как его использовать и почему без него не обойтись на фронтенде.</li><li><a href="https://tproger.ru/articles/kak-vybrat-ide--esli-vy-nachinayushhij-veb-razrabotchik">Как выбрать IDE, если вы начинающий веб-разработчик</a> — обзор самых удобных и популярных сред разработки для начинающих веб-разработчиков, их плюсы и минусы.</li><li><a href="https://tproger.ru/articles/kak-effektivno-optimizirovat-bolwoj-obem-dannyh-vo-frontende">Эффективные инструменты для оптимизации кода во фронтенд разработке</a> — собрали инструменты, которые помогут ускорить загрузку, уменьшить размер и повысить читаемость кода.</li><li><a href="https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu">30 самых полезных библиотек Python для веб-разработки в 2024 году</a> — лучшая подборка Python-библиотек для веба: от фреймворков до утилит. Что взять в 2025 году.</li><li><a href="https://tproger.ru/articles/na-kakom-yazyke-pisat-sajt-v-2024-godu">На каком языке писать сайт в 2024 году</a> — помогаем выбрать язык программирования под сайт в 2025 году. Сравнение по скорости, удобству и экосистеме.</li></ol><p>Предыдущие подборки лежат здесь: <a href="https://tproger.ru/articles/bolwoj-gajd-po-python-ot-tproger--topovye-instrumenty-dlya-raznyh-napravlenij">Python</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильная разработка</a>, <a href="https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger">С++</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">инструменты</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>JavaScript: большой гайд от Tproger</title>
      <link>https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger</link>
      <comments>https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger</guid>
      <description><![CDATA[<p>Гайд по JavaScript. Топовые и полезные статьи с теорией, инструментами и фреймворками. Практика для новичков и продвинутых программистов.  ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/javascript--bolwoj-gajd-ot-tproger">JavaScript: большой гайд от Tproger</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 08 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>JavaScript — база веб-разработки. На нем пишут интерактивные веб-интерфейсы, динамичные приложения и серверные фичи. В общем, на JS можно делать все — от простых скриптов до сложных экосистем. В этом гайде собрали статьи для новичков и не только, которые помогут прокачаться в JavaScript.</p><h2>База и теория</h2><ol><li><a href="https://tproger.ru/articles/event-loop-dlya-chajnikov--prostymi-slovami-o-slozhnom-mehanizme-brauzera">Event loop для чайников: простыми словами о сложном механизме браузера</a> — В статье разбираем, что такое Event Loop, очередь задач и стек вызовов. Простыми словами о том, как браузер выполняет JavaScript-код и обрабатывает события.</li><li><a href="https://tproger.ru/articles/chek-list-dlya-node-js-novichkov--obrabotka-owibok-254149">Чек-лист по Node.js для новичков: обработка ошибок</a> — Показываем основные подходы к обработке ошибок для Node.js. Рассматриваем пошаговую инструкцию и практические примеры.</li><li><a href="https://tproger.ru/articles/znaniya--kotorymi-dolzhen-obladat-javasript-razrabotchik-v-2024-godu--eto---baza">Что нужно учить JavaSript-разработчикам в 2024 году</a> — Разбираем, какие технологии и навыки нужно знать JS-разработчику, в том числе и в 2025. От фреймворков до подходов к архитектуре.</li><li><a href="https://tproger.ru/articles/deklarativnyj-javascript">Декларативные языки на примерах с JavaScript</a> — Рассказываем, что значит декларативный стиль программирования. Сравниваем с императивным на примерах JavaScript.</li><li><a href="https://tproger.ru/articles/javascript-localstorage-polnoe-rukovodstvo">JavaScript localStorage: Полное руководство</a> — Разбираем, как работает localStorage. Учим сохранять данные на клиенте с помощью JavaScript.</li><li><a href="https://tproger.ru/articles/ponimanie-strogogo-rezhima-javascript">Как работает режим strict в JavaScript</a> — Объясняем, что делает режим strict и почему он помогает писать более безопасный код на JavaScript.</li><li><a href="https://tproger.ru/articles/kak-besplatno-vyuchit-javascript-i-ne-idti-v-onlajn-wkoly">Как бесплатно выучить JavaScript и не идти в онлайн-школы</a> — Рассказываем, как самостоятельно освоить JavaScript. Бесплатные ресурсы, полезные советы и личный план обучения.</li><li><a href="https://tproger.ru/articles/kakie-js-biblioteki-ispolzovat-dlya-animacij-na-sajte-v-2024-godu">Какие JS-библиотеки использовать для анимаций на сайте в 2024 году</a> — Актуальные JavaScript-библиотеки для веб-анимации. Рассматриваем лучшие инструменты для красивых и быстрых интерфейсов.</li></ol><h2>Практикуемся</h2><ol><li><a href="https://tproger.ru/articles/10-realnyh-voprosov-s-sobesedovaniya-javascript-razrabotchika-s-otvetami-254156">10 реальных вопросов с собеседования JavaScript-разработчика с ответами</a> — Подборка реальных вопросов с собеседований для JavaScript-разработчиков. Даем ответы и объясняем, как правильно мыслить на интервью.</li><li><a href="https://tproger.ru/articles/prilozhenie-dlya-prognoza-pogody-na-vue-js">Приложение прогноза погоды с использованием Vue JS</a> — Пошаговое руководство по созданию погодного приложения на Vue.js. Обучаем взаимодействию с API и построению интерфейса.</li><li><a href="https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript">Математика в программировании: реализуем уравнения на JavaScript</a> — Объясняем, как реализовать математические уравнения на JavaScript. Практика для программистов, которые не боятся формул.</li><li><a href="https://tproger.ru/articles/regulyarnye-vyrazheniya-v-javascript-eto-ne-tak-strawno-kak-vy-dumaete">Регулярные выражения в JavaScript: разбираемся в создании</a> — Учим создавать и использовать RegExp в JavaScript. Поясняем синтаксис, паттерны и типовые ошибки.</li><li><a href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja">Решаем популярные задачи с асинхронным кодом на JavaScript: часть первая</a> — Практика асинхронного программирования на JavaScript. Решаем задачи с API, задержками и промисами.</li><li><a href="https://tproger.ru/articles/tutorial-po-javascript-async-x2f-await-izuchaem-callbacks-promises-i-async-x2f-await">Асинхронный JavaScript: изучаем Async/Await, Callbacks и Promises</a> — Учим писать асинхронный код в JavaScript: от колбэков до современного async/await. Понятно, на примерах и без лишнего.</li><li><a href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja">Задачи по асинхронному программированию на JS</a> — Упражнения на асинхронный JavaScript. От простых примеров до сложных сценариев.</li></ol><p>Предыдущие подборки лежат здесь: <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильная разработка</a>, <a href="https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger">С++</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">инструменты</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как работает React-паттерн «Составной компонент» (compound component) и для чего он нужен</title>
      <link>https://tproger.ru/articles/react-pattern--sostavnoj-komponent---compound-component-</link>
      <comments>https://tproger.ru/articles/react-pattern--sostavnoj-komponent---compound-component-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дима Державин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/react-pattern--sostavnoj-komponent---compound-component-</guid>
      <description><![CDATA[<p>Разбираем типичные проблемы при разработке компонентов. Изучаем, какие архитектурные подходы вложены в паттерн. Реализуем паттерн на примере компонента Аккордеон и смотрим на плюсы и минусы подходов</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/react-pattern--sostavnoj-komponent---compound-component-">Как работает React-паттерн «Составной компонент» (compound component) и для чего он нужен</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 05 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Создавая компоненты для дизайн-систем важно предусмотреть несколько вещей:</p><ul><li>Как безболезненно масштабировать компонент?</li><li>Как быстро и просто доставлять изменения?</li><li>Как сделать компонент устойчивым к рефакторингу?</li></ul><p>Для решения этих проблем разработчики прибегают к использованию различных паттернов проектирования. Один из таких — «Составной компонент». Сегодня рассмотрим его со всех сторон и дадим рекомендации по использованию.</p><p>Дисклеймер:</p><ul><li>Примеры кода упрощены для наглядности и могут требовать доработки под конкретные задачи.</li><li>Подходы в статье не являются универсальными, правильными или неправильными. Каждый из них решает конкретные задачи и проблемы, выбирайте подход согласно требованиям в вашем проекте.</li><li>Автор под понятием <i>дизайн-система</i> подразумевает такие вещи, как UI-кит и библиотека компонентов .</li></ul><h2>Какие проблемы помогает решить «Составной компонент»?</h2><p>При создании переиспользуемых компонентов разработчики вынуждены решать одни и те же проблемы:</p><ul><li>Как сделать строение компонента достаточно гибким, чтобы оно покрывало как можно больше вариантов использования? Если об этом не подумать — вокруг появятся вспомогательные компоненты и утилитарные функции.</li></ul><ul><li>Как сделать API компонента устойчивым к изменениям? Если об этом не подумать <i>props</i> начинают обрастать пометками <i>deprecated</i>, появляются проблемы с обратной совместимостью старых и новых <i>props</i>, а время рефакторинга и выхода новой версии неизбежно приближается.</li></ul><p><b>Важно помнить: </b>даже незначительные изменения в компоненте запускают дорогой и долгий релизный цикл, который обычно включает в себя:</p><ul><li>Создание новых тестов и обновление старых (снапшоты, скриншоты, e2e),</li><li>Обновление документации или сторибука,</li><li>Проверка изменений в реальном проекте,</li><li>Запуск CI-CD пайплайнов для доставки изменений.</li></ul><p>…и многие другие прелести продуктовой разработки.</p><p>Все эти проблемы стремится решить «Составной компонент»</p><h2>Из чего состоит «Составной компонент»?</h2><p>Компонент становится «составным» при наличии следующих свойств:</p><p><b>Есть иерархия: </b></p><ul><li>Есть главный и дочерние компоненты,</li><li>Дочерние компоненты зависят от главного.</li></ul><p><b>Есть общая логика:</b></p><ul><li>У компонентов есть общее внутреннее состояние, например: <i>открыть/закрыть компонент, выбрать вид отображения и т.п.</i></li><li>Главный компонент содержит логику управления дочерними компонентами, например: <i>выбрать активный элемент, раскрыть элементы, добавить элемент в список и т.п.</i></li></ul><p><b>Нет противоречий с основными принципами SOLID:</b></p><ul><li><b>Принцип единственной ответственности:</b> каждый дочерний компонент отвечает только за свою часть логики,</li><li><b>Инкапсуляция состояния:</b> состояние управляется родительским компонентом, но не требует явной передачи через <i>props,</i></li><li><b>Инверсии контроля:</b> пользователь свободно комбинирует дочерние компоненты, меняет их порядок, добавляет свои элементы без внесения изменений в исходный код компонента.</li></ul><h2>Как создать свой «Составной компонент»?</h2><p>Для примера сделаем компонент Аккордеона.</p><p><b>Но</b>, в начале сделаем<a href="https://codesandbox.io/p/sandbox/hardcore-goldstine-ds9kqd"> классический React-компонент</a> через props — так мы лучше поймем преимущества одного подхода и недостатки другого:</p><h3>Реализация</h3><h3>Применение</h3><p><b>Результат</b>: мы сделали классический глупый компонент, задача которого принять на вход данные, затем вернуть строго структурированный список.</p><h3>Создаём «Составной компонент»</h3><p>Теперь сделаем <a href="https://codesandbox.io/p/sandbox/hardcore-goldstine-ds9kqd">компонент на основе паттерна</a>, подробно разобрав его архитектуру. Начнём с декомпозиции компонента на составные части:</p><h3>Основной компонент</h3><p>Назначение:</p><ul><li>Управлять своим состоянием,</li><li>Выступать контроллером для дочерних компонентов, обеспечивая их согласованную работу.</li></ul><p>Во избежание props-дриллинг для передачи состояния от основного компонента к дочерним будем использовать <i>React Context API: </i></p><h3>Дочерние компоненты</h3><p>Назначение:</p><ul><li>Принимать логику, состояние и методы из главного компонента через <i>React Context API</i></li><li>Реагировать на изменение собственных <i>props</i></li></ul><h4>Функциональная обёртка</h4><ul><li>Помогает дочерним компонентам быть неконтролируемыми</li></ul><h4>Компонент заголовка</h4><ul><li>Отображает заголовок и реагирует на действия пользователя</li></ul><h4>Компонент контента</h4><ul><li>Отображает контент и реагирует на изменение состояния в ответ на действия пользователя</li></ul><p>Теперь сложим все составные части и попробуем собрать полноценный компонент:</p><h3>Что произойдет при внесении изменений в компонент?</h3><p>Теперь внесём изменения в структуру компонента, добавив новые элементы. Далее сравним сложность внесения изменений в обоих подходах:</p><h4>Добавим кнопку «Закрыть»</h4><h4>Как сработает обычный компонент</h4><p>Плюсы:</p><ul><li>Подход очевиден, прост и интуитивно понятен,</li><li>Положение кнопки «Закрыть» определяется один раз.</li></ul><p>Минусы:</p><ul><li>Местоположение компонента жестко закреплено,</li><li>Изменить лэйбл и навесить дополнительное событие можно только через создание новых <i>props</i> в основном компоненте.</li></ul><h4>Как сработает составной компонент</h4><p>Плюсы:</p><ul><li>Компонент может свободно перемещается внутри <i>Accordion.Item,</i></li><li>На компонент можно навесить любой хэндлер без изменения <i>props.</i></li></ul><p>Минусы:</p><ul><li>Свобода создания структуры компонента влечёт необходимость полностью описывать все внутренние элементы, вместо обычной передачи свойств.</li></ul><h3>Добавим компонент «Разделитель»</h3><p>Теперь попробуем изменить верстку, добавив разделитель. Также поменяем местами заголовок и контент:</p><h4>Обычный компонент</h4><p>Плюсы:</p><ul><li>Положение разделителя определяется один раз.</li></ul><p>Минусы:</p><ul><li>Изменить расположение разделителя можно только через изменение кода основного компонента.</li><li>Добавить новые свойства компоненту можно только через <i>props</i> основного компонента.</li></ul><h4>Составной компонент</h4><p>Плюсы:</p><ul><li>Положение элемента можно свободно перемещать без изменений в основном компоненте</li></ul><h2>О каких особенностях паттерна важно знать?</h2><h3>Тришейкинг</h3><p>Как только компонент становится свойством объекта — сборщик перестает считать неиспользуемые составные компоненты <b>«мертвым кодом»</b>. Следовательно, такие компоненты будут всегда попадать в конечный бандл.</p><h3>Next.JS</h3><p>Использование подхода в среде Next.JS приводит к <a href="https://github.com/vercel/next.js/issues/44030#issuecomment-1542597082">ошибке</a>. Ошибка связана с разделением компонентов внутри фреймворка на клиентские и серверные. Проблема решается указанием директивы 'use client' в начале файла там, где используются составные компоненты.</p><h2>Выводы</h2><ul><li>Паттерн приносит наибольшую пользу при разработке компонентов для дизайн-систем, где обновление компонента может быть дорогим, долгим и опасным. Использование паттерна в обычном приложении может стать излишним усложнением.</li><li>Строение компонента позволяет свободно комбинировать дочерние компоненты, изменять их порядок и добавлять новые элементы без модификации родительского кода.</li><li>Состояние и логика управления инкапсулированы в главном компоненте, это снижает сложность конечного кода, упрощает тестирование и повышает надежность компонента.</li></ul><p>Если React-компонент внутри дизайн-системы обладает сложной логикой, управляет внутренним состоянием, имеет зависимые дочерние компоненты, требует гибкости и кастомизации, то он —  хороший кандидат для реализации с использованием паттерна «Составной компонент». Примеры таких компонентов: RadioGroup, TagGroup, Select, Dropdown, Form, Tab.</p><figure><img src="https://media.tproger.ru/user-uploads/113154/2025-04-28/96ba3e61-fe63-4fa3-bf47-228baf2d0e18.jpg" alt="" /></figure><p>Кстати, если хотите узнать больше про React, недавно мы выпустили <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">подборку</a> наших материалов. Скорее смотрите!</p>]]></content:encoded>
    </item>
    <item>
      <title>Большой гайд по инструментам для разработчиков от Tproger: фреймворки, базы, AI и DevOps в одной подборке</title>
      <link>https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke</link>
      <comments>https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke</guid>
      <description><![CDATA[<p>Подборка топовых инструментов и технологий для разработчиков: от Elixir и DevOps-платформ до no-code, AI-инструментов и новых фреймворков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolwoj-gajd-po-instrumentam-dlya-razrabotchikov-ot-tproger--frejmvorki--bazy--ai-i-devops-v-odnoj-podborke">Большой гайд по инструментам для разработчиков от Tproger: фреймворки, базы, AI и DevOps в одной подборке</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 04 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы собрали для вас огромную подборку наших статей про самые полезные инструменты, технологии и практики.
Если вы хотите работать быстрее, чище и с кайфом — сохраняйте себе этот гайд, чтобы не искать потом по всему интернету. Внутри — топовые фреймворки, AI-помощники, базы данных, лайфхаки и советы от практиков.</p><h2>Основные инструменты и технологии</h2><p>Статьи, с которых стоит начать, если хочется обновить стек или разобраться в новых подходах:</p><p><a href="https://tproger.ru/articles/top-60-luchwih-instrumentov-dlya-razrabotki-po-v-2025">ТОП 60 лучших инструментов для разработки ПО в 2025</a> — Собрали шестьдесят лучших инструментов для разработки программного обеспечения в 2025 году. От трекеров и редакторов до библиотек и фреймворков.</p><p><a href="https://tproger.ru/articles/top-11-trendov--kotorye-nuzhny-ajtiwniku-v-2025-godu">Топ 11 трендов, которые нужны айтишнику в 2025 году</a> — Представляем одиннадцать ключевых трендов в IT, которые будут актуальны в 2025 году. Краткий гид по технологиям, которые будут на слуху.</p><p><a href="https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki">Фреймворки, меняющие игру: выбираем идеальный инструмент для ваших веб-проектов</a> — Обзор современных веб-фреймворков, которые могут изменить подход к разработке ваших проектов.</p><p><a href="https://tproger.ru/articles/instrumenty-i-frejmvorki-qa--kotorye--ne--nuzhno-znat">Инструменты и фреймворки QA, которые (не) нужно знать</a> — о том, что реально используется в тестировании.</p><p><a href="https://tproger.ru/articles/chto-izuchat-nachinashhemu-razrabotchiku-na-c-">Что изучать начинающему разработчику на C#</a> — рассматриваем  языки, среды и подходы, которые пригодятся новичкам. Рекомендуем, с чего начать изучение C# и какие темы освоить в первую очередь.</p><p><a href="https://tproger.ru/articles/reactjs-na-izi--chto-realno-nuzhno-znat-frontend-razrabotchiku-v-2025-godu">ReactJS на изи: что реально нужно знать фронтенд-разработчику в 2025 году</a> — Краткий гайд по ключевым знаниям и навыкам, необходимым для работы с ReactJS в 2025 году.</p><h2>Базы, API, DevOps и CI/CD</h2><p>Набор инструментов и практик, которые помогут масштабироваться и не выгорать:</p><p><a href="https://tproger.ru/articles/top-10-instrumentov-devops--kotorye-uprostyat-vawu-zhizn-i-izbavyat-ot-nochnyh-relizov">Топ-10 инструментов DevOps, которые упростят вашу жизнь и избавят от ночных релизов</a> — must-have решения для DevOps-команд.</p><p><a href="https://tproger.ru/articles/postgresql-vs--clickhouse-vs--duckdb--kakuyu-opensors-bazu-vybrat-dlya-analitiki-v-2025-godu-">PostgreSQL vs. ClickHouse vs. DuckDB: какую опенсорс базу выбрать для аналитики в 2025 году?</a> — Сравниваем три популярные опенсорс СУБД для аналитики: возможности, производительность и кейсы использования.</p><p><a href="https://tproger.ru/articles/10-api--kotorye-sokratyat-vam-nedeli-razrabotki">Семь API, которые сократят вам недели разработки</a> — Подборка решений, которые можно быстро внедрить.</p><p><a href="https://tproger.ru/articles/razvorachivaem-instrumenty-ci-cd--praktiki-ot-devops-inzhenerov">Разворачиваем инструменты CI/CD: практики от DevOps-инженеров</a> — Делимся практическими советами по развертыванию инструментов CI/CD от профессионалов.</p><p><a href="https://tproger.ru/articles/kak-avtomatizirovat-prostye-zadachi-s-pomoshhyu-skriptov-">Как автоматизировать простые задачи с помощью скриптов?</a> — Гайд по быстрой автоматизации без боли.</p><p><a href="https://tproger.ru/articles/luchwie-praktiki-dlya-raboty-s-komandnoj-strokoj">Лучшие практики для работы с командной строкой</a> — Рассказываем, что такое командная строка. Рассматриваем пошаговую инструкцию по использованию.</p><h2>AI-инструменты и нейросети</h2><p>Что может помочь вам уже сейчас — от подсказок до генерации кода:</p><p><a href="https://tproger.ru/articles/top-5-ii-instrumentov-dlya-programmistov-v-2025">Топ-5 ИИ-инструментов для программистов в 2025 году</a> — Самые полезные AI-ассистенты по мнению редакции.</p><p><a href="https://tproger.ru/articles/deepseek-ili-claude--kakaya-nejroset-napiwet-kod--za-kotoryj-ne-stydno-">DeepSeek или Claude: какая нейросеть напишет код, за который не стыдно?</a> — Сравниваем возможности нейросетей DeepSeek и Claude в контексте генерации качественного кода.</p><p><a href="https://tproger.ru/articles/edge-ai--kak-rabotayut-nejroseti-na-ustrojstvah-s-ogranichennymi-resursami">Edge AI: как работают нейросети на устройствах с ограниченными ресурсами</a> — Объясняем, как нейросети работают на устройствах с ограниченными ресурсами и где это применимо.</p><p><a href="https://tproger.ru/articles/10-sposobov-zarabotat-na-iskusstvennom-intellekte-v-2025">10 способов заработать на искусственном интеллекте в 2025</a> — Рассказываем о десяти способах монетизации искусственного интеллекта в 2025 году.</p><h2>Утилиты, лайфхаки и неожиданно полезные штуки</h2><p>То, что экономит время, силы и нервы:</p><p><a href="https://tproger.ru/articles/sobral-11-sajtov--ekonomyashhih-vremya--kotorye-nuzhny-kazhdomu-razrabotchiku">11 сайтов, экономящих время, которые нужны каждому разработчику</a> — Подборка must-have ресурсов.</p><p><a href="https://tproger.ru/articles/luchwie-biblioteki-dlya-animacij-na-react">7 библиотек для анимаций на React</a> — Обзор популярных библиотек для создания анимаций в React: от простых эффектов до сложных переходов.</p><p><a href="https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu">30 самых полезных библиотек Python для веб-разработки в 2024 году</a>  — Подборка тридцати полезных библиотек Python, которые пригодятся веб-разработчикам в 2025 году.</p><p><a href="https://tproger.ru/articles/7-programm-dlya-wifrovaniya-dannyh">7 программ для шифрования данных</a> —  Базовая кибер-гигиена для всех, кто работает с пользовательскими данными.</p><p><a href="https://tproger.ru/articles/top-samyh-poleznyh-magicheskih-komand-dlya-zavsegdataev-colab">Топ самых полезных магических команд для завсегдатаев Colab</a> — Рассказываем, как использовать магические команды в Colab, чтобы ускорить работу с данными и кодом.</p><p><a href="https://tproger.ru/articles/otkryvaem-cikl-statej-etl-dlya-zooparka-botov">5 ETL для обработки данных из Python-ботов</a> — Представляем пять ETL-инструментов, которые помогут автоматизировать сбор, трансформацию и загрузку данных от Python-ботов</p><p><a href="https://tproger.ru/articles/rabota-s-excel-gde-on-primenyaetsya-chem-polezen-i-gde-osvoit-etot-navyk-erid-ljn8klxkn">Работа с Excel: где он применяется, чем полезен и где освоить этот навык</a> — Объясняем, где и как используется Excel, почему он важен для аналитиков и где научиться работать с ним.</p><h2>Немного философии</h2><p>Когда хочется не просто выбрать инструмент, а понять, зачем он вам нужен:</p><p><a href="https://tproger.ru/articles/yazyk-elixir-i-funkcionalnoe-programmirovanie--chto-eto-za-zver-i-pochemu-on-horow-dlya-otkazoustojchivyh-sistem">Язык Elixir и функциональное программирование: что это за зверь и почему он хорош для отказоустойчивых систем</a> — Знакомим пользователей с Elixir и его применением.</p><p><a href="https://tproger.ru/articles/pochemu-mikroservisy-ne-nuzhny--antihajpovyj-razbor">Почему микросервисы не нужны: антихайповый разбор</a> — Анализируем случаи, когда микросервисная архитектура может быть излишней и неэффективной.</p><p><a href="https://tproger.ru/articles/10-luchwih-platform-dlya-sozdaniya-prilozhenij-bez-edinoj-strochki-koda">10 лучших платформ для создания приложений без единой строчки кода</a> — Обзор десяти лучших no-code платформ, позволяющих создавать приложения без программирования.</p><p>Скорее пользуйтесь нашим гайдом и читайте предыдущие. Вот, например, по <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильной разработке</a> и <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a>.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Большой гайд по React от Tproger: топовые статьи и инструменты</title>
      <link>https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty</link>
      <comments>https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty</guid>
      <description><![CDATA[<p>Гайд по реакт. Топовые статьи и инструменты. React для новичков. Делимся теорией и практическими рейсами. Tproger. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">Большой гайд по React от Tproger: топовые статьи и инструменты</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 May 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Внутри этого гайда — самые топовые статьи от Tproger, c помощью которых вы сможете прокачать свои навыки: от базовых паттернов до сложных анимаций и бэка. Сначала немного разберемся в теории, а потом — перейдем к практике и реальным проектам, которые реализовали наши читатели. Не забудьте сохранить гайд!</p><h2>Немного базы</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-05-05/08ef6c61-544e-4c5a-91dc-d0d4d3200357.jpg" alt="" /></figure><p>В этих статьях рассказываем о том, что нужно знать новичкам и не только.</p><ul><li><a href="https://tproger.ru/articles/reactjs-na-izi--chto-realno-nuzhno-znat-frontend-razrabotchiku-v-2025-godu">ReactJS на изи: что реально нужно знать фронтенд-разработчику в 2025 году</a> — помогаем новичкам войти войти и показываем опытным разработчикам, что они могли упустить.</li><li><a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-1">Какие есть паттерны в React и для чего они нужны: часть 1</a> и <a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2">Какие есть паттерны в React и для чего они нужны: часть 2</a> — здесь объясняем популярные архитектурные паттерны в React, когда и зачем их применять.</li><li><a href="https://tproger.ru/articles/luchwie-biblioteki-dlya-animacij-na-react">7 библиотек для анимаций на React / Tproger</a> — собрали актуальные библиотеки для анимации в React; сравнение, демо и рекомендации.</li><li><a href="https://tproger.ru/translations/mistakes-junior-react-developers-make">Типичные ошибки джунов, использующих React</a> — показываем типичные ошибки junior-разработчиков в React, рассказываем, как писать чище и стабильнее.</li><li><a href="https://tproger.ru/articles/podgotovka-okruzhenija-react-prilozhenija-vscode-prettier-eslint-stylelint-husky">Подготовка окружения React-приложения: VSCode, Prettier, ESLint, Stylelint, Husky</a> — рассказываем, как начать работу с приложениями на Реакте и что должно быть на рабочем столе.</li><li><a href="https://tproger.ru/articles/react-native-protiv-flutter--chto-luchwe">React Native против Flutter: что лучше</a> (для общего развития) — сравниваем популярные фреймворки для кроссплатформенной разработки; плюсы, минусы и рекомендации.</li><li><a href="https://tproger.ru/articles/deeplink-v-react-native--polnoe-rukovodstvo">Deeplink в React Native: Полное руководств для новичков</a> — рассказываем, что такое deeplink и как их писать на Реакте.</li></ul><h2>Практикуемся</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-05-05/d2d4a20e-2de7-46d4-8b4d-bbf28558d7e6.jpg" alt="" /></figure><ul><li><a href="https://tproger.ru/articles/js--dran-and-drop--delaem-podvizhnye-bloki">Современный Drag and Drop в React с помощью dndkit: создаем перетаскиваемое меню</a> — здесь о том, как сделать меню, кнопки и все с помощью dndkit.</li><li><a href="https://tproger.ru/translations/django-react-webapp">Пишем приложение с бэкендом на Django и фронтендом на React</a> — рассказываем, как создать REST API на Джанго, добавить React и объединить это в один проект.</li><li><a href="https://tproger.ru/articles/sozdanie-todo-list-beskonechnoj-vlozhennosti-react-typescript-mobx">Создание ToDo-листа бесконечной вложенности на React, TypeScript и MobX</a> — пошагово создаем вложенные задачи в ToDo-приложении, используем MobX, React и TypeScript.</li><li><a href="https://tproger.ru/articles/sozdanie-typing-test-prilozheniya-na-react-typescript-redux-toolkit">Создание Typing Test приложения на React + TypeScript + Redux Toolkit</a> — учимся создавать приложение для проверки скорости набора текста, используем Redux Toolkit.</li><li><a href="https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri">Найди ошибку в React-компоненте: Функциональное Карри</a> — практический кейс: ищем ошибку в React и заодно изучаем каррирование функций.</li><li><a href="https://tproger.ru/articles/windows-application-on-react">Создание приложений для Windows на React Native</a> — разбираем, как запускать и разрабатывать React Native-приложения под Windows, примеры и инструменты.</li><li><a href="https://tproger.ru/articles/recharts-optimization">Оптимизация графиков Recharts</a> — ускоряем отрисовку графиков на React с помощью Recharts, практика, кейсы и улучшения.</li><li><a href="https://tproger.ru/articles/your-first-app-in-react-native">Как разработать своё первое приложение на React Native</a> — инструкция по созданию первого мобильного приложения на React Native, от идеи до запуска.</li><li><a href="https://tproger.ru/articles/pet-proekt-na-react-kak-my-ozvuchivali-internet">Пет-проект на React. Как мы «озвучивали» интернет</a> — история реализации проекта с Web Speech API и React. Учим браузер говорить.</li></ul><p>Кстати, похожий гайд мы уже делали — про Python. Можно заценить <a href="https://tproger.ru/articles/bolwoj-gajd-po-python-ot-tproger--topovye-instrumenty-dlya-raznyh-napravlenij">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>AI для frontend: модели для генерации интерфейса</title>
      <link>https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa</link>
      <comments>https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa</guid>
      <description><![CDATA[<p>AI для frontend. Показываем варианты использования ИИ для интерфейса. Рассматриваем преимущества и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa">AI для frontend: модели для генерации интерфейса</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Скоро фронтендеры будут говорить: <i>«Сделай интерфейс как у Яндекса, но с нашим брендингом и функционалом из ТЗ»</i> — и получать готовый продукт. Возможно, уже через 11 минут — столько занимает прочтение статьи.</p><p>Если научиться работать с ИИ-моделями, даже начинающий разработчик сможет перепрыгнуть с уровня «кодер кнопок» до «архитектор интерфейсов».</p><p>AI — не замена разработчику, а новый хард-скилл. Те, кто осваивает нейросети, в 10 раз продуктивнее коллег, все еще верстающих каждый элемент вручную.</p><h2>Pixel perfect по запросу: как фронтендеры генерируют интерфейс в 2025 году</h2><p><i>*Дизайнер прислал макет в 23:45. Дедлайн — завтра в 10:00*</i></p><p>Знакомо? Раньше это означало ночь без сна. Но что делают ваши коллеги — просто скармливают макет нейронке и идут спать. Утром правят готовый код и укладываются даже в безумный дедлайн без вреда для здоровья.</p><h3>Что изменилось?</h3><p>AI-генерация интерфейсов становится рабочим инструментом. Можно конвертировать текст и даже рисунок от руки в готовый HTML/CSS/JS код. Без выравнивания пикселей и утомительной верстки однотипных элементов.</p><p>Вы вводите «<i>Создай карточку товара с изображением, названием, ценой и кнопкой “В корзину”</i>» — и получаете код компонента. То, что раньше занимало до 30 минут, теперь можно делать за секунды.</p><h2>3 причины делегировать рутинную работу на ИИ</h2><h3>AI-генерация компонентов</h3><p>Помните, как в 100-й раз писали карусель или модалку? Есть инструменты, которым достаточно описания результата — нейросеть сгенерирует компонент с нуля.</p><p><a href="https://tproger.ru/articles/gajd-po-rabote-s-github-copilot">GitHub Copilot</a>, Anthropic Claude и <a href="https://tproger.ru/flurry/86">AI-плагины для VSCode</a> превращают текстовый запрос в рабочий интерфейс. Причем не просто работающий, а соблюдающий ваши стандарты оформления кода.</p><h3>Адаптив на автопилоте</h3><p>Дебаг мобильной верстки не доставляет удовольствие?</p><p>Можно обратиться к ИИ — нейросеть генерирует базовый интерфейс и сразу продумывает адаптив (если попросить об этом). Вместо десятков медиа-запросов — функция, которая преобразует ваш многоколоночный интерфейс в мобильную версию.</p><h3>Дизайнер с «Глазом Бога»</h3><p><i>«Кажется, кнопка должна быть правее»</i> — нет, ИИ выдает конкретные рекомендации.</p><p>Например:</p><p><i>«При ширине экрана 375px карточки товаров перекрывают друг друга на 12px. Причина: отрицательный margin в классе .product-card, который не учитывает падение грида на мобильных устройствах»</i>.</p><p>ИИ анализирует верстку и сравнивает ее с лучшими практиками UI/UX. Еще нейронка «видит» проблемы, которые не заметны до первых жалоб на баг.</p><h2>Популярные модели и технологии</h2><h3>GPT, Claude и Gemini</h3><p>Нейросети последних версий при четкой постановке задачи сразу пишут хороший код. В 2025 году это относится ко всем популярным моделям.</p><p>О том, как правильно составлять запросы для ИИ, рассказывали в статье «<a href="https://tproger.ru/articles/prodvinutyj-promting-v-chatgpt--20-luchwih-zaprosov-k-nejroseti-dlya-programmista">Продвинутый промтинг в ChatGPT</a>».</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/a79a63d8-acf3-4d6d-9598-81f15bbd327e.png" alt="" /><figcaption>Функция Artifacts в моделях Claude отображает результат выполнения кода</figcaption></figure><p>На качество кода влияет выбор между «тяжелыми» и «легкими» версиями.</p><p>Например, GPT-4o генерирует код лучше, чем Claude 3, но обходится значительно дороже.</p><p>Релизы свежих версий ИИ сопровождаются отчетами с бенчмарками. На 100% доверять этой информации не стоит — если в тестах нейросеть показала хороший результат, не факт, что она эффективна в реальных условиях.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/661b0cad-ac80-43be-8031-9868647298cc.jpg" alt="" /><figcaption>В апреле 2025 года лидирует Gemini 2.5 Pro, GPT o3 и GPT-4o</figcaption></figure><p>Если нужно сравнить несколько моделей, но времени на самостоятельные тесты нет, обратите внимание на <a href="https://huggingface.co/spaces/lmarena-ai/chatbot-arena-leaderboard">Arena Leaderboard</a>. Этот рейтинг имеет хорошую репутацию в профессиональных кругах. Люди делают одинаковые запросы двум нейросетям и сравнивают ответы. Рейтинг формируется на основе оценок от реальных пользователей.</p><h3>GPT-Engineer, Smol Developer</h3><p>Если ChatGPT действует как советчик, то GPT-Engineer и Smol Developer участвуют как полноценные члены команды.</p><p><a href="https://github.com/AntonOsika/gpt-engineer">GPT-Engineer</a> трансформирует текстовое описание в готовый проект. Разработчику достаточно сформулировать задачу — AI создаст структуру проекта с файлами, настроит окружение и сгенерирует код.</p><p><a href="https://github.com/smol-ai/developer">Smol Developer</a> предлагает иной подход — персонального AI-разработчика. С аудиторией более 10,000 пользователей на GitHub, этот инструмент отличается интуитивным интерфейсом и поддержкой E2B SDK.</p><h3>No-code/Low-code платформы</h3><p><a href="https://uizard.io/">Uizard</a> превращает идею в интерактивный прототип быстрее, чем команда дизайнеров набрасывает первые эскизы. За 7 лет инструмент эволюционировал в no-code платформу для создания UI/UX без дизайнерского бэкграунда.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/365d5c33-b4d3-40a5-b5ac-9085cdb10132.png" alt="" /><figcaption>Пример, как Uizard по эскизу создает интерфейс страницы входа</figcaption></figure><p>Ключевые функции:</p><ul><li><b>Автодизайнер 2.0</b> — генерирует многоэкранные интерфейсы по текстовому описанию.</li><li><b>Дизайн по эскизу</b> — сфотографируйте рисунок с салфетки, и Uizard трансформирует его в редактируемый прототип.</li><li><b>Клонирование интерфейсов</b> — загрузите скриншот существующего сайта, и AI превратит его в настраиваемый макет, сохранив структуру и компоновку.</li><li><b>Экспорт в PNG, PDF</b> и генерация AI базового React-кода (требует доработки).</li></ul><p><a href="https://www.locofy.ai/">Locofy</a> пригодится на следующем шаге после создания дизайна — превращении макетов в рабочий код.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/89612cd0-29a4-4737-879c-225cd1f4a7b2.jpg" alt="" /></figure><p>Преимущества:</p><ul><li>Генерация кода для React, Angular, Vue.js и других фреймворков.</li><li>Распознавание кнопки, поля ввода, слайдеры для создания динамического элемента.</li><li>Платформа анализирует дизайн и автоматически добавляет медиа-запросы.</li></ul><p>Связка Uizard + Locofy формирует конвейер от идеи до кода:</p><ol><li>Создание прототипа в Uizard по текстовому описанию или наброску.</li><li>Экспорт в Figma для детальной проработки.</li><li>Преобразование в код через Locofy.</li><li>Доработка и интеграция с бэкендом.</li></ol><p><b>Бесплатные тарифы позволяют оценить возможности платформ, но для полноценного использования в работе потребуется платная подписка — от 12$ в месяц.</b></p><h3>AI-плагины в Figma</h3><p>Фигма преобразилась с появлением AI-плагинов. В <a href="https://www.figma.com/community/development">коллекции</a> десятки дополнений на базе нейросетей.</p><p><a href="https://www.figma.com/ai/">AI Design by Figma</a> — официальный ИИ-помощник для генерации интерфейсов, встроенный прямо в редактор.</p><p>Функционал:</p><ul><li>Создание элементов по текстовому описанию.</li><li>Генерация нескольких вариаций компонентов.</li><li>Трансформация простых фигур в иллюстрации.</li><li>Предложение альтернативных цветовых решений.</li></ul><p>Достаточно выбрать элемент и ввести запрос: «Создай версию этой кнопки для темного режима» — плагин мгновенно предложит новый дизайн, сохраняя пропорции и структуру.</p><p>Режим <b>AutoLayout </b>автоматизирует верстку элементов. Функция анализирует расположение объектов и предлагает наиболее логичную систему компоновки.</p><p>Еще в Фигме есть интеллектуальное определение отступов между элементами, создание адаптивных сеток на основе расположения компонентов, оптимизация приложения для различных разрешений экрана и автоматическое выравнивание элементов интерфейса.</p><h2>Путь от запроса к интерфейсу: этапы работы с AI</h2><h3>Шаг 1: Формулировка промпта</h3><p>Качество сгенерированного интерфейса зависит от точности запроса. ИИ-модели считывают структурированные инструкции лучше, чем набор общих фраз.</p><p>Вместо размытого «Сделай хедер» лучше попросить «Создай адаптивный хедер с логотипом слева, навигационным меню по центру и кнопкой авторизации справа».</p><h3>Шаг 2: Генерация кода</h3><p>ИИ превращает текст в код, анализируя миллиарды строк из репозиториев и документации. Процесс включает:</p><ul><li>Разбор запроса на технические требования.</li><li>Определение структуры компонента/интерфейса.</li><li>Генерацию HTML/JSX элементов.</li><li>Формирование стилей и интерактивных элементов.</li><li>Оптимизацию согласно паттернам.</li></ul><p>Стандартный запрос для генерации компонента пользовательского интерфейса занимает 3-15 секунд.</p><h3>Шаг 3: Визуализация и проверка</h3><p>AI-инструменты позволяют мгновенно увидеть результат без настройки окружения. Ваш запрос трансформируется в код, который тут же визуализируется.</p><p>Варианты визуализации:</p><ul><li>Встроенные рендереры в IDE (VS Code + GitHub Copilot).</li><li>AI-платформы с предпросмотром (V0, Figma Dev Mode).</li><li>Локальные песочницы (CodeSandbox, StackBlitz).</li></ul><h3>Шаг 4: Человеческая доработка — финальный штрих</h3><p>Современный AI генерирует лишь скелет приложения. Оживлять его приходится разработчику.</p><p>Типичные улучшения:</p><ul><li>Добавление проверок на доступность (ARIA-атрибуты).</li><li>Оптимизация производительности (lazy loading).</li><li>Интеграция с реальными данными и API.</li></ul><p>Стоит отметить, что ИИ успешно генерирует компоненты для React-приложения, включая:</p><ul><li>Функциональные компоненты с хуками.</li><li>Context API для хранения состояния.</li><li>Мемоизацию через useMemo/useCallback.</li></ul><p>Генерация для Vue отлично работает с Composition API. ИИ автоматически применяет ref и reactive для состояния, computed для производных значений и методы для обработчиков.</p><p>В процессе создания UI с помощью ИИ не обойтись без проверки качества полученного результата. Тестировать сгенерированное веб-приложение приходится в несколько подходов:</p><ul><li>Визуальный просмотр — проверка соответствия дизайна требованиям и ожиданиям пользователя.</li><li>Кросс-браузерная совместимость — тестирование работы интерфейса в различных браузерах и устройствах.</li><li>Проверка доступности — оценка соответствия стандартам WCAG для обеспечения доступности для всех пользователей.</li><li>Валидация HTML/CSS/JS — использование линтеров и валидаторов для проверки качества кода.</li><li>Юзабилити-тестирование (E2E) — оценка удобства использования интерфейса реальными пользователями.</li></ul><h2>Плюсы и минусы AI для генерации пользовательского интерфейса</h2><h3>Подводные камни</h3><p>— <b>Непонимание бизнес-контекста</b>. ИИ не проводит интервью с пользователями и не знает специфику бизнеса. Результат: функционально корректный интерфейс приложения, но бесполезный для конкретного случая.</p><p>— <b>Шаблонность</b>. ИИ тяготеет к стандартным решениям. Бесполезно пытать нейросеть запросами по типу «нужен уникальный и креативный дизайн». В ответ вы получите очередной шаблон.</p><p>— <b>Усредненный UX вместо продуманного</b>. ИИ ориентируется на паттерны, которыми был обучен. Результат часто напоминает интерфейс из 2021 года без учета новейших трендов в UX.</p><p>— <b>Зависимость от контекста</b>. Чем сложнее и нестандартнее требование, тем выше шанс, что ИИ не справится с задачей.</p><p>— <b>Переоптимизм</b>. Когда люди обращаются к ИИ, то ожидают идеальный результат с первой попытки. К сожалению, так не бывает.</p><p>— <b>Слабая интерактивность</b>. ИИ отлично генерирует статические интерфейсы, но с созданием динамических структур справляется на троечку.</p><h3>Преимущества AI frontend</h3><p>— <b>Быстрое прототипирование</b>. ИИ выдает рабочий код за секунды. Полноценный скелет интерфейса появляется по первому запросу: «Создай страницу профиля пользователя с аватаром, статистикой активности и настройками».</p><p>— <b>Улучшения на ходу</b>. ИИ вносит изменения мгновенно. Разработчик лишь направляет процесс.</p><p>— <b>Поддержка компонентного подхода</b>. ИИ генерирует компоненты, соответствующие архитектурным паттернам.</p><p>— <b>Дизайн-варианты с A/B-тестированием</b>. Тестирование гипотез ускоряется в несколько раз. Запрашивайте несколько вариантов UI без дополнительных затрат.</p><h2>Кейсы и примеры: что реальные разработчики говорят про ИИ</h2><p>Согласно исследованию Cloud.ru, 62% российских IT-специалистов доверяют AI как коллеге. Российские разработчики активно интегрируют ИИ в рабочие процессы — 73% используют его для работы с кодом, а 39% применяют ежедневно.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/d25fb733-5dd5-4750-ac7f-62f9ad03c05d.jpg" alt="" /><figcaption>Популярность ИИ среди айтишников в зависимости от должности и профессии. Чаще всего к нейросетям обращаются мидлы и джуны</figcaption></figure><blockquote><b>Сегодня AI-сервисы окружают нас повсюду: помогают анализировать информацию, управлять бизнесом, разрабатывать новые программные продукты и просто решать повседневные задачи.</b></blockquote><p><i>Рассмотрим три популярных сценария применения ИИ во frontend-разработке.</i></p><h3>1. Создание панели администратора за 5 минут</h3><p>AI-ассистенты значительно ускоряют разработку типовых интерфейсов. Опишите требуемые функции админ-панели (управление пользователями, статистика, редактирование контента), и нейросеть сгенерирует базовую структуру, HTML-разметку и CSS-стили.</p><h3>2. Быстрое создание дизайна лендинга по описанию продукта</h3><p>ИИ трансформирует текстовое описание продукта в макеты лендингов. Разработчику нужно лишь загрузить информацию о продукте, целевой аудитории и желаемом стиле.</p><h3>3. Адаптация UI под разные разрешения и аудитории</h3><p>Нейросеть упрощает создание адаптивных интерфейсов и персонализацию UX для различных пользовательских сегментов.</p><p>Интересно, что 46% разработчиков отдают предпочтение именно российским AI-сервисам, что говорит о росте доверия к отечественным ИИ-решениям. Еще исследование Cloud.ru выявило, что в 70% вакансий работодатели упоминают навык владения AI-инструментами.</p><h2>Будущее AI во frontend-разработке</h2><p>AI-модели научатся распознавать не только элементы интерфейса, но и закономерности пользовательского поведения. Разработчик будет задавать направление: «Переработай эту форму для увеличения конверсии», а нейросеть проанализирует существующие данные и предложит несколько вариантов решения.</p><p>Финальная стадия эволюции — создание интерфейсов без интерфейса проектирования.</p><p>Вместо визуальных редакторов появятся системы, где разработчик описывает желаемый результат абстрактно, а ИИ выбирает оптимальную реализацию на основе данных о пользователе, устройстве и контексте.</p><p><b>Вопрос не в том, заменит ли ИИ фронтендеров, а в том, заменят ли фронтендеры с ИИ тех, кто продолжает работать по старинке.</b></p><p>Кстати, забрать все самые топовые нейронки для айтишников можно в нашем большом <a href="https://tprg.ru/LN8a">гайде с 70+ ИИ-инструментами</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Паттерны в React: насколько ты в теме?</title>
      <link>https://tproger.ru/quiz/patterny-v-react--naskolko-ty-v-teme-</link>
      <comments>https://tproger.ru/quiz/patterny-v-react--naskolko-ty-v-teme-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/patterny-v-react--naskolko-ty-v-teme-</guid>
      <description><![CDATA[<p>React — практически самостоятельный язык программирования. Готов проверить, хорошо ли ты знаешь паттерны?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/patterny-v-react--naskolko-ty-v-teme-">Паттерны в React: насколько ты в теме?</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 20 Apr 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>На прошлой неделе у нас вышли две статьи:</p><ol><li><a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-1">Какие есть паттерны в React и для чего они нужны: часть 1</a></li><li><a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2">Какие есть паттерны в React и для чего они нужны: часть 2</a></li></ol><p>Мы решили сделать небольшой квиз по этим паттернам, чтобы вы могли закрепить новые (или старые) знания. Справитесь?</p>]]></content:encoded>
    </item>
    <item>
      <title>От идеи к успеху: как создать популярное мобильное приложение</title>
      <link>https://tproger.ru/articles/ot-idei-k-uspehu--kak-sozdat-populyarnoe-mobilnoe-prilozhenie</link>
      <comments>https://tproger.ru/articles/ot-idei-k-uspehu--kak-sozdat-populyarnoe-mobilnoe-prilozhenie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ot-idei-k-uspehu--kak-sozdat-populyarnoe-mobilnoe-prilozhenie</guid>
      <description><![CDATA[<p>Кирилл Васильев, руководитель кластера кросс-функциональных команд в RuStore, рассказывает, как создать популярное приложение.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ot-idei-k-uspehu--kak-sozdat-populyarnoe-mobilnoe-prilozhenie">От идеи к успеху: как создать популярное мобильное приложение</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Социальные сети]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[App Store]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Google Analytics]]></category>
      <category><![CDATA[Xcode]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Firebase]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 18 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Создание и продвижение мобильного приложения — это путь, который требует грамотного подхода на каждом этапе. Как разработать идею, выбрать функционал и сделать продукт удобным? Какие инструменты продвижения эффективны в цифровом мире? В этой статье Кирилл Васильев, руководитель кластера кросс-функциональных команд в RuStore, разобрал весь процесс: от идеи до привлечения тысяч пользователей.</p><h2>Определяем цель</h2><p>Успех приложения начинается с четкого понимания, зачем оно нужно — так становится проще определить целевую аудиторию. Это влияет не только на функционал, но и на дизайн, способы продвижения и даже тон общения с пользователями.</p><p>Некоторые программы помогают развивать существующий бизнес — как это делают банковские сервисы, которые упрощают работу с клиентами. Другие становятся самостоятельными продуктами, например, для обучения, занятий спортом или развлечений.</p><p>Кроме того, приложение должно решать реальные проблемы пользователей. Допустим, вы задумали создать программу для фрилансеров. Решили провести исследование, и оно показало, что фрилансеры часто страдают от прокрастинации и ненавидят заниматься выставлением счетов клиентам. Ваша идея и главная фишка — приложение, которое автоматизирует процесс оплаты, контролирует сроки выполнения проектов и помогает планировать рабочее время.</p><p>Чтобы убедиться, что идея действительно рабочая, проведите опросы в Telegram-каналах фрилансеров или создайте анкету. Вы можете спросить, какие функции для них наиболее актуальны: автоматический расчет налогов, интеграция с платежными системами или отслеживание времени работы. Это поможет сфокусироваться на действительно важных фичах и отсеять второстепенные.</p><h2>Выбираем платформу и инструменты</h2><p>Сегодня на российском рынке <a href="https://lenta.ru/articles/2025/03/12/luchshie-smartfony-na-android/">доминируют</a> две мобильные операционные системы: Android (около 70% пользователей) и iOS (около 30%). Оптимальным решением будет разработка приложения для обеих платформ, особенно если вы ориентируетесь на крупные города, где доля пользователей iOS существенно выше.</p><p>Приложения под Android большинство разработчиков пишет на Kotlin, хотя Java до сих пор остается одним из вариантов из-за обширной базы готовых решений и библиотек. Основной средой выступает Android Studio — в ней есть весь необходимый инструментарий для создания, отладки и тестирования приложений. Современные разработчики активно используют Jetpack Compose для построения пользовательского интерфейса, Room для работы с базами данных, Retrofit для сетевых запросов и Dagger или Hilt для внедрения зависимостей.</p><p>В мире iOS основным языком программирования стал Swift — современный и безопасный инструмент для нативных приложений. Разработка ведется в среде Xcode, официальной IDE от Apple. Для построения интерфейсов все чаще используется SwiftUI, для управления данными — Core Data, а для сетевого взаимодействия — фреймворк Alamofire. Работа с асинхронными событиями упрощается с помощью фреймворка Combine.</p><p>При ограниченных ресурсах можно рассмотреть кросс-платформенную разработку. Так, Flutter использует язык программирования Dart и позволяет создавать производительные приложения с нативным внешним видом. React Native дает возможность применять веб-технологии для мобильной разработки, а Xamarin ориентирован на разработчиков, привыкших к экосистеме Microsoft и языку C#.</p><p>Выбор платформы и инструментов должен основываться на характеристиках вашей ЦА, требованиях к функционалу и имеющихся ресурсах. Учитывайте также, что для разных магазинов приложений (RuStore, App Store, Google Play) могут потребоваться специфические оптимизации и настройки.</p><h2>Продумываем функционал</h2><p>При разработке функционала важно следовать концепции MVP (Minimum Viable Product) — минимально жизнеспособного продукта. Это позволит быстрее выйти на рынок, получить обратную связь и итеративно улучшить приложение.</p><p>Возьмем для примера приложение доставки еды. В этом случае MVP должен включать:</p><ul><li>авторизацию пользователя через телефон, email или социальные сети;</li><li>каталог ресторанов с фильтрацией по кухне, рейтингу и времени доставки; меню каждого заведения с фотографиями и описанием блюд;</li><li>корзину с возможностью изменения состава заказа;</li><li>оформление заказа с выбором адреса доставки и способа оплаты;</li><li>отслеживание статуса заказа в реальном времени;</li><li>профиль пользователя с историей заказов.</li></ul><p>Важно уделить внимание и техническим аспектам функционала:</p><ul><li>Локальное кэширование данных. Поддерживает работу приложения при слабом интернет-соединении или его отсутствии. Сохраняет каталоги, популярные позиции и историю действий пользователя.</li><li>Офлайн-режим. Определяет набор функций, доступных без подключения к сети. Критически важен для удержания пользователей в зонах с плохим интернетом.</li><li>Система пуш-уведомлений. Информирует пользователей о важных событиях, статусах заказов и специальных предложениях. Повышает вовлеченность и возвращаемость в приложение.</li><li>Многопоточная обработка. Выполняет ресурсоемкие операции в фоновом режиме. Гарантирует отзывчивость интерфейса даже при выполнении сложных задач.</li><li>Оптимизация изображений. Внедряет алгоритмы сжатия для быстрой загрузки визуального контента. Обеспечивает комфортное использование даже при ограниченной скорости соединения.</li></ul><p>При этом разработчики часто допускают ошибки, и одна из самых распространенных — функциональная перегруженность. Не стоит добавлять AR-анимации, игровые механики и другие «модные» функции, если они не решают реальных проблем клиентов.</p><p>Также многие игнорируют обратную связь пользователей, хотя механизмы ее сбора стоит включать уже в MVP. Недостаточное внимание к безопасности может стать критичным для приложений с личными данными и платежами. А отсутствие встроенных инструментов аналитики затрудняет понимание того, как пользователи взаимодействуют с программой.</p><p>Выбор правильной архитектуры — это фундамент, который определяет надежность, масштабируемость и удобство поддержки. Вот основные паттерны для мобильных приложений:</p><ul><li>MVVM — рекомендуемый Google подход с разделением UI и бизнес-логики</li><li>MVI — однонаправленный поток данных, хорошо сочетается с реактивным программированием</li><li>MVP — классическая архитектура. Популярна благодаря простоте реализации</li><li>Clean Architecture — многослойный подход с упором на тестируемость и гибкость</li><li>VIPER (iOS) — расширенный MVC со строгим разделением ответственности</li></ul><p>Важное значение имеет также выбор технологий для хранения и передачи данных. Для локальной работы подойдут SQLite + Room, Realm или DataStore; для сетевого взаимодействия на Android чаще всего используют Retrofit + OkHttp, а в реактивных сценариях — Ktor Client.</p><p>Правильный выбор архитектуры напрямую зависит от масштаба проекта и размера команды. Небольшие приложения могут обойтись простыми решениями, тогда как сложные продукты требуют комплексного подхода с продуманным разделением ответственности.</p><h2>Создаем удобный интерфейс</h2><p>Интерфейс — это лицо приложения. Даже если у вас отличный функционал, но пользоваться им неудобно, людям будет проще удалить программу и найти что-то другое.</p><p>Эффективный UI/UX строится на пяти ключевых принципах:</p><ol><li>Очевидность (интуитивное понимание интерфейса);</li><li>Экономия внимания (минимум шагов для достижения цели);</li><li>Консистентность (единообразие элементов с одинаковой функциональностью);</li><li>Обратная связь (видимый результат каждого действия);</li><li>Прощение ошибок (возможность отмены операций).</li></ol><p>Современные инструменты значительно ускоряют создание качественных интерфейсов. Дизайнеры используют Figma, Adobe XD и Sketch для прототипирования. Android-разработчики предпочитают Jetpack Compose и Material Design Components. Для iOS актуальны SwiftUI, UIKit и Human Interface Guidelines от Apple.</p><p>Наглядный пример различий между хорошим и плохим интерфейсом — приложения для доставки еды. В удачном решении ключевые элементы находятся в зоне комфортного доступа, процесс заказа разбит на логические шаги с индикацией прогресса, а дизайн адаптируется к условиям использования. В неудачном — мелкие тесно расположенные кнопки, длинные формы без разбивки на шаги и непонятная навигация.</p><h2>Проводим тестирование</h2><p>Юзабилити-тесты с фокус-группами, A/B-тестирование элементов и аналитика пользовательского поведения дают объективную картину взаимодействия клиентов с приложением.</p><p>Комплексное тестирование включает два основных направления:</p><ol><li>Автоматизированное тестирование: unit-тесты (JUnit, XCTest) для проверки отдельных компонентов; интеграционные тесты для проверки взаимодействия между модулями; UI-тесты (Espresso, XCUITest) для проверки интерфейса; end-to-end тесты для имитации полного пользовательского сценария.</li><li>Ручное тестирование: функциональное (соответствие требованиям), тестирование производительности (работа под нагрузкой), юзабилити (оценка удобства), кросс-платформенное тестирование (проверка на разных устройствах) и тестирование подключений (поведение при различном качестве интернет-соединения).</li></ol><p>Для этого используют специализированные инструменты: Firebase Test Lab для запуска тестов на множестве устройств, Crashlytics для мониторинга сбоев, Android Profiler и Xcode Instruments для анализа производительности. А Accessibility Scanner помогает адаптировать интерфейс для людей с ограниченными возможностями, расширяя потенциальную аудиторию.</p><h2>Публикуем приложение</h2><p>После тестирования и исправления проблем наступает ответственный момент публикации. Каждый магазин приложений имеет свои особенности процесса:</p><ul><li>Google Play: создание аккаунта разработчика ($25 единоразово); подготовка материалов (иконка, скриншоты, видео, описание); загрузка APK/App Bundle; заполнение формы оценки контента; настройка дистрибуции и ценообразования; ожидание проверки (до 2 дней).</li><li>App Store: регистрация в Apple Developer Program ($99/год); создание записи в App Store Connect; подготовка маркетинговых материалов; загрузка сборки из Xcode; заполнение информации о возрастных ограничениях; ожидание рассмотрения (1-7 дней).</li><li>RuStore: бесплатное создание аккаунта; подготовка материалов; загрузка APK; заполнение метаданных; быстрая модерация (до часа).</li></ul><p>Перед публикацией важно убедиться в соответствии приложения правилам магазина, подготовить политику конфиденциальности и настроить аналитику для мониторинга производительности с первого дня.</p><h2>Поддерживаем и обновляем</h2><p>После выпуска начинается непрерывный процесс поддержки и совершенствования продукта. Разработчики регулярно исправляют найденные ошибки, добавляют новые функции и улучшают работу уже существующих.</p><p>Для эффективного мониторинга используют комплексные аналитические инструменты: Firebase Crashlytics для отслеживания сбоев, Firebase Analytics/Google Analytics для анализа пользовательского поведения, RuStore Remote Config — бесплатный аналог  Firebase, Mixpanel для углубленного анализа пользовательских путей, AppMetrica от Яндекса как комплексное решение для российского рынка.</p><p>Автоматизация процессов разработки критически важна для регулярных релизов. CI/CD-системы (GitHub Actions, GitLab CI, Bitrise, Fastlane) позволяют автоматизировать сборку, тестирование и публикацию обновлений, значительно сокращая время выхода новых версий.</p><p>Оптимальная стратегия обновлений включает регулярный график релизов (каждые 2-4 недели) с четким приоритетом задач: критические исправления, новые функции, оптимизация производительности. В тренде современной разработки: персонализация на основе ИИ, многофункциональные суперапп-решения, адаптация под новые форм-факторы устройств и повышенное внимание к приватности данных.</p><h2>Продвигаем приложение</h2><p>На рынке огромная конкуренция, и без активного продвижения ваш продукт просто затеряется среди тысяч других программ. Важную роль здесь играет ASO (App Store Optimization) — оптимизация для магазина приложений. В некоторых случаях был <a href="https://www.businessofapps.com/marketplace/app-store-optimization/research/app-store-optimization-strategies/">зафиксирован</a> рост установок до 70% благодаря сильным ASO-стратегиям.</p><p>Для Android-приложений это означает настройку страницы так, чтобы пользователи легко находили ваш продукт. Здесь важно правильно подобрать ключевые слова для описания, создать привлекательную иконку и подготовить качественные скриншоты. Чтобы понять, какое оформление работает лучше, разработчики всё чаще используют A/B-тесты — такая возможность есть, например, в RuStore. Она позволяет сравнить разные версии карточки приложения и выбрать ту, которая эффективнее привлекает пользователей.</p><p>Также разработчики могут использовать как бесплатные, так и платные форматы продвижения. Один из бесплатных форматов — фичеринг, когда редакция размещает приложение в подборках, разделах или на главной странице магазина. Платное же продвижение позволяет настраивать таргетинг по демографии, географии, интересам, ключевым фразам и устройствам, а также запускать кампании прямо в поисковой выдаче магазина.</p><p>Еще один инструмент для продвижения приложений — социальные сети. Здесь можно показывать функционал программы, общаться с пользователями, отвечать на их вопросы и рассказывать о новых опциях. Это помогает создать активное сообщество вокруг продукта. Так, к примеру, В 2023 году компания Geozilla, разработчик приложения для отслеживания местоположения близких, провела кампанию по продвижению с инфлюенсерами в социальных сетях. В рамках сотрудничества удалось собрать более 1 миллиона просмотров, а коэффициент конверсии из кликов в установки приложения составил 24%.</p><p>Партнерские программы и рекламные кампании тоже сильно влияют на привлечение новых пользователей. Нельзя забывать и о работе с отзывами — нужно активно отвечать на комментарии и решать проблемы, о которых пишут люди.</p><p>Собственный сайт или блог разработчика тоже может привлечь внимание к приложению, особенно если у вас уже есть известный бренд.</p><h2>Подводим итоги</h2><p>Создание успешного приложения начинается с четкого определения цели и понимания потребностей пользователей. Затем нужно выбрать подходящие технологии, продумать необходимые функции, спланировать архитектуру и разработать понятный интерфейс. Обязательно проведите тщательное тестирование перед запуском. После публикации важно регулярно обновлять приложение на основе отзывов пользователей и данных аналитики, а также активно продвигать его в магазинах приложений и социальных сетях.</p><p>Не гонитесь за модными технологиями ради технологий — сосредоточьтесь на том, что действительно нужно вашим пользователям. Если вы создадите действительно полезный и удобный продукт, он найдет свою аудиторию и станет успешным.</p><p>iOS или Android? React Native или Flutter? Собираем все новости и гайды по мобильной разработке <a href="https://t.me/+Fb6_4ek5P6gzOTcy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие есть паттерны в React и для чего они нужны: часть 2</title>
      <link>https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2</link>
      <comments>https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Юсуп Изрипов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2</guid>
      <description><![CDATA[<p>В этой части Юсуп Изрипов рассказывает, что такое хуки и кастомные хуки, а также про Compound Components и Серверные компоненты и Suspense.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2">Какие есть паттерны в React и для чего они нужны: часть 2</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Apr 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Меня зовут Юсуп Изрипов, я сеньор разработчик в VK. Работаю над продуктами, которыми ежедневно пользуются миллионы человек. В этой части поговорим о том, как и когда использовать хуки и почему серверные компоненты — настоящая революция.</p><p>Ниже — оставшиеся три паттерна, которые мы не разобрали в прошлой <a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-1">статье</a>.</p><h2>Хуки и кастомные хуки</h2><p>Мы уже несколько раз упоминали хуки (Hooks) — пора поговорить о них как о новом паттерне, фактически пришедшем на смену многим предыдущим. Хуки появились в React 16.8 и моментально изменили стиль написания компонентов. Теперь вместо классов с методами жизненного цикла у нас функциональные компоненты, которые используют состояния (useState), эффекты (useEffect) и другие возможности прямо внутри функции. А главное — мы можем писать свои собственные, пользовательские хуки (custom hooks) для повторного использования логики.</p><p>Почему же хуки так популярны? Они дают возможность переиспользовать состояние и побочные эффекты, не меняя структуру самих компонентов. Раньше, чтобы два компонента разделяли какую-то логику, приходилось применять HOC или Render Props — то есть вводить дополнительный компонент-обёртку или коллбэк. Теперь же мы можем вынести логику в custom hook useSomething() и вызвать его в нужных нам компонентах или других кастомных хуках. Получается, что хуки позволяют писать более прямолинейный, читаемый код: вместо закулисной магии HOC мы явно вызываем необходимые нам хуки и получаем данные.</p><p>Custom hook — это просто функция, название которой по соглашению начинается с use (чтобы линтер React знал, что внутри неё могут быть хуки). Например, давайте перепишем наш HOC withCounter из предыдущего примера как кастомный хук:</p><p>Получилось то же самое поведение (счётчик кликов), но без обёрток. Компонент ClickButton сам вызывает useCounter() и получает count и increment. Внутри useCounter может быть любая другая сложная логика, побочные эффекты, вызовы других хуков — компонент, использующий наш хук, об этом не знает и не должен знать. Зато код компонента предельно ясный: он просто берёт нужные ему данные из хука и использует их.</p><p>Повторное использование логики — главное преимущество кастомных хуков. Вы можете написать, например, хук useFetch(url) (достаточно распространённое решение), который будет обращаться к API и возвращать состояние загрузки, успеха запроса, данные и ошибки. Далее можно применять этот хук в разных компонентах, страницах, не дублируя сам код запроса.</p><p>Кроме того, хуки отлично работают друг с другом. Вы можете внутри одного хука вызвать другой (например, использовать useContext или useReducer внутри своего useAuth хука). Это помогает облегчить написание сложных функциональностей, так как мы используем небольшие хуки, выполняющие простые задачи, из которых как конструктор составляем более сложное поведение.</p><p>Плюсы: ясность и лаконичность. Мы не оборачиваем компонент, использующий хук, ни в какие лишние слои, его JSX не замусорен вспомогательными функциями или компонентами, он просто вызывает хук и получает результаты. HOC и Render Props во многом ушли в прошлое из-за того, что хуки решают те же проблемы более естественным для JavaScript способом. Кастомные хуки легко тестировать (это по сути просто функции). Хуки позволяют разделять логику внутри одного компонента на независимые части: например, компонент может использовать одновременно и свой локальный useState, и несколько разных кастомных хуков —  каждая часть отвечает за себя, и этот код не переплетается, тогда как при использовании нескольких HOC или Render Props было бы труднее изолировать ответственности.</p><p>Минусы: если это можно назвать минусом. Хотя хуки упростили многое, они принесли также свои правила, о которых нужно помнить: вызывать в одном порядке, только в компонентах либо других хуках, не внутри условий. Если нарушить эти правила, React выдаст предупреждение или ошибку. Ещё потенциальный минус: повторное использование хука означает, что каждый компонент получает свою копию состояния. Это обычно то, что нам нужно, но если вдруг требуется разделять одно состояние между несколькими компонентами — хуки напрямую не помогут, придётся выносить состояние выше (или в контекст, или в стор). Впрочем, это уже другая задача.</p><p>В целом, сейчас хуки — основной инструмент в React, используемый разработчиками. Большинство новых API, фреймворков, библиотек строятся вокруг хуков. Поэтому если вы видите библиотеку, написанную на HOC либо Render Props, то, скорее всего, у неё уже есть или появится версия на хуках. Хуки сделали код React компонентов более понятным и свели на нет необходимость в классах (почти все новые фичи React рассчитаны только на функциональные компоненты).</p><h2>Compound Components (Составные компоненты)</h2><p>Паттерны, о которых говорилось выше, касаются того, как компоненты делятся логикой или данными. А есть подход, делающий фокус на композиции компонентов, позволяя создавать гибкие интерфейсы. Compound Components — это паттерн, при котором несколько компонентов работают вместе как единое целое, обмениваясь общим состоянием (обычно через контекст). Пользователь такого комплекта компонентов может гибко комбинировать его части в JS.</p><p>Я познакомился с данным паттерном, когда писал в качестве пет-проекта свой собственный UI Kit. Представьте &lt;Accordion&gt; с множеством &lt;AccordionItem&gt; или &lt;Select&gt; и &lt;Option&gt;. Compound Components — когда мы пишем код таким образом, что компонент &lt;Accordion&gt; не обязан принимать массив пунктов через пропсы и рендерить его внутри. Мы даём разработчику возможность самому в JSX расписать, какие пункты будут у аккордеона и что в них будет находиться, используя заранее предусмотренные дочерние компоненты: &lt;Accordion.Item&gt;, &lt;Accordion.Header&gt; и &lt;Accordion.Panel&gt;.</p><p>Возможно, у вас, как и у меня, сразу же возник вопрос в голове: «как же Accordion узнает о своих Item и организует их работу?» Внутри — как раз при помощи React Context. Compound Components обычно реализуются так: родитель (компонент-контейнер) содержит всё состояние (например, какой пункт раскрыт) и методы управления (функция toggle(index)). Он оборачивает children своим контекст провайдером и передаёт туда эти данные и функции. Дочерние компоненты (которые рендерятся где-то внутри children) просто берут нужное из контекста и таким образом получают доступ к состоянию родителя. Они знают, к какому именно контейнеру принадлежат, благодаря тому, что рендерятся внутри него и получают его контекст.</p><p>Давайте рассмотрим конкретный пример. Сделаем простой составной компонент Toggle, который будет управлять отображением/скрытием некоторого контента по клику. У нас будет &lt;Toggle&gt; в роли контейнера и его дочерние компоненты &lt;Toggle.On&gt;, &lt;Toggle.Off&gt; и &lt;Toggle.Button&gt;.</p><p>Здесь &lt;Toggle&gt; управляет состоянием on (показано/скрыто) и предоставляет через контекст значение { on, toggle } всем потомкам. &lt;ToggleOn&gt; и &lt;ToggleOff&gt; читают on и в зависимости от него либо рендерят children, либо нет. &lt;ToggleButton&gt; получает из контекста функцию toggle и вызывает её при клике. В итоге снаружи мы получаем удобный и декларативный интерфейс: внутрь &lt;Toggle&gt; мы помещаем разные части UI, которые сами знают, когда им отображаться и что делать при клике —  мы лишь описываем структуру, не связывая их вручную пропсами.</p><p>Обратите внимание: компоненту &lt;Toggle&gt; без разницы, сколько у него внутри &lt;ToggleOn&gt; или &lt;ToggleOff&gt; и какой внутри них JSX. Всё завязано только на состоянии контекста. Это и есть сила композиции: пользователю библиотеки даются «кирпичики» (несколько компонентов), из которых он может сложить нужную конструкцию как ему необходимо, а не один монолитный компонент с десятком пропсов настроек.</p><p>Плюсы этого паттерна: огромная гибкость и выразительность. Хороший compound-компонент ощущается как маленький фреймворк. Например, библиотека @reach/ui (предшественник современной radix-ui) много компонентов строила через этот паттерн: диалоги, списки, выпадающие меню . Пользователю легко понять API —  просто вкладывай одни компоненты в другие. Появляется возможность тонко настроить итоговую разметку, вставить дополнительные элементы если надо, ведь внутри children мы не ограничены, можем обернуть тот же &lt;ToggleButton&gt; в какой-нибудь &lt;div&gt; с нужным классом. Проще поддерживать визуальное единообразие: все части контролируются одним контекстом, не размазывая логику по нескольким несвязанным компонентам.</p><p>Минусы: сложнее реализовать. Необходимо аккуратно продумать как компоненты будут взаимодействовать, предусмотреть, что некоторые могут отсутствовать или повторяться. Если неправильно спроектировать составной компонент, можно столкнуться с багами: например, если &lt;ToggleButton&gt; случайно использовать вне &lt;Toggle&gt; (то есть вне своего провайдера), useContext вернёт undefined и будет ошибка — надо либо избегать такого, либо делать проверки и бросать понятное сообщение об ошибке (мол, «ToggleButton ОБЯЗАТЕЛЬНО должен быть потомком Toggle»).</p><p>Ещё один момент связан с производительностью, когда контекстное значение меняется, все потребители контекста перерендерятся. Например, при каждом клике toggle выше перемонтируются и &lt;ToggleOn&gt;, и &lt;ToggleOff&gt;, и &lt;ToggleButton&gt;. В нашем случае это конечно пустяки, но если бы у нас был десяток сложных для ререндера children'ов, подписанных на контекст, и состояние менялось часто, нужно было бы подумать об оптимизации (разбивке контекстов или мемоизации).</p><p>Тем не менее плюсы обычно перевешивают: паттерн Compound Components позволяет создать очень понятный и гибкий пользовательский API для ваших компонентов. Это проявление философии React — композиция важнее наследования. Вместо того чтобы делать сложный компонент с кучей условий, мы делаем набор простых компонентов, которые в комбинации собираются в сложное поведение.</p><p>Compound Components — довольно «профессиональный» паттерн. В небольших приложениях вы можете не столкнуться с необходимостью его реализовывать, но если разрабатываете библиотеку компонентов, как я в своём пет-проекте, или сложный виджет, такой подход —  чуть ли не необходимость. Практически все продвинутые React UI-библиотеки (Material UI, Chakra, Radix и т.д.) используют контекст и композицию под капотом для своих сложных компонентов.</p><h2>Серверные компоненты и Suspense: современные возможности React</h2><p>Наконец, давайте поговорим о новейших возможностях, которые принесли нам 18 и 19 версии React’а. Они направлены на улучшение работы с асинхронностью, данными и рендерингом на стороне сервера. В первую очередь, React Suspense и Server Components. Эти вещи ещё не до конца устоялись в среде разработчиков, но их стоит держать в уме.</p><h3>Suspense — ожидание с комфортом</h3><p>Когда интерфейсу нужно загрузить данные, всегда возникает задача — показать индикатор загрузки, пока всё не готово. Раньше приходилось вручную писать логику, часто это бывало состояние isLoading и условный рендер либо спиннера, либо контента. С появлением React Suspense командой React был предложен более декларативный способ. Suspense — это специальный компонент, который позволяет нам приостановить рендеринг своих дочерних компонентов, пока те не готовы, и в это время показать fallback UI.</p><p>Проще говоря, мы оборачиваем часть дерева компонентов в &lt;Suspense fallback={&lt;Loader/&gt;}&gt; ... &lt;/Suspense&gt;, и если внутри этой области происходит задержка (например, идёт загрузка кода или данных), React сам автоматически покажет &lt;Loader&gt; вместо содержимого, а когда всё завершится — отобразит наши компоненты. Suspense берёт на себя координацию этого процесса, освобождая нас от ручного управления состоянием загрузки.</p><p>Сегодня Suspense широко используется для ленивой загрузки компонентов (React.lazy + &lt;Suspense&gt;). Например:</p><p>Здесь компонент Comments будет подгружён по требованию (и в отдельном бандле). Пока бандл не загрузится, пользователь увидит текст-заглушку «Комментарии загружаются...». Как только код придет, React отрисует &lt;Comments&gt;. Всё это без какого-либо специального кода внутри ArticlePage для отслеживания загрузки. Suspense сам разрулит ситуацию —  React.lazy под капотом бросает Promise на время загрузки, а &lt;Suspense&gt; ловит его и показывает фоллбэк.</p><p>Кроме ленивой загрузки кода, Suspense постепенно начинает применяться и для асинхронных данных. В React 18 появился экспериментальный API, позволяющий Suspense работать с данными, например, можно использовать специальный use для ожидания промиса прямо внутри компонента (пока официально не стабильно, но фреймворки типа Next.js 13 уже вовсю используют это). Идея та же: компонент, который загружает данные, вместо того чтобы сразу вернуть JSX, может приостановить своё выполнение до получения данных. React, обнаружив это, покажет fallback, а когда данные придут — продолжит рендер компонента. Таким образом, можно писать компонент, который выглядит синхронным, хотя внутри у него асинхронный код — за счёт Suspense'а пользователю не покажется незавершённый результат.</p><p>Признаться, Suspense для работы с данными — пока штука из области экспериментов. Если вы пишете обычное приложение на Vite или CRA без Next, то прямо сейчас использовать Suspense для загрузки данных «из коробки» не выйдет —  потребуется либо сторонняя библиотека (например, React Query пока не интегрирован с Suspense по умолчанию, но планирует), либо фреймворк. Однако направление понятное: React движется к тому, чтобы сделать работу с асинхронностью более декларативной. Уже сейчас вы можете использовать Suspense для спиннеров и заглушек при загрузке кода, а в ближайшем будущем, вероятно, подобный подход станет нормой и для данных (в React 19+ должны появиться официальные инструменты для этого).</p><p>Подводя итог по Suspense: этот паттерн позволяет очень аккуратно организовать отображение состояния загрузки. Вместо большого количества условных isLoading ? &lt;Spinner&gt; : &lt;Content&gt; мы просто заявляем: «Эта часть UI может задержаться, показывай пока вот это». Это улучшает UX (пользователь видит скелетон или лоадер без моргания незагруженного контента) и упрощает код. Обязательно следим за развитием Suspense — возможно, скоро он будет использоваться намного чаще, чем сейчас.</p><h2>Серверные компоненты —  React выходит на сервер</h2><p>Ещё одна революционная идея команды React — React Server Components (RSC), или серверные компоненты. Это попытка объединить лучшее из мира серверного рендеринга и клиентских SPA. Смысл в том, что если часть ваших React-компонентов может выполняться только на сервере, генерируя готовый HTML, который отправляется клиенту, то пусть они и исполняются на сервере, не загружая клиент. Эти компоненты никогда не попадают в бандл JS, не несут в себе интерактива — они чисто для рендеринга контента. Другая часть компонентов всё также остаётся клиентской, это давно знакомые нам React-компоненты, которые умеют обрабатывать события, имеют какое-то своё состояние и т.д. Разделение происходит явно: React различает, какой компонент предназначен для сервера, а какой — для клиента.</p><p>Как же React понимает, в какой среде выполнять код компонента? Введена директива "use client": если файл компонента начинается с этой строки, то компонент клиентский, он будет собран в JS и выполнится в браузере. Если же такой строчки нет —  компонент считается серверным и по умолчанию выполнится на сервере (например, при рендеринге страницы на Node.js). Серверный компонент может содержать асинхронный код (запросы к БД, файловой системе и т.п.), ведь он запускается в среде сервера. Но он не может использовать, например, useState или useEffect, ведь у него нет постоянного состояния между запросами, да и доступ к DOM он не имеет.</p><p>React 18 (и в полной мере React 19) позволяет фреймворкам использовать эту возможность. Например, Next.js 13 с новым app/ роутером делает все компоненты по умолчанию серверными, если не указать "use client". Таким образом, большую часть страницы вы можете рендерить на сервере, отдавая сразу на клиент сразу готовую разметку, а для интерактивных элементов использовать клиентские компоненты.</p><p>Преимущества Server Components:</p><ul><li>Производительность. Серверные компоненты избегают гидрации, клиенту не нужно повторно исполнять JS, чтобы восстановить состояние UI. Вы получаете выгоды SSR (быстрый первый рендер, минимум работы на клиенте) без обычных недостатков SSR (необходимость гидрации большого объёма HTML).</li><li>Безопасность. Чувствительный код остается на сервере, не попадает в бандл, и данные можно получать напрямую на сервере (например, напрямую из базы) без передачи ключей API в браузере.</li><li>Размер бандла существенно сокращается, ведь клиент вообще не получает код серверных компонентов, только итоговую HTML разметку и нужный JS для оставшихся клиентских компонентов.</li></ul><p>Как это выглядит на практике? Самый понятный пример:</p><p>Представим блог. Страницу поста можно сделать целиком серверным компонентом, на сервере загрузится пост из БД и вернёт нам готовую верстку статьи. А вот кнопка лайка или форма добавления комментария — это уже интерактив, их делаем клиентскими компонентами. В результате пользователь, заходя на страницу, сразу же получит полностью готовую страницу поста (никакого лоадера, всё пререндерено). А JS-код загрузится для кнопки лайка и формы комментария, и только они будут гидрироваться и начнут работать на клиенте. Это сочетание SSR и SPA, orchestrated by React.</p><p>React строго определяет, как серверные и клиентские компоненты могут взаимодействовать. Серверный компонент может импортировать и использовать другой серверный или клиентский компонент, а вот клиентский компонент не может импортировать серверный. То есть дерево может быть: Серверный → внутри него Клиентский → внутри него ещё Клиентский и т.д. Но не наоборот. В примере выше серверный компонент страницы может рендерить внутри себя &lt;LikeButton /&gt; (клиентский компонент кнопки). А если бы вы попробовали внутри клиентского компонента сделать import PostDetails from './PostDetails.server.jsx' — сборка не позволит, скажет, что так нельзя. Таким образом, архитектура разделяется: «верхние» уровни страницы —  серверные, «листья» интерактивности — клиентские.</p><p>Server Components — пока прерогатива фреймворков. То есть в обычном приложении вы не сможете воспользоваться этим вручную без большого труда. Но если вы работаете с Next.js, Remix или в целом с fullstack React-приложениями, то RSC уже доступны. В React 19 они обещают быть полностью стабильными (в React 18 это скорее эксперимент для энтузиастов). Библиотеки тоже начинают подстраиваться: например, React Router v7 планирует поддерживать RSC, Vite тоже экспериментирует с этим.</p><p>Что в итоге нам дают серверные компоненты? Потенциально — большой скачок в производительности и удобстве разработки fullstack приложений. Мы получаем паттерн разделения по среде: какие компоненты должны рендериться на сервере, а какие — на клиенте. Это новое измерение при проектировании React приложения. Разработчику теперь нужно будет думать не только о разделении логики и UI, или о переиспользовании кода, но и решать, где лучше его выполнить — на сервере или в браузере. Правильное использование RSC может значительно ускорить приложение без лишних усилий для разработчика (React сам решит, когда и что подгружать, синхронизирует состояние между сервером и клиентом).</p><p>С другой стороны, появляется дополнительная сложность в понимании: нужно чётко осознавать ограничения (например, нельзя в серверном компоненте использовать useEffect, или что состояние в серверном компоненте не сохраняется между запросами). Но это всё решается практикой и хорошей документацией.</p><h2>Заключение</h2><p>Мы рассмотрели ключевые паттерны React и даже заглянули в будущее React-архитектур.</p><ul><li>Container &amp; Presentational Components привносят порядок, отделяя логику от отображения.</li><li>HOC и Render Props —  старые приёмы для переиспользования кода, которые в значительной мере вытеснены более современными хуками, но по прежнему встречаются в проектах.</li><li>Compound Components демонстрируют силу композиции, предоставляя API для гибкой сборки компонентов из небольших частей.</li><li>А Suspense и Server Components — это уже ближайшее будущее, делающее работу с асинхронностью и рендерингом более эффективной и декларативной.</li></ul><p>Важно понимать, что паттерны — это не нерушимые догмы. В каждом конкретном случае их нужно применять с умом. Порой проще обойтись без паттерна, чем усложнять архитектуру ради «красивого» решения. Не нужно лишний раз оверинженирить. Однако знание этих подходов обогащает ваш инструментарий. Когда вы сталкиваетесь с определённой проблемой, на подкорке всплывёт: «ага, здесь бы подошёл такой-то паттерн!» Опытный разработчик видит несколько вариантов реализации и выбирает оптимальный.</p><p>От себя добавлю: изучая паттерны, всегда пробуйте их в деле. Напишите свой HOC, переделайте компонент с Render Props на хук, реализуйте небольшой набор Compound Components — так вы прочувствуете их сильные и слабые стороны. React развивается, и появляются новые приёмы, но фундаментальные идеи (композиция, разделение обязанностей, явное управление состоянием) остаются. Владейте этими инструментами, и ваши React приложения будут благодарить вас чистотой и поддерживаемостью кода!</p><p>Паттерны в React нужно не только знать, но и применять. Собрали полезные инструменты <a href="https://t.me/+iKEwDxvulHFkZDhi">здесь</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>