Tag Archives: xp

O que vem depois do Agile?

Após uma aula entusiasmada na Academia do Agile sobre liderança e coaching, cheguei em casa e me deparei com um tweet que apontava para um post do Dhanji falando sobre como eles tem experimentado com agile no Google. No post ele descreve algo que ele chama de “Cowboy Methodology”. Ele também afirma que a predominância no Google é a ausência de metodologias.

Dhanji afirma:

There are exceptions of course, many Google teams use various degrees of XP, Scrum, or something else entirely. However, these are few and far between in my experience. The lack of methodology predominates. This is not to say that software does not get written on time, nor is it to say that good code is not produced but the process under which it is, is largely non-existent.

Nesse caso, o que podemos dizer sobre a necessidade real de utilizar agile ou não em um projeto? Vi esse mesmo questionamento em tweets de pessoas que haviam acabado de ler o artigo.

Minha impressão é que muitas pessoas ainda acham que basta adotar algumas práticas de engenharia e pronto. Estamos usando agile. Seguir uma receita que contém várias práticas não determina que você está usando Agile ou não. Utilizar Scrum não quer dizer que sua empresa é de fato ágil. Ultimamente, tenho ouvido frases como: “Nós usamos Scrum na minha empresa, mas não posso dizer que somos ágeis de fato. ”

Isso ocorre pelo simples fato de que, mesmo algo simples como Scrum pode ser “camuflado” para satisfazer uma cultura rígida. Tem faltando cultura real nas empresas e isso minimiza em muito os efeitos do uso do Scrum, XP ou qualquer outra metodologia. A cultura é a essência da agilidade e não pode ser substituída.

O meu entendimento é que Scrum, XP e qualquer outra metodologia é muito útil no início. Serve como um impulso inicial, que revelará onde e como podemos corrigir nossa postura e como podemos buscar resultados melhores. No entanto é preciso muito cuidado e atenção para que, ao longo do caminho, identifiquemos quais são as mudanças culturais necessárias para que a agilidade possa de fato emergir.

Uma vez que essa cultura ágil esteja consolidada, aí podemos partir em busca de um processo único, adaptado e adequado à nossa realidade. Acredito que seja isso que esteja acontecendo com o Google. Vários dos princípios que compõe a agilidade já fazem parte do mind-set dos Googlers. Escolher e participar da formação das pessoas, faz com que esse tipo de possibilidade exista dentro do Google. Não é necessário seguir algo prescrito, quando temos maturidade suficiente para decidirmos o nosso próprio caminho. Nisso consiste a agilidade.

Considerando que o mercado enxerga “Agile” como um substantivo que descreve um conjunto de metodologias que apesar de empíricas são prescritas de forma generalizada sem considerações dos contextos em que serão aplicadas. Dessa forma posso seguramente afirmar que o que vem depois do “Agile” é a verdadeira agilidade. A diferença é sutil e, por isso, é preciso que validemos constantemente nossas decisões, práticas e processos, segundo os princípios e valores nos quais acreditamos.

E pra você? O que vem depois do Agile? Compartilhe sua opinião.

Read more →

Test Driven Development & Design Evolutivo

TDD: Todo código é culpado até que se prove o contrário!Código limpo e auto-explicativo! Este é o objetivo do Test Driven Development ou TDD. O TDD é composto por práticas propostas pelo eXtreme Programming, reforçando os conceitos de Design Evolutivo e Test First. Focado nestes dois conceitos, tentarei explicar quais os benefícios de uma abordagem baseada no TDD.

Benefícios do TDD

Algo que tenho visto freqüentemente em clientes e treinamentos por todo o Brasil é que, em se tratando de processos de desenvolvimento Ágil, os desenvolvedores ficam um pouco perdidos no início do projeto. Isso deve-se ao fato de que a prática tão falada de desenvolvimento incremental gera várias dúvidas sobre a integridade e arquitetura do sistema. Os desenvolvedores simplesmente não sabem qual componente usar, quando usar e principalmente se é necessário usar. Isso já era de se esperar, pois estávamos acostumados ao modelo tradicional, onde esse tipo de decisão era responsabilidade de um arquiteto e nós apenas obedecíamos.

