From 6e89d5a8f568ba79420da75c169d589a2428b040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20P=C3=A9rez?= Date: Fri, 10 Oct 2025 04:53:27 +0200 Subject: [PATCH] update readme --- README.md | 65 ++++++++++++++++++++++++++++++++---- assets/app-architecture.jpg | Bin 0 -> 42059 bytes 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 assets/app-architecture.jpg diff --git a/README.md b/README.md index 9c2a9b0..c57463e 100644 --- a/README.md +++ b/README.md @@ -175,12 +175,6 @@ he optado por no incorporarlas. Las pruebas más interesantes son las de reglas de negocio y validación, lo que viene a ser los servicios y dominio. -## LLMS - -He usado Claude para la toma de decisiones y ayuda con el _boilerplate_, que no -es poca cosa, además también se ha usado para la generación de las pruebas -unitarias, además de resolución de algunos problemas complejos. - ## Generadores y otras librerías Existen generadores de código para Golang, de hecho, se fomenta su desarrollo, @@ -210,4 +204,61 @@ sí, pero la prueba no consiste en eso. También se ha planteado incorporar la librería _testify_, descartado porque para comprobar si existe el error y algunas comparaciones no era necesario meter una -dependencia más. \ No newline at end of file +dependencia más. + +## Diagrama + +![diagrama app](./assets/app-architecture.jpg) + +El diagrama explica básicamente la estrucutra del proyecto en términos generales, +se demuestra que el dominio sensors solo se comunica al exterior mediante el +NATS y el _logger_. + +Amarillo: exterior. +Morado: infraestructura. +Verde: dominio +Blanco: simulador, los _handlers_ está conectado sólo para llamar a la +gorutina, pero en la realidad debería ir independiente. + +## Conclusión y cierre + +Interesante reto donde realmente lo que más me ha costado son la realización +de pruebas unitarias, hay veces que me cuesta coger el concepto. Tengo la teoría +muy clara, pero a la hora de la verdad se me complica un poco las cosas. Además +que _mockear_ el sistema de mensajería debe tener su especial complejidad. +También ha sido algo complejo entender la concurrencia y los canales, no es algo +que haya trabajado en profundidad pero sí que se le ha puesto bastante empeño, +cariño y nivel de detalle. + +He puesto mucho en valor la arquitectura limpia con un toque personal, no es DDD +puro ya que hay elementos que no deberían estar en dominio, pero en el proyecto +que estoy trabajando ahora mismo se está diseñando de la misma manera y está +funcionando muy bien. + +También se ha evitado todo lo posible el uso de LLMs para la generación de +código, y su uso ha sido para la toma de decisiones arquitectónicas, discusión y +lectura rápida sobre los distintos funcionamientos de algunas librerías. En más +de una ocasión he cuestionado las respuestas que da, teniendo que verificar con +la documentación oficial. Pongo en valor mi capacidad para aprovechar la IA de +la mejor forma posible, verificando la información, además recalco que justo el +proyecto actual es una migración de un código en PHP completamente hecho con IA, +y se puede ver patrones y errores comunes que comete. + +Soy consciente de que hay margen de mejora, por ejemplo con los tests o con la +documentación, se ha puesto especial esfuerzo y atención a que los nombres de +las funciones, variables, métodos, estructuras y paquetes sean lo más +autodescriptivos posibles. Se han puesto algunos comentarios. También hay +esfuerzo por permitir ejecutar el proyecto por primera vez con la mínima +intervención. + +Un problema interesante que tuve que resolver, que como el sensor puede mandar +un valor ausente, el tipo `float64` al hacer el `unmarshal` se establece a 0.0, +con lo que se puede considerar válido, con lo cual su solución fue el uso de +puntero, si se descubre que es `nil` se considera no válido. + +Digamos que este proyecto resuelve el problema que se propone, un sistema que +permite registrar y actualziar un sensor. Se puede ver su estado y los datos que +se recogen (simulados) se guardan en una base de datos. + +Espero que el proyecto sea de vuestro agrado y podamos tener una siguiente +reunión. \ No newline at end of file diff --git a/assets/app-architecture.jpg b/assets/app-architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d705c543e3f463244068bc569e7aa1a65c10b6ed GIT binary patch literal 42059 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