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