<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>LighTech</title><generator>teletype.in</generator><description><![CDATA[LighTech]]></description><image><url>https://img2.teletype.in/files/1a/17/1a17513c-abd5-4928-88f3-5ad3c64b2f7c.png</url><title>LighTech</title><link>https://teletype.in/@lightech</link></image><link>https://teletype.in/@lightech?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/lightech?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/lightech?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 15 Oct 2026 04:59:58 GMT</pubDate><lastBuildDate>Thu, 15 Oct 2026 04:59:58 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@lightech/GONBjd5xaoE</guid><link>https://teletype.in/@lightech/GONBjd5xaoE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/GONBjd5xaoE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>ЛайТех включила платформу ЛайТимс в реестр отечественного ПО</title><pubDate>Wed, 14 Oct 2026 12:21:04 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/6e/69/6e691349-a8e8-430a-b4b8-7faa6ba31bbd.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d2/65/d265656a-eb2b-420d-bc09-99a598a0acf2.png"></img>История LighTeams началась с практической задачи внутри LighTech. В новых реалиях рынка компании потребовался инструмент для управления проектами, задачами и командой, но найти готовое решение, которое подходило бы под наши процессы и условия работы, не удалось. Поэтому мы решили создать собственную платформу.]]></description><content:encoded><![CDATA[
  <figure id="lcIY" class="m_original">
    <img src="https://img2.teletype.in/files/d2/65/d265656a-eb2b-420d-bc09-99a598a0acf2.png" width="1800" />
    <figcaption>ЛайТимс в реестре отечественного ПО</figcaption>
  </figure>
  <h2 id="kak-poyavilsya-servis-dlya-upravleniya-proektami-lajtims">Как появился сервис для управления проектами ЛайТимс?</h2>
  <p id="ywBm">История LighTeams началась с практической задачи внутри LighTech. В новых реалиях рынка компании потребовался инструмент для управления проектами, задачами и командой, но найти готовое решение, которое подходило бы под наши процессы и условия работы, не удалось. Поэтому мы решили создать собственную платформу.</p>
  <p id="lBF7">Сначала LighTeams разрабатывался для внутренних задач ЛайТех. По мере использования в платформе появлялись новые возможности: тайм-трекер, HR-функции, база знаний, обучение сотрудников, уведомления и другие инструменты для работы команды.</p>
  <p id="UhTa">Постепенно внутреннее решение выросло в самостоятельный B2B-продукт. Сегодня LighTeams помогает компаниям управлять проектами, задачами и сотрудниками в одной системе.</p>
  <h2 id="kakie-est-vozmozhnosti-u-lajtims">Какие есть возможности у ЛайТимс?</h2>
  <p id="2FUA">Платформа объединяет:</p>
  <ul id="zxau">
    <li id="Bn24"><strong>управление проектами и задачами</strong> — канбан-доски, дедлайны, приоритеты и контроль выполнения;</li>
    <li id="YJGq"><strong>учет рабочего времени</strong> — тайм-трекер с привязкой к задачам и проектам;</li>
    <li id="fuNn"><strong>HR-инструменты</strong> — заявки на отпуск, больничный и отгул, учет сотрудников и оборудования;</li>
    <li id="k1we"><strong>обучение и развитие</strong> — карта компетенций, курсы, воркшопы и внутренние мероприятия;</li>
    <li id="lmjs"><strong>базу знаний</strong> — хранение инструкций, документов и других материалов компании;</li>
    <li id="mis0"><strong>уведомления и новостную ленту</strong> — информация об изменениях и событиях команды;</li>
    <li id="hamm"><strong>роли и права доступа</strong> — настройку доступа к данным и функциям;</li>
    <li id="1uBC"><strong>опросы и обратную связь</strong> — сбор предложений и мнений сотрудников.</li>
  </ul>
  <p id="Cbta">ЛайТимс работает через браузер и доступен с компьютеров, планшетов и смартфонов. Платформу также можно интегрировать с внутренними системами и другими сервисами компании.</p>
  <h2 id="otechestvennoe-po-dlya-upravleniya-rabochimi-proczessami">Отечественное ПО для управления рабочими процессами</h2>
  <p id="8Ndu">Включение LighTeams в реестр отечественного ПО стало логичным этапом развития продукта. Теперь компании могут рассматривать платформу как российское решение для организации проектной и командной работы.</p>
  <p id="gSzm"></p>
  <figure id="48m9" class="m_original">
    <img src="https://img1.teletype.in/files/cc/85/cc856d88-cdb1-4172-a04b-f8056f8e3952.png" width="2009" />
    <figcaption>Отечественное ПО для управления проектами</figcaption>
  </figure>
  <p id="NCcN">Для ЛайТех это также подтверждение того, что продукт прошел установленную процедуру проверки и соответствует требованиям, предъявляемым к отечественному программному обеспечению.</p>
  <blockquote id="QoI4">«Для нас включение ЛайТимс в реестр — это важный шаг в развитии продукта и возможность предложить компаниям российский инструмент для управления проектами и командами. При этом мы продолжаем развивать платформу: учитываем обратную связь пользователей, добавляем новые возможности и адаптируем LighTeams под реальные задачи бизнеса», — отметила Алина Богдашко, CEO ЛайТех.</blockquote>
  <h2 id="chem-otlichaetsya-nasha-crm-dlya-biznesa-ot-drugih">Чем отличается наша CRM для бизнеса от других?</h2>
  <p id="cLQN">ЛайТимс объединяет задачи, проекты и работу с командой в одном сервисе. Программа рассчитана не только на работу с клиентами и продажами, как классические CRM, но и на внутренние процессы компании.</p>
  <p id="cNpy">В LighTeams можно поставить задачу, назначить ответственного, учесть затраченное время, посмотреть развитие сотрудника, оформить внутреннюю заявку или найти нужную информацию в базе знаний. Все эти процессы находятся в одном рабочем пространстве и связаны между собой.</p>
  <p id="izGS">Удобно для компаний, которые хотят вести проекты и команду в одном месте, не распыляясь на лишние сервисы.</p>
  <p id="Yfd6"><strong>Подробнее о LighTeams:</strong> <a href="https://thelightech.ru/solutions/lighteams/" target="_blank">https://thelightech.ru/solutions/lighteams/</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/jPPNox1c9WT</guid><link>https://teletype.in/@lightech/jPPNox1c9WT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/jPPNox1c9WT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>Шалость удалась, или как я создал IoT-мониторинг офиса на ESP32</title><pubDate>Thu, 01 Oct 2026 10:59:47 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f6/bf/f6bffa84-9549-4d7e-9d13-d465c6851ceb.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/1e/23/1e23fade-ee3e-4f8d-a294-4dd4cb14fefd.png"></img>*Видеопересказ статьи можно посмотреть на RuTube]]></description><content:encoded><![CDATA[
  <figure id="O0Wf" class="m_original">
    <img src="https://img2.teletype.in/files/1e/23/1e23fade-ee3e-4f8d-a294-4dd4cb14fefd.png" width="1800" />
    <figcaption>IoT-мониторинг офиса на ESP3</figcaption>
  </figure>
  <p id="FKej"><a href="https://rutube.ru/video/af290c0390de0354df5f6c70781714b7/" target="_blank">*Видеопересказ статьи можно посмотреть на RuTube</a></p>
  <p id="kUGt">В этой статье рассказываю историю небольшого IoT-проекта, который постепенно вырос из простой идеи в полноценную систему с ESP32, Go backend, мониторингом, инцидентами и уведомлениями. Показываю путь от первой задумки и эмуляции устройства до работающей системы и рассказываю, какие решения пришлось менять по ходу разработки.</p>
  <h2 id="s-chego-vs-nachalos">С чего всё началось?</h2>
  <p id="fCyI">У нас есть <a href="https://yandex.ru/maps/-/CTt9a-p7" target="_blank">офис на живописной набережной Ростова-на-Дону</a>. Работаем мы в гибридном формате: можно приехать в офис, а можно остаться работать из дома.</p>
  <p id="c7ZD">Но периодически возникала одна неприятная ситуация: приезжаешь в офис — а там нет интернета. Иногда вместе с ним нет и электричества.</p>
  <p id="4PPQ">Причины каждый раз находились разные: плановые ремонтные работы, проблемы у провайдера, а иногда и банальные неуплаченные песо за услуги связи.</p>
  <p id="lB1q">Самое неприятное было даже не в самом отсутствии интернета. На большинство этих причин я всё равно никак не мог повлиять. Меня раздражало другое: хотелось заранее понимать, <strong>жив ли вообще офис и есть ли там интернет</strong>, прежде чем туда ехать.</p>
  <p id="y2EU">Казалось бы, задача довольно простая. И решить её можно было множеством уже готовых способов.</p>
  <p id="MUum">Например, можно купить у провайдера белый IP и мониторить доступность офисного роутера извне. Но ради такой задачи связываться с дополнительной услугой, платить за неё и выставлять устройство наружу не хотелось.</p>
  <p id="l1aK">Можно установить мониторинг непосредственно на роутер. Хороший вариант, если бы у нас стоял MikroTik, Keenetic или другое устройство, с которым хотелось бы экспериментировать. Но в офисе работает достаточно старый роутер, который при этом прекрасно справляется со своей основной задачей. Здесь действует один из фундаментальных законов системного администрирования:</p>
  <blockquote id="mliA">Если работает — не трогай.</blockquote>
  <p id="l8Vc">Была даже идея поставить в офис умную колонку и мониторить её доступность через экосистему умного дома. Технически задача решалась бы, но покупать целую умную колонку только для того, чтобы периодически выяснять, жива ли она, выглядело уже слишком большим оверхедом.</p>
  <p id="9yZz">Наконец, существовал совсем простой вариант — умная розетка. Подключить через неё роутер и хотя бы понимать, есть ли в офисе электричество.</p>
  <p id="Oq4I">Наверное, на этом история могла бы закончиться. Но это было бы слишком просто. А как же помучаться?</p>
  <p id="eXlI">К тому моменту удачно совпали сразу несколько обстоятельств.</p>
  <p id="pOSq">Я проходил курс по IoT и инженерии умного дома, где работал с ESP32, Arduino и Raspberry Pi. Параллельно изучал Go и искал проект, на котором можно было бы применить его не в учебных примерах, а для решения настоящей задачи. Кроме того, мне хотелось попробовать агентный подход к разработке на проекте, который можно целиком контролировать самому.</p>
  <p id="Bxyu">В результате простая мысль «хочу знать, работает ли интернет в офисе» постепенно превратилась в другую — «<strong>а почему бы не собрать собственное устройство мониторинга и не написать для него всю систему целиком — от прошивки до backend?</strong>»</p>
  <p id="9KLc">Рациональнее ли это покупки умной розетки? Определённо нет. Интереснее? Определённо да.</p>
  <h2 id="pervonachalnyj-plan">Первоначальный план</h2>
  <p id="si1B">Итак, решение принято: готовое устройство мы не покупаем — будем собирать своё.</p>
  <p id="BJjf">Первоначальный план казался довольно простым. В качестве основы я выбрал ESP32 и отдельную плату расширения с Ethernet. Подключение по кабелю на тот момент выглядело самым надёжным вариантом: устройство должно было физически подключаться к офисному роутеру и становиться ещё одним участником локальной сети.</p>
  <figure id="3yLJ" class="m_original">
    <img src="https://img2.teletype.in/files/53/b8/53b88516-ed5c-4fe1-a124-ab5b46e926bc.png" width="2880" />
  </figure>
  <p id="dwbh"></p>
  <figure id="OJeL" class="m_original">
    <img src="https://img1.teletype.in/files/06/57/06579010-a01a-4115-a073-23a1442c5486.png" width="1200" />
  </figure>
  <p id="lf5T">При этом активно сканировать или каким-либо образом нагружать офисную сеть мне не хотелось.</p>
  <p id="pv5m">Задача устройства была гораздо проще: периодически сообщать наружу что-то вроде:</p>
  <blockquote id="E7vQ">Я здесь. Я смог выйти в интернет. Всё в порядке.</blockquote>
  <p id="ReOO">То есть вместо того, чтобы пытаться достучаться <strong>до офиса извне</strong>, я решил развернуть схему наоборот: устройство внутри офиса само должно было периодически обращаться к внешнему серверу.</p>
  <p id="18wr">У такого подхода был ещё один приятный побочный эффект. Не требовался белый IP, не нужно было открывать входящие порты на роутере и вообще выставлять устройство наружу. Для внешнего мира наш маленький монитор мог оставаться обычным клиентом офисной сети.</p>
  <p id="RTam">Оставалась небольшая проблема. У меня ещё не было ни ESP32, ни Ethernet-платы. А делать что-то уже хотелось.</p>
  <h2 id="zheleza-net-budem-emulirovat">Железа нет — будем эмулировать</h2>
  <p id="FsqV">Ждать доставки компонентов показалось слишком скучно, поэтому разработку я решил начать с противоположного конца системы — с backend.</p>
  <p id="eShs">Заодно появился хороший повод использовать Go, который я как раз изучал.</p>
  <p id="57LZ">Идея backend была довольно простой: он должен принимать периодические сигналы от устройств и запоминать время последнего успешного обращения.</p>
  <p id="Qc3w">Причём сразу хотелось не привязывать систему к одной конкретной ESP32. Сегодня устройство одно, а завтра их может оказаться несколько — почему бы сразу не предусмотреть регистрацию устройств и независимый heartbeat для каждого из них?</p>
  <p id="MCmN">Базовая логика получалась примерно такой:</p>
  <figure id="vHln" class="m_original">
    <img src="https://img3.teletype.in/files/2b/58/2b58e670-cdfb-4f60-84e6-dc8a7da7c7c9.png" width="663" />
  </figure>
  <p id="BLVn">Разумеется, настоящего <code>Device</code> у меня всё ещё не было.</p>
  <p id="zAlF">Поэтому его место временно занял simulator.</p>
  <p id="HfMl">Я сделал программную эмуляцию устройства, которая могла с заданной периодичностью обращаться к backend примерно так, как впоследствии должна была это делать настоящая ESP32.</p>
  <p id="xWf0">Получилась немного забавная последовательность разработки: физического устройства ещё не существовало, а сервер уже умел регистрировать устройства, принимать heartbeat, сохранять данные и работать с эмулятором будущего железа.</p>
  <p id="Jc8i">На этом же этапе появился первый простой Web UI. Никаких сложных dashboard, графиков и аналитики — достаточно было обратиться к backend и показать главное: устройство сейчас выходит на связь или нет.</p>
  <p id="Ukb9">Так начала складываться первая версия архитектуры:</p>
  <figure id="p94c" class="m_original">
    <img src="https://img4.teletype.in/files/f1/d5/f1d56fbe-9b0a-407c-bf62-2339fc1cd225.png" width="662" />
  </figure>
  <p id="oKHQ">И здесь был принципиальный момент всей схемы: <strong>сервер не должен был проверять устройство сам</strong>.</p>
  <p id="cDrB">Никакого подключения к офисной сети извне. Никаких запросов на ESP32. Никаких открытых портов. Направление связи только одно: устройство находится внутри офисной сети и само сообщает внешнему серверу, что оно ещё живо.</p>
  <p id="R8B4">Если heartbeat приходит — офис как минимум имеет возможность выйти в интернет. Если перестаёт приходить — значит, что-то произошло.</p>
  <p id="DM83">Что именно — пока неизвестно. Но для первоначальной задачи этого уже было достаточно.</p>
  <h2 id="kogda-priehalo-zhelezo">Когда приехало железо</h2>
  <p id="JfyC"></p>
  <p id="NFKn"></p>
  <p id="1lwe"></p>
  <figure id="7zkj" class="m_original">
    <img src="https://img3.teletype.in/files/6b/01/6b012072-d94a-4e42-b0a2-6cb8b38fd3a4.png" width="1200" />
  </figure>
  <p id="vuxV">К моменту, когда приехала ESP32, программная часть проекта уже успела заметно продвинуться.</p>
  <p id="ySxB">Был Go backend, API для регистрации устройств и heartbeat, база данных, эмуляция устройств и первый workflow обмена данными. То есть сервер уже был готов разговаривать с устройством, которого до этого момента физически не существовало.</p>
  <p id="0vH2">Оставалось, казалось бы, самое простое: заменить simulator настоящей ESP32.</p>
  <p id="AoBv">Первоначальный план предполагал Ethernet. Я заказал ESP32, отдельный LAN-модуль, припаял необходимые контакты и начал собирать всё вместе.</p>
  <p id="pVwB">И здесь план впервые встретился с реальным железом.</p>
  <h3 id="Ny3m">Ethernet, который не случился</h3>
  <p id="WaXq">Ethernet я выбрал не случайно. Устройство должно было постоянно находиться рядом с роутером, мобильность ему не требовалась, а проводное подключение казалось наиболее предсказуемым вариантом для мониторинга сети.</p>
  <p id="rpWW">Логика была примерно такой:</p>
  <blockquote id="VGKG">ESP32 ── Ethernet ── Router ── Internet ── VPS</blockquote>
  <p id="tXi5">Никаких проблем с качеством Wi-Fi, паролями, переподключениями и прочими особенностями беспроводной сети. Воткнул кабель — и устройство работает.</p>
  <p id="sThh">По крайней мере, так это выглядело на бумаге.</p>
  <p id="AElb">На практике подружить ESP32 с купленным LAN-модулем не получилось. После некоторого количества попыток стало понятно, что проблема, скорее всего, находится не в прошивке, а в самом Ethernet-модуле — он оказался бракованным.</p>
  <p id="S2wp">Вернуть его к тому моменту уже было поздно.</p>
  <p id="DuuC">Передо мной возникло два варианта.</p>
  <p id="QJzX">Можно было заказать другой модуль, дождаться доставки и продолжить реализацию первоначального плана.</p>
  <p id="aKAH">А можно было посмотреть на ESP32, вспомнить, что Wi-Fi в ней уже есть, и задать себе довольно простой вопрос: <strong>а зачем мне вообще сейчас Ethernet?</strong></p>
  <p id="MHny">Да, проводное соединение для такого устройства мне по-прежнему казалось более красивым и предсказуемым решением. Но исходная задача заключалась не в том, чтобы построить идеальный Ethernet-monitor. Мне нужно было понять, доступен ли интернет в офисе. Для этого Wi-Fi подходил ничуть не хуже.</p>
  <p id="8FWR">Так Ethernet временно отправился в список вещей, которые можно будет сделать когда-нибудь потом, а первая настоящая версия устройства стала беспроводной.</p>
  <p id="9bMR"></p>
  <figure id="rVYz" class="m_original">
    <img src="https://img1.teletype.in/files/48/12/4812e277-a3b7-44f3-a068-49800f439466.png" width="664" />
  </figure>
  <p id="zYMG">Питание тоже не требовало отдельной инфраструктуры: обычный блок питания и USB Type-C.</p>
  <p id="OAA0">И вот здесь пригодилось решение, принятое ещё до приезда железа. Backend не знал и не должен был знать, <strong>как именно устройство подключено к сети</strong>. До этого его клиентом был simulator. Теперь им стала настоящая ESP32. Для сервера принципиальной разницы практически не было.</p>
  <p id="nuLx">Устройство регистрируется, получает необходимые данные для дальнейшей работы и начинает периодически отправлять heartbeat.</p>
  <figure id="2Rg4" class="m_original">
    <img src="https://img3.teletype.in/files/a4/23/a4237d8a-1dcc-465a-bcc2-2e48c1792fd1.png" width="664" />
  </figure>
  <p id="os27">Это был первый момент, когда вся задумка начала работать уже не только в коде.</p>
  <p id="Mk9j">ESP32 подключалась к офисному Wi-Fi, выходила через него в интернет и обращалась к backend на VPS. А backend видел главное:</p>
  <blockquote id="5HbS">устройство вышло на связь.</blockquote>
  <p id="NKjj">Значит, как минимум в этот момент ESP32 была включена, офисная Wi-Fi-сеть работала, роутер имел доступ наружу, а запрос смог пройти через интернет до моего сервера.</p>
  <p id="9snI">Для исходной задачи этого было более чем достаточно.</p>
  <h2 id="inogda-slomannyj-komponent-eto-polezno">Иногда сломанный компонент — это полезно</h2>
  <p id="klld">История с Ethernet в итоге оказалась скорее полезной.</p>
  <p id="wJiD">Можно было ещё несколько дней разбираться с W5500, проверять SPI, менять конфигурацию, заказывать новый модуль и добиваться первоначально задуманной архитектуры.</p>
  <p id="0OtA">Но всё это не приближало бы проект к решению исходной задачи настолько, насколько приближал один работающий Wi-Fi connection.</p>
  <p id="HCEI">Это довольно очевидная мысль, которую легко забыть именно в pet-проектах: когда никто не ограничивает сроки и архитектуру, очень легко начать совершенствовать решение проблемы, которая уже перестала быть проблемой.</p>
  <p id="SP1X">В моём случае достаточно было оставить Ethernet в покое и использовать то, что уже находилось на плате.</p>
  <p id="GkFH">Шалость должна была когда-нибудь начать удаваться.</p>
  <h2 id="a-zachem-mne-zdes-postgresql">А зачем мне здесь PostgreSQL?</h2>
  <p id="SybG">Первая версия backend появилась ещё до настоящего устройства, и проектировалась она с некоторым запасом.</p>
  <p id="PJgO">Несколько устройств, регистрация, heartbeat, хранение состояния — всё это довольно естественно привело к PostgreSQL.</p>
  <p id="dovy">На VPS первоначальная схема выглядела примерно так:</p>
  <figure id="hw4H" class="m_original">
    <img src="https://img4.teletype.in/files/be/fe/befed50d-26ba-4878-821b-51f620587d5a.png" width="665" />
  </figure>
  <p id="iAjA">И технически с ней всё было нормально. Проблема заключалась в другом. В какой-то момент я посмотрел на то, что получилось, и задал себе очередной неприятный вопрос: <strong>а зачем мне здесь PostgreSQL?</strong></p>
  <p id="zCwm">У меня одна ESP32. Один backend. Один небольшой VPS. Раз в несколько секунд приходит крошечный heartbeat.</p>
  <p id="E8Ha">Нет сложной аналитики. Нет тяжёлых запросов. Нет десятков пользователей. Нет необходимости масштабировать backend на несколько экземпляров. И ради всего этого рядом работает отдельный контейнер PostgreSQL.</p>
  <p id="4MdY">Конечно, можно было оставить всё как есть. PostgreSQL прекрасно справлялся с задачей. Но «справляется» ещё не означает «нужен».</p>
  <h2 id="baza-dannyh-tozhe-mozhet-byt-overhedom">База данных тоже может быть оверхедом</h2>
  <p id="0lLO">У проекта с самого начала была одна важная оговорка: это эксперимент.</p>
  <p id="Kv6T">Если идея окажется полезной и когда-нибудь перерастёт в полноценную систему мониторинга с большим количеством устройств, метриками, графиками, аналитикой и другими требованиями — можно будет спроектировать такую систему отдельно.</p>
  <p id="l6AR">Не было никакого смысла пытаться заранее построить её внутри маленького pet-проекта.</p>
  <p id="Jjl1">Поэтому PostgreSQL я убрал. Его место заняла <strong>SQLite</strong>.</p>
  <figure id="R4Ar" class="m_original">
    <img src="https://img3.teletype.in/files/af/f2/aff26666-9fc9-4dea-a523-31fa5a938b12.png" width="664" />
  </figure>
  <p id="n7DJ">Вместо двух сервисов на VPS остался один контейнер backend и persistent volume с файлом SQLite. И для текущей нагрузки этого оказалось более чем достаточно.</p>
  <h2 id="ui-tozhe-ne-obyazan-byt-otdelnym-prilozheniem">UI тоже не обязан быть отдельным приложением</h2>
  <p id="B7bk">Примерно по той же причине я не стал превращать Web UI в отдельный frontend-проект. Мне не требовались React, Vue, отдельный Node.js build, frontend-контейнер и собственный deployment pipeline. Мне нужно было открыть страницу и увидеть состояние устройства.</p>
  <p id="QyA1">Поэтому UI остался обычным HTML, CSS и JavaScript, который раздаёт тот же Go backend. Получилась очень простая конструкция:</p>
  <figure id="bmaj" class="m_original">
    <img src="https://img2.teletype.in/files/55/65/55654e0e-4b2f-46c3-b368-52f41daacf1b.png" width="664" />
  </figure>
  <p id="IeBR">Не самая впечатляющая архитектурная диаграмма. И в этом как раз её преимущество. Для моих задач она закрывала всё необходимое с огромным запасом.</p>
  <h3 id="snachala-rabotayushhaya-sistema">Сначала работающая система</h3>
  <p id="b3uA">Навести красоту всегда можно потом.</p>
  <p id="wMC2">Добавить полноценные временные ряды. Построить графики доступности. Посчитать SLA. Подключить отдельную систему метрик. Вернуть PostgreSQL. Разделить frontend и backend. Добавить ещё несколько сервисов.</p>
  <p id="TIJ4">Список потенциальных улучшений у разработчика обычно заканчивается значительно позже, чем свободное время. Поэтому на этом этапе я решил остановиться.</p>
  <p id="Qfa6">Мне был важен сам факт: устройство стоит в офисе, выходит в интернет и сообщает о себе внешнему серверу. Если для решения задачи достаточно одного Go-процесса и SQLite, значит именно столько инфраструктуры ей сейчас и нужно.</p>
  <p id="CZpr"><strong>Меньше планировать идеальную систему. Больше делать работающую.</strong></p>
  <p id="6GdM">Как выяснилось чуть позже, остановиться на этом всё равно не получилось.</p>
  <h2 id="kogda-pet-proekt-okazalsya-polezen-ne-tolko-mne">Когда pet-проект оказался полезен не только мне</h2>
  <p id="CtPE">На этом первоначальную задачу уже можно было считать решённой.</p>
  <p id="hCiY">ESP32 стояла в офисе, подключалась к Wi-Fi и периодически отправляла heartbeat на мой VPS. Backend сохранял данные, а через простой Web UI я мог посмотреть состояние устройства.</p>
  <p id="FYhb">То есть перед поездкой в офис уже можно было ответить на тот самый вопрос, с которого всё началось:</p>
  <blockquote id="XDAw">Интернет там вообще есть?</blockquote>
  <p id="3Zde">Но примерно в этот момент у проекта появился ещё один пользователь. Вернее, сразу вся компания.</p>
  <p id="OQ8f">У нашей компании есть собственные разработки — в частности, <strong><a href="https://thelightech.ru/solutions/lightpulse/" target="_blank">LightPulse</a></strong> и <strong><a href="https://thelightech.ru/solutions/lighteams/" target="_blank">LightTeams</a></strong>.</p>
  <p id="qBJG">Когда руководитель увидел идею с отдельным устройством мониторинга, появилась дополнительная задача: если ESP32 всё равно периодически проверяет возможность выйти из офисной сети наружу, почему бы не использовать этот сигнал ещё и внутри корпоративной экосистемы?</p>
  <p id="dJ0P">Так у устройства появился второй независимый маршрут.</p>
  <p id="QseU">Первый остался прежним — частый heartbeat на мой backend:</p>
  <figure id="wMRr" class="m_original">
    <img src="https://img3.teletype.in/files/a1/05/a105b887-4a73-46aa-aaed-3a082492088d.png" width="663" />
  </figure>
  <p id="SWC5">А второй стал корпоративным: с гораздо большей периодичностью устройство должно было обращаться к LightPulse.</p>
  <figure id="jxsl" class="m_original">
    <img src="https://img3.teletype.in/files/ee/f9/eef9d8f5-cfd8-4bc2-a0f4-0f5bfd72a30f.png" width="663" />
  </figure>
  <p id="lwo4">Для LightPulse не было необходимости получать heartbeat каждые несколько секунд. Достаточно было периодического сигнала примерно раз в 30–40 минут.</p>
  <p id="76k2">Смысл этого запроса оставался тем же:</p>
  <blockquote id="aOuT">Устройство находится в офисе, смогло подключиться к Wi-Fi, выйти через офисную сеть в интернет и достучаться до внешнего сервиса.</blockquote>
  <p id="7qEx">Значит, с очень высокой вероятностью офис сейчас онлайн.</p>
  <p id="ebQt">Но теперь эта информация перестала быть доступна только мне через мой маленький Web UI.</p>
  <p id="iP3d">Благодаря существующей интеграции LightPulse с Mattermost сигнал можно было использовать уже внутри привычной корпоративной инфраструктуры и давать информацию о состоянии офиса остальным сотрудникам.</p>
  <p id="kUms">И здесь маленький эксперимент неожиданно начал превращаться в настоящий внутренний инструмент.</p>
  <h2 id="odin-datchik-dva-raznyh-signala">Один датчик — два разных сигнала</h2>
  <p id="lcV2">При этом я сознательно не стал объединять два сценария в один.</p>
  <p id="sBzj">Мой backend и LightPulse решали разные задачи.</p>
  <p id="blSN">Частый heartbeat нужен локальной системе мониторинга, чтобы относительно быстро заметить исчезновение устройства.</p>
  <blockquote id="0C3Q">ESP32 ── 5 sec ──► VPS</blockquote>
  <p id="ECgz">Корпоративному сервису такая частота совершенно не требовалась:</p>
  <blockquote id="NzOz">ESP32 ── 30–40 min ──► LightPulse</blockquote>
  <p id="ga0e">В результате одна маленькая ESP32 стала выполнять сразу две функции. Для моей системы она оставалась постоянно работающим probe, по которому можно определить текущее состояние офисной сети. Для корпоративной инфраструктуры — источником периодического сигнала о том, что офис доступен.</p>
  <p id="X3Ud">И всё это по-прежнему работало по первоначальному принципу проекта:</p>
  <p id="UmEA">Никаких входящих подключений к офису.<br />Никто снаружи не пингует ESP32.<br />Никто не подключается к роутеру.<br />Не нужен белый IP.<br />Не нужно открывать порты.<br />Устройство само инициирует оба соединения наружу и сообщает:</p>
  <blockquote id="KAug">Я всё ещё здесь. Интернет есть.</blockquote>
  <p id="tbn2">На этом можно было бы действительно остановиться.</p>
  <p id="Jxf2">У меня было физическое устройство, работающий backend, база данных, Web UI и даже интеграция с корпоративной системой. Но появилась новая проблема.</p>
  <p id="60Nk">Я мог открыть страницу и увидеть, что устройство перестало выходить на связь. Вот только для этого мне сначала нужно было <strong>самому открыть страницу</strong>.</p>
  <h2 id="horosho-ustrojstvo-zamolchalo-i-chto-dalshe">Хорошо, устройство замолчало. И что дальше?</h2>
  <p id="oGkn">К этому моменту система уже умела отвечать на главный вопрос: когда ESP32 последний раз выходила на связь.</p>
  <p id="6vjY">Можно открыть Web UI, посмотреть время последнего heartbeat и понять, всё ли в порядке. Но довольно быстро обнаружилась очевидная проблема такого подхода. Чтобы узнать, что интернет в офисе пропал, мне сначала нужно было самостоятельно вспомнить про мониторинг, открыть страницу и посмотреть состояние устройства.</p>
  <p id="7O1a">Получался мониторинг, за которым нужно мониторить.</p>
  <p id="1Dds">Так появилась следующая задача: <strong>система должна сама определять проблему и сообщать о ней.</strong> На первый взгляд всё опять кажется довольно просто. Не пришёл heartbeat — устройство offline. Но здесь начались уже более интересные вопросы.</p>
  <h2 id="odin-poteryannyj-heartbeat-eshh-nichego-ne-znachit">Один потерянный heartbeat ещё ничего не значит</h2>
  <p id="WDGO">ESP32 отправляет heartbeat достаточно часто. Но считать устройство недоступным после первого же пропущенного запроса было бы слишком агрессивно.</p>
  <p id="dY6q">Запрос может потеряться. Wi-Fi может кратковременно переподключиться. VPS может ответить чуть позже. Может произойти временная сетевая ошибка где-нибудь между Ростовом и сервером.</p>
  <p id="V1ra">Само устройство при этом совершенно исправно.</p>
  <p id="RRvK">Поэтому модель:</p>
  <figure id="FdOE" class="m_original">
    <img src="https://img4.teletype.in/files/fe/13/fe135867-fa5f-4ca9-9d1b-c602a7c0bc2a.png" width="663" />
  </figure>
  <p id="IpFe">мне не подходила.</p>
  <p id="d9W5">Вместо этого появился <strong>offline threshold</strong>.</p>
  <p id="KPCT">Backend знает время последнего принятого heartbeat и периодически проверяет, сколько времени прошло с момента последнего успешного сигнала.</p>
  <figure id="CamB" class="m_original">
    <img src="https://img1.teletype.in/files/8f/17/8f171d5f-be46-4ccf-beb9-b1b549ad67e0.png" width="663" />
  </figure>
  <p id="0txN">То есть отдельный неудачный запрос ничего не меняет. Система даёт устройству время самостоятельно восстановить связь и только после превышения заданного порога считает ситуацию настоящей проблемой.</p>
  <p id="22qE">Так обычный <code>last heartbeat</code> начал превращаться в мониторинг состояния.</p>
  <h2 id="offline-eto-uzhe-sobytie">Offline — это уже событие</h2>
  <p id="aTcB">Следующий вопрос возник практически сразу. Допустим, устройство признано offline. Через некоторое время backend снова запускает проверку.</p>
  <p id="YFxf">Устройство всё ещё offline. Ещё через некоторое время — снова offline.</p>
  <p id="Hfzd">Если каждый такой результат считать новым событием, одна проблема быстро превратится в десятки одинаковых записей и уведомлений. Поэтому понадобилось понятие <strong>инцидента</strong>.</p>
  <p id="RhjB">Первое обнаружение проблемы открывает connectivity incident:</p>
  <figure id="hD52" class="m_original">
    <img src="https://img4.teletype.in/files/ba/2f/ba2f5768-ddd9-458d-9037-400ee61b84d5.png" width="663" />
  </figure>
  <p id="2BeN">Пока этот incident остаётся открытым, последующие проверки уже не создают новые.</p>
  <p id="z20H">Система знает: </p>
  <blockquote id="RA9t">Да, об этой проблеме мы уже знаем.</blockquote>
  <p id="wslx">Таким образом, состояние устройства и история проблем перестали быть одним и тем же. Устройство может быть <code>offline</code> прямо сейчас, а incident хранит сам факт того, <strong>когда эта проблема началась и когда закончилась</strong>. Это оказалось полезнее первоначального простого <code>last_seen</code>.</p>
  <p id="soze">Теперь система постепенно начинала отвечать уже на другие вопросы:</p>
  <ul id="3Qm2">
    <li id="YDTq">когда пропала связь;</li>
    <li id="XZEZ">сколько продолжался сбой;</li>
    <li id="CLZv">восстановилась ли она;</li>
    <li id="s4O3">происходило ли подобное раньше.</li>
  </ul>
  <p id="vtG1">И это уже было значительно ближе к настоящему мониторингу.</p>
  <p id="uJTR">А когда считать устройство восстановленным? Здесь появилась симметричная проблема. Если одного пропущенного heartbeat недостаточно для объявления аварии, стоит ли считать устройство восстановленным после первого же успешного запроса?</p>
  <p id="aB5M">Представим нестабильное соединение:</p>
  <figure id="bia5" class="m_original">
    <img src="https://img3.teletype.in/files/29/cd/29cd29ca-7e5c-4382-9249-83e72dee2676.png" width="662" />
  </figure>
  <p id="yJob">Если переключать состояние после каждого отдельного сигнала, устройство начнёт прыгать между <code>online</code> и <code>offline</code>. Поэтому для восстановления появился ещё один простой механизм: <strong>несколько последовательных успешных heartbeat</strong>.</p>
  <p id="pbnh">Например:</p>
  <figure id="9BjG" class="m_original">
    <img src="https://img3.teletype.in/files/ae/ee/aeee7937-fd79-4bdc-9b63-09eae10fb584.png" width="665" />
  </figure>
  <p id="l0ex">Только после нескольких успешных сигналов подряд backend считает соединение восстановленным и закрывает открытый incident.</p>
  <p id="BB3k">Получился небольшой state machine:</p>
  <figure id="vqgj" class="m_original">
    <img src="https://img1.teletype.in/files/0f/47/0f4721a2-19e7-46b6-8505-10cd32dd5711.png" width="663" />
  </figure>
  <p id="LlAG">Для маленького домашнего — точнее, уже офисного — проекта это было вполне достаточным компромиссом между скоростью обнаружения проблемы и ложными срабатываниями.</p>
  <h2 id="monitoring-dolzhen-soobshhat-o-probleme-sam">Мониторинг должен сообщать о проблеме сам</h2>
  <p id="11iB">Оставался последний очевидный недостаток. Backend теперь сам понимал, что произошёл incident. Но я всё ещё мог узнать об этом только через Web UI. Значит, пришло время уведомлений.</p>
  <p id="MEWK">Сначала я специально отделил сам механизм обнаружения incident от способа доставки уведомления. Для backend не должно быть принципиальной разницы, куда сообщать о событии:</p>
  <figure id="PsbD" class="m_original">
    <img src="https://img2.teletype.in/files/9c/62/9c62fff0-de33-4377-8aec-119c8d118b84.png" width="663" />
  </figure>
  <p id="vKac">Первым реальным каналом стал <strong>Web Push</strong>. И вот здесь маленький backend, который просто принимал heartbeat от ESP32, внезапно потребовал ещё несколько вполне взрослых компонентов.</p>
  <p id="bhvB">Нужно было хранить push subscriptions. Нужен был service worker в браузере. Понадобились VAPID-ключи. Нужно было корректно удалять больше не существующие subscriptions. А главное — браузерные Web Push API требуют secure context. То есть появился HTTPS.</p>
  <figure id="iA4t" class="m_original">
    <img src="https://img3.teletype.in/files/ab/f1/abf1ff49-8e70-4c38-958c-8cb4380dccfc.png" width="663" />
  </figure>
  <p id="x1Zm">И где-то примерно здесь я в очередной раз вспомнил, с чего всё начиналось. Я просто хотел перед поездкой в офис узнать, работает ли там интернет.</p>
  <p id="sOPu">Теперь у меня были ESP32, Go backend, SQLite, incident lifecycle, recovery logic, reverse proxy, TLS, service worker и push-уведомления. Кажется, умная розетка всё-таки была немного проще.</p>
  <h2 id="chto-v-itoge-poluchilos">Что в итоге получилось?</h2>
  <p id="oCBg">После всех экспериментов, отказов от первоначальных решений и постепенно появлявшихся требований архитектура в итоге стала даже проще, чем на некоторых промежуточных этапах. В офисе осталось одно небольшое устройство на ESP32-S3.</p>
  <p id="Fkby">Никакого Ethernet-модуля. Никакого белого IP. Никаких открытых портов и возможности подключиться к устройству извне.</p>
  <p id="8VCv">ESP32 подключается к обычной офисной Wi-Fi-сети и сама инициирует все необходимые соединения. На VPS работает один контейнер с Go backend. Он же раздаёт Web UI, выполняет логику мониторинга и работает с SQLite.</p>
  <p id="3Z6g">Отдельно существует LightPulse, куда устройство отправляет более редкий корпоративный monitoring signal.</p>
  <p id="ldzC">Если собрать всё вместе, схема выглядит примерно так:</p>
  <figure id="ZyY9" class="m_original">
    <img src="https://img1.teletype.in/files/c9/57/c9578737-c35b-49ef-8ec6-4612ed10fd5e.png" width="497" />
  </figure>
  <p id="uw44">Самое интересное здесь, пожалуй, не количество компонентов, а то, что <strong>офисная сеть по-прежнему ничего не принимает извне</strong>. ESP32 сама обращается к внешним сервисам. Это позволяет не решать отдельную задачу удалённого доступа к офису.</p>
  <h2 id="chto-proishodit-pri-obychnoj-rabote">Что происходит при обычной работе?</h2>
  <p id="Lj38">После включения ESP32 подключается к офисному Wi-Fi и начинает работать как обычный клиент сети. Дальше устройство периодически отправляет heartbeat на backend:</p>
  <p id="T6xE"></p>
  <figure id="1r7i" class="m_original">
    <img src="https://img3.teletype.in/files/20/40/204004c1-ed5f-40df-b81a-93e509945e66.png" width="496" />
  </figure>
  <p id="OjMU">Каждый успешно полученный heartbeat означает довольно простую вещь.</p>
  <p id="vUI0">В этот момент одновременно выполняется несколько условий:</p>
  <figure id="8aP2" class="m_original">
    <img src="https://img1.teletype.in/files/40/89/408901aa-7748-4e4c-997d-f0135e794704.png" width="498" />
  </figure>
  <p id="HE8h">Это не позволяет определить качество интернет-соединения или измерить его скорость. Но такой задачи перед устройством и не ставилось. Мне нужен был бинарный ответ на гораздо более простой вопрос: </p>
  <blockquote id="69w5">Офис сейчас способен выйти в интернет?</blockquote>
  <p id="UPJr">Для этого heartbeat оказалось достаточно.</p>
  <h2 id="chto_proishodit_kogda_svyaz_ischezaet">Что происходит, когда связь исчезает?</h2>
  <p id="UCpz">Если heartbeat перестаёт приходить, backend не объявляет аварию немедленно. Он ждёт установленный timeout.</p>
  <figure id="S1OH" class="m_original">
    <img src="https://img1.teletype.in/files/cb/c2/cbc21e1f-4c15-494e-bedf-f878f54ce7dd.png" width="496" />
  </figure>
  <p id="3hgr">При этом backend не знает причину отсутствия heartbeat. И это важно. Устройство могло потерять Wi-Fi. Мог отключиться роутер. Мог упасть интернет у провайдера. Могло исчезнуть электричество во всём офисе. В конце концов, сама ESP32 могла перестать работать.</p>
  <p id="5f5n"><strong>Для системы все эти ситуации выглядят одинаково: устройство давно не может сообщить о себе.</strong></p>
  <p id="sGAS">Но для исходной задачи мне и не требуется устанавливать точную причину. Если ESP32, которая физически находится в офисе и питается от офисной электросети, продолжительное время не может обратиться к внешнему серверу — <strong>ехать туда, рассчитывая на нормальную работу, как минимум подозрительно</strong>.</p>
  <p id="D9KK">А разбираться в конкретной причине можно уже после.</p>
  <h2 id="chto_proishodit_posle_vosstanovleniya">Что происходит после восстановления?</h2>
  <p id="Jlps">Когда связь возвращается, первый успешный heartbeat ещё не закрывает incident. Backend ждёт несколько последовательных успешных сигналов.</p>
  <figure id="WZgn" class="m_original">
    <img src="https://img1.teletype.in/files/02/a1/02a1e9b3-5b66-47a9-a90c-6058d88d172a.png" width="497" />
  </figure>
  <p id="MUgS">Это защищает систему от ситуации, когда нестабильное соединение постоянно переключает устройство между online и offline. Таким образом, вокруг очень простого heartbeat появилась небольшая модель жизненного цикла:</p>
  <figure id="mCpI" class="m_original">
    <img src="https://img3.teletype.in/files/60/49/604927a9-28b1-45be-a2d6-71fea4dc1713.png" width="666" />
  </figure>
  <h2 id="vtoroii_nezavisimii_signal">Второй независимый сигнал</h2>
  <p id="BjYF">Кроме частого heartbeat на мой backend, ESP32 периодически обращается к LightPulse. Это уже другой сценарий.</p>
  <figure id="6YaB" class="m_original">
    <img src="https://img3.teletype.in/files/24/9e/249ef03f-a0ff-440b-97db-5a7bb546f2d2.png" width="662" />
  </figure>
  <p id="cXWK">Моему backend нужен частый сигнал, потому что его задача — относительно быстро обнаружить потерю связи. LightPulse решает другую задачу, поэтому отправлять туда запрос каждые несколько секунд нет никакого смысла. Получается интересная ситуация: физически probe один, но сигнал от него используется двумя независимыми системами с разными требованиями.</p>
  <h2 id="simulator_nikyda_ne_ischez">Simulator никуда не исчез</h2>
  <p id="N11r">После появления настоящей ESP32 эмулятор устройства тоже не стал бесполезным. Наоборот, теперь он позволял работать с backend без физического доступа к офисному устройству.</p>
  <p id="giNJ">Можно запустить simulator локально, зарегистрировать виртуальное устройство и воспроизвести тот же базовый lifecycle:</p>
  <figure id="DEWL" class="m_original">
    <img src="https://img1.teletype.in/files/07/fb/07fbbed7-ce16-4f20-8b0b-4c4e87bfce2a.png" width="661" />
  </figure>
  <p id="uTgT">Для разработки backend это оказалось намного удобнее, чем при каждом изменении перепрошивать ESP32, подключать её к сети и ждать необходимого состояния.</p>
  <p id="QGPR">В каком-то смысле временная заглушка, которую я написал только потому, что железо слишком долго ехало, стала полноценным инструментом разработки.</p>
  <h2 id="a_chto_sistema_na_samom_dele_monitorit">А что система на самом деле мониторит?</h2>
  <p id="jGHV">Здесь есть одна важная оговорка. Я несколько раз называл устройство монитором интернета, но технически это не совсем точное определение. ESP32 не измеряет SLA провайдера. Не запускает Speedtest. Не анализирует packet loss. Не строит traceroute. Не проверяет каждый компонент офисной сети отдельно.</p>
  <p id="KjB9">Она отвечает на гораздо более узкий вопрос: </p>
  <blockquote id="JtFv">Может ли физическое устройство, находящееся сейчас в офисе, выйти через офисную сеть наружу и достучаться до известного внешнего сервиса?</blockquote>
  <p id="DRvb"><strong>Именно поэтому отсутствие heartbeat нельзя автоматически трактовать как: провайдер снова уронил интернет.</strong></p>
  <p id="7Sko">Причина может находиться где угодно на пути:</p>
  <figure id="KXDo" class="m_original">
    <img src="https://img1.teletype.in/files/8d/6c/8d6cba40-c250-4078-b699-c14c12c2ef1b.png" width="662" />
  </figure>
  <p id="6mdD">Но для первоначальной задачи это оказалось даже преимуществом. Мне ведь хотелось знать не состояние договора с провайдером и не latency последней мили.</p>
  <p id="z4jI">Мне хотелось знать: <strong>если я сейчас приеду в офис и открою ноутбук — есть ли основания ожидать, что там вообще всё работает?</strong></p>
  <p id="U9tt">И с этим маленькая ESP32 справляется вполне успешно.</p>
  <figure id="V4OW" class="m_original">
    <img src="https://img2.teletype.in/files/df/cb/dfcbd4a3-2c24-4d16-8a2e-b77848290471.png" width="1200" />
  </figure>
  <h2 id="chto_ya_vnes_iz_eetogo_proekta">Что я вынес из этого проекта?</h2>
  <p id="Eq8y">Технически этот проект нельзя назвать особенно сложным. ESP32 отправляет HTTP-запросы. Go принимает их. SQLite сохраняет данные. Несколько простых правил определяют состояние устройства, а Web Push сообщает о проблеме.</p>
  <p id="1alm">Но именно небольшие проекты иногда оказываются хорошим местом для проверки инженерных идей. Здесь можно ошибиться с архитектурой, выбросить половину первоначального решения и попробовать что-то новое без нескольких недель согласований и миграционного плана на следующий квартал.</p>
  <p id="5tYz">У меня таких экспериментов получилось сразу несколько.</p>
  <h2 id="ne_obyazatelno_stroit_sistemy_kotoraya">Не обязательно строить систему, которая понадобится когда-нибудь</h2>
  <p id="f4cj">Первоначально в проекте появился PostgreSQL. И это было вполне нормальным техническим решением. Можно было оставить его, добавить нормальную систему миграций, вынести frontend, подготовить инфраструктуру для нескольких backend instances, добавить Redis, очередь сообщений и постепенно получить архитектуру, способную обслуживать тысячи устройств.</p>
  <p id="LbGQ">Оставалась только одна проблема. У меня было одно устройство. Поэтому в какой-то момент полезнее оказалось не спрашивать: <strong>как правильно построить такую систему?</strong></p>
  <p id="C6ey">А спросить: <strong>что действительно требуется этой системе сейчас?</strong></p>
  <p id="NyXQ">Ответ оказался довольно скромным:</p>
  <figure id="LezK" class="m_original">
    <img src="https://img4.teletype.in/files/30/42/3042dca4-318e-4db0-9700-cdf493567b74.png" width="663" />
  </figure>
  <p id="LeUb">Если когда-нибудь устройств станет тысяча — это будет хорошая проблема. И решать её имеет смысл тогда, когда она появится.</p>
  <h2 id="jelezo_imeet_pravo_isportit_arhitektyry">Железо имеет право испортить архитектуру</h2>
  <p id="iayc">В программной разработке мы привыкли к тому, что большая часть окружения довольно предсказуема. С железом всё веселее.</p>
  <p id="BiQj">Можно выбрать Ethernet, написать под него код, продумать подключение — а потом получить неисправный модуль.</p>
  <p id="XhOu">Первой реакцией разработчика вполне может быть желание всё-таки заставить первоначальный план работать. Найти другой модуль. Перепроверить SPI. Ещё раз изучить документацию. Заказать новую плату. Но иногда гораздо полезнее снова посмотреть на исходное требование.</p>
  <p id="gLoj"><strong>Мне нужен Ethernet?</strong> <strong>Или мне нужен способ понять, что офис может выйти в интернет?</strong></p>
  <p id="oBlX">Если второе — встроенный Wi-Fi решает задачу уже сегодня. В результате бракованный Ethernet-модуль неожиданно оказался хорошим архитектурным ревьюером.</p>
  <h2 id="inogda_lychshe_ne_zahodit_v_set_voobsche">Иногда лучше не заходить в сеть вообще</h2>
  <p id="IkPS">Первоначальную проблему можно было решать с другой стороны. Получить белый IP. Открыть необходимый порт. Настроить доступ к роутеру или самому устройству. После этого внешний сервис мог бы периодически проверять офис. Я пошёл в противоположную сторону.</p>
  <figure id="wvA9" class="m_original">
    <img src="https://img3.teletype.in/files/29/3c/293c81f0-9128-422d-aa89-c98411a5f895.png" width="665" />
  </figure>
  <p id="Xuph">ESP32 сама инициирует соединение с внешним backend. Это сильно упростило всю конструкцию. Не нужно знать внешний адрес офиса. Не нужно принимать входящие соединения. Не нужно выставлять ESP32 наружу. Не нужно отдельно решать NAT.</p>
  <p id="NwG9">Для внешней сети устройство остаётся обычным клиентом, который время от времени выполняет HTTP-запрос. При этом для поставленной задачи информации от такого запроса вполне достаточно.</p>
  <h2 id="simulator_okazalsya_vajnee_chem_ya_ojidal">Simulator оказался важнее, чем я ожидал</h2>
  <p id="Oi3L">Simulator появился не в результате какого-то серьёзного архитектурного планирования.</p>
  <p id="88gc">Причина была значительно прозаичнее: <strong>железо ещё не приехало, а программировать уже хотелось.</strong></p>
  <p id="TwEo">Поэтому я сделал виртуальное устройство и начал строить backend вокруг него. Но временное решение осталось полезным и после появления настоящей ESP32.</p>
  <p id="FbrX">Это позволило разделить две вещи:</p>
  <figure id="bX4U" class="m_original">
    <img src="https://img1.teletype.in/files/44/32/4432f8c3-3032-482b-9a8e-9b70c9200d86.png" width="663" />
  </figure>
  <p id="Nj5k">Для проверки backend мне больше не обязательно физическое устройство. Я могу запустить simulator, создать несколько виртуальных устройств, остановить одно из них, проверить offline detection, восстановить его и посмотреть lifecycle целиком.</p>
  <p id="fSth">А настоящее железо нужно уже тогда, когда я проверяю именно hardware-specific поведение. Получился подход, который я совершенно точно буду использовать и в следующих подобных проектах: </p>
  <blockquote id="5WNo">Если сервер взаимодействует с устройством через формализованный протокол — сначала стоит научиться эмулировать это устройство.</blockquote>
  <p id="FkzJ">Особенно если доставка с маркетплейса занимает дольше, чем написание первой версии backend.</p>
  <h2 id="heartbeat_okazalsya_interesnee_samogo_hea">Heartbeat оказался интереснее самого heartbeat</h2>
  <p id="Fnz6">Изначально heartbeat выглядел самой простой частью проекта.</p>
  <figure id="GIK3" class="m_original">
    <img src="https://img1.teletype.in/files/02/9e/029e4f4b-dab8-4cac-9bf5-046aa1c2e4c3.png" width="666" />
  </figure>
  <p id="0wnj">Получили запрос — устройство работает.</p>
  <p id="I4nR">Но достаточно задать следующий вопрос: <strong>а что делать, если запрос не пришёл?</strong></p>
  <p id="HEzY">И сразу появляются timeout, offline threshold, incident lifecycle, recovery policy и защита от повторных событий.</p>
  <figure id="MDQw" class="m_original">
    <img src="https://img4.teletype.in/files/f9/cb/f9cb5e8b-0239-4e23-9e97-40cf8a03a501.png" width="661" />
  </figure>
  <p id="PXPW">Сам HTTP endpoint оказался самой неинтересной частью. Интерес начинается вокруг определения <strong>состояния системы по неполному и потенциально нестабильному сигналу</strong>. И это уже проблема далеко не только IoT.</p>
  <h2 id="pet_proekt__horoshee_mesto_dlya_izycheniya">Pet-проект — хорошее место для изучения нового</h2>
  <p id="iqgl">У этого проекта с самого начала была ещё одна цель.</p>
  <p id="KxTK">Мне хотелось использовать его как полигон сразу для нескольких направлений.</p>
  <p id="O075">Я изучал IoT и хотел наконец сделать что-нибудь с ESP32, что будет решать настоящую задачу, а не заканчивать жизнь после выполнения очередной лабораторной работы.</p>
  <p id="Mtmi">Параллельно я изучал Go и хотел написать на нём что-то большее, чем учебный HTTP-сервер.</p>
  <p id="gH3a">А ещё мне хотелось проверить агентный workflow разработки. Последнее в итоге стало отдельным экспериментом внутри эксперимента.</p>
  <p id="KDhP">Вместо того чтобы просто ставить агенту задачу вроде <strong>«сделай уведомления»</strong>, я постепенно пришёл к тому, чтобы разделять работу на отдельные роли и этапы:</p>
  <figure id="I102" class="m_original">
    <img src="https://img3.teletype.in/files/e5/0e/e50e9063-adf6-4ad6-9735-3a44ee81cdff.png" width="661" />
  </figure>
  <p id="Hbzn">Для маленького проекта такой процесс может выглядеть избыточно. Но именно здесь его и было удобно проверять.</p>
  <p id="fWWh">Цена ошибки небольшая, весь код находится перед глазами, а результат работы агента можно сравнить не с абстрактной оценкой «вроде работает», а с конкретным физическим устройством.</p>
  <p id="PeHN">ESP32 либо отправляет heartbeat, либо нет. Incident либо открывается, либо нет. Push либо приходит, либо нет.</p>
  <p id="Os5h">В результате сам проект стал не только экспериментом с IoT, но ещё и полигоном для того, как я хочу организовывать работу с coding agents в более крупных проектах.</p>
  <h2 id="inogda_nyjno_prosto_ostanovitsya">Иногда нужно просто остановиться</h2>
  <p id="C0cU">Наверное, это главный вывод всей истории. Сейчас в проект можно добавить ещё очень много всего:</p>
  <ul id="gzXf">
    <li id="SCb4">Графики доступности.</li>
    <li id="ztH6">Метрики latency.</li>
    <li id="5tql">Packet loss.</li>
    <li id="tFbe">OTA-обновления.</li>
    <li id="TGIJ">Удалённую конфигурацию Wi-Fi.</li>
    <li id="Fhxa">Несколько probe в разных частях офиса.</li>
    <li id="dcln">Prometheus.</li>
    <li id="3gf8">Grafana.</li>
    <li id="1iex">Нормальную telemetry platform.</li>
  </ul>
  <p id="h88E">Можно вернуть Ethernet. Можно вообще спроектировать собственную плату и напечатать для неё красивый корпус. И почти каждое такое улучшение можно технически обосновать. Но исходная задача уже решена. Устройство стоит в офисе. Оно самостоятельно выходит в интернет. Сервер понимает, когда связь пропадает. Я могу посмотреть текущее состояние.</p>
  <p id="pMTp">Система умеет сообщить о проблеме. LightPulse получает свой периодический сигнал. Значит, в какой-то момент нужно перестать проектировать следующую версию и признать: <strong>шалость удалась.</strong></p>
  <h2 id="posleslovie_a_kak_eeto_voobsche_proshivat">Послесловие: а как это вообще прошивать с Mac на Apple Silicon?</h2>
  <p id="6qey">Когда основная часть проекта уже заработала, осталась ещё одна довольно практическая проблема. Разрабатывать всё это я начал на MacBook с Apple Silicon. Backend здесь никаких особых сюрпризов не преподносил: Go, Docker, SQLite — обычная рабочая среда. С ESP32 всё оказалось немного интереснее.</p>
  <p id="XHww">Для разработки firmware используется ESP-IDF — официальный framework и toolchain для ESP32. Его можно установить непосредственно на macOS, настроить зависимости, Python environment, toolchain и работать локально.</p>
  <p id="4VwM">Но мне хотелось другого. После экспериментов с окружением мы пришли к довольно удобной схеме: <strong>не устанавливать и не поддерживать весь ESP-IDF toolchain на основной системе, а выполнять сборку firmware внутри Docker.</strong></p>
  <p id="CL4e">Получается примерно так:</p>
  <figure id="2t6q" class="m_original">
    <img src="https://img1.teletype.in/files/0e/da/0eda1205-bfc3-4639-861d-f0333b031171.png" width="664" />
  </figure>
  <p id="lPcv">У такого подхода оказался приятный побочный эффект. Среда сборки firmware становится практически частью самого проекта. Не нужно вспоминать, какую версию ESP-IDF я устанавливал полгода назад, какие Python-пакеты потребовались, какой toolchain лежит в системе и что я когда-то добавлял в PATH.</p>
  <p id="VuwH">Есть исходный код. Есть известная версия ESP-IDF. Есть контейнер. Можно воспроизвести сборку.</p>
  <h2 id="no_docker_ymeet_ne_vsyo">Но Docker умеет не всё</h2>
  <p id="dmF0">Здесь, правда, обнаруживается интересная особенность macOS.</p>
  <p id="iHBB">Docker Desktop на Mac работает не непосредственно на ядре macOS, а через Linux VM. Поэтому привычная для Linux идея:</p>
  <figure id="F1AW" class="m_original">
    <img src="https://img2.teletype.in/files/5a/3d/5a3dc405-9ef1-44e4-a705-17178eec5bd1.png" width="663" />
  </figure>
  <p id="vk8d">с USB/serial-устройствами на macOS превращается уже не в настолько очевидную историю. А ESP32 нужно не только собрать. Её ещё нужно прошить.</p>
  <p id="L2Xa">В итоге удобно разделить процесс на две части:</p>
  <figure id="qf85" class="m_original">
    <img src="https://img2.teletype.in/files/96/17/9617ae61-5163-4c7b-96a5-4dec82d51165.png" width="662" />
  </figure>
  <p id="TXmR">Docker отвечает за воспроизводимую среду сборки с ESP-IDF. А непосредственную работу с serial-портом можно оставить хостовой системе и использовать отдельный инструмент для прошивки. В моём случае таким инструментом стал espflash.</p>
  <p id="265R">Получился достаточно удобный компромисс:</p>
  <figure id="2Jna" class="m_original">
    <img src="https://img1.teletype.in/files/4b/22/4b2237c9-63dc-470a-8c70-b773fbb941d1.png" width="663" />
  </figure>
  <p id="QNsQ">То есть тяжёлое SDK-окружение живёт внутри контейнера, а маленькая утилита на хосте занимается только тем, что действительно требует непосредственного доступа к USB-устройству.</p>
  <p id="cqTA">Для разработки на Mac это оказалось гораздо приятнее, чем пытаться заставить контейнер полностью владеть физической ESP32.</p>
  <h2 id="i_eschyo_raz_pro_simulator">И ещё раз про simulator</h2>
  <p id="Pj4I">Здесь окончательно проявилось преимущество simulator-first подхода.</p>
  <p id="G5tl">Большую часть backend-разработки вообще не нужно связывать с этим workflow.</p>
  <figure id="50WM" class="m_original">
    <img src="https://img3.teletype.in/files/ed/90/ed90ad9b-b6c6-44e8-a407-52c8214246cd.png" width="663" />
  </figure>
  <p id="8Yso">Пока я меняю API, работу с устройствами, incidents или другую серверную логику — можно использовать simulator. Docker с ESP-IDF и физическая ESP32 нужны только тогда, когда изменения действительно затрагивают firmware.</p>
  <p id="gRsL">Получилось довольно удобное разделение:</p>
  <figure id="HFBO" class="m_original">
    <img src="https://img3.teletype.in/files/69/2e/692e236b-e19a-45a3-82cc-28ea465a33f2.png" width="664" />
  </figure>
  <p id="VVew">Для проекта, который начинался с вопроса «есть ли интернет в офисе?», получился вполне приличный маленький development environment.</p>
  <p id="NcOZ">На этом эксперимент можно было считать законченным. По крайней мере, до следующей идеи.</p>
  <p id="JuzU"><strong>Шалость удалась.</strong></p>
  <h2 id="kajetsya_eeto_tolko_nachalo">Кажется, это только начало</h2>
  <p id="4yAD">Есть ещё один результат проекта, которого я изначально вообще не планировал. После того как первая версия заработала, мне не захотелось закрыть репозиторий и поставить устройство на полку.</p>
  <p id="XPKm">Получилось ровно наоборот. Появилось ещё больше желания продолжить эксперимент.</p>
  <p id="IWfO">ESP32 отлично справилась с той задачей, ради которой всё начиналось: маленькое устройство постоянно находится в офисе, практически ничего не требует от инфраструктуры и может сообщить внешнему серверу, что сеть доступна.</p>
  <p id="35dT">Но теперь интересно попробовать сделать следующий шаг. Например, собрать уже более полноценный network probe на базе <strong>Raspberry Pi</strong>. Это будет устройство совсем другого класса.</p>
  <p id="pwBk">Если ESP32 в текущей реализации в основном отвечает на бинарный вопрос <strong>«могу ли я сейчас выйти из офисной сети наружу?»</strong>, то с Raspberry Pi можно будет задавать системе гораздо больше вопросов.</p>
  <figure id="Imuk" class="m_original">
    <img src="https://img1.teletype.in/files/0b/7f/0b7f15d0-a4a4-45d8-8e2c-4f519b3cab3b.png" width="662" />
  </figure>
  <p id="gaDM">И здесь мониторинг уже начинает постепенно превращаться в <strong>диагностику</strong>.</p>
  <p id="M9q7">Представим, что внешний heartbeat пропал. Сейчас система может уверенно сказать: <strong>устройство давно не выходит на связь</strong>. Но более функциональный probe перед окончательной потерей связи или после её частичного восстановления мог бы собрать дополнительный контекст.</p>
  <p id="h5Fn">Например:</p>
  <figure id="njgo" class="m_original">
    <img src="https://img1.teletype.in/files/cd/ec/cdec983c-5b80-4dbc-b407-b87bb9fdd699.png" width="661" />
  </figure>
  <p id="auLT">Конечно, реальная диагностика сети значительно сложнее этой схемы. Но именно это и делает продолжение интересным.</p>
  <p id="lvYd">Можно постепенно добавлять сценарии проверки, сохранять результаты диагностики вместе с incident, сравнивать поведение разных узлов и пытаться не просто обнаружить проблему, а собрать достаточно информации для её первоначального анализа.</p>
  <p id="9qd3">Тогда вместо сообщения <strong>«офис offline»</strong> со временем можно будет получать более полезную диагностику: <strong>«Офис не может выйти в интернет: локальный gateway доступен, DHCP-конфигурация сохранена, DNS-запросы не проходят, внешний узел по IP доступен»</strong> или <strong>«Устройство не видит даже gateway — вероятнее всего, проблема находится внутри локальной сети»</strong>.</p>
  <p id="nIgg">Это уже совсем другой уровень проекта.</p>
  <p id="kczJ">Появляется пространство для сетевых утилит, фоновых диагностических сценариев, накопления метрик и автоматического анализа результатов. Можно экспериментировать с тем, <strong>сколько информации устройство способно собрать самостоятельно до того, как человеку вообще придётся подключаться к диагностике</strong>.</p>
  <p id="5G9A">И мне нравится, что идея следующей версии появилась не потому, что первая была недостаточно хороша.</p>
  <p id="Yp2O">Наоборот.</p>
  <p id="h4x4">Первая версия решила именно ту задачу, ради которой создавалась, а заодно показала, что за простым вопросом <strong>«Есть ли интернет в офисе?»</strong> скрывается гораздо более интересный: <strong>«А если его нет, можем ли мы автоматически понять хотя бы примерно, почему?»</strong></p>
  <p id="flOT">Так что шалость действительно удалась.</p>
  <p id="hMNU">Просто, похоже, она ещё не закончилась.</p>
  <p id="PQ2F">Весь проект я вынес в открытый репозиторий на GitHub — <a href="https://dzen.ru/away?to=https%3A%2F%2Fgithub.com%2Fevelkin-lightech%2Fesp32-s3-network-monitor" target="_blank"><strong>ESP32 S3 Network Monitor</strong></a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/5BWddXJEsZM</guid><link>https://teletype.in/@lightech/5BWddXJEsZM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/5BWddXJEsZM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>TaskIQ: современная альтернатива Celery для асинхронных задач в Python</title><pubDate>Mon, 03 Aug 2026 18:05:09 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/82/52/8252c654-1046-4baf-8565-eb559aa7649e.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/78/d4/78d45795-cb3d-47d6-93ea-2129ce4430c7.png"></img>Кратко:]]></description><content:encoded><![CDATA[
  <figure id="vo1V" class="m_original">
    <img src="https://img4.teletype.in/files/78/d4/78d45795-cb3d-47d6-93ea-2129ce4430c7.png" width="1800" />
    <figcaption>TaskIQ</figcaption>
  </figure>
  <p id="a3oQ"><em>Кратко:</em></p>
  <ul id="dWnH">
    <li id="hgq2"><em>TaskIQ — async-first очередь задач для Python, удобна с FastAPI.</em></li>
    <li id="HLCq"><em>Поддерживает sync и async задачи, несколько брокеров, встроенный scheduler.</em></li>
    <li id="DVi6"><em>Celery зрелее и лучше подходит для Django/Flask.</em></li>
    <li id="S0t6"><em>TaskIQ — для новых async-проектов; миграция с Celery оправдана не всегда.</em></li>
  </ul>
  <p id="JkSE">Если приложению нужно отправить письмо, обработать изображение или выполнить запрос к внешнему API, такие операции обычно выносят в очередь задач (task queue). Благодаря этому сервер быстро отвечает пользователю, а сама задача выполняется в фоновом режиме.</p>
  <p id="E76K">Годами дефолтным выбором для этого в Python был Celery. Он проектировался до широкого распространения asyncio, и основная модель по-прежнему синхронная — async в Celery 5+ поддерживается частично.</p>
  <p id="vESJ">TaskIQ — более молодой распределённый менеджер задач, изначально ориентированный на async/await. Он поддерживает и синхронные, и асинхронные задачи. В статье разберём, как устроен TaskIQ, чем он отличается от Celery на практике, что показали наши бенчмарки на TaskIQ 0.12.x, и когда переход имеет смысл.</p>
  <h2 id="chto-takoe-taskiq">Что такое TaskIQ</h2>
  <p id="qgBd">TaskIQ — это современный Python task-queue, ориентированный на async/await. Он изначально заточен под asyncio и под фреймворки вроде FastAPI, поддерживает несколько брокеров сообщений (Redis, RabbitMQ, NATS, ZeroMQ) и в целом настраивается проще, чем Celery.</p>
  <p id="y4v6">Основные возможности:</p>
  <ul id="5RsO">
    <li id="Ndmt">async/await — API рассчитан на асинхронный код; sync-задачи тоже поддерживаются (thread/process pool).</li>
    <li id="3iyI">Несколько брокеров — Redis, RabbitMQ, NATS, ZeroMQ; community: PostgreSQL, SQS, YDB, Kafka.</li>
    <li id="DqWr">scheduler — встроенный планировщик (cron, interval schedules, dynamic scheduling через Redis).</li>
    <li id="towg">Dependency Injection — TaskiqDepends() (как в FastAPI), переиспользование зависимостей между HTTP и задачами.</li>
    <li id="ws2p">retry — SimpleRetryMiddleware или SmartRetryMiddleware (middleware, подключается явно).</li>
    <li id="qRQx">Мониторинг — Prometheus (taskiq[metrics]) и OpenTelemetry (taskiq[opentelemetry], 0.12+).</li>
    <li id="FWk5">acknowledgements — --ack-type (when_saved по умолчанию), per-task ack_type, manual через Context.ack().</li>
    <li id="ApNG">type casts — автоматический парсинг аргументов по type hints (Pydantic, dataclasses).</li>
  </ul>
  <h2 id="kak-ustroen-taskiq">Как устроен TaskIQ</h2>
  <p id="sHth">Схема выполнения задачи выглядит так:</p>
  <p id="3d0Y"><em>Приложение → Broker → Worker → Result Backend</em></p>
  <figure id="LvPf" class="m_original">
    <img src="https://img4.teletype.in/files/b7/37/b7378edc-3f3c-4799-a938-611e069f3d2f.png" width="1800" />
    <figcaption>Как устроен TaskIQ</figcaption>
  </figure>
  <p id="HiWf">Приложение отправляет задачу через <code>kicker (.kiq() </code>— сокращение для <code>.kicker().kiq(...))</code>. Kicker позволяет менять broker, labels, task_id и timeout на лету. Перед отправкой обязателен <code>await broker.startup()</code> — без этого поведение не определено. Результат — через <code>TaskiqTask.wait_result()</code>.</p>
  <p id="f2BM">Далее задачу принимает <strong>Broker </strong>— посредник между приложением и воркером. Он помещает сообщение в очередь. Это можно сравнить с почтальоном, который доставляет письмо в почтовый ящик.</p>
  <p id="rrzt"><strong>Worker </strong>отслеживает очередь, забирает новые задачи и выполняет связанный с ними код.</p>
  <p id="Zz1c">Если необходимо сохранить результат выполнения, он отправляется в <strong>Result Backend</strong>. Его настраивают отдельно от брокера. Чаще всего для этой роли используют Redis — он быстро настраивается, хорошо интегрируется с TaskIQ и обеспечивает быстрый доступ к результатам.</p>
  <h2 id="kakie-zadachi-luchshe-podhodyat-dlya-taskiq">Какие задачи лучше подходят для TaskIQ</h2>
  <figure id="SlEy" class="m_original">
    <img src="https://img3.teletype.in/files/63/8a/638a32da-7163-45c2-84cb-c3160fa5fa93.png" width="1354" />
    <figcaption> Задачи для TaskIQ</figcaption>
  </figure>
  <p id="pruL">TaskIQ лучше всего подходит для IO-bound и сетевых задач. Благодаря асинхронной архитектуре воркер не простаивает во время ожидания ответа от API, базы данных или другого внешнего сервиса. Пока одна задача ожидает завершения операции ввода-вывода, event loop может переключиться на выполнение других задач, что позволяет эффективнее использовать ресурсы.</p>
  <p id="MKAf">Memory-heavy задачи TaskIQ не «лечит» сам по себе: async не снижает потребление RAM. Такие задачи имеет смысл выносить в отдельные воркеры или process pool и контролировать лимиты памяти на уровне инфраструктуры.</p>
  <p id="PP3h">С CPU-bound задачами ситуация иная. Вычисления упираются в GIL и могут блокировать event loop. Для sync CPU-задач используйте <code>--use-process-pool;</code> для async — отдельные воркеры/очереди, чтобы тяжёлые задачи не мешали IO-bound.</p>
  <h2 id="osnovnye-vozmozhnosti-taskiq">Основные возможности TaskIQ</h2>
  <p id="4k37">TaskIQ предоставляет все основные механизмы для построения системы фоновых задач: работу с разными брокерами сообщений, декларативное описание задач, управление воркерами и запуск задач по расписанию.</p>
  <h3 id="podderzhka-neskolkih-brokerov"><strong>Поддержка нескольких брокеров</strong></h3>
  <p id="oZpt">TaskIQ не привязывается к одному брокеру сообщений. Можно выбрать подходящий вариант в зависимости от требований проекта: скорости, надежности, архитектуры и инфраструктуры.</p>
  <figure id="wufG" class="m_original">
    <img src="https://img4.teletype.in/files/fd/7e/fd7e914a-fad1-4153-8ad1-df7a2debb3b6.png" width="1442" />
    <figcaption>Основные возможности TaskIQ</figcaption>
  </figure>
  <p id="vtfg">Настройка брокера в TaskIQ выполняется декларативно: разработчик импортирует нужный брокер и описывает его конфигурацию. После этого к нему можно подключить Result Backend для хранения результатов, изменить формат сообщений или добавить middleware для расширения логики обработки задач.</p>
  <h3 id="deklaracziya-zadach"><strong>Декларация задач</strong></h3>
  <p id="HVRJ">В TaskIQ задачи описываются декоратором <code>@broker.task</code> — подход похож на Celery. Декоратор регистрирует sync или async функцию как задачу. Sync выполняется в thread pool (IO) или process pool (CPU, флаг <code>--use-process-pool</code>).</p>
  <pre id="bWMn">&#x60;&#x60;&#x60;python from taskiq_redis import ListQueueBroker, RedisAsyncResultBackend broker = ListQueueBroker(url=&quot;redis://localhost:6379/0&quot;).with_result_backend( RedisAsyncResultBackend(redis_url=&quot;redis://localhost:6379/1&quot;) ) @broker.task async def send_notification(user_id: int) -&gt; None: ... # await send_notification.kiq(user_id) # CLI: taskiq worker myapp.broker:broker myapp.tasks --workers 2 --max-async-tasks 10 &#x60;&#x60;&#x60;</pre>
  <p id="4jnz">При объявлении задачи можно указать дополнительные параметры:</p>
  <ul id="mDLw">
    <li id="gJCb"><strong>task name </strong>— уникальное имя задачи для обращения к ней;</li>
    <li id="1DCI"><strong>labels</strong> — метаданные и дополнительные настройки выполнения.</li>
  </ul>
  <p id="gxiR">После запуска задачи разработчик может дождаться результата выполнения, проверить текущий статус задачи и получить информацию о времени выполнения других метаданных.</p>
  <p id="kBBs">Также TaskIQ поддерживает механизм <strong>shared broker</strong>. Он позволяет собрать задачи из разных частей проекта и использовать единый брокер без жёсткой привязки каждой задачи к конкретному экземпляру конфигурации.</p>
  <h3 id="worker"><strong>Worker</strong></h3>
  <p id="KyYb">Worker — это компонент, который получает задачи из очереди и выполняет их. TaskIQ предоставляет несколько CLI-параметров для управления его поведением.</p>
  <figure id="UER2" class="m_original">
    <img src="https://img2.teletype.in/files/5a/5a/5a5a6cd2-f317-4af3-a7be-0da538072830.png" width="1370" />
    <figcaption><strong>Worker</strong></figcaption>
  </figure>
  <p id="7NIO">По умолчанию <code>--fs-discover</code> ищет задачи в файле <code>tasks.py</code>. Если задачи организованы внутри отдельных пакетов, шаблон поиска можно изменить вручную.</p>
  <p id="Q6sW">Параметр <code>--reload</code> особенно полезен в локальной разработке: при изменении кода перезапускается только нужный воркер, что ускоряет проверку изменений.</p>
  <h3 id="scheduler"><strong>Scheduler</strong></h3>
  <p id="7UuZ">TaskIQ включает <code>TaskiqScheduler</code>: cron (<code>LabelScheduleSource</code>), interval schedules (<code>schedule_by_interval</code>) и dynamic scheduling через <code>ListRedisScheduleSource</code>. Запуск: <code>taskiq scheduler module:scheduler</code>.</p>
  <p id="4pTc">Для работы планировщика необходимо указать:</p>
  <ul id="Ss8t">
    <li id="JQz2">брокер, через который будут выполняться задачи;</li>
    <li id="Klq7">источник расписания.</li>
  </ul>
  <p id="ioLX">Основные параметры Scheduler в таблице ниже.</p>
  <figure id="MXs5" class="m_original">
    <img src="https://img3.teletype.in/files/6e/cf/6ecf92fa-cc2a-4a63-8ad0-4a5f50efe264.png" width="1376" />
    <figcaption><strong>Scheduler</strong></figcaption>
  </figure>
  <p id="Hcej"><strong>Важно</strong>: scheduler не выполняет задачи — только ставит их в очередь через broker. Worker выполняет. Запускайте один экземпляр scheduler; несколько инстансов могут продублировать задачи. Для timezone — поле <code>cron_offset</code> в расписании.</p>
  <h2 id="integracziya-s-fastapi">Интеграция с FastAPI</h2>
  <p id="KGoL">TaskIQ интегрируется с FastAPI через пакет taskiq-fastapi. Вызов taskiq_fastapi.init(broker, &quot;myapp.main:app&quot;) подключает брокер к приложению.</p>
  <p id="vFKK">Брокер нужно явно стартовать и останавливать. Предпочтительный способ — lifespan FastAPI:</p>
  <pre id="alvP">@asynccontextmanager async def lifespan(app: FastAPI): await broker.startup() yield await broker.shutdown() app = FastAPI(lifespan=lifespan)</pre>
  <h2 id="dopolnitelnye-vozmozhnosti-taskiq">Дополнительные возможности TaskIQ</h2>
  <p id="bEA5">Помимо базового выполнения фоновых задач, TaskIQ предоставляет инструменты для построения более надежных и масштабируемых систем.</p>
  <h3 id="dependency-injection"><strong>Dependency Injection</strong></h3>
  <p id="bgo6">DI через <code>TaskiqDepends()</code> — по аналогии с FastAPI. Зависимости можно переиспользовать между HTTP-handlers и задачами (с учётом ограничений: <code>Request </code>в задаче — mock, не тот же объект, что в handler).</p>
  <p id="4DO7">Например, таким способом можно подключать настройки приложения, клиентов внешних API или сервисы для работы с базой данных.</p>
  <h3 id="state-i-context"><strong>State и Context</strong></h3>
  <p id="gT6A">TaskiqState — shared state воркера: инициализируется в @broker.on_event(WORKER_STARTUP) (connection pools, clients). Из задачи доступен через Context (TaskiqDepends()).</p>
  <p id="fMn7">Context также даёт requeue() и reject() — вернуть задачу в очередь или отбросить без повторного выполнения. Manual ack — через await context.ack() (требует AckableMessage у broker).</p>
  <h3 id="smart-retry"><strong>Smart Retry</strong></h3>
  <p id="cmZm">Smart Retry — middleware (<code>SmartRetryMiddleware</code>), подключается явно к брокеру. Автоматически возвращает неуспешные задачи в очередь с настраиваемым backoff и jitter. <strong>Не включён по умолчанию.</strong></p>
  <p id="rZXA">В TaskIQ можно настроить:</p>
  <ul id="Df1B">
    <li id="0Fuk">количество попыток;</li>
    <li id="Z0sy">задержку между повторными запусками;</li>
    <li id="vlPD">случайное смещение времени ожидания (jitter).</li>
  </ul>
  <blockquote id="gGY3">Использование jitter помогает избежать ситуации, когда после массового сбоя большое количество задач одновременно повторяет запросы и создает дополнительную нагрузку на систему.<br /><br />Для простых сценариев есть <code>SimpleRetryMiddleware</code> — фиксированное число повторов без backoff. <code>SmartRetryMiddleware</code> — для production: jitter, exponential backoff, кастомный schedule source.</blockquote>
  <h3 id="pipeline"><strong>Pipeline</strong></h3>
  <p id="kYg7">Pipeline позволяет создавать цепочки связанных задач, где результат одной операции передается в следующую.</p>
  <p id="VGJV"><em>Например:</em></p>
  <p id="YVhf"><em>Загрузка файла → обработка данных → сохранение результата → отправка уведомления</em></p>
  <p id="zhvT">Дополнительно поддерживаются операции:</p>
  <ul id="vZwg">
    <li id="iy60"><strong>mapping</strong> — выполнение одной задачи для каждого элемента списка;</li>
    <li id="tIsh"><strong>filtering</strong> — обработка только тех элементов, которые соответствуют заданным условиям.</li>
  </ul>
  <h3 id="metriki-i-monitoring"><strong>Метрики и мониторинг</strong></h3>
  <p id="ojtE">TaskIQ поддерживает Prometheus (taskiq[metrics]) и OpenTelemetry (с 0.12+). Через middleware отслеживаются:</p>
  <ul id="XlTW">
    <li id="SDQJ">количество выполненных задач и ошибок;</li>
    <li id="anDk">время выполнения;</li>
    <li id="wM6p">состояние очередей и ресурсы воркеров (OTel).</li>
  </ul>
  <h3 id="testirovanie-zadach"><strong>Тестирование задач</strong></h3>
  <p id="Yzn0">Для проверки логики задач TaskIQ предоставляет <strong>in-memory broker</strong>. Он позволяет запускать задачи без подключения Redis, RabbitMQ или другого внешнего брокера. Это удобно для юнит-тестов: разработчик может проверить работу бизнес-логики, обработку ошибок и сценарии выполнения задач без дополнительной инфраструктуры.</p>
  <p id="Wys4">Для тестов — <code>InMemoryBroker</code>: тот же интерфейс, без сети. Типичный паттерн: подмена broker по <code>ENVIRONMENT=pytest</code>. Задачу можно вызвать как обычную async-функцию или через <code>.kiq()</code> + <code>wait_result()</code>. Для fire-and-forget — <code>await_inplace=True</code> или <code>broker.wait_all()</code>. С FastAPI — <code>taskiq_fastapi.populate_dependency_context()</code>.</p>
  <h2 id="prakticheskie-rekomendaczii-dlya-raboty-s-taskiq">Практические рекомендации для работы с TaskIQ</h2>
  <p id="SPWX">Чтобы TaskIQ работал эффективно в production-среде, важно правильно организовать задачи, настроить обработку ошибок и контролировать состояние системы.</p>
  <ul id="EZXr">
    <li id="Ef0H">Разделяйте задачи по типу нагрузки — отдельный брокер для CPU-bound, отдельный для IO-bound (<code>cpu_tasks.py</code>, <code>io_tasks.py</code>).</li>
    <li id="2Kd6">Оборачивайте задачи в try-except и подключайте <code>SmartRetryMiddleware</code>. Для Redis используйте <code>taskiq-redis</code> (Streams/ListQueue) и настраивайте <code>--ack-type</code> (<code>when_saved, when_executed</code>, <code>manual</code>). Надёжность зависит от брокера и ack-политики, а не только от «Redis vs RabbitMQ».</li>
    <li id="oFjf">Используйте async/await везде, где это возможно, а не только в отдельных задачах.</li>
    <li id="AmHR">Настройте мониторинг — Prometheus или OpenTelemetry плюс структурированные логи.</li>
    <li id="l27g">Вызывайте <code>await broker.startup()</code> в клиенте и <code>broker.shutdown() </code>при остановке.</li>
    <li id="lJf2">Настройте timeouts для долгих задач: <code>@broker.task(timeout=30)</code> или <code>.kicker().with_labels(timeout=30).kiq()</code>.</li>
    <li id="qRKO">Для sync CPU-bound — <code>--use-process-pool</code>; для sync IO — <code>thread pool (default)</code>.</li>
    <li id="f7ti"><code>--max-prefetch</code> имеет смысл только с брокерами, поддерживающими ack.</li>
    <li id="iDj4">Установите uvloop — TaskIQ подхватит его автоматически, если пакет есть.</li>
  </ul>
  <figure id="2HzO" class="m_original">
    <img src="https://img3.teletype.in/files/2d/b4/2db4f159-7bd3-4d8b-8b76-adf842bab891.png" width="1800" />
    <figcaption>Практические рекомендации для работы с TaskIQ</figcaption>
  </figure>
  <h2 id="ogranicheniya-taskiq">Ограничения TaskIQ</h2>
  <p id="htWD">Несмотря на удобную архитектуру и современный подход, TaskIQ пока не является полностью зрелой заменой более старым системам фоновых задач. Перед использованием в крупных production-проектах стоит учитывать несколько особенностей.</p>
  <h2 id="menshe-production-kejsov-chem-u-celery">Меньше production-кейсов, чем у Celery</h2>
  <p id="GpDe">TaskIQ активно развивается (документация на taskiq-python.github.io заметно выросла), но community и production-историй всё ещё меньше, чем у Celery (~2.2k vs ~28k stars на GitHub).</p>
  <ul id="UoBL">
    <li id="A6hg">меньше готовых решений для нестандартных edge cases;</li>
    <li id="L9OP">меньше battle-tested примеров из крупных prod-систем;</li>
    <li id="56h8">часть архитектурных решений придётся валидировать своими нагрузочными тестами.</li>
  </ul>
  <p id="isJX"><em>Для небольших и средних проектов это обычно не становится проблемой, но при построении критически важных систем стоит заранее оценить зрелость экосистемы.</em></p>
  <h3 id="scheduler-ne-sohranyaet-sostoyanie-mezhdu-perezapuskami"><strong>Scheduler не сохраняет состояние между перезапусками</strong></h3>
  <p id="4fYn">У встроенного планировщика TaskIQ есть ограничение: он не хранит информацию о предыдущих запусках между перезапусками.</p>
  <p id="EVkQ">Например, если Scheduler был остановлен и запущен снова в течение короткого промежутка времени, уже выполненная задача может быть поставлена в очередь повторно.</p>
  <p id="iikW">Параметр <code>--skip-first-run</code> помогает избежать первого автоматического запуска после старта, но не проверяет, выполнялась ли задача ранее.</p>
  <p id="fByo"><em>В системах, где важно гарантировать однократное выполнение запланированных задач, это необходимо учитывать. Например, в Celery есть Database Scheduler, который сохраняет состояние расписания в базе данных. В TaskIQ подобного встроенного механизма пока нет.</em></p>
  <h3 id="scheduler-rabotaet-tolko-v-odnom-ekzemplyare"><strong>Scheduler работает только в одном экземпляре</strong></h3>
  <p id="DjmT">TaskIQ Scheduler рассчитан на работу в одном экземпляре. Запустить несколько планировщиков одновременно для повышения отказоустойчивости нельзя без дополнительной архитектуры вокруг него.</p>
  <p id="LraY"><em>Для проектов с высокими требованиями к надёжности это означает необходимость самостоятельно продумывать механизм защиты от дублирования задач и контроля состояния планировщика.</em></p>
  <h2 id="taskiq-vs-celery">TaskIQ vs Celery</h2>
  <p id="CuHj">Celery — один из самых популярных инструментов для выполнения фоновых задач в Python. Проект существует более 15 лет, имеет большое сообщество, множество интеграций и активно используется в production-системах, особенно в проектах на Django.</p>
  <p id="z0li">Главное преимущество Celery — зрелость. За годы развития вокруг него сформировалась большая экосистема: готовые решения для мониторинга, планирования задач, обработки ошибок и интеграции с различными брокерами сообщений.</p>
  <p id="vwAE">TaskIQ появился позже и изначально создавался с учетом современных асинхронных подходов Python. Его основная идея — нативная работа с async/await и удобная интеграция с асинхронными фреймворками.</p>
  <p id="8Xqg">Основные отличия TaskIQ и Celery привёл в таблице ниже.</p>
  <figure id="ByJx" class="m_original">
    <img src="https://img1.teletype.in/files/06/ab/06abdf1f-0b9b-4e11-881e-bf63207bff69.png" width="1318" />
    <figcaption>TaskIQ vs Celery</figcaption>
  </figure>
  <h3 id="HWQD"><strong>Производительность TaskIQ и Celery</strong></h3>
  <p id="4Q8c">Мы прогнали сравнение на внутреннем стенде. Это не официальный benchmark — результат зависит от железа, брокера и настроек воркеров.</p>
  <figure id="9VsG" class="m_original">
    <img src="https://img3.teletype.in/files/a4/65/a465a1c2-2e61-4785-a56e-becd6cc59574.png" width="1336" />
    <figcaption><strong>Производительность TaskIQ и Celery</strong></figcaption>
  </figure>
  <p id="q2zT">Наибольшая разница наблюдается в <strong>IO-bound</strong> сценариях: запросах к API, работе с внешними сервисами и другими операциями ожидания. Это связано с async-first архитектурой TaskIQ — пока одна задача ожидает ответа, воркер может выполнять другие операции.</p>
  <p id="7WY3">Для <strong>CPU-bound</strong> задач преимущество меньше, поскольку такие операции ограничиваются особенностями Python и GIL (Global Interpreter Lock). Асинхронность не ускоряет сами вычисления, поэтому прирост зависит от конкретной архитектуры выполнения.</p>
  <p id="9Q4f">При этом результаты бенчмарков нельзя считать универсальными: итоговая производительность зависит от брокера, количества воркеров, настроек очередей и характера задач.</p>
  <p id="fWQ0">Отдельно стоит учитывать влияние дополнительных компонентов. Например, при использовании TaskIQ Admin производительность может снижаться из-за дополнительной нагрузки от мониторинга и middleware. Поэтому перед внедрением в production рекомендуется проводить собственные нагрузочные тесты.</p>
  <h2 id="kogda-vybirat-celery-i-taskiq">Когда выбирать Celery и TaskIQ</h2>
  <p id="bTIL">Выбор между инструментами зависит не только от производительности, но и от архитектуры проекта.</p>
  <figure id="OKqT" class="m_original">
    <img src="https://img1.teletype.in/files/cc/25/cc254abc-bd2b-4401-bf25-9b733dc66cb6.png" width="1392" />
    <figcaption>Когда выбирать Celery и TaskIQ</figcaption>
  </figure>
  <h2 id="stoit-li-migrirovat-s-celery-na-taskiq">Стоит ли мигрировать с Celery на TaskIQ</h2>
  <p id="B8NR">Если задачи уже вынесены в отдельные функции, технический переход умеренный, но это не «замена декоратора»: нужно сменить <code>.delay() → .kiq()</code>, настроить broker startup/shutdown, Celery Beat → TaskIQ Scheduler, retry через middleware. Миграция оправдана не всегда.</p>
  <p id="aXHJ"><em>Django-проекты чаще всего остаются на Celery, так как он имеет глубокую интеграцию с этим фреймворком и большое количество готовых решений. Flask-приложения тоже часто используют такой инструмент.</em></p>
  <p id="T9G1">Переход на TaskIQ имеет смысл, если текущая архитектура действительно ограничивает развитие проекта. Например:</p>
  <ul id="zhdx">
    <li id="CIqQ">приложение построено на FastAPI и активно использует asyncio;</li>
    <li id="ExqN">Celery усложняет работу с асинхронным кодом;</li>
    <li id="rKxZ">требуется более удобная интеграция зависимостей;</li>
    <li id="FqjD">система состоит из микросервисов с большим количеством сетевых операций.</li>
  </ul>
  <p id="KJRV">Главный аргумент в пользу TaskIQ — современный асинхронный подход и удобная работа с типизированным Python-кодом. Но для команды, которая уже хорошо работает с Celery, этого может быть недостаточно для полноценного перехода.</p>
  <p id="c1gf">Во многих проектах используется один и тот же брокер — например Redis или RabbitMQ. Поэтому широкий выбор брокеров TaskIQ не всегда становится решающим преимуществом.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/ERiG-no0-R9</guid><link>https://teletype.in/@lightech/ERiG-no0-R9?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/ERiG-no0-R9?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>BPMN-нотация: как читать и использовать язык описания бизнес-процессов</title><pubDate>Wed, 22 Jul 2026 09:24:57 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e9/4c/e94c7ba3-a2a1-4f7f-896f-9180f324163b.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d0/e9/d0e9d8a7-d103-41a0-876e-67a11e6b91d6.png"></img>Многие проджект-менеджеры со временем начинают глубже разбираться в аналитике. И почти всегда на этом пути встречается BPMN.]]></description><content:encoded><![CDATA[
  <figure id="WdE3" class="m_original">
    <img src="https://img2.teletype.in/files/d0/e9/d0e9d8a7-d103-41a0-876e-67a11e6b91d6.png" width="1800" />
    <figcaption>BPMN в бизнес-процессах </figcaption>
  </figure>
  <p id="4Ow6">Многие проджект-менеджеры со временем начинают глубже разбираться в аналитике. И почти всегда на этом пути встречается BPMN.</p>
  <p id="B0Lq"><em>Например, с помощью BPMN можно показать, как клиент оформляет заказ, как компания согласовывает отпуск сотрудника или как заявка проходит путь от обращения до выполнения.</em></p>
  <p id="puQv">Сначала BPMN может показаться сложной из-за большого количества символов. Но на самом деле большинство диаграмм строится всего из нескольких основных элементов. Если разобраться в них один раз, читать и создавать схемы станет намного проще.</p>
  <p id="C4qE">В этой статье рассмотрим, что такое BPMN, где её используют, из каких элементов она состоит и как научиться читать такие диаграммы.</p>
  <h2 id="chto-takoe-bpmn-prostymi-slovami">Что такое BPMN простыми словами</h2>
  <p id="v3YH">BPMN (Business Process Model and Notation) — это способ показать бизнес-процесс в виде простой схемы. Вместо длинных описаний используются блоки, стрелки и значки, которые помогают быстро понять, что происходит, кто за что отвечает и в каком порядке выполняются действия.</p>
  <p id="TwrM"><em>Главный плюс BPMN в том, что одну и ту же схему одинаково понимают руководители, бизнес-аналитики и разработчики. Всем не нужно по-разному трактовать текст — достаточно посмотреть на диаграмму.</em></p>
  <p id="SP2R">У каждого элемента есть своё значение. Например, задача обозначается прямоугольником, событие — кругом, а место, где процесс может пойти по разным сценариям, — ромбом. Благодаря этим простым правилам схемы легко читать, обсуждать и использовать при анализе или автоматизации процессов.</p>
  <h2 id="gde-primenyaetsya-bpmn">Где применяется BPMN</h2>
  <p id="UH5Y">BPMN используют везде, где нужно наглядно показать, как работает процесс. Это помогает разобраться в текущей схеме работы, найти слабые места и понять, что можно улучшить.</p>
  <p id="7ooj">Чаще всего BPMN применяют в таких задачах:</p>
  <ul id="sIq0">
    <li id="Yvi2"><strong>Анализ процессов</strong>. Сначала рисуют, как процесс работает сейчас (AS IS), а затем создают схему того, как он должен работать после изменений (TO BE). Например, показывают, как сейчас обрабатываются заявки клиентов и как этот процесс можно ускорить.</li>
    <li id="kJZP"><strong>Разработка информационных систем</strong>. Диаграмма помогает заранее понять, как будут взаимодействовать пользователи, сайт, приложение и другие сервисы. Это снижает вероятность ошибок во время разработки.</li>
    <li id="ispl"><strong>Документирование</strong>. BPMN используют в регламентах, инструкциях и при обучении новых сотрудников. Вместо нескольких страниц текста достаточно одной понятной схемы.</li>
    <li id="7LR2"><strong>Проектирование новых процессов</strong>. Перед внедрением нового процесса его можно нарисовать и обсудить со всеми участниками. Так проще заметить ошибки и согласовать логику до начала работы.</li>
  </ul>
  <p id="Qw0Z">Хотя BPMN — это международный стандарт, в реальных проектах редко используют все его возможности. Обычно берут только те элементы, которые нужны для конкретной задачи. Этого достаточно, чтобы схема была понятной и удобной для всей команды.</p>
  <h2 id="osnovnye-elementy-bpmn-diagrammy-uchastniki-dejstviya-i-potoki">Основные элементы BPMN-диаграммы: участники, действия и потоки</h2>
  <p id="y2FJ">Чтобы читать BPMN-диаграммы, сначала нужно разобраться с базовыми элементами, которые показывают участников процесса, выполняемые действия и связи между ними.</p>
  <figure id="gctK" class="m_original">
    <img src="https://img3.teletype.in/files/6f/fd/6ffd42b6-4491-4704-b5ce-75d80e75959c.png" width="1800" />
    <figcaption>Основные элементы BPMN-диаграммы</figcaption>
  </figure>
  <h3 id="puly-i-dorozhki-kto-uchastvuet-v-proczesse"><strong>Пулы и дорожки: кто участвует в процессе</strong></h3>
  <p id="SzS6">В BPMN процесс разделяют между участниками, чтобы было понятно, кто за что отвечает.</p>
  <p id="rV86"><strong>Пул (Pool)</strong> — это участник процесса. Им может быть компания, клиент, банк, курьерская служба или любая внешняя система.</p>
  <p id="udb6">Внутри пула находятся дорожки (Lanes). Они показывают роли или отделы. Например: «Клиент», «Менеджер» и «Бухгалтер». Благодаря этому сразу видно, кто выполняет каждое действие.</p>
  <p id="5nrw">Например, клиент оформляет заказ, менеджер его проверяет, а бухгалтер выставляет счёт. Каждый шаг находится в своей дорожке.</p>
  <p id="KJ18">Если нужно показать только взаимодействие с внешним участником, а его внутренние действия не важны, используют скрытый пул. Например, можно показать только отправку запроса в банк и получение ответа, не описывая, что происходит внутри банковской системы.</p>
  <h3 id="Gzjk"><strong>Действия и потоки: как выполняется процесс</strong></h3>
  <p id="TzCj">Любой процесс состоит из отдельных действий. Это могут быть шаги вроде «Проверить заявку», «Подтвердить оплату» или «Отправить письмо».</p>
  <p id="ttAK">Все действия соединяются стрелками, которые показывают, в каком порядке выполняются шаги.</p>
  <p id="kjD0">Если нужно показать обмен информацией между разными участниками, используют поток сообщений. Например, клиент отправляет заявку компании, а компания отправляет клиенту уведомление о результате.</p>
  <p id="A6iZ">Для большинства процессов достаточно этих простых элементов. Даже с их помощью можно построить понятную схему, которую легко читать всей команде.</p>
  <h3 id="sobytiya-v-bpmn"><strong>События в BPMN</strong></h3>
  <p id="ME1w">События показывают, что произошло или должно произойти в процессе. Например, поступила новая заявка, пришло сообщение, наступило определённое время, возникла ошибка или процесс завершился.</p>
  <p id="8UAb">Именно события запускают процесс, могут менять его ход или заканчивать выполнение. Ниже рассмотрим основные виды событий и разберём, когда их используют.</p>
  <figure id="N0ba" class="m_original">
    <img src="https://img3.teletype.in/files/65/3c/653c2f9f-9738-49a1-98e1-b3fbc401ad5e.png" width="874" />
    <figcaption><strong>События в BPMN</strong></figcaption>
  </figure>
  <p id="bE9p">Помимо типа, события бывают прерывающими и непрерывающими. Прерывающее событие останавливает текущий процесс и переводит его на другой сценарий. То есть, если при оформлении заказа закончился товар, процесс продажи прерывается.</p>
  <p id="h5zE">Непрерывающее событие не останавливает основной процесс, а запускает дополнительное действие. Пока заказ обрабатывается, клиенту автоматически отправляется уведомление. </p>
  <blockquote id="2mZ2">Благодаря этому в BPMN можно показывать не только основной ход процесса, но и ожидания, ошибки, сообщения и другие ситуации, которые возникают в реальной работе.</blockquote>
  <h2 id="speczialnye-dejstviya-i-czikly-v-bpmn">Специальные действия и циклы в BPMN</h2>
  <p id="IXbK">Кроме обычных задач, в BPMN есть специальные элементы. Они нужны, когда процесс становится сложнее: системе нужно самой принимать решения, повторять одно действие несколько раз или обрабатывать список объектов.</p>
  <h3 id="vypolnenie-biznes-pravila"><strong>Выполнение бизнес-правила</strong></h3>
  <p id="uGYI">Этот элемент используют, когда решение принимает не человек, а система по заранее заданным правилам.</p>
  <p id="1uaE">Например, система может автоматически проверить заявку на кредит, рассчитать размер скидки или определить, в какой отдел отправить обращение клиента. Сотруднику не нужно выполнять эти действия вручную — всё происходит автоматически.</p>
  <h3 id="czikl-po-obektam"><strong>Цикл по объектам</strong></h3>
  <p id="Uy9y">Этот элемент используют, если одно и то же действие нужно выполнить несколько раз для разных объектов.</p>
  <p id="BQs6">Например, отправить уведомление всем клиентам, проверить список документов или обработать сразу несколько заявок.</p>
  <p id="r66i">Вместо того чтобы рисовать одну и ту же задачу много раз, в BPMN достаточно показать один шаг и указать, что он повторяется для каждого объекта. Так схема остаётся простой и её легче читать.</p>
  <h2 id="razvilki-shlyuzy-kak-proczess-mozhet-idti-po-raznym-sczenariyam">Развилки (шлюзы): как процесс может идти по разным сценариям</h2>
  <p id="H2Sp">Не всегда процесс проходит по одному и тому же пути. Иногда нужно выбрать один из нескольких вариантов, выполнить сразу несколько действий или дождаться определённого события. Для этого в BPMN используют шлюзы (Gateway).</p>
  <p id="I1c5">Основные виды шлюзов:</p>
  <ul id="mgUi">
    <li id="5zDK"><strong>Исключающий (XOR)</strong> — выбирает только один вариант. Например, если заявка одобрена, её отправляют в работу. Если нет — отклоняют.</li>
    <li id="tS7R"><strong>Параллельный (AND)</strong> — запускает несколько действий одновременно (после оформления заказа клиенту приходит уведомление, а на складе сразу начинают собирать товар).</li>
    <li id="bTjr"><strong>Шлюз по событиям (Event-based Gateway)</strong> — ждёт, какое событие произойдёт первым. Например, клиент подтвердит заказ или закончится время ожидания.</li>
    <li id="5kBw"><strong>Неисключающий (OR)</strong> — может запустить сразу одну или несколько веток. Например, заявку одновременно отправляют в бухгалтерию и юридический отдел, если для этого выполняются нужные условия.</li>
  </ul>
  <blockquote id="NnwL">Шлюзы могут разделять процесс на несколько веток или, наоборот, объединять их обратно в один поток. Благодаря этому в BPMN можно наглядно показать как простые процессы, так и сложные сценарии с разными вариантами развития событий.</blockquote>
  <h2 id="kogda-stoit-ispolzovat-bpmn">Когда стоит использовать BPMN</h2>
  <p id="X5nz">BPMN стоит использовать, если в работе участвуют разные отделы, есть несколько этапов согласования, разные варианты развития событий или взаимодействие нескольких систем.</p>
  <p id="Dtlg">Эту нотацию используют, чтобы разобраться в текущих процессах, спроектировать новые, подготовить их к автоматизации и согласовать требования между бизнесом и разработчиками. Вместо длинных текстовых описаний получается одна понятная схема, которую легко обсудить и доработать.</p>
  <p id="GFsf">Если процесс совсем простой, обычно достаточно обычной блок-схемы. Но когда появляются десятки шагов, несколько участников и разные сценарии, BPMN помогает не запутаться и избежать ошибок.</p>
  <p id="3dMO">Освоить BPMN не так сложно, как кажется. Достаточно разобраться в основных элементах — задачах, событиях, шлюзах, пулах и дорожках. Этого уже хватит, чтобы читать готовые диаграммы, создавать собственные схемы и понятнее описывать процессы для всей команды.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/1-Z3Kq5ROmX</guid><link>https://teletype.in/@lightech/1-Z3Kq5ROmX?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/1-Z3Kq5ROmX?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>Зачем бизнесу нужен сайт в 2026 году: типы, технический стек и стоимость разработки</title><pubDate>Tue, 07 Jul 2026 14:45:28 GMT</pubDate><description><![CDATA[<img src="https://img4.teletype.in/files/f3/5b/f35be81d-0157-4271-a75e-37f511feb8db.png"></img>В 2026 году многие задаются вопросом, нужен ли бизнесу собственный веб-сайт. Продажи всё чаще происходят через маркетплейсы, компании общаются с клиентами в мессенджерах и соцсетях, а нейросети всё чаще отвечают на вопросы пользователей без перехода на сайты.]]></description><content:encoded><![CDATA[
  <figure id="Dgwz" class="m_original">
    <img src="https://img4.teletype.in/files/f3/5b/f35be81d-0157-4271-a75e-37f511feb8db.png" width="1800" />
    <figcaption>Зачем бизнесу нужен сайт в 2026 году </figcaption>
  </figure>
  <p id="4uYA">В 2026 году многие задаются вопросом, нужен ли бизнесу собственный веб-сайт. Продажи всё чаще происходят через маркетплейсы, компании общаются с клиентами в мессенджерах и соцсетях, а нейросети всё чаще отвечают на вопросы пользователей без перехода на сайты.</p>
  <p id="6gIf">Но поисковые системы никуда не исчезли. По <a href="https://www.similarweb.com/ru/top-websites/" target="_blank">данным SimilarWeb</a>, Google остаётся самым посещаемым ресурсом в мире. Каждый день люди ищут информацию, товары и услуги. И когда человек готов выбрать исполнителя или продавца, он обычно переходит на платформу компании.</p>
  <p id="yFgF">Именно сайт позволяет рассказать о всё о бизнесе, показать преимущества, собрать заявки, анализировать поведение посетителей и возвращать клиентов. Поэтому сегодня вопрос уже не в том, нужен ли сайт вообще. Гораздо важнее понять, каким он должен быть и на какой платформе его лучше создавать.</p>
  <h2 id="zachem-kompanii-sobstvennyj-sajt-v-2026-godu">Зачем компании собственный сайт в 2026 году?</h2>
  <p id="ag38">Главный аргумент — независимость. Например, страница в VK, магазин на Wildberries, аккаунт в социальных сетях — всё это сторонние площадки. Алгоритм меняется, правила ужесточаются, аккаунт блокируется. Сайт — это цифровая собственность бизнеса.</p>
  <figure id="DdFf" class="m_original">
    <img src="https://img3.teletype.in/files/6b/b2/6bb24f24-0b6a-49eb-83f7-9fd3fdf3b5e6.png" width="1258" />
    <figcaption>Зачем сайт в 2026</figcaption>
  </figure>
  <h2 id="kakie-est-tipy-sajtov">Какие есть типы сайтов?</h2>
  <p id="YeaV">Выбор зависит от того, какую задачу сайт должен решать:</p>
  <ul id="wMje">
    <li id="c1ol"><strong>Лендинг</strong> — если нужно продвигать одну услугу или продукт и получать заявки.</li>
    <li id="dq9E"><strong>Корпоративный сайт</strong> — когда важно рассказать о компании, показать услуги, кейсы и повысить доверие клиентов.</li>
    <li id="rpR1"><strong>Каталог</strong> — подходит компаниям с офлайн-продажами, шоурумам или B2B-бизнесу, где цены рассчитываются индивидуально и онлайн-оплата не требуется.</li>
    <li id="ZzwV"><strong>Интернет-магазин </strong>— для продажи товаров через сайт с корзиной, оплатой и оформлением заказа.</li>
    <li id="k6f8"><strong>Веб-приложение или личный кабинет</strong> — оптимальный вариант для сервисных компаний и бизнеса с подписками или постоянными клиентами.</li>
    <li id="vAvV"><strong>Гибридный сайт</strong> — сочетает сразу несколько функций: интернет-магазин, блог, онлайн-запись, личный кабинет и другие инструменты. Такой формат всё чаще выбирают компании, которые планируют масштабироваться.</li>
  </ul>
  <figure id="sdDh" class="m_original">
    <img src="https://img2.teletype.in/files/16/a8/16a82b9a-4a2e-44b1-a4db-42b145b9b2ef.png" width="1800" />
    <figcaption>Типы сайтов</figcaption>
  </figure>
  <p id="ZZzj"><em>Частая ошибка — выбирать тип сайта «с запасом». Например, запускать большой корпоративный сайт, когда достаточно лендинга, или разрабатывать полноценный интернет-магазин вместо каталога. Именно тип сайта влияет на стоимость разработки, сроки запуска и то, насколько быстро проект начнёт приносить результат.</em></p>
  <h2 id="chto-vazhno-pri-sozdanii-sajta">Что важно при создании сайта?</h2>
  <p id="CSuI">Базовый уровень — это защищённое соединение (SSL и HTTPS). Если сайт собирает заявки, заказы или любые персональные данные, он должен соответствовать требованиям 152-ФЗ: корректная политика обработки данных, согласие пользователя и правильно настроенные формы.</p>
  <p id="62fY">Скорость сайта влияет и на поведение пользователей, и на позиции в поиске. Оценивается она через метрики Core Web Vitals:</p>
  <ul id="O9pX">
    <li id="zrCg"><strong>LCP</strong> — как быстро появляется основной контент.</li>
    <li id="7D3s"><strong>INP</strong> — насколько быстро сайт реагирует на действия.</li>
    <li id="Anmm"><strong>CLS </strong>— «прыгает» ли интерфейс при загрузке.</li>
  </ul>
  <p id="8Br1">Также важно, как веб-ресурс оптимизирован в целом: насколько быстро он открывается на мобильных устройствах и насколько стабильно работает под нагрузкой. Для этого настраивается кэширование, оптимизируются скрипты и изображения.</p>
  <p id="yLdX"><em>Проверку обычно проводят через <a href="https://pagespeed.web.dev/" target="_blank">PageSpeed Insights</a> и <a href="https://chromewebstore.google.com/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=ru&pli=1" target="_blank">Lighthouse</a>.</em></p>
  <h3 id="api-i-integraczii">API и интеграции</h3>
  <p id="rFxB">Сайт должен работать вместе с другими системами компании. Обычно проводят <a href="https://thelightech.ru/services/integration-site/" target="_blank">интеграцию со сторонними сервисами</a> как CRM, 1С, платёжными системами, службами доставки, телефонией и чат-ботами. Это помогает автоматизировать процессы и сократить количество ручной работы.</p>
  <h3 id="analitika-i-masshtabirovanie">Аналитика и масштабирование</h3>
  <p id="mJ2x">При разработке лучше сразу предусмотреть возможность развития сайта. Подключение аналитики, A/B-тестов и новых функций должно происходить без полной переработки проекта, чтобы сэкономить время и деньги в будущем.</p>
  <h2 id="na-kakih-platformah-mozhno-razrabotat-sajt">На каких платформах можно разработать сайт?</h2>
  <p id="K822">Собрали популярные платформы, которые используют для профессиональной разработки сайтов.</p>
  <p id="clCB"><em>В список мы не включали конструкторы сайтов (например, Tilda или Wix). Они подходят для быстрого запуска лендингов и небольших проектов, но при росте бизнеса часто становятся ограничением: сложнее внедрять нестандартный функционал, интегрировать внешние сервисы и масштабировать проект. Если сайт планируется развивать в течение нескольких лет, обычно выбирают CMS или индивидуальную разработку.</em></p>
  <h3 id="cms-dlya-korporativnyh-sajtov">CMS для корпоративных сайтов:</h3>
  <ul id="EWnr">
    <li id="OWKZ"><strong><a href="https://thelightech.ru/services/website-wordpress/" target="_blank">WordPress</a> </strong>— самая популярная CMS в мире. Подходит для корпоративных сайтов, блогов, каталогов и небольших интернет-магазинов. Большое количество готовых тем и плагинов позволяет быстро запустить проект, но для стабильной работы системе требуется регулярное обновление и техническая поддержка.</li>
    <li id="zFMH"><strong><a href="https://thelightech.ru/services/website-1s-bitriks/" target="_blank">1С-Битрикс</a> </strong>— одна из самых популярных CMS в России для бизнеса. Подходит для корпоративных сайтов, интернет-магазинов и крупных проектов. Отличается широкими возможностями, развитой экосистемой и удобной интеграцией с продуктами 1С.</li>
    <li id="P5qv"><a href="https://thelightech.ru/services/website-netcat/" target="_blank"><strong>NetCat</strong></a> — российская CMS для корпоративных сайтов, каталогов и интернет-магазинов. Ценится за высокую производительность, гибкость и удобную административную панель. Часто используется в коммерческих проектах и государственных организациях.</li>
    <li id="JAXV"><a href="https://thelightech.ru/services/website-modx/" target="_blank"><strong>MODX</strong></a> — CMS для проектов с нестандартным дизайном и структурой. Даёт разработчикам больше свободы при создании сайта, но требует более высокой технической квалификации.</li>
    <li id="Dl8q"><a href="https://thelightech.ru/services/website-joomla/" target="_blank"><strong>Joomla</strong></a> — универсальная CMS, которая подходит для корпоративных сайтов, информационных порталов и сообществ. Сегодня используется реже, чем WordPress, но остаётся хорошим выбором для отдельных задач.</li>
    <li id="5ReL"><a href="https://thelightech.ru/services/website-drupal/" target="_blank"><strong>Drupal</strong></a> — система для крупных корпоративных порталов, образовательных проектов и государственных сайтов. Отличается высокой безопасностью и гибкими настройками прав доступа, однако требует опытной команды разработчиков.</li>
  </ul>
  <h3 id="cms-dlya-internet-magazinov">CMS для интернет-магазинов:</h3>
  <ul id="4q6g">
    <li id="yFFm"><a href="https://thelightech.ru/services/website-opencart/" target="_blank"><strong>OpenCart</strong></a> — популярная система для небольших и средних интернет-магазинов. Позволяет быстро запустить продажи, поддерживает большое количество модулей и интеграций.</li>
    <li id="Bp3w"><a href="https://thelightech.ru/services/website-shopify/" target="_blank"><strong>Shopify</strong></a> — облачная платформа для интернет-магазинов. Позволяет быстро начать продажи без настройки сервера и технической поддержки, но имеет ограничения по кастомизации и ежемесячную подписку.</li>
  </ul>
  <h3 id="frejmvorki-dlya-individualnoj-razrabotki">Фреймворки для индивидуальной разработки:</h3>
  <ul id="6U7n">
    <li id="3ZyJ"><a href="https://thelightech.ru/services/website-laravel/" target="_blank"><strong>Laravel</strong></a> — один из самых популярных PHP-фреймворков для создания сложных веб-проектов, личных кабинетов, CRM и нестандартных сервисов. Позволяет реализовать практически любую бизнес-логику.</li>
    <li id="nHb6"><a href="https://thelightech.ru/services/website-ruby-on-rails/" target="_blank"><strong>Ruby on Rails</strong></a> — фреймворк, известный высокой скоростью разработки MVP и веб-сервисов. Часто используется стартапами и SaaS-проектами.</li>
  </ul>
  <figure id="7JXB" class="m_original">
    <img src="https://img1.teletype.in/files/0f/a8/0fa88e8b-52c3-43d7-9268-0a6366762034.png" width="1800" />
    <figcaption>CMS для корпоративных сайтов</figcaption>
  </figure>
  <blockquote id="pFBt"><a href="https://colorlib.com/wp/cms-market-share/" target="_blank">По данным рынка CMS</a> в 2026 году, WordPress остаётся лидером и используется более чем на 40% всех сайтов в мире.</blockquote>
  <h2 id="komu-nuzhny-sajty">Кому нужны сайты?</h2>
  <p id="wycP">Сайт нужен практически любому бизнесу, который работает с клиентами онлайн или хочет системно привлекать заявки и продажи. В зависимости от сферы он закрывает разные задачи: продажи, заявки, автоматизацию, коммуникацию или доверие.</p>
  <figure id="64YM" class="m_original">
    <img src="https://img2.teletype.in/files/98/ce/98cef78f-4d21-48c0-83ae-5a73b4304253.png" width="880" />
    <figcaption>Сферы и задачи сайтов</figcaption>
  </figure>
  <p id="oGeE">Список отраслей выше не является исчерпывающим. Практически любой бизнес, где есть клиенты, продажи или заявки, выигрывает от наличия сайта. IT-компании, SaaS-сервисы, HR-платформы и рекрутинговые сервисы — для них сайт часто является частью продукта: через него продаётся подписка, демонстрируется функционал, ведётся документация и поддержка пользователей.</p>
  <h3 id="bazovye-funkczii-sajta"><strong>Базовые функции сайта</strong>:</h3>
  <ul id="g9Fo">
    <li id="ej6P">привлечение заявок и обращений;</li>
    <li id="rJAA">визитка компании и формирование доверия;</li>
    <li id="HrSZ">витрина услуг, товаров или продукта;</li>
    <li id="jjBL">сбор и обработка контактов клиентов;</li>
    <li id="edpC">онлайн-запись, заказ или оформление заявки;</li>
    <li id="y8Z0">интеграция с CRM и внутренними системами;</li>
    <li id="r2No">аналитика источников трафика и поведения пользователей;</li>
    <li id="QUM3">поддержка повторных продаж и коммуникации с клиентами.</li>
  </ul>
  <h2 id="skolko-stoit-razrabotka-sajta-i-internet-magazina">Сколько стоит разработка сайта и интернет-магазина?</h2>
  <p id="uNbN">Стоимость проекта всегда рассчитывается индивидуально после анализа требований.</p>
  <p id="CBIG">В ЛайТех мы <a href="https://thelightech.ru/services/razrabotka-saytov-pod-klyuch/" target="_blank">разрабатываем сайты</a> и интернет-магазины под ключ с дальнейшей техподдержкой.</p>
  <figure id="TFqo" class="m_original">
    <img src="https://img3.teletype.in/files/a3/91/a391136c-ff02-484c-8d52-08eba8414c6f.png" width="860" />
    <figcaption>Сколько стоит разработка сайта и интернет-магазина</figcaption>
  </figure>
  <p id="bH0d"><em>Если требования к проекту ещё не сформированы, мы поможем определиться с функциями, подобрать оптимальный стек технологий и подготовить предварительную оценку сроков и бюджета.</em></p>
  <p id="ZuRN">Стоимость создания веб-сайта зависит не только от масштаба будущей веб-платформы, но и от состава команды, которая работает над проектом. Чем сложнее задачи, тем больше специалистов участвует в разработке.</p>
  <p id="qLUR">Если хотите разобраться, какие роли входят в команду и зачем нужны аналитики, дизайнеры, разработчики и тестировщики, рекомендуем прочитать статью про то, <a href="https://thelightech.ru/blog/biznesu/soberi-svoyu-komandu-s-it-autstaffingom/" target="_blank">как собрать крутую IT-команду</a>.</p>
  <h2 id="s-chego-nachat-put">С чего начать путь?</h2>
  <p id="yKj5">Первый шаг — определить, какую задачу должен решать сайт. Для одних компаний это привлечение новых клиентов, для других — онлайн-продажи, запись на услуги, автоматизация процессов или укрепление доверия к бренду. После этого можно оценить бюджет, выбрать подходящую платформу и составить техническое задание с учётом необходимых функций и интеграций.</p>
  <p id="UVxB">Пользователи по большей части заходят на сайты со смартфонов, поэтому особое внимание уделяется проектированию интерфейсов под телефоны. Дальше проект проходит стандартные этапы разработки:</p>
  <ul id="IdrT">
    <li id="WdY8">UX/UI-дизайн;</li>
    <li id="jWWa">программирование;</li>
    <li id="v0WD">тестирование;</li>
    <li id="ajgj">запуск.</li>
  </ul>
  <p id="LrM5">Бизнес активно уходит в онлайн: растёт доля электронной коммерции, а цифровые каналы становятся основным способом привлечения клиентов. Поэтому компаниям нужны удобные и современные сайты, которые можно быстро запускать и развивать без лишних сложностей.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/gCX56ltsKFT</guid><link>https://teletype.in/@lightech/gCX56ltsKFT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/gCX56ltsKFT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>Как разработать мобильное приложение за 1 миллион рублей</title><pubDate>Fri, 26 Jun 2026 08:19:50 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a1/e4/a1e47eab-2bb4-492f-80d9-c8912fa8682c.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/ac/13/ac133a6e-9c75-444b-bbfa-d4ccfafd1c46.png"></img>Мобильное приложение давно стало частью повседневной жизни. Большинство зумеров используют приложения не только для покупок, но и как форму досуга: листают каталоги, делятся находками с друзьями, совершают спонтанные покупки прямо во время скроллинга.]]></description><content:encoded><![CDATA[
  <figure id="mKZW" class="m_original">
    <img src="https://img3.teletype.in/files/ac/13/ac133a6e-9c75-444b-bbfa-d4ccfafd1c46.png" width="1800" />
    <figcaption>Мобильное приложение за 1 миллион рублей </figcaption>
  </figure>
  <p id="qvES">Мобильное приложение давно стало частью повседневной жизни. Большинство зумеров используют приложения не только для покупок, но и как форму досуга: листают каталоги, делятся находками с друзьями, совершают спонтанные покупки прямо во время скроллинга.</p>
  <p id="oThR">Миллениалы и представители старших поколений тоже проводят в смартфоне значительную часть времени, хотя и используют его немного иначе. Поэтому неудивительно, что многие компании задумываются о собственном продукте для смартфона.</p>
  <p id="Qge7">Если вы уже рассматривали такой вариант, то наверняка задавались вопросом: сколько же стоит разработка мобильного приложения и можно ли запустить проект с ограниченным бюджетом?</p>
  <p id="xvCq">В статье мы покажем примеры на цифрах, раскроем структуру затрат и честно расскажем, какое <a href="https://thelightech.ru/services/mobilnoe-prilozhenie-za-million/" target="_blank">мобильное приложение можно создать за 1 миллион</a> рублей, а какие функции выйдут за рамки этого бюджета.</p>
  <h2 id="kakie-byvayut-mobilnye-prilozheniya">Какие бывают мобильные приложения?</h2>
  <p id="gmLo">Приложения сильно отличаются друг от друга по назначению, аудитории и уровню спроса. Условно их делят на:</p>
  <ul id="zZdm">
    <li id="CuZb">игровые;</li>
    <li id="A8Q4">обучающие;</li>
    <li id="C74c">социальные сети;</li>
    <li id="kcGR">контентные сервисы;</li>
    <li id="R3ua">промо-приложения;</li>
    <li id="zBeh">государственные сервисы.</li>
  </ul>
  <p id="6Ksp">На первый взгляд кажется, что игры — главный сегмент: они занимают около <a href="https://cyberleninka.ru/article/n/obzor-rynka-mobilnyh-prilozheniy" target="_blank">20–25%</a> от общего числа приложений на рынке. Но это не значит, что их скачивает большинство. Играми пользуются примерно 66% владельцев смартфонов, тогда как социальные сети, мессенджеры и браузеры установлены у 96%.</p>
  <section>
    <p id="aIMX"><em>Самые охватные категории — это коммуникация, контент и сервисы, встроенные в ежедневные привычки пользователя.</em></p>
  </section>
  <p id="X1Mh"></p>
  <h2 id="million-rublej-na-zapusk-prilozheniya-dostatochno-li-etogo">Миллион рублей на запуск приложения: достаточно ли этого?</h2>
  <p id="iwaT">Полнофункциональные мобильные приложения с большим количеством интеграций и сложной бизнес-логикой обычно стоят от 3–7 млн. рублей и выше. Однако для запуска продукта такие вложения нужны не всегда.</p>
  <p id="ijRH">На старте бизнесу часто достаточно создать <a href="https://thelightech.ru/services/razrabotka-mvp-pod-klyuch/" target="_blank">MVP</a> с фиксированным бюджетом в миллион — приложение с ключевыми функциями, которое позволяет выйти на рынок, протестировать идею и получить обратную связь от пользователей.</p>
  <p id="GJnt">Вместо того чтобы инвестировать сразу большую сумму в продукт с непроверенной концепцией, компания запускает первую версию, анализирует поведение пользователей и принимает решения о дальнейшем развитии.</p>
  <p id="PGw5"><em>Наиболее дорогими проектами считаются финтех-приложения и крупные цифровые продукты федерального уровня. Банковские сервисы, инвестиционные платформы и приложения с повышенными требованиями к безопасности.</em></p>
  <h2 id="funkczional-bazovogo-mobilnogo-prilozheniya">Функционал базового мобильного приложения</h2>
  <p id="Dc73">Функциональность мобильных приложений различается в зависимости от отрасли и бизнес-задач, но есть базовый набор возможностей, без которого не обходится большинство проектов.</p>
  <p id="YLNx">В базовый функционал входят:</p>
  <ul id="GBv0">
    <li id="vCAa">регистрация, авторизация и личный кабинет пользователя;</li>
    <li id="HqoT">push-уведомления;</li>
    <li id="encU">интеграция с API, CRM, платежными системами и другими внешними сервисами;</li>
    <li id="Fl5L">административная панель для управления контентом, пользователями и основными настройками приложения;</li>
    <li id="tONH">подключение систем аналитики для отслеживания действий пользователей.</li>
  </ul>
  <figure id="aiD4" class="m_original">
    <img src="https://img1.teletype.in/files/cf/07/cf07565f-ca38-454e-b26b-14dab97f5599.png" width="1800" />
    <figcaption>Базовый функционал мобильного приложения</figcaption>
  </figure>
  <h2 id="kak-ustroena-rabota-nad-proektami-iznutri">Как устроена работа над проектами изнутри?</h2>
  <p id="JAGF">Чтобы показать, из чего складывается стоимость мобильной разработки, рассмотрим наши примеры в LighTech.</p>
  <h3 id="prilozhenie-dlya-bronirovaniya-karting-czentr"><strong>Приложение для бронирования (картинг-центр)</strong></h3>
  <p id="p1Bc">Ниже приведена оценка трудозатрат для приложения досугового центра с несколькими зонами: картингом, лаунж-пространством и баром.</p>
  <p id="zMf6">В приложении пользователь может зарегистрироваться, пройти онбординг, забронировать посещение, получать push-уведомления и участвовать в программе лояльности.</p>
  <p id="s4JQ">Для сотрудников предусмотрена административная панель для управления контентом, бронированиями и аналитикой. Также проект включает интеграцию с кассовой системой iiko для синхронизации чеков и бонусных баллов.</p>
  <figure id="lBAc" class="m_original">
    <img src="https://img3.teletype.in/files/a8/f4/a8f45cec-5560-4ee5-a1f9-1e270918e5e8.png" width="1332" />
    <figcaption>Стоимость мобильного приложения для бронирования картинга </figcaption>
  </figure>
  <p id="PbMc">На этапе аналитики команда собирает и формализует требования, проектирует пользовательские сценарии (User Flow), продумывает архитектуру решения и подготавливает техническое задание. На эти задачи уходит от 50 до 71 часа.</p>
  <p id="tofl">Дизайнер затрачивает от 75 до 125 часов на создание UI-kit, проектирование пользовательского опыта, разработку всех экранов мобильного приложения и административной панели, а также проработку анимаций и интерактивных состояний.</p>
  <p id="qyNy">Самым трудоёмким этапом становится backend-разработка — от 159 до 233 часов. Специалист реализует:</p>
  <ul id="WbUi">
    <li id="VQRa">серверную архитектуру;</li>
    <li id="UInH">авторизацию по SMS;</li>
    <li id="fnVu">систему лояльности;</li>
    <li id="NT3m">логику бронирований;</li>
    <li id="6Wv5">API для мобильного приложения;</li>
    <li id="6Hxb">административную панель;</li>
    <li id="PpLc">систему аналитики;</li>
    <li id="TPnI">интеграцию с iiko.</li>
  </ul>
  <p id="CTtP">Значительная часть времени также уходит на тестирование и отладку интеграции с внешней системой.</p>
  <p id="7hK3">На стороне мобильного приложения разработчик реализует регистрацию и профиль пользователя, онбординг, разделы для разных зон центра, систему лояльности, push-уведомления и интеграцию с backend. Общий объём работ составляет от 66 до 136 часов.</p>
  <p id="WCy3">Дополнительно в проекте участвует DevOps-инженер, который настраивает серверную инфраструктуру, CI/CD и рабочие окружения. На эти работы требуется от 18 до 29 часов.</p>
  <p id="NK3z">Завершающий этап — тестирование. QA-инженер подготавливает тест-кейсы, проводит функциональное и регрессионное тестирование, а также проверяет работу приложения на различных мобильных устройствах. На обеспечение качества продукта закладывается от 55 до 85 часов.</p>
  <h3 id="mobilnyj-internet-magazin"><strong>Мобильный интернет-магазин</strong></h3>
  <p id="dXUV">Второй пример — мобильное приложение для розничной сети. Проект включает каталог товаров, разделы с акциями и новинками, карту лояльности с QR-кодом, отображение магазинов на карте, push-уведомления и публикацию приложения в App Store и Google Play.</p>
  <figure id="HETN" class="m_original">
    <img src="https://img2.teletype.in/files/90/7e/907e0da0-651e-48da-9ee1-a6e769bc6855.png" width="1308" />
    <figcaption>Стоимость мобильного приложения для интернет-магазина </figcaption>
  </figure>
  <p id="mkHp"></p>
  <p id="vHyP">В данном проекте нагрузка между backend- и мобильной разработкой распределяется практически равномерно.</p>
  <p id="a8GL">Backend-разработчик проектирует архитектуру решения, реализует серверную логику, регистрацию и авторизацию пользователей, систему лояльности, управление контентом, push-уведомления, административную панель и интеграцию с картографическим сервисом. На эти задачи требуется от 118 до 196 часов.</p>
  <p id="1Lj5">Мобильный разработчик реализует:</p>
  <ul id="LU9a">
    <li id="JV8u">главную страницу с баннерами и навигацией;</li>
    <li id="dD3b">карту лояльности с QR- или штрихкодом;</li>
    <li id="dVwF">разделы с акциями и новинками;</li>
    <li id="4JaP">отображение торговых точек на карте;</li>
    <li id="1RIL">push-уведомления;</li>
    <li id="Q3Gl">выполняет подготовку и публикацию приложения в маркетплейсах.</li>
  </ul>
  <p id="yzPy">Общий объём работ составляет от 116 до 180 часов.</p>
  <p id="h9cm"><em>Как показывают оба примера, даже относительно небольшое мобильное приложение требует от 460 до 760 человеко-часов работы команды. Именно поэтому стоимость разработки складывается не только из количества экранов, но и из объёма бизнес-логики, интеграций и инфраструктурных задач. </em></p>
  <h2 id="monetizacziya-mobilnyh-prilozhenij">Монетизация мобильных приложений</h2>
  <p id="Ifmz">Любое коммерческое мобильное приложение проектируется с учётом способа монетизации. Это влияет на архитектуру, функционал и пользовательский опыт. Исключения составляют государственные и системные сервисы, но в большинстве случаев продукт создаётся для получения прибыли.</p>
  <h3 id="besplatnaya-model-s-platnymi-funkcziyami-freemium"><strong>Бесплатная модель с платными функциями (freemium)</strong></h3>
  <p id="Myms">Базовый функционал доступен бесплатно, а расширенные возможности продаются отдельно. Это могут быть дополнительные сервисы, премиум-разделы, расширенные лимиты или доступ к закрытому контенту. Модель часто используется в сервисах и B2C-приложениях.</p>
  <h3 id="podpiska"><strong>Подписка</strong></h3>
  <p id="8PNv">Пользователь платит регулярно — ежемесячно или ежегодно — за доступ к приложению или его части. Обычно по подписке работают сервисы с постоянной ценностью: контент-платформы, SaaS-продукты, образовательные и сервисные приложения.</p>
  <h3 id="reklama-vnutri-prilozheniya"><strong>Реклама внутри приложения</strong></h3>
  <p id="DQ9n">Приложение остаётся бесплатным для пользователя, а доход формируется за счёт показов рекламы. Это самая массовая модель: значительная часть бесплатных приложений на рынке использует именно её. Чрезмерное количество рекламы влияет на удержание пользователей и может снижать лояльность аудитории.</p>
  <p id="ESky">Выбор модели монетизации нужно делать до начала разработки. От него зависит логика приложения, структура экранов и даже техническая архитектура продукта. </p>
  <h2 id="vliyanie-vizuala-i-kartochki-prilozheniya">Влияние визуала и карточки приложения</h2>
  <p id="wnbM">Решение об установке приложения пользователь принимает до запуска. Поэтому важны не только функции, но и то, как продукт выглядит в маркетплейсе.</p>
  <p id="IloW">Сама публикация приложений в <a href="https://thelightech.ru/services/publikatsiya-v-google-play/" target="_blank">Google Play</a>, <a href="https://thelightech.ru/services/publikatsiya-v-rustore/" target="_blank">RuStore</a> и <a href="https://thelightech.ru/services/publikatsiya-v-app-store/" target="_blank">App Store</a> часто оказывается сложнее, чем кажется на первый взгляд. Каждая площадка предъявляет собственные требования к сборке, безопасности, оформлению карточки и процессу модерации. Ошибки на этом этапе могут привести к отклонению приложения или задержке релиза.</p>
  <figure id="9Nhm" class="m_original">
    <img src="https://img4.teletype.in/files/3b/2f/3b2fe5f1-024e-4e83-b001-52d18c0e8a2c.png" width="1800" />
    <figcaption>Публикация приложений в <a href="https://thelightech.ru/services/publikatsiya-v-google-play/" target="_blank">Google Play</a>, <a href="https://thelightech.ru/services/publikatsiya-v-rustore/" target="_blank">RuStore</a> и <a href="https://thelightech.ru/services/publikatsiya-v-app-store/" target="_blank">App Store</a> </figcaption>
  </figure>
  <h3 id="ikonka-prilozheniya"><strong>Иконка приложения</strong></h3>
  <p id="KNkI">Это первый контакт с пользователем в поиске и рекомендациях. Она должна быть простой, читаемой и отличаться от конкурентов. Плохая иконка снижает количество установок даже при хорошем функционале.</p>
  <h3 id="HsI5"><strong>Скриншоты в карточке</strong></h3>
  <p id="WJpQ">Скриншоты показывают, что делает приложение и зачем его устанавливать. Они должны быстро объяснять пользу, а не просто демонстрировать интерфейс. Основная задача — показать ключевые сценарии использования и ценность продукта.</p>
  <h3 id="adaptacziya-kartochki-aso"><strong>Адаптация карточки (ASO)</strong></h3>
  <p id="5Dhj">В конкурентных нишах карточку приложения постоянно тестируют: меняют тексты, акценты, визуальные элементы и сезонные предложения. Это влияет на конверсию установки и связано с продвижением в сторах.</p>
  <h2 id="mozhno-li-sdelat-bolshe-za-te-zhe-dengi">Можно ли сделать больше за те же деньги?</h2>
  <p id="DM6y">Экономия бюджета возможна, но только в рамках разумной оптимизации. Бюджет MVP ограничен задачами запуска продукта: он должен работать стабильно и закрывать ключевой сценарий пользователя.</p>
  <p id="vPyM">Увеличить объём функционала без роста бюджета можно за счёт повышения эффективности разработки.</p>
  <p id="w1QT">В нашей команде это достигается за счёт использования AI-инструментов в процессе <a href="https://thelightech.ru/blog/biznesu/navaybkodili-pochemu-ai-razrabotka-trebuet-senior-revyu/" target="_blank">разработки под контролем senior-инженеров</a>. ИИ берёт на себя рутинные задачи:</p>
  <ul id="FgX9">
    <li id="spGM">генерацию шаблонного кода;</li>
    <li id="pLM3">написание части unit-тестов;</li>
    <li id="MXM5">документацию API и вспомогательные технические операции.</li>
  </ul>
  <p id="wTbf">Все основные решения остаются за разработчиком. Архитектура, безопасность, код-ревью и финальная проверка всегда выполняются человеком. Нейросети не заменяют инженера, а усиливают его работу.</p>
  <p id="sszF"><em>Разработчики уровня Senior умеют оценивать результат работы AI и направлять его в нужное русло. По опыту индустрии, такие специалисты повышают свою продуктивность на 40–50% при грамотном использовании ИИ-инструментов.</em></p>
  <p id="oCW6">Искусственный интеллект также позволит сократить время и трудозатраты на рутинные процессы QA. Он ускоряет создание и поддержку тест-кейсов, уменьшает объём ручного регрессионного тестирования, помогает раньше находить ошибки и нестандартные сценарии и легко встраивается в CI/CD-процессы. В результате релизы выходят быстрее, а нагрузка на команду тестирования снижается, без потери качества продукта.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/RQEv3zQIRsR</guid><link>https://teletype.in/@lightech/RQEv3zQIRsR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/RQEv3zQIRsR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>Навайбкодили: почему AI-разработка требует Senior-ревью</title><pubDate>Fri, 19 Jun 2026 09:12:23 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/81/94/8194a8b5-3103-4539-99ac-0d9ae050771e.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d2/7f/d27f852b-56db-4086-8bd8-b078aa67fcec.png"></img>Почти половина (около 41%) всего кода в мире создается с помощью искусственного интеллекта. Новая мода на программирование с AI называется — vibe coding.]]></description><content:encoded><![CDATA[
  <figure id="vujO" class="m_original">
    <img src="https://img2.teletype.in/files/d2/7f/d27f852b-56db-4086-8bd8-b078aa67fcec.png" width="1800" />
    <figcaption>AI-разработка и Senior-ревью </figcaption>
  </figure>
  <p id="wZJo">Почти <strong><a href="https://www.secondtalent.com/resources/vibe-coding-statistics/" target="_blank">половина (около 41%)</a></strong> всего кода в мире создается с помощью искусственного интеллекта. Новая мода на программирование с AI называется — <a href="https://thelightech.ru/services/vibe-coding/" target="_blank">vibe coding</a>.</p>
  <p id="SPGV">Вайб-кодинг — это такой вид разработки, при которой человек больше формулирует идеи и проверяет результат, чем пишет код вручную.</p>
  <p id="DGvS">Скорость действительно впечатляет! Команды сообщают о сокращении сроков выполнения задач более чем на 50%, а небольшие команды из 2–5 разработчиков — до 68%. Но вместе со скоростью появляется новая проблема.</p>
  <p id="4lcm">AI умеет быстро генерировать отдельные части системы, однако не всегда понимает архитектурный контекст, долгосрочные последствия решений и особенности масштабирования продукта. Поэтому в эпоху AI-разработки роль Senior-инженеров становится важной, а зачастую — критически необходимой.</p>
  <p id="qf1O">В этой статье разберёмся, почему даже самый продвинутый ИИ не отменяет необходимость ревью кода Сеньор-разработчиками.</p>
  <blockquote id="hQE7"><em>Материал подготовлен на основе статистических и аналитических данных Second Talent — платформы исследований рынка труда и технологических профессий, а также SHIFTMAG — международного издания о технологиях, инновациях и цифровой трансформации бизнеса. <br /><br />Использованные данные отражают актуальные тенденции в области AI-разработки, автоматизации и применения генеративного ИИ в создании программного обеспечения.</em></blockquote>
  <h2 id="kto-ispolzuet-vajb-koding-segodnya">Кто использует вайб-кодинг сегодня</h2>
  <p id="YI7W">Сегодня вайб-кодинг активно используют не только разработчики. По оценкам, около 63% пользователей AI-инструментов для генерации кода не имеют профессионального опыта программирования. Предприниматели, маркетологи, дизайнеры, аналитики и продакт-менеджеры самостоятельно создают лендинги, интерфейсы, внутренние сервисы и даже полноценные веб-приложения.</p>
  <p id="yrFV"><em>Популярность подхода продолжает расти. По прогнозам, к 2026 году до 40% новых SaaS MVP будут создаваться преимущественно с помощью вайб-кодинга. Это позволяет быстрее проверять гипотезы, запускать прототипы и сокращать затраты на разработку на ранних этапах проекта.</em></p>
  <p id="uxYv">Однако создание работающего продукта — лишь первый шаг. Поддержка, масштабирование, обеспечение безопасности и долгосрочное развитие системы по-прежнему требуют участия опытных инженеров и качественной технической экспертизы.</p>
  <h3 id="v-kakih-otraslyah-ii-sejchas-populyarno"><strong>В каких отраслях ИИ сейчас популярно?</strong></h3>
  <p id="gjHX">Активнее всего вайб-кодинг внедряют стартапы и digital-компании, для которых скорость разработки — конкурентное преимущество.</p>
  <figure id="BuRy" class="m_original">
    <img src="https://img2.teletype.in/files/91/44/91446d04-760f-4759-b692-33f7b729d870.png" width="1302" />
    <figcaption>Отрасли, где используется вайб-кодинг </figcaption>
  </figure>
  <p id="YFEq">Компании из финансового сектора и здравоохранения подходят к AI-разработке значительно осторожнее. Ошибки здесь стоят слишком дорого. Любой код должен соответствовать требованиям безопасности, нормативным стандартам и проходить дополнительные проверки перед запуском.</p>
  <h2 id="riski-i-posledstviya-kotorye-mogut-byt-posle-razrabotki-s-pomoshhyu-ii">Риски и последствия, которые могут быть после разработки с помощью ИИ</h2>
  <p id="kRdb">AI отлично справляется с генерацией отдельных компонентов. На первых этапах такой код может выглядеть качественным и полностью работоспособным. Проблемы начинают проявляться позже — при росте нагрузки, появлении новых функций, интеграции сторонних сервисов или масштабировании системы.</p>
  <figure id="fTEj" class="m_original">
    <img src="https://img1.teletype.in/files/c7/58/c758c2c1-c951-43fd-a7c2-8b48567b7979.png" width="1800" />
    <figcaption>Риски вайб-кодинга </figcaption>
  </figure>
  <p id="HnoX"><a href="https://www.producthunt.com/p/vibecoding/the-state-of-vibe-coding-2025-key-takeaways" target="_blank">Исследование State of Vibe Coding 2026</a> зафиксировало: AI-сгенерированный код содержит в 1,7 раза больше серьёзных ошибок и почти в 3 раза больше уязвимостей безопасности по сравнению с кодом, написанным опытными инженерами вручную.</p>
  <p id="USvZ"><em>40% junior-разработчиков признаются, что хотя бы раз отправляли в продакшен AI-сгенерированный код, который понимали не полностью. А в опросе 18 CTO по итогам 2025 года 16 из них сообщили о production-катастрофах, напрямую вызванных AI-сгенерированным кодом.</em></p>
  <h2 id="tehnicheskij-dolg-kotoryj-ne-viden-srazu">Технический долг, который не виден сразу</h2>
  <p id="b7ju">Главная скрытая угроза вайб-кодинга — это не баги и неуязвимости, а архитектурный долг. AI принимает сотни тихих решений: какую стратегию обработки ошибок выбрать, какой формат сериализации использовать, как организовать потоки. Эти решения нигде не задокументированы — они просто есть в коде.</p>
  <figure id="MhF4" class="m_original">
    <img src="https://img1.teletype.in/files/40/ec/40ec2b8d-a6c6-4d8f-8df5-f4e364367d02.png" width="1800" />
    <figcaption>Угрозы вайб-кодинга </figcaption>
  </figure>
  <p id="rwd5">Когда разработчик не может объяснить, как работает конкретный участок системы, сопровождение продукта становится значительно сложнее. Код может работать — но команда не понимает, почему он работает именно так и где может сломаться. В итоге разработчики тратят больше времени на отладку AI-сгенерированного кода, чем ожидали.</p>
  <p id="LUKY">Если джуны всё чаще выступают в роли операторов AI-инструментов и авторов промптов, то на сеньоров ложится ответственность за проверку, очистку и приведение сгенерированного кода к стандартам качества, безопасности и масштабируемости.</p>
  <h2 id="ii-instrument-v-rukah-opytnogo-razrabotchika">ИИ — инструмент в руках опытного разработчика</h2>
  <p id="zR6i">Искусственный интеллект работает как умный саппорт: быстро отвечает, генерирует заготовки, объясняет незнакомый стек. Но направление задаёт человек — и он же отвечает за результат.</p>
  <p id="hjyM">Приведём пример: наш бэкенд-разработчик использовал AI как напарника при миграции с OpenSearch на TypeSense в незнакомом стеке и в сжатые сроки. AI выступал сразу в нескольких ролях:</p>
  <ul id="Wadq">
    <li id="ZMrB">живая документация;</li>
    <li id="Q3cf">наставник по новой технологии;</li>
    <li id="PuPA">генератор адаптеров под конкретную задачу.</li>
  </ul>
  <p id="NG2H">Итерация за итерацией — разобрать логику, получить вариант, протестировать, найти расхождение, уточнить вопрос. Без AI задача бы не закрылась в срок. Но без разработчика, который понимал базовые принципы и замечал, когда AI ошибается, — тоже.</p>
  <p id="noEm">Антон, наш фронтенд-разработчик, использовал AI как ускоритель входа в незнакомый стек: ему нужно было написать детскую игру на PhaserJS, с которым он никогда не работал.</p>
  <p id="xJMI">AI помогал разобраться в физике объектов, сценах и коллизиях — через конкретные вопросы и объяснения логики, а не просто примеры кода. Но когда дошло до специфики сцены, AI предлагал рабочие варианты, которые не учитывали контекст проекта. Разобраться пришлось самому.</p>
  <p id="k1mH">Обе ситуации об одном: AI снижает порог входа и экономит время — но только если в руках у человека, который понимает, что происходит внутри.</p>
  <h2 id="pochemu-rol-senior-razrabotchikov-rastt-a-ne-padaet">Почему роль Senior-разработчиков растёт, а не падает</h2>
  <p id="hKlr">Senior-разработчики получают максимальную пользу от AI-инструментов именно потому, что умеют осознанно оценивать результат. Они используют нейросети для автоматизации рутины, а сами концентрируются на архитектуре, безопасности и принятии технических решений.</p>
  <p id="KHqv"><em>Опытные инженеры с 3+ годами стажа сообщают о росте продуктивности на 40–50% при работе с AI — против нестабильных результатов у джунов.</em></p>
  <p id="9nv8">Сегодня особенно востребованы инженеры, которые умеют эффективно использовать AI, но при этом способны самостоятельно оценить результат его работы.</p>
  <h2 id="kak-pravilno-ispolzovat-ai-instrumenty-v-programmirovanie-i-ne-poteryat-kontrol-nad-kachestvom">Как правильно использовать AI-инструменты в программирование и не потерять контроль над качеством?</h2>
  <p id="j2QW">Большинство разработчиков используют AI для прототипов и экспериментов.</p>
  <p id="empu"><em>Каждый ИИ-сгенерированный блок должен проходить как минимум одну осмысленную правку со стороны человека перед мерджем. Это не должно быть простое переименование переменной — нужна реальная доработка: добавление edge-case, изменение логики обработки ошибок или выбор другого подхода к решению.</em></p>
  <p id="cLD2">Сам факт изменения кода заставляет разработчика разобраться в том, как он работает, и действительно его понять.</p>
  <p id="AbkO">Если команда активно использует вайб-кодинг, но в ней нет опытного инженера, который может взять на себя ревью и архитектурный контроль — это риск. Здесь может помочь<a href="https://thelightech.ru/services/outstaffing-razrabotchikov/" target="_blank"> аутстаффинг Senior-разработчиков</a>. Опытные инженеры подключаются к проекту быстро, без долгого найма и онбординга, и сразу закрывают задачи бизнеса и контроля качества — оставляя скорость AI-разработки, но добавляя экспертизу и ответственность за результат.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/RuFtaSDaIqC</guid><link>https://teletype.in/@lightech/RuFtaSDaIqC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/RuFtaSDaIqC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>ИИ в тестировании: как использовать искусственный интеллект для автоматизации QA-процессов</title><pubDate>Wed, 17 Jun 2026 17:32:20 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/21/e0/21e07d99-bedd-41d4-868f-76c851a43deb.png"></img>Современные цифровые продукты развиваются очень быстро. Новые функции выпускаются каждую неделю, а иногда и несколько раз в день. Вместе с этим растёт и объём проверок, которые необходимо выполнить перед релизом.]]></description><content:encoded><![CDATA[
  <figure id="cg45" class="m_original">
    <img src="https://img3.teletype.in/files/21/e0/21e07d99-bedd-41d4-868f-76c851a43deb.png" width="1800" />
    <figcaption>ИИ в тестировании </figcaption>
  </figure>
  <p id="9NUu">Современные цифровые продукты развиваются очень быстро. Новые функции выпускаются каждую неделю, а иногда и несколько раз в день. Вместе с этим растёт и объём проверок, которые необходимо выполнить перед релизом.</p>
  <p id="57c5">Ручное <a href="http://thelightech.ru/services/testirovanie-programmnogo-obespecheniya/" target="_blank">тестирование ПО</a> помогает контролировать качество продукта, но при большом количестве изменений его возможностей уже недостаточно. Даже автоматизированные тесты требуют постоянного сопровождения: после обновления интерфейса или бизнес-логики часть сценариев приходится переписывать и адаптировать заново.</p>
  <p id="r4Bh">Поэтому компании всё чаще используют искусственный интеллект в QA. В этом материале разберём, какие задачи ИИ уже сегодня помогает решать QA-командам и как его используют в <a href="https://thelightech.ru/services/ii-v-testirovanie/" target="_blank">автоматизации тестирования</a>.</p>
  <h2 id="chto-proishodit-s-rynkom-testirovaniya-v-20252026-godah">Что происходит с рынком тестирования в 2025–2026 годах?</h2>
  <p id="BP9h"><a href="https://www.coherentmarketinsights.com/industry-reports/software-testing-and-qa-services-market" target="_blank">По данным аналитиков</a> рынка, уже около 40% компаний используют ИИ в тестировании — и это только начало. Примерно 80% команд разработки будут интегрировать AI-инструменты в QA-процессы в ближайший год.</p>
  <p id="O9wR">Также на пике популярности новый класс систем — AI/ML/LLM-решения, поведение которых принципиально отличается от обычного ПО. Их нельзя проверить традиционными методами QA: они не выдают детерминированный результат.</p>
  <figure id="mBGW" class="m_original">
    <img src="https://img2.teletype.in/files/98/48/9848a66b-1e69-4fc4-80e0-c67935e6fcfa.png" width="1800" />
    <figcaption>Рынок услуг тестирования</figcaption>
  </figure>
  <p id="TvjD">Однако развитие автоматизации и искусственного интеллекта не означает отказ от ручного тестирования. В 2026 году на ручное тестирование будет приходиться около 62,5% рынка, тогда как доля автоматизированного тестирования составит 37,5%.</p>
  <p id="OCaw">Причина в том, что ручное тестирование по-прежнему остается наиболее эффективным способом выявления сложных проблем пользовательского интерфейса, недостатков юзабилити и нестандартных сценариев поведения пользователей, которые автоматизированные инструменты могут пропустить.</p>
  <h2 id="chto-govoryat-issledovaniya-pro-ispolzovanie-ii-v-avtomatizaczii-testirovaniya">Что говорят исследования про использование ИИ в автоматизации тестирования?</h2>
  <p id="YEtI"></p>
  <p id="Ib4B"><a href="https://cyberleninka.ru/article/n/ispolzovanie-iskusstvennogo-intellekta-dlya-avtomatizatsii-testirovaniya" target="_blank">Исследования</a> эффективности AI-подходов в тестировании фиксируют измеримый, статистически устойчивый прирост по ключевым метрикам.</p>
  <blockquote id="hDdi"><em>По сравнению с традиционной автоматизацией результаты выглядят так:<br />- точность выявления дефектов вырастает примерно с 76% до 90%;<br />- полнота тестового покрытия — с 82% до 95%;<br />- время разработки и выполнения тестов сокращается примерно на четверть.<br />Общая стоимость тестирования при этом также снижается до 25%</em></blockquote>
  <p id="1TWX">Модели машинного обучения лучше находят скрытые зависимости в поведении системы — те, которые человек при ручной проверке просто не заметит. Особенно это проявляется при поиске сложных дефектов, связанных с редкими сценариями или состояниями системы.</p>
  <p id="L4S7">Автоматизация генерации и запуска тестов с помощью нейросетей снижает трудозатраты на поддержку тестовой базы и ускоряет весь цикл проверки.</p>
  <figure id="udPH" class="m_original">
    <img src="https://img1.teletype.in/files/07/b3/07b38b45-bf7b-4c0e-bde7-7965f6ee247f.png" width="1800" />
    <figcaption>Автоматизация тестирования</figcaption>
  </figure>
  <p id="5wDp">Эффект от внедрения ИИ не одинаков для всех проектов. Чем больше кодовая база, чем сложнее система и чем чаще в ней происходят изменения — тем заметнее результат.</p>
  <h2 id="kakuyu-chast-raboty-avtomatiziruet-ii-v-testirovanii">Какую часть работы автоматизирует ИИ в тестировании?</h2>
  <p id="QrzB">QA-задачи съедают в среднем <strong>25% IT-бюджета компании</strong>. Большая часть этих затрат — не на сложные задачи, а на рутину:</p>
  <ul id="L78X">
    <li id="OUFX">написание тест-кейсов;</li>
    <li id="htmi">прогон регрессии;</li>
    <li id="XD1z">починку сломанных тестов после обновлений UI;</li>
    <li id="7Z3F">разбор логов.</li>
  </ul>
  <p id="E5uG">Задачи, которые раньше требовали дней ручной подготовки, теперь выполняются за минуты. ИИ-автоматизация сокращает затраты на поддержку тестовой базы примерно до 70%.</p>
  <p id="fB71">Ниже расписали задачи, которые можно передать ИИ.</p>
  <figure id="UTwG" class="m_original">
    <img src="https://img2.teletype.in/files/9e/76/9e76128c-a81b-43d3-bd0f-71b7cfdf47e7.png" width="584" />
    <figcaption>Задачи для тестирования с помощью ИИ</figcaption>
  </figure>
  <section>
    <h2 id="kak-vyglyadit-proczess-vnedreniya-ii-v-testirovanie">Как выглядит процесс внедрения ИИ в тестирование?</h2>
  </section>
  <section>
    <p id="uxPL">Анализ QA-процессов</p>
    <p id="oJzH">Сначала команда смотрит, как устроено тестирование сейчас: какие есть тесты, как проходит регресс, сколько времени занимает релиз и где возникают задержки.</p>
    <p id="hI5K">На этом этапе определяют, какие части процесса выгоднее всего автоматизировать.</p>
    <p id="O73F">Генерация тест-кейсов</p>
    <p id="cS1T">На основе требований, дизайна и API-документации AI формируется структура тест-кейсов: предусловия, шаги, ожидаемые результаты. Дополнительно генерируются сценарии для smoke, регрессионного и сквозного тестирования с учётом логики продукта.</p>
    <p id="5t94">Генерация автотестов и кода</p>
    <p id="RBGx">Стабилизация и ревью</p>
    <p id="zffg">Интеграция в CI/CD</p>
    <p id="4FWZ">Автотесты подключаются к CI/CD-пайплайну для регулярного автоматического запуска. Команда получает документацию, структуру покрытия и готовое решение для дальнейшего масштабирования.</p>
  </section>
  <p id="xqks"></p>
  <h2 id="komu-nuzhen-iskusstvennyj-intellekt-v-testirovanie">Кому нужен искусственный интеллект в тестирование?</h2>
  <p id="Nykk">Когда релизы выходят каждую неделю или даже каждый день, проводить полноценную регрессию вручную становится всё сложнее. Автоматизация с использованием ИИ помогает быстрее создавать и поддерживать тесты, поэтому команда успевает проверять больше изменений за меньшее время.</p>
  <p id="I4oz"><em>Вместо того чтобы увеличивать штат тестировщиков пропорционально объёму работ, компания может масштабировать процессы контроля качества за счёт автоматизации.</em></p>
  <p id="QizX"><strong>Какие результаты можно получить при внедрение искусственного интеллекта:</strong></p>
  <ul id="FIDD">
    <li id="7Pya">создание автотестов ускоряется в 3–5 раз;</li>
    <li id="LDJT">тесты можно запускать в 8–20 раз чаще без расширения команды;</li>
    <li id="Ae3c">нагрузка на QA-специалистов снижается на 15–20%;</li>
    <li id="deDl">стабильность продукта повышается;</li>
    <li id="QdL3">расходы на разработку и исправление ошибок могут сократиться до 28%.</li>
  </ul>
  <h2 id="testirovanie-ai-modelej-kogda-vash-produkt-sam-ispolzuet-ii">Тестирование AI-моделей: когда ваш продукт сам использует ИИ</h2>
  <p id="gZBM">Если ваш продукт использует искусственный интеллект, обычного функционального тестирования уже недостаточно. Модель может корректно работать с технической точки зрения, но при этом выдавать неточные ответы, придумывать факты, по-разному реагировать на одинаковые запросы или ошибаться в нестандартных сценариях.</p>
  <p id="ZzDP">В традиционной разработке большинство ошибок связано с логикой приложения и обычно устраняется после исправления кода. В AI-системах всё сложнее: качество работы зависит не только от алгоритмов, но и от данных, на которых обучалась модель, её настроек и условий эксплуатации.</p>
  <p id="CAGP">При тестировании AI-решений важно проверять несколько ключевых параметров:</p>
  <ul id="3i0W">
    <li id="rIUD"><strong>Точность ответов</strong> — насколько результаты соответствуют ожидаемым данным и бизнес-требованиям.</li>
    <li id="1srE"><strong>Устойчивость</strong> — как модель работает с нестандартными, неполными или неоднозначными запросами.</li>
    <li id="Vjfk"><strong>Дрейф модели</strong> — сохраняется ли качество работы со временем при изменении данных и пользовательского поведения.</li>
    <li id="GiW4"><strong>Галлюцинации и ошибки генерации</strong> — склонна ли модель выдавать недостоверную информацию как достоверный факт.</li>
    <li id="fclA"><strong>Стабильность результатов </strong>— насколько предсказуемо модель отвечает на похожие запросы.</li>
    <li id="kpqE"><strong>Объяснимость решений </strong>— можно ли понять причины ошибок и выявить закономерности в работе модели.</li>
  </ul>
  <p id="WFpU">Именно поэтому для AI-, ML- и LLM-решений применяются отдельные методики тестирования, которые учитывают особенности работы моделей и помогают выявлять проблемы ещё до выхода продукта в продакшен.</p>
  <p id="1eLz">Исправление проблем после запуска AI-продукта обычно обходится значительно дороже, чем их обнаружение на этапе тестирования. Ошибки моделей могут приводить к потере доверия пользователей, финансовым потерям и дополнительным затратам на доработку системы.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/gtKiD4Ux-T3</guid><link>https://teletype.in/@lightech/gtKiD4Ux-T3?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/gtKiD4Ux-T3?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>Собери свою команду с IT-аутстаффингом: роли, задачи и как выбрать нужных специалистов</title><pubDate>Thu, 04 Jun 2026 14:27:09 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/59/b1/59b18b94-d791-48c5-b1e1-55e662696c83.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/46/f7/46f780e0-8b43-4d3c-8349-f0de54fd52d0.png"></img>IT-аутстаффинг — это модель работы, при которой компания берёт в аренду специалистов у подрядчика, сохраняя при этом полный контроль над задачами и процессами. Звучит просто, но у многих заказчиков возникает вопрос: каких именно специалистов можно подключить к проекту и зачем они нужны?]]></description><content:encoded><![CDATA[
  <figure id="Y7WJ" class="m_original">
    <img src="https://img1.teletype.in/files/46/f7/46f780e0-8b43-4d3c-8349-f0de54fd52d0.png" width="1800" />
    <figcaption>IT-аутстаффинг </figcaption>
  </figure>
  <p id="aHP2"><a href="https://thelightech.ru/services/it-outstaffing-vysokoklassnye-kadry-v-arendu/" target="_blank">IT-аутстаффинг</a> — это модель работы, при которой компания берёт в аренду специалистов у подрядчика, сохраняя при этом полный контроль над задачами и процессами. Звучит просто, но у многих заказчиков возникает вопрос: каких именно специалистов можно подключить к проекту и зачем они нужны?</p>
  <p id="EeHR">В этой статье разберём, какие IT-специалисты обычно входят в проектную команду и чем занимается каждая роль.</p>
  <h2 id="rynok-it-autstaffinga">Рынок IT-аутстаффинга</h2>
  <p id="QPLc"><a href="https://research24.skillstaff.ru/" target="_blank">Данные SkillStaff</a> подтверждают устойчивый спрос на внешних специалистов в ИТ. В ближайшие три года компании планируют наращивать затраты на все форматы привлечения: разработка на аутсорсе, штатные разработчики и IT-аутстаффинг показывают ожидаемый рост в диапазоне <strong>17–23%</strong> ежегодно. При этом IT-аутстаффинг стабильно держится в середине — около 18% роста в год, — что говорит о зрелом и предсказуемом спросе, а не о хайповом всплеске.</p>
  <figure id="giLb" class="m_original">
    <img src="https://img4.teletype.in/files/3b/ef/3bef0984-4e7d-40e7-a79d-d049ec466964.png" width="1800" />
    <figcaption>Тренды в найме в IT</figcaption>
  </figure>
  <blockquote id="E2du">Если смотреть по отраслям: лидером по доле аутстаффинга в IT-затратах оказался ритейл (26%), тогда как в телекоммуникациях этот показатель минимален (8%). Аутстаффинг востребован там, где бизнес быстро меняется и нужна гибкость в наборе команды — без долгосрочных обязательств по штату.</blockquote>
  <h2 id="pochemu-sostav-komandy-eto-strategicheskij-vopros">Почему состав команды — это стратегический вопрос</h2>
  <p id="sJoQ">Когда компания обращается к аутстаффингу в IT-агентство, она решает конкретную задачу: закрыть пробел в экспертизе или ускорить разработку без долгого найма.</p>
  <p id="LfuS">Но подключить «просто разработчика» — недостаточно. Неверно определённая роль приводит к тому, что работа делается медленнее, появляются технические долги и исправлять ошибки дороже, чем изначально взять правильного специалиста.</p>
  <p id="C63N">Например, в LighTech мы помогаем заказчику сформулировать требования к команде ещё на этапе онбординга — и подбираем специалистов уровня Middle+ и Senior, которые встраиваются в рабочие процессы с первого дня.</p>
  <h2 id="kakie-roli-mogut-byt-v-komande-it-autstaffinga">Какие роли могут быть в команде IT-аутстаффинга?</h2>
  <figure id="aL50" class="m_original">
    <img src="https://img3.teletype.in/files/a4/0d/a40dc8b3-fbc1-429a-874d-a13a3d690abd.png" width="1800" />
    <figcaption>Роли в аутстаффинге </figcaption>
  </figure>
  <h3 id="frontend-razrabotchiki"><strong><a href="https://thelightech.ru/services/outstaffing-frontend-razrabotchikov/" target="_blank">Frontend-разработчики</a></strong></h3>
  <p id="dD02">Фронтенд-разработчики отвечают за всё, что пользователь видит и с чем взаимодействует в браузере или приложении: интерфейсы, анимации, адаптивную вёрстку. Они работают с JavaScript, <a href="https://thelightech.ru/services/razrabotka-na-typescript/" target="_blank">TypeScript</a>, <a href="http://thelightech.ru/services/react-app/" target="_blank">React</a>, <a href="http://thelightech.ru/services/vue-js-app/" target="_blank">Vue</a> и другими фреймворками, умеют интегрировать API и следят за производительностью клиентской части.</p>
  <p id="YJUY"><strong>Когда нужен frontend-специалист:</strong></p>
  <ul id="J7LF">
    <li id="7cZw">У вас есть рабочий бэкенд, но нет качественного пользовательского интерфейса.</li>
    <li id="Qop5">Нужна доработка или редизайн существующего веб-приложения.</li>
    <li id="QezL">Требуется специалист по конкретному стеку — например, только React или только Vue.</li>
  </ul>
  <h3 id="backend-razrabotchiki"><strong><a href="https://thelightech.ru/services/outstaffing-backend-razrabotchikov/" target="_blank">Backend-разработчики</a></strong></h3>
  <p id="NAwc">Backend — это «двигатель» любого цифрового продукта. Бэкенд-разработчик строит серверную логику, проектирует базы данных, создаёт API и обеспечивает безопасность передачи данных. Работает на <a href="https://thelightech.ru/services/python-app/" target="_blank">Python</a>, Node.js, Java, Go, PHP и других языках в зависимости от требований проекта.</p>
  <p id="jueP"><strong>Когда нужен backend-специалист:</strong></p>
  <ul id="vjJF">
    <li id="1Ggh">Требуется разработка или рефакторинг серверной части.</li>
    <li id="fmf1">Нагрузка растёт, и нынешняя архитектура не справляется.</li>
    <li id="Lkut">Нужна интеграция со сторонними сервисами или микросервисная архитектура.</li>
  </ul>
  <h3 id="ios-razrabotchiki-i-android-razrabotchiki"><strong><a href="https://thelightech.ru/services/outstaffing-ios-razrabotchikov/" target="_blank">iOS-разработчики</a> и <a href="https://thelightech.ru/services/outstaffing-android-razrabotchikov/" target="_blank">Android-разработчики</a></strong></h3>
  <p id="8UxY">Нативные мобильные разработчики создают приложения под конкретные платформы — iOS или Android. iOS-разработчики работают со Swift и Objective-C, используют возможности экосистемы Apple и обеспечивают высокую производительность приложений на iPhone и iPad.</p>
  <p id="cczz">Android-разработчики используют Kotlin и Java, учитывают особенности разных устройств и версий ОС, а также работают с Android SDK и Google Play.</p>
  <p id="FbzD">Нативная разработка позволяет добиться стабильной работы приложения, глубокой интеграции с функциями устройства и высокого качества пользовательского опыта.</p>
  <p id="0DJF"><strong>Когда нужны мобильные разработчики для Android и iOS:</strong></p>
  <ul id="SEav">
    <li id="PLSY">Запускается новое мобильное приложение под iOS или Android.</li>
    <li id="KIjc">Требуется поддержка и развитие существующего приложения.</li>
    <li id="q5xe">Нужна высокая производительность, офлайн-режим или интеграция с функциями смартфона.</li>
    <li id="tXMy">Планируется публикация и сопровождение приложения в App Store или Google Play.</li>
  </ul>
  <h3 id="flutter-razrabotchiki"><strong><a href="https://thelightech.ru/services/outstaffing-flutter-razrabotchikov/" target="_blank">Flutter-разработчики</a></strong></h3>
  <p id="kr0E">Flutter — кроссплатформенный фреймворк от Google, позволяющий создавать приложения сразу для iOS, Android, web и desktop из единой кодовой базы. Такой подход помогает быстрее запускать цифровые продукты, поддерживать единый интерфейс на разных платформах и оптимизировать затраты на разработку.</p>
  <p id="bQTU"><strong>Когда нужен Flutter-разработчик:</strong></p>
  <ul id="Jb7g">
    <li id="Dk5A">Нужно запустить приложение одновременно под iOS и Android.</li>
    <li id="JRWm">Важно сократить сроки и стоимость разработки.</li>
    <li id="LvnN">Требуется единый интерфейс и логика для всех платформ.</li>
    <li id="mBQE">Нужен MVP или быстрый запуск нового цифрового продукта.</li>
  </ul>
  <h3 id="uxui-dizajnery"><strong><a href="https://thelightech.ru/services/outstaffing-design/" target="_blank">UX/UI-дизайнеры</a></strong></h3>
  <p id="uQam">UX/UI-дизайнер проектирует пользовательский опыт: анализирует целевую аудиторию, строит пользовательские сценарии, создаёт вайрфреймы и финальные макеты. Специалист понимает бизнес-задачи и делает интерфейс, который решает их, а не просто выглядит привлекательно.</p>
  <p id="RwIX"><strong>Когда нужен UX/UI-дизайнер:</strong></p>
  <ul id="YrWE">
    <li id="Cxef">Создаётся новый цифровой продукт или интерфейс.</li>
    <li id="tkch">Пользователи плохо ориентируются в текущем интерфейсе.</li>
    <li id="PXga">Нужно повысить конверсию, удержание или удобство использования.</li>
    <li id="AxRL">Требуется подготовить дизайн-систему и макеты для разработки.</li>
  </ul>
  <h3 id="qa-inzhenery"><strong><a href="https://thelightech.ru/services/outstaffing-qa-engineers/" target="_blank">QA-инженеры</a></strong></h3>
  <p id="xhcx">QA (Quality Assurance) — специалисты, которые тестируют продукт до того, как его увидит пользователь. Они находят баги, проверяют соответствие требованиям, тестируют граничные случаи и оценивают производительность под нагрузкой. QA-инженер — это страховка от дорогостоящих ошибок в продакшне.</p>
  <p id="Iq4m">QA-специалисты работают как с ручным тестированием, так и с автоматизацией: Selenium, Cypress, Appium — в зависимости от стека проекта.</p>
  <p id="CmAA"><strong>Когда нужен QA-инженер:</strong></p>
  <ul id="xqkW">
    <li id="eDlm">Продукт готовится к релизу или масштабированию.</li>
    <li id="6Fkp">После обновлений регулярно появляются ошибки.</li>
    <li id="MMrr">Нужно снизить количество багов в продакшне.</li>
    <li id="FjYK">Требуется автоматизировать тестирование и ускорить проверки.</li>
  </ul>
  <h3 id="devops-inzhenery"><strong><a href="https://thelightech.ru/services/outstaffing-devops/" target="_blank">DevOps-инженеры</a></strong></h3>
  <p id="7YUc">DevOps-инженер выстраивает CI/CD-пайплайны, управляет облачной инфраструктурой (AWS, GCP, Azure), настраивает мониторинг и обеспечивает надёжность развёртывания. Без сильного специалиста даже хорошо написанный код может стать причиной даунтаймов и потерь.</p>
  <p id="b2D5"><strong>Когда нужен DevOps-инженер:</strong></p>
  <ul id="3HyI">
    <li id="XYtq">Настройка и поддержка CI/CD (GitHub Actions, GitLab CI, Jenkins).</li>
    <li id="twdZ">Контейнеризация и оркестрация (Docker, Kubernetes).</li>
    <li id="YvTY">Мониторинг и алертинг (Prometheus, Grafana, Datadog).</li>
    <li id="ET0b">Управление облаком и оптимизация затрат.</li>
  </ul>
  <h3 id="sistemnye-analitiki"><strong><a href="https://thelightech.ru/services/outstaffing-sistemnyh-analitikov/" target="_blank">Системные аналитики</a></strong></h3>
  <p id="V6K2">Системный аналитик — связующее звено между бизнесом и разработкой. Он переводит бизнес-задачи на язык технических требований: описывает архитектуру интеграций, составляет ТЗ, прорабатывает сценарии использования и помогает команде разработки понять, что и как нужно реализовать. Особенно незаменим на проектах с несколькими внешними системами или высокой сложностью логики.</p>
  <p id="M38l"><strong>Когда нужен системный аналитик:</strong></p>
  <ul id="EDdy">
    <li id="hv05">Проект включает сложную бизнес-логику или интеграции.</li>
    <li id="DKev">Нужно подготовить подробное техническое задание.</li>
    <li id="gBDV">Команде не хватает чётких требований к разработке.</li>
    <li id="4nDA">В проекте участвует несколько внешних систем или сервисов.</li>
  </ul>
  <h3 id="biznes-analitiki"><strong><a href="https://thelightech.ru/services/outstaffing-biznes-analitikov/" target="_blank">Бизнес-аналитики</a></strong></h3>
  <p id="uuhH">Если системный аналитик смотрит на «как», бизнес-аналитик — на «зачем». Он исследует рынок и конкурентов, анализирует данные, выявляет узкие места в процессах компании и формулирует требования к продукту с точки зрения бизнеса. Бизнес-аналитик помогает убедиться, что разрабатываемое решение действительно принесёт ценность.</p>
  <p id="0RVR"><strong>Когда нужен бизнес-аналитик:</strong></p>
  <ul id="AV9C">
    <li id="6NT9">Нужно понять, какие функции действительно нужны бизнесу.</li>
    <li id="Q6L4">Требуется анализ процессов перед автоматизацией.</li>
    <li id="XU9w">Нет чёткого понимания потребностей пользователей.</li>
    <li id="9eTf">Компания планирует цифровую трансформацию или запуск нового продукта.</li>
  </ul>
  <h3 id="prodakt-menedzhery-product-manager"><strong><a href="https://thelightech.ru/services/outstaffing-menedzhera-produkta/" target="_blank">Продакт-менеджеры</a> (Product Manager)</strong></h3>
  <p id="Fj91">Продакт-менеджер управляет продуктом: он владеет видением, расставляет приоритеты в бэклоге, работает с метриками и принимает решения о функциональности. Специалист не управляет командой напрямую — он управляет продуктом через команду.</p>
  <p id="xmYu"><strong>Когда нужен Product Manager:</strong></p>
  <ul id="15cf">
    <li id="zk5a">Нет выстроенной стратегии развития продукта.</li>
    <li id="1TEZ">Команда не понимает приоритеты задач.</li>
    <li id="wvkn">Нужно управлять продуктовой roadmap и метриками.</li>
    <li id="fk7l">Требуется проверить гипотезы и развивать продукт на основе данных.</li>
  </ul>
  <h3 id="prodzhekt-menedzhery-project-manager"><strong><a href="https://thelightech.ru/services/it-outstaffing-menedzherov-proektov/" target="_blank">Проджект-менеджеры</a> (Project Manager)</strong></h3>
  <p id="qdTl">Проджект-менеджер отвечает за то, чтобы работа выполнялась в срок, в рамках бюджета и с соблюдением требований. Он ставит задачи, проводит митинги, отслеживает прогресс и служит точкой коммуникации между командой и заказчиком. Проектный менеджер закрывает операционный хаос и позволяет разработчикам сосредоточиться на коде.</p>
  <p id="0jAW"><strong>Когда нужен Project Manager:</strong></p>
  <ul id="JMHi">
    <li id="V6mg">Проект выходит за рамки работы 1–2 специалистов.</li>
    <li id="Upqm">Команда не укладывается в сроки.</li>
    <li id="tYr0">Нужно выстроить процессы и контроль задач.</li>
    <li id="zPKy">Требуется единая точка коммуникации между заказчиком и командой. </li>
  </ul>
  <h2 id="kak-ponyat-kakih-speczialistov-nuzhno-podklyuchit">Как понять, каких специалистов нужно подключить</h2>
  <p id="LIFM">Ответ зависит от стадии проекта и задач.</p>
  <figure id="Qf1z" class="m_original">
    <img src="https://img1.teletype.in/files/4a/08/4a08a824-c0e2-4853-aa35-3479d6b1495f.png" width="1298" />
    <figcaption>Стадии проекта и аутстаффинг</figcaption>
  </figure>
  <p id="CGFN">При работе с LighTech формирование состава команды происходит совместно с заказчиком на старте — мы уточняем цели, задачи и ограничения, после чего предлагаем оптимальный набор специалистов. Никаких лишних ролей и раздутых команд. </p>
  <h2 id="autstaffing-vs-autsorsing">Аутстаффинг VS Аутсорсинг</h2>
  <p id="hERb">При <a href="https://thelightech.ru/services/it-outsourcing/" target="_blank">аутсорсинге</a> вы передаёте проект внешней компании: она формирует команду, управляет ею и отвечает за результат. При <a href="https://thelightech.ru/services/it-outstaffing-vysokoklassnye-kadry-v-arendu/" target="_blank">аутстаффинге</a> специалисты интегрируются в вашу команду и работают под вашим руководством — вы сохраняете контроль над задачами, приоритетами и процессами.</p>
  <p id="cFga"><em>Это принципиальное отличие: аутстаффинг — это точечное усиление вашей команды конкретными экспертами, а не передача ответственности на сторону.</em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@lightech/_feWy-Md4nm</guid><link>https://teletype.in/@lightech/_feWy-Md4nm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech</link><comments>https://teletype.in/@lightech/_feWy-Md4nm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=lightech#comments</comments><dc:creator>lightech</dc:creator><title>Как мы мигрировали поиск с OpenSearch на TypeSense, эксплуатируя ИИ, и выжили</title><pubDate>Mon, 01 Jun 2026 14:51:27 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/dd/fb/ddfb62f0-c1b0-4b86-80ff-da410aac6278.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/fa/ca/faca5d8f-1f9c-469c-9e0a-ae9c5564eeff.png"></img>Иногда задачи в проектах выглядят очень просто… Пока ты не начинаешь их делать.]]></description><content:encoded><![CDATA[
  <figure id="oZfV" class="m_original">
    <img src="https://img4.teletype.in/files/fa/ca/faca5d8f-1f9c-469c-9e0a-ae9c5564eeff.png" width="1800" />
    <figcaption>Миграция поиска с OpenSearch на TypeSense</figcaption>
  </figure>
  <p id="9kHt">Иногда задачи в проектах выглядят очень просто… Пока ты не начинаешь их делать.</p>
  <p id="g3DV">У нас был проект с уже внедрённым поиском на OpenSearch. Всё работало: индексы, фильтры, кастомная логика запросов — даже своя «мини-ORM» над поиском, через которую фронтенд отправлял сложные query.</p>
  <p id="Kycc">И в какой-то момент пришло решение: «Давайте просто заменим OpenSearch на TypeSense.»</p>
  <p id="5dfZ">Спойлер: это никогда не бывает «просто».</p>
  <h2 id="eZ6F">Почему решили менять OpenSearch на TypeSense<br /></h2>
  <figure id="AjPn" class="m_original">
    <img src="https://img2.teletype.in/files/1a/c3/1ac36059-782f-43a2-b238-b4723d8c85cc.png" width="2880" />
    <figcaption>Меняем OpenSearch на TypeSense<br /></figcaption>
  </figure>
  <p id="iAPA">На бумаге выглядело логично — TypeSense дешевле в эксплуатации. Казалось, что это технический размен без особых потерь.</p>
  <h2 id="glavnaya-problema-nelzya-lomat-front">Главная проблема: нельзя ломать фронт</h2>
  <p id="j2bY">Самое важное ограничение — фронтенд не должен заметить никаких изменений.</p>
  <p id="tGfD">То есть API остаётся тем же, структура запросов остаётся той же, поведение поиска остаётся тем же. А внутри — полностью другой движок.</p>
  <h3 id="chto-eto-oznachalo-na-praktike"><strong>Что это означало на практике</strong></h3>
  <p id="ldVs">Мне нужно было брать запросы, заточенные под OpenSearch, трансформировать их, отправлять в TypeSense и возвращать результат в прежнем формате. По сути — написать полноценный адаптер между двумя разными мирами.</p>
  <h2 id="gde-vs-poshlo-ne-po-planu">Где всё пошло не по плану</h2>
  <p id="6WjI">Ожидание: «Ну там клиент поменять и пару запросов поправить».</p>
  <p id="2CJC">Реальность:</p>
  <ul id="HiEh">
    <li id="jbis">разные подходы к фильтрации;</li>
    <li id="eroO">разный синтаксис query;</li>
    <li id="ZIm7">разная работа с индексами;</li>
    <li id="WqhU">разная логика ранжирования.</li>
  </ul>
  <section>
    <p id="VYyc">Проблема в том, что это не просто разные API — это разные философии поиска.</p>
  </section>
  <p id="eWu5">Например: в OpenSearch — гибкий DSL, который позволяет строить запросы практически любой сложности. В TypeSense — упор на простоту и скорость, с намеренно ограниченным синтаксисом. И просто «переконвертировать JSON» не работает — нужно переосмыслить логику запросов целиком.</p>
  <h2 id="chto-prishlos-realno-perepisat">Что пришлось реально переписать</h2>
  <p id="QTfR">Фактически пришлось переделывать генерацию query, фильтрацию, агрегации и их аналоги в TypeSense, работу с индексами и вспомогательные утилиты. И всё это — сохраняя поведение 1:1, без права на регрессии, потому что фронт не должен был почувствовать разницу.</p>
  <h2 id="szhatye-sroki-i-nemnogo-boli">Сжатые сроки и немного боли</h2>
  <p id="ygMP">Классика жанра: время на задачу было сильно недооценено на этапе планирования. И вот тут начинается интересное.</p>
  <h2 id="gde-realno-pomog-ii">Где реально помог ИИ</h2>
  <p id="PMMR">Без ИИ-ассистента я бы эту задачу не закрыл в срок. Серьёзно.</p>
  <p id="QoM2">ИИ в этом кейсе выступал сразу в нескольких ролях:</p>
  <ul id="9ycI">
    <li id="GBry">живая документация;</li>
    <li id="swhA">наставник по незнакомой технологии;</li>
    <li id="2jEk">ревьюер кода;</li>
    <li id="7k03">генератор заготовок под конкретную задачу.</li>
  </ul>
  <p id="Rymr">Причём ты можешь задавать «тупые» вопросы, просить объяснить концепции, сравнивать подходы и генерировать код — и он не устаёт, не раздражается и отвечает мгновенно.</p>
  <h3 id="kak-eto-vyglyadelo-na-praktike">Как это выглядело на практике</h3>
  <p id="NzZk">Я буквально разбирал кусок OpenSearch-логики, спрашивал, как это реализовать в TypeSense, получал адаптер, тестировал, находил расхождения, возвращался с уточнёнными вопросами — и повторял. И так десятки раз, итерация за итерацией, пока поведение не совпадало.</p>
  <blockquote id="u4ya"><strong>Важный инсайт </strong>Если раньше новая технология означала: «нам нужен специалист с опытом именно в этом стеке» — то теперь формула изменилась: «нам нужно время и нормально сформулированные вопросы». ИИ сильно снижает порог входа в незнакомую область.</blockquote>
  <h2 id="analogiya-zhiznennaya">Аналогия (жизненная)</h2>
  <p id="dgmG">Можно представить это так: ИИ — это как друг, которого ты позвал с собой на разборку. Он очень круто дерётся, НО:</p>
  <figure id="3l3a" class="m_original">
    <img src="https://img4.teletype.in/files/b3/41/b341b076-85c0-433e-851e-880be7aed00a.png" width="2880" />
    <figcaption>ИИ — друг</figcaption>
  </figure>
  <ul id="xbBw">
    <li id="OPq0">иногда подтупливает;</li>
    <li id="MWg3">временами отвлекается;</li>
    <li id="LbTD">бывает что бежит впереди паровоза;</li>
    <li id="YYyx">отвечает масло масленое.</li>
  </ul>
  <p id="LRyz">Если приправить это хорошим промптом и чётко указывать, кого бить — он реально помогает. И главное: вас уже двое.</p>
  <h2 id="vyvody">Выводы</h2>
  <p id="w2Yj">1. Замена поискового движка — это не замена клиента, это замена архитектуры.</p>
  <p id="tp3w">2. Разные search engines — это разные философии, а не просто разный синтаксис.</p>
  <p id="4ToE">3. Самое сложное — сохранить поведение 1:1 без изменений на стороне потребителя.</p>
  <p id="UtuL">4. ИИ — это не игрушка, а реальный рабочий инструмент, который уже сейчас меняет то, как мы решаем сложные задачи.</p>
  <h3 id="I408">Главная мысль</h3>
  <p id="rDmy">Если вы сталкиваетесь с новой технологией — не нужно паниковать и не нужно срочно искать «сеньора с 10 годами опыта в этом конкретном стеке». Достаточно разобраться в базовых принципах, использовать ИИ как напарника и методично двигаться итерация за итерацией.</p>
  <h2 id="itog">Итог</h2>
  <p id="UR2m">Да, я сгорел. Да, это было сложно. Но без ИИ это было бы в разы дольше и болезненнее. А время, как известно, — это деньги.</p>

]]></content:encoded></item></channel></rss>