Fechado . Esta pergunta precisa ser mais focada . Atualmente não está aceitando respostas.

Comentários

  • A pergunta vinculada foi removida.
  • Acho que a abordagem é realmente simples. Se você desenvolveu sozinho, sabe tudo sobre ele. Você pode até consertar o bug sem depurar. Com isso em mente, a melhor maneira é usar seu tempo codificando outra coisa, até que alguém que saiba muito sobre isso possa responder à sua pergunta sobre como consertar; ou, deixe-o descansar, codifique outras coisas, até que uma ideia para consertar venha à sua mente, para não perder tempo nem energia. Meu palpite é que sua pergunta é sobre gerenciamento de equipes empresariais.
  • Acho que o Raid. Spray matador de insetos disponível no mercado. Esta é uma questão filosófica? Os livros são feitos a partir da mera preponderância …

Resposta

A mentalidade e atitude para depurar talvez seja a a parte mais importante, porque determina a eficácia com que você corrigirá o erro e o que você aprenderá com ele – se houver alguma coisa.

Clássicos sobre desenvolvimento de software como The Pragmatic Programmer e Code Complete basicamente defendem a mesma abordagem: todo erro é uma oportunidade de aprender, quase sempre sobre você mesmo (porque apenas os iniciantes culpam o compilador / computador primeiro).

Portanto, trate-o como um mistério que será interessante desvendar. E decifrar esse mistério deve ser feito sistematicamente, expressando nossas suposições (para nós mesmos ou para outros) e, em seguida, testando nossas suposições, uma por uma, se necessário – usando todas as ferramentas à nossa disposição, especialmente depuradores e frameworks de teste automatizados. Depois que o mistério for resolvido, você poderá fazer ainda melhor examinando todo o seu código em busca de erros semelhantes que possa ter cometido; e escrever um teste automatizado para garantir que o erro não aconteça inadvertidamente novamente.

Uma última observação – prefiro chamar os erros de “erros” e não de “bugs” – Dijkstra repreendeu seus colegas por usarem o último termo porque é desonesto, apoiar a ideia de que as fadas dos insetos perniciosas e inconstantes plantaram bugs em nossos programas enquanto não estávamos procurando, em vez de estarmos lá por causa de nosso próprio pensamento (desleixado): http://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1036.html

Poderíamos, por exemplo, começar limpando nossa linguagem não mais chamando um bug de bug, mas chamando-o de erro. É muito mais honesto porque coloca a culpa em seu devido lugar, viz. com o programador que cometeu o erro. A metáfora animista do bug que se infiltrou maliciosamente enquanto o programador não estava olhando é intelectualmente desonesta, pois disfarça que o erro é criação do próprio programador. O bom dessa simples mudança de vocabulário é que ela tem um efeito tão profundo : enquanto, antes, um programa com apenas um bug costumava ser “quase correto”, depois um programa com um erro é simplesmente “errado” (porque está errado).

Comentários

  • Na verdade, gosto do termo " erro " em vez de " bug ", não porque coloca a culpa no " do programador quem cometeu o erro ", mas porque deixa claro que pode não ter sido o culpado pelo programador. Para mim, " bug " implica em erro no código; enquanto " erro r " implica em erro em algum lugar . Talvez no código, talvez na configuração do ambiente, talvez nos requisitos. Fico louco quando meu chefe tem uma " lista de bug " em que metade dos problemas são mudanças de requisitos. Chame de lista de tarefas, ferchrissakes!
  • +1 para " cada erro é uma oportunidade de aprender, quase sempre sobre você (porque apenas os iniciantes culpam o compilador / computador primeiro) "
  • Você conhece a história do termo " bug ", certo? Quero dizer, conforme usado no desenvolvimento de software. É claro que não ' não temos esse problema hoje, mas um bug realmente atingiu o hardware de um computador despercebido pelo programador e causou um problema.Para que ninguém pense em me corrigir, sei que Edison usou esse termo muito antes do incidente da mariposa, e é por isso que usei a palavra ' história ', não ' origem '. Consulte computerworld.com/article/2515435/app-development/… e en.wikipedia.org/wiki/Software_bug#Etymology
  • @threed Claro. Mas por algum tempo, os insetos não causaram a grande maioria dos erros de software.

