Por que o "Jogo da Vida" de Conway é usado para retiros de código?

15

O Code Retreat é um evento de treinamento diário que se concentra nos fundamentos do desenvolvimento de software. Está chegando um dia de retiro de código "global", e estou ansioso por isso. Dito isto, eu já estive em um antes e tenho que dizer que houve uma enorme quantidade de caos ... o que é bom.

Uma coisa que ainda não entendi é por que o "Jogo da Vida" é um bom problema para o TDD, e como é bom e ruim o TDD para ele.

Perceba que esta é uma pergunta bastante aberta, então fique à vontade para comentar.

erros
fonte
Parece uma pergunta muito orientada para a discussão que seria melhor ter em nosso bate-papo de engenharia de software .
Adam Lear
@ Anna Lear: Obrigado, mas não querendo conversar, procurando respostas. Se não é uma boa pergunta, tudo bem.
erros
3
@AnnaLear Eu acho que a pergunta é mais sobre tópico do que o OP dá crédito.
Tom Squires
1
@ Tom: Eu estava pensando sobre isso sozinho e fico feliz em vê-lo indo bem. Feliz por estar errado. :)
Adam Lear

Respostas:

26

Originalmente, o Game of Life de Conway foi escolhido porque tínhamos um applet java à mão para trabalhar no primeiro tratamento de código em janeiro de 2009. O objetivo do dia era experimentar algumas idéias sobre a prática do tempo, e acabamos de escolher o applet GoL porque nós o possuímos.

Depois disso, no entanto, alguns facilitadores ativos (principalmente eu durante minha jornada de viajante em 2009 e Alex Bolboaca em Bucareste) investigaram os usos do GoL como uma ferramenta de aprendizado. Ao mesmo tempo, evoluímos o formato de coderetreat para o que ele se tornou hoje. Em 2009, Alex tentou pelo menos um outro problema (pontuação nas mãos de pôquer), mas não achou tão útil quanto o GoL. Você pode encontrar mais informações sobre a história em http://coderetreat.org/history

O Coderetreat se concentra em melhorar nossa compreensão do design simples (especificamente as 4 regras do design simples), desenvolvimento orientado a testes e outros aspectos fundamentais do desenvolvimento de software. GoL tem o benefício de ser um problema muito simples de entender, embora ainda seja muito rico de uma perspectiva estrutural. Ele prontamente fornece partes do sistema que podem ser usadas como exemplos de todos os tópicos que praticamos no tratamento de códigos. Por exemplo, uma implementação comum que utiliza parâmetros (x, y) em vários métodos é uma ótima oportunidade para falar sobre o princípio DRY (todo conhecimento deve ter uma e apenas uma representação em seu sistema) com relação à topologia do sistema. Existem muitos outros aspectos que podem ser usados ​​como exemplos de construção de um design que minimiza o custo da mudança.

Atualmente, existem muitas pessoas que fizeram vários ameaças ao codificador e ainda encontram aspectos interessantes do problema para usar como prática.

coreyhaines
fonte
10

O Jogo da Vida de Conway seria um bom ajuste, porque é um conjunto de códigos bastante simples que tem resultados profundamente poderosos. Quanto a usá-lo para impulsionar o desenvolvimento orientado a testes, eu apostaria porque os testes seriam bastante difíceis de escrever, porque os resultados que você está procurando não são óbvios no código que você está escrevendo. Escrever um código que lhe permita um planador é um truque se você não o faz antes ou não há muito tempo. Portanto, é adequado para ampliar a arte da disciplina, principalmente quando executado em programação em pares, como costuma ser o TDD.

