wandres.dev
NIVEL DIOS: SÍNTESIS · el legado de Flux

Elegir en 2026: el árbol de decisión honesto

Cuarta lección del nivel de síntesis: tomar la decisión que todo el track ha ido preparando, sin recomendaciones de escaparate y sin fingir que hay un ganador. Empieza descontando las tres cosas que contaminan casi toda comparación de gestores de estado —el tamaño del paquete, la popularidad y la experiencia previa del que decide— y demuestra que la mitad del estado de una aplicación de 2026 ni siquiera participa en la elección porque pertenece al servidor o a la URL. Sobre lo que queda construye un árbol de decisión honesto entre Redux Toolkit, Zustand, Jotai y no usar nada, se detiene en los cuatro empates reales donde el árbol no decide y hay que romperlos con criterios de equipo y de dominio, y termina con lo único que importa de verdad en una decisión así: cuánto cuesta corregir cada error, que resulta ser asimétrico y desmonta la ansiedad de acertar a la primera.

⏱ 21 min

Esta es la lección que la mayoría de la gente busca cuando llega a un track como este, y por eso conviene decir desde la primera línea que no va a haber un ganador. Habrá algo mejor: un procedimiento que hace la elección casi mecánica una vez has hecho el trabajo previo, y una estimación honesta del coste de equivocarse en cada dirección, que es el dato que de verdad debería gobernar una decisión reversible. La tesis de fondo es que la pregunta popular —cuál es el mejor gestor de estado— es incontestable no porque falte información sino porque está mal formulada, y que su versión correcta, cuál es la herramienta mínima para esta clase de dato en este equipo y este dominio, tiene una respuesta casi siempre evidente en cuanto se hacen tres preguntas en el orden debido.

🎯 Al terminar esta lección sabrás
  • Descontar los tres factores que contaminan casi toda comparación de gestores de estado.
  • Recorrer el árbol honesto entre Redux Toolkit, Zustand, Jotai y no usar ninguna librería.
  • Romper los cuatro empates reales con criterios de equipo y de dominio, no de preferencia.
  • Estimar el coste de corregir cada error posible y decidir en consecuencia, no por miedo a fallar.

Descontar el ruido antes de decidir

Tres factores aparecen en toda comparación pública y ninguno de los tres debería pesar apenas en la decisión. El primero es el tamaño del paquete. La diferencia entre las opciones de esta lección se mide en unos pocos kilobytes comprimidos, una cifra que queda por debajo del ruido en cualquier aplicación que ya cargue un framework, una librería de gráficos y tres fuentes tipográficas. Es un argumento legítimo en una isla interactiva de un sitio estático y casi irrelevante en un panel de gestión, y sin embargo se esgrime igual en ambos casos.

El segundo es la popularidad. El número de descargas mide la inercia de las bases de código existentes, no la calidad de la herramienta para tu problema; buena parte del volumen de Redux corresponde a proyectos escritos hace ocho años que nadie va a reescribir. Como señal de riesgo tiene algo de valor —una librería con un solo mantenedor y sin actividad es un riesgo real— pero como criterio de elección entre cuatro opciones todas sanas y mantenidas, no discrimina nada.

El tercero, y el más contaminante, es la experiencia previa del que decide. Es un factor legítimo y hay que contarlo, pero hay que contarlo con su nombre: si el equipo lleva cuatro años con Redux Toolkit, ese conocimiento acumulado vale más que las ventajas marginales de cualquier alternativa, y decir eso en voz alta es una decisión de ingeniería impecable. Lo que corrompe la discusión es disfrazar esa preferencia de argumento técnico y sostener que la herramienta que uno conoce es objetivamente superior.

⚠️
La mitad del estado no participa en la elección

Antes de comparar nada conviene recordar el resultado de las dos primeras lecciones de este nivel, porque cambia radicalmente el tamaño del problema. En una aplicación típica de 2026, la mayor parte del estado pertenece al servidor y su lugar es una cache, no un store; una parte considerable de lo que queda pertenece a la URL; y otra parte pertenece al componente que la usa. Lo que llega a la comparación entre Redux Toolkit, Zustand y Jotai es únicamente el estado de cliente compartido: sesión, preferencias, borradores, carrito, cola sin conexión, coordinación entre pantallas. En muchos productos eso son unas pocas piezas, y comparar herramientas antes de haber hecho ese reparto es discutir sobre un problema que aún no se ha delimitado.

