Pressupostos

by alisson.vale 21/6/2008 12:35:00

Pressupostos são hipóteses que precisamos admitir antecipamente para que possamos aceitar ou compreender as teorias que delas decorrem. Eles são o ponto de partida para justificar as abordagens adotadas. Para optar entre uma ou outra linha de pensamento é necessário antes de mais nada estabelecer concordância com eles.

Quando comparamos o modelo Ágil com o Waterfall eu acredito em quatro pressupostos básicos sobre a qual precisamos nos posicionar antes de partir para uma ou outra abordagem.

São eles:

  Waterfall Agile
Sobre a natureza das atividades de desenvolvimento de software
Produção taylorista
Criação colaborativa
Sobre o modelo de qualidade Seguir especificações Satisfazer usuários e clientes
Sobre a forma de organizar as pessoas Grupos de Trabalho Times de Projeto
Sobre o modelo de gestão Gestão de escopo fixo Gestão de escopo variável

Afinal, software deve ser produzido de modo fabril ou criado colaborativamente? Para ter qualidade ele deverá seguir rigidamente especificações pré-acordadas ou ser capaz de satisfazer os anseios e necessidades de usuários e clientes? Como devemos organizar as pessoas? Por meio de um grupo de trabalho com tarefas pré-definidas em um processo controlado? ou criando times de projeto com liberdade para definir e otimizar o seu próprio modelo de trabalho?

Talvez a pior escolha, nesse caso, seja não fazer uma escolha. O modelo teórico que vai embasar as suas práticas de trabalho será decorrente dessa escolha. Há uma conexão direta entre esses pressupostos, os princípios que lhe endereçam, e aquilo que precisamos praticar no dia-a-dia para implantá-los. Quando não há rigidez na escolha do conjunto adequado de pressupostos, o modelo teórico adotado se enfraquece, as práticas anulam-se umas às outras e os riscos de insucesso aumentam.

Cenários para Testes Automatizados com db4o

by alisson.vale 17/6/2008 21:43:00

Recentemente chegou às bancas a edição de número 09 da revista MundoDotNet. Essa edição conta com um artigo onde descrevo uma técnica interessante para administração de cenários de testes implementada com sucesso pelo meu colega Paulo Cesar Fernandes aqui na empresa. 

A técnica consiste em interceptar a execução de métodos de forma a armazenar objetos construídos durante a execução da aplicação em um banco de dados orientado a objetos. Assim, esses objetos podem ser carregados na memória no momento em que são necessários para o SetUp de testes unitários.

Na verdade, o artigo foi um pouco além de descrever a técnica. Grande parte do texto é dedicada a explicar as raízes e as várias formas em que técnicas de teste podem ser utilizadas para aumentar a qualidade do software no contexto de um projeto ágil.

Alguns tópicos e trechos do artigo

Uma nova visão para as atividades de teste de software:  A relação das atividades de teste com qualidade. Algumas das idéias de Deming que podem ser utilizadas em desenvolvimento de software. A relação de Deming com o estilo de administração japonês que levou ao Movimento Ágil e as técnicas que este movimento trouxe de forma a permitir a redução de inpeções no software.

Testes como oportunidades para aumentar a qualidade: Em projetos ágeis, testar significa criar oportunidades para que o produto absorva elementos de qualidade de forma permanente. "Um teste automatizado injeta qualidade dentro do software".

Quando testes automatizados podem aumentar a qualidade do processo:  Testes de aceitação automatizados criam as condições para melhoria do processo de desenvolvimento na medida em que estabelecem um instrumento de colaboração e de comunicação entre clientes e desenvolvedores. "o propósito de um teste de aceitação é aumentar a qualidade do processo de comunicação necessário para as atividades de análise e levantamento de requisitos, por meio de especificações executáveis".

Quando testes automatizados podem aumentar a qualidade do produto: Aqui a defesa é que o uso de TDD aumenta a qualidade interna do produto na medida em que cria as condições para a evolução sustentável do software. "o propósito do teste unitário é influenciar o design da aplicação, permitindo que ele evolua sem sofrer os danos causados pelo seu processo de degradação".

O artigo também oferece um rápido exemplo de como uma ferramenta como o Fitnesse pode criar especificações executáveis fáceis de ler e de produzir. Conforme imagem a seguir:

 




A abordagem Ágil oferece uma nova perspectiva para endereçar qualidade de software.
Acho que esse artigo dará ao leitor uma boa idéia do que isso quer dizer.

A Inspeção boa e a ruim

by alisson.vale 10/6/2008 22:37:00

Embora Quality has nothing to do with testing seja um ótimo post que vale a pena dar uma olhada, acho que o título ficaria melhor formulado como Quality has nothing to do with finding defects. Testes são instrumentos de feedback que obtemos do software quando comparamos seus resultados com nossas expectativas. Assim, quando o resultado de um teste é associado com a completude de uma expectativa, ele é sim um importante instrumento de qualidade.

O mérito do post está em desmistificar as atividades de teste como sendo as únicas necessárias para garantir a qualidade do software. Na verdade, o que ocorre é que as atividades de teste perdem dramaticamente o poder de agregar valor em termos de qualidade quando são utilizadas como instrumento de inspeção-para-a-localização-de-defeitos. Se uma feature sai do ambiente de desenvolvimento sem funcionamento adequado, será certamente mais apropriado parar e descobrir porquê isso ocorreu do que registrar os problemas em um bug tracking e depois continuar o trabalho de inspeção incansável até que nenhum problema seja mais encontrado.

Uma melhor opção é utilizar as atividades de testes como instrumentos para prevenção-de-defeitos. Ao criar, por exemplo, um teste automatizado, não há inspeção. Há a formalização de critérios de aceitação que passarão a conviver eternamente de forma agregada ao produto à partir daquele momento. Assim, somos capazes de introduzir qualidade no produto no mesmo passo em quê o desenvolvemos.

