Joaquin Alvarado · Lima, Perú

View in English

Ingeniero de Backend y Machine Learning

Estudiante de Ciencias de la Computación en la UPC (8vo ciclo) y practicante de ingeniería de software en Zoluxiones. Construyo servicios que aguantan concurrencia y sistemas de machine learning que reportan la métrica con la que realmente fueron evaluados. Disponible para trabajo remoto.

1,000 req/s throughput pico con p99 de 300 ms, API de validación de apuestas en Rust
1.75M registros de eventos indexados en el sistema de scouting de fútbol
10.26× de throughput al escalar de 15 a 150 workers en Go
0.770 AUC del modelo de mortalidad, contra una referencia aleatoria de 0.500

Ingeniería de Backend

Servicios pensados para concurrencia y corrección bajo carga: manejo atómico de dinero, identidad por tokens y persistencia fuera del camino de la petición.

  1. Validación de apuestas de alta concurrencia en Rust

    Acepta tickets de apuestas en vivo y valida cuotas, verifica saldo y lo debita dentro de un único script Lua de Redis, luego responde al cliente antes de que la escritura llegue a PostgreSQL. La persistencia corre fuera del camino de la petición mediante un consumer group de Redis Streams que reprocesa su lista pendiente al arrancar, así un worker que muere a mitad de lote reprocesa en vez de perder datos. El dinero son centavos i64 de punta a punta — la capa de dominio no tiene aritmética de punto flotante.

    • 1,000 req/s con p99 de 300 ms bajo pruebas de carga con k6
    • Arquitectura hexagonal: el dominio declara puertos como traits y no importa infraestructura
    • Contadores de Prometheus sin labels, así el número de series no puede crecer sin límite
    • Rust
    • Actix-Web
    • Redis Streams
    • PostgreSQL
    • Docker
    • k6
    • Prometheus

    Código fuente ↗

  2. Identidad por tokens con detección de robo de refresh tokens

    Los refresh tokens son opacos, se guardan solo como digests SHA-256 y se agrupan en familias donde cada token es canjeable exactamente una vez. Esa regla de un solo uso convierte el robo en un evento detectable: si un token llega a canjearse dos veces, el servicio revoca la familia entera en vez de adivinar cuál de las dos partes es el atacante. Los access tokens llevan claims jti y ver, así que un JWT vivo puede retirarse antes de que expire.

    • La carrera de rotación se cierra en SQL (UPDATE ... WHERE used_at IS NULL), no en código de aplicación
    • Lista de denegación en Redis por jti, con TTL igual a la vida restante del token
    • RBAC por permisos y endpoint; un incremento de versión retira una cantidad ilimitada de tokens vivos
    • Rust
    • Axum
    • PostgreSQL
    • Redis
    • JWT
    • SHA-256

    Código fuente ↗

  3. Backend en Rust/Axum para un catálogo de generación de leads

    Una plataforma de catálogo para empresas que no venden en línea sino que generan leads mediante cotizaciones. El lado público navega productos con búsqueda, filtros y fichas técnicas en PDF y envía solicitudes de cotización; detrás hay un panel de administración con CRUD completo sobre productos y categorías, carga de archivos y gestión de solicitudes. Los RUC peruanos se validan con el algoritmo de Módulo 11 y no por longitud, así que un RUC inválido se rechaza en el formulario y no aguas abajo.

    • Rust y Axum sobre PostgreSQL, con almacenamiento de archivos compatible con S3
    • Autenticación JWT con hashing de contraseñas mediante Argon2id
    • Frontend en Astro y TypeScript con Nano Stores para el estado compartido
    • Rust
    • Axum
    • PostgreSQL
    • JWT
    • Argon2id
    • Astro
    • TypeScript
    • S3

    Código fuente ↗

Ciencia de Datos

