Baixe o app para aproveitar ainda mais
Prévia do material em texto
Lean Software Engineering como desenvolver seu MVP Paulo Caroli and Alexandre Corrêa Barbosa This book is for sale at http://leanpub.com/leanengineering This version was published on 2020-05-17 This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. © 2019 - 2020 Paulo Caroli and Alexandre Corrêa Barbosa http://leanpub.com/leanengineering http://leanpub.com/ http://leanpub.com/manifesto Contents Disclaimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i Mindmap . . . . . . . . . . . . . . . . . . . . . . . . . . . i Eu sou um Dev . . . . . . . . . . . . . . . . . . . . . . . . . . iii Eu sou um facilitador . . . . . . . . . . . . . . . . . . . . . . iv Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Preparando as Fundações do Produto . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Arquitetura Mínima Viável . . . . . . . . . . . . . . . . . 2 Atividades para definição dos Requisitos Cross-Funcionais 7 MVA e arquitetura Evolutiva . . . . . . . . . . . . . . . . 10 Preparando para entregar con- tinuamente . . . . . . . . . . . . . . . . . . . . . . . 12 Crie o Pipeline inicial de Entrega Contínua . . . . . . . . . 13 Pipeline de Entrega Contínua . . . . . . . . . . . . . . . . 13 Prepare o Ambiente de Desenvolvimento . . . . . . . . . 16 Comece com um Controle de Versão . . . . . . . . . . . . 16 Utilize um Trunk único . . . . . . . . . . . . . . . . . . . 18 Modele a Infraestrutura como Código . . . . . . . . . . . 19 CONTENTS Entenda Entrega Contínua . . . . . . . . . . . . . . . . . 20 Evolua o Pipeline inicial . . . . . . . . . . . . . . . . . . . 22 Integre continuamente . . . . . . . . . . . . . . . . . . . . . 24 Automatize os Testes automatizados (introduzir TDD) . 25 Sobre TDD . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Testes unitários . . . . . . . . . . . . . . . . . . . . . . . . 25 Testes funcionais . . . . . . . . . . . . . . . . . . . . . . . 26 Automatize a Análise estática de código . . . . . . . . . . 26 ArchUnit (princípios de evolutionary architecture) . . . 26 Deploy não precisa ser Release . . . . . . . . . . . . . . . . 27 Feature Toggle . . . . . . . . . . . . . . . . . . . . . . . . 28 Defina um feature toggle . . . . . . . . . . . . . . . . . . 29 Toggles de longa duração . . . . . . . . . . . . . . . . . . 29 Restrinja o acesso via toggle . . . . . . . . . . . . . . . . 30 Squad de produto . . . . . . . . . . . . . . . . 32 Lean Inception, produto e a equipe . . . . . . . . . . . . . . 33 Objetivos do Squad de Produto . . . . . . . . . . . . . . . . 36 Desenvolvimento Iterativo . . . . . . . . . . . . . . . . . . . 37 Sprint 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 A Sprint Zero . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Atividades da Sprint 0 . . . . . . . . . . . . . . . . . . . . . . 41 Tarefas de set-up . . . . . . . . . . . . . . . . . . . . . . . 41 Atividade: Moscou . . . . . . . . . . . . . . . . . . . . . . 42 Atividade Votação Mais / Menos . . . . . . . . . . . . . . 43 Atividade: Quem/O que/Quando . . . . . . . . . . . . . . 44 Path to Production . . . . . . . . . . . . . . . . . . . . . . 45 CONTENTS MinimumViableArchitecture (MVA) 46 Arquitetura Mínima Viável (MVA) . . . . . . . . . . . . . . 47 Micro-serviços de Domínio . . . . . . . . . . . . . . . . . 48 Registro de Decisão de Arquitetura . . . . . . . . . . . . . . 49 Compartimentalização . . . . . . . . . . . . . . . . . . . . . 50 Métricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Métricas acionáveis . . . . . . . . . . . . . . . . . . . . . 52 Dados para Métrica . . . . . . . . . . . . . . . . . . . . . 53 Analisando os resultados . . . . . . . . . . . . . . . . . . 53 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 DRAFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 MVP como início do empreendimento . . . . . . . . . . . 55 Small batches . . . . . . . . . . . . . . . . . . . . . . . . . 55 Entrega Contínua . . . . . . . . . . . . . . . . . . . . . . . 57 Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Sobre Alexandre Corrêa Barbosa . . . . . . . . . . . . . . . 59 Sobre Paulo Caroli . . . . . . . . . . . . . . . . . . . . . . . . 60 Sobre a Editora Caroli . . . . . . . . . . . . . . . . . . . . . . 61 WIP (Writing In Progress) . . . . . . . . . . . . . . . . . . 61 Disclaimer Estamos tratando esse E-Book como um MVP. Se já tem algo minimamente viável para passar a ideia, o conceito, então está disponível. Por isso neste E-Book você vai encontrar erros de ortografia, imagens em versões iniciais, e texto por escrever. Mas como um bom MVP, estamos muito interessados no seu feedback. Abraços, Paulo Caroli e Alexandre Barbosa Mindmap Segue um mindmap de assuntos que queremos tratar no livro: Disclaimer ii Eu sou um Dev Eu, Alexandre, sou um desenvolvedor. Adoro participar da Lean Inception. Mas após discutir e planejar o MVP e suas funcional- idades, eu quero ir logo para a minha estação de trabalho. Eu quero começar a implementar todas as ideias maravilhosas que conversamos na Lean Inception. Essa empolgação é excelente, mas neste momento, preciso res- pirar fundo. Preciso segurar a minha ansiedade em codar essas funcionalidades; É necessário fazer algo essencial, mas que, para muitas pessoas, não é tão excitante: Preciso criar o pipeline e a infraestrutura para o desenvolvimento do MVP. O pipeline é a estrutura inicial que leva o código da minha máquina até o MVP nas mãos dos meus clientes. Mas esse pipeline deve ser Lean. Afinal de contas, no mundo atual, não podemos demorar a entregar valor e validar nossas ideias.a Nesse livro você encontra práticas que chamamos de Lean Engi- neering. Práticas para a construção desse pipeline e o ferramental para te ajudar a efetivamente criar e operar seu MVP. Eu sou um facilitador Eu, Paulo Caroli, sou um facilitador de Lean Inception. Adoro fa- cilitar uma Lean Inception. Adoro ver o grupo de pessoas alinhado sobre o MVP a construir. Mas não saio completamente satisfeito da mesma. A minha satis- fação está no sucesso da equipe. E, para tanto, há mais do que a Lean Inception. Por exemplo, a excelência técnica sobre como construir oMVP. Não estou falando sobre o que construir, ou sobre que processo utilizar. Mas sim das práticas de engenharia que suportam este estilo – Lean – de criação e evolução de produtos digitais. Esse livro é para as pessoas interessadas nas práticas de engenharia que suportam este estilo – Lean – de criação e evolução de produtos digitais. Eu era um desenvolvedor e trabalho muna empresa com excelentes desenvolvedores, dentre eles, o Alexandre – um dos desenvolve- dores mais experientes do Brasil. Trabalhamos juntos em alguns projetos, e agora, estamos juntos na criação e evolução deste e-book. Introdução Lean Engineering é formado por uma série de práticas e técnicas que nós utilizamos para criar e manter um MVP. Após a realização da Lean Inception, a equipe tem em mãos uma série de requisitos descrevendo o que deve ser o produto. O livro Lean Inception descreve como alinhar um grupo de pessoas sobre o MVP. Este eBook é para os desenvolvedores, para os engen- heiros de software, para as pessoas que criam as funcionalidades dos produtos digitais. Mas não é para todos. Esse livro é para as desenvolvedoras que criam funcionalidades para o MVP. Desenvolvedoras que trabalham no estilo Lean, desen- volvedoras que seguem o estilo Lean StartUp, desenvolvedoras que participam de Lean Inceptions, que entendem o conceito de MVP e que buscam as melhores técnicas da engenharia de software para encantar os clientes e o negócio. Preparando as Fundações do Produto Acabou a semanada inception enxuta, e agora o time está alinhado sobre o que deseja alcançar com o MVP, e quais as primeiras funcionalidades que serão criadas. A motivação e a energia de todas está em alta, e como pessoas desenvolvedoras queremos rapidamente começar a programar. No entanto, as funcionalidades do MVP ainda estão descritas em alto nível. Neste momento, é importante que a equipe de desenvolvimento invista ainda algum tempo para definir as fundações técnicas que facilitarão o desen- volvimento iterativo e sustentável do produto. Arquitetura Mínima Viável Uma ideia não tão incomum em desenvolvimento de software é a de que ao desenvolver um MVP não é necessário planejar sua arquitetura. No entanto, é importante notar que, independente- mente de planejar ou não, seu sistema sempre terá uma arquitetura: a diferença é que quando se permite que a arquitetura surja ao acaso, aumentamos o risco de termos um sistema que não atende às necessidades das nossas clientes, e seja difícil de manter e evoluir. 3 O que é Arquitetura neste contexto? Arquitetura é um termo usado extensivamente e que possui muitas interpretações em nossa área. Não iremos tentar definí- la neste livro (outras pessoas mais competentes já o fizeram - recomendamos a leitura dos volumes 1 e 2 do Software Architeture for Developers), mas vamos esclarecer o que entendemos como resultado do processo da definição de uma arquitetura. O resultado mais importante é a criação de uma visão para o time de desenvolvimento de como construir o produto, definida: * pela estrututa que será utilizados no código (camadas, MVC, arquitetura clean, cebola, portas e adaptadores, entre outros); * pelas tecnologias base (linguagens e frameworks utilizados, por exemplo) * pela arquitetura de componentes do sistema (monolito, SOA, microsserviços, etc) * infraestrutura padrão (nuvem, on premise, virtualização, mecanismo de deployment, etc) Estas definições permitirão que o time de desenvolvimento compartilhe uma mesma visão de sistema, permitindo que as funcionalidades sejam desen- volvidas de forma consistente, e de forma a mitigar o risco de não atender às diferentes necessidades do produto. https://leanpub.com/b/software-architecture Por outro lado, a experiência dos tempos do desenvolvimento em cascata em que se perde semanas ou meses planejando cada detalhe da arquitetura do sistema - o famoso Big Design Up Front - é algo que se mostra tão ou mais prejudicial quanto nenhum planejamento. O que você precisa é encontrar o meio termo, que definimos como arquitetura mínima viável (MVA)¹. ¹https://www.infoq.com/news/2014/11/minimum-viable-architecture/ https://leanpub.com/b/software-architecture https://leanpub.com/b/software-architecture https://leanpub.com/b/software-architecture https://www.infoq.com/news/2014/11/minimum-viable-architecture/ https://www.infoq.com/news/2014/11/minimum-viable-architecture/ 4 MVA é o ponto de equilíbrio entre nenhum planejamento e muito planejamento Um primeiro passo para definirmos a arquitetura mínima viável do seu produto é identificar os principais fatores externos que serão especialmente importantes nos primeiros momentos de vida do seu MVP. Estes fatores externos são também conhecidos como req- uisito cross-funcionais, requisitos não funcionais, entre outros termos. Abaixo, pode-se visualizar alguns exemplos: acessibilidade auditoria consistência custo disponibilidade escalabilidade fatores regulatórios integridade performance privacidade rastreabilidade resiliência reusabilidade segurança sustentabilidade tolerância a falhas testabilidade usabilidade A lista anterior é só uma pequena amostra de diferentes fatores que podem impactar o desenho da arquitetura do produto. É importante observar, que muitos destes fatores muitas vezes competem entre si. Um exemplo clássico é o par Segurança e Usabilidade. Esta com- petição torna necessária não somente a identificação dos requisitos cross-funcionais importantes para o MVA, mas também a prior- ização. Isto permite entendermos qual fator é mais importante, no momento que tivermos que lidar com os conflitos entre diferentes requisitos. É importante ressaltar que para começarmos a pensar no MVA, devemos focar no que é importante para o MVP. É comum trazer preocupações que provavelmente serão importantes no futuro, ou 5 itens que se imagina ser simples de se resolver agora - por exemplo, internacionalização; em geral, oMVP será testado inicialmente com clientes que compartilham o mesmo idioma, mas se o produto for bem sucedido, certamente será oferecido em outros idiomas. Um conjunto de perguntas que podem ajudar sua equipe a focar no que é importante para o MVP: • Quantos usuários utilizarão o sistema no lançamento inicial? Nos primeiros 6 meses? Após um ano? • Os usuários iniciais serão internos, externos, ou ambos? • Quantas transações por segundo esperamos no lançamento? Nos primeiros 6 meses? Após um ano? • Como os usuários começarão a utilizar o sistema? • Qual o nível de segurança e auditabilidade exigido no lança- mento? Dentro de 6 meses? Após um ano? Há diversas outras perguntas para guiar a discussão. Estas pergun- tas ajudam a equipe a definir os requisitos básicos para lançar no mercado. Embora não entre no mérito de definir uma arquitetura completa e perfeita para o produto final, isto é diferente de ignorar a definição de uma boa arquitetura. O foco é no quanto de inves- timento é necessário para lançar e, em seguida, definir um plano para evoluir a arquitetura conforme o número de usuários aumenta e requisitos são adicionados. Tentar construir o sistema perfeito raramente é a abordagem cor- reta. Vamos dizer que a resposta do dono do produto para estas perguntas sejam as seguintes: • Haverá apenas cinco usuários internos nos primeiros três meses. Seis meses a partir de agora os nossos dois primeiros clientes externos estarão usando os sistemas em modo piloto. Um ano a partir de agora lançaremos o sistema para todos os clientes. 6 • No lançamento haverá uma quantidade trivial de transações. Daqui a seis meses o tráfego será moderado. No próximo ano, o tráfego será extremo. • Inicialmente, adicionaremos usuários ao sistema através de uma interface. No futuro, os clientes terão gestão de ID self- service. Espero que isto aconteça em um ano a partir de agora. • Nós só precisamos de segurança mínima para a primeira ver- são. Para o piloto, precisamos de segurança e audit completos. Com base nessas respostas, muita discussão e definição pode ser adiada para após o lançamento da primeira versão. Por que gastar tempo na estratégia de cache agora, quando não vemos a necessi- dade no horizonte de um ano? Nós podemos colocar fora diversas tarefas de gerenciamento de ID para mais tarde também. Deve-se evitar discussões imediatas sobre requisitos que só virão no futuro, de forma que seja implementado apenas o estritamente necessário da melhor forma possível. É por isso que o MVA é tão importante. Esta abordagem depende da disciplina e confiança entre o dono do produto e da equipe de desenvolvimento, para garantir que ambas obtenham os resultados desejados: o produto é entregue rapidamente com um sistema bem arquitetado e com pouca dívida técnica. Em se tratando do desenvolvimento de um MVP, dois fatores que certamente devem ser levados em consideração são velocidade de desenvolvimento e evolucionabilidade, uma vez que desejamos aprender rapidamente com as clientes, e também adaptar rapida- mente o produto de acordo com os aprendizados. 7 Atividades para definição dos Requisitos Cross-Funcionais Dentro-Fora do MVA Dentro-Fora é um jogo para crianças pequenas, bem simples, que consiste em primeiro desenhar um círculo grande no chão (tipi- camente com um giz no pátio das escolas), depois posicionar as crianças em volta dele, e então, dar o comando “DENTRO” ou “FORA”, para que as crianças pulem (e aprendam o que é dentro e fora). A atividade Dentro-Fora do MVA é similar a atividade infantil, entretanto seu objetivo verificar cada RCF, decidindose este deve estar dentro ou fora do círculo. A diferença é que o círculo repre- senta a MVA, que somente cabe cinco cartões RCF. Desta formaos participantes terão de priorizá-los. exemplo de resultado – Dentro-Fora do MVA Passo a Passo da atividade 1. Escreve ou imprima os RCF mais relevantes para o MVA em post-its 8 2. Desenhe um círculo de tamanha pequeno (que somente caiba cinco cartões de RCF) 3. Coloque todos cartões RCF ao redor do círculo. 4. Como um ponteiro de um relógio, comece nas 0 hs (seguindo no sentido horário – 1,2,3…) e leia o cartão de RCF e decida se este é muito importante a ponto de colocá-lo dentro do círculo. Se colocar dentro do círculo, respeite o limite de somente ter 5 cartões dentro do círculo. Se alcançar o limite, converse em grupo sobre qual cartão deve sair do círculo. 5. Faça duas voltas no “relógio” para verificar se todos estão de acordo com os cinco RCF finalistas dentro do círculo. Trade-offs dos RCF Trade-off é uma troca em que você desprioriza algo para conseguir outro que deseja ainda mais. Uma MVA reflete decisões da equipe em relação a trade-offs dos requisitos cross funcionais (RCF). A atividade Trade-offs dos RCF ajuda na construção e documen- tação de um entendimento comum sobre os trade-offs dos RCF para o momento atual. Muitas decisões e conversas são baseadas em visões individuais e premissas entre escolhas. Alguns exemplos: o que tem um valor maior neste momento da arquitetura do MVP: a segurança ou a facilidade de usar? E quanto a escalabilidade e segurança? E escalabilidade e facilidade de usar? Esta atividade promove uma conversa aberta e colaborativa sobre os trade offs. Trade-offs mais esclarecidos evitam desentendimentos e ajudam na rápida tomada de decisões, essenciais para a *Lean Engineering”. 9 exemplo de resultado – trade offs do produto enxuto Passo a Passo da atividade 1. Descreva os RCF mais relevantes para o MVA em post-its (exemplo: segurança, usabilidade, escalabilidade). 2. Coloque os RCF no quadro branco ou flipchart como títulos de linhas. Em seguida, desenhe uma linha horizontal para cada RCF. 3. Desenhe linhas verticais (o mesmo número de linhas horizon- tais). Escreva “+” (mais importante) em cima da linha mais à esquerda e “-“ (menos importante) em cima da linha mais à direita. 4. Peça aos participantes para marcar suas iniciais em vários post-its e colocar um post-it por linha. A restrição: cada coluna deve ter um post-it com suas iniciais (por exemplo, apenas uma das categorias vai ser marcada como mais im- portante). 5. Equalize os trade-offs. Com um post-it de cor diferente (uma tira de post-it de outra cor na foto ilustrativa), faça amarcação 10 devida para cada categoria, de mais a menos importante. Esta marcação será relativamente fácil, já que considera os post-its com os votos de todos. outro exemplo de resultado – trade offs de RCF MVA e arquitetura Evolutiva No livro Building Evolutionary Architectures ² os autores sugerem um novo fator a ser considerado: a *Evolucionabilidade. Podemos entender evolucionabilidade como a característica da arquitetura do produto, que corresponde a quão fácil ou difícil é implementar mudanças sem degradar os outros requisitos cross-funcionais. A evolucionabilidade é uma qualidade relacionada aomédio e longo prazo da arquitetura, que compete com preocupações de curto ²KUA, Patrick; PARSONS, Rebecca; FORD, Neal. Building Evolutionary Architectures. O’Reilly Media, Inc. 2017. 11 prazo. Se o objetivo doMVP é validar uma hipótese omais rápido possível, não é necessário se preocupar com a evolucionabilidade. O melhor a se fazer é focar em uma arquitetura mínima, que permita validar a hipótese. Uma vez validada a hipótese, o código e a arquitetura em questão deve ser convertido de aspectos de validação (da hipótese) para aspectos de evolução. O código de umMVP validado é a base para a evolução do produto, então temos que tratar a evolucionabilidade da arquitetura inicial. Ou seja, do ponto de vista da arquitetura de software, a MVA deve prover o mínimo necessário para o código de validação da hipótese, bem como o mínimo para a evolucionabilidade do produto. Preparando para entregar continuamente Crie o Pipeline inicial de Entrega Contínua Software funcionando é a medida primária de pro- gresso³ A frase acima é um dos doze princípios definidos no Manifesto Ágil, e define de forma muito clara um dos principais objetivos das desenvolvedoras: colocar software em produção. Ou seja, validar e testar uma funcionalidade na sua máquina, ou em um ambiente intermediário (como QA, staging ou homologação) não é suficiente para considerarmos a tarefa ou história pronta. Para estar finalizado de fato, o código desenvolvido tem que estar no ambiente de produção. Você busca entregar histórias e tarefas diariamente, portanto pre- cisa de uma forma eficiente de realizar o deploy no ambiente de produção. Por isso, você precisa, começar com um Pipeline de Entrega Contínua. Pipeline de Entrega Contínua O Pipeline de Entrega Contínua é composto pelos processos au- tomatizados responsáveis por disponibilizar o software que de- senvolvemos nas mãos das usuárias. Note-se aqui a ênfase em automação. Quanto maior a quantidade de intervenções humanas neste processo, menor a repetibilidade deste processo, e em conse- quência menor sua confiabilidade. ³Princípios por trás do Manifesto Ágil https://agilemanifesto.org/iso/ptbr/principles.html Crie o Pipeline inicial de Entrega Contínua 14 Este processo será exercitado milhares de vezes durante a vida do seu produto. Quando completo e evoluído, este terá vários módulos e linhas de código para iniciar processos e sub-processos. Mas no início de tudo, na primeira linha de código do seu software, o Pipeline de Entrega Contínua será bem simples. Dado a sua importância e sua simplicidade (no início), o Pipeline de Entrega Contínua deve ser o primeiro entregável da equipe de desenvolvimento. O Pipeline deve apresentar uma versão funcional, antes mesmo da criação do código funcional da primeira funcionalidade. Seguindo um estilo Lean, o pipeline evolui num processo incremental, acom- panhando o desenvolvimento incremental do produto de software. Segue uma ilustração de uma ideia mais concreta sobre o que compõe uma Pipeline de Entrega Contínua: Exemplo de Pipeline de Entrega Contínua O seu pipeline inicial deve ser simples, com passos que posterior- mente serão automatizados ou incluídos. Você deve decidir se todos testes iniciais serão automatizados, ou se alguns serão manuais. Você deve postergar a criação de alguns testes de segurança e performance. Você, provavelmente, vai postergar algum passo, Crie o Pipeline inicial de Entrega Contínua 15 alguma automação que coloca o release em produção, e usar algo manual ou semi-automatizado. Neste momento inicial, você não precisa definir exatamente como será o pipeline completo. Todos os detalhes e decisões irão surgir de acordo com a evolução do software. Para começar, foque no essencial, no pipeline mínimo que disponi- biliza o software no ambiente onde os seus usuários podem usá-lo. Portanto, comece com o seguinte pipeline: Pipeline inicial Note no pipeline inicial que o último passo é oDeploy em Ambiente de Produção. Todavia, no exemplo anterior o ultimo passo era Release. Mais adiante compartilharemos sobre a diferença entre deploy e release, mas neste momento não faremos distinção entre estes passos. Nosso objetivo agora é implantar automaticamente nosso produto em ambiente de produção, o ambiente onde os primeiros usuários poderão acessar o produto. Provavelmente as primeiras pessoas não serão os usuarios finais, mas a equipe de desenvolvimento, ou um grupo selecionado de poucas pessoas. Talvez este “ambiente de produção” ainda não esteja ainda disponível Crie o Pipeline inicial de Entrega Contínua 16 fora da rede de sua organização. Este ambiente irá evoluir como todo seu produto. Prepare o Ambiente de Desenvolvimento Ao iniciar o desenvolvimento deum produto de software é fun- damental ter um ambiente de desenvolvimento estável e de fácil acesso a todos os desenvolvedores. Nos tempos onde hardware e licenças de software eram muito caras era comum se utilizar um ambiente de desenvolvimento compartilhado. Esse ambiente normalmente era instável, já que as modificações de um desenvolvedor podiam afetar o trabalho de outro desenvolvedor. Hoje em dia, com a utilização de máquinas virtuais ou containers e uso de software open source, é muito fácil para um desenvolvedor ter em suamáquina de trabalho tudo que é necessário para executar um produto. Isso permite que seja mais fácil a criação de local de desenvolvimento. Para facilitar a criação destes ambientes de desenvolvimento locais é importante fazer o uso de ferramentas de automação para que, com a execução de um simples comando, um novo desenvolvedor na equipe possa ter seu ambiente de desenvolvimento pronto em alguns minutos. Comece com um Controle de Versão Sua equipe tem mais de uma pessoa desenvolvedora? Se sim, então comece com um Controle de Versão no seu pipeline. Essa é a forma mais simples de compartilhar e intregar o que todas pessoas Crie o Pipeline inicial de Entrega Contínua 17 estão criando, de forma contínua - em outras palavras, garantir a Integração Contínua do software. Alias, mesmo que você esteja trabalhando sozinha, utilizar um sistema de controle de versão é tão simples e fácil, que não faz sentido deixar para adicioná-lo depois. Ele provê outros benefícios, como backup – ter uma cópia além da que existe na sua máquina– e manter um registro histórico das mudanças. Nos capítulos a seguir você vai acompanhar a evolução de um código exemplo via um sistema de Controle de Versão, onde incre- mentamos o pipeline, num passo a passo, enquanto compartilhamos cada tópico abordado no livro, tais como Trunk-based development, Feature branching, Gitflow, etc. Terraform 1 variable "heroku_email" { 2 type = string 3 } 4 5 variable "heroku_api_key" { 6 type = string 7 } 8 9 provider "heroku" { 10 version = "~>2.1" 11 email = "${var.heroku_email}" 12 api_key = "${var.heroku_api_key}" 13 } 14 15 resource "heroku_app" "leb-webapp" { 16 name = "leb-webapp" 17 region = "us" 18 } 19 20 resource "heroku_build" "leb-webapp-build" { 21 app = "leb-webapp" Crie o Pipeline inicial de Entrega Contínua 18 22 buildpacks = ["https://github.com/heroku/heroku-buildpa\ 23 ck-static"] 24 25 source = { 26 path = "../frontend" 27 } 28 } Desta forma, antes de qualquer coisa, crie o repositório do seu projeto no seu sistema de preferência. Recomendamos que você leia este livro enquanto escreve e evolui seu código exemplo, de forma Lean. Relembramos que este livro é para desenvolvedores. Por isso assumidos que, por mais que você goste de ler um bom livro, você prefere escrever código. Utilize um Trunk único O Trunk based development⁴ é uma prática onde todos os dese- volvidores fazem os commits em um único branch, o trunk, e não são utilizadas outras branches para desenvolvimento. Esta prática surgiu como uma resposta aos problemas encontrados na utilização de feature branches. Um dos grandes problemas da utilização de feature branches é a divergência dos códigos nas branches, causando grande problemas de integração perto das releases. A útilização do trunk único em combinação com a integração contínua, permite que o código no trunk esteja sempre estável, facilitando pequenas entregas. ⁴http://paulhammant.com/2013/04/05/what-is-trunk-based-development/ http://paulhammant.com/2013/04/05/what-is-trunk-based-development/ http://paulhammant.com/2013/04/05/what-is-trunk-based-development/ Crie o Pipeline inicial de Entrega Contínua 19 Modele a Infraestrutura como Código Modele a infraestrutura como se fosse código, de modo que sua ab- stração, design, implementação e deploy ocorra da mesma maneira que utilizamos quando desenvolvendo aplicações. Assim, trabalha- se com esse código utilizando as mesmas ferramentas e práticas que são utilizadas em projetos modernos de software. O código que modela, builda e gerencia a infraestrutura é sub- metido ao sistema de controle de versão juntamente com o código da aplicação, tornando o setup controlado e repetível. A mudança de pensamento é que a infraestrutura deve ser redeployavel a partir do código; um código que deve ser desenvolvido utilizando as metodologias já estabelecidas em anos em que a indústria amadure- ceu. Para atingir o objetivo de ter a infraestrutura como código, algumas práticas são recomendadas. A primeira delas é definir toda a infrasestrutura em arquivos de configuração executáveis, seja em shell scripts, Chef, Puppet, ou qualquer que seja a ferramenta. Ninguém deve entrar em um servidor de aplicação e fazer ajustes manualmente. Este comportamento leva à um servidor instável, gerando riscos. Com arquivos de configuração, qualquer membro da equipe pode reproduzir o ambiente de produção, inclusive quando está desenvolvendo. Outro benefício é a possibilidade de updates rápidos, já que o provisionamento se torna automatizado, ao invés de manual. Havendo arquivos de configuração, estes devem ser mantidos em um sistema de controle de versão. Toda e qualquer mudança deixará um rastro, quer permite verificar como era a infraestrutura da aplicação em um dado momento do tempo. Também deve-se testar estes arquivos de configuração, preferentemente de forma automatizada e como parte do sistema de integração contínua da aplicação. Em um cenário ideal, é possível realizar entrega contínua Crie o Pipeline inicial de Entrega Contínua 20 de mudanças de infraestrutura. Tal qual deve ser feito com código de aplicação, a infraestrutura deve ser entregue incrementalmente e frequentemente. Entenda Entrega Contínua Jez Humble e David Farley, em 2010, publicaram o livroContinuous Delivery ⁵. Neste livro, os autores elaboram sobre um processo de entrega rápido e de baixo custo, permitindo a criação incremental de produtos de software. Eles definem Continuous Delivery (em português, Entrega Contínua) como uma disciplina de desenvolvi- mento de software que promove entregas mais rápidas e commaior frequência. Segundo os autores, realizar o deploy de um software é muito mais que instalar um artefato em alguma máquina, seja como um arquivo executável, ou um pacote em um servidor de aplicação. Eles dividem a implantação de software em três partes: 1. Provisionar e gerenciar o ambiente no qual a aplicação irá rodar (configuração de hardware, software, infraestrutura, e serviços externos). 2. Instalar a versão correta da aplicação. 3. Configurar a aplicação, incluindo qualquer dado ou estado necessário. ⁶ (p. 25) Para permitir a entrega frequente de novas funcionalidades é necessário um alto nível de automação. Além de muitas vezes ser mais rápido do que fazer manualmente, a automação permite que se crie um processo repetível, ou seja, todo vez que o processo for executado com as mesmas entradas vai obter as mesmas saídas. ⁵HUMBLE, Jez and FARLEY, David. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation, Addison-Wesley, 2010. ⁶HUMBLE, Jez and FARLEY, David. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation, Addison-Wesley, 2010. Crie o Pipeline inicial de Entrega Contínua 21 Provisione o Ambiente de Produção Há uma série de opções quando se trata de definir a infraestrutura dos produtos digitais: 1. so o ambiente pode ter seu próprio conjunto de máquinas físicas, ou 2. se podemos utilizar um provedor de infraestrutura como serviço (IaaS) como AWS ou Azure, ou 3. se podemos usar um provedor de plataformas como serviço (PaaS) como Heroku ou Dokku, ou 4. se podemos usar uma combinação dos três. Qualquer que seja seu caso, voce deve gerir a sua infraestrutura através de scripts, de forma que possam ser executados de forma automatizada, ou semi-automatizada (para versões iniciais do seu pipeline). Desta forma, a toda e qualquerparte da sua infraestrutura é definida através de código, utilizando ferramentas tais como scripts shell, Puppet, Chef, Ansible, Terraform, entre outras. Este código, como qualquer outro, deve estar no Controle de Versão, e toda e qualquer mudança na infraestrutura deve ser feita através de mudanças no código. aqui vamos adicionar um script exemplo para provi- sionar um ambiente de produção Instale a aplicação no Ambiente de Produção Após definir e provisionar a infraestrutura básica do Ambiente de Produção, o próximo passo é instalar a aplicação no ambiente de Crie o Pipeline inicial de Entrega Contínua 22 produção. Para tanto, voce deve gerar um artefato adequado para sua infraestrutura (pacote debian/rpm, imagem docker, arquivo zip, etc) e implantá-lo. Novamente, este passo ser um realizado via um script. Desta forma, ele pode ser automatizado ou semi- automatizado, onde a única interação humana seja apertar um botão (ou digitar um comando) para ser iniciado. Scripts shell são uma escolha bastante comum. aqui vamos adicionar um script exemplo para instalar uma aplicação (“Hello World”) no ambiente de pro- dução Configure a aplicação Uma vez que a aplicação esteja instalada no ambiente de produção, você deve configurar a mesma. Mais uma vez, realize esta tarefa a partir de script com código e dados, de forma que tal código esteja no controle de versão e possa ser executado, automaticamente ou semi-automaticamente. aqui vamos adicionar um script exemplo para con- figurar a aplicação (passando o parâmetro “Hello World”) no ambiente de produção Evolua o Pipeline inicial Finalizado nosso pipeline inicial, temos a habilidade de desenvolver código e disponibilizá-lo rapidamente às pessoas que irão utilizar nosso produto. Isso é ótimo, mas no estágio atual adiciona um risco alto de disponibilizarmos algum defeito. Isto porque estamos confiando totalmente que a pessoa que irá realizar o deploy à partir Crie o Pipeline inicial de Entrega Contínua 23 da sua máquina, testou o produto manualmente em sua máquina - os problemas podem surgir porque os ambientes são totalmente diferentes, ou porque esquecemos de testar alguma coisa (todo processo manual é propenso a erros). Para mitigar este risco vamos evoluir nosso pipeline inicial, adicio- nando a ele a capacidade de Integração Contínua. Integre continuamente Os computadores realizam tarefas repetitivas: as pessoas re- solvem problemas! A Integração Contínua⁷ é uma prática de desenvolvimento onde o código é integrado continuamente, ou seja, todos os desenvolve- dores fazem commit das suas modificações várias vezes ao dia em um repositório de desenvolvimento compartilhado e esse novo código integrado passa por algumas verificações para garantir a integração com o código já existente no repositório. O grande benefício da integração contínua é que o código está sempre integrado e com um bom nível de confiança que as novas mudanças não quebraram nenhuma funcionalidade existente. Este nível de confiança vai depender das verificações que são feitas no código. Para este processo de verificação existem diversas ferramentas que auxiliam na orquestração deste de forma automatizada, os chama- dos servidores de integração contínua. Além destas ferramentas, existem diversas ferramentas que fazem as verificações em si e são executadas pelo servidor de integração contínua. Alguns exemplos de verificações executadas para validar a inte- gração do código são: • Compilação • Análise estática de código • Execução de testes unitários automatizados ⁷http://www.martinfowler.com/articles/continuousIntegration.html http://www.martinfowler.com/articles/continuousIntegration.html http://www.martinfowler.com/articles/continuousIntegration.html Integre continuamente 25 • Execução de testes funcionais automatizados Este processo nos ajuda a Construir qualidade no produto, elimi- nando a necessidade de extensas atividades de verificação manuais no final do processo, através da detecção de problemas o mais próximo possível do momento do desenvolvimento, facilitando a resolução do problema, e reduzindo o custo do mesmo. É muito mais simples corrigir um defeito detectado minutos ou horas após termos finalizado a codificação, do que dias ou semanas depois, quando alguém encontra o problema em produção. Além disso, um bug em produção pode ter um alto custo, dependendo do impacto aos usuários - financeiro, imagem, satisfção - enquanto que o custo é praticamente zero se o erro for detectado antes de ir para produção. Automatize os Testes automatizados (introduzir TDD) Sobre TDD Testes unitários aqui vamos adicionar um código exemplo de teste unitário Integre continuamente 26 Testes funcionais aqui vamos adicionar um código exemplo de teste funcional Automatize a Análise estática de código • equipe, legibilidade de código aqui vamos adicionar um código para Análise estática de código ArchUnit (princípios de evolutionary architecture) Deploy não precisa ser Release Até o momento toda e qualquer mudança que adicionamos, uma vez que passam por nosso pipeline de integração e entrega contínua são imediatamente visualizadas pelas usuárias de nosso sistema. Isto não é ideal por uma série de razões: 1. Se estivermos desenvolvendo uma funcionalidade mais com- plexa, que demore dias ou mesmo semanas para ficar pronta, evitaremos integrar as mudanças (seja mantendo o código em nossa máquina, ou criando uma branch), aumentando o risco de sofrimento ao mergear tantas mudanças de uma vez só. 2. Enquanto temos algumas dezenas de usuários, talvez seja ok introduzir uma modificação que introduza um defeito. No entanto, quando tivermos milhões de usuários, isto certa- mente passa a não ser aceitável. A resposta tradicional a este problema é a criação de processos de homologação (em geral manual), difíceis de gerenciar e que atrasam a disponibilidade de uma nova feature. Aqui introduzimos os conceitos de Deploy e Release: • Deploy: implantação da versão de um software em um dado ambiente, sendo uma decisão explicitamente técnica • Release: processo de tornar uma funcionalidade disponível aos usuários, sendo uma decisão de negócio O ponto principal para entendermos a separação destes dois con- ceitos é: podemos fazer o deploy do código de uma nova funcional- idade sem necessariamente torná-la disponível aos usuários. Para tanto, utilizamos feature toggles. Deploy não precisa ser Release 28 Feature Toggle Uma Feature Toggle (ou feature flag) é um padrão que permite controlar a ativação de uma porção de código. Em sua forma mais simples, pode ser apenas binário, indicando que um trecho está ativo ou inativo. Mas ela também pode ser dinâmica, recebendo parâmetros (como usuário, região de acesso, entre outros) para decidir se está ativo ou não. Talvez você já tenha se deparado com esta forma dinâmica, quando utilizou algum mecanismo de autor- ização que controla se uma funcionalidade está disponível para um usuário baseado em suas credenciais, por exemplo. Um outro uso interessante de feature toggles dinâmicas é a implementação de testes A/B. A capacidade de integrar uma porção de código que sabemos não será exercitado, nos dá a oportunidade de integrar partes de código de uma funcionalidade que ainda não está completa. Isto é extrema- mente útil para uma boa prática de Integração Contínua ⁸, pois permite que integremos nossas modificações com uma frequência maior. Com uma maior frequência de integração, a quantidade de modificações que adicionamos em cada deploy é menor, o que reduz o risco de introduzir defeitos. De qualquer forma, uma certeza que temos é que eventualmente introduziremos defeitos em nosso software. Na eventualidade de detectarmos um problema após um deploy, fica mais fácil iden- tificar a causa quando a quantidade de mudanças introduzidas é pequena. Se o defeito surge após a ativação de uma feature toggle, é muito provável que tenha sido causado pelo código associado à funcionalidade ativada. Além de nos ajudar a identificar a causa doproblema, podemos rapidamente desligar a funcionalidade, e assim nos recuperarmos da falha, e dar tempo (e tranquilidade) para que a equipe de engenharia encontre a causa, conserte o problema, e então redisponibilize a funcionalidade para nossas clientes. ⁸Continuous Integration https://continuousdelivery.com/foundations/continuous-integration/ Deploy não precisa ser Release 29 Defina um feature toggle aqui vamos adicionar um exemplo de feature toggle para mostrar o (“Hello World”) no ambiente de pro- dução Toggles de longa duração Esta capacidade das feature toggles de nos auxiliarem em cenários de falhas é extremamente poderoso. A partir disto, podemos utilizar este padrão de uma forma mais permanente, com o intuito de mit- igarmos riscos. Surge aqui o conceito de toggles de longa duração. Considere o cenário apresentado anteriormente, com um processo critico que era executado por um sistema de terceiro. Neste caso, haviam vários fornecedores que proviam a execução deste processo. Como forma de mitigar o risco de impactar nossas usuárias em função de um eventual problema ou indisponibilidade do fornece- dor, mantemos uma toggle (e contratos com mais de um fornece- dor), que nos permitia configurar dinamicamente a porcentagem de processos que seriam atendidos por um ou outro fornecedor. Caso um fornecedor esteja tendo problemas, podíamos desviar a carga para o outro e vice-versa, até que tudo seja reestabelecido. Um outro exemplo do uso de toggles de longa duração é sobre funcionalidades não críticas: imagine um e-commerce que esteja recebendo uma carga acima do esperado, e começa a degradar por conta disso; podemos desligar o sistema de recomendação, por exemplo, para diminuir o tempo de carregamento da página para nossas clientes. [Link para referências de Graceful Degradation and Netflix lower quality fallbacks] Deploy não precisa ser Release 30 Este padrão permite um melhor processo de Entrega Contínua. Imagine um aplicativomóvel, por exemplo, onde várias equipes dis- tintas estão trabalhando em diferentes funcionalidades ao mesmo tempo. Geralmente, por conta dos processos de aprovação das lojas, não é viável gerar uma release do aplicativo a cada commit. Desta forma, em geral uma nova release é gerada com várias mudanças ao mesmo tempo, de vários times diferentes. Se um time introduz um defeito, este acaba segurando a geração de uma nova versão do aplicativo, impedindo que as demais alterações sejam disponibilizadas para as usuárias. Se este defeito estiver protegido por uma feature toggle, basta desligá-la e criar a nova versão. Restrinja o acesso via toggle Outro forma interessante de se utilizar feature toggles, é para restringir o acesso a uma funcionalidade para um conjunto de usuárias. Com isto, podemos criar mecanismos de rollout que vão liberando uma funcionalidade aos poucos (por exemplo, primeiro com 1% da base de clientes, depois para 5%, 10% … até atingirmos toda a base). Com isto, podemos validar a funcionalidade aos poucos, detectando problemas comum conjunto menor de pessoas, reduzindo o impacto. Esta capacidade é útil para “prototiparmos em produção”. Ao invés de validar uma idéia, design ou mudança com protótipos não funcionais, com simulações de uso em pesquisas com usuárias, podemos implementar uma ideia simples, disponibilizar para um conjunto específico de pessoas, e capturar os feedbacks para iterarmos sobre a solução. E podemos fazer isto com mais de uma ideia ao mesmo tempo - o chamado A/B testing. aqui vamos adicionar um exemplo de como restringir o acesso via toggle Para mais detalhes, sugerimos a leitura do artigo de Pete Hodgson Deploy não precisa ser Release 31 sobre o tema ⁹. ⁹Feature Toggles (aka Feature Flags) https://www.martinfowler.com/articles/feature-toggles.html Squad de produto Lean Inception, produto e a equipe No workshop Lean Inception, a equipe trabalhou junta para enten- der os objetivos do produto, os principais usuários, e o desafio téc- nico. Além disto, a equipe criou o sequenciador de funcionalidades, o qual organiza e planeja entregas do produto a partir do MVP. Tipicamente, times utilizando o sequenciador de funcionalidades irão deslumbrar e evolução do produto via uma sequência deMVPs, validando cada novo aspecto e interação do produto com seus usuários. Segue um exemplo de um sequenciador, do livro Lean Inception ¹⁰. ¹⁰CAROLI, Paulo. Lean Inception: Como alinhar pessoas e construir o produto certo. Editora Caroli, 2018. Lean Inception, produto e a equipe 34 MVP e suas funcionalidades Embora seja uma ferramenta eficiente para descrever e alinhar visualmente o mapa de evolução do produto, o sequenciador por si só não resultará em entregas de sucesso. Independente de excelentes planos, se a equipe não estiver muito coesa e trabalhando efetivamente como um time, a execução do plano fica comprometida. Para tanto, sugerimos fortemente que o time técnico que participa da Lean Inception do produto seja o mesmo time envolvido na sua implementação, caracterizando assim a Squad de produto. Lean Inception, produto e a equipe 35 Uma Squad de produto é formada por um grupo multi-funcional e multi-disciplinar de pessoas que são coletivamente responsáveis para a entrega emanutenção de um produto. Normalmente, a squad do produto desempenha um papel crucial dentro da organização: a equipe é responsável pela implementação da estratégia, evolução, definição das funcionalidades, criação e manutenção do produto. Objetivos do Squad de Produto É importante destacar que o produto desenvolvido a partir do MVP é apenas uma versão inicial. Desta forma, o(s) sistema(s) que desenvolveremos para validar o conjunto de hipóteses sobre o negó- cio que definimos na Lean Inception, será modificado conforme vamos aprendendo com as pessoas que experimentarão o produto, e novas hipótese sejam criadas. E dentro do ambiente competitivo que vivemos, esta evolução deve ser rápida: novas hipóteses devem ser testadas e ajustadas em dias ou semanas, ao invés de meses ou anos. Como bem descreve o autor de Lean Inception¹¹ “… oMVP promove uma criação evolutiva. Logo, a arquitetura, bem como o ferramen- tal de construção do produto, deve permitir a evolução gradal e contínua”. A partir disto, podemos entender que a Squad de Produto tem três objetivos principais: 1. Validar as hipóteses de negócio 2. Desenvolver sistemas que sejam facilmente modificáveis 3. Definir uma estrutura de desenvolvimento e entrega ágil ¹¹CAROLI, Paulo. Lean Inception: Como alinhar pessoas e construir o produto certo. Editora Caroli, 2018. Desenvolvimento Iterativo Acabou a semana da inception enxuta, e agora o time tem o entendimento sobre o MVP e está alinhado sobre qual são as primeiras features a serem criadas. As features e o MVP estão em alto nível, mostrando claramente o que tem ser feito, entretanto sem os detalhes sobre como isso vai ser feito. O time agora precisa aprofundar nos detalhes de como serão criadas essas features. Para tanto o time deve utilizar de algumas dentre várias técnicas que auxiliam nesse entendimento mais detalhado. Histórias do usuário, prototipação rápida, desenvolvimento baseado em com- portamento (BDD) e testes de aceitação são exemplos de algumas das técnicas para ajudar com o detalhamento das features. Usando algumas dessas técnicas o time estará aprofundando sobre a forma com a qual as features serão criadas. Entretanto, aprofundar não é complicar! Fique muito atento para não estar adicionando alguma técnica de detalhamento que estará complicando e distan- ciando o entendimento em relação as features e o MVP. Ao primeiro sinal de que alguém está trabalhando em algo que não está vinculado ao MVP, pare e reavalie. Provavelmente estamos complicando algo desnecessariamente. Mantenha sempre o canvas MVP próximo ao time. Sempre que alguém explicar alguma tarefa ou algo que esteja fazendo, aponte para o canvas MVP. Pergunte como tal tarefa está relacionada com o MVP. Uma boa resposta ajuda todos a entenderem como tal tarefaestá aprofundando sobre o que está sendo feito para o MVP. Uma Desenvolvimento Iterativo 38 resposta confusa pode ser um bom indicador de um complicador. Cuidado, aprofundar não é complicar! . Sprint 0 A Sprint Zero Para times usando a metodologia Scrum, é comum o termo Sprint Zero. Apesar de não começarmos a contar do zero (contamos 1, 2, 3…), times Scrum comumente se referem a primeira sprint como Sprint Zero, sendo essa a Sprint dedicada a atividades de set-up, as quais não contemplam tarefas diretamente relacionadas a criação de funcionalidades do produto. Independente de utilizar Scrum ou outra metodologia para o geren- ciamento e acompanhamento da criação do produto, sugerimos utilizar este conceito de dedicar um tempo inicial (uma ou duas semanas) para realizar as tarefas iniciais preparatórias para o ambiente de trabalho. Atividades da Sprint 0 Este capítulo compartilha uma sequência de atividades para lev- antar as tarefas para o mínimo necessário de set-up para começar o trabalho. O número de tarefas levantadas vai variar de time para time. O perigo de levantar muitas tarefas, é que levaria muito tempo até começar o trabalho nas funcionalidades do MVP, gerando, assim, ansiedade para todos que esperam o MVP. Portanto, consideramos a combinação da ideia de Sprint Zero com as tarefas de set-up, para deixar claro a todos que o time não vai trabalhar em funcionalidades do MVP neste curto período inicial. E da mesma forma que o time pede por esse período inicial para set- up, ele se compromete a trabalhar efetivamente nas funcionalidades do MVP após esse Sprint Zero. Ou seja, depois do zero, o time vai começar a contar; sejam semanas ou sprints (para quem utilizar Scrum). E assim que começar a contar, estará trabalhando efetivamente nas tão esperadas fun- cionalidades do MVP. Tarefas de set-up Para dar início a criação do produto precisamos de definições básicas sobre o ambiente de trabalho e sobre as normas de interação entre as pessoas. Para tanto, precisamos buscar o alinhamento e definição das mesmas. Na mesma linha de pensamento que utilizamos para a definição de MVP, precisamos definir o mínimo necessário em relação ao ferramental e ao ambiente de trabalho para que possamos começar a construir o produto. Reunindo todos membros do time em uma Atividades da Sprint 0 42 sala, realizamos um workshop de duração média de duas horas, onde são realizadas a seguinte sequência com três atividades: Moscou, Votação Mais / Menos e Quem/O que/Quando, atividades detalhadas em Fun Retrospectives¹². Atividade: Moscou AatividadeMoscou auxilia na conversa de alinhamento sobre o que é essencial para começarmos, em relação ao que pode vir depois. Passo a passo da atividade 1. Divida o canvas em três sessões: precisa ter (Must Have), deveria ter (Should Have) e poderia ter (Could Have). O nome da atividade é Moscou pois lembra, em Inglês, MustShould- Could, ou, cortando algumas letras, MuShCou. 2. Selecione três cores de post-it explique a categoria de cada cor. Por exemplo: amarelo para comunicação, verde para pipeline de entrega contínua, e rosa para ambiente de desenvolvi- mento. 3. Distribua post-its coloridos e canetas a todos participantes. 4. Peça que cada participante escreva no post it (usando a cor de acordo com a categorização adequada) o que ele acredita ser importante para o time. 5. Peça aos participantes que coloque os posts no canvas comum de acordo com o seu entendimento em relação ao que precisa, deveria, ou poderia ser feito. As duas atividades a seguir complementam a atividade Moscou para buscar o alinhamento do time para o iniciar a criação do produto. Sugerimos fortemente descartar os posts da sessão de poderia ter. Relembramos que o objetivo principal é buscar o ¹²http://www.funretrospectives.com http://www.funretrospectives.com/ http://www.funretrospectives.com/ Atividades da Sprint 0 43 mínimo de alinhamento para dar início a criação do produto. Portanto, o time deve focar sua atenção para a sessão deveria ter, ou, em outras palavras, o que é essencial para começarmos a trabalhar efetivamente. Atividade Votação Mais / Menos Esta atividade permite aos participantes serem mais claros sobre concordâncias e discordâncias sobre os itens levantados. É tipica- mente usada para focar a conversa nos itens que mais interessam ao grupo. Passo a passo da atividade 1. Instrua os participantes sobre as regras de votação: • Cada participante tem direito a votar 5 “+” e 3 “–” (cada voto será representado por uma marca de “+” ou “–” no post-it. • Os participantes podem colocar mais de um voto em um cartão. • (+) representa sua concordância com uma anotação e você quer falar sobre ela. • (–) representa sua discordância com a anotação e você quer falar sobre ela. “Por favor, vote nos itens que você quer discutir. Os itens com mais votos serão selecionados primeiro.” Atividades da Sprint 0 44 Votação Mais Menos Atividade: Quem/O que/Quando A atividade Quem/O que/Quando ajuda a definir comprometi- mento e ações de acompanhamento para os itens levantados. A partir desta atividade, os “próximos passos” ou “itens de ação” estarão claramente definidos e visíveis para o time. Passo a passo da atividade 1. Crie uma estrutura de tabela que tenha como títulos de coluna QUEM / O QUE / QUANDO. 2. Peça para os participantes selecionarem (da atividade ante- rior) ou escreverem um passo concreto com o qual possam se comprometer. Estes deve ser tanto (1) passos que eles deve seguir; ou (2) passos nos quais acreditam bastante. 3. Cada passo concreto selecionado formará uma linha na tabela Quem/O que/Quando. Peça para os participantes para: • Colocar o post-it com o passo na coluna O QUE; • Escrever seus nomes na coluna QUEM; • Definir QUANDO o item estará feito. Atividades da Sprint 0 45 Quem/O que/Quando nas colunas da tabela Ao focar a discussão no formato Quem/O quê/Quando, você pode conectar pessoas a ações claras que elas definiram e com as quais se comprometeram. Ela permite aos participantes serem claros em relação a seu comprometimento e responsabilidades, tornando visível para todo o grupo QUEM vai fazer O QUE e QUANDO. Esta atividade é inspirada na matriz Quem/O que/Quando no livro Game Storming¹³. Path to Production <colocar foto da atividade e escrever mais > Iremos pensar em nosso Caminho para a Produção de ponta a ponta, considerando vários aspectos, como arquitetura, qualidade e entrega contínua de software. ¹³http://gamestorming.com/ http://gamestorming.com/ http://gamestorming.com/ Minimum Viable Architecture (MVA) Arquitetura Mínima Viável (MVA) O MVP permite que a equipe de possa entregar um produto nas mãos de usuários rapidamente, a um baixo custo. Quanto mais cedo o produto for utilizado, mais se pode aprender com os usuários para melhorá-lo. A melhor maneira de aprender e evoluir é ouvir de usuários que utilizam o software, não de pessoas olhando para uma folha de papel em branco tentando visualizar como um sistema deve funcionar. Um dos desafios que a abordagem MVP apresenta é de que ela pode levar à falta de uma arquitetura. Quando construindo um produto do zero, a pressa para entregá-lo pode vir ao custo de uma arquitetura sustentável. Deve haver balanço entre velocidade de entrega e qualidade. É necessária uma arquitetura mínima viável (MVA)¹⁴. <Este link está quebrado - o domínio não existe mais> Então, como definimos qual o MVA? Recomendamos realizar per- guntas como estas: • Quantos usuários utilizarão o sistema no lançamento inicial? Nos primeiros 6 meses? Dentro de um ano? • Os usuários iniciais serão internos, externos, ou ambos? • Quantas transações por segundo esperamos no lançamento? Nos primeiros 6 meses? Dentro de um ano? • Como os usuários começarão a utilizar o sistema? • Qual o nível de segurança e auditabilidade exigido no lança- mento? Dentro de 6 meses? Dentro de um ano? ¹⁴http://www.kavistechnology.com/blog/minimal-viable-architecture/ http://www.kavistechnology.com/blog/minimal-viable-architecture/http://www.kavistechnology.com/blog/minimal-viable-architecture/ http://www.kavistechnology.com/blog/minimal-viable-architecture/ Arquitetura Mínima Viável (MVA) 48 Micro-serviços de Domínio A abordagem de micro-serviços é um estilo de desenvolvimento no qual uma aplicação é composta de uma série de pequenos serviços, cada um rodando em seu próprio processo e se comunicando através de mecanismos leves (geralmente uma API HTTP). Estes serviços são construídos em torno de requisitos de negócio, e devem ser capazes de ir à produção independentemente e de forma automatizada. Uma abordagem para definir o escopo de um micro-serviço é anal- isar qual a funcionalidade de negócio que ele se propõe a disponibi- lizar, e como este serviço se relaciona com outros. Mapeamento de contexto é uma ferramenta em Domain Driven Design que auxilia na identificação de diferentes contextos e seus limites. Um contexto encapsula os detalhes daquele domínio, como omodelo e os dados, e define os pontos de integração com outros contextos. Desta forma, há uma relação direta em DDD e mapeamento de contexto com a definição de micro-serviços, que devem possuir interfaces bem definidas e se limitarem à uma certa quantidade de funcionalidades de negócio. Embora micro-serviços adicionem complexidade operacional para serem mantidos, eles provêm uma arquitetura forte e flexível, na qual diferentes contextos têm limites bem definidos e podem ser implementados da maneira como for mais adequado (com quais tecnologias e estratégias forem apropriadas). Registro de Decisão de Arquitetura Trabalhar com o MVA significa que a arquitetura é evolutiva, por isso, é muito importante registrar as decisões que serão realizadas ao longo do percurso. Isso ajuda para que as pessoas entendam o momento e o motivo de cada decisão. Os Registros de Decisão de Arquitetura — em inglês, Architeture Decision Records – são uma técnica para capturar decisões impor- tantes de arquitetura, juntamente com seu contexto e consequên- cias. Recomendamos armazenar esses Registros de Decisão de Arquite- tura juntamente com o código, no repositório. Desta forma, eles fornecem um registro que permanece sincronizado com o estado do código e arquitetura. Segue um exemplo de Registro de Decisão de Arquitetura quando adicionamos AAA no nosso pipeline. <adicionar exemplo de Registro de Decisão de Arquitetura> Compartimentalização Quando construindo MVPs, o ideal é otimizar para aprendizado, ao invés de puramente velocidade de entrega. Com isto em mente, a palavra “falha” passa a ter outro significado. um navio petroleiro Um experimento resultará em algo. Quando considerando uma hipótese ou uma feature, geralmente se pensa positivamente, e isto é ok. Porém, é importante organizar a arquitetura do produto de forma que a equipe seja capaz de lidar com “falhas” localizadas sendo um resultado possível. A falha é uma oportunidade de aprendizado. Ela é necessária, mas exige preparação. Compartimentalização 51 tanques de óleo de um navio petroleiro - visão lateral tanques de óleo de um navio petroleiro - visão superior Embora sejam grandes, tanques de óleo são costruídos com diversos compartimentos menores de óleo. Caso um compartimento tenha um problema, o navio não afunda. Este design protege o navio inteiro de uma falha localizada em um tanque de óleo. É desta maneira que o MVP e as features devem ser arquitetadas. O produto deve estar preparado para experimentação de novas fea- tures, ao mesmo tempo em que se mantém estável conforme novas features (compartimentos) estão sendo trabalhadas. Experimentos são importantes para validar novos aprendizados, mas não devem colocar o produto em risco. . Métricas Métricas acionáveis O livro Lean Startup, de Eric Ries, junto com o conceito de MVP, introduziu também o conceito de métricas acionáveis, aqueles dados que nos ajudam a tomar decisões. Mas, infelizmente, muitas organizações coletam métricas de vaidade, aqueles dados coletados para nos fazer sentir bem, mas que não nos ajudam com as decisões difíceis sobre qual ação tomar. No livro Lean Analytics, Alistair Croll e Benjamin Yoskovitz afir- mam: “Se você coleta dados sobre os quais não pode agir, então você está usando uma métrica de vaidade”. Uma métrica efetiva deve te ajudar a tomar decisões, a agir! Se você está trabalhando com MVP você está buscando dados para ajudar com o processo decisório, de forma a decidir suas próximas ações. No livro “How toMeasureAnything”, Douglas Hubbard recomenda a seguinte técnica para decidir que métrica usar: 1. Defina o resultado que busca através de exemplos 2. Identifique como esse resultado pode ser observado 3. Projete a medição do resultado Coletar dados geralmente não é um problema. A maior dificuldade é coletar os dados acionáveis, de forma a apoiar o processo decisório e não se perder em meio a tanta informação e possibilidades. To be continued… Métricas 53 Dados para Métrica <tbd: revisar e colocar links> Ao trabalhar com MVP estamos decididos a trabalhar com dados reais. Nossas decisões sobre a evoluçao do produto são baseadas em dados reais, os dados sobre a utilização do nosso produto. A análise inicial e a decisão sobre o que construir foi muito importante, mas agora é o momento de colocar os pingos nos “i”s. Ou seja, vamos coletar dados. Para isso e necessário a utilização de alguma (ou algumas) ferra- mentas para a coleta de dados. Alguns exemplos: Mixpanel, Kiss metrics, e Keen IO. Toda e qualquer interação com o produto deve fornecer dados para serem analizados. Escolha a ferramenta adequada e coloque-a em uso. Aceite que você não sabe exatamente o que vai acontecer. Por isso voce deve coletar esses dados. O primeiro passo é preparar o produto para coletar os dados acionáveis. Depois você vai analizá-los para melhor decidir a evolução do seu produto. Analisando os resultados <tbd: texto e exemplo de análise de dados> Conclusão . DRAFT Segue abaixo texto ainda solto, em WIP – writing in progress—que será refatorado, restruturado e adicionado ao eBook. MVP como início do empreendimento O Produto Mínimo Viável é o conjunto mínimo de funcionalidades que precisamos disponibilizar aos potenciais usuários para validar as nossas hipóteses. Este pensamento surge a partir de uma visão simplificada sobre o que é o MVP. Mas MVP é o início do desen- volvimento de um produto. O desenvolvimento de um produto é muito maior do que somente o desenvolvimento de suas funcionalidades; desenvolver um produto é desenvolver um empreendimento. Mesmo em uma empresa com diversos produtos, podemos entender cada produto como uma pequena startup. Segundo Eric Ries, no seu livro Lean StartUp: “A comprehensive theory of entrepreneurship should address all the functions of an early-stage venture: vision and concept, product development, marketing and sales, scaling up, partnerships and distribution, and structure and organizational design.” Small batches Small batches - small batches siginifica um experimento de cada vez; quantidade de trabalho que se move de um estágio para o outro DRAFT 56 Precisamos criar uma estrutura de desenvolvimento que permita tabalharmos com pequenos lotes, de forma não burocrática. Pre- cisamos criar uma estrutura de desenvolvimento que permita um fluxo rápido da esquerda para a direita (the first way) e um fluxo de feedback constante e rápido da direita para a esquerda (the second way). Desta forma, a primeira preocupação deve ser criar a fundação mínima de nosso empreendimento: o pipeline de entrega contínua. O primeiro passo é automatizar o deploy de nossa aplicação. A working software application can be usefully decom- posed into four components: executable code, config- uration, host environment and data. If any of them changes, it can lead to a change in the behavior of the application. [^ContinuousDelivery] (p.13) Geralmente, se você está desenvolvendo seu produto em uma orga- nização consolidada, certamente não hámuitas dúvidas sobre como empacotar e implantar suaaplicação - basta utilizar os padrões já utilizados. ** NOTA IMPORTANTE ** Já tive a experiência de ajudar algumas organizações estabelecidas a iniciar suas jornadas no mindset e práticas de desenvolvimento Lean de produtos. Em geral, definíamos um novo produto para exercitar, e a empolgação sempre era bastante grande. Neste momento, surgia o desejo de tentar resolver todos os problemas da organização. Em muitos casos, os conceitos de Entrega Contínua e Integração Contínua não eram utilizados. Surgia então a ideia de fazer tudo diferente no novo produto - por exemplo, usar cloud numa organização que não fazia isso antes. Neste momento, é muito importante refletir sobre o objetivo principal - entregar os objetivos de negócio do produto, ou modernizar a infra da organização. Trabalhar nos dois objetivos ao mesmo tempo pode aumentar o lead time DRAFT 57 dos mesmos. Talvez seja mais interessante separar ambos em iniciativas separadas - desenvolver o novo produto com o máximo da infra atual, e escolher um produto já estabelecido da organização para migrar para a cloud por exemplo. Não infle o escopo do seu produto a não ser que seja essencial para o sucesso do mesmo. No entanto, é possível que você esteja desenvolvendo o primeiro produto da sua nova empresa. Se for este o caso, você terá que tomar algumas decisões: #### Plataforma como Serviço (PaaS) Plataformas como Serviço • Qual infra utilizar? OnPremise? IaaS? PaaS? • Como empacotar? docker? Pacotes debian, rpm? outros? ** DEVEMOS FALARUMPOUCOSOBREASVANTAGENS, DESVAN- TAGENS E OPÇÕES DE CADAUMADESTAS ALTERNATIVAS?? ** Independente de qual opção escolher, uma coisa é certa: Toda a configuração de sua infraestrutura deve estar noControle de Versão, e ser automatizada. Hoje em dia há uma série de ferramentas que nos auxiliam nesta tarefa: * Ansible * Puppet * Chef * Terraform ** Servidores Fênix Entrega Contínua Existem cinco princípios fundamentais: * Build Quality In * Work in Small Batches * Computers perform repetitive tasks: people solve problems * Relentlessly pursue continuous improvements * Everyone is responsible Referências Todas as referências citadas neste livro estão nesta lista de referên- cias, que segue a ordem conforme aparecem no texto. CAROLI, Paulo. Lean inception: como alinhar pessoas e construir o produto certo. Editora Caroli; 1ª edição, 2018. Principles behind theAgileManifesto (2001) , Disponível em http://agilemanifesto.org/principles.html, Acesso em 2 de setembro de 2018. RIES, Eric. The Lean Startup: How Today’s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses. Crown Publishing (1st Edition), 2011. HUMBLE, Jez and FARLEY, David. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automa- tion, Addison-Wesley, 2010. Sobre Alexandre Corrêa Barbosa Alexandre C. Barbosa teve sua primeira experiência profissional como desenvolvedor em 1999. Formado em Engenharia de Com- putação pela Unicamp, Alexandre trabalha atualmente como En- genheiro de Software no Nubank, e antes foi Consultor de De- senvolvimento Principal pela ThroughtWorks Brasil, onde atuou de 2012 a 2019 (e teve o prazer de trabalhar com Caroli). Teve a oportunidade de trabalhar em diferentes domínios: bionformática, financeiro, varejo, educação, saúde, entre outros; trabalhou também com diferentes plataformas e tecnologias, atendendo clientes no Brasil e EUA. É apaixonado pela busca constante da excelência técnica, e acredita que o mindset Lean é uma poderosa ferramenta nesta busca. Alexandre Corrêa Barbosa Sobre Paulo Caroli Consultor principal da Thoughtworks Brasil e cofundador da Ag- ileBrazil, Paulo Caroli possui mais de vinte anos de experiência em gestão e desenvolvimento de software, com passagem em varias corporações no Brasil, Índia e EUA . Em 2000, conheceu o Extreme Programming e, desde então, tem mantido seu foco em processos e práticas de gestão e desenvolvimento ágil. Ingressou na Thought- Works em 2006 e ocupou os cargas de agile coach, treinador, e Gerente de Projetos. Possui os títulos de Bacharel em Ciência da Computação e MS em Engenharia de Software, ambos da PUC - Rio. Autor dos Livros ” Direto Ao Ponto; Criando Produtos de forma enxuta” , e “Fun Retrospectives; activities and ideas formaking agile retrospectives more engaging”. Paulo Caroli Acompanhe Paulo Caroli no seu site e nas redes sociais: Sobre a Editora Caroli Para leitores e autores que buscam e compartilham conhecimento de forma ágil, a Editora Caroli é uma editora-butique – todos os livros são escritos, lidos, editados e/ou revisados por Paulo Caroli, que auxilia na produção, divulgação e distribuição de livros e e- books. Diferentemente das editoras tradicionais, a Editora Caroli dá acesso ao conhecimento na sua essência, disponibilizando o texto das novas obras via e-books gratuitos, além de apoiar eventos e entidades de ensino, presenteando-os com livros impressos. Em www.caroli.org você encontra este e outros conteúdos de qual- idade. Aproveite, pois os livros e e-books emWIP estão disponíveis gratuitamente. WIP (Writing In Progress) A Editora Caroli apresenta uma nova proposta de trabalho, aprox- imando autores dos seus leitores desde o início da geração do conteúdo. Por que esperar o autor terminar de escrever para ver se o conteúdo é bom? No mundo atual, isso não faz mais sentido. Por isso, a Editora Caroli promove o compartilhamento (gratuito sempre que possível) do WIP por meio dos formatos e-book (pdf, mobi e epub). Dessa forma, leitores têm acesso rápido a novas ideias e podem fazer parte da evolução da obra. Para os autores, é uma forma efetiva de feedback e motivação para a geração de conteúdo. Table of Contents Disclaimer Mindmap Eu sou um Dev Eu sou um facilitador Introdução Preparando as Fundações do Produto Arquitetura Mínima Viável Atividades para definição dos Requisitos Cross-Funcionais MVA e arquitetura Evolutiva Preparando para entregar continuamente Crie o Pipeline inicial de Entrega Contínua Pipeline de Entrega Contínua Prepare o Ambiente de Desenvolvimento Comece com um Controle de Versão Utilize um Trunk único Modele a Infraestrutura como Código Entenda Entrega Contínua Evolua o Pipeline inicial Integre continuamente Automatize os Testes automatizados (introduzir TDD) Sobre TDD Testes unitários Testes funcionais Automatize a Análise estática de código ArchUnit (princípios de evolutionary architecture) Deploy não precisa ser Release Feature Toggle Defina um feature toggle Toggles de longa duração Restrinja o acesso via toggle Squad de produto Lean Inception, produto e a equipe Objetivos do Squad de Produto Desenvolvimento Iterativo Sprint 0 A Sprint Zero Atividades da Sprint 0 Tarefas de set-up Atividade: Moscou Atividade Votação Mais / Menos Atividade: Quem/O que/Quando Path to Production Minimum Viable Architecture (MVA) Arquitetura Mínima Viável (MVA) Micro-serviços de Domínio Registro de Decisão de Arquitetura Compartimentalização Métricas Métricas acionáveis Dados para Métrica Analisando os resultados Conclusão DRAFT MVP como início do empreendimento Small batches Entrega Contínua Referências Sobre Alexandre Corrêa Barbosa Sobre Paulo Caroli Sobre a Editora Caroli WIP (Writing In Progress)
Compartilhar