Compare commits

...

3 Commits

Author SHA1 Message Date
pedro d1b6e5523c update readme again 2025-10-31 13:59:15 +01:00
pedro f3c4b38009 update readme 2025-10-31 13:58:44 +01:00
pedro 1feb45539e update readme 2025-10-31 00:53:11 +01:00
+83 -8
View File
@@ -2,7 +2,13 @@
Prueba técnica para el puesto de desarrollador Go/C++
## Comandos útiles
## Requisitos previos
- Docker
- Go
- Make, si prefieres usar la comodidad de Makefile
## Rutas disponibles
Compilar todos los servicios e iniciar los contenedores Docker.
@@ -13,16 +19,85 @@ docker compose --env-file <path/to/file> up --build`
Hacer petición POST con fichero a `/ingest/csv`
```bash
curl -X POST http://localhost:8080/ingest/csv -F "file=@meteo.csv"
curl -X POST "http://<host>/ingest/csv" -F "file=@<file>.csv"
curl -X POST "http://localhost:8080/ingest/csv" -F "file@meteo.csv"
```
## Decisiones técnica
Hacer petición GET a `/cities` para listar las ciudades
1. Hablar sobre la función normalize, repetición de parse float. Justificar que se puede haber extraído a una función, pero ambas opciones son válidas (YAGNI)
```bash
curl "http://<host>/cities"
2. Hablar sobre las sobreabstracciones que se hacen en el código. Hay que busca un punto de equlibrio entre abstraer o ser explícito.
curl "http://localhost:8080/cities"
```
## Entorno desarrollo
Hacer petición GET a `/data` para obtener datos en crudo
Linux Fedora 41 6.16.11-200.fc42.x86_64
Go 1.25.2
```bash
curl "http://<host>/data?city=<city>&from=<yyyy-mm-dd>&to=<yyyy-mm-dd>&page=<n>&limit=<n>"
curl "http://localhost:8080/data?city=Madrid&from=2025-01-01&to=2025-12-31&page=3&limit=2"
```
Hacer petición GET a `/weather/{city}`
```bash
curl "http://<host>/weather/<city>?date=<yyyy-mm-dd>&days=<1-10>&unit=<C | F>&agg=<daily | rolling>"
curl "http://localhost:8090/weather/madrid?date=2025-11-02&days=10&unit=F&agg=rolling"
```
## Requisitos cubiertos
### Servicio A
- [x] Base de datos
- [x] Endpoint POST /ingest/csv
- [x] Listar ciudades en base de datos
- [x] Mostrar registros en crudo
- [ ] Especificación OpenAPI
### Servicio B
- [ ] Especificación OpenAPI
- [x] Endpoint GET /weather/{city} + parámetros
- [x] Conversión entre Celsius y Fahrenheit
- [ ] Caché
- [x] Tolerancia a fallos
## Consideraciones
Hay partes de códigos que son _snippets_ extraídos de una librería de autoría
propia. [Repositorio GitHub](https://github.com/zepyrshut/gopher-toolbox). De
las cuales son:
- La conexión con la base de datos, usando el controlador [pgx](https://github.com/jackc/pgx).
- La carga de variables de entorno mediante fichero.
- La migración de base de datos.
## Diseño y arquitectura
Recientemente hice otra prueba técnica para el mismo puesto y mismo lenguaje
distintas tecnologías, en ese caso era para trabajar con mensajería NATS,
puedes ver más información en el [repositorio](https://git.pedroperez.dev/pedro/nats-app).
Cuyo proyecto integra un sistema de caché muy primitivo, sin embargo en este
se hace uso de _Ristretto_.
La estructuración del proyecto es la misma, basada en dominios pero con
ligeras modificaciones, no es DDD puro. Para evitar el abuso de la creación de
paquetes en un mismo dominio (complejidad innecesaria y exceso de directorios),
agrupo todas las partes implicadas (_handlers_, _repos_, _models_, _services_)
en un directorio por dominio.
El directorio _pkg_ contiene todo el código común a los dos servicios como
la carga de variables de entorno, errores de dominio, conversiones de tipos,
etc.
## IA Generativa
Es evidente que con el uso de la IA, el código se hace mucho más rápido pero
para la prueba como demostración de mis habilidades se ha usado lo mínimo
posible, centrando en el diseño y arquitectura que la generación de código
en sí. Se ha usado Claude para la generación de código y Grok para la discusión
y debate de diseño.