Jesús Rodríguez Casado
Sobre mí
Ingeniero Informático titulado en la Universidad de Córdoba.
Estudiante de Máster Big Data y Data Engineering en la Universidad
Complutense de Madrid.
Desarrollando
Lux,
mi propio framework web en C++ con su propio lenguaje de programación,
sobre el que está construida esta misma página.
La sirve Lux desde mi propio servidor, con nginx por delante y HTTPS de Let's Encrypt. Detrás hay una pequeña API en /v1 que devuelve los datos de este mismo CV (perfil, estudios, experiencia y proyectos) y una documentación OpenAPI que Lux genera sola a partir del código.
Educación
Máster en Big Data y Data Engineering
Universidad Complutense de Madrid
2026 – actualidad
Grado en Ingeniería Informática (Computación)
Universidad de Córdoba
2022–2026
Experiencia
- Desarrollo con C++ y Python.
- Minería de datos.
- Desarrollo con ESP32 y Raspberry Pi.
- Desarrollo de APIs y aplicaciones web.
Proyectos
- Núcleo en C++23 para Linux, un binario (técnicamente portable) de entre 1 y 5 MB.
- LuxScript: lenguaje propio, sintaxis tipo Python con tipado estático, clases y genéricos.
- Rendimiento muy superior al de otros stacks web.
- Tan cómodo como ejecutar el binario indicándole un archivo .lux con los endpoints.
- Apps multiplataforma sobre Lux con WebView nativo del sistema, sin Chromium embebido: pensado para Linux y en desarrollo para Android.
- Compila a un único binario autocontenido; escrito en LuxScript en lugar de Node.
Lux
Lux es mi framework web. El núcleo está escrito en C++23 y se programa en LuxScript, un lenguaje propio que se lee casi como Python pero con tipado estático. La idea es tener la comodidad de Flask o FastAPI pero sin tener que sacrificar rendimiento, y sin tener que recurrir a Javascript.
Este es el código real de la API de este CV. El binario se arranca con
lux ./cv, él solo se encarga de recargar todo si detecta cambios
en esa carpeta. También se puede indicar un archivo .lux a secas.
El OpenAPI lo
genera a partir de las rutas y de las clases.
app:
name "CV API"
port 8081
static "/" -> "./public"
docs
class Project:
string slug
string name
string tagline
string repo
List<string> highlights
get endpoint("/v1/projects/:slug", string slug):
for Project p in all_projects():
if p.slug == slug:
return p
return { "error": "project not found", "slug": slug }.status(404)
Con 100 000 usuarios concurrentes leyendo y escribiendo, Lux sobre PostgreSQL responde en 11 ms; Actix tarda 583 ms, Drogon y Gin 2 y 3,4 s, y el resto más de 10 s. Con SQLite y replicando todos los cambios a una copia de seguridad, Lux aguanta 400 000 usuarios con p99 por debajo de 4 ms. Con PostgreSQL, en cambio, todos se hunden.
Desliza la tabla hacia los lados →
| Usuarios concurrentes | 50k | 100k | 150k | 200k | 250k | 300k | 350k | 400k | 450k | 500k | 550k | 600k | 650k | 700k |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Lux + SQLite + réplica | 0,3 ms15,0k | 0,4 ms23,9k | 0,5 ms32,7k | 0,6 ms41,4k | 0,7 ms49,8k | 1 ms58,1k | 2 ms66,4k | 4 ms74,4k | 288 ms81,2k | 166 ms91,3k | 2,8 s77,3k | 8,4 s74,4k | 5,5 s96,0k | 17 s64,5k |
| Lux + PostgreSQL | 3 ms15,0k | 11 ms23,8k | 4,1 s26,9k3 err. | 11 s26,8k | 18 s25,4k2 err. | 25 s25,3k1 err. | — | — | — | — | — | — | — | — |
| Actix + PG | 3 ms15,0k | 583 ms23,1k | 6,9 s23,9k | 16 s22,8k | 27 s20,5k | 40 s17,9k | — | — | — | — | — | — | — | — |
| Drogon + PG | 3 ms15,0k | 2,0 s21,6k | 10 s20,1k | 21 s17,6k | 29 s18,2k | — | — | — | — | — | — | — | — | — |
| Gin + PG | 7 ms15,0k | 3,4 s20,5k | 9,8 s21,2k | 21 s20,2k | 31 s19,6k | 42 s19,9k | — | — | — | — | — | — | — | — |
| FastAPI + PG | 9,4 s8,5k | 26 s7,2k | 44 s6,9k | 65 s6,7k | — | — | — | — | — | — | — | — | — | — |
| Fastify + PG | 8,4 s9,0k | 23 s7,7k | 42 s6,7k | 62 s6,0k | — | — | — | — | — | — | — | — | — | — |
| Flask + PG | 5,0 s7,6k | 12 s6,2k | 18 s6,2k | 28 s6,2k | — | — | — | — | — | — | — | — | — | — |
| Django + PG | 6,9 s5,8k | 22 s3,3k | 37 s3,0k | 44 s3,7k | — | — | — | — | — | — | — | — | — | — |
En cada celda, la latencia p99 y, debajo, las peticiones por segundo (k = miles) y los errores, si los hay. El p99 es el tiempo por debajo del cual se responde el 99 % de las peticiones: el 1 % más lento tarda eso o más. Verde: menos de 50 ms · ámbar: menos de 1 s · rojo: 1 s o más. Una raya significa que ese stack colapsó y la prueba se detuvo. Lux con SQLite además replica cada cambio a una copia de seguridad.
A partir de unos 500 000–600 000 usuarios, el propio simulador, con cientos de miles de conexiones abiertas, empieza a consumir recursos del sistema que el servidor también necesita, así que los datos de esas columnas se ensucian bastante (se nota en que las peticiones por segundo suben y bajan sin orden).
Este benchmark no tiene en cuenta el tiempo que la petición tarda en llegar al servidor, solo mide el rendimiento puro de los frameworks. En un servidor real estos números serían mucho más bajos, pero aun así muestran que Lux es muy rápido y es capaz de escalar como ninguno usando SQLite.