Posts Tagged ‘equipe’

Prática: faça revisões arquiteturais regularmente

12 de agosto de 2010

Sintoma: durante o desenvolvimento de um sistema, a equipe percebe a necessidade de mudar algum aspecto arquitetural. Como a arquitetura é a parte mais difícil de se mudar no software, o custo atrelado também é alto. Após o término do projeto, descobre-se que outras equipes já haviam passado por problemas semelhantes e sabiam que a primeira alternativa era ruim para o sistema.

Ação: sempre que um projeto é concluído, aproveite o espaço de almoço de um dia da semana seguinte para apresentar a evolução do sistema e da arquitetura para todos os interessados.

Almoço na Caelum

Momento de descontração.

A revisão não é um momento de busca de aprovação, mas de compartilhar os problemas de alto nível passados pela equipe, por exemplo:

a) entre as 3 ferramentas que suportam serialização em Ruby que utilizamos durante os últimos 6 meses, quais os problemas que cada uma apresentou

b) não era esperado mas a adoção de um estilo arquitetural determinado implicou na perda de escalabilidade

c) a atualização de uma biblioteca após o primeiro release foi compensada na produtividade da equipe após 3 meses, ou simplesmente não compensou e voltamos a utilizar a antiga

d) a adoção da prática de deploy contínuo permitiu disponibilizar 30 novas features por mês para os clientes

Deploy contínuo

Pipeline de deploy contínuo existente desde 2008

A revisão arquitetural permite que o conhecimento adquirido em projetos anteriores possa ser reutilizado em projetos posteriores, uma propriedade coletiva – a arquitetura ou até mesmo o processo – assim como a prática de programação pareada faz o mesmo com menor granularidade: o código.

Em projetos de longa duração é natural que as evoluções continuem acontecendo, portanto faça apresentações regularmente das mudanças arquiteturais.

Anúncios

Um produto por semana

30 de março de 2010

Para atender a demanda de um cliente decidimos aplicar uma técnica de criação rápida de um produto. Ele precisava de uma ferramenta de otimização de feeds e widgets, permitindo encontrar novos parceiros – indo um passo a mais de distância que o Urchin ou Analytics.

Duas semanas depois, o Probe estava no ar atendendo as requisições internas e gerando estatísticas importantes sobre parceiros de qualquer empresa. Mas o que permitiu entregar um produto tão rápido?

Fugindo do brainstorm

A idéia do produto já havia sido discutida internamente na Caelum entre diversas pessoas, o que amadurece a mesma, permitindo cortar idéias não triviais que seriam danosas a uma primeira entrega. Esse período não foi um brainstorm onde determinadas pessoas sentam numa mesa e discutem ao máximo determinado assunto, tentando chegar na visão ótima do que seria seu produto. Pelo contrário, isso não seria nada ágil.

Não existe e consequentemente é impossível alcançar algo perfeito, adaptamos o que temos para chegar o mais próximo do idealizado.

Discutir no dia a dia a idéia com diversas mentes que entendem um pouco ou muito do assunto amadurece aos poucos a visão que temos do produto.

A interface

Por mais que alguns projetos com os quais os usuários interagem possam ser tocados sem wireframe, para evitar dúvidas pontuais de CSS, usabilidade etc, utilizamos um design pronto (simples, intuitivo e direto), economizando tempo de pesquisa e encaixe pois as lógicas já eram criadas no design final.

Fazer o mínimo possível

Com o design em mãos e uma visão razoável do que queremos, escolhemos as funcionalidades mínimas para ter um produto que entregue algo que os produtos similares (Feedburner, Analytics etc) ainda não fazem. Essas funcionalidades, um subconjunto de histórias, foi definido como o objetivo ideal de entrega: o que deixaria o produto um passo a frente dos concorrentes.

Além disso, o PO possuia uma data de entrega, quando o sistema deveria estar no ar, que só ele conhecia. E aí entra a questão: se a data e o escopo estão fixos, perderemos qualidade.

Excluindo funcionalidades

Para fugir da perda de qualidade, o escopo era ideal, mas não fixo. Se fosse possível entregar tudo o que o PO desejava, ótimo, se não, ele deve estar pronto para lidar com o que foi entregue. Durante essa fase, o PO é capaz de rejulgar o escopo.

