# Heisenbug

En jerga de programación, un heisenbug es un tipo de bug que parece desaparecer o comportarse de otro modo al intentar ser observado en detalle. El término es un juego de palabras a partir del nombre de Werner Heisenberg, el físico que dedujo el efecto de observación de la mecánica cuántica, según el cual el mero hecho de observar un sistema de una manera determinada altera el estado de este.
Términos similares como bohrbug, mandelbug y schrödinbug han sido propuestos ocasionalmente para otro tipo de bugs inusuales; de todos modos, no son tan conocidos ni empleados como el "heisenbug".

## Mandelbugs

Un Mandelbug (del apellido de Benoît Mandelbrot, matemático famoso por su estudio de fractales) es un bug tan complejo que no se puede encontrar una manera de eliminarlo, o cuyo efecto parece caótico y parece no determinista.
Los Mandelbugs son fallas que son provocadas por condiciones complejas, como la interacción con el hardware y otro software, y el tiempo o el orden de los eventos. Estas fallas son considerablemente difíciles de detectar con las pruebas tradicionales.
Entonces, el modo de operar de los Mandelbugs consiste en cimentar su existencia en causas tan complejas que sea difícil comprenderlas y atacarlas. Con cada solución que se intente, sólo se conseguirá un comportamiento distinto pero no se logrará eliminar. Además, este tipo de bug es capaz de formarse a sí mismo a partir de una combinación de pequeños detalles en muchas porciones de código aparentemente inconexas. Por lo tanto, para solucionarlos se puede aplicar ingeniería inversa.
Varios tipos de errores difíciles y complicados podrían llamarse mandelbugs. La idea común es que estos errores son resistentes a las correcciones, debido a sus propiedades caóticas o "no deterministas". Por ejemplo, una característica común de un mandelbug sería la dificultad que tendrían los equipos de prueba para replicarlo consistentemente. Errores como estos a menudo están ocultos en las esquinas del código, en cualquier ambigüedad sobre el tiempo, el uso de variables u otros aspectos del código fuente subyacente para el producto.
Mandelbug es el antónimo complementario de Bohrbug.

## Bohrbugs

Resulta casi intuitivo saber que los Bohrbugs son errores de software, o simplemente fallos en un programa de computador o sistema de software que desencadena un resultado indeseado (bug) que se asemejan al modelo de átomos de Bohr, de ahí el nombre.
Los llaman 'bohrbugs': errores software tan raros que son casi imposible de ser aislados y replicados.
La denominación incluye como parte inicial del nombre al átomo de Bohr porque representa un error sólido y fácilmente detectable. Por este motivo es quizás el error más aburrido de investigar. Es fácil de encontrar y la mayoría de las veces fácil de corregir.
Un Bohrbug es un error, defecto o falla que aparece bajo condiciones consistentes y cuantificables, por lo tanto, representa un error sólido y fácilmente detectable. Además de que no cambia su comportamiento. La contraparte de un Bohrbug es un error de Heisenbug, uno que no se puede replicar fácilmente en condiciones definidas comúnmente. Como se ha dicho, es considerado como un bug fácil y sencillo de resolver, basta con ejecutar las condiciones identificables y verificar si hay errores.

## Ejemplos

Los Heisenbugs se producen porque los frecuentes intentos de depuración de un programa informático, como la inserción de declaraciones de entrada y salida o la ejecución (cálculo) con un depurador, suelen tener el efecto secundario de cambiar sutilmente el comportamiento del programa, como el cambio de la dirección de memoria de las variables y el tiempo de ejecución.
Un ejemplo común de heisenbug es un error que se produce cuando el programa se compila con un compilador de optimización, pero no cuando el mismo programa se compila sin optimización (como suele hacerse con el fin de examinarlo con un depurador). Durante la depuración, los valores que un programa optimizado normalmente guardaría en los registros se desplazan a menudo a la memoria principal. Esto puede afectar al resultado de las comparaciones en coma flotante, por ejemplo, porque el valor en memoria puede tener un rango menor y una precisión menor que el valor en el registro. De manera similar, los heisenbugs pueden ser causados por efectos secundarios en las expresiones de prueba que se utilizan en tiempo de ejecución para evaluar aserciones en lenguajes como C y C++, donde la expresión de prueba no se evalúa si las aserciones se desactivan en el código de producción utilizando la macro NDEBUG.