Перейти к содержимому

Neva. От компьютерного клуба до киберспортивной платформы

Карточка кейса Neva
  • Веб-сервис
  • Веб-разработка
  • Legacy
  • Киберспорт
  • Рефакторинг

Neva начиналась с практической задачи: проводить собственные киберспортивные турниры и не собирать процесс вручную из таблиц, чатов и отдельных игровых сервисов.

Но полноценный турнир — это не только список участников и финальный матч. Необходимо зарегистрировать игроков, собрать команды, сформировать сетку, назначить расписание, создать игровые лобби, зафиксировать результаты и сохранить статистику.

Так внутренняя система компьютерного клуба постепенно превратилась в самостоятельную платформу для игроков, команд и организаторов.

Проект в фактах

  • Что сделали
    Код-ревью, рефакторинг, продуктовая и дизайн-супервизия, разработка новых модулей
  • Продукт
    Веб-платформа для игроков, команд и организаторов киберспортивных турниров

Проект уже существовал. Управляемость — не совсем

Мы подключились не к чистому листу. У Neva уже были кодовая база, дизайн и часть функциональности.

Полностью переписывать продукт означало бы потерять время и работающие наработки. Продолжать разработку без предварительного разбора — накапливать новые проблемы поверх старых.

Поэтому начали с технического и продуктового погружения:

  • провели код-ревью существующей системы;
  • разобрали взаимосвязи между разделами;
  • определили участки для рефакторинга;
  • помогли уточнить пользовательские сценарии;
  • проверяли дизайн-решения с точки зрения логики и реализации;
  • после этого приступили к разработке новых модулей.

Цель

Создать платформу, в которой игроки, капитаны команд и организаторы смогут пройти весь путь турнира — от регистрации до результатов и статистики.

Задача

Стабилизировать существующую разработку, привести кодовую базу в состояние, пригодное для дальнейшего развития, и реализовать ключевые продуктовые сценарии: команды, профили, турнирную сетку, расписание, общение и связанные состояния матчей.

Не авторы интерфейса, но участники продуктового решения

Визуальный дизайн платформы разрабатывала команда клиента. Круто выступали в роли технических и продуктовых супервайзеров.

Мы помогали проверять:

  • соответствует ли экран реальному сценарию турнира;
  • учтены ли роли игрока, капитана и организатора;
  • что происходит в пустых, промежуточных и ошибочных состояниях;
  • как меняется интерфейс до, во время и после матча;
  • можно ли реализовать предложенную механику без конфликтов с остальной системой;
  • как сценарий будет работать на разных устройствах.

Так дизайн оставался работой клиентской команды, а мы помогали сделать его логичным, реализуемым и связанным с настоящими правилами киберспорта.

Страница матча со счётом и составами
Страница статистики игрока

Не снести старое, а вернуть продукту возможность расти

Legacy-проект нельзя безопасно развивать, пока команда не понимает, какие части системы зависят друг от друга.

После код-ревью мы провели рефакторинг существующей базы и подготовили её к развитию новых разделов. Работа шла параллельно с продуктовым разбором: изменение одного сценария могло повлиять на команды, матчи, сетку, расписание и права пользователей.

Ключевой принцип — не переписывать всё ради переписывания, а постепенно отделять рабочие части системы от тех, которые мешали дальнейшей разработке.

Главная страница турнира
Страница команды с баннером
Страница трансляции матча
Профиль игрока с прогрессом

От первого профиля до последнего раунда

Платформа объединяет несколько ролей и десятки связанных состояний. Если один шаг работает неправильно, турнир останавливается целиком.

Поэтому модули нельзя было проектировать и разрабатывать изолированно.

  1. Игрок регистрируется и связывает профиль с игровой учётной записью
  2. Создаёт команду или присоединяется к существующей
  3. Выбирает турнир по дисциплине, региону и формату
  4. Команда подтверждает участие
  5. Система формирует сетку и расписание
  6. Участники переходят в лобби и готовят матч
  7. После игры обновляются результаты и статистика
  8. История остаётся в профилях игроков и команд

Одна страница — весь контекст соревнования

Страница турнира объединяет информацию, которая нужна участникам на разных этапах:

  • параметры и статус турнира;
  • организатора, регион и формат;
  • регистрацию и подтверждение участия;
  • список команд;
  • турнирную сетку;
  • расписание матчей;
  • регламент;
  • общий чат.

Предстоящие, активные и завершённые турниры получили разные состояния. Пользователь видит не только информацию о соревновании, но и своё следующее действие.

Страница турнира с регистрацией и сеткой
Карточки турниров по дисциплинам
Список команд турнира
Турнирная сетка с результатами

Уже начали сложный продукт и застряли в легаси?

Разберём кодовую базу, восстановим логику продукта и поможем продолжить разработку без бессмысленного переписывания всего проекта.

Математика турнира, понятная человеку

Сетка должна учитывать количество команд, формат соревнования, результаты матчей и переход участников между раундами.

