¿Cómo abordas errores realmente extraños que te mantienen perplejo por más de 10 horas? [cerrado]

29

Los conoces, esos errores que NO tienen sentido. Donde parece que un gremlin saltó profundamente dentro de tus fichas y estropeó algo. ¿Caminas, escribes cosas y llamas a un tío?

Adel
fuente
3
Su descripción puede ser correcta: reinicie y vuelva a intentarlo.
NoChance
55
publicarlo en stackoverflow, por supuesto :)
William
55
¿Por qué decidiste un umbral de 10 horas? Eso es demasiado tiempo: si no tiene una buena idea de lo que está causando un comportamiento inesperado dentro de una hora o dos, está en problemas.
Vector
55
"Cuando las cosas se ponen difíciles, los duros se van a dormir y dejan que el subconsciente trabaje en ello". - anon
Michael Easter
2
1. Consigue que alguien te ayude. Dos personas son imprescindibles. 2. Limítelo usando cantidades excesivas de declaraciones de depuración. Había un archivo en el que cada línea iba precedida por una macro de depuración para identificar la que segfauló.
SF.

Respuestas:

9

Para esos problemas realmente horribles, mi estrategia suele ser la siguiente.

  • Experimento y google. Sigue intentando resolver el problema. La mayoría de las veces esto resuelve el problema en una hora o menos.

  • Entonces eso no ha funcionado. Tomar un descanso. Tómate un café, habla de algo que no esté relacionado con un colega. Saca el problema de tu mente. Cuando miras el problema 5 o 10 minutos después, lo estás mirando desde una perspectiva ligeramente diferente. La mayoría de las veces esto funciona.

  • En este caso no lo ha hecho. Así que pasa otros 10-30 minutos mirándolo. Luego llame a un colega. Pero antes de hacerlo, toma algunas notas; desea demostrar el problema, reproducirlo, luego enumerar las cosas que ha intentado y, lo más importante, demostrar que lo ha intentado. Así que primero haz una carrera en seco. Establezca algunas marcas de libro en el código, cierre todos los documentos abiertos superfluos, etc. De esta manera, puede resolver el problema usted mismo o, si lo demuestra, no perderá el tiempo.

  • Pídale a su colega que le haga probar todas sus suposiciones. ¿Se está invocando ese setter? ¿Ese método realmente está devolviendo lo que usted dice que es? Cree que ese objeto no es nulo; muéstreles que no es nulo.

  • La mayoría de las veces, ya sea demostrando el problema, te darás cuenta de que no has probado todas las posibilidades o tu colega verá tu error.

  • Si eso no funciona, es hora de ponerse serios. Documente exactamente lo que está tratando de hacer, lo que ha intentado y por qué no funcionó. Envíe esto por correo electrónico a todos sus colegas. Publícalo en SO. En este punto, el documento debería ser una pregunta SO perfecta.

  • Mientras espera las respuestas, google google google. Pruebe cada permutación de la pregunta que tiene. Abre un montón de pestañas. Probablemente no obtendrá una respuesta en este momento, pero está buscando ideas, posibilidades, diferentes formas de abordar el problema.

  • Haga otra cosa, si ha pasado 5 horas en un problema, es hora de dejarlo para otro día. Tal vez obtendrá una respuesta útil. Tal vez cuando ataques el problema al día siguiente sea obvio.

  • Si nada de eso funciona, es hora de buscar una solución diferente. Quizás pueda usar un método diferente, una tecnología diferente. Tal vez debería considerar abandonar la función por ahora. ¿Está facturando al cliente por hora? ¿Estás trabajando para una empresa en una aplicación interna? Debe comunicarle esto al propietario y decirle "mira, he pasado x horas en esto y no he progresado, ¿vale la pena el beneficio de costo?". No desea ir a su jefe y decirle que pasó 16 horas en un problema solo para que se den la vuelta y le digan que no es tan importante, omítalo para esta versión. necesitas descubrir eso antes.

  • ¿Y si eso no funciona? Bueno, sus únicas opciones son seguir martillando el problema o buscar experiencia en la industria. Consulte a expertos en tecnología en twitter. Envíe un correo electrónico a su proveedor de tecnología.

Robert Anton Reese
fuente
79

Dejar. No, no es tu trabajo! Solo levántate y vete a casa. Ya terminaste el día o el fin de semana. 19 de cada 20 veces cuando vuelva al problema, la solución se presentará dentro de una hora.

Dave Nay
fuente
17
También podrías probar con goma para esquivarlo. en.wikipedia.org/wiki/Rubber_duck_debugging
Dave Nay
2
19 de 20, sí. Mi peor nunca se resolvió, solo funcionó. Ningún entorno de prueba lo mostró, solo el entorno de producción completo en funcionamiento; ni siquiera pudimos reproducirlo después de horas.
Loren Pechtel
3
Alejarse de algo que te irrita puede ser realmente difícil, pero a lo largo de los años he descubierto que siempre es lo mejor que puedes hacer. La mente subconsciente puede trabajar en el problema mientras comes, duermes, estás bien, ves televisión ... y al día siguiente (o al día siguiente) las cosas van mejor. Sin embargo, una advertencia: reunir información antes de alejarse ... Alejarse no es lo mismo que ignorarlo y pretender que no está allí. ¡Todavía necesitas trabajo duro!
rápidamente_ahora
1
No sé aproximadamente una hora. Generalmente resuelvo la mayoría de estos tipos de problemas en la ducha cuando me levanto por la mañana. El segundo más frecuente será cuando esté casi dormido por la noche y finalmente me haya dejado de pensar en ello.
SoylentGray
3
Hubo una fascinante NOVA Science NOW organizada por Neil deGrasse Tyson que habló sobre la ciencia del sueño. En él se discutió el fenómeno de golpearse la cabeza con un problema durante horas, irse a dormir y despertarse y resolverlo de inmediato. Cuando dormimos, nuestro cerebro cambia los eventos de nuestro día una y otra vez, analizándolo desde muchos ángulos diferentes. Lo que deja atrás son nuevas vías neuronales que en realidad pueden ayudarnos a ver el problema de una manera completamente nueva inconscientemente, y luego resolver el problema. Bastante impresionante.
Byrne Reese
44

Antes de que pasen diez horas, buscaría ayuda.

  1. Describa el problema a otra persona, a cualquier otra persona, incluso a su pato de goma .
  2. Pídale a alguien que le eche un vistazo al código o que lo lea con ellos.
  3. Aislarlo. Elimine un montón de cosas, luego tráigalas poco a poco hasta que el problema vuelva a aparecer.
  4. ¡Duerme un poco!
Kevin Cline
fuente
12
+1 para eliminar todo hasta que el problema desaparezca.
Jonás
44
Debe hacer una de esas cosas antes de que pase 1 hora. Mientras más mire, menos probabilidades tendrá de lograr su epifanía. Normalmente resuelvo un problema simplemente hablándolo con alguien.
Ben
Spot on. A menudo descubro el problema (o me acerco) describiendo primero el problema. Con frecuencia esto ocurre al escribir una descripción del problema para una pregunta de StackOverflow. Que también requiere una reducción (aislamiento) y luego en su defecto, un período de espera en el que se aleja del problema y dejar que el SO respuestas vienen rodando en.
sholsinger
17

Una palabra, timeboxestablezca una cantidad limitada de tiempo para trabajar en algo, y si no se resuelve, continúe con otra cosa y regrese a ello al día siguiente con una nueva perspectiva.

Ese y otro par de ojos siempre valen más que cualquier tiempo que puedas perder mirando algo.

Nunca pasaría más de 45 minutos a una hora tratando de resolver algo de una sola vez, viola la ley de rendimientos decrecientes.

user7519
fuente
Muchas gracias: leí el artículo de timebox en wikipedia, muy útil.
Adel
7

Explique el problema a otra persona.

Al explicar el problema a otra persona, debe aclararlo: esto a menudo le permite ver la solución.

(Una de las revistas profesionales de informática del Reino Unido propuso vender recortes de cartón de tamaño real de un programador sénior específicamente para este propósito).

Creo que dormir con un problema (a veces durante un par de días) también puede ayudar.

MZB
fuente
1
El "alguien más" no necesita ser humano. A veces le explico cosas al gato, y ¡ajá! Encuentro el problema.
DarenW
Realmente debería comprar un gato también. Lo entrenaría para rascarme la cabeza a pedido.
Adel
Alguien realmente debería hacer un recorte de cartón de tamaño natural de Jon Skeet.
Don Roby
5

Tengo un plan de tres pasos:

  1. Consigue un café u otra bebida sabrosa.
  2. Trabaja en otra cosa por el resto del día.
  3. "Llamar a un amigo" y garabatear en la pizarra.

Cada etapa es una escalada si el paso anterior falla. Casi siempre hay algo más productivo en lo que puedo trabajar en la etapa 2.

Flexografía
fuente
Buen consejo! Entonces se cita "Llamar a un amigo" porque debería limitarse a 60 segundos, como en Millionaire, ¿sí? También me gusta la idea de pizarra.
Adel
1
Creo que la pizarra realmente ayuda a pensarlo metódicamente. Las citas fueron porque a menudo el amigo está en la misma oficina, por lo que llamar sería extraño. Pero se sintió como un salvavidas del programa de televisión.
Flexo
4

Duerme sobre eso

De lo contrario, llame a alguien cercano y pídale que eche un vistazo rápido al código.

A menudo, otros errores que le llevarían mucho tiempo encontrar (ya que es su código) son muy fáciles de encontrar por otros.

Akash
fuente
3

Podrías ver si levantarte, caminar y pensar en el problema te ayuda a encontrar una solución. Ya sea que esté de pie o paseando, intente alejarse de la computadora mientras piensa.

compman
fuente
3

Generalmente hago uno de los tres:

  1. Dé un paseo a pie o en bicicleta ... algo que lo aleje de la computadora.
  2. Jugar con mi perro o gato
  3. Si tienes un pasatiempo, trabaja en eso por un tiempo.

Cualquiera de los tres hace un buen trabajo al distraerse de la situación en cuestión. Encuentro que las distracciones permiten que mi cerebro subconsciente mastique algo por un tiempo. Después de una hora más o menos de esto, bam, ahí está la solución :-).

niño pequeño
fuente
3

Cree un arnés de prueba para apuntar a ese defecto exacto y aíslelo

Solo sigue eliminando un buen código ... mientras replicas el defecto. Hasta que apunte al código exacto que encierra el error. Luego rastrea el código.

Lectura recomendada: El programador pragmático Específicamente Capítulo 10: Balas trazadoras

imbéciles
fuente
todo esto es bueno y bueno, pero da por sentado que el error ha sido y puede reproducirse. ¿Qué pasaría si las 19 horas pasadas hasta el momento fueran solo eso ... tratando de encontrar un medio para reproducir el problema de una manera determinista y sistemática ... entonces qué? ¡Para mí ESA es la esencia de la pregunta aquí!
Newtopian
El programador pragmático es excelente
Adel
2

Todas estas sugerencias son geniales. Sin embargo, uso una técnica con bastante frecuencia que no vi mencionada. Haga listas para organizar sus pensamientos sobre el problema. Si tengo un problema particularmente difícil, generalmente escribo varias listas como: hechos, suposiciones, preguntas, síntomas, etc. Me parece que muchas veces en el proceso de organizar las cosas de esta manera descubro suposiciones que no me di cuenta que tenía ( que a menudo resultan estar equivocados), preguntas que no sabía que debían hacerse, otras permutaciones que puedo verificar, etc.

RationalGeek
fuente
2

Editar:

La respuesta corta:

P: ¿Cómo abordas errores realmente extraños que te mantienen perplejo por más de 10 horas?

R: Asegúrese de que nunca sucedan: comprenda su diseño, conozca su código, aprenda a usar su depurador.


Explicación:

"Donde parece que un gremlin saltó profundamente dentro de tus fichas y estropeó algo"

Esto nunca debería suceder. Si es su código, debe tener una muy buena idea de lo que está causando el error antes de intentar solucionarlo.

Además, cuando escriba su código, ya debería saber dónde y por qué es probable que falle.

Dicho esto, preguntarle a un compañero, publicar en SO, volver sobre sus pasos y retroceder sus pasos y tomar un descanso, todas las sugerencias mencionadas anteriormente ayudarán.

La otra cosa es que debe conocer sus herramientas: su kit de herramientas de depuración. Registrar mensajes en puntos sospechosos en su código, examinar cuidadosamente su pila de llamadas, usar puntos de interrupción y relojes condicionales, etc. Las habilidades de depuración no son extras, son parte de la programación.

