Tres en Raya

Hace algún tiempo me entretenía un poco haciendo algún currículum vitae un poco curioso, que se saliera del tedio habitual que son la mayoría de currículos. En uno de ellos escondí una simulación de algunas partes de la película Juegos de Guerra. Inevitablemente eso implicaba incluir un juego de Tres en Raya completo.

Ejercicios de Programación

Hoy en día, por lo menos en ciertos entornos o situaciones, es relativamente común que los desarrolladores de software hagan "ejercicios". En ocasiones, como parte de un proceso de selección. Otras veces como una especie de entretenimiento o como parte de la formación dentro de su empresa. A veces, simplemente por practicar sus habilidades y aprender algún concepto nuevo. También es habitual en algunos de esos "bootcamps" que hay por ahí, tener que desarrollar algunos proyectos más o menos reales.

En muchos casos son ejercicios muy poco interesantes. En general en los procesos de selección todos los ejercicios que piden son muy poco apropiados para poder evaluar a un candidato y lo que consiguen es principalmente hacer perder el tiempo a todos los involucrados. En los cursos para principiantes están más de moda proyectos como el típico Pokedex, una "web de películas" o la enésima "red social de juguete". Es habitual ver muchos ejercicios de contenido: Hay unos datos por ahí y el ejercicio consiste básicamente en manipularlos (p.ej. buscar, clasificar, etc) y presentarlos de alguna forma vistosamente interactiva que seguro que ya han hecho antes otros miles de proyectos.

También hay ejercicios que son muy específicos. Muchas katas de programación, de las que se pueden encontrar en cientos de miles de páginas por ahí, se centran en practicar un detalle -o unos pocos detalles- muy concreto. No lo digo como una crítica, pero sí creo que son más adecuados como una excusa para empezar discusiones y debates que por el propio ejercicio en sí mismo.

El desarrollo de un juego de Tres en Raya, completo o no, también es algo frecuente. Quizá no tanto porque por un lado no tiene el glamur y la vistosidad de otros, y por otro porque es demasiado abierto para debatir sesudamente detalles que a nadie le importan porque son mayormente imaginarios.

A mi, sin embargo, me parece un ejercicio bastante bueno del que desarrolladores de diferentes niveles de experiencia pueden aprender.

El Ejercicio

Se explica de forma sencilla. Asumo, claro, que todo el mundo conoce el juego de Tres en Raya clásico: 3x3 casillas, dos jugadores van marcando su jugada -uno con X otro con O- sobre una casilla libre, gana uno si consigue ocupar una línea completa -fila, columna o diagonal-.

Un juego de Tres en Raya en progreso

El ejercicio es muy abierto. Según el objetivo, podemos centrarnos solo en una parte. Por ejemplo, podemos implementar solo el verificador, la lógica para comprobar si alguien ha ganado o no. Podemos, o no, incluir la creación de una interfaz de usuario como parte del ejercicio. Es opcional también tener que ofrecer la opción de jugar "contra la máquina" y no solo dos jugadores humanos. Queriendo, y dado que cada partida es muy corta, se puede añadir un marcador de partidas ganadas y perdidas o cosas del estilo.

Personalmente esta amplitud de opciones me gusta bastante. Encuentro que permite, por ejemplo, ir añadiendo una dificultad progresiva al ejercicio, y que esto además ayuda para considerar otros asuntos interesantes del desarrollo.

¿Qué podemos aprender del ejercicio?

Me gusta usar este ejercicio sobre todo a la hora de enseñar. Creo que, bien usado, sirve para resaltar muchos detalles del desarrollo de software, y varios de ellos van más allá del código. Lo que aprendamos va a depender de cómo planteemos el ejericio y esto a su vez deberá depender de la experiencia -o falta de ella- de cada persona. Veamos algunas posibilidades y qué se puede extraer de cada una.

Absolutos Principiantes

Como ejercicio básico para principiantes, implementar el juego tiene suficiente variedad general para poder aprender bastantes cosas. Eso sí, para absolutos principiantes es probable que requiera alguna ayuda. Puede ser buena idea ir progresivamente centrándose en cada una de las partes.

Puede implementarse una interfaz de usuario de forma sencilla y a partir de ahí ir "bajando" hacia la implementación del juego. Pero también podemos empezar con algunas partes ya hechas y centrarnos en otras más específicas si lo vemos necesario.