El árbol honesto

Con el ruido descontado y el estado repartido, el árbol tiene tres preguntas y cuatro hojas. Las preguntas van en este orden y no en otro, porque cada una vuelve irrelevante a la siguiente cuando se responde que no.

flowchart TD
E[estado de cliente compartido] --> Q1{hay poco y no lo lee media app}
Q1 -->|si| NADA[nada: estado local mas contexto o la url]
Q1 -->|no| Q2{el dominio exige trazabilidad estricta}
Q2 -->|si| RTK[redux toolkit]
Q2 -->|no| Q3{es un grafo de valores derivados unos de otros}
Q3 -->|si| JOTAI[jotai]
Q3 -->|no| ZUS[zustand]
style NADA fill:#cba6f7,color:#11111b
style RTK fill:#89b4fa,color:#11111b
style JOTAI fill:#f9e2af,color:#11111b
style ZUS fill:#a6e3a1,color:#11111b

La primera hoja es la que más cuesta aceptar y la más frecuentemente correcta: no usar nada. Si el estado compartido son tres o cuatro valores estables que cambian poco —el tema, el idioma, el usuario ya cacheado—, un contexto con un valor memoizado los resuelve sin dependencias. La objeción clásica es que el contexto renderiza a todos sus consumidores en cada cambio, y es cierta, pero el matiz decide el caso: para valores que cambian una vez cada varios minutos, esa penalización es inobservable. El contexto es mal gestor de estado que cambia rápido y buen distribuidor de valores estables, y confundir esas dos cosas es lo que hizo que se ganase una mala fama que no siempre merece.

ℹ️
Las cuatro hojas comparadas por lo que cuestan y por lo que compran

Ninguna columna dice mejor. Todas dicen a cambio de qué.

Hoja Compra Cuesta Su punto de dolor
Nada Cero dependencias, cero conceptos Renders anchos si el valor cambia a menudo Crece mal cuando aparece el quinto valor
Zustand Store como hook, mínima ceremonia Poca trazabilidad si nadie nombra las acciones Escrituras dispersas sin frontera clara
Jotai Derivación fina y suscripción por átomo Grafo difuso, orden de dependencias implícito Difícil de auditar cuando pasa de cien átomos
Redux Toolkit Trazabilidad, historial, convenciones Ceremonia y vocabulario que hay que enseñar Peaje injustificado en dominios simples
// La hoja mas barata, escrita bien: un contexto por valor y no un contexto para todo.
const TemaCtx = createContext<Tema>('claro')
const SesionCtx = createContext<Sesion | null>(null)

// Separarlos importa mas que memoizar: un cambio de tema no debe tocar
// a quien solo lee la sesion. Un contexto con un objeto de diez campos
// convierte cualquier cambio en un render de todos sus consumidores.
export function useValorTema() {
  const [tema, setTema] = useState<Tema>('claro')
  return useMemo(() => ({ tema, setTema }), [tema]) // referencia estable
}

La segunda pregunta —si el dominio exige trazabilidad estricta— es la única que apunta a Redux Toolkit sin ambigüedad, y conviene definirla con precisión para que no signifique lo que a cada uno le apetezca. Exige trazabilidad estricta un dominio en el que haya que reconstruir qué pasó a partir de un informe de error, en el que exista deshacer profundo, en el que los cambios deban auditarse por obligación regulatoria, en el que varias pantallas coordinen un mismo proceso largo, o en el que el equipo sea lo bastante grande como para que la convención valga más que la libertad. Ninguna de esas condiciones se cumple en la mayoría de productos, y por eso la respuesta honesta a la segunda pregunta suele ser no.

Los cuatro empates y cómo se rompen

El árbol resuelve la mayoría de los casos, pero hay cuatro situaciones en las que dos hojas empatan de verdad y hace falta un criterio adicional. Fingir que el árbol las resuelve sería el tipo de deshonestidad que esta lección quiere evitar.