Resposta

  1. Escreva testes. O teste não é apenas ótimo para prevenir bugs (na minha experiência, o TDD feito da maneira certa elimina quase todos os bugs triviais e estúpidos), mas também ajuda muito na depuração. O teste força seu design a ser bastante modular, o que torna o isolamento e a replicação do problema muito mais fácil. Além disso, você controla o ambiente, então haverá muito menos surpresas. Além disso, depois de obter um caso de teste com falha, você pode estar razoavelmente certo de que “acertou em cheio o motivo real do comportamento que o está incomodando.

  2. Aprenda a usar um depurador. As instruções print podem funcionar razoavelmente bem em algum nível, mas um depurador na maioria das vezes é muito útil (e uma vez você sabe como usá-lo, é muito mais confortável do que print afirmações).

  3. Fale sobre o seu problema com alguém, mesmo que seja apenas um patinho de borracha . Forçar-se a expressar em palavras o problema no qual está trabalhando realmente faz milagres.

  4. Defina um limite de tempo. Se, por exemplo, após 45 minutos você sentir que não está indo a lugar nenhum, apenas mude para outras tarefas por algum tempo. Quando você voltar ao seu bug, provavelmente será capaz de ver outras soluções possíveis que você não teria considerado antes.

Comentários

  • +1 para " Forçar-se a expressar em palavras o problema no qual está trabalhando realmente faz milagres. "
  • E para adicionar a (1), quase todo bug que você vê no código implica que existe ' um bug – ou pelo menos uma omissão – na suíte de teste. Corrija os dois ao mesmo tempo e não apenas prove que ' corrigiu o problema em questão, você ' está seguro contra reintroduzida.

Resposta

Gosto da maioria das outras respostas, mas aqui estão algumas dicas sobre o que fazer ANTES de fazer nada disso. Irá economizar muito tempo.

  1. Determine se realmente há um bug. Um bug é SEMPRE uma diferença entre o comportamento do sistema e os requisitos; o testador deve ser capaz de articular o comportamento esperado e o real. Se ele não for capaz de fornecer suporte para o comportamento esperado, não há requisitos e não há bug – apenas a opinião de alguém. Envie de volta.

  2. Considere a possibilidade que o comportamento esperado está errado. Isso pode ser devido a uma interpretação incorreta do requisito. Também pode ser devido a um defeito no próprio requisito (um delta entre um requisito detalhado e um requisito comercial). Você também pode enviá-los de volta.

  3. Isole o problema. Apenas a experiência vai te ensinar a maneira mais rápida de fazer isso – algumas pessoas podem quase fazer isso com seus instintos. Uma abordagem básica é variar uma coisa enquanto mantendo todas as outras coisas constantes (o problema ocorre em outros ambientes? com outros navegadores? em uma região de teste diferente? em horários diferentes do dia?) Outra abordagem é olhar para despejos de pilha ou mensagens de erro – às vezes você pode apenas dizer a propósito está formatado qual componente do sistema lançou o erro original (p.ex. se for em Alemão poderá bla me aquele terceiro com quem você trabalha em Berlim).

  4. Se você restringiu a dois sistemas que colaboram, inspecione as mensagens entre os dois sistemas por meio do monitor de tráfego ou arquivos de log e determinar qual sistema está se comportando de acordo com as especificações e qual não está. Se houver mais de dois sistemas no cenário, você pode realizar verificações de pares e trabalhar para “descer” a pilha de aplicativos.

  5. O motivo pelo qual isolar o problema é tão crítico é que o problema pode não ser devido a um defeito no código sobre o qual você tem controle (por exemplo, sistemas de terceiros ou o ambiente) e você deseja que essa parte assuma o controle o mais rápido possível. Isso serve tanto para poupar seu trabalho quanto para colocá-los em ação imediatamente para que a resolução possa ser alcançada no menor período de tempo possível. Você não quer trabalhar em um problema por dez dias apenas para descobrir que realmente é um problema com o serviço da web de outra pessoa.

  6. Se você determinou que realmente há um defeito e ele realmente está no código que você controla, pode isolar ainda mais o problema procurando a última construção “boa” e inspecionar os logs de controle de origem em busca de alterações que possam ter causado o problema. Isso pode economizar muito tempo.

  7. Se você não consegue descobrir a partir do controle de origem, agora é a hora de anexar seu depurador e percorrer o código para descobri-lo É provável que agora você tenha uma boa ideia do problema de qualquer maneira.

Assim que você souber onde está o bug e puder pensar em uma correção, aqui está uma boa procedimento para consertá-lo:

  1. Escreva um teste de unidade que reproduza o problema e falhe.

  2. Sem modificar o teste de unidade, faça ele passa (modificando o código do aplicativo).

  3. Mantenha o teste de unidade em seu conjunto de testes para evitar / detectar regressão.

