XP

Extreme Pair Programming

É importante destacar, antes de mais nada, que programação em pares é uma das responsabilidades sua como desenvolvedor em XP. Não cabe ao seu chefe, à sua organização muito menos ao seu cliente interferir nessa sua decisão de qual dessas práticas no centro do diagrama você vai utilizar ou não. Então da próxima vez que alguém disser: “eu não faço programação em par porque meu chefe não deixa” mostre esse desenho abaixo e peça para ele repensar o assunto.

xp practices

Eu sempre começo meus textos com definições. Elas ajudam a entender melhor do que estamos falando e quando eu for contar os meus causos a coisa fica um pouco mais clara. Já que é assim, precisamos entender dois conceitos importantes antes de continuar. O de par e o de programação. Para começar, o par é um conjunto com dois elementos de mesma natureza, mesma espécie. Duas criaturas semelhantes juntas então formam um par. Já programação é o ato de elaborar um programa de computador. Assim, criamos código para solucionar os problemas do mundo. De maneira mais bonita é mais ou menos isso o que fazemos. Bom, então estamos falando de duas criaturas da mesma espécie trabalhando na mesma solução de um problema, no caso através de um código de computador.

Uma das maneiras que mais vejo o pessoal usando para explicar é a metáfora do piloto e navegador. O piloto, responsável pelo controle da aeronave, deve ficar atento aos controles, como dirigir para que tudo flua bem. Já o navegador é o responsável pela rota, verifica o caminho, observa aqueles controles que estão fora do campo de visão do piloto e ajuda na difícil tarefa de levar a aeronave em segurança. Na nossa prática é muito semelhante. A diferença fica que fazemos alternancias entre os papéis de tempos em tempos. Ora você é o piloto, ora você é o navegador. Usualmente o que tenho visto são duplas fazerem isso em ciclos de 15 minutos para a troca, mas não há um consenso sobre o assunto então combine entre vocês qual o tempo que lhes é mais confortável.

A prática em si é essa, alternancia de controles entre piloto e navegador, enquanto navega o desenvolvedor tem um foco um pouco mais amplo ao mesmo tempo que o piloto está focado na escrita da sua ideia de melhoria no código. Existem alguns mitos sobre programação em pares. Vamos falar de alguns.

  • Improdutivo: se medido num curto espaço de tempo, a impressão que se tem é que realmente programar em par é improdutivo e portanto mais caro para a empresa. Afinal você coloca dois “recursos” para resolver uma única tarefa, portanto estaríamos custando o dobro nesse cenário. Essa é uma visão de curto prazo e já está mais do que provado que a longo prazo esse custo se paga, com a redução da quantidade de bugs e elevada manutenabilidade do software. O código tende a ficar mais limpo e compreensível, entre outras vantagens que falarei mais a seguir.
  • Invasão de privacidade: certamente que sim. Você divide parte do seu tempo com outro desenvolvedor num espaço físico mais restrito (o espaço de uma mesa). Assim, aquela notificação que chegou para você no cantinho da tela inevitavelmente vai ser percebida pelo colega. Aquele assunto pessoal que você tinha para resolver pelo celular também agora já tem um expectador extra. Parte da sua vida será sim compartilhada.
  • Cansativo: muito! Trabalhar focado em par gera um cansaço acima da média. É recomendável o uso de outras técnicas auxiliares como pomodoro para garantir que não se exagere quando estiver trabalhando demais.
  • Sagrado: de maneira alguma! Se em algum momento você julgar que a tarefa é demasiadamente simples para colocar desenvolvedores nela então não faça programação pareada. Somente tenha cuidado para agora não usar isso como desculpa para não experimentar essa técnica.

As principais vantagens dessa técnica são:

  • Aprendizado: as duplas tendem a colaborar em experimentar novas técnicas e novas maneiras de escrever soluções para os problemas do dia à dia.
  • Motivação Mútua: pode parecer piegas, mas quando o problema que se está tentando resolver for complicado demais, você tem um amigo ao seu lado com o mesmo objetivo que você lhe motivando a seguir em frente.
  • Padronização: o código após a adoção da programação pareada migra de ter a “cara” de determinado programador para ter a “cara” da equipe. É difícil identificar qual o indivíduo dentro da equipe escreveu aquela funcionalidade, o diminui os dedos apontados em caso de falha e distribui o mérito em caso de sucesso. Fortalece o espírito de identidade do time.
  • Redução de Bugs: você tem dois cérebros, duas máquinas pensantes, duas threads abertas para resolver um problema. Enquanto um está focado no micro escopo, olhando aquela função ou aquela parte dela o outro tem uma visão mais macro, pensando nos impactos e se o restante do código fica bem com aquela alteração. Suas chances de criar algo que venha a dar defeito diminuem drasticamente dessa maneira.
  • Proximidade: sim, saímos do nosso mundinho fechado e começamos a conversar uns com os outros e em alguns casos até de coisas não relacionadas à software. Descobrimos novas afinidades, marcamos mais churrascos e confraternizações simplesmente porque começamos a ver mais fortemente mais interseções do que divergências.
  • Comunicação: aprendemos a nos comunicar, temos de expressar nossas ideias ao par antes de implementar para validar se existe alguma brecha de problema nela.
  • Foco: as distrações são bem menos percebidas quando você não está sozinho. Aquela notificação você deixa para ler depois, aquela mensagem do whatsapp que chegou provavelmente pode esperar até a próxima pausa. É mágico perceber que até mesmo o ambiente de trabalho respeita o par, pois sabe que ele está focado resolvendo um problema e interfere menos no seu trabalho.
  • Disseminação do conhecimento: deixei esse para o final pois é, na minha opinião, a mais importante das vantagens. Você reduz drásticamente o tempo de treinamento, pois agora você tem o suporte de alguém muitas vezes mais experiente para realizar a tarefa. Não existe mais o dono de uma parte do código, no mínimo existe uma dupla que é dona. Assim, se você rodar (trocar os pares) de tempos em tempos (algo como quinzenal) é visivelmente a maneira mais interessante de fazer o conhecimento circular dentro da sua equipe e quem sabe até da sua organização.