Para facilitar o desenvolvimento incremental, uma das soluções é aplicar o design evolutivo. Design evolutivo significa que você só deve se preocupar com o design relativo à funcionalidade que está em sua mão naquele momento, porém deixar pontos de extensão para facilitar o a evolução. Esse tipo de prática favorece o refactoring e garante flexibilidade quando o cliente decide mudar o escopo da aplicação.

Ciclo do TDD

Os desenvolvedores habituados ao modelo tradicional de desenvolvimento de software não estão habituados ao design evolutivo. Não estão acostumados a tomar decisões de design a cada funcionalidade que precisam implementar. Isso gera um desconforto e receio na hora de implementar a solução. O TDD ajuda nessa questão. Permite que o desenvolvedor se veja como um consumidor daquela funcionalidade, pois é obrigado a refletir sobre o código que irá escrever, pensando em como seria sua utilização.

Para que isso seja realidade, é necessário utilizar também a prática conhecida como Test First. Essa prática consiste em escrever o teste antes de escrever o código real, obrigando que o desenvolvedor imagine o código real antes mesmo de começar a escrever. Dentre outras coisas, isso também ajuda a ativar o lado criativo do cérebro, pelo fato de exigir o uso da imaginação. Isso muitas vezes revela-se o maior desafio para os iniciantes dessa abordagem, porém conforme o avanço no desenvolvimento isso se torna natural para o desenvolvedor, aumentando em muito a qualidade do código. Isso reforça também a idéia de que desenvolver software é uma arte e deve ser realizada por artesãos de software.

A pergunta mais freqüente que ouço sobre isso é referente ao retrabalho que isso pode causar e o impacto gerado por grandes mudanças no escopo. Como resposta, pergunto: Qual seria o impacto desse tipo de mudança em uma arquitetura rígida e pré-definida? Seria seguro e fácil alterar esse tipo de arquitetura? É aqui que o TDD se torna muito importante!

Quando precisamos alterar algum código, precisamos nos certificar de que tudo que funcionava antes da alteração, também funcionará depois da alteração. A melhor forma de garantir isso é utilizando testes automatizados. Os testes facilitam o refactoring e permitem verificar rapidamente o que funciona e o que não funciona no sistema.

Mas como isso acontece na prática?

Como descrito no livro Test Driven Development By Example de Kent Beck (Beck2003), os seguintes passos resumem a prática:

  1. Rapidamente adicione um teste
  2. Execute todos os testes e veja que o teste novo falha
  3. Realize um pequena alteração no código
  4. Execute todos os testes e veja se todos tem sucesso
  5. Refatore para remover duplicação.

Neste mesmo livro, estão relacionadas algumas das possíveis perguntas a serem respondidas:

  • Como cada teste pode tratar de um pequeno incremento de funcionalidade?
  • Quão pequenas e feias as mudanças podem ser para conseguir fazer os novos testes funcionarem?
  • Com que freqüência os testes são executados?
  • Quantos passos formam os refactorings?

Essas e outras questões, bem como detalhes técnicos sobre como praticar o TDD serão abordados no Workshop sobre Test Driven Development realizado pela Fratech. Se seu sistema anda com problemas na hora de refatorar ou sua produtividade está restrita, mesmo quando utiliza metodologias ágeis em seus projetos, não deixe de participar.

Read more →

Utilizando metáforas no design de software

Bad Designer BrainsUma das principais dificuldades no desenvolvimento de software moderno é disseminar o conhecimento e difundir as necessidades do usuário. É muito difícil para nós desenvolvedores enteder o sistema, pois temos de nos adaptar às diversas situações de negócio, que mudam conforme cada projeto.
O problema é que entendemos de computação, mas fazemos softwares para tratar situações que não tem relação direta com a computação. Isso nos obriga a lidar com teorias e conceitos que não são familiares ao nosso cérebro. Isso pode complicar de forma significativa o design.

O lado direito do cérebro (R-mode)

Hemisférios do Cérebro O fato é que na maioria das vezes essas informações chegam para nós de forma textual, o que estimula apenas o lado esquerdo do cérebro (L-mode). Acontece que design de software é uma atividade de intuição, criatividade e resolução de problemas, atribuições do lado direito do cérebro (R-mode). Estes dois lados são assíncronos. Não podemos utilizá-los ao mesmo tempo. Pior que isso, é o fato de que nào controlamos o R-mode, apenas o L-mode de nosso cérebro. Para mais informações sobre isso leia este livro. Ao tentar raciocinar textualmente com o L-mode, pensando em sintaxe e detalhes técnicos, perdemos o contato com o R-mode e consequentemente a capacidade de criar, contando apenas com a capacidade analítica e lógica de nosso cérebro. Em outras palavras, somos fisicamente limitados a criar péssimos modelos a não ser que dominemos o assunto de que o software trata (domain).

