Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web
El Canto del Cisne

Que es el BUG del Milenio? (Y2K)



Y2K es la sigla en Ingles de la frase "Year 2000" , o "año 2000"

Si Ud. aún se pregunta por que los ordenadores no pueden comprender el año 2000, puede creer que no está solo. El hecho es que los ordenadores SI pueden entender el año 2000. El problema reside en que la mayor parte de estas máquinas aceptan las fechas como "73" o "99" en lugar de "1973" o "1999". Las máquinas fueron programadas de propósito para entender que "73" debe significar "1973" y "99" debe significar "1999". Probablemente ahora se pregunte: cual debe ser el significado de "00"? 1900 or 2000? (a no ser el MS-DOS, si trata de entrar esta fecha no podrá por que MS-DOS se despertó recién el 1 de Enero de 1980).
Para los ordenadores (o computadoras) "00" significa "1900", y así despues de las 23:59:59 del 31 de Diciembre de 1999 vendrán las 0:00:00 del 1 de Enero de 1900, pero como Ud. bien puede suponer, a los humanos les gustaría que despues de 1999 viniese el año 2000.

Que tipo de gente tomó una decisión tan lunática?. Ningun loco lo hizo, sino que la decisión de cortar los dos primeros digitos del año fue tomada por personas que estaban muy limitadas en sus recursos informáticos.
Cuando estas máquinas comenzaron a ser programadas comercialmente en la década de 50 a) la gente estaba en la mitad del siglo y b) la memoria de ordenadores era MUY cara (si, mismo los discos magnéticos y las cintas era muy caros).
Algunas palabras clave para la historia de la informática son Babbage, Konrad Zuse, Ada Lovelace, Alan Turing, La máquina Enigma, Bentchley Park, la Máqina Diferencial, Museo Tecnológico de Munich, ENIAC, ILLIAC, MANIAC, MARK I, Proyecto Manhatann, Von Neumann, Batman y Robin..

En la década de 50 la gente se preguntaba muchas cosas, cual es la nueva música de Elvis Presley?, los comunistas comen a los niños?, y lo más importante: para que gastar valiosísimos recursos informáticos guardando una cantidad de "19"?, despues de todo (con excepción talvez de los japoneses), nadie ahorra dinero o firma contratos con plazo de aqui a 50 años. Por otro lado, la mayor parte de las personas (importantes lo suficiente como para tener registrados sus datos en ordenador) nacieron despues de 1900. La conclusión obvia fué asumir que el año 00 = 1900, 01 = 1901... 73 = 1973 y 99 = 1999, ahorrando asi dos lugares (19) en cada año, por que muy pocas fechas se desbordarían del siglo XX. Este parece ser un parco ahorro, pero para las transacciones en registros y cartones perforados de la época significaba un ahorro enorme. La gente que nació despues que Bill Gates ganó su primer billon de Dolares piensa que los ordenadores siempre fueron creados con CD-ROM 32X y tarjetas 8MB de SVGA, pero yo les juro que las máquinas de la década de 50 NI SIQUIERA tenian pantallas, sino apenas hilos de cobre para conversar con las CPU (luego a seguir vinieron las máquinas teletipo). Una GRAN memória era considerada de 2 KB (si, 2 KILO BYTES!, demasiado pequeña como para escribir programas de "teletipo-savers" como las tostadoras volantes, esa es la razón por la que nunca existieron programas para ahorrar teletipos en esa época).

Y luego?, que pasaría después de 1999?

No pasaría nada, por que cuando los "nerds" de la década del 60 vieron la película de A. C. Clarke "2001" se convencieron absolutamente que en aquel distante y maravilloso futuro (2000) sería suficiente con decir a las máquinas: "por favor Sr. Ordenador, ahora es el año 2000, el momento en que Ud. debería mudar su manera obsoleta y humana de pensar en las fechas..", y Mr. Ordenador comprendería nuestras palabras y ejecutaría los cambios en todos los ficheros y programas mientras resolvia conjeturas filosóficas. Ayer le pedí a mi Pentium que corrija los problemas del milenio pero él se ha limitado a eructar un "general failure". Le arroje una aspirina y un vaso de agua por la ranura del disco y parece que esta un poco mejor.

Mismo visionarios como A. C. Clarke jamás podrían imaginar esta conversación: Dave - "Abre la puerta HAL", HAL - "Anular, Repetir, Descartar?". Mismo el listo A. C. Clarke no podría prever la quiebra de PanAm, Bill Gates, General Failures, Windows, o mismo ratones y realidad virtual.
La mayor parte del software producido en los 60, 70 y 80 fueron programas en "COBOL" (COmmon Business Oriented Language , o, Lenguaje común orientado a los negocios), talvez por que la parte del León en la industria informática estaba con las grandes corporaciones y las agencias del gobierno. No recuerdo alguna máquina personal IBM-360 o una portatil ENIAC a válvulas, asi que probablemente no existieron después de todo. Mismo hoy con los lenguajes de cuarta generación, filosofia OOP, programación Visual y otras invenciones maravillosas y consumidoras de recursos, algo como 60 o 70 por ciento de todo el software comercial funcionando HOY son estos viejos programas COBOL escritos en las décadas del 60 y 70. (Por si acaso, existe también Visual Cobol hoy día, y no soy precisamente un entusiasta del COBOL).