A qualidade dos incrementos de software liberados em um projeto Ágil depende muito do efeito conjunto resultante da aplicação de diferentes tipos de técnicas e práticas, cujo intuito central é evitar que defeitos sejam introduzidos no produto. A ação conjunta desses elementos tem o poder de eliminar (muitas vezes por completo) a necessidade de inspeções-para-a-localização-de-defeitos.

Testes orientados para inspecionar aquilo que, já no seu início, é produzido sem levar em conta os vários aspectos de qualidade relevantes para desenvolvimento de software, são nocivos na medida em que criam uma cultura em que quem desenvolve não precisa garantir a qualidade daquilo que faz, pois há uma implícita delegação para que isso seja verificado por uma outra pessoa.   

No entanto, inspeções não serão sempre ruins. Há as inspeções boas também. Elas ocorrem quando o foco é gerar feedback. Ao inspecionar uma nova funcionalidade, por exemplo,  o foco de quem inspeciona não precisa ser verificação e conferência. O objetivo da boa inspeção é dar feedback, é oferecer um novo ponto de vista de modo a encontrar pontos que poderiam estar melhor resolvidos. O mesmo ocorre quando inspecionamos código, seja passando o código para um colega inspecionar, ou seja fazendo inspeção contínua com pair programming. Em ambos os casos, a procura-por-problemas é elemento secundário, enquanto que feedback é o elemento central.

Em resumo, a inspeção ruim procura por defeitos, enquanto que a boa gera feedback.

Contando a História de uma Iteração com um Relatório A3

by alisson.vale 12/4/2008 22:59:00
Documentação é importante em qualquer projeto. Aqueles que alegam que projetos ágeis não são bem documentados quase sempre caem no engano de misturar dois propósitos distintos para documentação de projeto. Um deles é o do registro puro e simples de algo que um dia pode ser útil para alguém, mas que quase sempre não é. O segundo envolve gerar documentação como resultado de um processo que mistura atividades de colaboração e comunicação e gera algo que contribui para o aumento da qualidade do produto em desenvolvimento. Os Testes de aceitação são um exemplo clássico. O cliente e o desenvolvedor utilizam esse instrumento em um processo de colaboração para encontrar os cenários que precisarão ser previstos durante a implementação da funcionalidade. Ao mesmo tempo, o teste é utilizado para que um comunique suas idéias para o outro, fazendo com que os objetivos sejam unificados, já que há duas visões focadas em diferentes níveis de abstração: a visão do negócio e a visão da implementação. Apesar desse tipo de teste ser uma excelente documentação, isso é apenas uma espécie de efeito-colateral, pois o seu real propósito reside em aumentar a qualidade do processo facilitando os processos de comunicação e colaboração.

O modelo de trabalho da Toyota, que por si só já converge em vários pontos com a abordagem ágil, parece que funciona de maneira semelhante no que diz respeito à documentação. Quem já teve a oportunidade de estudar um pouco o seu processo de solução de problemas sabe como ele é rico em observação, diagnóstico e análise detalhada das questões que influenciam ou são influenciadas por um determinado problema. Mesmo assim, quem espera que a Toyota registre cada passo desse tipo de análise, gerando um grosso relatório a ser utilizado para avalisar as decisões, pode se preparar para rever seus conceitos. Pelo menos é o que diz o best-seller O Modelo Toyota, escrito por Jeffrey Liker e David Meier. Esse livro, que, na minha opinião, deveria estar na cabeceira de todos aqueles que estudam e/ou aplicam o modelo ágil em seus projetos de software, tem um grande número de ensinamentos dos senseis da Toyota que, ou corroboram com as idéias do movimento ágil, ou o expandem em direções inusitadas.

 

  Figura 1: Esboço de relatório A3 adaptado ao contexto ágil

Uma das partes do Manual de Aplicação que me chama a atenção já há bastante tempo é o trecho em que se fala do uso sistemático pela Toyota de relatórios montados em uma folha de papel A3, onde se conta uma história com início, meio e fim de um projeto, de solução de um problema, ou ainda histórias que apresentam marcos de evolução de um projeto. Há vários cenários em que tais relatórios são exigidos e também há toda uma técnica para esboçá-los. 

A técnica possibilita a criação de um relatório capaz não só de documentar as análises e decisões tomadas em um projeto, mas também amplia a capacidade de comunicar seu conteúdo mais eficientemente, além de permitir a colaboração de todo um grupo de pessoas para produzi-lo. O fato de ele estar limitado à parte da frente de uma folha de papel A3 o torna grande o suficiente para conter as informações mais essenciais e pequeno o suficiente para evitar que ele contenha todo aquele detalhamento que afasta o leitor e atrapalha o processo de comunicação. Um relatório desses deve poder contar toda sua história em menos de 5 minutos. Há basicamente quatro tipos de histórias que podem ser contadas por meio de relatórios A3 na Toyota:

  • História de uma proposta;
  • História da Solução de um Problema;
  • História da Situação de um Projeto;
  • História de Informações;

Todos eles podem ser facilmente utilizados em um qualquer projeto, Ágil ou não. Mas há dois deles que realmente podem ser muito bem aproveitados no modelo ágil: um relatório que conta a história da solução de um problema e o que conta a história da situação de um projeto. O primeiro pode ser mais um dos instrumentos disponíveis para inpeção e adaptação de projeto ágeis. Na verdade, o relatório é apenas um dos elementos de toda uma metodologia para solução de problemas (eu falo um pouco dessa metodologia em uma série de dois artigos que escrevi para a Revista Visão Ágil sobre aperfeiçoamento de projetos ágeis). Já o segundo tipo de história (aquela que descreve a situação de um projeto), também me chamou a atenção, mas dessa vez por um motivo diferente: talvez esse seja um bom instrumento para contarmos a história de uma iteração para stakeholders ou outros personagens que não participam do seu dia-a-dia e que precisam rapidamente estar informados sobre o seu andamento.

Pensando nisso eu criei um esboço simplório do que poderia ser a história de uma iteração contada por meio de um relatório A3. Uma imagem ampliada desse esboço pode ser obtida clicando aqui.  À partir desse ponto é interessante ler o restante do post com o relatório aberto para facilitar o entendimento.

A primeira coisa que se deve ter em mente ao produzir um relatório desse, é que ele deve contar uma história concisa e sem desvios. Um relatório de situação de projeto (ou relatório de status) é diagramado horizontalmente. A frente da página é dividida em duas partes iguais. O verso normalmente não é utilizado. Dentro dessas duas partes, são criadas 5 seções que receberão o conteúdo do relatório.  O tamanho de cada seção e o seu conteúdo vai depender do enfoque da história que está sendo contada. A primeira seção é o Histórico do Projeto até então. É nesse momento que você situa o leitor descrevendo a exata situação do projeto até o momento imediatamente anterior ao início da iteração. Como estava o projeto antes da iteração começar? Estabeleça o foco em números e utilize gráficos para mostrar tendências. Ao invés de textos com frases corridas, crie enumerações com frases simples. Utilize setas para guiar o leitor pelas informações disponibilizadas.

O  segundo passo é indicar quais foram os objetivos da iteração. Você pode, opcionalmente, contar a história sobre como estes objetivos foram estabelecidos. Um backlog com uma análise de custo-benefício pode servir para este propósito. Nesta seção deve-se ser claro quanto a esses objetivos. Ou seja, ao invés de "Melhorar a cobertura de testes unitários", utilize "Alcançar 85% de cobertura nos testes unitários". Se este for um dos seus objetivos, você deve indicar em que número esta cobertura estava na seção Histórico do Projeto para depois indicar qual foi o resultado alcançado nas seções seguintes. Lembre-se que a história deve ter início, meio e fim. Repare que eu adicionei todo o backlog do projeto ao documento. Pude fazer isso, porque o projeto é pequeno. Em projetos maiores você pode se concentrar em colocar a história da iteração no contexto de um tema ou de uma release. Assim, o escopo ficará reduzido o suficiente para ilustrar seu objetivo mais imediato.

Uma vez esclarecidos os objetivos, podemos entrar nos detalhes de o quê foi implementado para alcançá-los. Aqui vale informar as ações ou os critérios utilizados e quais métricas ou informações foram coletadas de forma que possamos constatar a relação do trabalho realizado com os objetivos estipulados.

Finalmente, as duas seções finais descrevem o resultado alcançado, os problemas e as ações de melhoria propostas. As informações sobre problemas e melhorias propostas podem vir das retrospectivas e devem de alguma forma apresentar elementos que descrevam problemas que ou atrapalharam a execução do trabalho ou o impediram. 

Vamos ver então como a história dessa iteração poderia ser contada em menos de 5 minutos:

"Na parte superior esquerda nós podemos visualizar a síntese de progresso do projeto. Após 4 iterações terem se passado, podemos ver que funcionalidades têm sido desenvolvidas a uma taxa de 8 a 11 pontos por iteração. Até o momento foram desenvolvidos 39 pontos, o que representa 34% do total. A velocidade da equipe, que antes era de 8 pontos por iteração, agora está na média de 9,75, o que indica uma aceleração de 17% quando comparada ao início do projeto. Esse quadro de progresso nos oferece três possibilidades de projeção para o fim do projeto. A projeção mais otimista leva em conta a maior velocidade alcançada até agora, a mais pessimista leva em conta a menor velocidade e uma terceira visão mais realista considera a média de velocidade das últimas 4 iterações. Assim, nosso marco final, no momento anterior ao início dessa iteração, estava previsto para ser alcançado provavelmente entre 7 e 11 semanas.

Ao iniciar a Iteração #5, uma análise de custo-benefício foi feita de forma a selecionar aquelas funcionalidades que teriam maior relevância para implementação imediata. Três histórias foram selecionadas e o comprometimento para o seu desenvolvimento foi estabelecido. Em termos numéricos, apenas mantivemos o índice de entrega alcançado na iteração anterior: 11 SPs.

A implementação das três histórias foi realizada dentro do prazo da iteração. Testes de aceitação, de integração e testes unitários automatizados foram criados para todas elas. Houve uma variação para baixo indesejável no nível de cobertura dos testes unitários, o que deixou a equipe alerta para trabalhar na direção de elevar esse índice novamente na próxima iteração. As variações nas métricas de design não revelaram nenhuma anormalidade.

Com a implementação das três novas histórias, o projeto avançou em mais 10 pontos percentuais chegando aos 44% de completude. As Projeções de término agora estão variando entre 5,2 semanas (cenário mais otimista) e 7,8 semanas (mais pessimista). 

A iteração apresentou um aumento significativo no percentual de tempo alocado em atividades que não geram valor. Esse desperdício que já fora de 17% na iteração anterior, alcançou o patamar de 27% nessa iteração. Um aumento nominal de 10%.  A análise realizada na retrospectiva revelou uma grande quantidade de tempo investida em atividades de instalação e configuração de infra-estrutura de deploy, o que nos fez propor um plano para automatizar essas atividades e, dessa forma, voltar a reduzir esse nível de desperdício para que mais tempo possa ser alocado em atividades que gerem progresso no projeto."

Esse exemplo é totalmente fictício, claro. Mas dá uma idéia do que é ser capaz de apresentar o trabalho de toda uma iteração em menos de 5 minutos, concentrando-se nos pontos essencialmente relevantes para a audiência do relatório. Obviamente, os gráficos, números e métricas podem ser dos mais diversos tipos e podem apresentar as mais diversas informações. O importante é manter o foco no aspecto da comunicação, preocupando-se em ser sucinto e objetivo , sem poluir ou sobrecarregar com dados sem conexão com o que se deseja apresentar.  

Utilizando métricas de código para melhoria no design de software

by alisson.vale 12/2/2008 19:40:00

Essa semana saiu mais uma edição da Revista MundoDotNet. Desta vez, pude dar minha contribuição com um artigo em que a idéia é relacionar "métricas de código" com "design de software".  Acho que ainda exploramos muito pouco dos benefícios que as métricas de código podem oferecer para o aumento nos níveis de qualidade do design de um software. Apesar de haver muitas ferramentas, raramente se vê alguém que efetivamente obtém alguma vantagem em utilizar as informações que elas geram.

De maneira geral, eu tento dar ali um caminho para se chegar a sintomas de problemas de design por meio da análise numérica de informações extraídas do código-fonte. Assim como um médico pode usar os números extraídos de exames - como números de plaquetas, ph, taxas de glicose e colesterol e outras centenas de índices possíveis - para diagnosticar doenças e prescrever tratamentos, desenvolvedores de software também podem. Um dos caminhos é saber como algumas medições revelam problemas no design. Obviamente que números não são suficientes para avaliar o design de um software. A avaliação subjetiva e humana sempre será necessária. Mas eles podem sim ser de grande ajuda nessa questão.

Quando falamos em "problemas de design", a primeira coisa que me vem a cabeça são os mau-cheiros de código que nos levam aos padrões de refatoração. Assim, o artigo tenta mostrar como podemos encontrar pontos de refatoração à partir de métricas coletadas no código-fonte. Além disso, há a questão de utilizar tal abordagem de modo sistêmico, criando assim alguns mecanismos de proteção contínua do design e abrindo espaço para a evolução do código de forma contínua.

Sei que muitos leitores desse blog não trabalham e também não conhecem a plataforma .Net. Mas, mesmo para eles, recomendo comprar de vez em quando a MundoDotNet (eu não trabalho com Java, mas estou sempre lendo a MundoJava). A MundoDotNet é uma revista que foca na plataforma, porém com uma boa ênfase em aspectos gerais sobre desenvolvimento (como design, arquitetura e técnicas de desenvolvimento), o que a faz ser atraente para qualquer um que leve desenvolvimento a sério.

No caso do meu artigo em específico, ele poderá ser lido e aproveitado por usuários de qualquer plataforma de desenvolvimento. Se quiser discutir sobre o artigo, é só deixar um comentário aqui ou me enviar um e-mail.

Boa Leitura! 

Artigo Publicado na Revista Visão Ágil

by alisson.vale 28/1/2008 19:03:00

Recentemente foi publicada a 3ª Edição da Revista Visão Ágil que contou com um artigo meu intitulado "Aperfeiçoamento de Projetos Ágeis - Uma Visão Sistêmica".

O artigo foi dividido em duas partes. Nessa primeira parte, eu falo um pouco sobre os aspectos teóricos que circundam o processo de aperfeiçoamento contínuo que se estabelece em um projeto ágil. Na segunda parte, falarei sobre formas e modelos de aperfeiçoamento para uso na prática.

Alguns trechos do artigo que acho serem importantes para discussões sobre o tema:

    - Sobre o ciclo Especulação, Colaboração e Aprendizado do Jim HighSmith no contexto do auto-aperfeiçoamento. 

"No contexto do aperfeiçoamento contínuo, a percepção adequada desse entendimento gira em torno de  saber que para ter um processo que seja melhor hoje do que ontem, é necessário (1) especular sobre algo que precisa ser melhorado  (2) colaborar para que tal melhoria seja alcançada e (3) aprender e incorporar a melhoria conquistada."

- No fundo...

"...o processo de melhoria contínua gira em torno de, dentre outras coisas, buscar melhores maneiras de (1) aumentar  a quantidade do tempo em que a equipe está envolvida com atividades que geram valor para o cliente por meio de software funcional; e (2) de aumentar a qualidade do tempo em que a equipe está envolvida com atividades que visem garantir as condições de segurança, estabilidade funcional, compreensibilidade e manutenibilidade do software que está sendo desenvolvido."

     - O PDCA e seu padrão sistêmico

"Em projetos ágeis, é o padrão sistêmico de adaptação e aperfeiçoamento que faz a equipe controlar o processo, evitando que o processo controle a equipe.  Entender o ciclo PDCA e identificar seu funcionamento dentro do projeto é fundamental, pois ele estabelece esse padrão sistêmico cujo resultado é a incorporação de pequenos elementos de controle sobre a complexidade do projeto. É o padrão que garantirá a sustentabilidade do projeto a longo prazo."

- O entendimento da Toyota

"A Toyota (...) enxerga o rendimento de um sistema (no nosso caso de um projeto) segundo uma rede complexa de influência dos chamados “elementos de avaliação primários” (...) Em seu modelo de melhoria contínua (o kaizen), toda e qualquer ação de resolução de problemas é executada por meio do entendimento de suas influências nos elementos de avaliação primários."

 - A relação entre qualidade e aperfeiçoamento contínuo

"A qualidade é como um fluido que deve ser colocado para lubrificar cada engrenagem do processo. Uma engrenagem sem o fluido será um potencial ponto gerador de defeitos." 

 Ao fim do artigo, eu tento descrever um cenário real onde o entendimento sistêmico poderia criar um diferencial na hora de se colocar em prática questões de aperfeiçoamento. Mas aí é melhor ler o artigo para saber exatamente do que esse exemplo trata.

 A idéia da segunda parte desse artigo é entrar nos modelos utilizados para auto-aperfeiçoamento atualmente. Descrever práticas de retrospectiva e as práticas utilizadas pela Toyota para fazer essa roda de melhoria contínua girar a favor do projeto.

  Espero que seja útil para aqueles que querem implantar um poderoso ciclo de melhoria contínua em seus projetos. 

A "semente original" do movimento ágil

by alisson.vale 17/1/2008 20:14:00

Sempre achei que toda essa filosofia ágil a qual estamos nos acostumando tinha algum modelo teórico comum. Mas sempre me pareceu estranho que este modelo fosse definido apenas por meio dos princípios surgidos com o Manifesto Ágil em 2001. A grande dúvida é: Em quê tais princípios se baseiam? São resultado apenas de experiências empíricas sobre melhores práticas ou tem algum fundamento teórico original?

Como já havia comentado no tópico anterior, recentemente tenho estudado bastante o trabalho de Jim Highsmith sobre como à partir de conceitos extraídos da teoria de sistemas complexos adaptativos é possível redefinir todas as nossas estratégias de abordagem em projetos de software. Desde então, minhas suspeitas recaíram sobre essa teoria a ponto de considerá-la a "semente original" do movimento ágil.

A confirmação veio quando li um recente post do Jeff Sutherland na qual ele esclarece exatamente este ponto. Na verdade, a motivação do seu post foi estabelecer a correta relação entre Scrum e Lean. Qual a relação entre as duas filosofias de gestão mais comentadas atualmente?

Em seu artigo, Sutherland não só confirma e detalha as bases teóricas sobre as quais o Scrum foi concebido, como também comprova a relação teórica intencional com os sistemas complexos adaptativos. Clicando aqui você terá acesso a discussões originais dele com outros membros de comunidades de desenvolvimento ainda em 1994, incluindo Robert Martin e Kent Beck (que percebe-se nesse momento já estar trabalhando na elaboração teórica de seu método).

Muito do que se sabe hoje sobre Lean teve também origem nos conceitos teóricos sobre sistemas complexos adaptativos. Ainda em 1986, Nonaka e Takeushi publicaram um dos primeiros trabalhos sobre essa nova forma de lidar com projetos no livro intitulado The New Product Development Game. O termo Lean só veio a aparecer em 1990 com a publicação do livro The Machine that Changed the World (James Womack et al), mas os princípios teóricos se mantiveram.

Em resumo, tudo o que sabemos sobre o modelo ágil de trabalho deriva dos sistemas complexos adaptativos. E estudá-los é uma boa forma de entender como e porquê eles funcionam.

Projetos Ágeis e os 12 Pontos de Alavancagem Sistêmica

by alisson.vale 10/1/2008 10:27:00

Já a algum tempo venho estudando um pouco sobre teoria de sistemas e sobre suas influências no modelo ágil para desenvolvimento de software. Especialmente no que diz respeito aos trabalhos do Jim Highsmith e do seu método adaptativo.

Recentemente, durante esse estudo, me deparei com o trabalho de Donella Meadows sobre os 12 pontos de alavancagem sistêmica e vi muita convergência com os princípios e práticas relacionados a abordagem ágil para projetos de software.

Pesquisei um pouco e achei aqui um pequeno texto sobre esse assunto adaptado a área de software, mas achei bastante superficial. Resolvi então juntar alguns textos que tinha escrito sobre análise sistêmica em projetos de software e produzir um artigo.

Espero que seja proveitoso para todos. 

Projetos Ágeis e os 12 Pontos de Alavancagem Sistêmica.pdf (573,53 kb)

O Paradigma Ágil

by alisson.vale 6/11/2007 14:52:00

Como ando recebendo alguns pedidos para envio do material que utilizei na palestra que ministrei no evento JavaBrasil, optei por publicar a apresentação aqui.

O título da palestra foi "O Paradigma Ágil". A apresentação foi baseada em uma compilação do livro de mesmo nome que estou escrevendo e na qual discuto temas teóricos que embasam os conceitos utilizados em projetos ágeis. A idéia do livro é descrever a mudança pela qual as atividades de desenvolvimento de software vêm passando desde o lançamento do Manifesto Ágil sob a ótica da teoria de "Mudanças de Paradigmas" e "Revoluções Científicas" proposta por Thomas Kuhn em 1965.

A teoria de Kuhn descreve o processo de evolução do conhecimento humano não como fator resultante do acúmulo linear de descobertas ao longo do tempo, mas, como é dito no livro "por meio do surgimento de um novo volume de idéias, percepções, circunstâncias intelectuais, possibilidades e estratégias disponíveis para especialistas de uma determinada ciência ou disciplina em um dado momento". Em outras palavras, o conhecimento humano evolui quando uma nova perspectiva pela qual determinado assunto pode ser explicado é teorizada, aplicada e provada empiricamente.

Para explicar como se dá esse mudança no contexto do modelo ágil para desenvolvimento de software, é preciso entender de onde vem cada um dos conceitos sobre a qual o movimento está embasado, como eles se relacionam e o qual o efeito esperado em se juntá-los na direção de formar um novo modelo produtivo mais eficiente.

E é nesse ponto que precisamos ser capazes de tecer toda a teia de conceitos que definem a natureza do movimento. Estamos falando de, entre outras coisas, Qualidade Total, Controle Estatístico de Processos, o Modelo Lean, Sistemas adaptativos complexos, Pensamento Sistêmico e princípios de liderança e gerenciamento modernos que juntos estabelecem a essência do paradigma ágil: a criação de sistemas adaptativos controlados pelas próprias pessoas que o compõe.

Apresentacao_O_Paradigma_Agil.pdf (485,62 kb)

Metas impostas versus aperfeiçoamento sistêmico

by alisson.vale 26/10/2007 01:42:00

Em desenvolvimento ágil, é muito comum as equipes estabelecerem uma espécie de "comprometimento de sangue" com seus clientes em se entregar tudo que foi planejado no início de uma iteração. Pode haver muita boa vontade nisso, mas certamente é uma prática pouco eficiente. Mas porquê é ruim criar um compromisso para entregar o que foi planejado? Quando um compromisso é estabelecido, não cumpri-lo pode resultar em frustração tanto do cliente quando da equipe e de sua liderança. O que ocorre na prática é que não há garantia de que os requisitos planejados no início de uma iteração realmente poderão ser concluídos até o seu final. 

Se a liderança do projeto, ou o cliente, estabelecerem uma relação de cobrança para com a equipe no que diz respeito a entrega ao fim de uma iteração dos requisitos planejados e acordados no seu início, fatores indesejáveis poderão atuar negativamente no processo, entre eles: (1) o aumento de trabalho over-time e do stress no dia-a-dia de trabalho; (2) a equipe começa a super-estimar as features com medo de assumir compromissos irreais (3) a  qualidade pode começar a ser sacrificada; (3) relaxamento na execução das práticas e (4) em um atraso iminente, a equipe começa a evitar o acionamento do cliente para obtenção de feedback (pois isso pode significar mais trabalho para ser entregue no mesmo tempo).

O que fazer então? Sem metas rígidas, como gerar ritmo e obter alguma previsibilidade no projeto? O segredo é não tentar impor controle sobre o processo, mas estudá-lo e observá-lo com o intuito de se ganhar a capacidade de aperfeiçoá-lo sistemicamente. O objetivo é conquistar (e não controlar) o ritmo e a previsibilidade desejada. Se as metas de implementações para a iteração continuamente não são alcançadas, pode ser que:

  • As metas estão sendo mal-definidas (consciente ou inconscientemente). Normalmente devido ao desconhecimento da capacidade real de produção da equipe. Às vezes tenta-se impor metas mais arrojadas para tentar puxar o ritmo da equipe, mas o resultado acaba sendo pior;
  • Os requisitos foram insuficientemente explorados durante a reunião de planejamento. Apesar de não ser uma boa prática detalhar em excesso o que será desenvolvido, é importante conhecer o suficiente sobre o que será desenvolvido, de modo a diminuir a margem de erro nas estimativas. Isso pode ocorrer quando as reuniões de planejamento são rápidas de mais ou muito superficiais;
  • Eventos não planejados (veja "variações especiais" mais a frente no texto) ocorreram durante a iteração diminuindo a capacidade de produção da equipe.

Em todos os 3 casos, a culpa não é da equipe. Não adiantará, portanto, pressioná-la ou influenciá-la para produzir mais. Todo o projeto é um sistema. Sistemas que produzem abaixo do esperado, o fazem devido a causas sistêmicas, não pela existência de um ou mais "culpados".  Todo o sistema tem um rendimento e esse rendimento, segundo Deming, sofrerá de variações causadas por causas comuns ou por causas especiais. Especialmente quando falamos em projetos de software, há variações inerentes ao sistema e há variações especiais  que tornam seu rendimento imprevisível, mas controlável. O ato de medir esse rendimento continuamente gera o controle estatístico necessário para nos dar a condição de prever resultados com muito mais acuracidade do que os planejamentos adivinhatórios e impositivos que estamos acostumados a  ver. Assim, as expectativas devem ser trabalhadas com base em medições e não com base em compromissos irreais.   

Durante o estudo e a observação do sistema da qual faz parte o projeto, será possível detectar variações especiais, removê-las e, assim, otimizar seu rendimento. Quando todas as variações especiais forem removidas, o sistema poderá ser otimizado como um todo e, aí sim, haverá uma melhoria substancial na sua capacidade de avançar com mais velocidade, mantendo o alto nível de qualidade desejado.  Um projeto observado e aperfeiçoado com uma visão sistêmica pode oferecer muito mais controle e previsibilidade do que um projeto gerenciado com metas impostas de cima para baixo. 

Entendendo Qualidade em Projetos Ágeis

by alisson.vale 4/10/2007 01:35:00

Talvez as questões de garantia de qualidade estejam dentre os assuntos mais misteriosos para aqueles que ainda estão começando a trilhar os primeiros passos em métodos Ágeis. Muito se fala em testes de aceitação, TDD, testes unitários, mas é só isso? Qualidade em projetos ágeis se assegura somente com testes automatizados?

A resposta é não. Essas técnicas são importantes, mas há todo um universo conceitual por trás dos projetos ágeis que poderão lhe ajudar a não só explicar como isso se dá, mas também a aplicar pequenas melhorias que podem causar grande repercussão no seu processo. 

O primeiro ponto a se entender é que qualidade é um meio não um fim. A idéia é não procurar montar um processo cujo objetivo seja gerar um produto de qualidade. O ideal é fazer com que a própria busca pela qualidade oriente a formação do seu processo.

A forma como um projeto ágil lida com qualidade está muito sintonizada com as idéias de Edward Deming e com o modelo de administração e gerenciamento oriental (muito influenciado por ele). O modelo ocidental lida basicamente com o uso de inspeções em massa para assegurar qualidade. O mesmo modelo é utilizado pelos processos tradicionais de desenvolvimento de software. A idéia é mais ou menos a seguinte: Depois que está tudo pronto, vamos testar pra ver se funciona. Talvez por isso a idéia de se criar testes antes de se escrever o software seja considerada tão "excêntrica" por aqueles que ainda não conhecem a abordagem ágil. O modelo mental de se testar só depois que algo é considerado pronto é muito forte. Não foram poucas as vezes que eu ouvi me dizerem: "Mas pra quê eu vou testar agora se ainda não está pronto?"

Assim, para entender como se garante qualidade em projetos ágeis, há 5 pontos que acho serem fundamentais:

1. Não depender de inspeções para garantir qualidade: Se você inspeciona seu software com a expectativa de encontrar defeitos, seu processo ainda não tem qualidade. Então, invista em qualidade durante a produção, não depois. Inspeções são ineficientes porque não previnem o problema, apenas o encontram. Em quê ajuda encontrar um erro em uma inspeção? O erro já está lá! Inspeções são necessárias, certamente não vamos conseguir viver sem elas tão cedo. Mas encontrar erros em uma inspeção no final do processo é desperdício. Considere que há duas maneiras de evitá-las ou reduzir a dependência que você tem delas:

  • Inserindo qualidade no produto. Aqui entra a figura dos testes automatizados.
  • Antecipando as inspeções de modo que elas aconteçam antes que um defeito seja inserido no produto. Como? Muitas práticas ágeis já ajudam muito, cada uma da sua forma: Integração Contínua, times multi-disciplinares, shared workspaces,  daily meetings, pair programming, TDD, code e design Inspections e outras. Cada prática dessas traz consigo uma diferente forma de inspeção. Você também pode ajudar fazendo testes durante o processo de produção, não depois. Um exemplo é chamar alguém para testar o que foi feito, antes que o software saia da máquina do desenvolvedor. É o melhor momento para se encontrar um problema.  Se deixarmos pra testar tudo no final de uma iteração, as chances de não entregar nada no final são grandes.

2. Valorize a prevenção, não a detecção. Encontrar um defeito não pode ser algo comum. O processo de prevenção deve ser revisado imediatamente. A equipe não deve ir adiante enquanto houverem defeitos. Há várias formas de se trabalhar com prevenção, uma delas é a automação. Por exemplo, automatizar o deploy e a instalação do seu software é investir em prevenção. Um grande número dos problemas encontrados em ambientes fora da fronteira da equipe estão associados às configurações necessárias para se instalar e rodar o software produzido. Os próprios desenvolvedores devem ser capazes de incorporar os recursos que ele precisa para ser instalado. Assim, é o desenvolvedor que tem que indicar que scripts de banco devem ser rodados e que arquivos de configuração devem receber novas entradas. É comum o uso de uma gerência de configuração para isso. Mas é desnecessário quando há automação. Aqui no nosso projeto, o próprio desenvolvedor que produziu a funcionalidade configura tudo que será preciso ser executado quando da instalação do software. A automação elimina a necessidade de intermediação. Isso aumenta a qualidade porque elimina mais um hands-off do processo.

3. Não confie nas especificações como forma de garantir satisfação dos usuários. Se seu projeto ainda está atrelado à necessidade de se desenvolver para atender uma especificação, saiba que elas não são capazes de contar toda a história. Especificações não são bons instrumentos para descrever como um software deve funcionar. A melhor maneira de aumentar a qualidade que o seu cliente percebe no seu produto é envolvendo-o no processo. Ciclos de feedback geram aprendizado, confiança e ajudam o usuário a encontrar a melhor solução. Seguir uma especificação é separar o problema da solução e direcionar o cliente para apenas descrever o problema, enquanto você fica responsável pela solução. O ideal é que o problema e a solução estejam no mesmo contexto, e que eles sejam trabalhados em conjunto. Se, de alguma forma, o cliente contribuir para a solução, ele não só ficará mais satisfeito, como também se tornará seu cúmplice e o ajudará nos momentos difíceis pelos quais você pode chegar a passar.

4. Qualidade não se controla, se incorpora. Em caso de equipes de projeto, não acredito que bugs aparecem por causa de desenvolvedores ruins (talvez problemas de design ou de performance apareçam por causa de desenvolvedores ruins). Bugs aparecem porque a falta de qualidade do processo permitiu. Assim, medidas de punição ou recompensa, ou qualquer outra abordagem top-down para tentar reduzir bugs não funcionam a longo prazo. É injustificável ficar tentando controlar algo tão precioso - como é o caso da qualidade - quando é possível incorporá-la ao seu dia-a-dia.   

5. Treine a aquisição de habilidades, não o uso dos instrumentos. As pessoas são capazes de se tornarem multi-disciplinares. Basta treiná-las para isso. Você vai incorporar qualidade ao seu processo na medida que investe nas pessoas para que elas adquiram novas habilidades. Assim, treine:

  • modelagem, não UML;
  • padrões de arquitetura, não Webservices;
  • design, não novos recursos da IDE;
  • programação pragmática, não novos recursos de linguagem;
  • a especificar testes, não a usar ferramentas de testes;

Enquanto que os itens a esquerda geram novas habilidades nas pessoas, os itens a direita podem ser resolvidos com 20 minutos de pesquisa no google.

Documentos Executáveis

by alisson.vale 20/9/2007 23:14:00

Documentação em projetos ágeis sempre foi um assunto muito polêmico. Há ainda muita gente que a considera um mal necessário. Talvez não seja muito difícil definir uma boa estratégia de documentação se houver um pouco de bom senso e criatividade. Como disse Scott Ambler, um projeto ágil persegue dois objetivos. (a) Objetivo primário: Entregar software funcionando (b) Objetivo secundário: Dar sustentabilidade para o próximo esforço.

Documentação tem haver com o objetivo secundário. O fato de ser secundário não o faz ser menos importante. O fato é que cada documento que uma equipe deve gerar tem um custo, e esse custo tem que ser muito bem dimensionado com relação ao benefício que ele causa.

Um dos principais problemas da documentação é ela não estar atualizada. Uma boa abordagem para incentivar sua atualização é mantê-la o mais integrada possível com os outros artefatos que o desenvolvedor ou a área de qualidade trabalham no seu dia-a-dia. Assim será fácil e prazeroso mantê-la atualizada. Um exemplo disso pode ser observado na figura 1 (É melhor clicar na imagem para vê-la melhor). Ela representa um documento executável.