⚖️

Zustand contra Jotai

Empatan cuando hay estado plano y algo de derivación. Rompe el empate el grano: si la pantalla renderiza de más por leer campos sueltos, ganan los átomos.

🏛️

Zustand contra Redux Toolkit

Empatan en equipos medianos sin requisitos de auditoría. Rompe el empate el tamaño del equipo: a más manos, más vale la convención impuesta.

🕊️

Nada contra Zustand

Empatan cuando hay pocos valores pero cambian a menudo. Rompe el empate la frecuencia: si el valor cambia por interacción, el contexto ya no sirve.

🧩

Una o varias

Empatan cuando conviven un grafo derivado y un puñado de banderas. Romper el empate suele significar aceptar dos herramientas con fronteras escritas.

El cuarto empate merece una nota aparte porque su respuesta contradice un instinto muy extendido. Usar dos gestores en el mismo producto no es un fallo de arquitectura si cada uno tiene un territorio declarado; lo que es un fallo es que el mismo dato pueda vivir en cualquiera de los dos. Un carrito en Zustand y un grafo de configuración derivada en Jotai conviven sin problema mientras el plano diga cuál va dónde. Lo que produce caos no es la pluralidad de herramientas sino la ausencia de fronteras, y ese es exactamente el mismo diagnóstico que el de las costuras de la lección anterior.

// La frontera de escritura no la da la libreria: la das tu, en cualquiera de ellas.
// Zustand sin frontera: cualquiera escribe lo que quiera desde donde quiera.
const malo = create((set) => ({ items: [], set }))

// Zustand con frontera: acciones nombradas y nada de set desnudo hacia fuera.
const useCarrito = create<Estado>((set, get) => ({
  items: [],
  anadir: (id: string) => set({ items: [...get().items, id] }),
  vaciar: () => set({ items: [] }),
}))

// La diferencia no aparece en el paquete ni en el rendimiento:
// aparece a los dos anos, cuando alguien pregunta quien vacio el carrito.

Ese fragmento resume por qué la elección de librería importa menos de lo que parece. La garantía que de verdad decide si una base de código envejece bien —que exista un conjunto estrecho y nombrado de formas de escribir— se puede tener o perder en las cuatro hojas del árbol. Redux Toolkit la impone y por eso cuesta ceremonia; Zustand la permite y por eso hay que decidirla; el contexto la exige a mano; Jotai la reparte entre átomos de escritura. La herramienta cambia quién se encarga de mantener la garantía, no si la garantía hace falta.

Equivocarse: el coste asimétrico de cada error

La pregunta que debería cerrar cualquier decisión reversible no es cuál es la mejor opción sino cuánto cuesta corregir cada error posible, y en este caso los costes son marcadamente asimétricos, lo que permite decidir con mucha menos angustia de la que suele acompañar a estas discusiones.

🪶

Elegir menos de lo necesario

Empezaste sin nada y ahora necesitas un store. Coste bajo: el estado local se sube a un store en horas, pieza a pieza y sin parar el producto.

🏗️

Elegir más de lo necesario

Montaste Redux para cuatro banderas. Coste medio y continuo: nadie lo quita, todo el equipo paga el vocabulario y el peaje cada semana.

🔀

Elegir mal la herramienta

Zustand donde convenían átomos. Coste bajo si hay frontera: se migra por módulos. Alto si nadie la puso.

🧨

Elegir mal el dueño

Datos del servidor en un store propio. Coste alto y creciente: no es cambiar de librería, es rehacer el flujo de datos entero.

📝
Lo que sí es irreversible en esta decisión

Conviene matizar la tesis de la reversibilidad, porque tiene una excepción importante. Cambiar de librería es barato en código y caro en personas: lo que no se deshace en un mes es el conocimiento del equipo, las convenciones aprendidas, las herramientas de depuración a las que todos se acostumbraron y el corpus de ejemplos internos que la gente copia. Por eso una migración técnicamente sencilla puede resultar organizativamente costosa, y por eso tiene sentido cambiar por un dolor medido y no por una preferencia. La regla honesta es que puedes permitirte equivocarte en la elección, pero no puedes permitirte reelegir cada año: cada cambio consume una cantidad de atención colectiva que no aparece en ninguna estimación y que se resta directamente del producto.