Resposta

Acho que a reprodução de um bug também é importante. Todos os casos que reproduzem o bug podem ser listados e, em seguida, você pode ter certeza de que sua correção de bug cobre todos esses casos.

Resposta

Há um livro excelente que li sobre este assunto chamado Por que os programas falham , que descreve várias estratégias para encontrar bugs que vão desde a aplicação de método científico para isolar e resolver um bug, para depuração delta. A outra parte interessante deste livro é que ele acaba com o termo “bug”. A abordagem de Zeller é:

(1) Um programador cria um defeito no código. (2) O defeito causa uma infecção (3) A infecção se propaga (4) A infecção causa uma falha.

Se você deseja melhorar suas habilidades de depuração, recomendo fortemente este livro.

Em minha própria experiência pessoal, encontrei muitos bugs em nosso aplicativo, mas a gestão simplesmente nos pressiona para frente para obter novos recursos. Eu “tenho ouvido com frequência” Nós mesmos encontramos esse bug e o cliente ainda não percebeu, então deixe até que eles percebam “. Acho que ser reativo em oposição a pró-ativo na correção de bugs é uma ideia muito ruim, pois quando chega a hora de realmente consertar, você tem outros problemas que precisam ser resolvidos e mais gerenciamento de recursos quer sair o mais rápido possível, então você é pego em um ciclo vicioso que pode levar a muito estresse e esgotamento e, finalmente, um sistema repleto de defeitos.

A comunicação também é outro fator quando os bugs são encontrados. Enviar um e-mail ou documentá-lo no bug tracker está tudo bem, mas em minha própria experiência, outros desenvolvedores encontram um bug semelhante e, em vez de reutilizar a solução que você colocou para consertar o código (já que eles se esqueceram disso), eles adicionam suas próprias versões, então você tem 5 soluções diferentes em seu código e ele parece mais inchado e confuso como resultado. Então, quando você corrigir um bug, certifique-se de que algumas pessoas revisem a correção e forneçam feedback caso tenham corrigido algo semelhante e encontrou uma boa estratégia para lidar com isso.

Limist mencionou o livro,

O programador pragmático que tem um material interessante sobre como corrigir bugs. Usando o exemplo que dei no parágrafo anterior, eu “daria uma olhada nisto: Entrofia de software , onde a analogia de uma viúva quebrada é usada. janelas aparecerem, sua equipe pode ficar apática quanto a consertá-la, a menos que você tome uma posição proativa.

Comentários

  • I ' Ouvimos " Nós mesmos encontramos esse bug e o cliente ' ainda não percebeu, então deixe até eles fazem " muitas vezes também. E tendo ido em visitas ao site, muitas vezes o cliente percebeu , mas não ' t relatou. Às vezes porque eles pensam que não ' há nenhum ponto porque não ' não será corrigido, às vezes porque eles já está procurando por um ' substituição de um concorrente e, às vezes (certa ou incorretamente) " bem, é um monte de merda fumegante de qualquer maneira ".
  • @JuliaHayward – Esse é frequentemente o caso, mas na sua situação, seus clientes podem ficar satisfeitos com a funcionalidade e não se preocupar muito com o que ' está acontecendo nos bastidores. O problema começa a vir à tona quando o cliente volta pedindo recursos extras e você precisa adicionar outras melhorias, como tornar seu aplicativo multilíngue, compatível com dispositivos móveis, blá, blá, você começa a olhar o que tem e ver todas as rachaduras na parede.
  • Só mostra a você, todos os livros do mundo sobre design de software, testes e boa comunicação e muitos dos produtos em que você trabalha são uma bagunça enorme.Apesar de saber o que ' está certo, estresse e prazos irrealistas (em face do seu código já bagunçado) são as razões por trás do código estar no estado em que está. Eu não ' não tenho nenhuma resposta para isso, eu ' sou muito distinto no escritório como um cara que reclama ***** * enquanto eu chuto e grito para manter o código saudável e o processo de desenvolvimento tranquilo, mas às vezes a equipe não ' t se une bem.

Resposta

