Semana passada eu escrevi um artigo defendendo a tese de que código pronto é código entregue sendo usado pelo seu cliente.
Quando desenvolvemos software, vivemos em um ambiente de extrema incerteza. Vivemos em um nível muito alto de abstração. Por causa disso, a chance de cometermos erros por causa de mal-entendidos é muito grande.
Perante a este cenário, nós temos duas alternativas plausíveis para contornar este problema:
1) Planejar minuciosamente todos os nossos passos, considerando todas as variáveis possíveis para assim evitarmos estes erros;
2) Abraçar o erro como parte do processo e então trabalhar de forma empírica, elaborando e validando hipóteses.
No primeiro cenário, nós dedicamos grande parte dos nossos recursos ao planejamento. Diria que até a maior parte. A engenharia civil é um bom exemplo desse cenário.
Porém, não podemos utilizar outras engenharias como parâmetro. Você não consegue mover um prédio de 10 andares um pouquinho para a esquerda. Mas você, tranquilamente, consegue mudar o banco de dados de um sistema.
Software, por ser abstrato, é altamente mutável!
Além disso, nós vivemos em um mundo com recursos escassos. Nosso tempo é finito, nosso dinheiro é finito. E quando os recursos não são suficientes? E se errarmos no planejamento?
O primeiro cenário trata-se de uma grande aposta de recursos. Você está apostando a maior parte dos dois mais importantes: tempo e dinheiro. O risco é altíssimo!
Por isso eu defendo o segundo cenário. Já que software tem alta capacidade de mudança e nós não sabemos o que o nosso cliente quer, vamos usar essas características a nosso favor!
Mas, como trabalhar em um ambiente de extrema incerteza, “sem planejamento” e com eficácia?
Defina prioridades
A regra é simples: se tudo é prioridade, nada é prioridade!
É claro que existem módulos e funcionalidades que se dependem entre si. Mas, se o nosso objetivo é validar uma hipótese rápido, nós podemos fazer pequenas gambiarras. Calma, vou explicar!
Imagine que nosso objetivo é construir um sistema de controle de estoque. Qual a funcionalidade que mais vai gerar valor pro nosso cliente? Eu acredito que seja o controle. Ou seja, poder documentar quantas unidades de cada produto foram vendidas e quantas unidades foram compradas e estocadas.
Prioridade definida: Vamos entregar primeiro o módulo de controle!
Mas tem um problema. Como vamos cadastrar os produtos? Precisamos do módulo de cadastro antes, certo?
ERRADO!
Aqui entra a nossa gambiarra. A gente simplesmente cria uma tabela para os produtos e cadastra eles na mão (ou importa de uma planilha do excel, o que for mais fácil).
Dessa forma, nós teremos um módulo prontinho pro cliente usar, testar e validar se essa hipótese resolve o seu problema.
Enquanto não construirmos o módulo de cadastro, a gente segue subindo na mão os produtos. Se for um trabalho muito recorrente, temos um indício de novas prioridades.
Planeje apenas o seu próximo passo
Você viu que eu coloquei o termo sem planejamento entre aspas alí em cima? Isso porque na verdade há planejamento. Só que curto!
Vamos seguir no exemplo do sistema de controle de estoque.
Se definimos que o que vamos fazer agora é o módulo de controle, devemos investir tempo planejando como vai ser a tabela de cadastro? Não, não devemos. Essa tabela deve simplesmente atender as necessidades do nosso módulo de controle.
Lembre-se: o foco é gerar valor o mais rápido pro cliente. O cliente não está interessado na estrutura de dados da sua tabela de cadastro. O cliente está interessado em poupar o tempo dele e não precisar mais fazer o controle de estoque de forma manual.
Mas e o controle de acesso? E o histórico de cadastro? Depois a gente pensa…
O erro é bem-vindo
Lembre-se: Alta abstração e extrema incerteza. Uma coisa é fato, você vai errar!
Amyr Klink, aquele cara que veio remando da África até o Brasil, conta que o maior problema que ele teria seria o barco virar no meio do oceano. Ele vinha há meses pensando em como construir um barco que não virasse. Viu que era praticamente impossível.
Então, um amigo resolveu voltar o foco ao problema: O problema não era o barco virar. O problema era morrer por não conseguir desvirar o barco. Foi quando eles mudaram o foco para construir um barco que continuasse seguro, mesmo que virasse.
Esta é uma situação onde o erro é incorporado como parte do processo.
Voltando ao mundo do software, a forma de incorporar o erro ao processo é criando testes automatizados que validam se nosso código continua fazendo o deveria ser feito.
Assim, sempre que houver alterações no sistema (ou seja, toda hora), os testes vão garantir que tudo continua funcionando bem. Quando o barco virar, a gente consegue trazer ele de volta sem que nosso cliente perceba.
Entregue rápido o código novo
Código pronto é código em produção sendo usado.
Só que deployment sempre é um problema. Para você ter uma ideia, existem muitas empresas que possuem políticas explícitas de não atualizar sistema em produção nas sextas-feiras, para não correr risco de ter que corrigir cagada no fim de semana.
Isso acontece, basicamente, por três motivos: não há teste suficiente para este novo código; não há documentação do processo de como fazer; o processo é feito de forma manual.
O primeiro problema a gente já resolveu. Os outros dois são simples.
Quem atualiza código em produção sabe que existe uma receita a ser seguida. Deve-se atualizar o repositório, atualizar o banco de dados, atualizar dependência, reiniciar serviços. Etc. Para resolver o problema, basta mapearmos todo o processo e então automatizá-lo.
Isso se chama continuous delivery. Existem diversas ferramentas para nos auxiliar neste processo.
O objetivo aqui é criar um fluxo de trabalho onde, ao enviar novos códigos ao nosso repositório, todo o processo de teste e deployment seja feito de forma automática.
Programador não perde tempo fazendo deployment. Cliente têm sistema novo mais rápido. Recurso tempo otimizado. Todos ganham!
–
São esses os quatro passos que sempre seguimos nos projetos da Codevance. Seguindo estes quatro passos com certeza você vai atingir o seu objetivo, que é gerar valor para o cliente o mais rápido possível!