Engenharia
Tênis de mesa, wrestling, basquete: um só motor, três esportes bem diferentes
Um passo a passo concreto de como a mesma infraestrutura de pontuação lida com um esporte de rali, um de combate e um de cronômetro sem virar uma massa genérica.
Já falamos dos paradigmas de pontuação em abstrato. Este artigo é a versão concreta: três esportes que realmente operamos, o que cada um exige e onde termina o motor compartilhado e começa o trabalho específico de cada esporte.
Tênis de mesa: um esporte de rali com um problema de rodízio
A pontuação parece simples. Melhor de cinco ou sete, games até 11, diferença de dois pontos, sem limite. A complexidade está toda no saque.
O saque alterna a cada dois pontos, exceto em 10-10 (empate), quando alterna a cada ponto, indefinidamente. Nas duplas, a ordem de recepção também gira e muda entre os games. Se o rodízio erra, o árbitro tem de corrigir a ordem do saque manualmente no meio do game, justamente o atrito que o sistema existe para eliminar.
Por isso o modelo do tênis de mesa trata o estado do saque como parte de primeira classe do placar, derivado da sequência de pontos em vez de digitado. Como é derivado, um árbitro que corrige um ponto de três ralis atrás também corrige o rodízio do saque automaticamente — um daqueles detalhes invisíveis quando funcionam e enlouquecedores quando não.
Há também uma peculiaridade nos dados que encontramos em produção e documentamos do jeito difícil: em algumas implantações, só os pontos de um lado eram registrados por rali, com os do adversário deduzidos. Isso serve para o placar e é inútil para analytics derivados dos ralis, porque metade dos eventos está faltando. Registrar os dois lados a cada rali foi pré-requisito para qualquer análise de partidas de tênis de mesa.
Estado derivado vale mais que estado digitado
O princípio geral que isso ilustra: tudo o que as regras conseguem calcular a partir da sequência de pontos deve ser calculado, nunca digitado. Rodízio do saque, game point, match point, se a regra dos dois pontos está ativa, quem recebe em seguida nas duplas. Todo campo que o árbitro precisa manter à mão é um campo que, mais cedo ou mais tarde, estará errado às 20h do terceiro dia.
Wrestling: pontos contínuos e encerramento repentino
O wrestling quebra por completo a premissa do rali. Não existe um evento discreto de ganhar ponto para contar — os pontos se acumulam continuamente dentro de períodos cronometrados, com valores diferentes, concedidos por ações de tipos diferentes, a qualquer um dos lutadores, a qualquer momento.
E uma luta pode acabar na hora. Um pin encerra tudo, qualquer que seja o placar. Uma superioridade técnica encerra a luta no instante em que a diferença é atingida, no meio do período. Não são casos extremos a tratar depois; são condições que o mecanismo precisa avaliar a cada evento de pontuação, porque a luta pode já ter acabado.
Advertências e passividade acrescentam outra camada: um estado que afeta a luta sem ser pontuação e que pode se converter em pontos depois. A interface de pontuação precisa, portanto, de valores de pontos, controle de advertências, um botão de pin e um cronômetro de período — sem nada a mais na tela, porque um árbitro de wrestling praticamente não tem tempo de procurar um controle.
Basquete: o relógio é a parte difícil
A aritmética de pontuação do basquete é a mais simples das três — dois, três ou um ponto, atribuído a um jogador e a uma equipe. O que a torna difícil é o relógio.
O tempo de jogo é um estado que corre, para e precisa estar de acordo entre o dispositivo de pontuação, o telão do local e a tela de cada espectador. Um relógio sincronizado por consulta periódica sai do compasso visivelmente em um quarto. A abordagem que funciona é transmitir as transições do relógio — iniciado neste horário, parado naquele — e deixar que cada cliente calcule o valor atual localmente. Assim, todas as telas derivam o mesmo tempo dos mesmos eventos, e um cliente que reconecta após uma queda calcula o tempo correto na hora, em vez de retomar de um valor desatualizado.
O que é realmente compartilhado
Dada a diferença entre os três, é justo perguntar o que o motor comum realmente contribui. Bastante, como se vê — e nada disso é lógica de pontuação.
- O fluxo de eventos: ordenado, somente de acréscimo, tolerante a falta de conexão e reproduzível. Idêntico para os três.
- Reprodução no servidor como fonte da verdade, de modo que as correções funcionem da mesma forma em todos os lugares.
- Distribuição para páginas ao vivo, chaves, sobreposições de transmissão e analytics — um único caminho de publicação.
- Estrutura do torneio: chaves, tabelas, programação, resultados e rankings, que não se importam com qual esporte gerou o resultado.
- Fila offline e reconciliação, escritas uma só vez e herdadas por todos os esportes.
O que é específico de cada esporte é a avaliação das regras e a interface de pontuação — as duas coisas que de fato precisam ser. O fato de todo o resto ser compartilhado é o que faz do trigésimo primeiro esporte uma questão de semanas, e não de uma reescrita.