RS Tandem — Observer
RS School: Connecting people, growing together, having fun
Issue #6
Финальная неделя. Дедлайн прошёл, код заморожен, дневники дописаны. Шесть недель — от первого коммита до работающих проектов. В этом выпуске: песочница для исполнения чужого кода в браузере, Supabase который тайно стирал прогресс игры, и анимация, которая знает когда промолчать.
1 апреля 2026 г. в 0934 teams
Герой недели

Песочница для храбрых, или Как elrouss построил тюрьму для чужого кода

Большинство студентов, столкнувшись с задачей «запустить пользовательский код в браузере», берут `new Function` и идут дальше. elrouss из JSGods остановился и задал вопрос, который отличает инженера от кодера: «А что, если этот код — враждебный?» Начал с `iframe` + CSP — классика песочниц. Поймал гонки `postMessage` и проблемы с Angular dev server, потерял время — но вынес чёткое понимание границ подхода. Переключился на QuickJS: WASM-интерпретатор, отдельная JS-машина внутри Web Worker. «Хотелось хотя бы осознанный компромисс, — пишет он, — код крутится в отдельной JS-машине, а не в том же контексте, что и приложение.» Дальше — отладка криптовой ошибки `magic word wasm`, когда Emscripten в dev-режиме тянул HTML вместо бинарника. Решение: вынести `.wasm` в assets и задать путь через `newVariant`. Потом — протокол `builtinFns`, чтобы протаскивать колбэки через JSON-границу без дублирования строк. И наконец — честная фиксация: «Абсолютной безопасности на фронте нет. DoS по CPU остаётся — я оставил прерывание по дедлайну.» Результат — полностью изолированный code runner с документированной моделью угроз. В студенческом проекте. На шестой неделе.
Highlights
  • elrouss: два подхода к песочнице (iframe+CSP → QuickJS WASM), выбор с обоснованием
  • Web Worker + QuickJS-emscripten: пользовательский код не видит DOM, fetch, контекст приложения
  • Протокол builtinFns для сериализации колбэков через JSON-границу воркера
  • Осознанный компромисс: deadline-based terminate как защита от DoS при невозможности полной изоляции
Грабли недели

Амнезия по расписанию: как Supabase тайно управлял игрой

isaluk из Auto-Team 4 собрала полноценный игровой цикл — квиз с таймером, анимациями, вложенными маршрутами. Всё работало, пока тестировщик не переключился на соседнюю вкладку. При возврате квиз молча сбрасывался на первый вопрос. Прогресс — испарялся. Корень проблемы оказался неочевидным: Supabase под капотом подписывается на событие фокуса окна. При возврате на вкладку он обновляет сессию и стреляет событием в Store. А Store, не разбираясь, вызывал полную перерисовку — уничтожая DOM вместе с состоянием квиза. Решение: сравнивать маршруты через JSON.stringify перед перерисовкой. Если роут не изменился — блокировать рендер. Просто, но до диагноза пришлось докопаться до внутренностей Supabase. Параллельно выяснилось, что pre-commit хук Husky честно запускал lint-staged, но в package.json не было указано, какие файлы проверять. Хук работал вхолостую, пропуская грязный код в репозиторий. Урок: сторонние SDK живут своей жизнью. Если ваш Store реагирует на внешние события — фильтруйте, что именно изменилось, прежде чем перерисовывать мир.
Highlights
  • Supabase отслеживает фокус окна и обновляет сессию при возврате на вкладку — это вызывало полный ре-рендер и сброс прогресса квиза
Кейс недели

Анимация, которая знает, когда промолчать

