Como sendo certificado pelo Scrum, tenho tendência a me basear em metodologias ágeis ao desenvolver um sistema e até mesmo usar algumas telas da estrutura do Scrum para gerenciar meu trabalho diário.
Além disso, estou me perguntando se TDD é uma opção no desenvolvimento de jogos, se é viável?
Se eu acredito nessa pergunta GD, TDD não é muito útil no desenvolvimento de jogos.
Por que o MVC e o TDD não são mais empregados na arquitetura de jogos?
Eu venho da programação industrial em que grandes projetos com grandes orçamentos precisam funcionar perfeitamente, pois isso pode resultar em cenários catastróficos se o código não for testado completamente por dentro e por fora.
Além disso, seguir as regras do Scrum incentiva o cumprimento das datas de vencimento do seu trabalho, enquanto todas as ações no Scrum têm um prazo determinado! Então, eu concordo quando, na pergunta acima, eles dizem para parar de tentar criar um sistema e começar a escrever o jogo. É exatamente o que o Scrum diz: primeiro tente não construir o sistema perfeito: faça-o funcionar até o final da Sprint. Em seguida, refatorar o código enquanto trabalha no segundo Sprint, se necessário!
Entendo que, se nem todos os departamentos responsáveis pelo desenvolvimento de jogos usam Scrum, o Scrum se torna inútil. Mas vamos considerar por um momento que todos os departamentos usam Scrum ... Eu acho que o TDD seria bom para escrever código sem erros, embora você não queira escrever o sistema / jogo "perfeito".
Então, minha pergunta é a seguinte:
O TDD é viável no desenvolvimento de jogos?
fonte
Respostas:
É certamente viável, embora muitos programadores de jogos ainda não tenham entendido a idéia ainda, ou tenham um bom entendimento de como testar sistemas complicados. Eu admito que raramente o uso, exceto em sistemas não relacionados ao jogo que são fáceis de testar.
Espere usar muitos objetos simulados. Devido à interligação de muitos sistemas, é difícil testar componentes individuais disso.
Além disso, muitas coisas não podem ser exaustivamente testadas. Como você testa, digamos, um sistema de partículas? Como você testa se seu sistema de animação está funcionando corretamente? Muitas coisas são de natureza visual e não são óbvias (pelo menos para mim) sobre como fazer testes adequados.
No entanto, existem muitas coisas que não são necessariamente testes de unidade no sentido tradicional da palavra, mas existem como "testes" para recursos específicos. Coisas como níveis de teste para navegação de IA são bastante comuns, mas não são necessariamente as coisas mais fáceis de automatizar.
Existem certos aspectos dos jogos que podem (e provavelmente deveriam) ter testes de unidade escritos para eles. Qualquer tipo de sistema genérico de "leitura de arquivos" deve ser testado. Talvez tenha alguns testes para inicialização de itens de hardware (superfícies 3D, etc). Talvez tenha alguns servidores simulados e teste seu código de interação cliente / servidor. Coisas assim.
fonte
Keys.Down
,Keys.Left
etc. Isso quer dizer que o jogo sabe onde o usuário deseja a cobra para ir, e a cobra tem que ir onde o jogo diz-lhe para, no entanto, que é apenas a serpente que sabe para se mover nas diferentes direções, daí também sua posição no jogo. Tendo dito isso, IMHO, torna aSnake
classe testável! (Para ser continuado ...)Vector2.Zero
, com uma velocidade10.0f
nos eixos X e Y neste jogo 2D. A primeira pergunta é: está posicionado em sua suposta posição inicial e como testá-lo? Então, você acha que aPosition
propriedade deve ser exposta publicamente. Segundo: como fazê-lo se mover? Métodos de movimento deve ser bom, para que escrever um teste para cada método de direçãoMoveDown
,MoveLeft
e assim por diante. Agora, escreva a sua declaração de método e veja se o teste se queixa. Então, reverificar posição da cobraMoveDown
chamada de método! Como você sabe que aPosition
propriedade foi completamente testada, é um membro com o qual você pode contar! Você pode adivinhar a continuação aqui! ;-) Isso quer dizer que os componentes visuais definitivamente não podem ser testados, mas a cobra deve se parecer com uma cobra, tudo dependendo do tipo de cobra que você deseja no jogo. O artista que desenha a cobra deve demonstrar satisfação suficiente com o desenho da cobra, que não deve ser testado através do TDD, é claro! Mas sua posição em relação a outros objetos pode, e a classe que representa essa cobra também. De fato, TDDEu não acho que o TDD, como tal, seja apropriado como base para o desenvolvimento de jogos. Testes de unidade automatizados como parte da metodologia, com certeza, mas muitas das principais preocupações do desenvolvimento de jogos são subjetivas e não podem ser testadas em máquinas para que os testes sejam o condutor do desenvolvimento. Como você vai escrever um teste de script para saber se uma mecânica de jogo é divertida? Que um nível é visualmente atraente? Mesmo que um nível leve um jogador típico em torno de 15 minutos para ser concluído? O TDD se encaixa em situações nas quais a maturidade de um projeto pode ser medida quantitativamente em termos de conformidade com uma especificação, e isso simplesmente não é desenvolvimento de jogos.
fonte
É um pouco difícil descobrir exatamente o que você está perguntando, já que o título é puramente sobre TDD, mas você parece estar fazendo do Scrum parte integrante da pergunta também - e, pelo que entendi, uma não exige a outra.
Está correto. Acho que nunca ouvi falar dele usado na prática na indústria de jogos. (Mas também nunca ouvi falar dele usado fora da indústria de jogos - apenas por indivíduos.)
Os jogos não precisam funcionar perfeitamente. Portanto, há muito menos ênfase na correção do código. O TDD não garante a correção do código, mas algumas pessoas acham que isso reduz a correção. Ainda estou para ver a prova disso.
Eu nunca vi uma metodologia que não incentivasse o cumprimento de datas de vencimento ou a realização de ações que não eram pontuais. O problema é que, independentemente da metodologia usada, estimar a complexidade do software é bastante difícil. Não é impossível, mas estimar com precisão não tem muito a ver com o processo. Se minha tarefa é adicionar um novo painel da GUI, ou corrigir um erro na animação ou adicionar uma nova estatística aos caracteres, o uso do Scrum não vai acelerar isso, e o uso do TDD será para retardar a tarefa (com o possível benefício de reduzir mais tarefas de manutenção posteriormente). Eles certamente não facilitarão a estimativa da duração da tarefa.
Se for comprovado que o TDD escreve um código melhor que outros métodos, então sim.
Existe prova disso? O fato de que a indústria possa usá-lo não é prova. A indústria é bem conhecida por produzir código ruim que é entregue com atraso. A ausência de exemplos de grandes projetos de TDD que falharam ou atrasaram pode ser apenas por ser uma nova abordagem e poucas pessoas realmente concluíram esse projeto ainda. (E os que estão atrasados ... ainda podem estar em execução.)
Viável? Claro. Benéfico? Isso ainda está para ser provado.
fonte
Spacecraft
classe se torna uma classe totalmente testável com métodos e propriedades. Este é o tipo de material que absolutamente pode, IMHO, ser totalmente testado usando TDD. Digamos que você precise de uma espaçonave e escreva os testes necessários para realizar um teste de cada vez.desculpe pelo meu inglês ruim e desculpe pelo meu ponto de vista tendencioso: eu não sou um designer de jogos, mas um programador.
Eu acho que há algum mal-entendido nesta discussão. Eu vou falar sobre TDD de forma mais geral, o chamado BDD. O desenvolvimento orientado ao comportamento não é uma maneira de testar o projeto (os testes são algo como efeitos colaterais). O BDD é uma maneira de projetar , uma maneira de refatorar e projetar o software durante toda a produção (veja alguns lemas como o KISS, "mantenha a qualidade", "teste com antecedência, teste com frequência") e não em uma fase isolada. O BDD é o oposto de algum processo clássico de software, como o processo em cascata ou alguma outra metodologia iterativa para criar software.
Outro ponto é que os testes automáticos são para os recursos que podem ser testados automaticamente por uma máquina computacional. não há teste de diversão nos jogos e não há teste de usabilidade de uma interface gráfica do usuário. diversão ou usabilidade são materiais para outros trabalhos e não para o desenvolvimento de software como designer de interação, mundo e nível d. da mesma maneira que as partes artísticas (modelagem, texturização etc.) são para artistas que usam computadores como ferramenta de criatividade - obviamente esses trabalhos podem ser executados pela mesma pessoa que escreve código, mas esse não é o ponto. a física pode ser testada, os algoritmos de otimização podem ser testados, o comportamento de objetos singulares pode ser testado (com zombarias, stubs e dummy, como mencionado anteriormente)
o último pensamento é que, imho, é que não apenas o design de jogos, mas todo o código de escrita é uma arte.
fonte
Aqui está um estudo de caso de alguém que acha que TDD e gamedev se misturam muito bem:
http://powertwenty.com/kpd/downloads/TestDrivenDevelopmentInPython.pdf
É certo que este é um projeto pequeno no Pygame, mas dá a idéia de quais partes podem ser testadas com um jogo gráfico e quais não. Fiquei surpreso com o quanto poderia ser feito com o TDD nesse cenário.
fonte
Não, o desenvolvimento orientado a testes não é adequado para o desenvolvimento de jogos. Claro que você pode escrever testes para algumas partes que deseja testar, mas o processo de desenvolvimento de jogos é completamente diferente do desenvolvimento orientado a testes, que exige especificações exatas antes do início do progresso.
Os jogos raramente têm especificações exatas quando iniciados. E se o fizerem, sempre mudam e evoluem durante o processo de desenvolvimento.
O design do jogo é uma arte, você não pode ter testes específicos para saber quando a arte é boa ou completa.
fonte