Após poucos dias, algumas funcionalidades foram cortadas, pois ficou claro que a ferramenta já entregaria valor suficiente com menos do que originalmente pensado para o primeiro release.

Excluindo funcionalidades

Mais alguns dias e novamente outras funcionalidades se apresentaram desnecessárias, junto com a maior importância na data de entrega do que no escopo a ser entregue. Com isso, menos funcionalidades (menos valor) seriam feitas, mas teríamos um produto que retorna valor em breve.

Priorizando o backlog

Priorizar o backlog adequadamente foi outra ação fundamental para entregar o máximo de valor possível no produto desenvolvido.

Excluindo funcionalidades

A equipe não possui um comprometimento com um escopo em uma data específica, portanto é responsabilidade do PO escolher o que é melhor ser entregue nesse período, isto é, priorizar corretamente.

Foram mais de duas vezes durante o período de desenvolvimento que cortamos funcionalidades. Em todas elas ganhamos tempo pois entregaríamos algo usável antes do planejado.

Equipe mínima

Em um início de produto tão rápido, é necessário manter uma equipe pequena pois qualquer burocratização do dia a dia de desenvolvimento levaria tempo demasiado para encaixar-se nas poucas horas. No nosso caso, existiam dois desenvolvedores e sentimos que em um grupo de até três, talvez quatro, seria possível fazer um trabalho similar.

Qualidade

Apesar de usar as práticas mais educadas possíveis, houve uma queda na qualidade, algo que o PO teve que pesar: após as 64 horas de desenvolvimento (2 pessoas, 4 dias úteis), tivemos mais 60 horas para investir somente em testes e refatorações.

A partir daqui, o desenvolvimento deve ser feito seguindo todas as práticas que acreditamos, sem margem para entregas rápidas como essa primeira pois a complexidade desse trabalho aumenta muito.

Pareamento e isolamento

A equipe se manteve razoavelmente distante de outras equipes de desenvolvimento e combinou pareamento com programação não pareada. Houve um equilíbrio de forças, misturando a propriedade coletiva do código com a produtividade que foi necessária. Novamente, após essa primeira entrega, abrir mão do pareamento se torna inviável.

Cliente ao lado

A qualquer instante os desenvolvedores tinham acesso ao PO e o cliente, tomando alguns cuidados. Esse é um ponto a ser defendido a todo custo se a entrega de uma versão inicial seguirá esse padrão. A qualquer instante o cliente poderá remover histórias desnecessárias ou solucionar problemas.

Na continuidade do projeto, isso já se torna diferente, uma vez que não esperamos re-priorizações dentro de sprint ou um cliente 100% liberado para os desenvolvedores.

Outros

Existem daily meetings, feedback rápido etc, como as práticas ágeis defendem.

A entrega

Após ter entrado em produção notamos que o tempo todo de desenvolvimento, o foco estava voltando na entrega de algo utilizável, algo com valor para o cliente, que no dia seguinte já poderia colocar em produção.

Deixamos um front end aberto da aplicação para quem desejar visualizá-lo, apesar do back end envolver funcionalidades ligadas com REST, feeds, widgets etc que não estão visíveis no mesmo.

Resumindo

O primeiro release de um produto pode ser feito com práticas ágeis que fujam um pouco da qualidade máxima que tentamos atingir, viabilizando uma entrega rápida – mas não necessariamente ágil a todo instante – e valiosa.

Mas nada disso serve como desculpa para manter o desenvolvimento do produto dessa maneira posteriormente: a preocupação com a qualidade deve voltar ao máximo e a partir desse instante um método de desenvolvimento mais formal (como Scrum, Lean etc) deve ser seguido.

Post criado junto com o Thiago Ferreira da Caelum.

Tarefas técnicas possuem valor para o product owner?

9 de março de 2010

Na última turma de Agile e Scrum que ministrei, assim como nos diversos projetos que atuei desde 2005 com alguma metodologia ágil (xp, scrum ou lean), a questão das tarefas técnicas e seu valor para o cliente sempre apareçe.

Sonhando sobre o assunto, como de costume, encontrei uma resposta mais objetiva, menos subjetiva do que a abordagem tradicional, o clássico sim ou não.

O objetivo do PO

Como PO, o mais importante é a entrega de um produto que adicione valor ao que meu cliente utilizará, permitindo ganhar mercado contra meus concorrentes ou cobrar um valor mais alto pelo meu produto ou serviço.

