El día 27 de abril de 2011 anuncié la nueva versión de GNU Chess (
http://lists.gnu.org/archive/html/info-gnu/2011-04/msg00015.html), el popular programa de ajedrez del proyecto GNU. Hace tiempo que venía persiguiendo esta publicación y por fin lo he conseguido. Sin la inestimable ayuda de Simon Waters, Stuart Cracraft y Karl Berry, no habría sido posible.
Mi relación con GNU Chess empezó hace ya más de tres años, a principios de 2008, cuando decidí ofrecer mi contribución al proyecto. Se me ocurrió la idea de incorporar una opción para debilitar artificialmente al programa en cuanto que jugador de ajedrez. En aquel primer contacto, sugerí la idea de esta nueva opción, pero también ofrecí mi colaboración en general. Stuart y Simon me comentaron que Fabien Letouzey había asignado la propiedad de su famoso programa de ajedrez Fruit a la Free Software Foundation (FSF) y estaría muy bien utilizarlo como base para una nueva versión de GNU Chess, la versión 6. La última versión de la línea v5, v5.07, se había publicado en 2003, es decir, el proyecto estaba en estado maduro y no manifestaba mucha actividad.
El ajedrez es un juego que me gusta desde niño. Soy un jugador mediocre (mi puntuación en FICS (
http://www.freechess.org) es de unos 1300 puntos Blitz y 1700 Standard), pero me gusta mucho jugar. De pequeño jugaba de vez en cuando con mi abuelo Octavio y quizá me venga de aquello la afición. La oportunidad de contribuir, aunque fuese en pequeña medida, a un programa del proyecto GNU me resultaba muy atractiva porque goza de una enorme difusión. Además, desde hace muchos años utilizo el sistema GNU/Linux y, en cierto sentido, una pequeña contribución me parecía un más que merecido tributo.
Antes de empezar a trabajar en la versión 6 de GNU Chess, me puse en contacto con Richard Stallman para comprobar si había alguien más trabajando en ello y para recibir su consejo. Cuando Stuart me pidió que me comunicase con RMS, que son las iniciales del Sr. Stallman y como se le nombra habitualmente, me impresionó bastante y no me parecía probable que una persona tan importante (fundador de GNU y presidente de la FSF) contestase al mensaje de un desconocido. Sin embargo, a los pocos días RMS me contestó, y me dijo que lo más importante era prestar atención, en primer lugar, a las normas de programación de GNU en lo que se refiere a los interfaces externos y a la documentación; en segundo lugar, al sistema de configuración e instalación (configure y make). No mencionó que hubiera nadie trabajando en ello, lo que interpreté como luz verde para mí. Con la bendición de RMS, podía empezar a trabajar.
Acordé con Simon y Stuart mantener "compatibilidad hacia atrás" con los interfaces externos de la versión 5. Esto significaba mantener la misma línea de comando para arrancar el programa y los mismos comandos. Hay que decir que GNU Chess es un programa que permite a una persona jugar al ajedrez con el ordenador de forma interactiva en un terminal de texto, introduciendo las jugadas en notación algebraica estándar (SAN) o en notación algebraica de coordenadas. El programa muestra el tablero por la pantalla en modo texto. Una variante de los comandos interactivos permite utilizar el programa con una interfaz gráfica de ajedrez como XBoard, que es la forma habitual de utilizarlo. La comunicación de XBoard con GNU Chess originó el Chess Engine Communication Protocol, que luego han utilizado otros programas de ajedrez como sistema de comunicación con el exterior
Por su parte, Fruit no está pensado para que una persona juegue partidas directamente con el programa, sino desde una interfaz gráfica. De hecho, Fruit usa otro protocolo de comunicación, el Universal Chess Interface (UCI), que es muy distinto del que utilizaba GNU Chess. Aquí es donde surgía una de las principales dificultades: integrar el antiguo protocolo de comunicación con el nuevo programa.
En realidad, este problema no era nuevo, pues ya había surgido la necesidad de integrar Fruit con XBoard. El propio Fabien creó un programa adaptador: Polyglot. Así que decidí estudiar este otro programa para realizar mi integración.
Al principio tomé Fruit como base y durante mucho tiempo estuve intentando crear mi propio adaptador, hasta que me di cuenta de que era una cantidad de trabajo nada despreciable. Estuve yendo por caminos erróneos hasta finales de 2009, cuando por fin vi la luz. Por supuesto, durante todo ese tiempo mi dedicación fue muy intermitente.
Empecé 2010 con las decisiones que finalmente demostraron ser las correctas. Debía utilizar Fruit y Polyglot tal y como son y, al mismo tiempo, mantener la versión 5 de GNU Chess como programa principal. Al mantener la versión anterior, los interfaces externos se mantenían por construcción. Lo que tenía que hacer era "puentear" toda la parte del programa antiguo que no tuviera que ver con la interacción con el exterior: las jugadas y los comandos introducidos por el usuario debían pasarse a Fruit, a través de Polyglot.
Esta integración la acometí en dos fases. En la primera, mantuve las tres piezas como procesos independientes. De este modo, Polyglot y Fruit se mantenían intactos. Sólo tenía que modificar el programa principal. De aquí surgió ya el diseño de la arquitectura final del programa, estructurado en tres componentes: módulo de interfaz con el exterior, adaptador de protocolo y motor de ajedrez. A principios de 2010 tenía una primera versión de las tres piezas integradas. Por entonces sólo las jugadas y algunos pocos comandos de la versión anterior funcionaban. El siguiente paso era ir avanzando en la migración de comandos de la versión 5 a la 6.
Una vez que ya funcionaban los comandos principales, pasé a la segunda fase de la integración: convertir los procesos independientes en hilos de ejecución (
threads) de un proceso único. Mantuve el mismo mecanismo de comunicación basado en tuberías (
pipes). Fabien creó Polyglot a partir de Fruit, pero no mantuvo una base de código única. Por esta razón, una gran parte del código de ambos programas es muy parecida. No obstante su gran parecido debido al origen común, el código no es idéntico, lo cual no permitía unificarlo de forma sencilla. Por lo tanto, la decisión fue mantener ambas bases de código intactas. Para evitar la colisión masiva de identificadores a la hora de enlazar los módulos, definí un espacio de nombres (
namespace de C++) distinto para cada uno de los dos. El módulo de interfaz, escrito en C, lo mantuve en el espacio de nombres global.
En noviembre de 2010 ya estaba terminada la integración y sólo quedaba por incorporar el mayor número de comandos que fuese posible. Simon siempre ha insistido, con razón, en el gran interés que tiene mantener los comandos de la versión 5, ya que permitiría a un usuario de dicha versión reemplazarla por la nueva versión 6 sin enterarse.
Karl me ayudó a utilizar los programas de construcción de GNU para empaquetar el programa según los estándares y ha sido un mentor accesible, didáctico y profesional en todo momento. A finales de 2010 realicé los trámites para asignar a la FSF todas mis contribuciones a GNU Chess.
Cuando el programa ya iba tomando forma definitiva, Stuart propuso evaluar su fuerza con una batería de pruebas que consta de 188 posiciones. El resultado en mi Mac Book Pro, empleando 10 segundos por posición, fue de 155 posiciones acertadas, lo que equivale a un ELO aproximado de 2547. Stuart se mostró entusiasmado cuando él mismo comprobó los resultados en su Mac, un día que volvía de visitar a Ken en Apple, y se los comunicó a las personas más señaladas en la historia de GNU Chess. Hay que entender que era una buena noticia el hecho de haber conseguido utilizar Fruit como base para GNU Chess. La fuerza de Fruit como motor de ajedrez era de sobra conocida, y su mérito le corresponde enteramente a Fabien.
La versión de Fruit que se ha utilizado como base para GNU Chess v6 es la 2.1, la última licenciada bajo GPL. Posteriormente, Fruit siguió evolucionando y aumentando considerablemente su fuerza ajedrecística, pero las siguientes versiones ya no fueron libres.
En la Navidad de 2010 teníamos una versión alfa del programa, que inscribí en FICS como GNUChessSix, a fin de poner a prueba su funcionamiento a través de XBoard en un "entorno real". Desde entonces, juega partidas de vez en cuando desde mi Mac.
El 26 de enero de 2011, publicamos la versión alfa 5.9.91. Con los comentarios recibidos y algunas otras mejoras, entre las que cabe destacar la creación de un manual "info" para toda la documentación del programa, por fin publicamos y anunciamos convenientemente la versión 6.0.0 el día 27 de abril de 2011, la primera versión oficial de GNU Chess v6. Tres años después, mi sueño de participar en el proyecto había llegado más lejos de lo que imaginara.
En febrero de 2011, Karl me comunicó que Simon y Stuart me admitían de buen grado como
co-maintainer del paquete, lo cual acogí con gran alegría y acepté inmediatamente. Era lo lógico, después de todo, pues el trabajo de preparación de la versión 6, aun siendo muy modesto, ha sido fundamentalmente trabajo mío, por lo que soy la persona indicada para encargarse del mantenimiento de esta nueva versión.
Hace tiempo que existen programas de ajedrez que, en
hardware básico tienen nivel suficiente para ganar al campeón del mundo humano. Por esta razón, las máquinas de jugar al ajedrez no tienen tanto interés como en los tiempos de Deep Blue. Sin embargo, considero interesante que el sistema GNU siga disponiendo de un programa de ajedrez actualizado y a disposición de todos. La FSF garantiza que el programa siempre será libre.
Para mí es un orgullo ser miembro del equipo de GNU Chess y, a través de él, del propio proyecto GNU. Este granito de arena unido a otros muchos hace que programas como este de ajedrez estén a disposición de todo el mundo, no sólo para utilizarlos, sino también para estudiar cómo están hechos, modificarlos y mejorarlos. A mi modo de ver, la presencia y difusión de proyectos no lucrativos hace que el mundo sea un poco más humano.