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?
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?
Respuestas:
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.
fuente
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.
fuente
Antes de que pasen diez horas, buscaría ayuda.
fuente
Una palabra,
timebox
establezca 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.
fuente
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.
fuente
Tengo un plan de tres pasos:
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.
fuente
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.
fuente
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.
fuente
Generalmente hago uno de los tres:
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 :-).
fuente
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
fuente
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.
fuente
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.
fuente
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).
fuente
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 .
fuente
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.
fuente
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
fuente
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:
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.
¿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.
¿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.
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).
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.
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.
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.
Agregue instrumentación a su código.
¿Tuitear al respecto?
fuente
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.
fuente
Buscalo en Google. Stackoverflow it. Publícalo en los foros. Básicamente, si no puede resolverlo solo, haga que la gente lo ayude.
fuente
fuente