Мы разработали отображение пар, этапов и результатов так, чтобы пользователь мог быстро понять:

  • кто с кем играет;
  • какой раунд идёт сейчас;
  • кто уже прошёл дальше;
  • какой матч завершён;
  • где ещё не определены участники;
  • когда состоится следующая игра.

Сетка связана со страницами матчей и расписанием: результат одной встречи влияет на последующие пары и дальнейшее движение турнира.

Турнирная сетка целиком
Расписание матчей списком

Когда матч нельзя сыграть вовремя

Расписание киберспортивного турнира меняется: команды договариваются о переносах, капитаны отправляют заявки, а организатор должен контролировать доступные интервалы.

Мы разработали календарную систему с дневным и недельным представлением, временными слотами и разными ролями пользователей.

Сценарий переноса включает:

  1. Выбор матча.
  2. Предложение новой даты и времени.
  3. Отправку заявки другой стороне.
  4. Подтверждение или отклонение капитаном либо организатором.
  5. Обновление расписания.
  6. Системные уведомления для участников.
Календарь расписания турнира
Переписка капитанов о переносе матча
Выбор новой даты и времени матча
Карточка матча с заявкой на перенос

CS2 и Dota 2 требуют разной логики

У разных дисциплин отличаются правила, данные и подготовка к матчу. Поэтому одну универсальную страницу нельзя было просто наполнить разными картинками.

CS2

В матчах учитываются карты, стороны T и CT, формат серии, процесс выбора и исключения карт, результаты раундов, статистика и демо-записи.

Dota 2

Для Dota 2 важны стороны Dire и Radiant, очередность выбора, герои, стадии pick/ban и собственный набор статистических показателей.

При этом обе дисциплины должны оставаться частями одной платформы с общей логикой статусов, команд и турнирных переходов.

Лобби матча CS2 с обратным отсчётом
Лобби матча Dota 2 с выбором сторон

Матч начинается до подключения к серверу

Лобби координирует подготовку команд к игре. Здесь участники подтверждают готовность, определяют очередность действий, выбирают карты и стороны, получают параметры сервера и переходят к матчу.

В макетах предусмотрены:

  • составы обеих команд;
  • капитаны и роли участников;
  • таймеры и обратный отсчёт;
  • coin flip;
  • выбор первой или второй очереди;
  • T/CT для CS2;
  • Dire/Radiant для Dota 2;
  • выбор и исключение карт;
  • название и пароль сервера;
  • состояния загрузки и ожидания.

Это один из наиболее насыщенных логикой разделов: действия одной команды определяют доступные действия другой.

Подготовка команд к матчу в лобби

Игрок — не строка в турнирной таблице

Мы разработали разделы, в которых пользователь существует и за пределами конкретного матча.

Профиль игрока

В профиле можно показать игровую историю, последние матчи, публикации, медиа, друзей и связанные игровые аккаунты.

Профиль игрока и история матчей

Страница команды

Командный раздел объединяет состав, игроков, тренеров, менеджеров, спонсоров, историю, активные и прошедшие турниры, а также статистику по дисциплинам.

Страница команды с составом и статистикой

Общение

В платформе предусмотрены личные и групповые чаты, заявки в друзья, сообщения команды и инструменты управления участниками беседы.

Личные и групповые чаты платформы

Круто подключились к существующей платформе и помогли команде перейти от разрозненного legacy-решения к управляемой разработке:

  • провели код-ревью;
  • выполнили рефакторинг;
  • помогли уточнить продуктовую логику;
  • консультировали дизайн-команду;
  • разработали ключевые турнирные модули;
  • связали команды, профили, расписание и сетку;
  • учли разные сценарии CS2 и Dota 2;
  • подготовили систему к дальнейшему развитию.

Это кейс не про красивый запуск с чистого листа. Он про более сложную работу: войти в чужой код и логику, сохранить полезное и довести продукт до следующего этапа.

Можно ли развивать легаси, не переписывая весь продукт?

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

Да. Мы можем провести аудит, предложить план стабилизации, взять в работу отдельные модули или подключиться к дальнейшему развитию продукта. Главное — заранее разделить зоны ответственности.

Потому что за ней стоит логика результатов, раундов, форматов соревнования и переходов команд. Изменение результата одного матча может перестроить несколько последующих этапов.

У дисциплин разные правила подготовки и проведения матчей: карты, стороны, герои, pick/ban и статистика. Общая оболочка помогает сохранить целостность продукта, но внутренняя логика должна учитывать особенности каждой игры.

Лобби управляет подготовкой матча: проверяет участников, распределяет роли, запускает выбор карт и сторон, передаёт параметры сервера и синхронизирует действия двух команд.

Да. Разработчики видят зависимости, роли и пограничные состояния, которые не всегда заметны на отдельных макетах. В Neva мы не создавали визуальный дизайн, но помогали проверять и уточнять продуктовую логику.

Начинать с анализа зависимостей и разделять продукт на самостоятельные зоны ответственности. Новый модуль должен подключаться к существующим данным и ролям через понятные правила, а не встраиваться в код точечными исключениями.