As metáforas vem para ajudar

Após aceitar o fato de que somo limitados, devemos procurar formas de ultrapassar nossos limites. De acordo com a explicação acima, isso envolve ser capaz de usar o processo criativo quando projetando um software, ou, dominar o domain em questão. Precisamos criar um ambiente onde o L-mode se encontre com o R-mode, possibilitando criatividade e análise simultâneamente. Este ambiente é o mundo virtual das metáforas.

“Metáfora é um local comum para a verbalização e as imagens, uma forma de viajar de para trás e para a frente entre o consciente e o subconsciente, entre os hemisférios direito e esquerdo de nosso cérebro.” [The Journal of Creative Behavior, 15(1), 1981.]

Metáforas e os métodos ágeis

O uso de metáforas é algo muito difundido na comunidade de métodos ágeis. O Extreme Programming chega ao ponto de listá-la como uma de suas práticas, destacando a importância do seu uso. Outros conceitos e processos, como Domain Driven Design contém referências ao uso de metáfora e seus benefícios.
Como visto no post no infoQ, muitos projetos ágeis tem falhado e conforme Martin Fowler relata neste post, a maioria por falta da adoção de boas práticas de engenharia de software. O uso de metáfora, é uma delas.

Metáforas e Domain Driven Design

No Domain Driven Design, devemos orientar e restringir o design do software às peculiaridades de seu domínio. O Domain Driven Design, prega o uso de uma linguagem comum e amplamente utilizada pelo time, com o objetivo de tornar mais fácil o entendimento e a comunicação de ambas as partes.

Metáfora do Sistema

Eric Evans afirma em seu livro, Domain Driven Design – Tackling Complexity in the Heart of Software, que “o design de software tende a ser muito abstrato e difícil de entender. Os desenvolvedores e usuários precisam de uma forma tangível de entender e compartilhar uma visão do sistema como um todo.”. Utilizando as metáforas, os desenvolvedores e experts do domain tem um ponto de referência para discussões que podem ser mais concretas que o modelo por si só.
Na verdade, as metáforas devem ser utilizadas como ponto de partida para a criação de uma boa ubiquitous language. As metáforas são consolidadas através do uso de modelos explanatórios (Explanatory Models), uma espécie de diagrama sugerido por Evans em seu livro.

Criando metáforas

Brain Connections

A palavra Metáfora vem do grego “tranferir”, implicando a idéia de transferir os atributos de um objeto para um outro de forma literalmente impossível. Combinar dois objetos ou situações de forma que resulte em uma história comum aos dois lados. Edward De Bono propôs uma técnica chamada PO que ajuda na criação de metáforas. Basicamente pegamos um objeto aleatório e associamos com o domínioLiquidificador & brain em questão. Por exemplo:

Domínio em questão: Criação de Metáforas
Palavra Aleatória: Liquidificador

Metáfora:
  Imagine que criar metáforas é semelhante a fazer uma vitamina. Você deve escolher cuidadosamente os ingredientes que você mais gosta. Colocá-los no liquidificador, ligá-lo e esperar. Enquanto o liquidificador faz seu processamento, você deve relaxar. Após algum tempo, a vitamina está pronta. Basta retirar e tomar.

Assim funciona a criação de metáforas. Você junta alguns estímulos (ingredientes) de sua preferência e armazena em seu cérebro. Estimule seu cérebro relaxando (ouvindo música, assistindo TV, caminhando pela cidade) enquanto o seu R-mode processa os ingredientes e derrepente, algo extremamente saboroso fica pronto. Sua nova metáfora. Pronta para utilizar.

Expresse sua metáfora em software, da forma que é explicado neste artigo. O resultado será um design bem feito e simples de ser explicado. Aconselho ainda esta leitura sobre metáforas.

O que você acha da utilização de metáforas para o design de software? Deixe seu comentário.

Read more →