Quando desenvolvemos software, vivemos em um ambiente de extrema incerteza, 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:
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 deste 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, por exemplo.
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?
Eu explico no episódio de hoje!