Когда dukhd из JSGods подключила Angular View Transitions API для анимации переходов между страницами, команда единогласно отвергла горизонтальный слайд в пользу плавного появления контента сверху — fade-from-top. Решение казалось чисто эстетическим, но за ним скрывалась архитектурная ловушка. На главной странице уже работала якорная навигация с плавным скроллом через ScrollSpyService, который dukhd написала неделями ранее. И вот проблема: View Transitions API не различает переход на другую страницу и клик по anchor-ссылке внутри той же страницы. Каждый клик по навигации лендинга запускал и скролл, и анимацию перехода одновременно — визуальная каша. Решение нашлось в skipTransition() у провайдера withViewTransitions. Dukhd написала логику, которая определяет тип навигации: если это anchor — анимация пропускается, если переход между роутами — воспроизводится. Элегантно, но с побочным эффектом: каждый вызов skipTransition() генерировал AbortError в консоли. Ошибка не критичная, но при четырёх anchor-ссылках консоль превращалась в поток красных строк. После долгих экспериментов dukhd приняла прагматичное решение: фильтрация ошибок по сигнатуре AbortError + skipped. Не самое элегантное, но рабочее — и честно задокументированное в дневнике. Главный урок: анимации — это не только CSS. Это архитектурное решение, которое должно учитывать все типы навигации в приложении. А умение остановиться на «работает, хоть и не идеально» вместо бесконечной полировки — навык не менее ценный, чем сама анимация.
dukhdJSGodsFade-from-top анимация через View Transitions API с кастомной логикой skipTransition() для разделения роутерных переходов и anchor-скролла
Tandi Recognition

Те, кого Tandi заметила за 6 недель