La lectura de esa tabla es la conclusión práctica del nivel entero: el error de librería es barato y el error de reparto es caro. Puedes cambiar Zustand por Jotai en un mes de trabajo repartido; no puedes deshacer con la misma facilidad haber tratado la mitad de la aplicación como estado propio cuando era una copia del servidor, porque eso no vive en un archivo de configuración sino en cada componente que lee, escribe y sincroniza. De ahí se deduce dónde debe ir el cuidado: mucho en el plano, poco en el catálogo.

💡
El orden que ahorra la mayoría de las discusiones

Reparte primero, elige después, y con una regla añadida: empieza por la hoja mínima y sube solo cuando un dolor concreto lo exija. Ese dolor tiene nombres reconocibles —renders anchos que el profiler confirma, cambios de origen desconocido que cuesta rastrear, o gente nueva que no sabe dónde poner las cosas— y cuando aparece, la migración hacia arriba es barata porque las piezas ya están separadas. La estrategia inversa, elegir la herramienta más completa por si acaso, paga desde el primer día un seguro contra un riesgo que quizá nunca se materialice, y lo paga en la moneda más cara que existe en un equipo, que es el tiempo de comprensión de cada persona que entra.

La ansiedad de elegir bien es el síntoma de no haber hecho el trabajo que sí decide

Vale la pena examinar por qué la pregunta de qué gestor de estado usar genera una ansiedad tan desproporcionada respecto a su importancia real, porque el diagnóstico es más útil que cualquier recomendación. La respuesta es que se trata de una decisión visible, nominal y socialmente evaluable —tiene un nombre propio, aparece en la primera línea del archivo de dependencias, se discute en público y alguien puede juzgarte por ella— mientras que las decisiones que de verdad determinan si el sistema envejecerá bien son invisibles, anónimas y difusas: quién posee cada dato, qué se deriva y qué se guarda, dónde está la frontera de escritura, qué es copia y qué es verdad. Nadie te va a felicitar por haber escrito un plano de estado de una página, y nadie va a poner en su currículum que consiguió que ningún dato de su aplicación tuviera dos dueños; en cambio, la elección de librería se puede defender en una reunión de una hora y produce la sensación reconfortante de haber decidido algo importante. Esa asimetría entre visibilidad e impacto es la que hace que equipos enteros dediquen semanas a comparar cuatro herramientas intercambiables mientras nadie dedica una tarde al reparto que las cuatro respetarían igual de bien. Y de ahí sale también la única forma fiable de reconocer a alguien que domina esta área: no es quien tiene una opinión firme sobre cuál de las cuatro es superior, sino quien, al plantearle el problema, empieza preguntando qué datos hay, de quién son y quién los escribe, y solo al final —casi de pasada, como un detalle administrativo— menciona qué librería usaría, con la naturalidad de quien sabe que ese último paso es el más fácil de deshacer de todos los que ha dado. La madurez técnica en el estado compartido consiste, exactamente, en haber trasladado la ansiedad desde la decisión que se ve hacia las decisiones que se pagan.

⚔️ Decide con el árbol y con los costes delante
  1. Toma el plano de la lección anterior y tacha todo lo que sea servidor, URL o local. Lo que queda es el único estado que participa en la elección.
  2. Recorre el árbol con ese subconjunto y anota la hoja resultante, incluida la posibilidad de que sea no usar nada.
  3. Comprueba si caes en alguno de los cuatro empates y escribe con qué criterio de equipo o de dominio lo rompes.
  4. Audita la frontera de escritura de tu solución actual: cuenta cuántos sitios pueden modificar el estado compartido sin pasar por una acción nombrada.
  5. Estima, para tu producto, el coste de los cuatro errores posibles y ordénalos. Comprueba si tu esfuerzo actual está puesto en el error más caro.
  6. Escribe la decisión y su motivo en cinco líneas, incluyendo la señal concreta que te haría subir a la hoja siguiente. Fecha esa revisión.