Na medida em que lhe ensina coisas úteis; é um exercício de uma espécie de pensamento lateral. Você precisa conceituar como o seu código funcionará, executá-lo, vê-lo falhar, reunir dados, refatorar e continuar iterando. Todas essas coisas são cruciais para o TDD. Vinculando-o ao mundo real, é semelhante a um cliente que lhe entrega um documento de requisitos vago que apenas diz "Eu quero X". Então você dá X a eles, mas chegar a X pode ser complicado. O Jogo da Vida de Conway é bom em ensinar isso. Também é bastante fácil de codificar e normalmente não é necessário muito código para isso. (A APL é um dos exemplos mais extremos de implementação.) Portanto, é bastante adequado para as sessões curtas que um retiro teria em vez de uma ou duas semanas, como você normalmente encontra em um ambiente de produção.

Engenheiro Mundial
fonte
10
Eu consideraria um planador um comportamento "emergente". Seus testes de unidade precisam apenas codificar as regras de vida e morte de células, considerando um número específico de vizinhos.
22711 Robert Harvey
1
O planador é definitivamente um comportamento emergente. Alguns participantes dos programas de codificação criarão alguns testes maiores que incluem coisas como o planador, mas estes são testes de orientação, não testes orientados por unidade / tdd. O comportamento surge da construção das regras, que são bem definidas.
Coreyhaines #
3

Game of Life é, por um lado, um conjunto muito simples de regras; por outro, contém algumas das piores advertências da programação avançada, relacionadas à escalabilidade . Embora os resultados sejam determinísticos, há o desafio de um campo de jogo infinito e um número infinito de células a serem processadas.

Se as especificações do desafio incluírem desempenho mínimo e espaço de memória máximo , os testes incluirão padrões de crescimento rápido ou padrões que viajam em várias direções por todo o lado, isso pode se tornar um desafio muito frustrante.

Você tem a entrada e a saída conhecidas após as iterações X e conhece todas as etapas para chegar lá ... exceto que as etapas levam muito e muito tempo. Você deve executar algumas otimizações extremas para se ajustar às especificações. O algoritmo trivial com a varredura de uma matriz 2d de tamanho duplo com buffer duplo torna-se totalmente inadequado à medida que seu desempenho se degrada com O (n ^ 2) do tamanho. O tratamento de blocos preenchidos como novos objetos gerados repentinamente consome toneladas de memória e fica lento. Separar tudo em placas de tamanho limitado funciona algumas vezes, algumas vezes falha ...

E como a maioria dos testes "globais" falhará no padrão de desempenho, você precisará desenvolver metas menores, sub-testes menores que resolvam as advertências ...

SF.
fonte
2

Tudo depende de qual aspecto do seu processo você deseja praticar / treinar.

Um único dia não é suficiente para cobrir todos os aspectos da engenharia de software, independentemente do paradigma de abordagem / gerenciamento de projetos que você escolher. Portanto, para torná-lo eficaz, você provavelmente deve se concentrar em um pequeno subconjunto do todo.

Se você se concentrar nos aspectos técnicos do TDD, por exemplo, poderá deixar de lado as grandes áreas cinzentas em torno de requisitos e relações com o cliente e seguir direto para a codificação de uma solução.

A esse respeito, o Jogo da Vida é um bom candidato, pois é simples, bem compreendido e não possui muitas áreas cinzentas em seu requisito que estará aberto para debate. Assim, você pode começar a escrever seu teste imediatamente e codificar contra eles.

Se, por outro lado, o objetivo era ver como podemos usar o TDD para aprimorar os requisitos, então eu poderia ter escolhido o jogo da vida, mas não teria dito aos desenvolvedores que é isso que eu quero. Em vez disso, eu teria circulado por aí fornecendo dicas e idéias sem realmente mencioná-lo pelo nome. Dito isto, o jogo da vida pode ser um pouco simples demais para esse tipo de exercício, já que os participantes provavelmente veriam o truque rapidamente.

Nem sempre é fácil encontrar exemplos para esse exercício sintético. tem que ser simples, como deve ser feito em um dia, mas não muito simples para fazê-lo durante o dia. Tem que ser divertido, mas não tem sentido ... Mas para mim tem que ser um pouco original, não me lembro quantas vezes me pediram para convencer os alunos a criar um sistema de gerenciamento de videoclub para trabalhos de casa ... iiirch.

Newtopian
fonte