Por que COBOL?, por que COBOL es un lenguaje (casi único en los 60) bien estructurado para trabajar con FICHEROS (archivos) de la misma forma que los hombres de negocios lo hacen normalmente con tarjetas ordenadas. COBOL fué el primer lenguaje preparado para manejar ficheros através de MÁSCARAS, o sea, organizar la información através de bloques de datos (una facilidad mas tarde incorporada por C y Pascal). Los lenguajes informáticos anteriores al COBOL (BASIC y FORTRAN) no tenían esta facilidad. COBOL podia grabar y recuperar conjuntos completos y bien estructurados de informacion y manejarlos como si fueran tarjetas de datos, por ejemplo:

Nombre: xxxxxxxxxxxxxxxxx
Fecha : xx/xx/xx
Direc.: xxxxxxxxxxxxxxxxxxxxx


De esta manera la gente podía programar a las máquinas exactamente como tarjetas dentro de un gabinete, sin preocuparse con los detalles internos sobre como grabar y leer las tarjetas.
Pero los ordenadores SI deben preocuparse con estos detalles, y cuando graban los datos, lo hacen grabando un bloque (o registro) despues del otro, por ejemplo:

PACO.RABA....090173Addison.Av....MARIA.INES...110386Rose.Street....
|_____ primer registro____________||_______ segundo registro __________|

Si pone atención notará el número "090173" pegado a "Addison Av." dentro del registro. Este número es probablemente una fecha que significa "9 de Enero de 1973", lo mismo que "110386" significando "11 de Marzo de 1986". Recuerde este detalle por que brevemente volveremos aqui. Recuerde tambien esto: grandes y medias empresas tienen millares (mismo docenas de millares) de programas que leen y actualizan estos registros, y también pueden llegar a tener millares de ficheros que guardan fechas. Cada programa usa una especie de "molde" cuando lee los registros. Volviendo a nuestro ejemplo, cada programa "sabe" que las primeras 12 posiciones del registro significan "nombre de la persona", las 6 siguientes significan "fecha de nacimiento" y las 14 siguientes "dirección", comenzando de nuevo con la siguiente persona.
Probablemente Ud. esta empezando a comprender el infierno que se desatará cuando alguien trate de "extender" los años a 4 números. Para inserir 2 lugares a mas en cada registro los vecinos tendran que "correrse" un poco hacia la derecha, y esto podría significar re-escribir totalmente los (millares) de ficheros, algunos de los cuales conteniendo hasta centenas de millones de registros. Cuando uno piensa que la mayor parte de los programadores que crearon todo esto estan actualmente jubilados el problema crece a niveles de pesadilla.

Y por que no dejar las cosas como están?, seria suficiente con enseñar a los ordenadores que ahora "00" significa "2000", que "01" significa "2001" etc. hasta "50" significando "2050", y enseñando tambien que todos los números arriba del 50 significan "1900", asi "51" significa "1951" o "99" significa "1999" etc.
Esta *podría* ser una idea excelente o *podría* ser un verdadero desastre, dependiendo del tipo de aplicación que Ud. ejecuta. Suponga que Ud. necesita un listado ordenado por fechas. Para esto los programadores reorganizan las fechas como "aa/mm/dd" (año/mes/dia) por que el año es más importante que el mes para ordenar, el mes más importante que el día, el dia que la hora... etc. Si Ud. mantiene los registros intocados, el ordenador pensará que "01/01/01" viene antes que "51/01/01", pero no habia dicho Ud. que "51" era "1951" y "01" era "2001"?. Ok, Ud. podría enseñar a los ordenadores una nueva forma de ordenar fechas... o talvez hacer un proceso intermedio para ordenarlas correctamente, pero si Ud. tiene ya 1000 procesos de ordenación funcionando entonces necesitará de 1000 intermediarios hasta el dia 31 de Diciembre de 1999... y asi la pesadilla se arrastra en su empresa.

Se pueden pensar en algunos "niveles de dificultad" para resolver el problema del Bug del Milenio. Primero está el nivel "facil", luego el nivel "pesadilla". Estos dos niveles existen por que existen muchos sistemas que NO están programados en el viejo COBOL (o algún otro tipo de lenguaje duro como el RPG o mismo assembler). Estos nuevos lenguajes son los dBase compatibles, algunas versiones de Pascal y C y qualquier otro lenguaje propietario que venga dentro de un SGBD (Sistema Gerenciador de Banco de Datos) como Clarion, Oracle, Acess, Dataflex etc., incluyendo aqui las nuevas versiones de COBOL. Estos lenguajes nuevos guardan las fechas en una forma mucho mas eficiente que los viejos programas COBOL, cortando los dos números del año (cuando deseado) apenas para mostrarlos de una forma mas fácil, pero internamente guardando las fechas completas con todos los 4 digitos para el año. Esto significa que los nuevos lenguajes guardan las fechas en un formato propio (y eficiente), no permitiendo que lo programadores decidan si ponen o no dos digitos en el año. Estos lenguajes tambien cuidan de todas las tareas concernientes a fechas, como los año bisiestos, cual dia de la semana cae en determinada fecha, y cuando dadas dos fechas calculan exactamente la cantidad de dias que hay entre las mismas.
Estas operaciones son muy importantes para la comunidad financiera (bancos, bolsas, seguros, financieras...) por que las tasas de interés, lucros, perdidas y todo tipo de geringonza están calculados dia a dia con mucha precisión. Apenas un dia mal colocado representa un tremendo dolor de cabeza para estas organizaciones.

