Разработка мультиагентной песочницы: от прототипа на Python до проблем синхронизации
На Хабре появился пет-проект, который наглядно показывает, как у джуна за ночь рождается и умирает мотивация.

Симулятор жизни на Python + TypeScript + HTML5 Canvas. Проектирование среды и базовой механики агентов
Автор собрал мультиагентную песочницу эволюции на стыке Python, TypeScript и HTML5 Canvas — агенты с простейшими нейросетями выживают по законам жёсткого отбора. История ценна не результатом (его пока нет), а классической цепочкой: прототип на коленке, торжественный перенос бэка на Python и первая синхронизационная яма на 2 Гц.
Стек и архитектурное прозрение
Началось всё с React-странички, по которой бегал «агент» и натыкался на «кустик». Это даже не прототип — это smoke test: рендерится, значит существую. Дальше пришло стандартное прозрение: для нормальной симуляции браузерный JS не тянет, и бэкенд уехал на Python. Выбор языка по учебнику — прагматичный костыль: если источник знаний на Python, не надо параллельно ломать мозг о синтаксисе.
Агент и куст с едой оформлены в классы. Сервер шлёт данные на фронт с частотой 2 Гц — два тика в секунду. Для канвы, где каждый кадр идёт через requestAnimationFrame, это уже красный флаг. Но понимаешь это только потом, обычно ночью.
Крэш: синхронизация и соблазн всё бросить
Бэк отдаёт координаты два раза в секунду, фронт честно их рисует — агент скачет по полю рывками. Автор полез чинить интерполяцией: фронт на основе позиции и скорости предсказывает траекторию и дорисовывает промежуточные точки. Классика жанра. Классика и провала: коэффициенты крутились долго, дёрганность никуда не ушла.
Тут малодушная мысль забросить проект — это, кстати, единственная здоровая реакция. Когда синхронизация ломается на ровном месте, у джуна в голове щёлкают сразу три тревоги: «я тупой», «архитектура кривая», «надо переписать». Обычно верно второе. Переписывать пока не надо — надо чинить протокол.
Что проверить, прежде чем повторять путь
Если хочется собрать что-то похожее и не лечь в ту же яму:
- Бэк отдаёт не «позицию сейчас», а траекторию: массив точек с таймстемпами. Клиент сам интерполирует между ними. Частота тика перестаёт быть параметром сети и становится параметром рендера.
- Если в кадре тысячи агентов — WebSocket + серверный тик на 30–60 Гц с бинарным протоколом. JSON на таких объёмах — костыль, который ляжет первым.
- Интерполяция — по времени:
pos = lerp(a, b, (now - t_a) / (t_b - t_a)). Коэффициенты, выдуманные в четыре утра, не работают никогда. - Бэкапы:
git remote add origin …— и каждый вечерgit push. Джун, забросивший проект из-за синхронизации, через полгода не вспомнит, в какой ветке остался рабочий прототип.
Пет-проекты дохнут не от сложности ИИ, а от двух вещей — дёрганной картинки и отсутствия git remote. Сначала фикс удалёнки, потом уже нейросети.