Toda e qualquer história que não tenha como resultado final – direto ou indireto – aumentar o retorno do produto para minha empresa não possui valor.

E é esse o conceito objetivo que utilizamos na hora de aceitar e priorizar histórias técnicas: se ela não permite um retorno nesse instante ao meu produto, ela pode ser postergada.

Visto o último post que indica a importância da priorização adequada em relação ao retorno ganho, a execução de histórias técnicas sem retorno ao negócio poderiam atrasar ainda mais o sucesso do último.

Exemplo 1: Requisitos não funcionais

Quando tratamos de requisitos não funcionais, como por exemplo escalabilidade, foque em objetivos claros. Exemplificando, se os seus desenvolvedores indicam a necessidade de migrar seu banco de dados relacional para uma estrutura baseada em documentos pois o mesmo “agüenta mais usuários”, peça uma meta mais objetiva.

Primeiramente, a necessidade de atender mais usuários deve surgir de seus clientes, reclamando por mais performance em picos de uso, ou de você mesmo – prevendo um aumento de seus clientes em uma futura propraganda do sistema, por exemplo.

Supondo que o pedido surgiu de uma necessidade do produto, agora está na hora dos desenvolvedores criarem um spike – uma experiência para medir o possível sucesso de tal abordagem – e então retornarem com uma média esperada de melhora na escalabilidade do sistema (ou em outro requisito não funcional qualquer).

Tanto o spike, quanto a execução da tarefa técnica, com uma avaliação objetiva de seu sucesso (i.e. atender a X page views por segundo, respondendo em menos de 5 segundos), são histórias para seu backlog, pois ambas agregam valor a seu produto: se você não executá-las, seus possíveis e atuais clientes migrarão para os concorrentes.

Exemplo 2: Outras histórias técnicas

Por vezes as histórias técnicas que surgem não estão ligadas a requisitos não funcionais. Um exemplo é a instalação de um servidor de homologação e processo de homologação e deploy contínuo no estilo devops, fugindo do estilo tradicional, menos ágil, de operações. O que fazer?

Novamente, a equipe de desenvolvimento deve mostrar para o PO que tal história possui valor, e o PO priorizar de acordo com o valor mostrado.

O argumento a ser utilizado, no exemplo acima, estaria relacionado a velocidade de entrega de valor. Se a média dos últimos sprints tem sido de 20 pontos devido a bugs que são encontrados somente em produção, pois a máquina dos devs e de homologação está muito diferente das configurações reais, deixe claro que essa média poderá aumentar, uma vez que os bugs invalidadores de história serão encontrados antes e, com o passar dos sprints, X pontos que são utilizados agora para implementar tal processo serão retornados.

Existe valor na história técnica?

Em suma, histórias técnicas podem entrar no Backlog de maneira benéfica para seu produto, mas não se deve aceitar qualquer história. Ela deve ser julgada e priorizada de acordo com o valor que a mesma agrega ao seu negócio, e é responsabilidade dos desenvolvedores – seus clientes técnicos – mostrarem tal valor para o PO.

É importante ressaltar que qualquer tipo de debito técnico grande pode ser explicado de uma maneira que adicione valor ao produto, pois diminui a velocidade de entrega de retorno. Mas se o débito for muito pequeno, ele pode ser executado dentro do sprint, no dia a dia.

Exemplo 3: E na Caelum?

Em projetos internos da Caelum, temos uma preocupação que é incomum as empresas de desenvolvimento. A transferência de conhecimento entre instrutores e consultores tem que ser realçada, assim como o estudo de novas tecnologias e práticas de desenvolvimento.

Sendo assim, histórias envolvendo o aprendizado entregam valor direto para nosso negócio e acabamos por aceitá-las ou até mesmo colocá-las dentro do backlog.

Não se isole do resto de sua equipe

Os dois lados, PO priorizando valor, e desenvolvedores que priorizam qualidade, devem ser capazes de entender a necessidade do outro: não existe equipe auto gerenciável onde PO e desenvolvedores são inimigos, ambos fazem parte da mesma equipe.

PO, você anda colocando histórias de qualidade, spikes etc em seu backlog?

E você desenvolvedor, anda deixando claro para seu PO o retorno que o mesmo obtém ao priorizar tais tarefas e o comprometimento com um resultado objetivo?