Como você lida com erros realmente bizarros que o deixam intrigado por mais de 10 horas? [fechadas]


29

Você os conhece, esses erros que não fazem sentido. Onde parece que um gremlin pulou fundo dentro de suas fichas e estragou alguma coisa. Você anda, escreve coisas, liga para um tio?


3
Sua descrição pode estar correta - Reinicialize e tente novamente!
NoChance

5
postá-lo em stackoverflow é claro :)
William

5
Por que você decidiu um limite de 10 horas? Isso é muito longo - se você não tem uma boa idéia do que está causando um comportamento inesperado dentro de uma ou duas horas, está com problemas.
Vector

5
"Quando as coisas ficam difíceis, os difíceis dormem e deixam o subconsciente trabalhar nisso". - anon
Michael Easter

2
1. Consiga alguém para ajudar. Duas pessoas é uma obrigação. 2. Limite-o usando quantidades excessivas de instruções de depuração. Havia um arquivo em que cada linha era precedida por uma macro de depuração para identificar a que seguia com falha.
SF.

Respostas:


9

Para esses problemas realmente horríveis, minha estratégia costuma ser a seguinte.

  • Experiência e google. Continue tentando resolver o problema. Na maioria das vezes, isso resolve o problema em uma hora ou menos.

  • Então isso não funcionou. Dar um tempo. Tome um café, fale sobre algo não relacionado a um colega. Empurre o problema da sua mente. Quando você olha para o problema 5 ou 10 minutos depois, o olha de uma perspectiva um pouco diferente. Na maioria das vezes isso funciona.

  • Nesse caso, não tem. Portanto, gaste mais 10 a 30 minutos olhando para ele. Em seguida, chame um colega. Mas antes de fazer, faça algumas anotações; você deseja demonstrar o problema, reproduzi-lo e, em seguida, liste as coisas que você tentou e, o mais importante, provar que você as tentou. Então faça uma corrida a seco primeiro. Defina algumas marcas de livros no código, feche todos os documentos supérfluos abertos etc. Dessa forma, você poderá resolver o problema sozinho ou, quando demonstrar o problema, não estará perdendo tempo.

  • Peça ao seu colega para provar todas as suas suposições. esse setter está realmente sendo chamado? Esse método está realmente retornando o que você afirma ser? Você acha que esse objeto não é nulo - mostre a ele que não é nulo.

  • Na maioria das vezes, demonstrar o problema fará com que você perceba que não tentou todas as possibilidades ou seu colega verá seu erro.

  • Se isso não funcionar, é hora de levar a sério. Documente exatamente o que você está tentando fazer, o que você tentou e por que não funcionou. Envie por e-mail a todos os seus colegas. Poste no SO. Nesse ponto, o documento deve ser uma pergunta SO perfeita.

  • Enquanto você espera pelas respostas, google google google. Tente todas as permutações da sua pergunta. Abra várias guias. Você provavelmente não receberá uma resposta nesse ponto, mas está procurando idéias, possibilidades, maneiras diferentes de abordar o problema.

  • Faça outra coisa, se você passou 5 horas em um problema, é hora de deixá-lo por mais um dia. Talvez você obtenha uma resposta útil. Talvez quando você atacar o problema no dia seguinte, seja óbvio.

  • Se nada disso funcionar, é hora de procurar uma solução diferente. Talvez você possa usar um método diferente, uma tecnologia diferente. Talvez você deva considerar abandonar o recurso por enquanto. Você está cobrando do cliente por hora? Você está trabalhando para uma empresa em um aplicativo interno? Você precisa encaminhar isso para o proprietário e dizer a ele "veja, passei x horas nisso e não fiz nenhum progresso. O custo-benefício vale a pena?". Você não quer ir ao seu chefe e dizer a ele que você gastou 16 horas em um problema apenas para que ele se virasse e dissesse: não é tão importante, pule para este lançamento. você precisa descobrir isso antes.

  • E se isso não funcionar? Bem, suas únicas opções são manter o foco no problema ou procurar conhecimento do setor. Pergunte a especialistas em tecnologia no twitter. Envie um email para seu provedor de tecnologia.


