Esta es la segunda «hoja de ruta» para seguir creciendo como programador de videojuegos. En la anterior trazamos un plan para alguien que entrar en el mundo de los videojuegos pero apenas acaba de empezar.
En esta guía de hoy vamos a ver el siguiente nivel, ya tengo una buena base y quiero seguir mejoran. Si el nivel anterior lo consideraba previo al junior, este nivel sería el de junior.
Aunque soy un poco escéptico a llamarlo junior ya que es bastante difícil de medir y cada uno tiene sus ideas de que es un junior, pero para que nos hagamos una idea. Además los conocimientos que vamos a ver nos ayudarían a pasar de junior a senior.
Introducción
En la hoja de ruta inicial, propuse que escogieras un lenguaje y alcanzaras un nivel interesante con ese lenguaje, que aprendieras estructuras de datos y toda la base, y te propuse C++ y C#.
Si escogiste C++ entiendo que te gusta tener el control total, gestionar la memoria, ir a los detalles de optimización, en general te gusta el bajo nivel.
Si por otro lado te decantaste por C#, lo que vamos a ir es más al alto nivel, priorizando la feature en sí por encima de que sea súper optima, y buscando un código flexible.
No me mal interpretéis, no digo que una sea mejor que la otra, ni que sean incompatibles, de hecho considero que son 2 caras de la misma moneda.
El programador «perfecto» sabe de bajo nivel, gestión de memoria, optimización, y también sabe del alto nivel, principios SOLID, un código escalable, patrones, etc.
Lo que lo convierte en un programador «perfecto», o equilibrado, es que sabe unir estos 2 mundos y sabe cuándo tiene que priorizar el rendimiento por encima de todo, y cuando tiene que priorizar un código mantenible y tal vez menos óptimo.
Pero como dije en la guía anterior, nos tenemos que especializar y después abriremos el abanico, no intentemos abarcarlo todo desde el inicio porque encontraremos muchas más paredes que tirar abajo.
Por ejemplo, si haces orientación a datos (DoD), lo que sería bajo nivel, esto va a chocar directamente con los principios SOLID, que son de programación orientada a objetos (OOP) y no a datos.
Alto nivel y C#
Partimos de que tenemos una buena base del lenguaje y de estructuras de datos. Si crees que aún no tienes ese nivel de C# y estructuras de datos, te aconsejo que primero te centres en la base.
Intenta implementar una versión de todas las estructuras por ti mismo (con ayuda de Internet), esto es lo que realmente te dará el conocimiento de cómo funciona cada estructura y sus costes.
Aunque vayamos al alto nivel, si sabemos que vamos a hacer búsquedas por ID, y no vamos a hacer recorridos, no utilizaremos una lista, priorizaremos un Diccionario o un HashSet, ir a alto nivel no significa olvidar lo básico ni que nos de igual el rendimiento.
Dato que no vamos a entrar en gestión de memoria, ni en los detalles de esto es más óptimo que esto otro, vamos a priorizar el diseño de código, el diseño de nuestros sistemas. Buscamos un sistema que sea mantenible y que no nos cueste la vida hacer modificaciones.
Principios SOLID
Si eres habitual del canal de YouTube ya sabrás que me encantan los principios SOLID y que tenemos un curso de SOLID y Clean Code para videojuegos. Pero hoy no estoy aquí para venderte el curso, lo que quiero que entiendas es SOLID y sus beneficios.
Los principios SOLID son 5 normas, 5 reglas, que fueron desarrolladas para ayudarnos a estructurar nuestro proyecto para que sea mantenible en el tiempo.
Tenemos el principio de Responsabilidad Única (SRP), que nos ayuda a que cada clase, o módulo, solo tenga una responsabilidad, nada de managers haciéndolo todo.
El principio de Open-Close (OCP), nos ayuda a que podamos ampliar el sistema sin tener que modificar nada del código existente.
El principio de Sustitución de Liskov (LSP) nos habla de la herencia y de los problemas de diseño de una mala herencia. Ojo, hablamos de diseño, no de rendimiento.
El siguiente principio es el de Segregación de Interfaces (ISP), este principio defiende que el consumidor de una interfaz solo debería de depender de los métodos que va a utilizar, y deberíamos dividir/segregar la interfaz.
Y el último es la Inversión de Dependencias (DIP), es mejor depender de interfaces y clases abstractas que de clases concretas para tener toda la flexibilidad y no sufrir cuando queramos cambiar 4 cosas.
Sobre los principios SOLID puedes encontrar mucho material por Internet, y aquí en el blog también tenemos varios artículos. Si prefieres el formato libro, no conozco ninguno que sea 100% de SOLID, pero si hay 2 que he leído que le dedican varios capítulos:
Si buscas algo más guiado y práctico, en la web también tenemos el curso de SOLID, y las primeras lecciones las puedes hacer gratis para que realmente veas si te interesa o no.
Los principios SOLID nos van a dar unas reglas, pero no nos van a decir cómo aplicarlas exactamente, esto ya es cosa de nuestra interpretación y de ponerlas en práctica.
Yo te aconsejo que cuando vayas a desarrollar tengas un resumen de estos principios, o los puntos clave, y mientras estes diseñando te plantees si los estás respetando. Practicando es como conseguirás dominarlo.
En la web tenemos un ebook gratuito de introducción/resumen a los principios SOLID que te puede ayudar, lo puedes descargar aquí.
Patrones de diseño
Lo siguiente serían los patrones de diseño. Estos patrones no son otra cosa que una serie de problemas que se repetían y decidimos darles una solución estandarizada, es la misma solución en todo el mundo.
Esto nos aportará que antes de escribir una sola línea, ya conocemos las implicaciones de esa solución, sabemos sus ventajas y sus desventajas, además de todas las clases implicadas.
Otro punto a favor de los patrones, es que muchos de ellos nos ayudan a cumplir con SOLID, aunque alguno también puede entrar en conflicto, aquí ya entra la pericia del programador y saber que priorizar en cada momento.
Para aprender sobre patrones, yo siempre recomiendo el libro de Erich GAMMA, el conocido como Gang of Four. Tanto su edición en español como su edición en inglés, están súper bien, lo explica a la perfección y tiene un montón de ejemplos.
Hay otro libro dedicado a patrones de diseño para videojuegos, este libro repasa algunos del libro de GAMMA y aporta otros nuevos más concretos para videojuegos, pero yo te recomiendo empezar por el de GAMMA.
El de videojuegos si que tiene algunos patrones que necesitas conocer y son muy útiles, pero otros son más difíciles de que los apliques en tu día a día como desarrollador, son cosas muy especificas. Pero también hay que conocerlos.
Siguiendo con los patrones, en la web tenemos una sección dedicada a esta materia, la encontrarás aquí.
También contamos con un curso donde aplicamos algunos de los patrones más utilizados para hacer un juego desde 0, lo encontrarás aquí. Además puedes realizar las primeras lecciones de forma gratuita.
Otras recomendaciones
No podía terminar este post sin recomendarte el libro de Clean Code, ya lo hice en la guía anterior, pero para mí es esencial tener un buen código que se pueda leer como un libro, esto pa a repercutir directamente sobre la mantenibilidad del proyecto y nuestra productividad.
La última recomendación que te quiero dar es que le des caña a Unity, no solo aprendas estas cosas por individual, intenta hacer pequeños proyectos donde puedas aplicar estos patrones, SOLID y clean code, así es como lo vas a interiorizar.
No vale simplemente con leer, o ver un vídeo sobre un patrón, si no lo practicas en un proyecto, lo olvidarás.
Conclusiones
Hemos visto material de sobra para varios meses, y seguramente tardes años de práctica en interiorizarlo todo. Lo que buscamos no es saberlo de memoria, estamos buscando que cuando vayamos a solventar un problema tengamos un «runrun» en el pensamiento que nos diga: «estoy hay un patrón que me ayuda a solucionarlo».
O, «si lo resuelvo de esta forma, estaré respetando Open-Close y lo podré ampliar sin modificar nada».
Ese tipo de pensamientos solo los conseguiremos practicando, por eso digo que no es una cuestión de unos meses de trabajo y ya está, aunque obviamente tenemos que estudiarlo.
Así que no te rindas, esto es una carrera de largo plazo, de resistencia, de ir asimilando conocimiento y construyendo sobre este, no tengas prisa y asienta los cimientos.
Si en este proceso te surge cualquier duda, ya sabes que tenemos un servidor de Discord donde compartimos dudas, inquietudes, recursos gratuitos y muchas más cosas, si te quieres unir a los más de 200 que ya somos, aquí tienes el enlace de invitación.
Libros mencionados
- Patrones de diseño – Composite
- Devlog #00 – Empezamos proyecto nuevo
- Patrones de diseño – Abstract Factory
- Patrones de diseño – Object Pool
- El monte de la ignorancia
- Patrones de diseño – Singleton y Monostate