O que você considera ser a principal causa de defeitos de software (e como minimizá-los) [fechado]

14

Eu defino defeito como:

"algo dentro do design ou código do aplicativo que o impede de funcionar conforme os requisitos."

Estou procurando idéias sobre as causas dos defeitos, por exemplo, o fator humano, falta de teste, falta de prototipagem e possíveis idéias para atenuá-las.

Chris Buckett
fonte
5
Eu substituiria "requisitos" por "necessidades do usuário" ou "comportamento esperado", pois mesmo os requisitos podem estar errados.
Mouviciel 12/12/10
Que os requisitos estão errados? (e o código certo?)

Respostas:

13

A principal causa de defeitos de software é a interpretação.

A interpretação de um recurso pelo cliente difere da interpretação do designer.

A interpretação do designer difere da interpretação do programador.

A maioria das metodologias inventou maneiras de combater esse efeito. Mas no final, somos apenas humanos e não somos perfeitos. Além disso, muitas vezes há uma pressão de tempo e a maioria das magias de metodologia é frequentemente ignorada sob pressão.

Os testes podem detectar apenas os problemas mais cedo. Mas mesmo os testadores são humanos e é impossível testar 100%. Se você quer liberar antes que o universo termine.

Toon Krijthe
fonte
Se eu pudesse conseguir que esse maldito módulo leitor de mentes funcionasse, tudo ficaria bem.
HLGEM
@ Gamecat: e fica ainda pior quando se trabalha com pessoas de todo o mundo. Não apenas existe uma barreira linguística (muitas vezes pelo menos um dos participantes não é tão proficiente em inglês), mas também há diferenças culturais.
Matthieu M.
2
Você perdeu um - "a interpretação do programador difere da interpretação do compilador" ...;)
Alex Feinman
@ Alex: Eu sei o que o compilador fará com o código que escrevo. Esse conhecimento não era muito fácil de adquirir, mas eu fiz. Agora, temos minha interpretação do código que não escrevi, em oposição aos dados do compilador e do tempo de execução.
David Thornley
@ David, a menos que você tenha escrito e mantido o compilador, seu conhecimento do que as entranhas estão fazendo é uma abstração do que realmente está acontecendo - e isso é provavelmente o melhor, pois permite que você gaste espaço no cérebro no aplicativo real.
precisa
8

Considero a principal causa de defeitos de software os programadores.

Não estou dizendo isso apenas para ser engraçado, mas porque um dos grandes problemas que observei no meu trabalho é a falta de coleta de requisitos, juntamente com o fraco entendimento do domínio do problema, causando grandes defeitos e problemas de usabilidade no projeto.

Parte disso vem de não estar disposto a aprender / entender a terminologia do usuário final, causando mal-entendidos.

Parte disso vem de falar sobre tecnologia muito cedo no processo para pessoas que não têm idéia do que você está falando ou por que isso importa.

O melhor exemplo disso foi quando ouvi um dos programadores tentando descobrir quanto tempo as perguntas / respostas durariam nos caracteres ... Eu sabia que ele estava tentando descobrir qual tamanho de campo usar no banco de dados, mas o departamento solicitando isso não era o mais nebuloso porque isso importava - ou que os espaços contavam. Para nós isso parece óbvio, mas para eles foi uma revelação real.

AnonJr
fonte
8

A principal causa de defeitos é uma má gestão ;)

Sério, um desenvolvedor que trabalha em boas condições, que não é obrigado a trabalhar demais, reduzir a qualidade, ter ferramentas adequadas, condições de trabalho silenciosas etc.

Além disso, a gerência que contrata desenvolvedores ruins também ajuda a aumentar o número de bugs.

Má gestão .

(aviso: devo contratar e gerenciar desenvolvedores)


fonte
não pense que esse é o problema principal, a maioria dos desenvolvedores trabalha em condições silenciosas. Concordo com o AnonJr e o Gamecat - incapacidade de entender completamente o domínio do problema, apenas iterações e testes rápidos podem ajudar.
Radekg
1
Como a maioria dos desenvolvedores trabalha em condições silenciosas? Em uma dúzia de empresas que visitei no ano passado, nenhuma estava silenciosa.
Uma boa gestão pode levá-lo longe, uma má gestão não pode levá-lo a lugar nenhum!
31410 Chris
+1 em condições de trabalho silenciosas. Todas as empresas em que trabalhei foram em uma fazenda de cubículos em Dilbertesque, onde você pode ouvir constantemente pessoas a 1 metro de distância de você, cortando as unhas, mastigando a comida e atendendo telefonemas.
Bobby Tables
5

Não vejo nenhuma causa primária - mas uma causa que não foi mencionada é o acoplamento não intencional com outro código . Escrever código com efeitos colaterais invisíveis, rompe as camadas de abstração, faz suposições sobre os dados (variáveis ​​não, constantes não e nenhuma entrada de um usuário é segura), mexe com coisas que não precisam preocupar com ele e assim por diante.

A maioria das práticas de desenvolvimento que eu estudo se resume à redução N, porque a complexidade de um programa é pelo menos O(N^2)e possivelmente O(k^N). A definição Né deixada como um exercício para o leitor, mas estou pensando em coisas como complexidade ciclomática aqui. Encapsular lógica e dados tem o efeito de reduzir N compartimentalizando o problema.