79

Sair. Não, não é o seu trabalho! Apenas levante-se e vá para casa. Você terminou o dia ou o fim de semana. Se você voltar ao problema 19 vezes em 20, a solução se apresentará em uma hora.


17
Você também pode tentar se esquivar de borracha. pt.wikipedia.org/wiki/Rubber_duck_debugging
Dave Nay

2
19 de 20, sim. Meu pior nunca foi resolvido, apenas contornado. Nenhum ambiente de teste o mostrou, apenas o ambiente de produção completo em operação - não conseguimos reproduzi-lo depois de horas.
Loren Pechtel

3
Ficar longe de algo que é irritante pode ser muito difícil - mas descobri ao longo dos anos que sempre é a melhor coisa a fazer. A mente subconsciente pode resolver o problema enquanto você come, dorme, se diverte, assiste TV ... e no dia seguinte (ou no dia seguinte) as coisas vão melhor. Porém, uma palavra de aviso: colete informações antes de ir embora ... Afastar-se não é o mesmo que ignorá-lo e fingir que não está lá. Você ainda precisa de muito trabalho!
quickly_now

1
Eu não sei cerca de uma hora. Geralmente resolvo a maioria desses problemas no chuveiro quando acordo de manhã. A segunda mais frequente será quando eu estiver quase dormindo à noite e finalmente me permitir parar de pensar nisso.
precisa saber é o seguinte

3
Havia uma fascinante NOVA Science NOW hospedada por Neil deGrasse Tyson que falava sobre a ciência do sono. Nele foi discutido o fenômeno de bater a cabeça em um problema por horas, dormir e acordar e resolvê-lo imediatamente. Quando dormimos, nosso cérebro revira os eventos de nosso dia repetidas vezes, analisando-o sob muitos ângulos diferentes. O que deixa para trás são novos caminhos neurais que podem realmente nos ajudar a ver o problema de uma maneira totalmente nova inconscientemente, e depois resolver o problema. Muito impressionante.
Byrne Reese

44

Antes que passassem dez horas, eu precisaria de ajuda.

  1. Descreva o problema para outra pessoa, qualquer outra pessoa, até para o seu pato de borracha .
  2. Peça a alguém que dê uma olhada no código ou passe por ele com ele.
  3. Isole-o. Exclua várias coisas e traga-as de volta aos poucos até que o problema reapareça.
  4. Durma um pouco!

12
+1 para excluir tudo até o problema desaparecer.
Jonah

4
Você deve fazer uma dessas coisas antes de 1 hora. Quanto mais você olha, menor a probabilidade de conseguir sua epifania. Normalmente, resolvo um problema apenas conversando com alguém.
Ben Ben

Spot on. Muitas vezes, eu entendo o problema (ou me aproximo dele) descrevendo o problema primeiro. Freqüentemente, isso ocorre ao escrever uma descrição do problema para uma pergunta do StackOverflow. Que também requer uma redução (isolamento) e, em seguida, na sua falta, um período de espera onde você pisa longe do problema e deixar que o SO respostas vêm rolando dentro.
sholsinger

17

Uma palavra, timeboxdefina um tempo limitado para trabalhar em algo e, se não for resolvido, passe para outra coisa e volte a ela no dia seguinte com uma nova perspectiva.

Esse e outro conjunto de olhos sempre valem mais do que qualquer tempo que você pode perder olhando para alguma coisa.

Eu nunca gastaria mais de 45 minutos a uma hora tentando resolver algo de uma só vez, viola a lei dos retornos decrescentes.


Muito obrigado - li o artigo timebox na wikipedia, muito útil.
Adel

7

Explique o problema para outra pessoa.

Ao explicar o problema para outra pessoa, você precisa esclarecê-lo: isso geralmente permite que você veja a solução.

(Uma das revistas profissionais de informática do Reino Unido propôs vender recortes de papelão em tamanho real de um programador sênior especificamente para esse fim.)

Acho que dormir com um problema (às vezes por alguns dias) também pode ajudar.


1
A "outra pessoa" não precisa ser humana. Às vezes eu explico as coisas para o gato, e aha! Eu encontro o problema.
DarenW

