Disponible para trabajo remotoDisponible

JuanMonsalve

>>> Ingeniero en Sistemas e Informática · Software Engineer

Carátula del disco OK Computer, de Radiohead
Ubicación
Bucaramanga, Colombia
Zona horaria
GMT−5
Modalidad
Disponible para trabajo remoto
Idiomas
Español: nativo / Inglés: C1+
88contribuciones en 12 meses
sept 2025en vivosept 2026
16semana más alta

[ Tesis ]

Diseño, construyo y despliego sistemas de backend que llegan a producción y se sostienen ahí: despliegue, respaldos verificados y actualizaciones incluidos. Cuando un modelo de lenguaje forma parte de uno, lo trato como un componente más de la arquitectura, no como la arquitectura entera. Mi trabajo es decidir dónde justifica su latencia y su costo, y dónde conviene un camino determinista más barato.

Proyectos

Tres sistemas que diseñé, construí y desplegué yo. Cada cifra del margen está medida sobre el sistema real, no estimada.

  1. 01

    Apollo

    • Repositorio público
    • 2026

    Asistente de voz en español. 135 ms, sin conexión.

    Un turno completo, del micrófono a la respuesta hablada, tarda 135 milisegundos medidos sobre el equipo de destino. Todo ocurre ahí mismo: sin conexión, sin servicios de terceros y sin que un solo byte de audio salga de la máquina.

    Ese tiempo es consecuencia de una decisión de arquitectura: el modelo de lenguaje no está en la ruta crítica. Las órdenes se resuelven en cuatro etapas de costo creciente y solo las ambiguas llegan al modelo, de modo que lo que gobierna la latencia y el gasto no es la precisión del modelo, sino qué porcentaje de órdenes necesita llegar hasta él. Ese porcentaje se mide en cada versión.

    El control de ejecución va por lista blanca: el modelo elige una intención y sus argumentos dentro de un esquema validado, y nunca genera comandos. El proyecto acumula 307 pruebas automatizadas, y el banco de intenciones se ejecuta entero antes de tocar cualquier umbral.

  2. 02

    EM Torneos

    • En producción
    • 2 repositorios privados
    • 2026

    Una liga entera corriendo sobre esto, todos los días.

    Una liga de fútbol amateur lleva aquí sus torneos, sus cobros y sus nóminas, todos los días y en producción. Veintidós modelos de dominio repartidos entre una API y un cliente de escritorio, ambos con tipado estricto. Empezó como el refactor de un monolito; hoy es un producto que se instala, se actualiza y se mantiene solo.

    La decisión que más cambió el producto no fue técnica sino de dominio. Todo esquema de fútbol modela el partido como local contra visitante, y así estaba construido; pero las ligas amateur alquilan canchas neutrales y ambos equipos viajan al mismo lugar. La distinción no significaba nada y obligaba al administrador a una elección arbitraria en cada partido, así que se eliminó, con su migración de datos.

    El despliegue y la operación también son míos: contenedores en un servidor propio, certificado que se renueva solo, base de datos sin puerto expuesto, respaldos diarios y un script que restaura el último en una base aparte para comprobar que sirven. El cliente se actualiza desde ese mismo servidor sin que el usuario configure nada, y los permisos siguen al oficio: el administrador maneja cuentas y nóminas, el planillero solo ve la caja del día.

    Stack

    • Node
    • Express
    • TypeScript
    • Prisma
    • PostgreSQL
    • Electron
    • React
    • Docker
    • Caddy
  3. 03

    Lead Triage Agent

    • En construcción
    • Repositorio privado por ahora
    • 2026

    Clasifica formularios y mide lo que cuesta cada consulta.

    Servicio que recibe formularios de contacto, descarta con reglas baratas lo que no necesita un modelo y clasifica el resto con la API de Anthropic, validando la respuesta contra un esquema antes de guardarla.

    El objetivo es el control de costos: cada consulta queda registrada con sus tokens y su gasto, y un endpoint reporta qué porcentaje de los formularios llegó a necesitar el modelo. Es el mismo criterio de Apollo aplicado a un servicio que cobra por uso.

    Stack

    • FastAPI
    • Claude API
    • PostgreSQL
    • Slack

Cómo trabajo

Tres decisiones que tomé mal la primera vez y corregí al medirlas. Sirven mejor que cualquier declaración de principios.

  1. 01

    Medir antes de arquitecturar

    Descarté Moonshine para el reconocimiento de voz tras comprobar que no existe modelo en español. Descarté el umbral fijo de similitud tras medir que los casos válidos y los inválidos se solapaban. Ninguna de las dos decisiones se veía venir sobre el papel.

  2. 02

    Ensanchar el contrato en vez de apretar el prompt

    «Sube el volumen al 50» se clasificaba como subir un paso en vez de fijar el nivel, porque los modelos de similitud tratan las cifras casi como ruido. Agregar ejemplos funcionaba y se rompía con la siguiente frase. La solución fue hacer que equivocarse dejara de importar: ambas intenciones aceptan el nivel, y la acción da prioridad al nivel sobre el paso.

  3. 03

    Las fallas deben ser ruidosas

    Construí verificación de locutor para Apollo y la envié desactivada por defecto: al medirla con ruido de fondo empezaba a rechazarme a mí. Una función de seguridad cuyo modo de falla es dejar afuera al único usuario legítimo no es seguridad.

Experiencia y formación

Tres años de trabajo remoto con equipos y clientes de EE.UU., en paralelo a la carrera.

  1. Nov 2025 – Ago 2026

    Team Manager, operaciones y análisis de datos

    WW Funcrafters JWA LLC · Remoto

  2. Feb 2024 – Nov 2025

    Customer Sales & Support

    WW Funcrafters JWA LLC · Remoto

  3. Dic 2023 – Sep 2024

    Customer Technical Support Engineer

    Concentrix Web Help · Remoto

Formación

Ingeniería de Sistemas e Informática

Universidad Pontificia Bolivariana, Bucaramanga

2023 – 2026

Certificaciones

  • AWS Cloud Practitioner Fundamentals
  • Fundamentos de Linux
  • Python
  • SQL y bases de datos
  • Git y GitHub
  • Agile y Scrum
  • Fundamentos de redes

Idiomas

  • Español: nativo
  • Inglés: C1+

Contacto

Busco un rol remoto de backend, plataformas o sistemas con IA. Respondo en menos de 24 horas.

O escribe aquí