Pipelines sobre datos públicos reales y sucios, evaluados contra un baseline explícito — y marcados como no evaluados donde no existe ground truth etiquetado.

  1. GoalData League

    Destacado

    Recuperación y ranking de fútbol sobre 1.75M de acciones de evento

    Ingesta partidos, plantillas y streams de eventos en un esquema relacional, comprime temporadas-jugador en embeddings PCA y sirve búsqueda de similitud item-item: dada una temporada-jugador, rankea los comparables más cercanos dentro de un pool filtrado por posición. El mismo embedding alimenta una capa de clustering, un grafo de similitud k-NN y un optimizador ILP de once inicial.

    • 94,525 partidos · 1,751,751 acciones de evento · 52,387 temporadas-jugador
    • Recall@10 0.1435 vs 0.0614 del baseline; MRR 0.1788 vs 0.0773; NDCG@10 0.1146 vs 0.0430
    • Leave-one-out sobre 3,670 temporadas-jugador, 1,662 consultas, pool de evaluación idéntico para ambos sistemas
    • Python
    • Polars
    • pandas
    • scikit-learn
    • PCA
    • Parquet
    • Streamlit

    Código fuente ↗ Demo en vivo ↗

  2. Descenso de gradiente distribuido en Go sobre 200,000 registros

    Tres modelos lineales generalizados — uno logístico, dos lineales — entrenados por descenso de gradiente en Go para predecir riesgo de mortalidad, días de supervivencia y costo de tratamiento. El entrenamiento paraleliza de dos formas sobre el mismo código map-reduce: fan-out de goroutines dentro de un nodo y un clúster parameter-server sobre net/rpc entre nodos. Las capas REST, JWT y WebSocket son librería estándar; go.mod declara dos dependencias directas.

    • AUC de mortalidad 0.770 contra una referencia aleatoria de 0.500; accuracy 0.832
    • R² de supervivencia 0.906 (RMSE 199 días) · R² de costo 0.983 (RMSE $1,494)
    • Speedup de 2.95× que satura en 4 workers en una máquina de 4 núcleos, medido en 3 repeticiones
    • Go
    • MongoDB
    • Redis
    • net/rpc
    • Docker

    Código fuente ↗

  3. Resolución de entidades que vincula candidatos con registros públicos de sanciones

    Un pipeline medallion en Polars que consolida candidatos presidenciales y congresales peruanos desde el JNE, el Congreso y portales de transparencia, vincula cada uno con empresas sancionadas por OSCE y calcula un índice de riesgo reproducible servido por una capa de lectura FastAPI sobre Parquet. Los matches determinísticos DNI→RUC y los difusos por nombre se etiquetan por separado en cada fila, así una conjetura no verificable nunca parece un vínculo documentado.

    • Cinco capas: raw → staging → normalized → matched → curated
    • Riesgo financiero sobre mediana + MAD × 1.4826 en vez de media y desviación estándar, porque los bienes declarados están muy sesgados
    • El matcher no tiene ground truth etiquetado — precisión y recall no están medidos, y el repositorio lo declara
    • Python
    • Polars
    • FastAPI
    • Parquet
    • FAISS
    • Docker

    Código fuente ↗

Inteligencia Artificial

Recuperación por embeddings, visión por computadora y pipelines de NLP — con la brecha de evaluación declarada sin rodeos donde el trabajo de precisión aún no está hecho.

  1. Matching estudiante/oferta por embeddings en cuatro servicios

    Los perfiles de estudiantes y las ofertas de empresas se convierten en texto ponderado por campo, se embeben con un sentence-transformer multilingüe, se indexan en Qdrant y se rankean por k-NN coseno. Una capa de swipe de dos lados registra la intención y solo promueve un par a match cuando ambos deslizan a la derecha. La importancia de cada campo se expresa repitiendo términos en el texto de entrada — skills requeridos ×10, área ×8 — porque el encoder no acepta ponderación por campo.

    • Cuatro servicios; 20 tablas relacionales sobre SQLAlchemy async, organizadas como puertos y adaptadores
    • El texto en español se lematiza y se le quitan stop-words con spaCy antes de codificar
    • El recomendador no está evaluado: aún no hay split held-out ni etiquetas de relevancia, y el repositorio lo declara
    • Python
    • FastAPI
    • PostgreSQL
    • Qdrant
    • sentence-transformers
    • spaCy

    Código fuente ↗

  2. Detección de placas, del detector a las apps de campo

    Un detector YOLOv8 entrenado con 2,620 fotos anotadas de placas peruanas, envuelto en un servicio Flask que recorta la placa y le corre OCR. Una app de escritorio en Electron es la estación de inspección y una app móvil en Expo es el cliente de campo; ambas hablan con la misma API HTTP sobre un solo esquema de Supabase.

    • 4,144 cajas sobre 2,433 imágenes de entrenamiento — 1.70 placas por imagen, o sea multi-objeto, no un solo objeto
    • Caja mediana de 504 px², 0.12% del frame: por debajo del umbral de objeto pequeño de COCO, que es lo que determina imgsz
    • El detector no tiene evaluación commiteada — no se afirma ningún mAP, y el repositorio explica por qué

    Repositorio colaborativo — alojado en la cuenta de un compañero de equipo.

    • Python
    • YOLOv8
    • PaddleOCR
    • Flask
    • Supabase
    • Electron
    • React Native

    Código fuente ↗

  3. Asistente de comunicación con pictogramas

    Una aplicación web de comunicación aumentativa que convierte texto en español a pictogramas en tiempo real. Un backend en FastAPI sirve chat por REST y WebSocket, lematiza el texto entrante con spaCy antes de buscar los términos contra el conjunto de pictogramas ARASAAC, y alimenta un constructor de oraciones y un asistente tutor en un cliente React.

    • FastAPI sobre REST y WebSockets; cliente en React y Vite
    • spaCy es_core_news_lg lematiza el español antes de buscar el pictograma, así las formas flexionadas resuelven a un mismo símbolo
    • La clasificación de foto a pictograma figura como condicional en el repositorio — esa parte está incompleta
    • Python
    • FastAPI
    • WebSockets
    • spaCy
    • TensorFlow/Keras
    • React
    • Vite
    • Tailwind CSS

    Código fuente ↗