Eu realmente deveria comprar um gato também. Eu treinaria para coçar minha cabeça sob demanda.
Adel

Alguém realmente deveria fazer um recorte de papelão em tamanho natural de Jon Skeet.
Don Roby

5

Eu tenho um plano de três etapas:

  1. Tome um café ou outra bebida saborosa.
  2. Trabalhe em outra coisa pelo resto do dia.
  3. "Ligue para um amigo" e rabisque no quadro branco.

Cada estágio é uma escalação se a etapa anterior falhar. Quase sempre há algo mais produtivo em que posso trabalhar no estágio 2.


Bom conselho! Então "telefonar para um amigo" é citado porque deve ser limitado a 60 segundos, como no Millionaire, sim? Também gosto da ideia do quadro branco.
Adel

1
Acho que o quadro realmente ajuda a refletir metodicamente. As citações eram porque, muitas vezes, o amigo está no mesmo escritório, portanto, ligar seria estranho. Mas meio que parecia uma tábua de salvação do programa de TV.
Flexo

4

Durma sobre isso

Caso contrário, ligue para alguém próximo e peça para ele dar uma olhada rápida no código.

Muitas vezes, erros que levariam muito tempo para serem encontrados (já que é o seu código) são encontrados com muita facilidade por outras pessoas


3

Você pode ver se levantar, andar por aí e pensar no problema ajuda a encontrar uma solução. Independentemente de você estar em pé ou andando de um lado para o outro, tente se afastar do computador enquanto pensa.


3

Eu geralmente faço um dos três:

  1. Faça um passeio a pé / de bicicleta ... alguns que o afastam do computador.
  2. Brinque com meu cachorro ou gato
  3. Se você tem um hobby, trabalhe nisso por um tempo.

Qualquer um dos três faz um bom trabalho para se distrair da situação em questão. Acho que as distrações deixam meu cérebro subconsciente mastigar algo por um tempo. Depois de mais ou menos uma hora disso, bam, existe a solução :-).


3

Crie um chicote de teste para atingir esse defeito exato e isolá-lo

Continue eliminando um bom código ... enquanto replica o defeito. Até você segmentar o trecho exato do código que contém o erro. Em seguida, rastreie o código.

Leitura recomendada: O programador pragmático especificamente Capítulo 10: Marcadores de marcador


tudo isso é bom e bem, mas é garantido que o bug foi e pode ser reproduzido. E se as 19 horas gastas até agora fossem exatamente isso ... tentando encontrar um meio de reproduzir o problema de maneira determinística e sistemática ... e depois? Para mim, essa é a essência da questão aqui!
Newtopian

O programador pragmática é excelente
Adel

2

Todas essas sugestões são ótimas. No entanto, uso uma técnica com bastante frequência que não vi mencionada. Faça listas para organizar seus pensamentos sobre o problema. Se eu tiver um problema particularmente difícil, geralmente escrevo várias listas, como: fatos, premissas, perguntas, sintomas etc. Acho que, muitas vezes, no processo de organização das coisas, descubro suposições que não percebi que tinha ( que muitas vezes acabam erradas), perguntas que eu não percebi precisam ser feitas, outras permutações que posso verificar etc.


2

Editar:

A resposta curta:

P: Como você lida com erros realmente bizarros que o deixam intrigado por mais de 10 horas?

R: Verifique se eles nunca acontecem: entenda seu design, conheça seu código, aprenda como usar seu depurador.


Explicação:

"Onde parece que um gremlin pulou profundamente dentro de suas fichas e estragou algo"

Isso nunca deve acontecer. Se for o seu código, você deve ter uma boa ideia do que está causando o erro antes de tentar corrigi-lo.

Além disso, quando você escreve seu código, já deve saber onde e por que ele provavelmente falhará.

Dito isto - perguntar a um colega, postar no SO, refazer e reverter seus passos e fazer uma pausa - todas as sugestões mencionadas acima ajudarão.

A outra coisa é que você deve conhecer suas ferramentas - seu kit de ferramentas de depuração. Registrando mensagens em pontos suspeitos no seu código, examinando cuidadosamente sua pilha de chamadas, usando pontos de interrupção e relógios condicionais, etc.


