¿Consejos para depurar con muy poca información? [cerrado]

11

Heredé un proyecto con una base de código bastante grande, y el desarrollador original rara vez responde a los correos electrónicos. Hay muchas formas diferentes de hacer algunas cosas en él, y no las conozco todas. Una gran cantidad de código duplicado a lo largo de estas rutas (en lugar de funciones incluidas por, digamos, 5 páginas que hacen relativamente lo mismo, es código copiado en 5 páginas), y algunos problemas sutiles en la base de datos (todos hemos oído hablar del código de espagueti , pero ¿alguna vez has oído hablar de una base de datos de spaghetti?)

Todo esto lo puedo manejar la mayor parte del tiempo sin problemas.

El problema es cuando un cliente encuentra un error en alguna parte. Por lo general, envían una captura de pantalla del problema final y dicen: "¿Podrían ver esto?" al tiempo que destaca lo específico en la página que está mal y, a veces, lo que se esperaba. Se brinda muy poca información adicional, y tratar de hablar con ellos y obtener más (como lo que hicieron para obtener el resultado) es como tirar de los dientes.

Básicamente, se reduce a esto:

  • Código base grande y complejo con el que no estoy 100% familiarizado
  • De muchas maneras, las cosas pueden salir mal
  • Muy poca información sobre cómo surgió un error

¿Alguien tiene algún consejo, truco, sugerencia, etc. sobre cómo depurar este tipo de cosas?

Tarka
fuente
"¿Alguna vez has oído hablar de una base de datos de spaghetti?" Una vez trabajé en un trabajo donde la base de datos del producto había evolucionado continuamente durante más de diez años, con poco o ningún esfuerzo para refactorizarla a medida que crecían los requisitos (y crecía, y crecía, y crecía). Tenía una compañera de trabajo cuyo trabajo completo se reducía a "Comprender la base de datos, crear consultas SQL para extraer cualquier cosa útil de ella", y ella era indispensable. Siento tu dolor.
BlairHippo
Como complemento, [lea las publicaciones de "depuración psíquica" en el blog de Raymond Chen] ( goo.gl/2KIH )!
Wizard79
¿Qué tan grande es la base del código? ¿Diez KLOC o 50 MLOC?
Basile Starynkevitch

Respuestas:

11

Cuando obtengo algo así, generalmente exijo más información. No estoy seguro de cómo es el lugar donde trabaja, pero aquí, si no tengo suficiente información para reproducir el problema localmente, puedo enviar el ticket de vuelta marcado No se puede reproducir, con una solicitud de más información, y saben que no se solucionará nada hasta Puedo romperlo por mi parte.

Si sus clientes tienen problemas para describir los pasos, pídales un video de captura de pantalla. Hay algunos productos gratuitos que pueden crearlos, como Jing. Hace que sea mucho más fácil ver exactamente lo que estaban haciendo.

EDITAR: Jing fue una buena idea cuando escribí esto hace unos años. Desde entonces, han modificado su instalador para cargar su sistema con crapware "extra" que nunca solicitó, por lo que ya no puedo recomendarlo. Sin embargo, hay muchos grabadores de pantalla decentes.

Mason Wheeler
fuente
2
+1 Un buen consejo, y lo ampliaría a: ¿Pueden hacer que el error ocurra de manera confiable o es intermitente? Si está sucediendo de manera confiable, ¿pueden guiarte por los pasos que tomaron para llegar allí?
BlairHippo
1
Ver los archivos de registro puede ayudar un poco.
pramodc84
11

Un buen comienzo podría ser este libro .

texto alternativo

Estoy usando la definición a continuación, ya que parece que el desarrollador ya no está disponible para soportarlo.

El código heredado es el código fuente que se relaciona con un producto que ya no es compatible.

Gordon
fuente
La parte triste es que esto ni siquiera es código heredado. Estoy bastante seguro de que la mayor parte de lo que estoy trabajando comenzó a principios de este año.
Tarka
3
@Slokun: la definición de "Código heredado" en el libro no es totalmente la misma que la definición tradicional del mismo. Es un muy buen libro.
Austin Salonen
4

Tuve un problema similar hace unos años y el mayor impulso a la productividad y la limpieza del código fue integrar el seguimiento de errores en el sistema.

Usamos Fogbugz (¡supongo que todavía lo hacen Fogcreek!) Y pudimos construir un mecanismo de manejo de excepciones donde el usuario podía presionar un botón cada vez que se generaba una excepción y se registraba de inmediato en nuestro sistema, no más llamadas y No más capturas de pantalla. Con esta opción, toma la información que necesita en lugar de intentar extraerla del usuario. Parece que una variante te haría algo bueno, especialmente con una opción de captura de pantalla.

La otra cosa que querrá comenzar a hacer es comenzar a agregar registros. Es posible que desee ir tan lejos como registrar cada llamada de método con valores de argumento. Como parece que está trabajando con código heredado (código sin pruebas), este registro lo ayudará a agregar las pruebas unitarias adecuadas para que no repita ningún problema.

Austin Salonen
fuente
Para una gran base de código preexistente, agregar un buen registro será un INFIERNO de mucho trabajo. +1 porque puede ser la única opción viable si los errores son intermitentes.
BlairHippo
@BlairHippo: Según mi experiencia, lo es, pero ese es el precio que paga con una base de código que está describiendo. Para empezar, es casi tan miserable como trabajar en una base de código así ...
Austin Salonen
El registro es difícil. Agregar el registro de excepciones automatizado es trivial y vale la pena el esfuerzo (mínimo) mil veces. O al menos, está en Delphi. No estoy seguro de qué soluciones existen para otros idiomas, pero no debería ser demasiado difícil para cualquier idioma con un manejo de excepción decente.
Mason Wheeler
1

Mi consejo más serio es comenzar a refactorizar donde pueda. No puedo contar la cantidad de veces que vi una copia de la funcionalidad solo para descubrir que no era 100% una copia completa. Fue 99.9% de copia y 1 pequeño error menor que resultó en un error. Comience a agregar pruebas unitarias a todo y si tiene un departamento de control de calidad, intente obtener algunos scripts de prueba automatizados para esas partes del código que está trabajando.

Por otro lado, vea cuánto registro puede inyectar en el código. Es decir, si no tiene mucho en lo que respecta al inicio de sesión, puede agregar un indicador al código para comenzar a recoger registros más detallados para sus propios propósitos de depuración. Esto es algo que puede hacer que un usuario active y desactive si puede iniciar un diálogo. Me ha ayudado más veces de las que puedo contar. Normalmente obtengo "no funciona" sin una imagen del problema. Solo digo "envíame el archivo de registro".

Wheaties
fuente
0

Comience escribiendo pruebas unitarias. Elija una clase o una función y escriba un conjunto de pruebas que correspondan a cómo cree que debería funcionar. Si las pruebas fallan, descubra por qué. Si es un error, corríjalo. Si sus expectativas resultan ser erróneas, descubra lo que realmente hace y modifique las pruebas en consecuencia.

Una vez que tenga un conjunto decente de pruebas de unidades de trabajo, tiene una red de seguridad para realizar algunas refactorizaciones para hacer que el código sea más limpio.

Siga iterando hasta que comprenda la base del código.

No hace falta decir que esto es algo que debe hacer con anticipación, no en respuesta a un informe de error.

Dima
fuente