Gonzalo Martin PerezAI Software Engineer

Caso de estudio · Ene – Dic 2025

Filomena — Una plataforma de exámenes de ciencias de la salud que usan cinco instituciones

Un monolito heredado en CakePHP y jQuery, reconstruido como una plataforma API-first que hoy ejecuta exámenes de alta exigencia en cinco instituciones nacionales argentinas.

  • PHP
  • Laravel
  • React
  • Next.js
  • TypeScript
  • MySQL
  • Redis
  • Docker
  • GitHub Actions
  • Prometheus
  • Grafana
  • 5

    instituciones en producción

    UNS, UNRN, UNC, UNVM y FAMFyG.

  • 1.000+

    usuarios simultáneos

    Observados en producción con consistencia completa de datos, no en un benchmark sintético.

  • <300 ms

    endpoints críticos

    Latencia promedio, mediante SQL tuning, caché Redis y colas.

  • 10 / 10

    proyecto final

    Calificado en la Universidad Nacional del Sur.

El problema

Las carreras de ciencias de la salud evalúan a sus estudiantes con exámenes escritos masivos y de alta exigencia. La primera versión de Filomena era un monolito CakePHP y jQuery construido para una sola institución, y mostraba todos los síntomas de serlo: se degradaba bajo carga concurrente, la toma de exámenes era secuencial, el control de acceso se aplicaba de forma inconsistente y sumar una institución implicaba escribir código.

No había monitoreo, así que los problemas aparecían como reportes de personas que estaban rindiendo un examen. Para una aplicación donde una respuesta lenta durante una evaluación cronometrada es un problema académico y no solo técnico, esa era la restricción que más pesaba.

Para quién es

Tres roles con necesidades genuinamente distintas. Los administradores configuran instituciones, cursos y cronogramas. Los evaluadores redactan preguntas y revisan resultados. Los estudiantes rinden los exámenes — y deben permanecer anónimos ante el evaluador que los califica.

Esos roles no son mutuamente excluyentes. Un profesor puede ser evaluador en un curso y administrador en otro, y por eso el manejo de roles tuvo que ser multirol desde el principio, en lugar de un único campo en el usuario.

Mi rol

Desarrollada por un equipo de tres personas. Fui el autor y contribuidor principal en arquitectura, backend, frontend, infraestructura, seguridad, observabilidad y coordinación. La plataforma es un logro del equipo.

Filomena fue desarrollada por un equipo de tres personas como nuestro proyecto final en la Universidad Nacional del Sur, y el producto es un logro del equipo. Fui el autor y contribuidor principal: arquitectura, backend, frontend, infraestructura, seguridad, observabilidad y coordinación del trabajo.

Digo contribuidor principal y no autor único de forma deliberada. Los repositorios públicos son una instantánea publicada como evidencia de portfolio — no son un historial de commits que pruebe quién escribió cada línea, y no los presentaría como tal.

El enfoque

En lugar de refactorizar dentro del monolito, lo separamos en una API REST Laravel y un frontend Next.js, React y TypeScript. La razón decisiva no fue la modernidad: fue que un único contrato de API nos permitió convertir el modelo multi-institución en configuración en vez de código, y le dio a la concurrencia un solo lugar donde ser correcta.

El trabajo de performance se concentró donde los exámenes realmente tocan el sistema — recuperación de preguntas, estado de la sesión, envío de resultados. Primero vinieron el SQL tuning y el diseño de índices, después la caché Redis, y todo lo que no necesitaba ocurrir durante el request, como generar reportes de resultados, se movió a una cola.

Arquitectura

El recorrido del request desde el navegador, después de la reconstrucción.

  1. ClienteNext.js, React y TypeScript, para administradores, evaluadores y estudiantes.
  2. APIUna API REST Laravel como contrato único para cada cliente.
  3. DatosMySQL, con diseño de índices y tuning de consultas en los caminos de examen.
  4. Caché y colasRedis para caché y para trabajo asincrónico.
  5. ObservabilidadPrometheus y Grafana sobre la base de datos, las colas y los workers.
  6. DeliveryImágenes Docker construidas y desplegadas con GitHub Actions.

El producto en sí

Un recorrido por la interfaz, desde el inicio de sesión hasta la operación de un examen en curso. Son capturas de una instancia de demostración, no de datos reales de ninguna institución.

Decisiones de ingeniería

La seudonimia como propiedad del modelo de datos

Los estudiantes son seudónimos para los evaluadores. Eso se aplica en el modelo de datos y en la API, y no se esconde en la interfaz, porque una regla de privacidad implementada en una vista es una regla que se filtra la primera vez que alguien agrega un endpoint.

Aislamiento por institución

Cada institución administra sus propios cursos, evaluadores, estudiantes, exámenes y cronogramas, con los datos aislados entre sí. Eso fue lo que convirtió el onboarding de una institución nueva de trabajo de desarrollo en configuración.

Verificación de roles en ambos lados

El control de acceso basado en roles se aplica en la API y se refleja en el frontend. La copia del frontend existe por usabilidad; la de la API es la que realmente sostiene la garantía.

Monitoreo antes de necesitarlo

Prometheus y Grafana entraron junto con la reconstrucción y no después del primer incidente, cubriendo la base de datos, Redis, las colas y los workers, con logging estructurado y health checks.

Qué cambió

La primera versión comparada con la plataforma hoy en producción.
AspectoAntesDespués
ArquitecturaMonolito CakePHP y jQueryAPI REST Laravel con un frontend Next.js
ConcurrenciaToma secuencial, una sola institución1.000+ usuarios simultáneos, observados en producción
LatenciaSe degradaba bajo carga concurrenteEndpoints críticos por debajo de 300 ms en promedio
OnboardingRequería trabajo de desarrolloConfiguración, en minutos
Control de accesoAplicado de forma inconsistenteRBAC multirol en API y frontend
ObservabilidadNingunaPrometheus y Grafana

Cómo trabajamos

Prácticas ágiles con Trello, desde los requisitos hasta producción. Tres personas, una fecha límite académica e instituciones reales que ya dependían de la versión anterior — así que el trabajo se ordenó por lo que se rompería primero, no por lo que resultaba más interesante.

Los despliegues corrían sobre imágenes Docker construidas con GitHub Actions, observados por debajo de quince minutos de punta a punta. Los repositorios públicos son instantáneas publicadas y no incluyen la configuración de ese pipeline.

Dónde está hoy

Filomena está activa en cinco instituciones nacionales argentinas: UNS, UNRN, UNC, UNVM y FAMFyG. Soportó 1.000+ usuarios simultáneos en producción con consistencia completa de datos, y mantuvo los endpoints críticos por debajo de 300 ms en promedio.

Estas cifras provienen de la operación desplegada, no de un banco de pruebas en el repositorio. El proyecto fue calificado 10/10 como proyecto final en la Universidad Nacional del Sur, y recibió entrevistas, cobertura universitaria y menciones de autoridades académicas — reconocimiento editorial, no un premio formalmente instituido.

Qué haría distinto

La suite de tests es el punto débil honesto. Validamos el comportamiento mediante la operación desplegada y validación de carga, y las instantáneas públicas incluyen tests de humo del framework en lugar de una suite real. En un sistema donde un defecto interrumpe un examen en curso, los caminos de concurrencia y permisos merecían cobertura automatizada, y construirla bajo una fecha límite académica fue el compromiso equivocado para repetir.

También habría anotado las condiciones de medición en su momento. Los números de performance son reales, pero reconstruir meses después cómo se observó exactamente cada uno es más difícil de lo que debería — y una cifra que no se puede calificar es una cifra que conviene repetir con cuidado.

Evidencia

Los repositorios son instantáneas publicadas que se conservan como evidencia de portfolio. No son el historial de commits del desarrollo original, y no los presento como prueba de quién escribió cada línea.