Ser capaz de refazer os passos é vital. Obrigado!
Adel

> Ser capaz de refazer os passos é vital. O software SourceControl é a chave para poder reverter / refazer. Seja ANAL sobre isso e, se puder, defina suas configurações para forçar você a deixar comentários no check-in.
Vector

3
Infelizmente, não importa o quão bem você saiba codificar, às vezes o problema é uma interação com o código de outra pessoa (código fechado).
Nate CK

2
+1 @Nate CK- muito verdadeiro. Os piores tipos de bugs acontecem quando você recebe algum tipo de bobagem de um serviço da Web em que estava confiando. Há um tempo, tive um fornecedor da Saas que alterou sutilmente algumas funcionalidades sem aviso no serviço da Web. Eu tive que explicar ao desenvolvedor como corrigir seu próprio erro por telefone, enquanto ele me descrevia como era o código dele.
Morgan Herlocker 6/09/11

1
Para determinar o que? Que existe um problema no código de terceiros? Essa parte é relativamente fácil. A parte difícil é descobrir quais condições o acionam e como contorná-lo. Quando você não possui a fonte, o fornecedor não responde e talvez isso não aconteça no seu sistema de teste. Se você acha que conhecer seu código resolverá tudo isso para você, sugiro que talvez você nunca tenha lidado com isso.
Nate CK

1

Eu tive um problema semelhante, uma aparente corrupção de memória no Objective-C, com a qual lutei por muitas horas. Mas então eu e meus colegas apenas damos uma volta para o almoço e expliquei o problema (e um pouco em particular relacionado à desserialização de um objeto em seu método init), e basicamente expliquei todo o problema para mim.

(detalhes técnicos: basicamente, eu inicializei e retornei um objeto para algo além de si mesmo, então havia duas alocações, mas apenas um objeto retornou. A memória mudou e ficou louca, falhas e o depurador não sabia realmente o que fazer com também).


1
"Inicializei e retornei um objeto para outra coisa que não a si próprio" - erros como esse são RESISTENTES! Você pode procurar mais de 100 vezes e não pegá-lo. Mas você não conseguia ver duas alocações rastreando no depurador?
Vector

1

insira a descrição da imagem aqui

Tome um banho.

Algum fã de Rodney McKay ?

Sério, porém, se há uma semelhança entre todas essas respostas, é fazer uma pausa e fazer outra coisa .

Eu gosto de pensar nisso como relegar o problema ao seu subconsciente. Mesmo que não tenhamos consciência, nossas mentes (parecem) continuam trabalhando no problema, mesmo quando estamos fazendo outra coisa, como tomar banho .


Ótima idéia ... agora só preciso que o chefe coloque meia dúzia de banheiras no escritório.
Dave Nay

Se ao menos a legião de trabalhadores de cubículos tivesse uma sala assim.
Adel

1

Passo a passo passo a passo, na montagem. Quem chama o quê, ponto de interrupção no acesso à memória. Isso geralmente pega o bug rapidamente.

Caso contrário, dê um passeio.


1

Uma combinação de todos estes:

  • Afaste-se dele por um tempo para que ele possa ficar em segundo plano. Durma, descanse, coma, dê um passeio, tanto faz.

  • Examine mais o problema, o que mais ele faz de errado, que outros sintomas você pode encontrar?

  • Pesquise o problema, veja o que você pode encontrar. Lembre-se de experimentar palavras-chave diferentes

  • Tente algo diferente . Uma solução alternativa. Uma técnica de depuração diferente. Um validador. Um computador diferente.

  • Fale com alguém . Mesmo que eles não consigam ajudar, ou nem mesmo sejam um programador, às vezes a conversa aciona a idéia da lâmpada

  • Reiniciar! Se apropriado, tente reiniciar o computador, o servidor, etc. Se nada mais, você pode usar o tempo para pensar.

  • Peça StackOverflow! Estamos aqui para ajudar


1