Bug, erro, problema, defeito – como você quiser chamá-lo, não faz muita diferença. Vou me limitar ao problema desde então “é o que estou acostumado.

  1. Descubra qual é a percepção do problema: traduzir de um cliente” s “Bob ainda não está no sistema” para “Quando eu tento criar um registro de usuário para Bob, ele falha com uma exceção de chave duplicada, embora Bob ainda não esteja lá.
  2. Descubra se é realmente um problema ou apenas um mal-entendido (na verdade, Bob não está ” lá, não há ninguém chamado bob e insert deve funcionar).
  3. Tente obter o mínimo de etapas confiáveis que você pode seguir para reproduzir o problema – algo como “Dado um sistema com um registro de usuário” Bruce “, quando um registro de usuário” Bob “é inserido, ocorre uma exceção”
  4. Este é o seu teste – se possível, coloque-o em um sistema automatizado Testar arnês que você pode executar repetidas vezes, isso será inestimável durante a depuração. Você também pode torná-lo parte do seu conjunto de testes para garantir que esse problema específico não reapareça mais tarde.
  5. Pegue o seu depurador e comece a colocar pontos de interrupção – descubra o caminho do código ao executar o teste, e identificar o que está errado. Enquanto faz isso, você também pode refinar seu teste tornando-o o mais restrito possível – de preferência, um teste de unidade.
  6. Corrija – verifique se o teste foi aprovado.
  7. Verifique o problema original conforme descrito pelo cliente também é corrigido (muito importante – você pode apenas ter corrigido um subconjunto do problema). Verifique se você não introduziu regressões em outros aspectos do programa.

Se você estiver muito familiarizado com o código, ou se o problema ou correção for óbvio, você pode pular alguns deles etapas.

Como devemos abordá-lo para fazer o uso mais eficaz de nosso valioso tempo e nos permitir gastar menos tempo tentando encontrá-lo e mais tempo codificando ?

Tenho problemas com isso, pois implica que escrever um novo código é mais valioso do que ter um programa de trabalho de alta qualidade. Não há nada de errado em ser o mais eficaz possível na correção de problemas, mas um programa não fica necessariamente melhor apenas adicionando mais código a ele.

Comentários

  • esta é a melhor resposta IMO

Resposta

Veja como eu faço:

  1. usa sempre o mesmo método para encontrar o problema. Isso melhorará seu tempo de reação aos erros.
  2. A melhor maneira provavelmente é lendo o código. Isso ocorre porque todas as informações estão disponíveis no código. Você só precisa de maneiras eficientes de encontrar a posição correta e capacidade de entender todos os detalhes.
  3. a depuração é uma maneira muito lenta e necessária apenas se os seus programadores ainda não entendem como o computador executa as instruções asm / não consegue entender as pilhas de chamadas e coisas básicas
  4. Tente desenvolver técnicas de prova como usar protótipos de função para raciocinar sobre o comportamento do programa. Isso ajudará a encontrar a posição correta mais rapidamente

Resposta

Quando detectamos um erro em nosso código, o que podemos fazer para eliminá-lo? Como devemos abordá-lo para fazer uso mais eficaz de nosso valioso tempo e nos permitir gastar menos tempo tentando encontrá-lo e mais tempo codificando? Além disso, o que devemos evitar ao depurar?

Supondo que você esteja em um ambiente de produção, aqui está o que você precisa fazer:

  1. Descreva o “erro” corretamente e identifique os eventos que o fazem acontecer.

  2. Determine se o “erro” é um erro de código ou erro de especificação. Por exemplo, inserir um nome de 1 letra pode ser considerado um erro para alguns sistemas, mas um comportamento aceitável para outros sistemas. Às vezes, um usuário relataria um erro que ele / ela pensa ser um problema, mas a expectativa do usuário para o comportamento do sistema não fazia parte dos requisitos.

  3. Se você provaram que existe um erro e o erro é devido ao código, então você pode determinar quais partes do código precisam ser corrigidas para evitar o erro. Examine também o efeito do comportamento nos dados atuais e nas operações futuras do sistema (análise de impacto em código e dados).

  4. Neste ponto, você provavelmente tem uma estimativa de quantos recursos serão consumidos para corrigir o bug. Você pode corrigi-lo imediatamente ou agendar uma correção em uma próxima versão do software.Isso também depende se o usuário final está disposto a pagar pela correção. Você também deve avaliar as diferentes opções disponíveis para corrigir o erro. Pode haver mais de uma maneira. Você precisa selecionar a abordagem que melhor se adapta à situação.

  5. Analise os motivos que causaram o surgimento deste bug (requisitos, codificação, teste, etc.). Aplique processos que evitem que a condição aconteça novamente.

  6. Documente o episódio adequadamente.

  7. Libere a correção (ou o nova versão)

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *