Разработка
От 15 до 30 видов спорта: что нужно, чтобы построить мультиспортивную платформу
Добавление вида спорта — это не изменение настроек. Это новый набор правил, новая модель подсчёта и новый набор крайних случаев. Вот как Zeetius вдвое расширил свой охват.
Когда люди слышат, что платформа поддерживает тридцать видов спорта, они обычно представляют выпадающий список и таблицу правил за ним. Добавил строку — получил вид спорта. Мы думали примерно так же, когда начинали. Это совсем не так, и причина — самая интересная инженерная задача в нашем деле.
В каждом виде спорта своё понимание того, что такое счёт
Бадминтон — до двух побед в партиях до 21, с разницей в два очка, потолок 30. Настольный теннис — до трёх или четырёх побед в партиях до 11, с разницей в два очка, без потолка, и подача меняется каждые два очка. В борьбе очки накапливаются непрерывно по периодам, а матч может мгновенно закончиться чистой победой. В баскетболе есть часы, которые останавливаются. В крикете — иннинги. В шахбоксе в одном поединке чередуются две совершенно разные системы подсчёта.
Нет общей абстракции, которая охватила бы всё это и не стала бы настолько расплывчатой, что перестала быть полезной. Универсальное поле «очки», которое в каждом виде спорта значит своё, — это не модель, а текстовое поле с лишними шагами, и каждый, кто работает с этими данными, вынужден заново реализовывать логику вида спорта, чтобы их истолковать.
К чему мы пришли: парадигмы, а не виды спорта
Прорыв случился, когда мы перестали моделировать виды спорта и начали моделировать парадигмы подсчёта очков. Под тридцатью видами спорта оказалось гораздо меньше по-настоящему разных форм:
- Виды спорта «партии и розыгрыши» — бадминтон, настольный теннис, теннис, пиклбол, падел, волейбол. Матч — последовательность партий; партия — последовательность розыгрышей; у розыгрыша ровно один победитель. Различия — только в целевом счёте, правиле двух очков, лимите и очерёдности подач.
- Виды спорта с игровым временем и накоплением очков — футбол, баскетбол, гандбол, хоккей. Матч — это последовательность периодов; очки набираются событиями, привязанными к команде и часто к игроку; а сами часы — состояние, которое может запускаться, останавливаться и истекать.
- Единоборства — борьба, шахбокс. Периоды, непрерывный подсчёт очков и условия завершения, которые могут сработать в любой момент и отменяют всё остальное.
Когда виду спорта назначена парадигма, его добавление сводится к описанию параметров, а не к написанию новой логики. Пиклбол занял дни, а не недели: это вид «партии и розыгрыши» с необычным правилом подачи и другим целевым счётом, и под то и другое в парадигме уже были поля.
Набор правил — это данные, движок — это код
Именно это разделение позволяет команде, которая не в тридцать раз больше, поддерживать тридцать видов спорта. Исправление логики разницы в два очка вносится один раз и сразу работает верно в шести видах спорта. Новый вид спорта наследует каждое исправление, которое когда-либо получила парадигма. А когда федерация меняет правило — это случается чаще, чем думают посторонние, — это изменение данных, которое проверяют и выкатывают, а не код, который приходится продумывать с нуля.
О чём никто не предупреждает: крайние случаи
Парадигмы справляются с идеальным сценарием. Примерно половина реальной работы — это то, что происходит, когда вид спорта не вписывается в схему.
- Игрок снимается посреди розыгрыша. Кому присуждается гейм и как будет записан счёт в архиве результатов?
- Судья исправляет очко, внесённое два розыгрыша назад. Всё, что от него зависит, — страница лайва, вероятность победы, сетка — должно пересчитаться без перезагрузки страницы.
- Неявка фиксируется до начала матча. Счёта нет, но результат есть, и сетка всё равно должна продвинуться.
- Два игрока в одной сетке — полные тёзки. Экран подсчёта должен их различать, и судье не нужно щуриться на номер участника.
- У корта пропадает связь — а в школьном спортзале это происходит стабильно. Счёт должен копиться локально и синхронизироваться по порядку, когда сеть вернётся.
Именно этот пункт повлиял на архитектуру сильнее любых различий в правилах. Связь у корта — враждебная среда, а система подсчёта, рассчитывающая на связь, — это система, которая теряет матчи.
Почему это важно, даже если вы не инженер
Потому что именно она определяет, о чём федерация вообще может попросить. На платформе, где каждый вид спорта делается с нуля, вопрос «вы поддержите каларипаяттту?» — это квартал дорожной карты. На платформе с парадигмами честный ответ обычно звучит как встречный вопрос: какова форма подсчёта и где она ломает наши допущения? Если это вид «партии и розыгрыши» с необычными параметрами, это недели. Если это по-настоящему новая парадигма, то дольше — и мы скажем об этом прямо.
Достижение — не тридцать видов спорта. Достижение — суметь сказать «да» тридцать первому, ничего не переписывая.