Mikey
fuente
Ser capaz de volver sobre los pasos es vital. ¡Gracias!
Adel
> Ser capaz de volver sobre los pasos es vital. El software SourceControl es la clave para poder retroceder / retroceder. Sea ANAL al respecto y, si puede, configure sus ajustes para obligarlo a dejar comentarios al registrarse.
Vector
3
Desafortunadamente, no importa qué tan bien conozca su código, a veces el problema es una interacción con el código de otra persona (fuente cerrada).
Nate CK
2
+1 @Nate CK- muy cierto. Los peores tipos de errores ocurren cuando recuperas algún tipo de galimatías de un servicio web en el que estabas confiando. Hace un tiempo tuve un proveedor de Saas que cambió sutilmente algunas funciones sin previo aviso en su servicio web. Tuve que explicarle al desarrollador cómo arreglar su propio error por teléfono mientras me describía cómo era su código.
Morgan Herlocker
1
Para determinar qué? ¿Que hay un problema en el código de terceros? Esa parte es relativamente fácil. La parte difícil es descubrir qué condiciones lo desencadenan y cómo solucionarlo, cuando no tiene la fuente, el proveedor no responde y tal vez no suceda en su sistema de prueba. Si crees que conocer tu código va a resolver todo eso por ti, sugiero que tal vez nunca hayas tenido que lidiar con eso.
Nate CK
1

Tuve un problema similar, una aparente corrupción de memoria en Objective-C, con el que luché durante muchas horas. Pero luego, mis colegas y yo solo dimos un paseo para almorzar, y les expliqué el problema (y un poco en particular que tenía que ver con la deserialización de un objeto en su método init), y básicamente me expliqué todo el problema.

(detalles técnicos: básicamente, inicialicé y devolví un objeto a algo más que uno mismo, por lo que hubo dos asignaciones, pero solo regresó un objeto. La memoria cambió y se volvió loca, se bloquea, y el depurador realmente no sabía qué hacer con tampoco).

Cthulhu
fuente
1
"Inicialicé y devolví un objeto a algo más que a mí mismo", ¡errores como ese SON DIFÍCILES! Puedes mirarlo más de 100 veces y no atraparlo. Pero, ¿no podría ver dos asignaciones rastreando en el depurador?
Vector
1

ingrese la descripción de la imagen aquí

Tómate un baño.

¿Algún fanático de Rodney McKay ?

Sin embargo, en serio, si hay una coincidencia entre todas estas respuestas, es tomar un descanso y hacer otra cosa .

Me gusta pensar que relega el problema a su subconsciente. Incluso si no somos conscientes de lo contrario, nuestras mentes (parecen) continuar trabajando en el problema, incluso cuando estamos haciendo otra cosa, como tomar un baño .

Mermelada de papel
fuente
Gran idea ... ahora solo necesito que el jefe ponga media docena de bañeras en la oficina.
Dave Nay
Si tan solo la legión de trabajadores de cubículos tuviera una habitación así.
Adel
1

Paso a paso paso a paso, hacia abajo en el ensamblaje. Quién llama a qué, punto de quiebre en el acceso a la memoria. Eso generalmente atrapa el error muy rápido.

Si no, sal a caminar.

Descifrador
fuente
1

Una combinación de todos estos:

  • Aléjese de él por un tiempo para que pueda sentarse en su quemador trasero. Dormir, descansar, comer, dar un paseo, lo que sea.

  • Examine más el problema, ¿qué más hace mal, qué otros síntomas puede encontrar?

  • Investigue el problema, vea lo que puede encontrar. Recuerde probar diferentes palabras clave

  • Intenta algo diferente . Un trabajo alrededor. Una técnica de depuración diferente. Un validador. Una computadora diferente.

  • Hablar con alguien . Incluso si no pueden ayudar, o ni siquiera un programador, a veces hablar activará la idea de la bombilla

  • ¡Reiniciar! Si corresponde, intente reiniciar su computadora, el servidor, etc. Si nada más, puede usar el tiempo para pensar.

  • ¡Pregúntale a StackOverflow! Estamos aquí para ayudar

rlb.usa
fuente
1

