Классно!
Социальная сеть учебного класса для родителей, учеников и учителей. Начиналась как REST API для Академии ТОП, а выросла в SaaS-платформу с приложениями в трёх магазинах.
Выполнили для клиента
Задача
Что было до нас
У Академии ТОП большая клиентская база, и значительная её часть — родители с детьми. Детям важны знания, удовольствие от процесса и эмоциональное подкрепление. Родителям важно понимать, насколько хорошо и с пользой дети проводят время на занятиях.
Сервис для отслеживания учебного процесса у Академии уже был. Но всё, что касалось эмоциональной обратной связи и социальной жизни класса, в него не помещалось и держалось на переписке в мессенджерах или на разговорах с учителем лично.
Фотографии, видеозаписи, рассказы об активностях, анонсы мероприятий, достижения — всё это оставалось за пределами учебного процесса и терялось. А хотелось, чтобы оно было доступно родителям и ученикам всегда. Хотелось родителям — и хотелось руководству Академии.
Со временем стало понятно, что такой сервис нужен не только Академии. Поэтому решили строить его отдельно от неё — как SaaS для любого учебного заведения.
Как устроена платформа
Вся система вращается вокруг социальной жизни внутри учебного класса. Классы собираются в Школы, Школы — в Организации: Организация → Школа → Класс → группы и ученики. Эта иерархия не просто группирует данные — на ней держится мультиарендность SaaS и изоляция данных между учебными заведениями.
- Мультиарендность. Разные учебные заведения работают в одной системе и не видят друг друга.
- Три роли. Учитель управляет классом, публикует контент и разбирает заявки. Родитель наблюдает за процессом и подключается к кабинетам своих детей. Студент участвует в жизни класса.
- Архив класса. Учебный год закончился — класс уходит в архив и переходит в режим только для чтения. История сохраняется целиком и не мешает работе с актуальными классами.
- Интернационализация. Проработана с запасом на выход за пределы России: русский и английский, язык подхватывается из профиля пользователя.
-
Лента постов
Учитель выкладывает фотографии и новости из жизни класса почти каждый день. Родители получают push-уведомление и идут смотреть, скачивать, обсуждать, ставить лайки. Учитель видит статусы прочтения — лента становится каналом гарантированной доставки, а не фотоальбомом.
-
Мероприятия
Академия проводит много мероприятий для учеников и родителей. Планирование встроено в систему и связано с лентой: по мере приближения события участники класса получают напоминания.
-
Чаты
Личные и групповые чаты внутри класса, плюс отдельный чат с ботом Академии для автоматических оповещений. Текст, документы, фотографии, видео, emoji, форматирование сообщений, push-уведомления в PWA и мобильном приложении.
-
Результаты и геймификация
Учитель присваивает ученику персональные результаты — положительные и не очень. Каждый меняет внутренний баланс: вовремя сданное задание и помощь сверстникам начисляют, опоздания и хулиганство списывают. История видна всем ролям, родители получают push в реальном времени. Так складывается внутренняя валюта, которую можно будет тратить.
-
Возрастные группы
Родитель — главная целевая аудитория, но не обязательный участник. Платформой могут пользоваться ученики и без родителей, при этом все механики сохраняются. Это открывает дорогу к использованию сервиса учениками любого возраста.
-
Приглашения и заявки
Три сценария подключения родителя к кабинету ребёнка: персональная ссылка по e-mail или SMS с автоматическим подключением; групповая ссылка на класс с разбором заявки учителем; самостоятельная заявка по двум приватным факторам — например, номеру договора и контактному лицу из него — с автоматической обработкой при совпадении.
-
Интеграции
На уровне Организации создаётся сервисный аккаунт — точка входа для внешней системы с правами на все сущности организации. Возможность задействована сразу: интеграция с LMS и несколько каналов доставки маркетинговых материалов через чаты и ленту.
-
Роли и приватность
Платформа работает с чувствительными данными, в том числе детскими. Права проверяются на стороне ABAC для каждого действия, а не держатся на том, что лишнюю кнопку просто не показали в интерфейсе. Связки «родитель — ребёнок» и видимость данных между учебными заведениями закрыты по умолчанию.
-
Безопасность и модерация
Это социальная сеть с участием детей, поэтому пожаловаться можно на любой контент. Есть страница с правилами публикации, жалоба рассматривается в течение 24 часов с возможностью удалить материал или ограничить доступ. Эта подсистема оказалась обязательным условием для прохождения модерации в магазинах приложений.
-
Персонализация и доступность
Более 20 готовых тем оформления — от строгой «Деловой» до яркой «Детской». Отдельно проработана доступность: высококонтрастная тема и шрифт, рассчитанный на людей с дислексией. Одна платформа одинаково удобна взрослому, ребёнку и человеку с особыми потребностями.
Как менялся объём работ
Мы начинали только с бэкенда
- Только бэкенд. На нас возложили RESTful API и жёсткие требования к нему: строгая база данных со связями, строгая типизация, строгий контракт API, хорошее покрытие тестами, современные процессы и документация. Три фронтенда — web, iOS, Android — должны были делать отдельные команды из других компаний.
- Работа встала. Не все подрядчики оказались одинаково надёжны. Коллеги из других компаний не оправдали ожиданий, и работа по фронтендам остановилась.
- Фронтенд переходит к нам. Заказчик предложил взяться за фронтенд нам. Обсудили ситуацию и согласились.
- Объём работ пришлось сокращать. Время уже было потрачено, поэтому вместо трёх нативных приложений сделали web-версию, PWA и WebView-приложения для iOS и Android.
- Дизайн-система вместо дизайнера. На дизайн времени тоже не оставалось. Предложили взять готовую дизайн-систему Ant Design — чтобы потом можно было влиять на интерфейс в разумных пределах без полной переработки. Заказчика это устроило.
- Блокировки мессенджеров. Ближе к концу проекта начались блокировки мессенджеров. Это подтолкнуло к ещё одному расширению: механизм чатов делали по остаточному принципу, но в первый релиз он всё-таки вошёл.
В итоге сервис сделан end-to-end: от идеи до интерфейса и пользовательского опыта, и всё это руками команды разработчиков.
Приложение в кармане
Заказчик сразу решил, что пользователя нужно уметь возвращать в приложение. Надёжнее всего это делают push-уведомления, а удобнее всего они приходят на телефон. Значит, нужны мобильные приложения.
- PWA и WebPush. Начали с самого быстрого варианта. Запустили, опробовали на живых пользователях — подход себя оправдал.
- Нативный WebView. Следом сделали нативное приложение с нативными push-уведомлениями под каждую платформу.
- Три магазина. Приложение опубликовано в AppStore, Google Play и RuStore.
- Автоматическая сборка. Сборка и публикация релизов автоматизированы полностью, включая выкладку в магазины.
- Обновления по воздуху. Over the Air обновления позволяют выпускать большинство изменений интерфейса, не дожидаясь ревью магазинов.
Редизайн
Весь интерфейс переписан за три недели
Когда основная часть проекта была готова, в неё пустили пользователей Академии. Обратная связь в целом оказалась положительной: родители наконец получили сервис, которого им не хватало. Но пришла и критика, и упиралась она в интерфейс. Сказалась работа без дизайнера и в темпе стартапа — этот компромисс был осознанным, мы шли на него, чтобы быстрее выпустить и проверить MVP.
Наступила эпоха активного использования нейросетей. Дизайнера у нас по-прежнему не было, но мы решили поэкспериментировать и сделать весь интерфейс силами разработчика с нейросетью в помощниках. Перепробовали несколько подходов и в итоге переписали фронтенд с нуля: SPA на Vite, архитектура Feature-Sliced Design, собственная дизайн-система поверх Tailwind. За три недели интерфейс переделали полностью, и равнодушным не остался никто. Попутно удалось реализовать более смелые задумки, которые до этого только стояли в планах.
Скорость не означала вседозволенности. Чтобы интерфейс, написанный в связке «разработчик и нейросеть», не превратился в неподдерживаемый хаос, под него заранее заложили строгий инженерный каркас:
- Feature-Sliced Design: границы слоёв app → pages → widgets → features → entities → shared контролируются линтером автоматически, а не на словах.
- Дизайн-система на CSS-токенах — цвета, отступы, тени и шрифты вынесены в токены, поэтому вся система полностью темизируется.
- Storybook как живая витрина компонентов.
- Сквозная типобезопасность: клиент API генерируется из OpenAPI-спецификации, типы тянутся от схемы базы данных до React-компонента.
- Более 2000 автотестов интерфейса как страховка при быстрой генерации кода.
Именно эта дисциплина и позволила доверить нейросети рутину генерации интерфейса, не потеряв в качестве и поддерживаемости.
-
Более 4000 интеграционных тестов и свыше 500 модульных на phpunit. Все интеграционные работают с настоящей базой данных, а не с заглушками.
4000+ тестов API
-
Модульные и e2e тесты на vitest testing library, плюс браузерные тесты на Playwright.
2000+ тестов интерфейса
-
Столько занимает вся проверка в GitLab CI — и это на очень дешёвом железе десятилетней давности. Покрытие около 80%, замер на каждом запуске.
7 минут на полный прогон
-
AppStore, Google Play и RuStore. Сборка и публикация релизов автоматизированы полностью, обновления интерфейса уходят по воздуху.
3 магазина приложений
-
За это время интерфейс переписали с нуля на новом стеке — силами разработчика и нейросети, без дизайнера.
3 недели на редизайн
-
От строгой «Деловой» до яркой «Детской», плюс высококонтрастная тема и шрифт для людей с дислексией.
20+ тем оформления
-
Бэкенд
REST API на ApiPlatform 3 поверх Symfony, PHP 8.3. MySQL 8.4, Redis для кеша, RabbitMQ для очередей, Centrifugo для Websocket, FrankenPHP на основе Caddy. Полностью изолированные окружения разработки, тестов и production. Надстройка над Symfony Messenger для доменных событий.
-
Фронтенд
SPA на React 19 и TypeScript 5.9 в строгом режиме, сборка на Vite 7, pnpm. Feature-Sliced Design, Tailwind CSS 4 и своя дизайн-система на токенах. TanStack Query и Zustand, react-hook-form и Zod. Клиент API из OpenAPI-спецификации. Capacitor, Workbox и Web Push, Firebase Cloud Messaging, Capgo, i18next, Amplitude, Sentry.
-
Инфраструктура
Docker во всех окружениях, полностью автоматизированное развёртывание включая публикацию мобильных приложений. Яндекс Облако: Compute, Managed MySQL, Object Storage. DDoS-Guard. Grafana Alloy, Grafana, Loki, Prometheus и Percona Monitoring and Management. Инфраструктура разработки с фикстурами и подменой почты и файлового хранилища.
Процесс
Разработка в эпоху AI-агентов
Редизайн силами разработчика и нейросети — лишь самая заметная верхушка. Вся работа над проектом выстроена под плотное взаимодействие с AI-агентами.
- Инструкции в каждом репозитории. Агент получает правила работы вместе с кодом и не додумывает их сам.
- Документация как код. Продуктовая документация вынесена в отдельный репозиторий с каталогом возможностей и автоматической валидацией в CI.
- Строгие quality-gates. Линтеры, типизация, тесты, поиск мёртвого кода и копипасты прогоняются и в pre-commit хуках, и в пайплайне. Самый строгий режим phpstan на бэкенде, строгий TypeScript, knip и jscpd на фронтенде, deptrac и eslint для контроля границ слоёв.
Такой каркас превращает нейросеть из генератора непредсказуемого кода в полноценного участника команды: агент работает в заданных рамках, а нарушения ловятся автоматикой ещё до ревью. Это, пожалуй, и есть главный методологический вывод проекта.
Команда и сложности
Со стороны Maximaster над проектом в разное время работали один тимлид, два backend-разработчика и три frontend-разработчика. Со стороны заказчика проект вели четыре продакт-менеджера, последовательно сменявших друг друга.
Жаль, что фронтенд не удалось запустить параллельно с бэкендом с самого старта. Но это неудачное для заказчика стечение обстоятельств обернулось для нас опытом в интересных технологиях — и успешным результатом для проекта.
Не обошлось и без сложностей.
- Дизайн. Не каждый разработчик умеет мыслить категориями дизайна, и первая версия интерфейса получилась чересчур инженерной. Заказчик это понимал — риск был осознанным, и шли на него все вместе. Справились после MVP с помощью нейросетей.
- ApiPlatform 3. Технология, которую мы применяли впервые. Рассчитывали быстрее получить строгое REST API. На практике фреймворк даже в третьей итерации оказался сыроват. Адаптировались быстро, но экономия на нём себя не оправдала.
- Магазины приложений. Ждали, что тяжелее всего будет с AppStore. На деле больше всего замечаний пришло от Google Play, а проще всего оказалось с RuStore. Отдельным открытием стали требования к пользовательскому контенту: для детской аудитории магазины требуют работающий механизм жалоб, правила публикации и реакцию модерации в срок. Эту подсистему пришлось закладывать осознанно — она во многом и определила гладкость прохождения ревью.