$ whoami
Las matemáticas me enseñaron a ver los problemas como rompecabezas. El código me enseñó a resolverlos. Ahora, estoy enseñando a una IA a unirse.
Rompecabezas
Dibuja una pared. Míralo encontrar la vuelta.
Esta es la parte de “las matemáticas me enseñaron a ver los problemas como rompecabezas”, hecha interactiva. Arrastra para dibujar paredes, mueve los marcadores A/B a donde quieras — A* lo resuelve de nuevo en vivo.
Cómo pienso
Decisiones reales, y el razonamiento detrás de cada una.
Optimización bajo tráfico alto
Las páginas de artículos de una plataforma de medios pasaron de unos cientos a decenas de miles de lectores concurrentes en minutos, cuando una noticia se volvió viral — y todos estaban golpeando el mismo endpoint de la API al mismo tiempo.
Cuando el tráfico se dispara, la peor decisión es dejar que cada usuario dispare su propia llamada al backend. Así es como diseño la capa de caching para que aguante el pico sin caerse.
Decisión: Caching tipo stale-while-revalidate para las llamadas a la API, combinado con deduplicación de requests concurrentes, para que un pico de tráfico produzca una sola llamada al backend en vez de miles idénticas.
Los requests concurrentes se deduplican en una sola llamada al backend; uno posterior recibe datos stale al instante mientras se revalida en segundo plano.
Multi-repo / DevOps
Un equipo de ingeniería pequeño desplegaba tanto a un entorno de QA como a producción, con deploys hechos a mano — lo que significaba que lo único que separaba una rama rota de producción era que alguien se acordara de correr los checks ese día.
Esto no es código de feature — es diseño de proceso. El trabajo aquí no fue escribir una función ingeniosa, fue asegurar que todo el equipo pudiera desplegar sin que nadie tuviera que acordarse de tener cuidado.
Decisión: Un pipeline de CI/CD con gates de calidad (lint, test, build) que toda rama debe pasar, donde QA despliega automáticamente desde develop y producción solo se despliega desde main detrás de un entorno que requiere aprobación de un revisor.
Los mismos gates para toda rama — producción es la única que espera a una persona.
Agente de IA local con Ollama
Un proyecto personal: un agente local que corre completamente en el dispositivo contra Ollama, y necesita actuar sobre el mundo real — revisar el clima, hacer una conversión, buscar algo — sin darle nunca al modelo acceso directo al sistema de archivos, la red, o la shell.
El modelo no puede ejecutar nada. Puede pedir. Este es el patrón que traza esa línea — y también es la base del playground de abajo, simplificado para correr completamente en tu navegador.
Decisión: Orquestación de tool-calling: al modelo se le da un catálogo fijo de herramientas con nombre, su respuesta se parsea buscando una llamada a herramienta estructurada, y solo el orquestador — nunca el modelo mismo — la ejecuta.
interface Tool {
name: string;
description: string;
execute: (args: Record<string, unknown>) => string;
}
const tools: Tool[] = [
{
name: "get_weather",
description: "Get the current weather for a city",
execute: ({ city }) => `${city}: 22°C, clear skies`,
},
{
name: "convert_currency",
description: "Convert an amount from one currency to another",
execute: ({ amount, from, to }) =>
`${amount} ${from} ≈ ${(Number(amount) * 1.08).toFixed(2)} ${to}`,
},
];
// The model never calls a function directly — it returns structured JSON
// naming a tool and its arguments. We parse that decision ourselves and
// decide whether to act on it, which is what keeps the model sandboxed.
interface ToolCall {
tool: string;
args: Record<string, unknown>;
}
function parseToolCall(modelOutput: string): ToolCall | null {
try {
const parsed = JSON.parse(modelOutput);
if (typeof parsed.tool === "string") return parsed as ToolCall;
} catch {
// Not valid JSON — treat the output as a plain text reply instead.
}
return null;
}
export async function runAgentTurn(modelOutput: string): Promise<string> {
const call = parseToolCall(modelOutput);
// No tool call parsed: the model just answered in plain text.
if (!call) return modelOutput;
const tool = tools.find((t) => t.name === call.tool);
if (!tool) return `Error: no tool named "${call.tool}"`;
return tool.execute(call.args);
}Trading systems (cTrader)
Dos herramientas personales para cTrader: un scalper que explota una rareza de microestructura en BTC/USD, y un indicador que combina RSI con soporte/resistencia.
No es trading "justo" — es toxic flow. Un edge real, explotado solo como reto de lógica.
Decisión: Una ventana de confirmación de dos ticks antes de apostar por la reversión, y una validación de confluencia (escalada por ATR) entre una reversión de RSI y una zona de soporte/resistencia fractal.
Salto de un tick más allá del spread → confirmación de dos ticks → operación de reversión al nivel previo.
Pruébalo tú mismo
El patrón de tool-calling del caso de estudio de arriba, en vivo.
Edita el código, cambia lo que "respondió" el modelo, y ejecútalo — todo corre acá mismo en tu navegador, sin ningún servidor de por medio.
Stack
$ cat toolkit.json
// cuando necesito velocidad de iteración
// cuando el proyecto crece
También en la caja de herramientas
También he llevado código a producción con esto — no es mi opción por defecto, pero está listo si un proyecto lo requiere.
Frontend
JavaScript · HTML · CSS · Sass/Less/Scss · jQuery · Angular · Redux · GraphQL
Backend, CMS y datos
PHP · WordPress · Wagtail · Python · Java · SQL
Cloud y DevOps
Git · GitHub · GitLab · Bitbucket · AWS · GCP · PM2 · Keycloak
Herramientas y testing
Webpack · npm · Jest · Enzyme · React Testing Library · SEO
Verificado, no solo afirmado
Los números de performance y accesibilidad detrás de este sitio.
No es una insignia que me inventé — es una auditoría real de Lighthouse contra un build de producción, y puedes volver a correrla tú mismo cuando quieras.
$ lighthouse https://www.mauriciorodriguez.dev/en --preset=desktop,mobile
Medido el 2026-08-06