Hub Central

Sistemas que cruzan más de una capa y más de un lenguaje: un pipeline con el cliente que lo consume, un backend con el modelo y la interfaz encima.

  1. Pipeline concurrente de anonimización de expedientes judiciales

    Un pipeline de worker pool en Go que normaliza y anonimiza el texto de expedientes del Tribunal Constitucional peruano, alimentado por un scraper y una capa de EDA en Python que construyen el corpus. La pregunta que el repositorio responde con mediciones es cómo escala un pool de goroutines alimentado por canales de 15 a 150 workers.

    • 149,387 expedientes de origen; el pipeline escala a un corpus combinado de aproximadamente 1.4M de filas
    • 10.26× de throughput al pasar de 15 a 150 workers, medido en 1,100 corridas cronometradas commiteadas al repo
    • La eficiencia por encima del 100% es un artefacto de un costo por registro simulado, no trabajo real de CPU — declarado como limitación
    • Go
    • Python
    • pandas
    • semantic search

    Código fuente ↗

  2. Ingesta de CVs, entrevista simulada con IA y ranking automatizado

    Una plataforma para reclutadores que almacena CVs, extrae información estructurada de los PDFs, corre una entrevista simulada con un asistente conversacional y produce un ranking automatizado de candidatos por oferta laboral. Backend en FastAPI con cliente en React y TypeScript.

    • En etapa de prototipo: la persistencia es una caché en memoria, no una base de datos
    • El scoring combina desempeño en la entrevista con ajuste a la oferta
    • Python
    • FastAPI
    • React
    • TypeScript
    • Tailwind CSS
    • PDF extraction

    Código fuente ↗

  3. Plataforma de tutorías académicas en Java + Spring Boot

    Un marketplace de tutorías que cubre registro, disponibilidad de tutores, reserva de sesiones, pagos simulados, enlaces de sesión y reseñas. Backend REST en Java/Spring Boot contra un esquema relacional, con cliente en React y TypeScript; el repositorio incluye el modelo UML, el diagrama de base de datos y el backlog completo entregado.

    • 16 historias de usuario entregadas de punta a punta
    • Alrededor del 90% de los endpoints de la API los construí yo
    • Esquema relacional y diagramas UML commiteados junto al código

    Desarrollador en un equipo universitario de cinco personas; construí alrededor del 90% de los endpoints de la API.

    • Java
    • Spring Boot
    • React
    • TypeScript
    • SQL

    Código fuente ↗

Experiencia

Donde el trabajo fue pagado, llegó a usuarios reales, o ambas.

  1. Zoluxiones

    Practicante de Ingeniería de Software · consultora de TI · rol actual

    Practicante de ingeniería de software en una consultora de TI, trabajando en plataforma interna y automatización. Los entregables de cliente y los productos internos son confidenciales y deliberadamente no se describen aquí.

    • Rol actual
    • Trabajo de backend y automatización bajo confidencialidad
    • Python
    • TypeScript
    • PostgreSQL
    • Docker
    • CI/CD

    La empresa en LinkedIn ↗

  2. Cofundador · marketplace de matching de CVs con usuarios reales

    Cofundé una plataforma que conecta estudiantes universitarios con retos reales publicados por empresas, y la llevamos a usuarios reales. El backend es dueño del dominio relacional — estudiantes, empresas, ofertas, skills, matches y acuerdos — sobre SQLAlchemy async y PostgreSQL, y delega el ranking de candidatos a un servicio de IA aparte por HTTP.

    • 15 entidades de dominio y 8 casos de uso detrás de interfaces de puerto explícitas
    • 8 endpoints HTTP; FastAPI confinado al adaptador de entrada
    • Sin tests automatizados y sin etapa de test en CI — declarado en el repositorio
    • Python
    • FastAPI
    • SQLAlchemy
    • PostgreSQL
    • JWT
    • gunicorn
    • Azure

    La empresa en LinkedIn ↗ Código fuente ↗

  3. Kreante

    Practicante de Desarrollo No-Code · entrega de MVPs en Bubble

    Construí MVPs funcionales en Bubble para que las ideas de los clientes pudieran validarse con usuarios antes de comprometer presupuesto de ingeniería.

    • Entrega no-code en Bubble
    • Bubble
    • No-code

    La empresa en LinkedIn ↗