Porque desenvolvimento de software nunca vai ser engenharia

jaboot: quem puder perder (ou ganhar) 5 minutos, por favor leia

Traduzido: http://elegantcode.com/2011/06/22/why-software-development-will-never-be-engineering/ (e me desculpem a tradução)
Por John Sonmez

Sempre achei interessante quando os acadêmicos tentam quantificar as métricas generalizadas sobre desenvolvimento de software.
Coisas como: por linhas de código, haverão um número X de bugs.
Argumentos como: já foi empiricamente provado que “blah” afeta o desenvolvimento de software de alguma forma “blah”
Todos são pensamentos interessantes, mas desenvolvimento de software nunca irá se conformar em ter rígidos princípios de engenharia, assim como muitas
outras práticas de engenharia. Quanto mais trabalho na área, mais eu percebo que desenvolvimento de software não tem nada a ver com engenharia.

Só temos que assistir a algumas aulas de matemática na faculdade e só.

Contruindo pontes

Um dos principais argumentos que eu ouço as pessas fazendo é que o estado atual de desenvolvimento de software como prática da engenharia, é baseado com a sua relativa maturidade
com outros campos da engenharia.

Existe um enorme problema com essa linha de pensamento.

Esse argumento soa como isso: “Engenharia já existe fazem centenas de anos e alcançou sua maturidade até o ponto que pode ser considerada uma ciência
mensurável, mas o desenvolvimento de software só está aqui fazem poucas décadas, então é relativamente imaturo como uma disciplina da engenharia.”

Lá no fundo, esse argumento parece bacana. E certamente o desenvolvimento de software daqui a 50 anos será diferente de como é hoje.
Poxa, é muito diferente do que era há 10 anos.

Mas existe um problema. Nós construímos muito mais software do que pontes.

Deixe-me dar um exemplo que veio à tona em outra área do meu interesse… poker.

A rapidez do poker

Uma coisa interessante aconteceu na comunidade do poker fazem 10 anos; profissionais do poker com décadas de experiência começaram a serem batidos vezes e vezes por prodígios de 19 anos.

De uma perspectiva de fora, parece que o mundo do poker abriu a procura por talentos e aí está. Mas, examinando de perto, a evidência nos leva a verdade.

Antes da indústria do poker online nascer, poker era jogado em salas de carteado e cassinos nos estados onde era permitido, e ocasionalmente em pequenas
casas de jogos pelos EUA.

Um profissional de poker poderia jogar de 100 a 150 torneios por ano. A soma de todo conhecimento da comunidade do poker e o objetivo em torno do jogo era
baseado nessa base de profissionais de poker jogando dessa forma e ganhando experiência nessa faixa medíocre.

Uma vez que as salas de jogos de poker na internet começaram a abrir, as coisas mudaram e mudaram rapidamente. Agora qualquer um pode jogar poker
do seu computador de casa. Não só podem jogar poker, como também podem disputar torneios a qualquer hora do dia.

Uma lista das coisas que mais mudaram:

  • As mãos são em torno de 60 a 80 por hora, ao invés de 10 a 30;
  • Os jogadores podem disputar vários torneios ao mesmo tempo, não é difícil encontrar uma pessoa disputando 10 torneios;
  • Os jogadores podem analisar as histórias das mãos e dados dos jogadores, através de softwares;
  • A idade permitida fica na tela, teoricamente qualquer pessoa de qualquer idade pode jogar;
  • Jogadores podem jogar 24 hora por dia;
  • O jogador de poker online pode disputar facilmente 3000 torneios por ano, enquanto um profissional que prefere disputar em uma casa de tijolos
    seria sortudo se disputasse 100 por ano


Então onde eu quero chegar com tudo isso?

O ponto é que são muitas mais mãos e mais experiência e conhecimento de poker foi obtido em 1 ano de poker online do que provavelmente toda a
história do poker antes disso. Alcançamos uma forma acelerada e pacífica de jogar que todo o conhecimento anterior de poker ficou obsoleto.

A estratégia de torneio de poker mudou. O jogo talvez tenha evoluído 500 anos no futuro em questão de 5 anos.

O mesmo aconteceu com desenvolvimento de software.

Voltando a construir pontes

Então vamos pegar aquele exemplo de poker e olhar através das lentes do desenvolvimento de software.

Vamos comparar a maturidade da engenharia para o desenvolvimento de sofware para a maturidade da disciplina da engenharia para construir pontes.

Eu acho que a maioria das pessoas concorda que construir pontes é uma disciplina muito madura da engenharia, mas muitas pessoas vão argumentar que desenvolvimento de software não é.

[color=blue]Quantas pontes você acha que já foram construídas no mundo?[/color]

Bem, existem por volta de 600.000 pontes só nos EUA, então no mundo devem haver pelo menos 10 vezes mais que isso, talvez 20.

[color=blue]Quantos softwares já foram desenvolvidos?[/color]

Esse é um número muito impreciso de se estimar, mas vamos fazer uma (porca) projeção com base em quantos desenvolvedores de software existem no mundo.

