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?
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?
Respostas:
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.
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.
Antes que passassem dez horas, eu precisaria de ajuda.
Uma palavra, timebox
defina 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.
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.
Eu tenho um plano de três etapas:
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.
Eu geralmente faço um dos três:
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 :-).
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
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.
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.
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).
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 .
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.
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
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, é:
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.
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.
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.
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).
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.
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.
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.
Adicione instrumentação ao seu código.
Tweet sobre isso ??
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.