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.