# ¿Cómo manejar errores intermitentes?

El error intermitente es un primo del tipo de error del escorpión invisible de 50 pies de altura del espacio exterior. Esta pesadilla ocurre tan raramente que es difícil de observar, pero lo suficientemente seguido como para no poder ignorarla. No se puede depurar porque no se puede encontrar.

Aunque después de 8 horas empezarás a dudarlo, el error intermitente tiene que obedecer las mismas leyes de la lógica que todo lo demás. Lo que lo hace difícil es que ocurre solo bajo condiciones desconocidas. Intenta registrar las circunstancias bajo las cuales ocurre el error para que puedas adivinar cuál es la variabilidad real. La condición puede estar relacionada con los valores de los datos, como ‘Esto solo sucede cuando ingresamos _Wyoming_ como un valor’. Si eso no es la fuente de la variabilidad, el siguiente sospechoso debería ser una concurrencia mal sincronizada.

Intenta, intenta, intenta reproducir el error de manera controlada. Si no puedes reproducirlo, coloca una trampa para él construyendo un sistema de registro, uno especial si es necesario, que pueda registrar lo que crees que necesitas cuando realmente ocurra. Resignate a que si el error solo ocurre en producción y no a tu antojo, este puede ser un proceso largo. Las pistas que obtienes del registro pueden no proporcionar la solución, pero pueden darte suficiente información para mejorar el registro. El sistema de registro mejorado puede tardar mucho tiempo en implementarse en producción. Luego, debes esperar a que el error vuelva a ocurrir para obtener más información. Este ciclo puede continuar durante algún tiempo.

El error intermitente más estúpido que creé fue en una implementación multiproceso de un lenguaje de programación funcional para un proyecto de clase. Me aseguré muy cuidadosamente de la evaluación concurrente correcta del programa funcional, buena utilización de todas las CPU disponibles (ocho, en este caso). Simplemente olvidé sincronizar el recolector de basura. El sistema podía ejecutarse durante mucho tiempo, a menudo terminando cualquier tarea que comenzará, antes de que algo notable saliera mal. Me da vergüenza admitir que había empezado a cuestionar el hardware antes de que mi error se hiciera evidente.

En el trabajo, recientemente tuvimos un error intermitente que nos llevó varias semanas encontrar. Tenemos servidores de aplicaciones multiproceso en Java™ detrás de servidores web Apache™. Para mantener vueltas de página rápidas, realizamos todas las operaciones de entrada/salida en un pequeño conjunto de cuatro subprocesos separados de los subprocesos de cambio de página. De vez en cuando, estos aparentemente se ‘quedaban atascados’ y dejaban de hacer algo útil, hasta donde nuestras bitácoras nos permitían saber, durante horas. Dado que teníamos cuatro subprocesos, esto no era en sí mismo un problema gigante, a menos que los cuatro se quedarán atascados. Luego, las colas vaciadas por estos subprocesos llenarían rápidamente toda la memoria disponible y harían que nuestro servidor se bloqueará. Nos llevó aproximadamente una semana entender esto, y aún no sabíamos qué lo causaba, cuándo o incluso qué estaban haciendo los subprocesos cuando se quedaban ‘atascados’.

Esto ilustra algunos riesgos asociados con el software de terceros. Estábamos utilizando un código con licencia que elimina las etiquetas HTML del texto. Aunque teníamos el código fuente (¡gracias a Dios!), no lo habíamos estudiado detenidamente hasta que, al aumentar el registro en nuestros servidores, finalmente nos dimos cuenta de que los subprocesos de correo electrónico se quedaban atascados en este problemático código con licencia.

El programa funcionaba bien excepto en algunos textos largos y poco comunes. En estos textos, el código era cuadrático o peor. Esto significa que el tiempo de procesamiento era proporcional al cuadrado de la longitud del texto. Si estos textos ocurrieran comúnmente, habríamos encontrado el error de inmediato. Si nunca hubieran ocurrido en absoluto, nunca habríamos tenido un problema. Como sucedió, nos llevó semanas finalmente entender y resolver el problema.

Siguiente [¿Cómo aprender habilidades de diseño?](11-how-to-learn-design-skills)
