Saturday, May 19, 2007 9:08 PM

Para não falarem que sou extremista ou radical defensor das práticas ágeis (acho que estou muito longe disto, na verdade) vou dizer uma coisa: eu particularmente considero a aplicação de TDD + YAGNI uma prática tanto arriscada, que pode resultar em um design inadequado e deveria ser praticada apenas por times com experiência suficiente para tal.

O Test Driven Development inverte o fluxo “natural” do desenvolvimento de software e faz com que o desenvolvedor primeiro crie testes automatizados que atendam os requisitos para depois criar o código necessário para que os testes parem de falhar. Uma das vantagens desta técnica seria a aplicação do YAGNI de forma natural.

O conceito de YAGNI (You Aint Gonna Need It) afirma que você deve implementar somente o que é realmente necessário agora para atender os requisitos. Isto faz com que o esforço seja concentrado nos requisitos mais importantes e que o código seja sempre o mínimo possível.

Os conceitos são bonitos e atraentes, mas existem alguns riscos. Veja um exemplo, estou construindo uma API de operações matemáticas, então faço um teste unitário:

    Calculator calc = new Calculator();

    int result = calc.Sum(3, 2);

    Assert.AreEqual(5, result, “Soma simples incorreta”);

Qual o menor código possível que atende meu requisito?

    public Calculator
    {
        public int Sum(int a, int b)
        {
            return 5;
        }
    }

Tudo bem, você achou ridículo o exemplo mas não me xingue ainda... Porque o exemplo é ridículo? Porque é óbvio que o resultado desejado era a soma dos dois parâmetros e ninguém faria algo tão estúpido. O problema é que não há nada no teste que afirme este fato tão óbvio e, na verdade estamos inferindo o requisito porque conhecemos o assunto. Agora pense, não existem milhares de situações que pode ser similares a esta, mas que os requisitos não sejam tão óbvios?

O ponto aqui é que se os testes não cobrirem 100% das alternativas possíveis o seu código YAGNI pode ficar incompleto. O problema é que muitas destas alternativas podem aparecer para você durante a construção do código e não antes. Por isto é necessário um processo de identificação e solução de pequenos problemas ao longo do desenvolvimento, micro-iterações importantes para atingir um código completo, seguro e simples.

Steve McConnell em Code Complete, fala que o design de software é um processo complexo, por isto são necessários diferentes níveis de abstração para facilitar o entendimento do problema. Conseguir transitar entre estas abstrações é uma habilidade importante para elaborar um bom design de software.

É como um entender um caminho em um mapa, como carioca morando em Sampa eu me tornei um expert em mapas. As vezes é necessário olhar o mapa sob uma perspectiva macro, ver todo o caminho, que bairros e principais avenidas você vai passar. Mas também é necessário olhá-lo sob a perspectiva micro, quais as ruas próximas, se o local fica no início ou no fim do quarteirão, à direita ou à esquerda.

Na construção de software estas perspectivas também são importantes, as vezes devemos analisar os detalhes da implementação de um método, as vezes temos subir alguns níveis de abstração e entender em qual camada ficará esta classe ou com que outras classes ela poderá interagir.

Todas as vezes que tentei aplicar TDD me senti empurrado para tomar decisões de design de forma inconsciente, prematura e sob a perspectiva micro. Sinceramente não me senti bem, não foi uma experiência confortável, nem agradável.

Não estou afirmando que a técnica é ruim ou que é essencialmente falha, mas acho que é preciso tomar cuidado com algumas armadilhas que podem surgir e saber como lidar com elas. Com certeza ainda pretendo fazer novas tentativas com TDD quando tiver outras oportunidades, talvez mude de opinião.

Comments

At 5/20/2007 10:56 PM, Thiago Brito said:

# re: A anorexia pode atacar seu código-fonte

Acredito que o TDD deve sempre comecar com testes que apenas verifiquem se a funcao esta realmente fazendo o que se espera. Nada mais do que isso.

Desenvolver codigo usando apenas TDD e arriscado quando voce nao conhece o objetivo final da funcao ou da classe. Desta forma obviamente teremos o problema que voce esta mostrando em seu exemplo. (Neste caso, nao desenvolva a funcao ou classe, procure mais informacoes primeiro !)

Obviamente, como tudo relacionado ao mundo da programacao, depende de experiencia e esforco do lado do desenvolvedor para buscar constantemente a melhoria do seu codigo. Com TDD nao pode ser diferente. Com experiencia e muita persistencia, o desenvolvedor aprende quais praticas devem ser levadas em consideracao e quais devem ser ignoradas para aquele caso especifico.

So temos um jeito de descobrir o ponto certo...... que e programando.
At 5/21/2007 1:47 PM, Leonardo Lima said:

# re: A anorexia pode atacar seu código-fonte

Entendi o seu ponto de vista, mas creio que associado ao TDD, vem a prática de programação em par, que tem como um dos objetivos evitar que um desenvolvedor caia na própria armadilha, com a constante revisão do código pelo par além dos outros desenvolvedores que devem ter o hábito de sempre revisar e melhorar o código. Mas é claro que nada é infalível.
At 5/22/2007 6:49 PM, Eduardo Miranda said:

# re: A anorexia pode atacar seu código-fonte

Thiago,

Lembre-se que minha crítica está no TDD+YAGNI, mais precisamente ao TDD+YAGNI como um propulsor para a arquitetura do aplicativo.

Todo o Agile é baseado em incertezas, se eu só começar a desenvolver quando tiver certeza do que cada método irá fazer estou indo em direção ao Waterfall. Lógico que quero conhecer o máximo sobre o problema que estou resolvendo, mas não significa que devo 'ignorar' algum insight que me ocorra ao longo do processo. Para mim o YAGNI te induz a isto.

Agora se você já sabe o que o método irá fazer então ocorreu um processo de design, tenha sido ele mental, no quadro negro ou inconsciente. Você já decidiu que existe uma classe, já decidiu qual é a sua responsabilidade, decidiu que existe um método e qual a sua responsabilidade.

A minha outra preocupação é justamente se este design é inconsciente ou não. O seu design não pode ser direcionado totalmente pelo YAGNI. Já começa inclusive a existir alguns esforços no sentido de melhorar o processo de design evolutivo no Agile (veja um exemplo no blog do Sam Gentile).

Leonardo,

Muita gente faz TDD sem pair programming, que por sinal é a prática mais polêmica e menos aplicada do XP. Mesmo assim não gosto do fato do YAGNI induzir o desenvolvedor a não refletir em outras possíveis consequências do código que está sendo escrito.

Mesmo que você está programando em par o que motivaria o outro desenvolvedor a pensar em algo que foge do YAGNI? Provavelmente ele irá concordar contigo no "erro" ou nem chegará a pensar 'fora da caixa'.
At 5/22/2007 11:23 PM, Leonardo Lima said:

# re: A anorexia pode atacar seu código-fonte

Eduardo, concordo com a polêmica da programação em par, mas desconheço a estatística de que é a prática menos aplicada, eu nunca vi nem participei de equipes XP sem pair programming. Quanto ao YAGNI, concordo que o par vá pensar "dentro da caixa", mas um dos exemplos que você deu foi em relação ao test, e creio que os dois não vão fazer um teste propositalmente no estilo citado por você, até por que ele vai ser revisado por outros pares. Queria deixa claro que estou falando me baseando nas experiênias que eu tive com XP, até agora estou adorando e tendo sucesso.

Abraço.
At 5/23/2007 9:48 AM, Eduardo Miranda said:

# re: A anorexia pode atacar seu código-fonte

Desculpe, eu estava me referindo fora do XP. Existem várias práticas XP, que são amplamente utilizadas por times que não praticam XP. Dentre estas o pair programming certamente não é a mais popular (por vários motivos, alguns até não técnicos do tipo "como convencer o diretor da empresa de que dois dev fazendo a mesma coisa podem ser produtivos").

TDD cresceu bastante e já é amplamente utilizado fora do mundo XP. O meu receio é a sua utilização fora de um ambiente que já tem cultura ágil, como certamente os times de XP têm.

Não acho que as pessoas que hoje praticam TDD estejam cometendo estes erros, são pessoas experientes ou estão sendo guiadas por outros mais experientes. Mas receio que a medida que a prática seja divulgada e aplicada em outros contextos isto pode acontecer.

Novamente, não se esqueça que minha crítica é: TDD + YAGNI. Na verdade confesso que YAGNI não passa na minha garganta :). Vou escrever outro post falando mais sobre isto porque acho até que o TDD não é tão YAGNI assim... (da minha parte isto é um elogio)

Uma sugestão: Escreva mais sobre sua experiência com XP no seu blog pois acho um assunto interessante para todos. Quem sabe você não me convence de tentar TDD de novo ;).
At 5/23/2007 2:46 PM, Leonardo Lima said:

# re: A anorexia pode atacar seu código-fonte

:)

Boa idéia, vou pensar em escrever algo sobre XP lá, não para lhe convencer, quem sou eu, mas quem sabe para colher alguns feedbacks como esses em relação à TDD por exemplo.

Abraço.
At 11/2/2008 1:14 AM, Assis jr said:

# re: A anorexia pode atacar seu código-fonte

Kra, se teu método apenas resolve o cálculo 2+3 = 5, então tanto o método quanto o teste estão corretos.

Caso teu método deva realmente somar os valores, a+b=c, então você deveria escrever mais métodos de teste que pudessem mostrar falhas no código. O teste deve existir para expor uma falha! Então se você fizer um outro teste que exponha essa falha seu código será melhorado usando o mínimo possível.

Caso você ainda não sabe o que deve fazer, então é melhor estar mais próximo do cliente. Caso ele mesmo não saiba ainda o que quer os testes junto ao cliente poderão lhe ajudar e guiar para encontrar as soluções.

[]´s
Post Comment
Title *
Name *
Email (never displayed)
Website
Comment * (Allowed tags: blockquote, a, strong, em, p, u, strike, super, sub, code)  
Please add 7 and 1 and type the answer here: