A metáfora da construção civil
Na engenharia civil, você faz um projeto de um edifício, planeja a execução e a executa. E funciona. Não me admira que muitos façam paralelos dessa fórmula para a engenharia de software, se funciona para civil, deve funcionar para para outros tipos de projeto.
Bem, com o passar dos anos, a medida que a idéia de projeto foi sendo inserida na engenharia de software foi se percebendo que não funciona bem assim. Os requisitos mudam o tempo todo, o cliente não tem certeza do que precisa, a equipe tem muitas dúvidas, há muito impedimento, pouco pode ser antecipado. O que é que há de errado?
Foram usados os mesmo conceitos da engenharia civil: planejar, alocar recursos e colaboradores para o projeto, executar. Tudo certo, como devia ser, e como sempre funcionou. Mas na engenharia de software não funcionou! Por que?
Muitos clamaram que construir um edifício é diferente de construir software. Que não se pode mudar uma casa dois metros para direita depois que os alicerces já tiverem sido construídos. Que a engenharia civil tem muito tempo de existência e por isto está madura e que por isso funcionam bem projetos na civil e não no software.
É tudo mentira. Engenharia civil e engenharia de software são sim muito parecidos! Depois de ter passado por inúmeros projetos eu percebi que sim engenharia civil e engenharia de software são idênticos em natureza.
É inegável que planejar tudo a priori e executar não funciona em software. O problema é que ninguém percebe que isso também não funciona em engenharia civil. De volta ao primeiro parágrafo: “Na engenharia civil, você faz um projeto de um edifício, planeja a execução e executa”…
“você faz um projeto de um edifício”… Isso vem antes de planejar a execução. Quando se projeta um edifício como o Gate Capital em Abu Dhabi, ou a ponte da baía de Hangzhou na China, ninguém começa a fazer nenhum tipo de alicerce sem ter a ponte bem projetada antes, nem mesmo a execução da obra é planejada. A falha que se há na metáfora da construção civil para software é que criar software é executar, quando na verdade é projetar.
Quando essas duas obras incríveis da engenharia civil foram projetadas (não construídas) todo tipo de desafio apareceu. Os requisitos mudaram o tempo todo, o cliente não sabia o que queria exatamente, a equipe tinha muitas dúvidas, haviam muitos impedimentos, pouco pôde ser antecipado. Esses problemas só terminaram quando o projeto arquitetônico acabou, exatamente como em software. A erro da metáfora da construção civil não está em hipotéticas diferenças entre civil e software, o erro é que software é 99,999% projeto e apenas 0,001% planejar a execução e executar.
Na fase de projeto você sempre pode mudar um prédio 2 metros para a direita, você pode até ver como ele ficaria de cabeça pra baixo no Cad, ver como iria desmoronar e tudo mais. Fazer simulações de resistência das colunas, testar o comportamento de um modelo contra correntes de vento. Idêntico a software.
Em software a execução é feita por scripts automatizados, eles pegam o projeto (que é o código fonte) e transformam na obra final (o executável para produção). Na engenharia civil o projeto é passado para o planejamento de execução, em software este projeto não são documentos como diz os métodos mais tradicionais, mas sim o próprio código fonte.
O erro foi sempre acreditar que os códigos fonte são os tijolos do edifício, quando na verdade eles são as especificações do edifício. A parte com maior apelo público da engenharia civil é a execução da obra, ver aquela estrutura imensa se levantar do chão ou do mar é sempre muito legal. Mas essa parte em software é trivial, um mecanismo automático faz por nós.
A parte criativa do processo de engenharia civil é que é interessante para a engenharia de software. Os arquitetos de edifícios têm os mesmos problemas dos analistas e arquitetos de software: entender o que o cliente quer, fazer um esboço, apresentar, refazer o esboço com os novos insights, apresentar, criar um modelo (código) e apresentar de novo, refinar e refinar até que as expectativas estejam alinhadas. Os engenheiros civis tem os mesmos problemas dos engenheiros de software e testers: verificar que o modelo está ok, testar o modelo contra as intempéries do ambiente (vento, solo, materiais, performance em produção, integração com outros sistemas), refinar, refatorar o modelo, entrar em consenso e negociar alternativas. É tudo idêntico. E depois que você termina o seu projeto, você roda o build para por em produção.
Idêntico.