Alex Feinman
fonte
4

A incapacidade de pensar em tudo.

JeffO
fonte
4

Sendo incompleto

Wonko, o são
fonte
4

Lacuna de comunicação. Na coleta de requisitos. Dentro do cronograma. No documento de design. Na especificação funcional. Em código (intervalo entre o que o programador deseja e o que ele diz ao compilador).

Etiqueta social. É socialmente inaceitável chamar alguém de incapaz.

aufather
fonte
3

Apressando-se nas coisas sem entendê-las completamente. Começando a escrever código sem entender completamente os requisitos funcionais ou a arquitetura técnica.

A programação deve ser quase automática, apenas anotando o que é evidente e que já foi trabalhado na mente. Na prática, vejo muitas falhas no código para tentar entender exatamente o que o código deve fazer. Eu já fui culpado disso muitas vezes.

Joeri Sebrechts
fonte
Após quatro meses de um novo emprego, ainda estou apenas com uma pequena porcentagem em "entender completamente" qualquer coisa. Não vou me apressar; O que você diz é verdade. É uma merda ser improdutivo por tanto tempo, no entanto.
darenw
Levei um ano ou dois para atingir a velocidade máxima no sistema em que trabalho (sistema de 2 milhões de linhas). Mesmo assim, existem grandes segmentos que eu simplesmente não conheço.
Joeri Sebrechts 28/10/10
2

Errare humanum est

mouviciel
fonte
2

A pressão de programação é certianly uma fonte forte.

Os desenvolvedores apressados ​​não reservam tempo para especificar completamente os requisitos, nem entender completamente a intenção por trás dos requisitos, nem investigar completamente as alternativas para encontrar a melhor solução, nem pensar completamente em todos os casos extremos e interações das alterações que estão fazendo, ou desenvolva um conjunto completo de casos de teste, ou execute todo o teste de unidade, ou execute um teste de integração completo, ou considere totalmente as dependências da plataforma, ou teste completamente o instalador, ou documente completamente o que eles fizeram para que o próximo desenvolvedor possa entender ....

AShelly
fonte
2

Outra coisa que deve ser mencionada é não ter um teste externo. Quando o desenvolvedor escreve os testes e os executa, ele apenas testa sua interpretação, não o requisito real. Embora o teste de unidade escrito pelos desenvolvedores seja útil para detectar alguns erros, a maioria dos erros passou nesses testes, mas não é o que o usuário deseja ou precisa. Qualquer software não testado por alguém que não seja o desenvolvedor não é testado (e não quero dizer apenas executar os testes do desenvolvedor).

HLGEM
fonte
2

É porque a engenharia de software é inerentemente complexa. O ensaio "No Silver Bullet" discute isso.

Ironicamente, muitas das outras respostas aqui abordam tópicos que são "acidentalmente complexos", na linguagem desse ensaio, enquanto, na realidade, a maior parte do que os desenvolvedores de software fazem é "essencialmente complexo", por isso é apenas da natureza disso que criar o software é difícil, o software terá bugs e nosso trabalho é lidar com isso.

Peter Eisentraut
fonte
1

A falha em entender o software como uma rede de máquinas de estado, os princípios subjacentes à sua operação (estados, suas determinações e transições) e as interações das máquinas de estado.

Huperniketes
fonte
1

Escrever código que falha silenciosamente vs. código que relata todos os erros.

bjornl
fonte
1

A falta de verificação de coisas que "não podem acontecer" ou que dificilmente acontecem é grande. Às vezes o perfeito é o inimigo do bem. Se não vale uma hierarquia de exceção bem pensada, um tratamento rápido e sujo é sempre melhor que nada. Eu sou um enormefã de falhar rápido, de afirmações e de deixar afirmações que têm um impacto insignificante no desempenho em versões de lançamento. Mesmo em scripts únicos rápidos e sujos, onde eu controle todos os dados de entrada, insiro algum tratamento de erro rápido / sujo, geralmente apenas com uma função que é equivalente a afirmar, mas permanece ativa o tempo todo. Minha regra geral é que, se não é provável que ocorra ou você acha que não pode acontecer, não precisa falhar normalmente com uma mensagem de erro amigável, mas deve pelo menos falhar rapidamente com uma mensagem de erro que dá ao programador algumas dicas sobre o que deu errado.

Editar: Uma tática útil relacionada é usar asserts como a principal ferramenta de depuração e deixá-los lá depois que a sessão de depuração terminar. A partir desse momento, sua base de código terá algumas verificações internas de integridade que dificultam a ocorrência de erros relacionados. Isso é especialmente útil para códigos difíceis de unittest.

dsimcha
fonte
1

A principal causa de defeitos de software é escrever código.

Escreva menos código e você terá menos bugs ;-)

nlawalker
fonte
0

Em um nível, gerenciamento. Mas não é apenas o PHB. É o gerenciamento do próprio código, que pode ou não ser um reflexo do gerenciamento corporativo.

Os participantes de todo o "ciclo de vida" precisam ser totalmente investidos em qualidade e criar um produto que simplesmente não morra . O próprio software tem a promessa de nunca quebrar, dada a confiabilidade adequada da abstração. É apenas uma questão de saber se os construtores de software estão interessados ​​em ter essa operação perfeita.

Paul Nathan
fonte