Principiantes con "algo" de base

El ejercicio debería tener una dificultad bastante buena para alguien que tenga ya las bases generales de la programación. La lógica a implementar requiere algo de esfuerzo pero no es complicada.

Se puede plantear hacer el juego completo, con interfaz incluída, pero dejar lo de "jugar contra la máquina" para después.

En general, es un buen ejercicio para aprender temas de orden del código. La separación de las diferentes partes. Construir un modelo del juego que sea independiente de la interfaz. Muchas de las soluciones que se encuentran por ahí fallan en esto y terminan con un batiburrillo en el que la lógica del juego se mezcla con el código de la interfaz de usuario y no hay un orden claro.

También puede ser una buena oportunidad como introducción al uso y diseño de estructuras de datos adecuadas. ¿Cómo se modela el tablero de juego? ¿Con un array lineal de 9 casillas o con una matriz de 3 x 3? Y ¿qué consecuencias tiene esto? En otra buena cantidad de soluciones disponibles por internet, el uso de una u otra opción termina afectando a un montón de partes del código a las que no debería. Demasiadas veces también la elección se hace sin ninguna reflexión.

Personas con un poco de experiencia

Teniendo ya alguna experiencia, el ejercicio puede seguir siendo interesante.

El desarrollo de un jugador autónomo tiene cierto interés, ya que es una aplicación típica de minimax con una dificultad suficientemente baja. Eso sí, personalmente creo que es bastante importante poner la restricción de hacer que el código del jugador sea independiente del resto. Eso es un ejercicio de orden y estructuración del código, algo en lo que muchos desarrolladores con poca experiencia -y no tan poca- suelen fallar bastante.

No sólo eso. Ampliando un poco la idea, podemos incluir el desarrollo de diferentes jugadores autónomos, cada uno con una estrategia distinta. Esto tiene dos objetivos interesantes. Uno, el propio desarrollo de esas estrategias hace pensar en distintas soluciones y ver sus ventajas e inconvenientes. Las estrategias aplicables a Tres en Raya son todas bastante sencillas. Por otra parte, tener varios jugadores autónomos seleccionables trae la necesidad de tener algún modo de gestionarlos y también la de definir y mantener un interfaz entre la gestión del juego y la de los jugadores.

Desarrolladores con experiencia

Para personas con más experiencia, Tres en Raya aún puede proporcionar algún aprendizaje útil.

Lo más inmediato es la realización de un proyecto completo, empezando desde cero y llegando a una aplicación con todas las funcionalidades. Esto a menudo es una dificultad para desarrolladores sin suficiente experiencia. Por dónde empezar, cómo organizarse, etc.

Siguiendo con la idea de los jugadores autónomos, y si tenemos suficiente confianza, una buena idea es añadir la opción de hacer que jueguen unos jugadores contra otros, ellos solos, y usar los resultados para realizar alguna pequeña presentación sobre victorias y estadísticas. Podemos hacer diferentes tipos de pruebas entre ellos.

Senior y Arquitectos

Hay dos aspectos del ejercicio que creo que pueden ser buenos para personas con una experiencia ya asentada.

Uno es simplemente como repaso, como práctica a la hora de probar diferentes aproximaciones, distintas decisiones o estructuras. Por ejemplo, diferentes modos de integrar un jugador humano con el mismo mecanismo que integramos un jugador autónomo.

El segundo es el de aprender a enseñar. Es una tarea muy importante para este grupo de personas saber comunicar requisitos, aprender a ayudar a otros desarrolladores, entender sus dificultades y, a veces, entender que las dificultades son de esa persona pero otras son de la persona que tiene la responsabilidad de guiar. Y no solo en lo que se refiere al código; siempre es un buen ejercicio organizar un evento así. Preparar documentación, presentar y explicar el ejercicio, atender consultas, revisar propuestas y soluciones, etc. Todas estas son tareas que alguien con experiencia necesita saber hacer correctamente.

Grupos

Es posible resolver el ejercicio entre dos personas. Más no suele ser práctico.

Pero también es posible organizar dos o tres parejas y, después de que cada una construya su solución, poner estas en común y comparar y discutir ideas.

Conclusiones

La implementación de un juego de Tres en Raya, en todo o en parte, es un buen ejercicio para practicar muy diferentes cosas.

Y a veces, simplemente es entretenido.