Жюри на защитах оценивает результат. Эта рубрика — про путь. 18 человек, чьи дневники стали примером: глубокая рефлексия, стабильное усилие, мужество честности. Ни один из них не попал в основные рубрики — но Tandi видела их каждую неделю.
tosigaevaTuple TroubleTandi заметила
Раз за разом превращала каждую задачу в архитектурный вызов: CI/CD за один день, виджетный движок на Strategy Pattern, валидация через Server Actions — и каждая следующая итерация оказывалась глубже предыдущей, словно ей мало просто решить задачу, нужно обязательно переосмыслить подход.
coicoinStrict ModeTandi заметила
Методично воссоздал ядро React Router с нуля на чистом TypeScript — HistoryAPI, параметры, хуки навигации, хранение состояния — проводя за кодом по восемь часов подряд, пока каждый edge case не был закрыт. Редкое упорство в стремлении понять механику, а не просто использовать готовое.
ngInitGang of FourTandi заметила
Взял на себя всё, что обычно никто не хочет делать: Figma-макеты до двух ночи, перенос задач из Trello в GitHub Issues вручную, обучающее видео по MUI для команды, диаграммы GitFlow — и параллельно собрал многотемный Bug Hunter виджет на десять часов чистой работы.
SabinaBatrakovaDev JourneyTandi заметила
С нулевым опытом в CI/CD за один вечер прошла путь от чтения документации до зелёного пайплайна: разобралась в GitHub Actions, отладила два последовательных сбоя сборки, починила конфигурацию TypeScript и подключила Netlify — с энергией и рефлексией, которые чувствуются в каждой записи дневника.
sobselenaOrangeCatsTandi заметила
Провела ночь за проектированием полной UX-архитектуры — маршруты, сценарии авторизации, макеты — перебрала несколько вариантов дизайна, задеплоила рабочий прототип и фактически задала продуктовое видение, которое команда приняла за основу.
karinavdUnexpected CaseTandi заметила
В одиночку несла визуальное направление всей команды: полный UI в Figma на пять страниц, тёмная и светлая темы, десять часов дизайна в первый же день — и это от человека на треке разработки, а не дизайна. Параллельно подняла тестовую инфраструктуру на Vitest.
ViktorElenichGrowLabTandi заметила
Последовательно выстраивал архитектуру бэкенда как инженерную дисциплину: Data Contracts First, чтобы не блокировать команду, разделение сервисов ради чистого SoC, осознанный отказ от SDK в пользу нативного fetch — каждое решение в дневнике обосновано принципом, а не удобством.
Nck1969JSGodsTandi заметила
Спроектировал CI/CD-пайплайн с продуманной последовательностью этапов — линтинг до тестов, тесты до сборки — чтобы не тратить ресурсы раннера впустую. Взял полную ответственность за DevOps-инфраструктуру команды: фронт на gh-pages, бэкенд на Railway, защита веток, токены.
Yuriyli111 Blind KittensTandi заметила
Тянет на себе весь технический фундамент проекта: .NET API, Docker с нуля, SQLite, CI/CD, конфигурация линтеров — и за один сеанс способен закрыть шесть разных тем от кроссплатформенных багов до JWT-авторизации, погружаясь в каждую с одинаковой основательностью.
NickKoolasyncmindTandi заметила
Собирал полноценные фичи с первого касания фреймворка: лендинг со слайдером и адаптивом параллельно с изучением React, затем Library page с пагинацией, фильтрами, i18n и миграцией данных на Firebase за четыре дня — масштаб самостоятельной работы растёт от выпуска к выпуску.
t-gladkayaSkillsZen teamСтабильно замечен
Замечен в 5 выпусках (герой, грабли, кейс, инсайт)
KarpovDmitriyДжунгли зовут!Стабильно замечен
Замечен в 5 выпусках (герой, кейс, инсайт)
mikhalenkadaniilJSGodsСтабильно замечен
Замечен в 5 выпусках (герой, инсайт, грабли)
imagineaprilАлекс и его друзьяСтабильно замечен
Замечен в 5 выпусках (грабли, инсайт, герой)
SidoryakaSergeySAA CatСтабильно замечен
Замечен в 5 выпусках (грабли, кейс, герой)
AnnStarrySky111 Blind KittensЧестный голос
Написала «я обычно не люблю писать эмоции» — и тут же сделала именно это. Призналась в усталости и в том, что не успевает, прямо в дневнике, который читают другие. Это редкое мужество — не прятаться за техническими отчётами, а показать себя настоящую. Отдельно ценно: честное осознание своей роли пришло не в начале, а в самом конце — и она не побоялась это зафиксировать.
BerserkBatTypocalypseЧестный голос
Открыто написал, что чувствует себя медленным и неэффективным, что не видит прогресса. Не спрятал растерянность за списком задач — признался, что у него нет ментальной модели проекта и что переход к новым инструментам даётся тяжело. В мире, где все стараются выглядеть уверенно, такая откровенность — акт мужества.
artkoro94Team42Честный голос
Не побоялся описать стресс от командной работы и то, как завышенные внутренние стандарты давят, когда пишешь код не только для себя. Честно зафиксировал свои ошибки и их последствия, не пытаясь приуменьшить масштаб. Дневник читается как разговор с самим собой — без фильтров и без попытки произвести впечатление.
Teams
23ok
10caution
1alert
/
ngKittyDebug
ok
RainbowUnicorn
ok
RSSAgents
caution
Team42
ok
Джунгли зовут!
ok
GrowLab
caution
Strict Mode
ok
Дрим Тим
caution
JSGods
ok
Алекс и его друзья
ok
VueJS Tandem
ok
Tuple Trouble
ok
asyncmind
ok
Nova
ok
DevCraft
ok
Outstanding Alex And Smeshariki
ok
Gang of Four
ok
Devtones
ok
404 Skill Not Found
caution
DevBand
ok
JustBuildIt
ok
Auto-Team 3
ok
Auto-Team 4
caution
Auto-Team 5
caution
SAA Cat
ok
Auto-Team 7
ok
Т-8
ok
Auto-Team 9
caution
SkillsZen team
caution
Unexpected Case
caution
TetraTeam
caution
111 Blind Kittens
ok
CodePain
ok
Tandem Trauma Team
alert
Над выпуском работали: Статист · Скаут · Жюри · Перо · Корректор · Курьер