Se disséssemos que existem 12 milhões de desenvolvedores de software e cada um construiu pelo menos 3 programas, podemos estimar que muito mais
programas de computador foram escritos do que pontes foram construídas.

Meu ponto não é falar mal sobre construção de pontes, somos muito bons nisso como um todo, mas para mostrar isso coletivamente,
mesmo porque estamos construindo pontes fazem séculos, nós provavelmente devotamos uma quantia equivalente de tempo construindo software.

Essa linha de pensamento pode te levar a argumentar que desenvolvimento de software e construção de pontes são muito diferentes.
Construção de pontes tem uma lista fixa de requerimentos que são muito parecidos ou até iguais para cada ponte que se constrói, mas desenvolvimento de
software é um grande vazio de caprichos e declarações contraditórias de forma ambígua.

Eu concordo 100% com você! E na essência, esse é o meu ponto.

Desenvolvimento de software é diferente

E já foi o bastante para perceber isso. Esperar que desenvolvimento de software se transforme em alguma disciplina da engenharia como qualquer
outra disciplina da engenharia é como esperar que a água sem o pozinho da gelatina se transforme em gelatina!

Não vai acontecer!

Na minha mente, é claro que o argumento de que não lhe deram tempo suficiente é apenas uma ilusão. A natureza do desenvolvimento de software, assim como o poker online, leva-se a rápida evolução.

Considere em qual direção o desenvolvimento de software está evoluindo. Está evoluindo na direção de rígidas práticas da engenharia, ou está evoluindo
exatamente na direção OPOSTA?

Há 10 anos atrás, tentamos usar diagramas UML e ferramentas CASE para desenvolver software. Dez anos atrás, Waterfall era a modinha.
Dez anos atrás, pensávamos que no futuro teríamos programas que permitiriam a nós construir software do mesmo modo que o CAD
ajuda a construir peças de máquinas.

Não só não aconteceu. Foi completamente por outro caminho. Agora, estamos todos falando de Agile. As pessoas quase não se lembram o que ferramentas CASE são.
Agora estamos construindo software sem tentar definir a coisa toda em diagramas UML.

[color=olive]O fato é que sistemas de software são bestas incontroláveis![/color]

Na minha cabeça, tudo se resume a uma distinção. Software está vivendo, pontes não. Quando você termina de construir uma ponte, acabou o trabalho com a ponte.

Claro que alguém, provavelmente não você, vai vir com aquela história de manutenção. Claro, algumas poucas coisas vão mudar, mas para todos os propósitos, o trabalho está feito.

Na maioria dos cenários de desenvolvimento de software, esse não é o caso. Na maioria dos cenários de desenvolvimento de software, quando se lança a V1, não se está nem perto do fim.
Algumas vezes, V1 e V2 nem se parecem. Desenvolvimento de software é algo que se opera em uma coisa respirando e viva, e deixando ela continuar.

A verdade é, nós, desenvolvedores de software temos mais em comum com cirurgiões do que engenheiros.

Muito boa esta conclusão sobre software e engenharia. Confesso que não achei tao atrativa assim a comparação com o Poker, mas enfim, o que vale eh o ponto. E o ponto foi certeiro.

Ha duas grandes diferenças entre software e engenharia que farão com que as duas áreas nunca sigam caminhos comuns. (Nunca eh uma palavra forte. Então vou dizer eu acho que nunca seguirão caminhos comuns)

A primeira delas esta no texto: Software eh feito para ser alterado, construção são feitas para durar uma eternidade no mesmo lugar e da mesma forma. Quanto menos mexer melhor. Software tem que ser alterado, quanto mais mexer melhor.

A outra eh a física que ajuda bastante na pre-definição da engenharia. Nós não a temos como auxílio.

Por que será que tanta gente pensa que engenharia é só construção civil ou coisas estáticas ou previsíveis?

Outro ponto: escreveu um post imenso só pra falar o óbvio: que software é um trabalho dinâmico e empírico.

Saudades do GUJ de antigamente…

Por que engenharia civil ? Se compararmos com Engenharia Química talvez fizesse mais sentido.

Uma ponte nunca muda seu objetivo, que é levar coisas e pessoas de uma lado para outro. Um software pronto pode sofrer alterações e mudar completamente em poucas horas. É muito mais instável.

A comparação do número de pontes construídas com o número de softwares desenvolvidos não faz sentido… O que você precisa para construir uma ponte?? E o que você precisa para desenvolver um software? Hoje há moleques de 12 anos (ou até mais novos) desenvolvendo softwares de computador… Mas por que não há jovens de mesma idade construindo pontes? A matemática por tras de uma ponte ou qualquer projeto de engenharia (seja elétrica, mecânica, civil, automação, etc) é mto mais complexa… A engenharia precisa de mto mais ferramentas, mto mais mão de obra, mto mais matéria prima. Pra mim esta comparação não deve ser feita.
Gosto mto de programar não quero desmerecer esta prática, mas como estou cursando engenharia sei mto bem que pra programar preciso ser bom de lógica, conhecer bem a arquitetura do meu projeto e frameworks utilizados e entender as regras de negócios. Para fazer algumas coisas em engenharia é mto mais complicado: você precisa entender o fenômeno físico e normalmente acaba caindo em equações matemáticas de dificil resolução… coisa que pouquissimos desenvolvedores de software precisarão…