Realmente no me gustó la respuesta más votada, porque a pesar de que a veces funciona, a veces solo necesitas resolverlo ese mismo día, así que lo que recomendaría, en este orden, es:

  1. Confirme que no solo le está sucediendo a usted. Esto puede ahorrarle mucho tiempo. Tal vez desinstaló un componente requerido, o realizó un cambio en su entorno, y se está tragando una excepción en algún lugar de su código. Si solo le sucede a usted, usaría una herramienta de comparación de entornos. Hace poco leí sobre un software llamado Envy, que le permite hacer exactamente eso, aunque no es freeware, cuesta 10 USD.

  2. ¿Pasando a todos? Bien, ahora haga un Ver historial en el código y verifique los cambios recientes que podrían haber causado el error, ya sea directa o indirectamente.

  3. ¿No hay cambios recientes? Si es un error muy específico (una excepción), 'stackoverflow it'. Ahora eso no suena mejor que 'google it', pero me siento bien al decir que primero busco stackoverflow para investigación de programación que google. Si se trata de un problema realmente conocido, es muy probable que encuentre una solución aquí. De lo contrario, publique una pregunta en el sitio relacionado de stackexchange Es posible que obtenga una respuesta muy rápida, o incluso si no lo hace, su pregunta estará allí mientras investiga más. Eso es un beneficio.

  4. Si no encontró una respuesta en línea o no es un error general, recorra el código paso a paso, verificando si los resultados obtenidos de cada paso tienen sentido para el resultado que espera. Vaya de principio a fin en cada método, y de abajo hacia arriba en una solución escalonada. (es decir, si está solucionando problemas de rendimiento, comience con el código que recupera los registros. No tiene sentido comenzar en la interfaz de usuario si puede determinar rápidamente si el primer paso es el problema).

  5. Si después de revisar el código un par de veces aún no ha encontrado lo que está mal, llame a alguien para hablar sobre él. Como alguien ya mencionó, hablar en voz alta puede encender la bombilla. Además, la programación de pares es realmente útil.

  6. En este punto, si es factible, aléjese por algún tiempo o por el día. Ayer leí un tweet muy cierto que decía "Me fui a la cama pensando 'cómo diablos' 'y desperté pensando' pero por supuesto '". Tan verdadero.

  7. Si aún no tiene una respuesta, me atrevería a decir que podría intentar refactorizar en tareas / métodos / funciones más pequeñas. Henry Ford dijo algo como "No hay una tarea tan compleja que no se pueda lograr dividiéndola en tareas más pequeñas". En este punto, si la solución es demasiado compleja y no lo ha descubierto usted mismo o con la ayuda de otra persona, refactorice el código en tareas más pequeñas. Incluso si no terminas cometiéndolo, puede ayudarte a encontrar la razón.

  8. Agregue instrumentación a su código.

  9. ¿Tuitear al respecto?

silverCORE
fuente
1

Necesitas dar un paso atrás. Mi lema es 'si el problema es demasiado difícil, entonces estás resolviendo el problema incorrecto'. ¿Cuáles son tus suposiciones? No confíes en nada.

El corolario de eso es "cuanto más extraño es el problema, más extraño es la solución". La fuerza de la computadora es su lógica, por lo que no puedes ganar con la lógica. Tienes un cerebro y tienes que pensarlo mejor.

En los tiempos modernos, hay muchas otras cosas que interactúan en un sistema: firewalls, antivirus, antispyware, actualizaciones automáticas que se realizan todas las noches, tienes que lidiar con objetivos en movimiento.

jqa
fuente
Tan cierto que "cuanto más extraño es el problema, más extraño es la solución"
Adel
-1

Buscalo en Google. Stackoverflow it. Publícalo en los foros. Básicamente, si no puede resolverlo solo, haga que la gente lo ayude.

Pacerier
fuente
-1
  1. Escribe el problema.
  2. Pensar mucho.
  3. Implementa la solución.
Ingo
fuente
Conciso, muy bien!
Adel
1
En realidad no. Pensar demasiado en las mismas pistas es lo peor que puedes hacer. 'Desafiar, enumerar, revisar y probar cada una de sus suposiciones, de manera sistemática' es la solución aquí; la gente está discutiendo diferentes tácticas para lograr eso.
smci