Coding Dojo @ engsoftagil

Depois de 7 horas de aula em pleno Sábado, uma galera corajosa da #engsoftagil se reuniu para um coding dojo. O problema escolhido foi o FizzBuzz. A linguagem foi Ruby. Os detalhes sobre o dojô estão no dojobh.

Tenho alguns comentários:

  1. Gostei das discussões sobre qualidade do código vs. preocupação com performance. O pessoal decidiu por deixar explícita a intenção do código, o que achei muito bom.
  2. Mesmo nesse problema muito simples (FizzBuzz), precisamos fazer muitas decisões de design ao implementar. Isso, pra mim, invalida opiniões (principalmente de alguns gerentes por aí) de que programação é algo mecânico. Espero que o pessoal tenha tido o mesmo feeling.
  3. Surgiram questões interessantes relacionadas a TDD:
    • devo escrever outro teste ou refatorar o código?
    • como sei que meus testes são suficientes?
    • para um problema com uma solução óbvia, posso escrever logo a solução que acho que é a correta e implementar os testes depois?

    Todas essas são questões pertinentes e que mostra que o pessoal estava interessado e questionando TDD, mas com a mente aberta.

Uma coisa que eu deveria ter evitado e que pretendo melhorar da próxima vez é o respeito a par que está programando. Fiquei dando pitaco e sugerindo um monte de coisa. Isso atrapalha quem está programando. Devia ter ficado mais calado.

Faltou um teste que juntasse tudo, que Rondy começou a implementar mas não teve tempo de terminar, porque o pessoal começou a Retrospectiva. Coloquei no Gist o código de um possível teste de wrap-up.

def test_fizzbuzz_de_1_a_20
      sequence = []
      1.upto(20) do |n|
           fizzbuzz = FizzBuzz.new(n)
           sequence.push(fizzbuzz.run)
       end
       assert_equal '1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz', sequence.join(",")
end

Houve um efeito ruim da decisão de passar o número como parâmetro do construtor, que é ter que instanciar um objeto a cada número. Acho que, como não precisamos manter estado, seria melhor passar o número em questão como parâmetro do método run, que executa a lógica do FizzBuzz.

Uma coisa interessante a se fazer, é implementar o FizzBuzz passando um Range como parâmetro. Aí, mudaria o código para retornar um Array, ao invés de um número ou String. Aí o código do teste acima iria ficar algo parecido com:

def test_fizzbuzz_de_1_a_20
       fizzbuzz = FizzBuzz.new
       sequence = fizzbuzz.run(1..20).join(",")
       assert_equal '1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz', sequence
end
Anúncios