Gosto de reler meus livros favoritos a cada poucos anos, por isso trouxe o livro seminal de Robert Glass Facts and Fallacies of Software Engineering (Fatos e Falácias da Engenharia de Software) comigo em minha viagem mais recente. Achei que era uma leitura decente, mas imperfeita, quando o comprei originalmente em 2004. Ao folhear a introdução e o índice, percebi que Já escrevi sobre quase tudo nesse livro até agora.
Não sei se dei o devido valor a Facts and Fallacies em minha primeira leitura.
A simples recitação dos vários fatos e falácias parece um koan zen para a engenharia de software. Mesmo sem qualquer discussão e explicação de fundo no livro, é terapêutico ponderar sobre os breves resumos de uma frase apresentados no índice. Ao lê-los, o que lhe vem à mente, com base em sua experiência?
Pessoas
- O fator mais importante no trabalho com software é a qualidade dos programadores.
- Os melhores programadores são até 28 vezes melhores do que os piores programadores.
- Adicionar pessoas a um projeto atrasado o torna mais atrasado.
- O ambiente de trabalho tem um impacto profundo na produtividade e na qualidade.
Ferramentas e técnicas
- O hype (sobre ferramentas e tecnologia) é uma praga na casa do software.
- Novas ferramentas e técnicas causam uma perda de produtividade/qualidade.
- Os desenvolvedores de software falam muito sobre ferramentas, mas raramente as utilizam.
Estimativa
- Uma das duas causas mais comuns de projetos em andamento é a estimativa ruim.
- A estimativa de software geralmente ocorre no momento errado.
- A estimativa de software geralmente é feita pelas pessoas erradas.
- As estimativas de software raramente são corrigidas à medida que o projeto avança.
- Não é de surpreender que as estimativas de software sejam ruins. Mas, mesmo assim, vivemos e morremos por elas!
- Há uma desconexão entre o gerenciamento de software e seus programadores.
- A resposta para um estudo de viabilidade é quase sempre “sim”.
Reutilização
- A reutilização em pequena escala é um problema resolvido.
- A reutilização em grande escala continua sendo um problema não resolvido.
- O reuse-in-the-large funciona melhor em famílias de sistemas relacionados.
- Os componentes reutilizáveis são três vezes mais difíceis de construir e devem ser testados em três ambientes diferentes.
- A modificação do código reutilizado é particularmente propensa a erros.
- A reutilização de padrões de projeto é uma solução para os problemas de reutilização de código.
Requisitos
- Uma das duas causas mais comuns de projetos em fuga são os requisitos instáveis.
- Os erros de requisitos são os mais caros de serem corrigidos durante a produção.
- A falta de requisitos é o erro de requisitos mais difícil de corrigir.
Design
- Os requisitos explícitos “explodem” à medida que os requisitos implícitos de uma solução evoluem.
- Raramente há uma única solução de design ideal para um problema de software.
- O design é um processo complexo e iterativo. As soluções iniciais de design geralmente estão erradas e certamente não são ideais.
Codificação
- As “primitivas” do designer raramente correspondem às “primitivas” do programador.
- O COBOL é uma linguagem muito ruim, mas todas as outras são muito piores.
Remoção de erros
- A remoção de erros é a fase mais demorada do ciclo de vida.
Testes
- Normalmente, o software é testado, na melhor das hipóteses, até o nível de cobertura de 55 a 60%.
- 100% de cobertura de teste ainda está longe de ser suficiente.
- As ferramentas de teste são essenciais, mas raramente utilizadas.
- A automação de testes raramente é usada. A maioria das atividades de teste não pode ser automatizada.
- O código de depuração incorporado, criado pelo programador, é um complemento importante para as ferramentas de teste.
Revisões e inspeções
- Inspeções rigorosas podem eliminar até 90% dos erros antes que o primeiro caso de teste seja executado.
- As inspeções rigorosas não devem substituir os testes.
- As revisões pós-entrega, postmortems e retrospectivas são importantes e raramente realizadas.
- As revisões são tanto técnicas quanto sociológicas, e ambos os fatores devem ser acomodados.
Manutenção
- A manutenção normalmente consome de 40 a 80% dos custos de software. É provavelmente a fase mais importante do ciclo de vida do software.
- Os aprimoramentos representam cerca de 60% dos custos de manutenção.
- A manutenção é uma solução, não um problema.
- Entender o produto existente é a tarefa de manutenção mais difícil.
- Métodos melhores levam a mais manutenção, não menos.
Qualidade
- A qualidade é um conjunto de atributos.
- Qualidade é não a satisfação do usuário, o atendimento aos requisitos, o cumprimento do custo e do cronograma ou a confiabilidade.
Confiabilidade
- Há erros que a maioria dos programadores tende a cometer.
- Os erros tendem a se agrupar.
- Não existe uma abordagem única e melhor para a remoção de erros de software.
- Os erros residuais sempre persistirão. O objetivo deve ser minimizar ou eliminar graves erros.
Eficiência
- A eficiência decorre mais de um bom design do que de uma boa codificação.
- O código de linguagem de alta ordem pode ser cerca de 90% mais eficiente do que um código assembler comparável.
- Há compensações entre otimizar o tempo e otimizar o espaço.
Pesquisa
- Muitos pesquisadores defendem em vez de investigar.
Eu havia me esquecido do quanto o livro cobre; é um trampolim perfeito para todos os tópicos essenciais da engenharia de software.
Já postei sobre quase todos esses fatos nos quatro anos que se passaram desde que os li originalmente. Quando me debrucei sobre o índice apresentado acima, mal pude me conter. Lembrei-me e, mentalmente, marquei cada postagem da lista à medida que avançava: marquei, marquei, marquei. No passado, fui acusado de fazer links gratuitos para mim mesmo, portanto, não vou encher as regras com dezenas de links para minhas publicações antigas sobre esses tópicos. Se o senhor estiver interessado, poderá encontrá-los. Esse é mais ou menos o objetivo.
Se esses são os cinquenta e cinco fatos, então esses são os dez falácias apresentadas no final. As falácias têm a anel de verdade, mas, após uma inspeção mais minuciosa, acabam sendo problemáticas quando aplicadas a um projeto de software real.
- O senhor não pode gerenciar o que não pode medir.
- O senhor pode gerenciar a qualidade em um produto de software.
- A programação pode e deve ser sem ego.
- Ferramentas e técnicas: um tamanho único para todos.
- O software precisa de mais metodologias.
- Para estimar o custo e o cronograma, primeiro estime as linhas de código.
- A entrada de testes aleatórios é uma boa maneira de otimizar os testes.
- “Se o senhor tiver olhos suficientes, todos os bugs são superficiais”.
- A maneira de prever futuros custos de manutenção e tomar decisões sobre a substituição de produtos é examinar os dados de custos anteriores.
- O senhor ensina as pessoas a programar mostrando a elas como escrever programas.
Se o senhor estiver curioso sobre a lógica por trás desses fatos e falácias, essa é a razão da existência do livro: lembrar-nos de questionar o que estamos fazendo. Deveríamos pensar sobre nosso ofício todos os dias, de alguma forma, em nossos próprios projetos de software. É assim que avançamos coletivamente na engenharia de software – construindo nossa memória e história compartilhadas no campo. Como o Sr. Glass afirma na introdução:
Ao apresentar esses fatos, também estou identificando problemas no campo. Não é minha intenção apresentar soluções para esses problemas. Este é um livro sobre o que é, não um livro sobre como fazer. Isso é importante para mim. Quero trazer esses fatos à tona, onde eles possam ser discutidos livremente e possamos agir com base neles para progredir.
Incentivo os senhores a pegar uma cópia do livro completo para uma exploração mais profunda. Acredito que há uma rica experiência de aprendizado – ou uma rica experiência de recordação – aqui para os senhores que decidirem continuar lendo.