<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Песочница</title>
    <description>Песочница - тег</description>
    <link>https://tproger.ru/tag/sandbox</link>
    <atom:link href="https://tproger.ru/tag/sandbox/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 22:11:22 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Песочница</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Почему ваш канал связи — не ваш. История о том, как паранойя заставила меня написать свой мессенджер с нуля.</title>
      <link>https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas</link>
      <comments>https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[igrym]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas</guid>
      <description><![CDATA[<p>Вернул UIN-ы из нулевых и завернул всё в PWA: как я писал свой мессенджер, балансируя между ностальгией и Highload</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-vaw-kanal-svyazi---ne-vaw--istoriya-o-tom--kak-paranojya-zas">Почему ваш канал связи — не ваш. История о том, как паранойя заставила меня написать свой мессенджер с нуля.</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Apr 2026 14:35:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>В какой-то момент я понял неприятную вещь: если твой канал связи живет по чужому настроению, политической погоде, сбою в чужом облаке или очередной внезапной любви регулятора к кнопке «запретить» — это не твой канал связи. Это аренда с правом внезапного выселения.</p><p>Мне эта модель быстро наскучила.</p><p>Поэтому я сделал то, что обычно делают люди с нездоровой смесью инженерной паранойи, скуки и профессиональной деформации: психанул и начал писать свой мессенджер.</p><p>Сразу зафиксируем рамки, чтобы не плодить фантомные ожидания:</p><p>- это не убийца Telegram;</p><p>- это не презентация для инвестора с KPI и growth loops;</p><p>- это не проповедь о том, как всем теперь жить.</p><p>Это мой личный цифровой бункер, моя песочница, мой учебный полигон и мой инженерный аттракцион. Я строю это прежде всего для себя: как резервный канал связи, как способ не зависеть от чужих решений и как честный highload-эксперимент, в котором можно не рассуждать про real-time в теории, а ловить его за горло руками.</p><p>И вот здесь началось смешное.</p><p>Я рассчитывал на бодрую гаражную поделку. Но эта штука оказалась заметно живее, упрямее и интереснее, чем я ожидал. Поэтому я и притащил ее на TProger. Не за аплодисментами. За самым ценным, что здесь умеют делать лучше многих: находить слабое место раньше, чем автор успевает самодовольно сказать «ну вроде едет».</p><h2>Что это вообще такое</h2><p>На текущем этапе это PWA-мессенджер.</p><p>Да, PWA. Да, осознанно. Да, я знаю весь стандартный набор комментариев про ограничения платформы, кривые пуши, фоновые ограничения и то, что</p><p>«настоящие пацаны пишут только натив». Можете не разогреваться, я это всё уже сам себе рассказал.</p><p>Почему все равно PWA:</p><p>- мне нужен был короткий путь от идеи до живого клиента;</p><p>- мне нужен был быстрый цикл выката без ритуальных танцев с</p><p>магазинами приложений;</p><p>- мне нужен был клиент, который можно быстро ломать, чинить,</p><p>пересобирать и снова кидать в бой;</p><p>- мне нужно было что заработает на разных платформах;</p><p>- мне нравится, что PWA живет в браузерной песочнице, а не лезет в телефон как хозяин квартиры.</p><p>У PWA есть реальные потолки:</p><p>- нет такой свободы по платформенным API, как у нативного клиента;</p><p>- фон, пуши и некоторые сценарии мобильной жизни работают хуже, чем</p><p>хотелось бы;</p><p>- нет нормальных VoIP-пушей (звонки работают только когда приложение</p><p>открыто), нет нормальной интеграции со списком вызовов телефона;</p><p>- по голой производительности натив его обгоняет.</p><p>И, да, Service Workers иногда ведут себя как подростки в пубертате, а iOS местами режет фоновую жизнь PWA так, будто лично обиделась на идею веб-клиента. Я в курсе. Выживаем с тем, что есть.</p><p>Но для моей задачи PWA дал главное: скорость эволюции. А в экспериментальном проекте это иногда важнее, чем стерильная идеология.</p><p>И да, работает эта штука подозрительно хорошо. Лучше, чем я ожидал, если честно.</p><h2>Зачем вообще писать еще один мессенджер, когда мир и так ими забит</h2><p>Потому что «и так забит» — плохой аргумент, когда существующие варианты в любой момент могут начать вести себя как полуживые.</p><p>Потому что я люблю контролировать инфраструктуру, а не молиться на чужую.</p><p>Потому что читать статьи про очереди, ретраи, доставку, порядок сообщений и борьбу с race condition — это теория. А написать свое, увидеть, где оно течет, и потом руками это затыкать — уже ремесло.</p><p>Потому что мне скучно.</p><p>Да, это тоже важная часть правды. На обычной работе мозг периодически начинает зевать от предсказуемости. А когда ты в одиночку пытаешься собрать живой real-time-сервис, где есть сессии, доставка сообщений, поиск, синхронизация состояния, очереди и weird cases мобильной сети —</p><p>то зевота быстро заканчивается.</p><p>То есть да: это учебный проект. Но из тех учебных проектов, которые в какой-то момент говорят: «всё, детский сад закончился, теперь давай как взрослые».</p><p>Где начинаются не разговоры про highload, а настоящая инженерная жизнь</p><p>Пока не собираешь такое сам, кажется, что мессенджер — это просто чатик.</p><p>Ну текстик, ну websocket, ну кнопка «отправить», господи. А потом начинается взрослая часть спектакля.</p><h3>1. Сообщение должно не просто уйти, а дойти правильно</h3><p>Самая скучная и самая дорогая ошибка — считать, что «отправил» значит</p><p>«доставил».</p><p>Нет. В реальной жизни между клиентом, сетью, сервером и хранилищем полно мест, где всё может стать интересно:</p><p>- клиент послал пакет, но сеть моргнула;</p><p>- сервер принял, но клиент не получил подтверждение;</p><p>- клиент решил, что ничего не дошло, и отправил повторно;</p><p>- внезапно у тебя уже не просто доставка, а идемпотентность,</p><p>дедупликация, подтверждения, ретраи и очень неприятные разборки с</p><p>дублями.</p><p>И это только один кусок.</p><h3>2. Порядок сообщений — штука гораздо более капризная, чем кажется</h3><p>Пользователь хочет простой магии: чтобы сообщения были в нужном порядке, статусы не врали, а история не прыгала, как пьяный курсор.</p><p>Инженерная реальность куда веселее:</p><p>- локальный optimistic update на offline-first клиенте хочет быть</p><p>быстрым;</p><p>- серверная истина хочет быть правильной;</p><p>- база хочет жить в своей временной линии;</p><p>- несколько устройств одного пользователя могут в это время смотреть на</p><p>мир разными глазами.</p><p>Как только начинаешь совмещать низкую задержку с внятной консистентностью, выясняется, что ты не «чатик пишешь», а торгуешься с физикой и распределенными состояниями.</p><h3>3. Race condition — это когда баг уже произошел, но ты еще не знаешь, где именно тебя унизили</h3><p>Race conditions — мой любимый жанр инженерного фольклора. Это когда всё прекрасно, пока ты смотришь. И ломается ровно в тот момент, когда отвлекся налить кофе.</p><p>Условно:</p><p>- один поток думает, что пользователь в онлайне;</p><p>- второй уже считает, что он отвалился;</p><p>- третий в это время честно пишет новое состояние;</p><p>- четвертый с невинным лицом отдает клиенту вчерашнюю правду.</p><p>А потом ты сидишь и объясняешь себе, почему в 99.7% случаев всё идеально, а в оставшихся 0.3% система внезапно начинает разговаривать голосами. А когда еще и пытаешься заставить работать реалтайм систему еще в кластере, то все сложности возводятся в квадрат.</p><h4>4. Любая «маленькая фича» очень быстро приходит за твоей архитектурой с ножом</h4><p>Захотел новую механику? Например, необычную резервацию UIN еще до регистрации? На бумаге выглядит забавно. На бэкенде начинается вечеринка:</p><p>- появляется состояние для еще не существующего пользователя;</p><p>- нужно резервировать ресурс так, чтобы его не вымели любопытные и жадные боты;</p><p>- нужно думать о TTL, освобождении, гонках, повторных запросах и кривом клиентском поведении;</p><p>- нужно следить, чтобы веселая фича не превратилась в атаку на собственную логику.</p><p>И вот так почти всё. В продуктовых презентациях фича может подаваться как «геймификация входа». В серверной реальности — «еще один слой боли, зато красиво».</p><h3>5. Поиск и история сообщений сначала кажутся простыми. Потом ты взрослеешь</h3><p>Пока данных мало, Postgres прощает тебе оптимизм. Потом история растет, индексы начинают намекать, что дружба дружбой, а latency по расписанию, и любой неаккуратный запрос внезапно становится личным конфликтом с CPU.</p><p>И тут выясняется, что в реальном мессенджере мало просто «хранить сообщения». Нужно еще:</p><p>- быстро искать;</p><p>- не ломать горячий путь доставки;</p><p>- не превращать сервер в печку под нагрузкой;</p><p>- думать наперед, где потом начнется горизонтальное масштабирование, а</p><p>где сначала будет боль, потом переписывание, потом снова боль.</p><p>Чтобы это не выглядело как очередная литература про «сложности highload», вот живой пример. Это кусок поиска по групповым сообщениям в моем бекенде: с проверкой доступа, выборкой только текстовых сообщений и сортировкой по релевантности.</p><p>Под этот запрос у меня лежит не молитва, а вполне конкретная опора: partial GIN index по выражению`(content-&gt;&gt;'text') gin_trgm_ops`.Иначе такая красота очень быстро превращает сервер в отопление стойки за счет тупого перебора JSONB.</p><p>А вот так тот же самый функционал очень часто пишут новички — вроде работает, пока данных смешно мало:</p><p>Проблема тут не в эстетике. Проблема в том, что верхний вариант ищет по нужному полю, умеет нормально ранжировать результат и опирается на индекс. Нижний часто уезжает в тяжелый scan по JSONB, ищет по строковому представлению всего объекта и под нагрузкой начинает жечь CPU просто потому, что автору было лень договориться с базой по-хорошему.</p><p>На реальном объеме истории в проде разница здесь может быть уже не в процентах, а на порядок и выше. То есть это очень быстро превращается не в «чуть-чуть быстрее», а в 10x+, а дальше всё зависит от размера истории, доли текстовых сообщений, партиций и того, насколько сильно вы любите мучить PostgreSQL.</p><p>И это еще сравнительно добрый пример. В по-настоящему наивной реализации люди (да часто и нейросети в руках новичков) иногда забывают не только про индекс и ранжирование, но и про нормальную проверку членства в чате — и тогда у тебя получается не просто медленный поиск, а еще и билет в секцию «как я сам себе устроил privacy-инцидент».</p><h3>6. Очереди, ретраи и backpressure — это не украшения, а повод спать чуть спокойнее</h3><p>В сетевом сервисе нельзя жить по принципу «ну отправили и ладно». Когда клиентов много, а сеть у части из них вечно в состоянии «между EDGE и молитвой», тебе нужны механизмы, которые умеют не только гнать трафик, но и не убивать систему собственным рвением.</p><p>То есть нужны:</p><p>- очереди (Kafka, или что вы там предпочитаете);</p><p>- повторные попытки (retry-логика);</p><p>- backpressure;</p><p>- вменяемая реакция на временную деградацию (graceful degradation);</p><p>- circuit breaker чтобы какой-нибудь маленький и вроде бы некритичный сервис не мог каскадно положить бы всю инфраструктуру;</p><p>- архитектура, которая умеет признавать, что мир не идеален.</p><p>Красиво это звучит только в статьях. В коде это обычно выглядит как серия компромиссов, которые ты принимаешь с лицом человека, только что подписавшего договор с хаосом. И все это когда у тебя нет сотен высокопроизводительных серверов в кармане, которые уже лишь за счет их мощности могли бы прощать многое.</p><h2>Интерфейс я подсматривал у Telegram. И да, специально</h2><p>Я не стал устраивать дизайнерский карнавал ради уникальности. У пользователя уже есть мышечная память. Она дороже моего самолюбия.</p><p>Если человек открывает новый мессенджер, он хочет быстро разобраться и написать сообщение. Ему не нужен артхаус-квест «найди кнопку отправки, автор так видит».</p><p>Поэтому UI здесь знакомый. Не потому что я беден фантазией, а потому что я делаю инструмент связи, а не выставку интерфейсного концептуализма.</p><figure><img src="https://media.tproger.ru/user-uploads/136500/2026-03-17/d42e785c-1951-43a6-b560-bc03d1f503a2.webp" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/136500/2026-03-17/7f9a0d02-7637-41c9-8ca1-408153554887.webp" alt="" /></figure><h2>Моя любимая инженерная шалость: UIN-рулетка до регистрации</h2><p>Тут я, конечно, немного похулиганил.</p><p>Я сделал резервацию UIN еще до этапа регистрации. То есть можно зайти, поймать красивый номер, а уже потом решить, нужен тебе вообще этот зоопарк или нет.</p><p>С человеческой стороны это фан, ностальгия и немного ICQ-вайба.</p><p>С серверной стороны это пачка вопросов:</p><p>- как хранить состояние для «почти-пользователя»;</p><p>- как не раздать красивые номера слишком щедро;</p><p>- как не дать мимо проходящему ботнету выгрести пул;</p><p>- как освобождать резервы и не плодить мусор;</p><p>- как не застрелить логическую целостность ради красивой игрушки.</p><p>С практической точки зрения миру, возможно, и не нужна эта фича. С инженерной — она просто слишком вкусная, чтобы я прошел мимо.</p><h2>Про безопасность — без дешевой магии и без сказок для инвестора</h2><p>Нет, я не изобретал свою криптографию. Я вообще считаю, что желание «сейчас быстренько придумаю свой защищенный протокол» должно автоматически активировать тревожную сирену. Да, создать защищенный протокол возможно, но это сложнее и дольше чем кажется из-за необходимости учета множества edge-cases; и в реальности сделанные на коленке протоколы чаще ненадежны, и, что еще хуже, об их уязвимостях могут знать лишь немногие пронырливые и порой не самые добросовестные люди.</p><p>Поэтому мой подход скучный, взрослый и не очень годится для красивых презентаций:</p><p>- транспорт закрыт современным TLS 1.3 (который на текущий момент, март 2026, взломать прямым криптографическим методом практически невозможно);</p><p>- клиент живет как PWA в браузерной песочнице, какая уже сама по себе имеет ряд уровней защиты;</p><p>- поверх этого я стараюсь не творить откровенной дичи;</p><p>Но важная оговорка, и она принципиальна: проект развивается быстро, агрессивно и временами как лаборатория под кофеином. Некоторые части еще могут отваливаться на ходу. Какие-то углы я уже вижу. Какие-то, уверен, еще нет.</p><p>Поэтому, несмотря на базово вменяемый современный уровень безопасности приложения, я не рекомендую сейчас доверять системе особо чувствительные данные.</p><p>Если вам нужна зрелая крепость для деликатной переписки — берите зрелые решения, которым вы уже доверяете.</p><p>Если вам нужен живой инженерный эксперимент, резервный канал связи и объект для вдумчивого краш-теста — вот он.</p><h2>Почему я вообще тащу это именно на TProger</h2><p>Потому что TProger — это место, где тексту мало быть наглым. Здесь за дерзость прощают только одно: если под ней есть мясо.</p><p>А у меня как раз тот случай, когда мне интереснее не «собрать лайки», а получить нормальную техническую реакцию:</p><p>- где архитектура выглядит спорно;</p><p>- где логика доставки сообщений может начать чудить;</p><p>- где PWA упрется в реальные ограничения платформы;</p><p>- где резервация UIN создает лишнюю поверхность атаки;</p><p>- где под нагрузкой начнет хрустеть то, что в одиночных тестах ведет себя прилично;</p><p>- где в протоколе, порядке событий, ретраях или кешировании я недооценил крайний случай.</p><p>Мне не нужен хор в духе «вау, круто».</p><p>Мне нужен ваш внутренний вредный сеньор. Тот самый тип, который открывает статью, хмыкает, а потом начинает мысленно разбирать чужую систему на части.</p><p>Вот ему я и пишу.</p><h2>Что я от вас хочу</h2><p>По сути — честной драки, но умной.</p><p>- Хотите проверить, как это переживает плохую сеть — отлично.</p><p>- Хотите посмотреть, как выглядит поведение в edge-cases — вообще прекрасно.</p><p>- Хотите понять, насколько легко читается логика протокола — давайте.</p><p>- Хотите найти баг в порядке сообщений, в кеше, в подтверждениях, в резервации UIN, в клиентском поведении — тем более.</p><p>Только давайте без детского жанра «я что-то молча сломал и ушел сиять в закат». Если найдете слабое место, баг, странность, дыру, подозрительный сценарий или красивый способ заставить систему вести себя не так, как я планировал, — пишите.</p><p>Мне это полезнее, чем аплодисменты.</p><p>И да: я не заявляю, что построил новый и единственно верный мессенджер.</p><p>Я заявляю другое. Я собрал свой рабочий велосипед, уже довольно злой и живой, и мне интересно, где именно TProger попробует вставить ему отвертку в спицы, и на какой секунде этот велосипед упадет.</p><p>Что можно делать прямо сейчас</p><p>- Если вы параноик или устали от мейнстрима и навязанных решений — держите это как запасной канал связи.</p><p>- Если вы соскучились по временам красивых UIN — приходите ловить UIN-номер.</p><p>- Если вы любите sniff, разбор трафика и сетевые игры — смотрите что идет по проводу.</p><p>- Если у вас профессиональная привычка первым делом искать edge-cases — вот, собственно, ради вас всё это и принесено.</p><p>И если что-то положите, вскроете или красиво разберете — пришлите детали. Я не обидчивый. Я, строго говоря, именно ради этого и открыл двери.</p><h2>Что дальше</h2><p>Планы без корпоративной шелухи, но вполне понятные:</p><p>- дальше допиливаю PWA-версию;</p><p>- нативные Android и iOS-клиенты — в планах, но пока не в приоритете;</p><p>- клиентскую часть, вероятно, позже открою, когда там станет меньше творческого барокко;</p><p>- идея с SDK / библиотекой для кастомных клиентов мне нравится отдельно: если люди захотят писать свои оболочки, это будет уже совсем красивый уровень игры.</p><p>Исходники сейчас закрыты. Не потому что я жадничаю или прячу священный секретный соус, а потому что местами там еще такой авторский лофт из боевых решений, экспериментов, временных костылей и честной инженерной импровизации, что сначала я предпочту сам это немного причесать.</p><h2>Итог</h2><p>На сегодня это экспериментальный PWA-мессенджер, который родился из упрямства, паранойи, скуки и любви к инженерным задачам, от которых нормальные люди обычно стараются держаться подальше.</p><p>Я делал его в первую очередь для себя. Но он уже дорос до стадии, когда его интересно не только строить, но и показывать наружу.</p><p>Если будете пробовать — лучше сразу добавить его на домашний экран (PWA так устанавливается). Так приложению жить будет заметно удобнее: платформа позволит заработать пуш-уведомлениям, появится нормальное кеширование, а оффлайн-режим перестанет быть декоративной надписью.</p><p>Если хотите просто еще один канал связи — пожалуйста.</p><p>Если хотите посмотреть и проверить, насколько крепок мой цифровой эксперимент, — тем более пожалуйста.</p><p>Если хотите проверить заодно и собственные навыки на живой системе, которая не притворяется идеальной, — вот, собственно, и весь смысл этой публикации.</p><p>Добро пожаловать.</p><p>Посмотрим, кто кого утомит первым: вы — мой сервер, я — ваши попытки его удивить, или реальность — нас обоих.</p><p><b>PS:</b></p><p>Меня там можно найти по нику IGRYM или по UIN 10001. Также есть внутренняя группа для первых пользователей (Early Birds, доступна на экране списка чатов через «+» вверху экрана)</p><p>Ссылки:</p><p>- Приложение: https://beta.plumb-app.ru/</p><p>- Телеграм-канал с новостями проекта: https://t.me/plumb_channel</p><p>- Телеграм-группа обсуждения: https://t.me/plumb_group</p>]]></content:encoded>
    </item>
    <item>
      <title>Зимние каникулы с пользой: выбираем онлайн-лагерь и курсы для детей IT-направления</title>
      <link>https://tproger.ru/articles/zimnie-kanikuly-s-polzoj--vybiraem-onlajn-lager-i-kursy-dlya-detej-it-napravleniya</link>
      <comments>https://tproger.ru/articles/zimnie-kanikuly-s-polzoj--vybiraem-onlajn-lager-i-kursy-dlya-detej-it-napravleniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Блог IT для детей]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zimnie-kanikuly-s-polzoj--vybiraem-onlajn-lager-i-kursy-dlya-detej-it-napravleniya</guid>
      <description><![CDATA[<p>Лучшие онлайн-лагеря и курсы на зимних каникулах для школьников IT и Digital-направления, где за несколько дней дети не просто узнают новое, а сделают свои проекты — игру, мультфильм, сайт или блог.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zimnie-kanikuly-s-polzoj--vybiraem-onlajn-lager-i-kursy-dlya-detej-it-napravleniya">Зимние каникулы с пользой: выбираем онлайн-лагерь и курсы для детей IT-направления</a>»</p>]]></description>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[Партнёрский материал]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Dec 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Зимние каникулы — идеальное время, чтобы отложить учебники и позволить ребенку погрузиться в то, что ему по-настоящему интересно. Увы, часто этот интерес сводится к гаджетам. Но что, если использовать естественное стремление детей к технологиям как возможность и направить его в русло, которое принесет не только удовольствие, но и реальную пользу?!</p><p>К сожалению, IT-занятий в формате зимних онлайн-лагерей для школьников не так много; большой выбор только у школы программирования «Пиксель». Но тем не менее нам удалось подобрать несколько курсов, рассчитанных на разный возраст и любой уровень подготовки. Новички на них освоят азы, а ребята с опытом получат продвинутые задачи — в итоге каждый создаст что-то свое. Кроме того, это отличный способ «протестировать» новое направление, понять, что ближе ребенку, и провести каникулы с вдохновением.</p><p>Давайте же вместе найдем то самое направление в IT и Digital, которое зажжет огонек в глазах вашего школьника.</p><h2>Создание игр и виртуальных миров</h2><p>Если ваш ребенок может часами рассказывать о любимой игре, обсуждать персонажей или сам придумывает сюжеты — это не просто увлечение. Это потенциал. Попробуйте применить его в создании игр — ведь это уникальная смесь творчества, логики и технологий, где каждая идея может ожить.</p><p>Это направление прежде всего подходит детям, которые сами любят играть. А также тем, кто:</p><ul><li>Обожает строить миры в песочницах, например, в Minecraft.</li><li>Рисует на полях тетрадей персонажей и придумывает им истории.</li><li>Интересуется, «как это сделано», и хочет заглянуть за кулисы любимой игры.</li><li>Обладает стратегическим мышлением и любит решать нестандартные задачи.</li></ul><p>На интенсивах ребенок начнет мыслить как геймдизайнер и получит первые профессиональные навыки:</p><ul><li>Геймдизайн. Как придумать захватывающую механику? Что делает игру интересной? Дети учатся продумывать правила, баланс и сюжет.</li><li>Работа в игровых движках. Платформа, где «собирается» игра — это главный инструмент разработчика. Освоив его, ребенок поймет, как создается игровая вселенная.</li><li>Основы программирования игровой логики. Чтобы персонаж прыгал, а дверь открывалась, нужны команды. Дети в легкой визуальной или текстовой форме знакомятся с логикой кода, который управляет всем в игре.</li></ul><p>Курсы на зимних каникулах в этом направлении:</p><p><a href="https://pixel.study/programma_mladshikh_1?utm_source=tproger.ru&amp;utm_medium=article&amp;utm_campaign=zimnie-kanikuly-s-polzoy--vybiraem-onlayn-lager-i-kursy-dlya-detey-it-napravleniya">«Создание игр и основы программирования для детей 8-11 лет: Minecraft, Python, Blender»</a> в школе программирования «Пиксель»</p><figure><img src="https://media.tproger.ru/user-uploads/134768/2025-12-12/db4c4176-da3f-48d7-a6cd-35389190950a.png" alt="Курс на зимних каникулах в школе программирования Пиксель" /></figure><p>В программу входит создание игры на Python в стиле Minecraft и 3D-моделирование в Blender. Дети будут создавать собственные локации по мотивам Minecraft, населять их объектами и персонажами, программировать простые взаимодействия. Итогом станет свой собственный небольшой, но полностью рабочий игровой мир, в который можно пригласить друзей.</p><p>Зимний онлайн-лагерь школы программирования «Пиксель» рассчитан на 5 дней, по 2 урока в день. Огромное преимущество курсов в этой школе — большое количество программ (всего их около 20) и то, что каждая программа сочетает в себе по два направления. Например, есть курсы с 3D-моделированием и разработкой игр,  2D-дизайном и созданием игр в визуальных средах, проектированием сайтов в Figma и созданием 3D-игры в Unity — и многие другие. Такие курсы будут особенно интересны детям, которые еще не определились со своим направлением в IT или хотят попробовать себя в новых сферах.</p><p><a href="https://online.top-academy.ru/education/winter-it-camp">Курс «99 ночей в зимнем лесу» для детей от 7 до 14 лет</a> в Компьютерной Академии ТОП</p><figure><img src="https://media.tproger.ru/user-uploads/134768/2025-12-12/fadaf76c-702c-420e-9cd3-f4a7043b7b4c.png" alt="Курс на зимних каникулах в Компьютерной Академии ТОП" /></figure><p>Здесь дети займутся графикой и 3D. Они смоделируют новогоднего оленя в Tinkercad и создадут собственную игровую локацию, сгенерируют стикерпак для Telegram с помощью ИИ, нарисуют вексельный костер в 3D-редакторе MagicaVoxel.</p><p>Этот курс также длится 5 дней. Кроме него у Академии ТОП есть еще один пятидневный курс «Зимние IT-каникулы: спасаем Новый год» и бесплатный мини-интенсив на один день «Создание новогоднего сайта на Tilda».</p><h2>Цифровое творчество — рисунок, анимация, видео</h2><p>Сегодня дети не просто потребляют контент — они живут в нем. Лента в соцсетях, видеоролики, мемы, анимационные сериалы — это их язык общения. Так давайте же научим их не только «читать» на этом языке, но и «говорить» на нем. Это направление для тех, кто тянется к красоте и самовыражению.</p><p>Курсы в списке подойдут юным визуалам и творцам, а именно тем, кто:</p><ul><li>Постоянно что-то рисует — в альбоме, на планшете или даже на салфетках в кафе.</li><li>Обожает снимать все на телефон: от кота до заката, а потом экспериментирует с фильтрами и монтажом в простых редакторах.</li><li>Проводит время в TikTok или YouTube, подмечая, как сделан тот или иной крутой ролик.</li><li>Мечтает создать своего анимационного персонажа или вести собственный тематический блог.</li></ul><p>На мини-курсах этого направления дети осваивают базу настоящих цифровых профессий:</p><ul><li>Цифровая иллюстрация. Техники рисования на графическом планшете или в программах. Как работать со слоями, подбирать палитру, создавать цельные картины или стикеры.</li><li>Создание 2D-анимации. Волшебство оживления картинки. Дети узнают, что такое раскадровка, ключевые кадры и плавные переходы. Как заставить нарисованного героя махнуть рукой или улыбнуться.</li><li>Основы видеомонтажа и цветокоррекции. Как из разрозненных видео склеить цепляющую историю? Что такое «цветовой круг» и как с его помощью создать нужное настроение в видео? А это уже навыки продюсирования контента.</li></ul><p>Онлайн-курсы на зимних каникулах в этом направлении:</p><p><a href="https://online.towncamp.ru/marafonvideobloger">Онлайн-лагерь «Марафон видеоблогеров» для детей 7-12 лет</a> в школе «Лидерландия»</p><figure><img src="https://media.tproger.ru/user-uploads/134768/2025-12-16/f5200018-0af5-4266-ad5d-7bfe13283800.png" alt="Курс на зимних каникулах в школе Лидерландия" /></figure><p>За 5 дней дети создадут 5 роликов в разных стилях: вайн, рум-тур, тренд, обзор и сторителлинг. Ребята узнают секреты челленджей и продвижения в соцсетях, научатся работать на камеру, создадут рекламу премьеры в своем блоге. В итоге за каникулы ребенок станет режиссером, сценаристом, продюссером и актером в одном лице и получит незаменимые навыки брендинга в соцсетях.</p><p><a href="https://pixel.study/programma_mladshikh_4?utm_source=tproger.ru&amp;utm_medium=article&amp;utm_campaign=zimnie-kanikuly-s-polzoy--vybiraem-onlayn-lager-i-kursy-dlya-detey-it-napravleniya">«Блогинг и цифровая графика: Figma+Scratch (создание блога и мультфильма)»</a> в школе программирования «Пиксель»</p><figure><img src="https://media.tproger.ru/user-uploads/134768/2025-12-12/6c93e49e-87ac-4adb-a266-8b12add42059.png" alt="Figma+Scratch, курс на зимних каникулах в школе Пиксель" /></figure><p>Еще один курс школы «Пиксель, на этот раз для детей и подростков, которые задумываются о своем digital-имидже. Ребята научатся не только вести блог, но и делать его визуально привлекательным и осмысленным. Дети освоят основы композиции и типографики, научатся обрабатывать фотографии и, конечно, создавать анимацию. По сути, они создадут визуальный «паспорт» своего проекта или увлечения.</p><h2>Программирование и веб-технологии</h2><p>Со стороны кажется, что программирование — это скучный набор команд для избранных. Но это не так. Программирование — это способ мышления. Это умение разбить большую задачу на маленькие логические шаги и дать четкую инструкцию для ее решения. Для многих написание алгоритмов и программ становится самым увлекательным интеллектуальным конструктором.</p><p>Это направление — находка для юных аналитиков и исследователей, а именно для тех, кто:</p><ul><li>Обожает головоломки, логические игры, стратегии и шахматы.</li><li>Постоянно задает вопрос «Как это работает?» — будь то сайт, приложение или даже умная колонка.</li><li>Любит четкость, порядок и получает удовольствие, когда сложная задача наконец решается.</li><li>Уже задумывается о практической пользе навыков и хочет создавать не только для развлечения, но и для дела.</li></ul><p>За короткий интенсив ребенок прикоснется к самым востребованным инструментам IT-индустрии и создаст свои первые рабочие проекты:</p><ul><li>Основы языков программирования Python или JavaScript. Дети узнают, что такое переменные, условия, циклы — не в теории, а сразу применяя их для оживления своих проектов.</li><li>Верстка сайтов (HTML/CSS). Как устроены сайты. Как сделать так, чтобы страница была не только информативной, но и красивой, и отлично выглядела на любом устройстве.</li><li>Создание интерактива. Самый волнующий момент — «оживление» страницы или создание полезной программы. Это может быть интерактивная викторина на сайте, простой чат-бот или мини-игра.</li></ul><p>Курсы на зимних каникулах в этом направлении:</p><p><a href="https://pixel.study/programma_starshikh_5?utm_source=tproger.ru&amp;utm_medium=article&amp;utm_campaign=zimnie-kanikuly-s-polzoy--vybiraem-onlayn-lager-i-kursy-dlya-detey-it-napravleniya">«Веб-разработка HTML/CSS и программирование на Python: создание сайта по интересам и создание игры»</a> в школе «Пиксель»</p><figure><img src="https://media.tproger.ru/user-uploads/134768/2025-12-12/8af7b34f-7a81-4003-bede-88cea545093a.png" alt="HTML/CSS и Python. Школьный онлайн-лагерь на зимних каникулах в школе Пиксель" /></figure><p>Практика — самый наглядный и мотивирующий старт. Здесь ребенок не будет писать абстрактный код. Он сразу начнет создавать свой собственный сайт — например, про хобби, коллекцию или в качестве цифровой визитки. Он научится строить его «каркас» на HTML и стилизовать элементы с помощью CSS. Итог — полностью рабочий сайт, который можно открыть с любого устройства и показать друзьям.</p><p>Вторая часть курса — создание игры на Python. Python — один из самых понятных и при этом мощных языков, именно поэтому путь в IT часто начинается с него. На интенсиве дети изучат его основы, работая над графической игрой.</p><p>Бесплатный мастер-класс для детей <a href="https://tetrika-school.ru/masterclass_it">«Программируем на Python»</a> в школе «Тетрика»</p><figure><img src="https://media.tproger.ru/user-uploads/134768/2025-12-12/d53d6632-4b21-4f41-a93b-8874a5cee0f5.png" alt="Бесплатный мастер-класс для детей по программированию на Python в школе Тетрика" /></figure><p>Здесь ребенок запрограммирует движение бесконечно движущегося мяча, научится управлять черепашкой на языке Python и, конечно, попробует себя в роли программиста!</p><p>Как сделать окончательный выбор, чтобы каникулы прошли с пользой, а ребенок занимался с удовольствием и без лишнего стресса?</p><ol><li>Определите интерес — обязательно вместе с ребенком.</li></ol><p>Покажите описания направлений и конкретных программ. Не спрашивайте абстрактно «Хочешь программировать?», а спросите: «Тебе больше нравится идея создать свою игру, смонтировать ролик или сделать сайт?». Самый верный ориентир — живой отклик. Если глаза загорелись при упоминании анимации, это знак.</p><ol><li>Проверьте расписание и нагрузку.</li></ol><p>Каникулы — это все-таки отдых. Обратите внимание: сколько дней длится программа и сколько часов в день займут занятия? Не будут ли 4 часа онлайн-интенсива подряд слишком утомительными? Следите за балансом — учеба должна сменяться офлайн-активностями, а у ребенка оставаться время на прогулки и личные дела.</p><ol><li>Узнайте про итоговый проект.</li></ol><p>Что конкретно дети создадут к концу смены? Рабочую игру, мультфильм, сайт? Возможность показать готовый результат друзьям и семье — мощный мотиватор и лучший итог каникул.</p><ol><li>Выясните технические требования.</li></ol><p>Чтобы первый же день не обернулся разочарованием, уточните: хватит ли мощности вашего компьютера или планшета? Нужна ли установка специальных программ? А дополнительные устройства — например, графический планшет для рисования или хороший микрофон для блогинга? Эта информация обычно есть в описании курса.</p><p>Но главный критерий выбора — искренний интерес вашего школьника. Когда он с энтузиазмом представляет, как будет создавать свой проект, — вы на верном пути.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пет-проект для начинающих: как найти идею и довести её до результата</title>
      <link>https://tproger.ru/articles/pet-proekt-dlya-nachinayushhih--kak-najti-ideyu-i-dovesti-eyo-do-rezultata</link>
      <comments>https://tproger.ru/articles/pet-proekt-dlya-nachinayushhih--kak-najti-ideyu-i-dovesti-eyo-do-rezultata?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pet-proekt-dlya-nachinayushhih--kak-najti-ideyu-i-dovesti-eyo-do-rezultata</guid>
      <description><![CDATA[<p>Пошаговое руководство по пет-проектам: как выбрать идею, довести до MVP, протестировать, масштабировать и использовать проект для собеседований и карьерного роста в IT.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pet-proekt-dlya-nachinayushhih--kak-najti-ideyu-i-dovesti-eyo-do-rezultata">Пет-проект для начинающих: как найти идею и довести её до результата</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 25 Aug 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пет-проекты остаются самым наглядным способом освоить IT-навыки и продемонстрировать их работодателю. Они позволяют на практике столкнуться с реальными задачами, понять свои пробелы, попробовать разные роли в команде и получить опыт, который невозможно заменить курсами. Вместе с Вадимом Медяником, техническим директором <a href="https://t.me/+nyjhwExaCgIzMjM6">ИТ-компании BPA</a>, разбираемся, как выбрать идею, довести проект до рабочей версии и превратить его в инструмент карьерного роста.</p><h2>Почему пет-проекты остаются самым понятным способом войти в IT</h2><p>Пет-проект — это возможность пройти весь путь разработки своими руками: от идеи и строк кода до первых ошибок и переделок. Для новичка это ценный способ быстро понять, чего он ещё не знает, и какие технологии стоит подтянуть.</p><p>Курсы на старте действительно нужны — они дают базовое понимание, знакомят с инструментами и методами, объясняют ключевые термины. Но это обучение по готовому сценарию, в котором почти нет места ошибкам и непредсказуемым задачам. Пет-проект, наоборот, — «песочница» для экспериментов. Здесь приходится самостоятельно искать решения, разбираться в незнакомых технологиях, документировать процесс, отлаживать код и принимать архитектурные решения. Именно на этом этапе мы учимся мыслить как разработчик.</p><p>Даже если проект сырой, часто ломается и переписывается, он всё равно даёт мощный практический опыт и помогает взглянуть на разработку системно: зачем нужен DevOps, как устроена база данных, почему дизайн влияет на работу фронтенда.</p><p>Для опытных специалистов пет-проекты остаются способом выйти за рамки своей узкой специализации. Они помогают увидеть полный цикл: от взаимодействия с оборудованием и выбора форматов данных до интеграции в интерфейс и настройки мониторинга.</p><p>Как работают петы для разных грейдов:</p><ul><li>Для начинающих и мидлов пет-проекты — понятный маркер потенциала. Публичный репозиторий с живой историей коммитов показывает процесс мышления. Это сигнал инициативности и самостоятельности.</li><li>Для middle-разработчиков активный проект говорит о зрелости и желании расти, а также о способности мыслить архитектурно и предлагать решения с нуля. Часто именно такие проекты помогают вырасти до роли тимлида.</li><li>Для senior-уровня личные проекты могут быть признаком глубокой вовлечённости и лидерских качеств. Однако в некоторых компаниях это может вызвать вопросы о приоритетах и рисках отвлечения от основных задач — здесь всё зависит от контекста.</li></ul><p>В итоге, пет-проект остаётся инструментом, который одинаково полезен и для старта в профессии, и для расширения горизонтов опытного разработчика.</p><h2>Как выбрать идею пет-проекта</h2><p>Для многих разработчиков выбор идеи становится главным стоппером. Часто кажется, что нужно придумать что-то уникальное, масштабное и потенциально коммерчески успешное. На практике же хорошие пет-проекты почти всегда рождаются из простых и личных вещей — из задач, которые вы сами хотите решить.</p><h3>Признаки «живой» идеи</h3><p>Главный критерий — личная вовлечённость. Если проект решает вашу собственную проблему, у вас будет и чёткое понимание, каким должно быть решение. Сможете тестировать продукт в реальных условиях и быстро видеть, что стоит улучшить.</p><p>Это может быть что угодно — консольная утилита, библиотека или небольшой интерфейс. Необязательно сразу думать о коммерциализации. Многие успешные проекты начинались как простые инструменты «под себя» и со временем обретали пользователей. Классический пример — библиотеки, созданные для решения личных задач, которые оказались полезны сообществу.</p><p>Ещё один важный признак — возможность сформулировать конечную цель и путь до MVP. Если вы сразу понимаете, что нужно сделать в первую очередь, чтобы проверить идею, это верный сигнал: проект имеет потенциал.</p><h3>Где искать идеи</h3><p>Главный источник — ваш профессиональный и личный опыт. Обратите внимание на повторяющиеся задачи, которые вы выполняете вручную: чистка логов, настройка однотипных пайплайнов, синхронизация календарей, копирование шаблонов. Если в какой-то момент вы думаете «это можно автоматизировать» — вот готовая точка входа.</p><p>Полезным сигналом может быть и недовольство текущими инструментами: перегруженный интерфейс, сложная настройка, нехватка документации. Вместо того чтобы жаловаться, можно попробовать сделать удобную альтернативу. Многие библиотеки и сервисы начинались именно так.</p><p>Работа в команде даёт дополнительный ресурс — внутренние боли, на которые не хватает рук. Даже простой internal tool с внятным UX может стать ценным проектом.</p><p>Ещё один способ — наблюдать за новичками в профессии: у них часто одни и те же проблемы, которые можно решить. Более зрелый путь — активное участие в комьюнити: обсуждать темы, отслеживать, какие вопросы вызывают споры и остаются без ответа. В этих зонах часто скрыты нерешённые инженерные задачи.</p><h2>Форматы пет-проектов, которые реально прокачивают</h2><h3>«Витринные» проекты против реальных</h3><p>Так называемые «витринные» пет-проекты — это работы для портфолио, обычно размещённые на GitHub или другой публичной платформе. Их цель — показать навыки и интерес к определённым технологиям. Как правило, это одноразовые демонстрации, которые не получают развития.</p><p>Реальные проекты, напротив, пишутся «под себя» и живут по циклу: старт, активная фаза, затишье, возвращение, рефакторинг, смена архитектуры. Именно такие циклы дают максимальное развитие: видно, как меняется мышление, как принимаются решения, сколько усилий вложено. Работодатель по такому проекту может оценить зрелость кандидата — способность вести долгую работу, анализировать и дорабатывать решение, а не просто писать код ради кода.</p><h3>Типы проектов, которые чаще приводят к офферам</h3><p>Работает простое правило: проект ценен, когда близок по задачам к компании. Если фирма делает ботов — будут интересны ваши боты. Если она в продуктовой сфере, например HR, — подойдёт даже небольшой инструмент для учёта или взаимодействия между людьми.</p><p>Тип проекта — бот, API, open-source-библиотека или мини-продукт — не так важен. Ключевые критерии:</p><ul><li>связь с реальной задачей;</li><li>рабочее состояние проекта;</li><li>минимальная упаковка для использования.</li></ul><p>Такие проекты легко оценить и привести как аргумент на собеседовании.</p><h3>Форматы, которые развивают</h3><p>Проект становится инструментом комплексного роста, если оформлен «как для других»: с документацией, онбордингом, тестированием. Если вы общаетесь с пользователями, собираете обратную связь, задаётесь вопросами «для кого это?», «зачем?», «как улучшить?», вы прокачиваете не только инженерные, но и продуктовые, коммуникационные и лидерские навыки.</p><p>Иногда такие проекты перерастают в полноценный продукт — с регистрацией прав, подачей в акселератор, созданием команды. Даже если этого не произойдёт, сам процесс — ценный опыт.</p><h2>Что убивает пет-проекты</h2><p>Даже перспективные идеи нередко так и не доходят до минимально рабочей версии. Причина чаще кроется не в технологиях, а в организационных и психологических перегрузках. На старте проект кажется простым, но в работе выясняется, что архитектуру нужно переделывать, код — рефакторить, логику — чинить, а новые зависимости — упрощать. Многие пытаются сразу сделать «идеально» — продумать монолитный стек, прописать сложную систему «как в проде» — и вместо простого MVP получают цепочку задач, где каждое решение порождает ещё пять. На этом этапе разработчик нередко выгорает и уходит.</p><p>Есть и банальные причины: жизнь отвлекает, накапливается усталость от основной работы, снижается ресурс. В итоге выживают не самые умные идеи, а те, что удалось довести хотя бы до минимальной рабочей версии.</p><p><b>Привычные ошибки, которые мешают доводить до результата</b></p><ul><li>Гипер сложность на старте. Вместо того чтобы упростить задачу и разбить её на этапы, многие бросают проект, когда понимают, что не тянут.</li><li>Уход во второстепенные фичи. Неделями можно оттачивать анимации или кастомные библиотеки, забывая, что основной функционал ещё не работает.</li><li>Неправильные приоритеты. Вместо итерационного подхода («сначала сделать главное, потом расширять») ресурсы тратятся не туда.</li><li>Отсутствие финальной точки. Если нет чётко определённого результата, к которому можно прийти, нет и ощущения успеха — а значит, пропадает энергия двигаться дальше.</li></ul><h2>Как правильно выстроить пет-проект</h2><p>У пет-проекта нет менеджера, дедлайна или бизнес-заказчика — значит, вся организация работы лежит на вас. От того, как вы её построите с самого начала, зависит, дойдёт ли проект хотя бы до рабочей версии.</p><h3>С чего начать — минимальная версия</h3><p>Первая цель — очевидно работающий MVP. Пусть он будет глючным, неполным, без красивого дизайна, но выполняющим главную задачу.</p><p>Например, если вы делаете сервис для поздравлений с днём рождения, на первом этапе нужен только механизм отправки писем по списку адресов. Всё остальное — кастомизацию, аналитику, генерацию текста — ещё предстоит предусмотреть. Ошибка новичков — начинать с «прикольного» вокруг ядра, а не с самого ядра. Это ведёт к расфокусу, выгоранию и затяжке сроков.</p><h3>Приоритеты: фичи, архитектура, документация</h3><p>На старте почти у всех одинаковая ситуация: архитектура постоянно меняется, документация откладывается, а идеи фич копятся в голове. Чтобы избежать хаоса, помогает простая матрица приоритетов:</p><ul><li>Сложность реализации (1–3 балла)</li><li>Ценность/интересность (для вас или проекта в целом)</li></ul><p>Так видно, что можно сделать прямо сейчас, а что нужно отложить. Идеи лучше дополнять в процессе — через переписки, брейнштормы с друзьями, даже нейросети. Но важно фильтровать: что действительно полезно и выполнимо, а что отвлекает.</p><p>Документация в одиночных проектах может быть минимальной, но стоит хотя бы фиксировать ключевые решения, чтобы через пару недель не разбираться в собственном коде заново.</p><h3>Тестирование и фидбэк на ранних этапах</h3><p>Ранняя обратная связь спасает от лишней работы и блуждания в идеях.</p><ul><li>Если проект понятный и бытовой — тестируйте на друзьях и родственниках. Подготовьте набор вопросов: что удобно? что запутало? чего не хватает?</li><li>Если проект технический (например, API), ищите тестировщиков в профильных чатах, вузовских группах, на тематических форумах. Можно предложить бесплатный доступ в обмен на комментарии.</li></ul><p>Не бойтесь показывать «сырой» продукт — просто объясните, что это черновик, и вам нужен честный фидбек. Чем раньше получите фидбэк, тем меньше сил уйдёт в пустоту.</p><h2>Как масштабировать своего «питомца»</h2><p>Пет-проект не заканчивается — он просто останавливается на каком-то этапе. Если уже есть стабильная версия, понятная логика и вы видите в этом ценность — пора переводить его из «питомца» в «продукт».</p><p>Первый шаг — техническая «чистка»: сделать код читаемым, удалить хаос и лишнее, добавить минимальную структуру, тесты, README с инструкциями. Если проект нужно устанавливать, должны быть чёткие шаги запуска и список зависимостей. Интерфейс — со скриншотами, демо и понятным user flow. Для API — список эндпоинтов и структура запросов. Логику полезно визуализировать в виде диаграмм.</p><p>Далее — смысловая упаковка: чётко описать, что проект делает, для кого он, какие задачи решает и какие ограничения имеет. Это полезно и пользователям, и автору, чтобы видеть границы и приоритеты.</p><p>Если планируется выход за пределы своего круга, потребуется продуктовая упаковка: конкурентный анализ, портрет целевого сегмента, расчёт расходов на поддержку и развитие. Все материалы сводятся в питч-дек, текстовое описание или демо-выступление в формате, подходящем для конкретной аудитории.</p><p>Советы по масштабированию</p><ol><li>Вести осмысленные разговоры с потенциальными пользователями, экспертами и теми, кто решал похожие задачи — это поможет понять, что действительно ценно, а что мешает.</li><li>Оценить масштабируемость: проект может быть полезным на малом масштабе, но рушиться при росте.</li><li>Определить вектор: B2B или B2C, чёткий портрет потребителя. Без этого презентация будет размыта.</li><li>При планах на инвестиции — предварительная оценка рынка, прогноз доли и гипотеза роста.</li><li>После подготовки — выход «в поле»: участие в отраслевых событиях, акселераторах и деловые знакомства.</li></ol><p>Упаковка — это проверка зрелости проекта. Если его можно показать и объяснить, значит, он готов к следующему этапу.</p><h3>Что дальше: превращаем проект в карьеру</h3><p>Пет-проект может стать сильным кейсом для собеседований: это живой пример задач, принятых решений и опыта работы с проблемами. Главное — не только показать, что всё работает, но и уметь рассказать, где были ошибки, что не удалось и как бы вы сделали иначе сейчас. Работодатели чаще оценивают мышление и подход, чем безупречный результат. Даже недочёты можно обернуть в плюс, если объяснить их причины и предложить улучшения.</p><p>Живой стенд, доступ к репозиторию и документация помогают техническому интервьюеру быстро оценить проект, а иногда оказываются убедительнее, чем тестовые задания. Внутри компании проект редко становится прямой причиной повышения, но может доказать инициативность и профессиональный рост, особенно если он решает реальную рабочую задачу или автоматизирует рутину.</p><p>Когда стоит показывать проект миру</p><ol><li>Если он открыт на GitHub, уже доступен. Активно рассказывать о нём лучше после минимальной упаковки: README, описание, структура, работающая ключевая функция.</li><li>Для продвижения себя как продуктового специалиста, поиска команды или инвестиций нужно полноценное оформление: описание, демо, фидбэк, проработанная аудитория и сценарии применения.</li><li>Для портфолио или аргумента на собеседовании достаточно, чтобы проект был рабочим, логичным и понятным.</li></ol><p>Удачи в петах!</p>]]></content:encoded>
    </item>
    <item>
      <title>Безопасное исполнение ненадёжного кода</title>
      <link>https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda</link>
      <comments>https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Межов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda</guid>
      <description><![CDATA[<p>Методы безопасного исполнения ненадёжного кода. Рассматриваются уровни изоляции кода, методы ограничения ресурсов процесса, проблемы жёсткого лимитирования и подходы к их решению. Обсуждаются вопросы управления песочницами, а также использование инструментов контейнеризации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda">Безопасное исполнение ненадёжного кода</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 06 Jul 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы привыкли к тому, что ведем разработку, используя лучшие инженерные практики, включая настройку CI/CD-конвейера. Сначала код проходит многоэтапные стадии проверки и тестирования, а только потом попадает в production-среду.</p><p>Давайте представим ситуацию, что нужно запустить код, минуя все эти стадии. Прям в production-среде. На первый взгляд — бред! Но если подумать, то на самом деле, не такая уж редкость. Например, некоторые системы предоставляют своим пользователям возможность расширять функциональность за счет прикладных скриптов. Наш любимый CI/CD-конвейер зачастую построен на пользовательских скриптах.</p><p>С одной стороны, для большинства подобная постановка вопроса — крайность. С другой, появляется возможность рассмотреть проблему с разных ракурсов. Уверен, что какие-то части общего решения, о котором пойдёт речь далее, могут быть использованы повторно и в других проектах.</p><p>Предлагаю по частям разобрать проблему безопасного исполнения ненадёжного кода. Последовательно рассмотрим вопросы, ответы на которые поворотные в выборе целевой архитектуры. Большая часть статьи касается разработки, но в конце сделаны важные акценты относительно администрирования и развертывания.</p><h2>Ненадёжный код</h2><p>Для начала определимся, что же считать ненадёжным кодом? На самом деле ответ зависит от решаемой задачи, правил и процессов, принятых в компании:</p><ul><li>Код, который не прошел CI, review и т.п.</li><li>Код из ненадёжного или неизвестного источника.</li><li>Закрытый (проприетарный) код.</li><li>Код, содержащий уязвимости.</li><li>Код, использующий запрещенные функции.</li><li>Любой код, который написал коллега:)</li></ul><p>Чтобы отделять код разрабатываемого приложения от ненадёжного, первый буду называть кодом приложения, а второй — <i>ненадёжным</i> или <i>внешним кодом</i>. Необходимость запуска ненадёжного кода в некоторых случаях буду называть <i>задачей</i>.</p><h2>Уровни изоляции кода</h2><p>Можно выделить три варианта запуска внешнего кода — три уровня изоляции. Каждый следующий увеличивает дистанцию между кодом приложения и запускаемым кодом. Чем выше уровень изоляции, тем меньше вероятность, что запускаемый код нанесет вред приложению и системе.</p><h3>Уровень 1: тот же процесс</h3><p>Запуск внешнего кода в адресном пространстве процесса приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/191fd454-6837-4e91-abbf-c6d4a1fb6121.png" alt="Запуск внешнего кода в адресном пространстве процесса приложения." /><figcaption>Запуск внешнего кода в адресном пространстве процесса приложения.</figcaption></figure><p>Такой способ определяет самый слабый уровень изоляции, поскольку запущенный код теоретически имеет доступ ко всему тому, к чему имеет доступ код самого приложения.</p><p>Примером может служить использование интерпретаторов скриптов (<a href="https://github.com/mozilla/rhino">Rhino</a>, <a href="https://github.com/IronLanguages/ironpython3">IronPython</a>, <a href="https://github.com/jython/jython">Jython</a> и т.п.), визуальных языков программирования (workflow-движков) или подключение модулей расширения (плагинов).</p><p>Способов защиты на этом уровне не так много. Пожалуй, самым эффективным выступает (self-sandboxing), при котором приложение делает самозапрет на доступ к некоторым ресурсам системы. Например, сразу после инициализации — самозапрет на доступ к файловой системе.</p><p>Дополнительно запускаемый код можно подвергать строгому (синтаксическому) анализу, запрещая использование определенных функций, модулей, пакетов и т.п. Некоторые интерпретаторы имеют точки расширения, которые позволяют контролировать процесс исполнения. Если такой возможности нет, можно воспользоваться одной из техник самоизоляции — <a href="https://www.kernel.org/doc/html/latest/userspace-api/seccomp_filter.html">фильтрацией системных вызовов</a>.</p><p>Что же касается плагинов, то они призваны расширять возможности приложения, поэтому их использование изначально не предполагает сильной изоляции. Здесь можно предложить усилить контроль взаимодействия на уровне контракта (API). В идеале — если плагины будут публиковаться в некоторый центральный репозиторий, которому вы доверяете и который может производить дополнительные проверки и тестирование до этапа запуска кода плагина.</p><h3>Уровень 2: отдельный процесс</h3><p>Запуск внешнего кода на той же машине, но в отдельном процессе ОС.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/e0bf62de-65a9-4370-9986-ed21c6e63b8e.png" alt="Запуск внешнего кода на той же машине, но в отдельном процессе ОС." /><figcaption>Запуск внешнего кода на той же машине, но в отдельном процессе ОС.</figcaption></figure><p>Поскольку и приложение, и внешний код взаимодействуют в рамках одного узла, используя локальные ресурсы ОС (оперативная память, файловая система и т.п.), скорость межпроцессного взаимодействия очень высокая.</p><p>Этот уровень изоляции предполагает использование широкого арсенала возможностей. Как минимум, внешний код может быть запущен от имени менее привилегированного пользователя, с ограниченным доступом к ресурсам ОС. Сильные способы изоляции ограничивают ресурсы с помощью средств ОС или инструментов контейнеризации. Однако, чем сильнее контроль, тем больше накладных расходов на запуск и исполнение процесса, что при решении некоторых задач неприемлемо дорого или неоправданно сложно.</p><h3>Уровень 3: отдельная машина</h3><p>Запуск внешнего кода на отдельной машине — песочнице.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/5e48bc50-75c9-4789-9dc7-3bbf2c1659a7.png" alt="Запуск внешнего кода на отдельной машине — песочнице." /><figcaption>Запуск внешнего кода на отдельной машине — песочнице.</figcaption></figure><p>Это максимальный уровень изоляции из всех возможных. Здесь появляется возможность ограничить ресурсы самой песочницы (CPU, память, дисковое пространство, доступ к сети и т.п.). Если в результате исполнения внешнего кода песочница выйдет из строя, приложение продолжит свою работу.</p><p>Самый главный недостаток этого подхода — необходимость сетевого взаимодействия между узлом, на котором работает приложение, и песочницей. Передача входных данных в песочницу, запуск процесса внутри, ожидание окончания его исполнения, получение выходных данных — всё это сетевые обращения. Так существенно замедляется процесс исполнения, а само взаимодействие подвержено сетевым сбоям, что ведёт к нестабильности системы и получаемых результатов.</p><h2>Использование песочницы</h2><p>Предположим, требуется максимальный уровень изоляции ненадёжного кода, следовательно, нужно остановиться на варианте запуска на отдельной машине. Если так, то для принятия последующих архитектурных решений нужно ответить на следующую пару вопросов.</p><h3>Пересоздание или переиспользование песочницы</h3><p>Песочницу требуется пересоздавать перед исполнением каждой задачи, если требуется особенное окружение (например, определенная версия ОС, пакетов или ресурсов) или идентичность этого окружения (для стабильности получаемых результатов). Схожие вопросы возникают, например, при интеграционном тестировании: каждому тесту нужны свои предустановки.</p><p>Переиспользование песочницы становится возможным, если задачи могут исполняться в одном окружении и не оказывают влияния друг на друга (предыдущая задача не портит результаты последующей). Продолжая аналогию с интеграционным тестированием: всем тестам нужны одинаковые предустановки, и тесты могут запускаться повторно на одном стенде, демонстрируя один и тот же результат.</p><p>Основным преимуществом пересоздания песочницы выступает стабильность получаемых результатов. К недостаткам относится медленный запуск и перерасход ресурсов. На пересоздание песочницы уходят десятки секунд или даже минут, следовательно, большая часть ресурсов будет тратиться именно на это. Существует множество техник ускорения пересоздания, благодаря которым можно сократить время запуска. Прежде всего, сюда можно отнести backup/restore (snapshot песочницы, базы данных и т.п.). Также если поток задач небольшой и ресурсы позволяют, можно попробовать организовать пул песочниц и создавать их заранее.</p><p>Ставка на переиспользование делается в случае, когда поток задач большой и нужно сократить время ожидания их запуска. При этом возрастает вероятность получения нестабильных результатов и, возможно, требуется производить какую-то очистку окружения до или после исполнения очередной задачи.</p><h3>Последовательное или параллельное исполнение</h3><p>Теперь осталось ответить на вопрос, как именно можно или нужно исполнять задачи: последовательно или параллельно. Последовательное исполнение требуется в следующих случаях:</p><ul><li>важен порядок следования и исполнения задач;</li><li>задачам нужен эксклюзивный доступ к определенному ресурсу;</li><li>задачи ёмкие и их совместное исполнение вызовет нехватку ресурсов;</li><li>задачи могут мешать исполнению друг друга из-за борьбы за ресурсы.</li></ul><p>Например, шаги установки и настройки ПО; шаги CI/CD-конвейера; рендеринг изображения на GPU; интенсивные вычисления. Все эти задачи, скорее всего, придётся исполнять <b>последовательно</b>.</p><p>В остальных случаях допустимо <b>параллельное исполнение</b>. Яркой аналогией может служить одна из лучших практик в тестировании: тесты не должны оказывать влияние друг на друга, а порядок их запуска не должен иметь значения.</p><p>Последовательное исполнение обеспечивает стабильность получаемых результатов, однако приводит к низкой пропускной способности и дороговизне масштабирования (песочница обходится дороже процесса ОС). Параллельное исполнение, напротив, увеличивает пропускную способность системы и улучшает утилизацию ресурсов песочницы, но одновременно повышает вероятность нестабильных результатов. Более того, при параллельном исполнении появляется шанс перегрузить песочницу или вывести её из строя таким образом, что приведет к увеличению времени исполнения всех запущенных задач или потере результатов их работы.</p><p>На практике было замечено, что при параллельном исполнении, несмотря на увеличенную общую пропускную способность, время исполнения каждой отдельной задачи увеличивается. Если уровень параллелизма становится больше числа CPU-ядер, время исполнения начинает деградировать намного сильней.</p><h2>Управление песочницами</h2><p>Допустим, переиспользование песочниц возможно. В таком случае необходимо определить способ управления ими. Можно выделить два подхода, основанные на принципах микросервисной архитектуры, но адаптированные к специфике рассматриваемой проблемы.</p><h3>Оркестрация</h3><p>Оркестрация предполагает, что приложение совмещает две роли: оркестратор исполнения и оператор песочниц. Оркестратор координирует процесс исполнения кода: выбор подходящей песочницы, загрузка в неё входных данных, запуск удалённого процесса, получение результатов его работы и т.п. Оператор, в свою очередь, отслеживает доступные песочницы и их состояние.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/93758cab-2542-4a80-b47a-d65b04ef4f14.png" alt="Оркестрация песочниц." /><figcaption>Оркестрация песочниц.</figcaption></figure><p>Основное преимущество оркестрации в контексте решаемой проблемы — её простота и ясность. Код легко читается и сосредоточен в одном месте. Однако у этого решения есть и недостатки. Рассмотрим их в порядке от простого к сложному.</p><ul><li><i>Синхронное взаимодействие.</i> Так или иначе, для результата приложение вынуждено ожидать окончания исполнения задачи. Для продуктивного использования ресурсов приходится прибегать к техникам асинхронного программирования: пока задача исполняется, приложение будет занято полезной работой. Это малозаметный недостаток в языках со встроенной поддержкой концепции асинхронного программирования. Для упрощения работы с асинхронным кодом в Java я создал небольшую вспомогательную библиотеку <a href="https://github.com/AlexMAS/asynchronizer">asynchronizer</a>, снабдив её подробной <a href="https://github.com/AlexMAS/asynchronizer/blob/main/docs/README.ru.md">документацией</a>.</li></ul><ul><li><i>Отслеживание доступности песочниц.</i> Поскольку хотелось бы, чтобы количество песочниц менялось в зависимости от нагрузки на систему, придётся отслеживать их доступность. Это прямая обязанность оператора песочниц, которую можно выделить в отдельный discovery-сервис (например, на базе <a href="https://github.com/spring-cloud/spring-cloud-netflix">Netflix Eureka</a>), либо реализовать как часть приложения с использованием инфраструктурных механизмов (например, <a href="https://github.com/fabric8io/kubernetes-client">Kubernetes API</a>). Важно отметить, что оператор песочниц не имеет отношения к бизнес-логике приложения.</li></ul><ul><li><i>Отслеживание загруженности песочниц.</i> Оркестратор исполнения должен выбрать подходящую <a href="https://samwho.dev/load-balancing/">стратегию балансировки</a>, основанную на состоянии песочниц, предоставляемых оператором. На практике наилучшую эффективность демонстрирует алгоритм Least connections, с помощью которого можно выбирать наименее загруженные песочницы. Для этого достаточно вести учёт количества задач, исполняемых каждой песочницей. Конечно, это не серебряная пуля, а лишь частное наблюдение, поэтому в идеале нужно предусмотреть несколько стратегий балансировки и выбрать наилучшую по результатам нагрузочного тестирования.</li></ul><ul><li><i>Неопределённость результата, если нет ответа от песочницы.</i> Песочница может быть недоступна по различным причинам, включая не только проблемы с сетью, но и падения песочницы из-за ненадёжного кода. К сожалению, в общем случае эта проблема не имеет решения, так как делать повторные запуски (retries) может быть опасно. Всё, что остаётся, это использовать таймауты и откладывать неуспешную задачу на потом.</li></ul><p>Ещё один существенный минус, который стоит упомянуть, это возможный побочный эффект, возникающий при масштабировании системы и проявляющийся в виде перегрузки песочниц. Для наглядности рассмотрим конкретный пример.</p><p>Для отслеживания нагрузки на песочницы экземпляр приложения ориентируется на количество задач в каждой из доступных песочниц. Предположим, что было принято решение увеличить количество экземпляров приложения. Этот экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой). Известно, что каждая песочница может вынести максимум 4 параллельных задачи.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/623f7e7c-71d0-41da-8681-731ef43d3716.png" alt="Экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой)." /><figcaption>Экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой).</figcaption></figure><p>Добавив новый экземпляр приложения, неизвестно, сколько задач исполняет каждая песочница. Такая ситуация может произойти по разным причинам.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/7131d310-7c0d-44b8-b031-055436bd64d8.png" alt="Новый экземпляр приложения не знает, сколько задач исполняет каждая песочница." /><figcaption>Новый экземпляр приложения не знает, сколько задач исполняет каждая песочница.</figcaption></figure><p>Вполне очевидно, что новый экземпляр приложения направит очередную задачу в первую попавшуюся песочницу, чем может спровоцировать её перегрузку. В итоге результат исполнения будет испорчен или потерян из-за падения песочницы.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/c65090e5-020f-4eff-826b-566d3dc6da5c.png" alt="Очередная задача направляется в первую песочницу и провоцирует её перегрузку." /><figcaption>Очередная задача направляется в первую песочницу и провоцирует её перегрузку.</figcaption></figure><p>В качестве решения можно предложить два способа, каждый из которых уменьшает вероятность возникновения перегрузок, но не избавляет от них.</p><ul><li><i>Для контроля количества исполняемых задач в песочнице использовать распределённый счётчик</i> (например, на базе Redis). Проблема в том, что распределённый счётчик имеет латентность и на момент запуска задач может выдать устаревшее значение. Кроме того, в системе появляется еще один инфраструктурный компонент, который не несёт бизнес-пользы.</li></ul><ul><li><i>Выделить каждому экземпляру приложения эксклюзивное подмножество песочниц.</i> Подобное решение существенно усложнит deployment-скрипты и процесс масштабирования, а также снизит степень утилизации выделенных ресурсов, ведь нет никаких гарантий того, что экземпляр приложения сможет хорошо нагрузить все выделенные ему песочницы.</li></ul><p>Кстати, после доклада на TechLeadConf 2025 мне задали интересный вопрос: <i>Можно ли при балансировке нагрузки на песочницы учитывать не только количество исполняемых задач, но и процент загрузки CPU, памяти и прочих ресурсов? </i>Если у кого-то возник такой же вопрос, то отвечу, что это не имеет смысла, поскольку ситуация в песочнице может поменяться мгновенно. Полученный практический опыт и нагрузочное тестирование показали, что простой подсчёт задач работает эффективно.</p><h3>Самоорганизация</h3><p>В микросервисной архитектуре подобный подход принято называть хореографией, однако чтобы не возникало неправильных ассоциаций, предлагаю использовать термин <i>самоорганизация</i>.</p><p>Ключевой момент в архитектуре — это появление двух очередей: очередь задач на исполнение (Task Queue) и очередь результата их исполнения (Result Queue). Все поступающие задачи приложение направляет в первую очередь, а результаты — во вторую. Дополнительно появляется роль агента — микросервиса, который исполняется в рамках узла песочницы и координирует исполнение поступающих задач.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/0d449846-e767-49bd-bd50-d1c77c49cf10.png" alt="Самоорганизация песочниц." /><figcaption>Самоорганизация песочниц.</figcaption></figure><p>Основной недостаток самоорганизации — распределённый процесс обработки задач. Учитывая простоту алгоритма обработки, это не так существенно. Стоит отметить преимущества этой архитектуры.</p><ul><li><i>Максимальная изоляция ненадёжного кода.</i> Ненадёжный код, как и в случае с оркестрацией, по-прежнему работает в песочнице в рамках отдельного процесса ОС.</li></ul><ul><li><i>Скорость и стабильность взаимодействия.</i> Никаких проблем с сетью  из-за локальности взаимодействия между агентом и песочницей.</li></ul><ul><li><i>Контролируемая нагрузка на песочницы.</i> Агент, выступая в роли консюмера очереди задач, может точно контролировать степень параллелизма и выбирать новые задачи только тогда, когда он закончил обрабатывать предыдущие.</li></ul><ul><li><i>Минимум инфраструктурного кода.</i> Очереди избавляют от необходимости иметь оператор песочниц, отслеживать их состояние и осуществлять балансировку нагрузки.</li></ul><ul><li><i>Простота масштабирования.</i> Приложение и песочницы масштабируются независимо друг от друга без негативных побочных эффектов.</li></ul><h2>Запуск процесса ОС</h2><p>К запуску процесса ОС, в рамках которого будет исполняться ненадёжный код, нужно подойти с особой осторожностью. Здесь важно ответить как минимум на три вопроса.</p><ul><li><i>Как ограничить права доступа к ресурсам.</i> Самое простое решение — запуск процесса от имени пользователя с ограниченными правами (на доступ к ресурсам ОС).</li></ul><ul><li><i>Как ограничить объем используемых ресурсов.</i> Для запускаемого процесса нужно определить доступные ресурсы и возможные действия.</li></ul><ul><li><i>Как осуществлять анализ поведения и результатов исполнения.</i> Наличие и решение этой проблемы целиком и полностью зависит от специфики проекта. Здесь невозможно предложить универсального решения.</li></ul><p>Рассмотрим варианты ограничения ресурсов процесса ОС.</p><h3>Ограничение ресурсов процесса</h3><p>Ресурсы процесса могут быть ограничены на трех уровнях:</p><ul><li><i>Лимиты узла.</i> Физические ограничения машины, на которой исполняется процесс. В частном случае можно говорить об инфраструктурных лимитах, определённых для Docker/Kubernetes контейнера.</li></ul><ul><li><i>Лимиты контейнера.</i> Программные лимиты, задаваемые выбранным инструментом контейнеризации (cgroup, Docker, <a href="https://dzen.ru/a/Z8sdaQvf5w96SRes">Bubblewrap</a>, <a href="https://github.com/AlexMAS/ProcessSandbox">ProcessSandbox</a> и т.п.).</li></ul><ul><li><i>Лимиты процесса.</i> Программные лимиты, задаваемые средствами ОС. На этом уровне можно осуществлять гибкую настройку вариантов запуска и исполнения.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/d11a1ee8-1780-4ca6-b826-a09d4d95ed0d.png" alt="Уровни лимитирования ресурсов процесса." /><figcaption>Уровни лимитирования ресурсов процесса.</figcaption></figure><p>Можно использовать все три уровня лимитирования, либо какой-то определенный.</p><p>Между тем, важно отметить некоторые трудности, которые могут возникнуть при использовании инструментов контейнеризации.</p><p>Например, для использования cgroup или Docker внутри Kubernetes-контейнера нужно эскалировать привилегии контейнера, что в общем случае небезопасно в контексте исполнения ненадёжного кода. Более того, практика показала, что легковесных rootless-средств, предоставляемых ОС, вполне достаточно, чтобы снять большую часть рисков. В частности, Linux API позволяет не только лимитировать CPU и память, но и блокировать доступ к некоторым возможностям самой ОС. Например, можно наложить фильтр, который запретит вызов определённых системных функций.</p><h3>Проблемы жёсткого лимитирования</h3><p>Рассмотренные выше способы лимитирования задают жёсткие границы (hard limit), нарушение которых замедляет исполнение процесса, либо приводит к его принудительному завершению. При этом поведение наблюдаемого процесса и системы сильно варьируется в зависимости от того, какой лимит был превышен. Например, превышение по использованию CPU может привести к троттлингу (throttling), приостановке работы или принудительному завершению; превышение по использованию памяти заканчивается принудительным завершением со стороны ОС (OOM Killer) либо самостоятельным падением процесса (с ошибкой Out Of Memory).</p><p>Подобная вариативность осложняет <i>анализ поведения и результатов исполнения.</i> В этом случае можно использовать подход с программной мягкой границей (watchdog limit). Суть заключается в запуске дополнительного следящего потока (или процесса) ОС, который контролирует поведение и расход ресурсов у наблюдаемого. Как только детектируется превышение одного из лимитов, производится принудительное завершение наблюдаемого процесса, но уже не со стороны ОС, а со стороны приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/e38eb138-04f3-439f-89b5-9b810f112a69.png" alt="Программная мягкая граница (watchdog limit)." /><figcaption>Программная мягкая граница (watchdog limit).</figcaption></figure><p>Такой подход имеет несколько преимуществ.</p><ul><li><i>Точное определение причин принудительного завершения.</i> Жёсткие лимиты чуть выше мягких, благодаря чему для исполняемого кода создаётся иллюзия отсутствия каких-либо лимитов. Между тем, если лимиты всё-таки нарушаются, процесс всё равно будет завершен (либо со стороны приложения, либо гарантированно со стороны ОС). Но подобный дополнительный контроль со стороны приложения оставляет для него гораздо больше шансов понять причину принудительного завершения наблюдаемого процесса.</li></ul><ul><li><i>Возможность гибкого лимитирования ресурсов.</i> Приложение (или агент), ответственное за запуск наблюдаемого процесса, может обратиться к средствам ОС (в частности, к Linux API) и гибко настроить параметры запуска и исполнения. Как минимум, жёстко определить лимиты по CPU и памяти; наложить ограничения на объем I/O; создать запрет на вызов некоторых системных функций (например, запрет использования сетевых операций или файловой системы) и т.п.</li></ul><p>Такой подход я назвал watchdog и в целях иллюстрации реализовал его в виде .NET-библиотеки <a href="https://github.com/AlexMAS/ProcessSandbox">ProcessSandbox</a>. Помимо прочего, на странице проекта подробно рассмотрена проблематика контроля и анализа поведения процесса ОС со стороны прикладного кода.</p><p>Итоговая схема лимитирования может выглядеть так, как показано на рисунке ниже. Вместо тяжеловесных инструментов контейнеризации используется легковесный rootless-инструмент (watchdog) на базе средств ОС и только.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/2c5e74e4-125b-467d-8b27-30b005364523.png" alt="Лимитирование ресурсов процесса с помощью watchdog." /><figcaption>Лимитирование ресурсов процесса с помощью watchdog.</figcaption></figure><p>Для задач, где не нужен анализ поведения процесса и тонкая настройка лимитов, можно воспользоваться готовым инструментом — утилитой.</p><h2>Многоконтейнерные поды</h2><p>Зная, что контейнеры одного Kubernetes-пода работают на одном и том же узле, можно попытаться решить проблему нестабильности сетевого взаимодействия приложения и песочницы, разместив их контейнеры в одном поде.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/62400b6a-9c5b-4285-bff8-b0adb5ac8868.png" alt="Размещение контейнера приложения и песочницы в одном Kubernetes-поде." /><figcaption>Размещение контейнера приложения и песочницы в одном Kubernetes-поде.</figcaption></figure><p>Несмотря на всю заманчивость данной идеи, она несёт ряд недостатков.</p><ul><li><i>Плохая масштабируемость.</i> Соотношение приложение-песочница всегда один к одному. Однако не исключено, что в некоторых случаях это вполне приемлемо.</li></ul><ul><li><i>Плохая утилизация ресурсов.</i> Сможет ли приложение достаточно нагрузить песочницу, если количество песочниц будет в избытке; и наоборот, нужно ли столько же экземпляров приложения, сколько и песочниц.</li></ul><ul><li><i>Возможность перегрузки песочницы.</i> В распоряжении экземпляра приложения только одна песочница, которая может не справиться с потоком задач, обрабатываемых приложением.</li></ul><ul><li><i>Риск нарушить работоспособность приложения.</i> Выход песочницы из строя скорее всего приведет к перезапуску всего пода. Более того, если приложение и песочница обмениваются файлами через общий раздел (<a href="https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/">shared volume</a>), это может стать уязвимым местом.</li></ul><h2>Образ для песочницы</h2><p>Основные моменты, которые следует учесть при создании (Docker) образов песочниц:</p><ul><li><i>Заменить init-процесс</i> на <a href="https://github.com/krallin/tini">tini</a>, чтобы не превысить лимит по PIDs.</li></ul><ul><li><i>Создать непривилегированного пользователя,</i> ограничив ему права на доступ к ресурсам.</li></ul><ul><li><i>Регулярно сканировать версии образов</i> и пакетов на наличие уязвимостей.</li></ul><h2>Инфраструктура исполнения</h2><p>Основные моменты, которые следует учесть при настройке инфраструктуры исполнения:</p><ul><li><i>Обеспечить быстрый (пере)запуск песочниц.</i> Нужно быть готовым к тому, что песочницы будут падать. Если речь идет о Kubernetes, то улучшить время запуска может подходящая настройка <a href="https://kubernetes.io/docs/concepts/containers/images/">Image Pull Policy</a>. При этом лучше не использовать тег `latest`, а указывать конкретную версию или хэш-код образа, чтобы не тратить время на попытки определения последней версии при каждом запуске.</li></ul><ul><li><i>Установить приемлемый <a href="https://kubernetes.io/docs/concepts/policy/pid-limiting/">лимит на PIDs</a>.</i> Необходимо контролировать число активных процессов в системе. Особо вредоносный код может попытаться создать очень много дочерних процессов, поэтому при отсутствии лимита на PIDs узел быстро будет выведен из строя. Важно отметить, что лимит задаётся для пользователя, а не для запускаемого процесса. По этой причине он должен быть разумно большим.</li></ul><ul><li><i>Установить <a href="https://kubernetes.io/docs/concepts/policy/resource-quotas/">лимиты на ресурсы узла</a>.</i> В Kubernetes для каждого контейнера нужно указать, как минимум, лимиты по CPU и памяти. Значения лимитов лучше всего определить в ходе нагрузочного тестирования или путём сбора метрик приложения.</li></ul><h2>Заключение</h2><p>Как можно заметить, задача исполнения ненадёжного кода всегда решается в комплексе, начиная с анализа, продолжая разработкой и заканчивая вопросами уровня DevOps. Думаю, что многие техники и инструменты применимы и к коду самого приложения.</p><p>Я постарался показать последовательность шагов по направлению к целевой архитектуре, которая будет отвечать требованиям бизнеса и справляться с ненадёжным кодом. <i>Если вам интересна данная тематика, подписывайтесь на мой Telegram-канал Архитектоника в ИТ (@arch_and_dev). Буду рад поделиться опытом. </i></p>]]></content:encoded>
    </item>
    <item>
      <title>Песочница проектов. ВКМетр — расширенная статистика сообществ ВКонтакте</title>
      <link>https://tproger.ru/projects/sandbox-vkmeter-smm</link>
      <comments>https://tproger.ru/projects/sandbox-vkmeter-smm?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/projects/sandbox-vkmeter-smm</guid>
      <description><![CDATA[<p>Сервис VKMeter.ru даёт реал-тайм статистику по пабликам и помогает SMM-специалистам и администраторам сообществ увеличивать охват публикаций.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/projects/sandbox-vkmeter-smm">Песочница проектов. ВКМетр — расширенная статистика сообществ ВКонтакте</a>»</p>]]></description>
      <category><![CDATA[ВКонтакте]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[Рассказы о своих проектах]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Aug 2015 09:31:57 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Что такое ВКМетр?</h3><p>VKMeter.ru — сервис, предоставляющий расширенную реал-тайм статистику по вашим пабликам. Он дает дополнительные возможности для её анализа и улучшения, уже есть кейс по реальному увеличению охвата сообщества благодаря публикации постов во время, подобранное с помощью ВКМетра.</p><h3>Для кого предназначен ваш сервис и какие проблемы он решает?</h3><p>Расширенная статистика будет полезна SMMщикам и администраторам сообществ, желающим преуспеть в развитии. В первую очередь проект решает проблемы бедности стандартной статистики ВКонтакте: к сожалению, в ней можно увидеть только несколько показателей по дням. У нас же намного больше функций, и детализация не по дням, а по минутам!</p><h3>Что же он умеет и чем полезен?</h3><p>Кроме поминутных графиков основных показателей на протяжении недели и месяца, у нас есть график количества подписчиков онлайн на протяжении дня, помогающий выбрать лучшее время для публикации постов, график прироста, позволяющий оценить качество того или иного поста. Например, если после поста многие отписались, то пост плохой, если, наоборот, много подписок, то пост хороший. Таким образом можно отсеивать посты, которые плохо влияют на сообщество, и улучшать его показатели.</p><p>И это ещё не всё: ВКМетр имеет много фич, но скоро будет ещё больше. Например, на днях мы планируем добавить функцию сравнения произвольных дней. Для самых любознательных там даже спрятано несколько пасхалок, слабо найти их все? ?</p><h3>Долго кодили? Какие технологии использовали? Какой хостинг выбрали? Как собираетесь раскручивать?</h3><p>Разработка первой версии заняла около 2х недель, большая часть которых, как и полагается, ушла на игру в Risen и распитие пива. По большей части у нас всё стандартно: PHP на бекенде, немного JS и Bootstrap на фронтенде. В качестве библиотеки для рендеринга графиков было решено выбрать flot.js — она, конечно, старая, но имеет большое комьюнити, много плагинов, функций и поддержку ишака старых браузеров.</p><p>В качестве хостинга решено было выбрать Rixis Cloud Hosting из-за его дешевизны (от 15 рублей в месяц), производительности и, самое главное, отзывчивой технической поддержки, которая всегда идет навстречу.</p><p>Из-за активной фазы разработки до серьезной раскрутки руки пока не дошли, но паблик <a href="https://vk.com/smmpub">SMMщики </a> c удовольствием бесплатно разместил о нас несколько публикаций, что дало нам первых пользователей.</p><h3>Я не администратор сообщества, мне не нужны все эти ваши модные штуки и паблики ВКонтакте, мне не интересен ваш сервис. Что мне делать?</h3>]]></content:encoded>
    </item>
  </channel>
</rss>