Todos los que trabajamos en el mundo tecnológico hemos tenido la oportunidad de escuchar de este libro "Design Patterns".
Para hablar de este libro me viene una anécdota que tuve para la construcción de un mueble para explicar qué son los patrones de diseño ,imaginémonos que nos piden hacer una silla y debido a que no tenemos experiencia en hacer muebles en madera ,buscamos un experto.
Y este carpintero nos permite que ver todo el proceso de la elaboración de la silla,desde el tipo madera hasta la pintura que debemos escoger.
Y vemos que este carpintero tenía ya en mente una serie de pasos a seguir para la elaboración del mueble , este conocimiento que había acumulado a lo largo del tiempo generalmente se llama experiencia.
Da la casualidad que este carpintero trabajaba para el IKEA en Italia lo que me llamo la atención es que tenia un manual de como armar el mueble pero también me mostró que había otro manual de como construirlo.
El carpintero me mostró una agenda suya donde tenía unos moldes de muebles para cocinas que se ajustaban a las diferentes marcas de cocinas italianas.
Este concepto de tener moldes para una serie de problemas ya antes resueltos se los puede usar en la informática.
Este libro es el resultado de la experiencia de Erich Gamma,Richard Helm,Ralph Johnson y John Vlissides ,ellos han acumulado experiencia en la resolución de problemas en informática y han creado un catálogo de posibles soluciones del mismo modo que la libreta del carpintero del IKEA y los muebles en las cocinas italianas son un catálogo de posibles soluciones.Design patterns son un catálogo de soluciones que Jason MacDonald lo explica muy bien y sería aconsejable darle un vistazo antes de leer el libro de los patrones .
Por ejemplo cada vez que necesito hacer un programa que necesita conectarse a una base de datos y representar en estructuras por ejemplo en Java las tablas de la base de datos ,existe el "Design patterns" Data Access Object Pattern nos puede ayudar.
La mejor manera de aprender a implementar estos patrones en tu proyectos es primero escribirlos y debugarlos para que se entienda la fuerza de cada uno de ellos ,te recomiendo que descargues de este link cada uno de estos patrones y cada uno de estos programas los corras y hagas el debug de cada uno de estos scripts y de ahí vayas al libro a leer la teoría ,he tomado los ejemplos de este sitio web y me ha parecido muy práctico y fácil de usar.
Este es el proyecto en Java en Eclipse con todos los ejemplos :
Según mi experiencia en desarrollo de sistemas y la implementación de "Design patterns" es importante tener en mente algunas consideraciones antes de ponerse a desarrollar, es por esto que escrito esta serie de consejos en el momento de comenzar un proyecto :
1-Antes de pensar como programador piensa como arquitecto y después piensa como un analista funcional ,solo cuando estos tres personajes lleguen a un acuerdo escribe codigo.
2- Un microservicio contiene un algortimo que soluciona un determinado problema pero necesitan tener una serie condiciones que la veremos a continuación :
- Quien va usar los microservicios y que permisos debe tener de lectura/escritura los usuarios que los usan .
- La cantidad de veces que será llamado los microservicios y la posibilidad de que sea llamado al mismo momento por tantos usuarios ,es importante al momento de diseñar los microservicios.
- Los mensajes de error deben tener un log que debe ser fácilmente leído para entender problemas del funcionamiento del sistema.
- Isolar las actividades para la gestión de acceso a diversos microservicios compartidos es importante ,el concepto de multi hilos debe ser claro dónde aplicarlo en los procesos del sistema , y si deben ser asíncronos.
- Cada una de las actividades dentro un proceso de un microservicios deben considerar el concepto de transacciones para evitar problemas de inconsistencias de datos.
3-Cada uno de estos microservicios deben ser parte de procesos que sean identificables y deben estar al interno de una estructura que permita una fácil administración a los programadores en el momento de realizar cambios en los microservicios.
4. Se debe tener en cuenta que los sistemas tienen una larga duración y los programadores se van de las empresas y la documentación no basta para que los nuevos programadores se integren rápidamente al proyecto.
Es por eso que la estructura de los sistemas deben hablar por si mismo,dicho de otro modo, la arquitectura del sistema debe ayudar a la curva de aprendizaje y design patterns ayudan a lograr este objetivo.
Por ejemplo en una ocasión me toco modificar un sistema que gran parte del sistema estaba hecho en javascript con un framework que impedía realizar un debug y la parte backend estaba en java pero tenia sentencias reducidas booleanas pero el momento de realizar cambios era difícil debido a que las reglas del negocio no estaba separada de la implementación .
En este proyecto para realizar un tarea de bug/fixes requería mucho tiempo de desarrollo ,es otro error arquitectural por que la parte funcional era muy dinámica y solicitaba tantas modificas en el sistema.
5- Podemos verlo en modo jerárquico el diseño de sistemas , una mega estructura contiene procesos y al interno de estos procesos existen microservicios.
Muchas empresas trabajan con frameworks como Spring delegando gran parte del trabajo a estos frameworks que al interno de ellos se encuentran implementados Design patterns,pero debemos tener mucho cuidado que no todo los sistemas se resuelven con frameworks por ejemplo en una ocasión en una empresa me toco modificar un scheduler hecho en Spring boot ,este programa lo unico que hacia era crear un archivo de texto fruto de una query.
Aquí claramente hacer en un Servlets en lugar de usar Spring boot hubiera sido una solución más óptima ,esto es un ejemplo de que los tres personajes no se reunieron hablar (programador,arquitecto y analista funcional) ,debe quedar claro que la implementación de los microservicios creará una estructura ,donde se deben usar "Design patterns" para que la estructura final permita comunicar fácilmente a los objetos que se encuentran al interno de los microservicios y la evolución del negocio se adapte a la arquitectura .
Este proceso de adaptación es lo que nos brinda los "Design patterns", el problema es que no es fácil su implementación ,de este duro trabajo se encargan los frameworks pero en algunas ocasiones son cajas negras que te quitan control total a tu proyecto y es aquí el gran dilema en el momento de desarrollar un sistema,velocidad de desarrollo VS control del proyecto .
Te aconsejo que para entender el concepto de microservicio reactivos pueden dar un vistazo al libro.
"Building Reactive Microservices in Java Asynchronous and Event-Based
Application Design Clement Clement Escoffier" y este link te dará una idea general
Dale un vistazo a este artículo para entender que es un Reactive MicroServices ,https://www.arquitecturajava.com/reactive-microservices-y-arquitectura/
A lo largo de este texto usaremos el concepto de Framework y he tomado un texto de IBM para definir algunos conceptos en Java ,
"Un Framework es un marco de patrones de diseño para la rápida implementación de aplicaciones Java. El se basa en un patrón de diseño de mensajería que se utiliza para implementar muchos patrones de diseño bien conocidos, además de las capacidades SOA y ESB."
Antes de entrar en el detalle es bueno tener una panorámica general de lo que veremos aconsejo buscar este libro.
"Modern Java EE Design Patterns Building Scalable Architecture for Sustainable Enterprise Development -Markus Eisele"
https://dzone.com/refcardz/design-patterns?chapter=1