Eu realmente não gostei da resposta mais votada, porque mesmo que isso funcione algumas vezes, você só precisa descobrir no mesmo dia, então o que eu recomendaria, nessa ordem, é:

  1. Confirme que isso não está acontecendo apenas com você. Isso pode economizar muito tempo. Talvez você tenha desinstalado um componente necessário ou tenha feito uma alteração no seu ambiente e uma exceção esteja sendo engolida em algum lugar do seu código. Se isso estiver acontecendo apenas com você, eu usaria uma ferramenta de comparação de ambiente. Recentemente, li sobre um software chamado Envy, que permite fazer exatamente isso, embora não seja freeware, custa 10 dólares.

  2. Acontecendo com todo mundo? Tudo bem, agora faça um View History no código e verifique se há alterações recentes que possam ter causado o erro, direta ou indiretamente.

  3. Não há alterações recentes? Se for um erro muito específico (uma exceção), 'stackoverflow it'. Agora isso não soa melhor do que o 'google it', mas me sinto bem em dizer que primeiro busco o stackoverflow para pesquisas de programação que o google. Se for um problema realmente conhecido, é muito provável que você encontre uma solução aqui. Caso contrário, poste uma pergunta no site de troca de pilha relacionado. Você pode obter uma resposta muito rápida, ou mesmo se não conseguir, sua pergunta estará disponível enquanto você faz mais pesquisas. Isso é um benefício.

  4. Se você não encontrou uma resposta on-line ou não é um erro geral, siga o código passo a passo, verificando se os resultados obtidos de cada etapa fazem sentido para o resultado esperado. Comece do início ao fim de cada método e de baixo para cima em uma solução em camadas. (ou seja, se você estiver solucionando problemas de desempenho, comece com o código que recupera os registros. não faz sentido iniciar na interface do usuário se você puder determinar rapidamente se o primeiro passo é o problema).

  5. Se, depois de analisar o código algumas vezes, você ainda não encontrou o que há de errado, ligue para alguém para falar sobre isso. Como alguém já mencionado, falar sobre isso em voz alta pode acender a lâmpada. Além disso, a programação em pares é realmente útil.

  6. Nesse ponto, se possível, vá embora por algum tempo ou durante o dia. Eu li um tweet muito verdadeiro ontem que dizia: "Fui para a cama pensando 'como vai' e acordei pensando 'mas é claro'". Tão verdade.

  7. Se você ainda não tiver uma resposta, ouso dizer que você pode tentar refatorar em tarefas / métodos / funções menores. Henry Ford disse algo como "Não há uma tarefa tão complexa que não possa ser realizada dividindo-a em tarefas menores". Nesse ponto, se a solução for muito complexa e você não tiver descoberto sozinho ou com a ajuda de outra pessoa, refatorar o código em tarefas menores. Mesmo que você não o cometa, isso pode ajudá-lo a encontrar o motivo.

  8. Adicione instrumentação ao seu código.

  9. Tweet sobre isso ??


1

Você precisa recuar. Meu lema é "se o problema é muito difícil, então você está resolvendo o problema errado". Quais são as suas suposições? não confie em nada.

O corolário disso é "quanto mais estranho o problema, mais estranha a solução". A força do computador é sua lógica, para que você não possa vencer na lógica. Você tem um cérebro e precisa pensar melhor.

Nos tempos modernos, existem muitas outras coisas interagindo em um sistema - firewalls, antivírus, antivírus, atualizações automáticas que acontecem todas as noites - você precisa lidar com alvos em movimento.


Tão verdade que 'quanto mais estranho o problema, mais estranha a solução'
Adel

-1

Google it. Stackoverflow it. Publique nos fóruns. Basicamente, se você não conseguir resolver sozinho, peça ajuda às pessoas.


-1
  1. Anote o problema.
  2. Pense mais.
  3. Implemente a solução.

Conciso, muito bom!
Adel

1
Na verdade não. Pensar demais ao longo das mesmas faixas é a pior coisa possível que você pode fazer. 'Desafiar, enumerar, revisitar e testar cada uma de suas suposições, de maneira sistemática' é a solução aqui; as pessoas estão discutindo diferentes táticas para conseguir isso.
SMCI
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.