Site menu Projeto maldito
e-mail icon
Site menu

Projeto maldito

e-mail icon

2012.12.20

Este artigo expressa a opinião do autor na época da sua redação. Não há qualquer garantia de exatidão, ineditismo ou atualidade nos conteúdos. É proibida a cópia na íntegra. A citação de trechos é permitida mediante referência ao autor e este sítio de origem.

Este texto publicado pelo Slashdot me lembrou de um "projeto maldito" em que participei.

Também era desenvolvimento de jogos. Mas não era "game", era "gambling": aquelas maquininhas de video-bingo. Foi entre 2002 e 2003. Tudo que seria possível dar errado num projeto, deu. Inclusive problemas misteriosos de hardware, tal qual no texto do Slashdot.

Utilizamos um hardware especial, compatível com PC precursor dos "mini ITX". A fábrica teve problemas na linha de produção, e uma porcentagem enorme das placas dava problema.

Você conjuga isso com pressão total nos prazos e software empurrado para "produção" prematuramente. Chegaram a colocar em campo versões alpha e beta, exclusivamente para demo e teste. Fiquei sabendo quando veio a torrente de xingamentos.

O cliente tinha o curioso hábito de chamar todo mundo na véspera de um feriado, ou numa sexta-feira, e xingar de cima a baixo, duma cólera olímpica, naturalmente ameaçando todo mundo de demissão, etc. O cara anunciou o fechamento da empresa umas três vezes só na minha lembrança de contratado!

Obviamente o efeito esperado era fazer todo mundo trabalhar direto no feriadão ou fim-de-semana. A efeméride era tão previsível que prometi largar o cliente se ele aprontasse na véspera de 1º de maio de 2013. De fato ele "aprontou", o que eu não esperava. E eu cumpri minha ameaça, o que o cliente não esperava.

O cidadão realmente acreditava que o terror constrói. Como ele é rico, deve ter sua cota de razão. Os empregados dele também acreditavam: a maioria trabalhava lá por vários anos, e continuou trabalhando lá depois.

Voltando às questões técnicas. O problema mais curioso que enfrentei foi uma máquina, apenas uma, que pagava prêmios adoidado. Este tipo de defeito causava um problema sério, porque os clientes não queriam sair do bingo, chamavam a polícia... um rolo infernal.

Por alguns motivos, o jogo utilizava apenas números inteiros em todo o jogo — exceto em um lugar, onde a retribuição nominal era calculada usando ponto flutuante. Por sorte, eu registrava o valor no "log", e nesta máquina a retribuição nominal aparecia anormalmente alta ou baixa. Não sempre; apenas em umas poucas linhas do log, algo como 1 em 200 cálculos.

Para quem não sabe, "retribuição nominal" é o mecanismo básico de receita de um bingo ou cassino. Ao contrário do que se pensa, os jogos de azar "devolvem" a maior parte do dinheiro apostado. A casa ganha dinheiro na média e no longo prazo.

Por exemplo, a clássica roleta de cassino tem números pares e ímpares, e também o zero. Normalmente o prêmio vai para um jogador "vermelho" ou "preto". Mas quando a bolinha cai no zero, as apostas ficam para o cassino. Isto acontece em apenas 5% das vezes, portanto a retribuição nominal da roleta é 95%: de cada 100 reais apostados, 95 voltam para os jogadores.

Bons jogos ou boas máquinas de bingo têm retribuição nominal bem próxima de 100%; o jogador sente-se mais à vontade porque tem diversas oportunidades de sair do jogo com quase todo o dinheiro que colocou. Mas normalmente ele joga até perder tudo. Numa máquina com retribuição de e.g. 90%, supondo que cada jogada custe 1 real, uma aposta de 10 reais proporciona ao jogador algo em torno de 10+9+8+7+...3+2+1=55 jogadas, e não apenas 10 como pareceria ao leigo.

Fazer um jogo com retribuição alta mas que não dê prejuízo é obviamente o "molho secreto" do negócio. Foi justamente um dos primeiros desentendimentos com o cliente: segundo o contrato ele forneceria o "molho secreto", porém nada mais fez que explicar a retribuição nominal (que é um conceito de domínio público). Chegar a uma implementação minimamente razoável custou bastante esforço, esforço que continuou depois que saí do projeto. (Felizmente o cliente aprendeu alguma coisa com minha saída; tratou de contratar uma equipe boa e, mais importante, evitou xingá-la; e os resultados apareceram.)

Pois bem, quando a máquina "bichada" calculava erradamente uma retribuição nominal baixa, pagava imediatamente um prêmio caro para compensar. Na prática a máquina pagava quase 200% de retribuição nominal, o sonho de todo jogador compulsivo.

Como apenas uma máquina fazia isto, numa casa distante, pelo menos desta vez o cliente não me culpou imediatamente. A primeira suspeita era que a casa tinha fraudado a máquina.

Pedi para trazê-la a fim de auditá-la, o log mostrou as retribuições nominais estranhas, e os testes mostraram logo que ela "dava pau" em cálculos com números de ponto flutuante. Bastava executar uma operação simples como 2.0 / 1.0 uns milhares de vezes para emitir um sinal SIGFPE ou um resultado absurdo.

Já encontrei alguns bugs de compilador, mas bug de CPU acho que foi o único, que eu me lembre.

Ficamos tão aliviados com a descoberta, que acabamos esquecendo de verificar porque o SIGFPE não fazia o jogo "morrer". Talvez alguma biblioteca tratasse o sinal para ser ignorado.

O fabricante do hardware ficou bastante surpreso com nossa descoberta. Claro que ele tentou tirar o dele da reta. Se um computador dá pau apenas com ponto flutuante, isto provavelmente significa que a CPU tem problema interno, ou mesmo bug de microcódigo. Se a CPU era tão ruim, quantos outros problemas poderiam estar à espreita nas demais placas?

Acabei adicionando a seguinte "defesa" no jogo: calcular duas vezes seguidas a retribuição nominal. Se os resultados divergissem, tentava de novo, e emitia uma advertência para o técnico. Era ridículo mas a premissa de uma CPU não-confiável é igualmente ridícula. Fato é que nunca mais houve problemas do gênero :)

Não me lembro bem, mas acho que depois converti o cálculo para inteiros, ou adicionei uma salvaguarda onde o cálculo era feito usando ambos os métodos para detectar divergências.

Outra opção seria fazer o jogo "morrer", o que faria a máquina ser devolvida como defeituosa. Mas os jogadores não gostam de perder dinheiro desse jeito, então julgamos melhor que a máquina se mantivesse funcionando. No fim, nenhuma outra máquina apresentou este defeito em particular.

e-mail icon