Com todas essas vantagens, fica difícil se posicionar contra uma prática tão difundida e tão bem defendida na comunidade. Se você ainda não tentou, experimente hoje mesmo e veja o seu código melhorar além é claro, de você crescer muito como profissional.

Dicas para escrita de histórias de usuário

No post anterior eu falei um pouco sobre a história das histórias de usuário, seu template e sua finalidade. Hoje falo um pouco sobre algumas dicas que juntei por aí sobre como escrever boas histórias.

Ao iniciar o seu backlog, escrevendo as suas primeiras histórias, comece com histórias que tenham alguma meta envolvida, algo que realmente entregue valor para o cliente. É muito interessante vermos como as coisas são nas universidades. No meu tempo (idoso mode: ON) quase que invariavelmente se ensinava a fazer um sistema de locadoras. Com poucas variações, a grande maioria das faculdades naqueles tempos faziam o mesmo. Nós, como inocentes aprendizes íamos ali, criando novos softwares começando, quase sempre, pelos cadastros, quando o que realmente entrega valor numa locadora é a função de locar. Cadastrar os clientes, as mídias, todo o resto é acessório para o ato de locar. Vejam o quanto isso é a inversão desse valor, o quanto estamos acostumados a entregar o que nos parece mais confortável do nosso ponto de vista. Para o cliente, o meu cliente como desenvolvedor, ter todos os dados daquele blue-ray é importante, mas o mais importante é a locação. Com isso, nasciam cadastros com campos sem necessidade, mesmo cadastros inteiros sem necessidade aparente. Começar pelas histórias que são importantes te dá a possibilidade de validar os acessórios.

Ao dividir as suas histórias, lembre-se que uma história é uma entrega de valor. Para que uma história atenda a isso, ela não pode ser algo que vai entregar somente uma camada do sistema. Histórias que alteram somente o visual, somente o banco, ou somente a regra de negócio devem ser observadas com muita atenção, buscando sempre a entrega de valor. Embora existam situações nas quais realmente uma mudança de design entregue valor por si só, muitas vezes já vi pessoas criando histórias somente para adicionar campos novos no banco de dados, sem uma explicação do porquê. Pense nas histórias como uma fatia de bolo e não como uma camada dele. Uma boa história de usuário vai entregar um pedaço de cada camada do bolo, tal qual uma fatia.

Outra dica muito importante é colocar os critérios de aceitação no cartão da história. Isso ajuda ao cliente a entender os limites da tarefa e ajuda o desenvolvedor a entender quando ele realmente a completou. Eles devem ser claros o bastante para que sejam entendidos pelos envolvidos. Os testes podem ser escritos em qualquer formato que os leitores concordem como sendo conveniente, cenários, tabelas-verdade, o que for interessante. O fundamental nesse momento é que os critérios nesse momento sejam testáveis, sejam validáveis de maneira simples. No fim das contas eles certificam que as história implementadas correspondem ao que o cliente necessita. Sempre que possível, automatize o processo de validação das histórias. Utilizando uma combinação de integração contínua e testes funcionais, algo como Jenkins e JUnit (para Java), os resultados podem ser realmente potencializados.

Embora todo o time, até mesmo o cliente possam escrever histórias e ajudar na formação do backlog, a responsabilidade por escrever as histórias, por gerenciar o backlog completo é o Product Owner, quando estamos falando de Scrum. Observe que o uso de Histórias de Usuário não é algo de uma única metodologia, mesmo quem costuma usá-las.

São trabalhadas e amadurecem à medida que a análise progride. Não se deve ter todo o backlog escrito no início do trabalho. Isso seria considerado um desperdício. Uma metodologia ágil, ao menos a maioria, prega que isso seria um desperdício, pois seria como tentar adivinhar tudo o que o software teria logo no início na coleta de requisitos. Ter um ou dois sprints ou ainda uma ou duas semanas bem detalhadas já é o suficiente para um bom andamento do ciclo de trabalho