docexe  
Figura 1: Exemplo de um documento executável

Na verdade, trata-se de um documento para execução de testes web com o Selenium, mas ele tem algo mais dentro dele. Há comandos que não são interpretados pelo Selenium, mas por um outro tipo de parser que pode ser utilizado para transformar o documento em um outro artefato; fazendo-o servir para diferentes propósitos, como por exemplo, uma especificação funcional, um caso de uso ou até um manual de usuário. No exemplo da Figura 1, pode-se notar na coluna parâmetro I, que há comandos que serão executados para a criação automatizada de um manual ou de uma especificação (spec) ou de ambas (manual, spec). Diferentes outputs podem ser gerados dependendo de onde o documento será visualizado: pdfs, documentos words, ou ainda podem ser diretamente publicados em portais ou wikis. Veja, na Figura 2, qual seria o resultado desse documento publicado no mediawiki.

Documento executável transformado 
Figura 2: Visão do documento executável já
transformado em uma página wiki

Repare também que o documento pode ser diretamente mapeado com o sistema de issue tracking. No caso desse exemplo, por meio de uma integração do Mantis com o MediaWiki. O documento pode comportar também links para outros issues relacionados, bem como outros documentos executáveis. Trata-se de uma forma bem interessante de manter os documentos vivos, fazendo parte efetiva do processo de desenvolvimento. 

Scrum e Issue Tracking na Moda

by alisson.vale 3/9/2007 00:23:00

No início desse mês foi divulgada a pesquisa anual realizada pela VersionOne em conjunto com a APNL (Agile Project Leadership Network) sobre a situação atual do Desenvolvimento Ágil no mundo. Foram mais de 1700 entrevistados em 71 países. Pelo menos 30% dos entrevistados atuam em empresas com mais de 250 funcionários.

A pesquisa não serve para avaliar a penetração dos métodos ágeis no mercado de TI de modo geral, mas dá uma idéia de como as pessoas os têm implementado em suas empresas.

Dois números me chamaram a atenção:

  1. O Scrum aparece em aproximadamente 70% dos projetos como metodologia utilizada; ou sozinha, ou associada a alguma outra, como XP por exemplo.
  2. 82% dos entrevistados afirmaram usar uma ferramenta de issue tracking em seus projetos. Em termos de ferramenta, é o maior percentual, ganhando de ferramentas de testes e de integração contínua. Isso certamente é reflexo da simplificação no uso de ferramentas que os métodos ágeis propiciam.

Porquê Scrum?

Eu justificaria essa adoção em massa ao Scrum, analisando os seguintes pontos:

  • O Scrum é muito simples de entender e é um ótimo primeiro passo para a entrada no mundo Ágil;
  • Seu público-alvo é formado por quem tem poder de decisão para influenciar seus projetos (gerentes e líderes)
  • É muito bem documentado;
  • Não sugere práticas que gerem resistência inicial;
  • Não interfere diretamente nas práticas de desenvolvimento já utilizadas pela equipe que o adota;
  • E aquilo que eu acho que teve o maior peso: Hoje o Scrum já movimenta um mercado de consultorias, treinamentos, certificações, eventos e papers. E tal mercado vem sendo muito bem administrado pela Scrum Alliance.

Apesar das críticas iniciais ao modelo de certificação utilizado pela Scrum Alliance, minha impressão é que é esse modelo que vem trazendo cada vez mais pessoas e empresas para buscarem conhecimento e treinamento sobre o assunto. Hoje as empresas não costumam apostar seu futuro em algo que não seja apoiado por algum tipo de empresa ou instituição atuante.

Talvez seja uma boa lição para outras metodologias e para a própria Agile Alliance. Apesar de haver a necessidade legítima de se manter a natureza "open-source" do movimento, é importante que alguma instituição sem fins lucrativos possa servir de referência comercial para o mercado em geral.

O DSDM tem um modelo semelhante, mas o seu Consortium bem estruturado não foi capaz de vencer uma maior complexidade conceitual da metodologia e sua atuação mais contundente em alguns países europeus.   

É um tema polêmico, eu sei. Mas se deu certo para o Scrum, porque não daria para as outras metodologias?

Planejando Projetos Ágeis

by alisson.vale 17/8/2007 02:31:00

http://www.mountaingoatsoftware.com/presentation/access/51

Essa é uma apresentação que eu gostaria muito de ter visto. É impressionante como o Mike Cohn tem um dom para falar sobre estimativas.

Nessa apresentação eu destaco o "The Planning onion", uma metáfora muito bem formulada para explicar os níveis de planejamento em uma abordagem Ágil.

onionplanning

Um time Ágil planeja em três níveis. Um release planning representa um planejamento de médio e longo prazo. A cada iteração há um planejamento de curto prazo e todos dias um planejamento de curtíssimo prazo (por meio dos Daily Meetings). Com base nisso, os clientes (em seus vários níveis) montam suas estratégias de portifólio e produto.

A parte da apresentação que fala sobre release planning também é excelente. A idéia das múltiplas visões para análise e observação do release planning também vale o ingresso.

multipleviews  

Pra terminar, há um podcast disponível em http://www.controllingchaos.com/?p=88 para quem quer ouvir um pouco sobre suas idéias.

Sobre o Autor

Alisson Vale Alisson Vale
Líder de Projeto da Phidelis Tecnologia.


E-mail me Send mail
      Sign in

Últimos posts

Últimos comentários

Termo de Responsabilidade

Este site apresenta apenas opiniões pessoais. Não necessariamente representa as opiniões ou práticas da Phidelis Tecnologia.

© 2008