Simplificando: el nivel facil es cuando los profesionales solo necesitan cambiar la forma en que los ordenadores muetran y preguntan las fechas, dejando los ficheros intocados. Normalmente las fechas aparecen en los listados y pantallas como "dd/mm/aa" para ahorrar espacio. Esta es la forma en que las máquinas preguntan y muestran las fechas, entonces para modificarlos Ud. tendría que programarlas para que las muestren en la forma de "dd/mm/aaaa".
Si su empresa tiene algunos millares de programas que deben ser cambiados (para mostrar AAAA en lugar de AA) por causa del Bug del Milenio, mismo así esta es la parte facil de la tarea, pues Ud. puede imaginar que cuando alguien modifica la estructura de un fichero TODOS los programas que están relacionados con este fichero DEBERÁN ser alterados también, mismo aquellos que nada tienen que ver con el problema.
Suponga en el ejemplo anterior que Ud. tiene UN programa que lee las fechas de nacimiento y MIL programas que NO leen la fecha de nacimiento y apenas el nombre y dirección. Si Ud. modifica el fichero para colocar lugares extras para los años entonces tendrá que modificar también 1001 programas, uno por las fechas y 1000 para colocar dentro la nueva estructura del fichero. Ud. tendrá que alterar, compilar y probar 1001 programas en lugar de apenas uno.
Por otro lado, si la fecha esta ya completa dentro del fichero en la forma de "dd/mm/aaaa" entonces Ud. solo necesitará cambiar (y compilar y probar) apenas UN programa, aquel que lida con las fechas.

Muchas soluciones intermedias pueden ser propuestas para cada Centro de Procesamiento de Datos (CPD), y aqui entran los consultores y gurus de todo tipo. Para CPDs que usan los nuevos lenguajes, la solución cae en el nivel "facil", o sea, apenas basta modificar los programas, compilarlos y probarlos nuevamente. Para otros CPD la solución puede venir através de un mixto de procesos.
No todos los lenguajes COBOL son iguales, existen varias empresas que venden compiladores COBOL (algunas ya desaparecidas), existen muchas versiones de COBOL, muchos "adendos", normas ISO, ANSI, excepciones y patrones colocados a intervalos regulares comenzando en los años 60. Su CPD puede estar perdido en algun lugar dentro de este universo rodando un COBOL V7.34 Version ac.8 ANSI X3.23a 1989 para JMB 361 sobre OS/3 o jeroglifico similar.
Muchos compiladores COBOL guardan los números usando solo la mitad derecha de cada octeto (byte) por que cada número del 0 a 9 puede ser representado en su forma binaria usando apenas 4 bits, entonces para algunos compiladores el almacenamiento de los números siempre ocurre en la forma 0n 0n (hexadecimal), y aquellos 4 bits no utilizados podrían ser usados para indicar que las fechas pertenecen al año 2000 o al año 1900, dejando asi la estructura de los ficheros inalterada en su tamaño.
Si su sistema es uno de "corto plazo" y no necesita de listados ordenados por fecha, puede adoptar la solución de enseñar a las máquinas que las fechas inferiores a 50 significan "2000" y superiores a 50 significan "1900".

Una buena regla para TODOS los sistemas es crear un "ambiente 2000", duplicando todos los programas y ficheros en este ambiente, colocar el reloj del ordenador a las 23:50:00 del 31 de Diciembre de 1999 y ejecutar todas las tareas posibles e imaginables en este ambiente, controlando cuidadosamente lo que sucede en el momento que el reloj cambia al nuevo milenio. Cuando todo parezca estar funcionando bien, retrase nuevamente el reloj a las 23:50:00 del 31 de Diciembre y comience todo nuevamente. Recuerde algunas de las leyes de Murphy relativas a ordenadores: "No existen buenos o malos programas, existen apenas programas bien probados o mal probados" o "si su sistema ha pasado satisfactoriamente en todas las pruebas, entonces no ha sido bien probado". Lo mejor es retrasar el reloj varios dias antes del 2000 y ejecutar el sistema en esos dias.

Y que hay sobre aquellos pequeños microprocesadores que ejecutan programas en assembly para controlar aeropuertos, radares, aeronaves, maquinas de lavar y missiles Tomahawk?. Este es un universo completamente diferente. No existen aqui grandes ficheros ni sistemas, pero creo que continuaré esta novela después.

Si desea leer el Kit de Primeros Socorros para el Bug, tecle aqui.





Si desea saber como lucirán los ordenadores en el próximo milenio le invito a leer El Canto del Cisne"

Eres la persona numero a visitar esta página