Para finalizar, o que acontece com as histórias após terem sido feitas e validadas pelo cliente? Bom, caso você queira manter alguma rastreabilidade, para fins de nostalgia ou ajudar a se lembrar do que foi entregue pode manter uma cópia das histórias. Mas elas não foram pensadas para isso. Foram pensadas como uma ferramenta para execução do trabalho e não com fins de registro ou documentação. Assim, após a sua validação podem ser descartadas.

Bom, isso era um pouco do que eu tinha para falar sobre Histórias de Usuário/User Stories. Até o próximo post.

Referências:

A história de uma história

Dia desses escrevi aqui sobre as técnicas que mais usei para levantamento de requisitos. Naquela oportunidade citei que seria interessante um post mais específico para falar sobre o meu método preferido, as user stories, ou histórias de usuário.

A minha predileção por esse método se dá pela sua simplicidade. Estamos falando de papéis coloridos pregados em uma parede e em linguagem natural, aquela que falamos no nosso dia-à-dia. Muito embora o modelo seja simples, alguns cuidados devem ser tomados para seu bom uso e garantir a sua efetividade.

Segundo o meu amigo Heitor Roriz, histórias de usuários…

“…provêem uma apresentação fácil de compreender e de forma concisa sobre uma determinada informação. São geralmente numa linguagem informal e contém o mínimo de detalhes, deixando os demais dados aberto à interpretação. Elas devem ajudar a entender o que o software deve englobar.”

Isso significa que as US (user stories/histórias de usuário) funcionam como um “nivelador de linguagem”, trazendo para o mesmo nível de entendimento o cliente, o cara de negócios, que pode não entender nada de programação e o desenvolvedor, o cara que vai resolver aquele problema usando o conhecimento técnico. É muito interessante pois a US é um convite ao debate, à conversa. Ela é pequena e concisa de propósito, para que você tenha que discutir os detalhes com quem fez a solicitação e durante essa conversa novos tópicos possam surgir.

Um outro ponto importante é que elas devem ser acompanhadas por critérios de aceitação para ajudar a elucidar os comportamentos aonde as histórias pareçam ambíguas. Os critérios de aceitação seriam algo como os testes que indicam a quem for desenvolver quando a sua tarefa foi completada. Os critérios podem ser pequenos e simples, algo como uma regra de validação, ou mesmo mais complexos, dando origens a novas histórias.

Um modelo nos foi sugerido por Mike Cohn, dizendo que opcionalmente eu poderia ter a terceira cláusula (o porquê). Eu respeitosamente discordo, mas vamos falar disso mais adiante. O modelo proposto é o seguinte:

Como um [papel],
eu quero/desejo [objetivo/desejo]
então [benefício/razão]

Entendendo bem as partes, comecemos com o papel. Se você estudou um pouco de UML deve estar fazendo a relação na sua cabeça com o ator de um use case e está correto. Aqui estamos falando da pessoa que se beneficiará se essa história for desenvolvida. Isso é legal, pois como desenvolvedor você saberá com quem tirar suas dúvidas durante o desenvolvimento do produto. Nem sempre você terá funcionalidades que serão utilizadas somente por um único papel, ou mesmo por um papel tão simples que possa ser descrito de maneira sucinta. Nesses casos, o que é recomendado é o uso de personas, que nada mais é do que criar personagens com as características que um determinado perfil de usuário possui. Uma boa persona descreve algumas características básicas como:

  • Um nome, idade e um estilo de trabalho e vida definido
  • Um bordão para distingui-lo de outras personas
  • Atributos chave que afetam uso e expectativas do produto, serviço ou website
  • Tarefas frequentemente realizadas
  • Ferramentas e recursos utilizados
  • Pontos de atenção relevantes ao projeto

Usualmente não se criam mais do que 8 personas por projeto, dada a sua complexidade. É possível fazer algumas atualizações durante o projeto, mas isso é bem incomum. Enfim, não comece o seu projeto criando um punhado de personas, deixe que isso emerja da necessidade. Conforme você for escrevendo suas histórias, vai surgir em algum momento algum papel que precise de um pouco mais de atenção e talvez seja o momento de reunir o seu time e escrever seus personas. Ou sua equipe pode realmente se sentir mais confortável em saber quem vai usar o sistema desde o primeiro momento.

Por hoje é só, no próximo post, falarei algumas dicas de escrita para iniciar o seu backlog.

Agile Tour 2014 – Missão cumprida!

LogoAgileTour2014Foi uma grande felicidade para mim. Esse foi o ano em que mais cidades tiveram o Agile Tour passando por elas. Em cada uma pude ver as pessoas felizes em receber um evento que fala de tecnologia, mas especialmente de pessoas e como trabalhar para que todas elas se sintam melhor em local de trabalho.

Iniciamos em Curitiba, depois São Paulo e então Campinas. Na sequência viajamos pelo interior do Paraná, para Cascavel e finalmente minha terra, Maringá. Outras cidades nos pediram eventos e vamos com certeza, com a força da comunidade (#AgilePower) fazer de 2015 um ano épico.

Em nome de toda a equipe organizadora, vai o meu muito obrigado a todos os participantes, palestrantes e patrocinadores que fizeram desse evento o grande sucesso que foi.

Todas as fotos, vídeos, grades e tudo o mais pode ser encontrado no site do evento.