Hay una serie de definiciones para la palabra ciencia, pero parece que posiblemente se esté refiriendo a lo que se podría denominar con mayor precisión el " método científico ". El método científico podría resumirse como la observación de algunos fenómenos (presumiblemente un error o un comportamiento inesperado del programa), la formulación de una hipótesis o hipótesis para explicar el comportamiento, y el experimento más probable para probarlo (escribir una prueba que reproduzca el problema de manera confiable).
Los tipos de errores (fenómenos) que pueden ocurrir son prácticamente infinitos y algunos no requieren necesariamente un proceso bien definido. Por ejemplo, a veces observa un error e instantáneamente sabe qué lo causó simplemente porque está muy familiarizado con el código. Otras veces, sabe que, dada alguna entrada (acción, serie de pasos, etc.), se produce un resultado incorrecto (bloqueo, salida incorrecta, etc.). Para esos casos, a menudo no requiere mucho pensamiento "científico". Un poco de pensamiento puede ayudar a reducir el espacio de búsqueda, pero un método común es simplemente recorrer el código en un depurador y ver dónde las cosas salieron mal.
Sin embargo, las situaciones que considero más interesantes y posiblemente dignas de un proceso científico son donde se le entrega un resultado final y se le pide que explique cómo sucedió. Un ejemplo obvio de esto es un volcado por caída. Puede cargar el volcado de memoria y observar el estado del sistema y su trabajo es explicar cómo llegó en ese estado. El volcado de bloqueo (o núcleo) puede mostrar una excepción, punto muerto, error interno o algún estado "indeseable" según lo definido por el usuario (por ejemplo, lentitud). Para estas situaciones, generalmente sigo los siguientes pasos:
Observación estrecha : estudie la información que rodea directamente el problema específico, si corresponde. Las cosas obvias aquí son la pila de llamadas, las variables locales si puede verlas, las líneas de código que rodean el problema. Este tipo de estudio de ubicación específica no siempre es aplicable. Por ejemplo, estudiar un sistema "lento" puede no tener una ubicación de inicio obvia como esta, pero una situación de bloqueo o error interno probablemente tendrá un punto de interés inmediato y obvio. Un paso específico aquí podría ser utilizar herramientas como windbg (ejecute! Analyse -v en un volcado de memoria cargado y mire lo que le dice).
Observación amplia : estudie otras partes del sistema. Examine el estado de todos los subprocesos en el sistema, mire cualquier información global (número de usuarios / operaciones / artículos, transacciones / procesos / widgets activos, etc.), información del sistema (SO), etc. Si el usuario proporcionó detalles externos , piense en aquellos en conjunto con lo que ha observado. Por ejemplo, si le dijeron que el problema ocurre todos los martes por la tarde, pregúntese qué podría significar eso.
Hipotetizar: Esta es la parte realmente divertida (y no estoy siendo gracioso acerca de que sea divertido). A menudo requiere una gran cantidad de pensamiento lógico a la inversa. Puede ser muy divertido pensar en cómo el sistema entró en el estado actual. Sospecho que esta es la parte que mucha gente piensa que es un arte. Y supongo que podría ser si el programador simplemente comienza a arrojarle cosas al azar para ver qué queda. Pero con experiencia, este puede ser un proceso bastante bien definido. Si piensa muy lógicamente en este punto, a menudo es posible definir posibles conjuntos de caminos que condujeron al estado dado. Sé que estamos en el estado S5. Para que eso suceda, S4a o S4b debían ocurrir y quizás S3 antes que S4a, etc. Más a menudo que no, puede haber múltiples elementos que podrían conducir a un estado dado. A veces puede ser útil escribir en un bloc de notas un diagrama de flujo o estado simple o una serie de pasos relacionados con el tiempo. Los procesos reales aquí variarán mucho dependiendo de la situación, pero un pensamiento serio (y un reexamen en los pasos anteriores) en este momento a menudo proporcionará una o más respuestas plausibles. También tenga en cuenta que una parte extremadamente importante de este paso es eliminar las cosas que son imposibles. Eliminar lo imposible puede ayudar a recortar el espacio de la solución (recuerde lo que dijo Sherlock Holmes sobre lo que queda después de eliminar lo imposible). También tenga en cuenta que una parte extremadamente importante de este paso es eliminar las cosas que son imposibles. Eliminar lo imposible puede ayudar a recortar el espacio de la solución (recuerde lo que dijo Sherlock Holmes sobre lo que queda después de eliminar lo imposible). También tenga en cuenta que una parte extremadamente importante de este paso es eliminar las cosas que son imposibles. Eliminar lo imposible puede ayudar a recortar el espacio de la solución (recuerde lo que dijo Sherlock Holmes sobre lo que queda después de eliminar lo imposible).
Experimento : en esta etapa, intente reproducir el problema en función de las hipótesis derivadas en el paso anterior. Si pensaste seriamente en el paso anterior, esto debería ser muy sencillo. A veces "engaño" y modifico la base del código para ayudar a una prueba dada. Por ejemplo, recientemente estaba investigando un accidente que concluí que era por una condición de carrera. Para verificarlo, simplemente coloco un Sleep (500) entre un par de líneas de código para permitir que otro hilo haga sus cosas malas en el momento "correcto". No sé si esto está permitido en la ciencia "real", pero es perfectamente razonable en el código que posee.
Si logra reproducirlo, lo más probable es que haya terminado (todo lo que queda es el simple paso de arreglarlo ... pero eso es para otro día). Asegúrese de verificar la nueva prueba en el sistema de prueba de regresión. Y debo señalar que tenía la intención de que la afirmación anterior sobre arreglarlo fuera simple de ser irónica. Encontrar una solución e implementarla puede requerir mucho trabajo. Es mi opinión que la reparación de un error no es parte del proceso de depuración, sino que es más bien un desarrollo. Y si la solución está involucrada, eso debería requerir cierta cantidad de diseño y revisión.