Falar que em um projeto de engenharia o trabalho do engenheiro acaba quando o projeto é entregue é simplesmente irônico. Voces já procuraram pra saber como funciona o sistema anti-vibrações da ponte rio niterói?? Procurem saber… Ai vcs vão perceber q o trabalho do engenheiro continua por mto mais tempo…

E quem disse que desenvolvimento não pode ser uma matéria de engenharia? Fiquei surpreso certa vez quando estava no lab da faculdade testando um projeto em VHDL (uma linguagem usada para descrever hardware) e uma garota de engenharia civil veio me perguntar se aquilo era C… Onde estudo todos os cursos de engenharia têm introdução a programação. Tdo bem que desenvolvimento não se resume a apenas aprender algoritmos e uma linguagem mas podemos dizer que eles também aprendem um pouquinho sobre desenvolvimento de software… Desenvolvimento de software pode ser uma disciplina de engenharia SIM ainda mais porque um software nada mais é do que um grande circuito digital (apenas os fortes entenderão)

Porque gostam de comparar nós (programadores) com pedreiros/peões!

Essa foi a afirmação mais “besta” e “descontralada” que eu já ouvi :wink: .

Parece q tem gente com inveja de “moleques” de 12 anos que criam soluções de alto impacto e que mudam a vida das pessoas.

Porque gostam de comparar nós (programadores) com pedreiros/peões![/quote]

Isso me lembra o pessoal de PMI e seu hábito de comparar desenvolvimento de software com construção civil.

Concordo com o autor do post.
Realmente cada vez mais o desenvolvimento de software vem se afastando dos conceitos rígidos da engenharia como um todo. Até o momento já trabalhei em diversas empresas, uma delas com CMM5, muito dificilmente conceitos e padrões ditados por livros que pregam uma pseudo “engenharia” como a do PRESSMAN no livro “Engenharia de Software” são seguidos. No máximo rápidas modelagens usando pouco de UML e ponto. Acredito que a teoria da maior parte desses livros é como dizem por aí “lindia!!!” mas na prática é diferente. Penso que para desenvolver um software, eu tivesse que seguir os conceitos à risca que estão no livro de PRESSMAN, talvez, meus filhos algum dia conseguiriam terminar o projeto.

[quote=marcosalex]Por que será que tanta gente pensa que engenharia é só construção civil ou coisas estáticas ou previsíveis?

Outro ponto: escreveu um post imenso só pra falar o óbvio: que software é um trabalho dinâmico e empírico.

Saudades do GUJ de antigamente…[/quote]

Nao eh que pensam que engenharia eh so civil, eh que quando comparam comparam com engenharia civil. E por mais obvio que seja ainda tem muita gente que tenta desenvolver software como se constroi um predio.

Existe muitos pontos corretos na argumentação dele. Entretanto, creio que há também alguns pontos falhos, especialmente se falarmos em como o conhecimento científico é estruturado.

  • Quantos desses 12 milhões de desenvolvedores fizeram software usando método?
  • Quantos desses analisaram o método, e efetivamente construíram ou refinaram processos para comunidade?
  • Quanto tempo e exemplo tivemos para analisar esses processos?
  • Quantos mediram os impactos de longo prazo? (e por longo prazo, não estou falando em “3 anos” e nem “5 anos”, mas 10, 15, 20 ou até 30 anos).
  • Quanto tempo as pessoas que usam o software aprenderam a entender o processo de construção de software?

Nisso, o software perde muito feio para as engenharias tradicionais.
É esse tipo de argumentação que usamos quando dizemos que software, como ciência, ou como engenharia, ainda é um bebê.

A engenharia nada mais é do que estudar processos, métodos e práticas para fazer algo. Temos engenharias consolidadas que também são muito diferentes da engenharia civil, como a engenharia naval, aeroespacial, química ou de alimentos.

Boa parte do que existe nas metodologias ágeis também partiu de engenheiros de software ou de engenheiros de processos.
Não emergiu simplesmente “da comunidade”. Martin Fowler (Refactoring), Kent Beck (XP), Erich Gamma (Eclipse, Design Patterns e TDD), deram suas contribuições em trabalhos e feiras científicas. E ainda não somos capazes de avaliar o impacto desses caras em longo prazo (embora em curto, as técnicas de desenvolvimento ágil pareçam mesmo muito promissoras).

Rede neural então nem se fala.

Definição:

Me diga aonde isso não se encaixa em um ciclo de desenvolvimento.

E por favor, só por que eu coloquei em negrito, não seja ignorante ao ponto de dizer “afff tio, ele confundiu sistemas com sistemas de informática…”. Pense no contexto.

:shock:

Tudo isto para afirmar que software não e receita de bolo…
Até quando vai ter maluco querendo fazer receita de bolo para softwares? software é algo dinamico para soluções dinamicas não existe receita de bolo que nem é nas engenharias e ponto final! Querer inventar receita de bolo para desenvolvimento de software é perca de tempo!