wandres.dev
NIVEL DIOS: SÍNTESIS · la teoría del estado

La teoría unificada del estado

El nivel culminante abre con la tesis que sostiene el track entero: todo estado es reactividad —el mecanismo por el que un cambio se propaga a quien depende de él— más una disciplina de mutación —las reglas que gobiernan cómo y cuándo ese dato puede cambiar—. Dos ejes ortogonales, no una sola escala. Esta lección los define con precisión, los recorre de extremo a extremo, y demuestra que son independientes poblando las cuatro esquinas del plano con herramientas reales. De ahí sale el último modelo mental del track: dejas de coleccionar librerías y empiezas a leer coordenadas, porque cada herramienta —signal, store, máquina, Redux, Elm, TCA, MVI o CRDT— es un punto en ese plano, y elegir bien no es seguir la moda sino ubicar tu problema y leer qué punto lo cubre sin sobrar ni faltar.

⏱ 19 min

Has subido treinta y ocho niveles. Empezaste con un booleano compartido que dos partes de la pantalla se disputaban y has llegado hasta los CRDTs, que fusionan ediciones concurrentes sin árbitro. Por el camino conociste signals, observables, máquinas de estado, Redux, Elm, TCA, MVI, el estado de servidor y la persistencia offline. Parecían herramientas distintas, cada una con su vocabulario y su tribu. Este nivel demuestra que no lo eran: eran una sola idea vista desde ángulos distintos. La tesis cabe en una línea y sostiene el track entero: todo estado es reactividad —el mecanismo por el que un cambio se propaga a quien depende de él— más una disciplina de mutación —las reglas que gobiernan cómo y cuándo ese dato puede cambiar—. Dos ejes ortogonales, y cada herramienta que aprendiste es un punto en ese plano. El día que lo veas, dejarás de coleccionar librerías y empezarás a leer coordenadas.

🎯 Al terminar esta lección sabrás
  • Enunciar la teoría unificada: todo estado es reactividad más una disciplina de mutación, y nada más.
  • Definir con precisión cada eje: propagación de cambios frente a reglas de mutación.
  • Demostrar que los dos ejes son ortogonales poblando las cuatro esquinas del plano.
  • Interiorizar el plano mental sobre el que el resto del nivel ubicará todo el ecosistema.

La descomposición: dos preguntas, no una

Ponte delante de cualquier problema de estado —un carrito, un formulario, un editor colaborativo— y verás que, por debajo del ruido, siempre respondes a dos preguntas independientes.

La primera es de propagación: cuando este dato cambie, quién se entera y cómo llega la noticia hasta la pantalla. La segunda es de gobierno: quién tiene permiso para cambiarlo y bajo qué reglas lo hace.

La reactividad responde a la primera. La disciplina de mutación responde a la segunda. Ese es el teorema entero, y todo lo que sigue en el nivel es su desarrollo.

Tómalo con el ejemplo más pobre posible, un contador, para ver que las dos preguntas ya están ahí desde el minuto cero. Cuando el número sube, algo tiene que repintar la etiqueta que lo muestra: esa es la pregunta de propagación. Y hay que decidir si cualquiera puede reescribir el número a mano o solo se puede pedir un incremento con nombre: esa es la pregunta de gobierno.

Un contador no necesita pensar tanto, por supuesto. Pero el editor colaborativo de mil usuarios es el mismo contador con las dos preguntas subidas de volumen, y quien las oye ya en el contador no se pierde cuando arrecian.

Un useState responde a las dos de una manera; un reducer, de otra; un signal, de una tercera. Pero las preguntas son las mismas en los tres casos, y en todos los que vendrán.

Nombrar las dos preguntas por separado no es un tecnicismo de pizarra: es lo que te permite diagnosticar. Cuando algo falla, casi siempre falla una sola de las dos, y saber de antemano cuál de ellas acorta la búsqueda a la mitad.

Si el dato correcto está en memoria pero la pantalla no lo refleja, es un fallo de propagación. Si la pantalla refleja fielmente un dato que nunca debió llegar a valer eso, es un fallo de gobierno. Dos síntomas, dos ejes, dos lugares distintos donde mirar.

Durante años confundimos las dos preguntas porque cada librería llegaba con un par de respuestas ya soldadas. Redux te vendía junto una reactividad gruesa —el store notifica, tú relees— y una disciplina férrea —solo un reducer puro, en un flujo unidireccional—.

Un signal crudo te vendía justo lo contrario: propagación finísima y cero reglas, cualquiera lo escribe cuando quiere. Como cada herramienta ataba un eje al otro, era natural creer que eran el mismo eje.

La teoría unificada los desata, y en cuanto los ves separados, el ecosistema entero se ordena: no hay veinte inventos rivales, hay dos preguntas y un puñado de respuestas que se combinan.

Esa combinatoria es la que da al ecosistema su aspecto abrumador. Media docena de respuestas a cada pregunta produce decenas de pares posibles, y cada par lleva encima el nombre de una librería y el ruido de su comunidad.

Pero por debajo de las decenas de nombres solo hay dos preguntas. Reducir la lista infinita de herramientas a un plano de dos ejes es exactamente la simplificación que este nivel te regala, y la que convierte la ansiedad de estar siempre desactualizado en la calma de quien lee un mapa estable.

⚛️

Reactividad: propagar el cambio

Cuando un dato cambia, ¿quién se entera y cómo? Es el mecanismo de notificación: manual, grueso o de grano fino. Mide cuánto trabajo hace el runtime por ti.

🚦

Disciplina: gobernar la mutación

¿Quién puede cambiarlo y bajo qué reglas? Es el contrato: mutación libre, transiciones declaradas, reducer puro o convergencia sin árbitro. Mide cuánta libertad cedes por garantías.

Eje uno — la reactividad: cómo viaja un cambio

La reactividad es un gradiente que va de propagar a mano a que un runtime propague por ti, y lo haga con el mínimo trabajo posible.

En el extremo bajo está el cableado manual que abrió el track: tú suscribes observadores y tú los notificas. Funciona, pero cada dependencia que olvidas es un dato obsoleto esperando a morder, y el olvido es el bug de estado más silencioso que existe.

Ese extremo no es una antigualla que quedó atrás. Es el suelo sobre el que se construyó todo lo demás, y sigue latiendo debajo de cada abstracción moderna: un signal no elimina la suscripción manual, la automatiza y la esconde para que tú no tengas que recordarla.

Un peldaño más arriba está la propagación gruesa. Un store emite una única señal de que algo cambió, y todos sus suscriptores se despiertan, releen y comparan para ver si les toca actuar.

Es el modelo de Redux y del Zustand clásico: barato de construir, pero despierta a muchos que no cambiaron. Por eso se le añade encima una capa de selectores, que corta la propagación en cuanto la rebanada que miras no varió.

Ese punto intermedio —notificar grueso, consumir fino— es donde vive la mayor parte del frontend real. Ni el cableado a mano del principio ni el grafo total de los signals: un store que avisa a todos y un selector que decide, para cada quién, si de verdad le tocaba enterarse.

En el extremo alto está la propagación de grano fino. Un grafo de dependencias registra exactamente quién lee qué —lo descubre observando qué tocas mientras calculas— y, cuando una hoja cambia, notifica solo a los nodos afectados y recalcula cada uno a lo sumo una vez.

Es la maquinaria de los signals, del grafo de derivación y del batching que estudiaste en los fundamentos. Su promesa no es hacer algo que lo manual no pudiera; es hacerlo sin que tú lleves la contabilidad.

La lección honda de este eje es que la reactividad no cambia lo que es posible, cambia quién es responsable. En el extremo manual, la coherencia es una obligación tuya que se rompe el día que olvidas un caso. En el extremo fino, es una propiedad del grafo que el runtime sostiene aunque tú te distraigas.

Lo que crece a lo largo de este eje, fíjate, no es la corrección sino cuánto te regala el sistema. En los tres puntos el dato acaba llegando a la pantalla; lo que cambia es si la coherencia y el mínimo recálculo son tarea tuya o propiedad automática del runtime.

Eje dos — la disciplina: qué reglas gobiernan el cambio

La disciplina de mutación es otro gradiente, y mide algo distinto: cuánta libertad cedes a cambio de garantías.

En el extremo bajo está la mutación libre, el cuadrante peligroso del primer nivel: un valor compartido y mutable que cualquiera reescribe en cualquier momento y por cualquier vía. Máxima libertad, cero garantías, y la fuente de casi todos los bugs difíciles de reproducir.

No es que mutar esté siempre mal: una variable local que solo tú tocas vive feliz en el suelo de este eje, y forzarle disciplina sería ceremonia inútil. Lo peligroso no es mutar, es mutar algo compartido sin ninguna regla que diga quién puede y cuándo.

El primer escalón de orden es la fuente única de verdad: al menos el dato vive en un solo sitio, aunque su cambio siga siendo abierto. El segundo son las transiciones declaradas de una máquina, que solo permite los saltos que nombraste desde los estados que nombraste, y con ello vuelve irrepresentables los estados imposibles.

El tercero es el reducer puro unidireccional de la familia Flux: el estado solo cambia por hechos con nombre, mediante una función pura, en un único sentido. Redux, Elm, TCA y MVI viven aquí, y de esa pureza cuelgan el time-travel, el testing sin montar nada y la hidratación.

El cuarto aprieta una vuelta más: Elm con su Cmd y TCA con su Effect describen incluso los efectos como valores que un runtime ejecuta, para que ni la frontera con lo impuro escape al contrato.

Y hay un quinto punto, de otra naturaleza: la disciplina de la convergencia. Un CRDT no arbitra el conflicto, lo disuelve: sus mutaciones son conmutativas, de modo que dos réplicas que reciben los mismos cambios en distinto orden aterrizan matemáticamente en el mismo estado. La regla ya no es un solo sentido, sino que el orden deje de importar.

Recorre el eje de abajo arriba y verás que cada escalón cierra una puerta distinta por la que se colaba lo impredecible. La fuente única cierra la puerta de los datos duplicados que discrepan; las transiciones declaradas, la de los estados imposibles; el flujo unidireccional, la de los cambios sin causa con nombre; los efectos como valor, la de la magia que no se puede reproducir en un test.

Por eso subir por este eje siempre se siente como perder libertad y ganar sueño tranquilo a la vez. Cada regla que aceptas te quita una manera de hacer las cosas y, a cambio, te quita también una manera de que salgan mal.

flowchart TD
P[Todo estado] --> R[Eje 1 reactividad]
P --> D[Eje 2 disciplina de mutacion]
R --> R1[manual: cableas observadores]
R --> R2[gruesa: el store notifica y tu relees]
R --> R3[fina: el grafo notifica solo lo afectado]
D --> D1[libre: cualquiera muta cuando quiere]
D --> D2[transiciones declaradas]
D --> D3[reducer puro unidireccional]
D --> D4[efectos como valores y convergencia]
style P fill:#cba6f7,color:#11111b
style R fill:#89b4fa,color:#11111b
style D fill:#f9e2af,color:#11111b
ℹ️
Corrección no es lo mismo que comodidad ni que garantía

Vale la pena separar tres cosas que se confunden a diario. La corrección es que el dato correcto llegue a la pantalla: se puede lograr en cualquier punto de ambos ejes, incluso con cableado manual y mutación libre, si eres impecable. La reactividad mide la comodidad: cuánta de esa coherencia te la regala el runtime en lugar de exigírtela. Y la disciplina mide la garantía: cuántas clases de error se vuelven imposibles por construcción, no por vigilancia. Subir por un eje no te sube por el otro, y confundirlos lleva a errores caros: creer que un signal, por reactivo, es seguro, o que Redux, por disciplinado, es eficiente propagando.

Por qué los dos ejes son ortogonales

Que sean dos ejes y no una sola escala es la afirmación fuerte de la lección, y se demuestra enseñando que cada esquina del plano existe de verdad. Si fueran el mismo eje, más disciplina implicaría más reactividad, y no lo hace.

La confusión es comprensible, porque en la práctica las herramientas muy disciplinadas suelen venir además bien equipadas de reactividad, y eso sugiere una correlación. Pero correlación no es identidad: que dos rasgos viajen juntos de fábrica no los vuelve el mismo rasgo, y basta un contraejemplo para separarlos.

El contraejemplo es el Redux clásico, disciplinadísimo y de reactividad tosca. Con él en la mano, la idea de que disciplina y reactividad son un solo eje se cae, y lo que queda en pie es un plano de dos.

Reactividad baja y disciplina baja: un objeto mutable plano que relees a mano tras cada render. Es el punto de partida del track y su cuadrante más frágil, y aun así muchísimo código vive ahí sin saberlo.

Reactividad alta y disciplina baja: un signal de Solid o de Preact. Propaga con exquisita precisión, pero acepta escrituras de cualquiera en cualquier instante. Es potentísimo y peligroso a la vez, y esa combinación no es una contradicción, es una coordenada.

Reactividad baja y disciplina alta: el Redux clásico conectado con subscribe a mano. Propagación gruesa, pero un contrato de mutación inquebrantable. La disciplina no le compró ni un gramo de reactividad fina, y ese es justo el punto.

Reactividad alta y disciplina alta: un store de signals con un reducer encima, o Redux Toolkit leído con useSelector de grano fino, o una máquina de XState con suscripciones selectivas. Se puede tener todo, pero se paga en complejidad, y por eso no siempre conviene.

Observa que estas cuatro esquinas no son teoría: cada una es una librería que alguien mantiene y alguien corre en producción hoy. El plano no es un diagrama pedagógico que simplifica la realidad para que quepa en una pizarra; es la realidad del ecosistema, ordenada por sus dos preguntas de fondo.

Las cuatro esquinas están pobladas. Esa es la prueba entera: si moverte en un eje no te arrastra por el otro, tienes un plano y no una recta. Y un plano tiene algo que una recta no tiene: posiciones que eliges a propósito, en lugar de un único ranking de peor a mejor.

Interioriza el plano como un mapa físico, no como una tabla de puntuaciones. En un mapa nadie pregunta qué ciudad es la mejor; pregunta a cuál necesita ir hoy y por qué.

El estado se piensa igual. No hay coordenada ganadora que sirva para todo; hay la coordenada a la que este problema concreto te pide viajar, y puede ser distinta en la pantalla de al lado de la misma app.

El último modelo mental del track: piensa en coordenadas, no en catálogos

Este es el marco al que se subordina todo lo demás que has aprendido, y el que hará que nunca vuelvas a mirar una herramienta de estado igual. Deja de preguntarte si X es buena o mala, si está de moda o caducó, si la usa Vercel o la abandonó Facebook. Pregúntate dos coordenadas: cuánta reactividad automática te da y cuánta disciplina de mutación te impone. Un signal es propagación máxima con disciplina mínima; una máquina de estado es disciplina alta con la reactividad que le enchufes; Elm y TCA empujan la disciplina hasta describir el efecto; un CRDT reescribe la regla para que el orden no importe. Ninguna posición del plano es la mejor en abstracto, porque las coordenadas no se puntúan, se eligen: dependen de si tu problema pide propagación fina o gruesa, y de si necesita la libertad de un signal o la red de seguridad de un contrato. El ingeniero que ha internalizado los dos ejes ya no colecciona librerías ni discute cuál gana; ubica su problema en el plano, lee qué punto necesita y elige la herramienta que cae más cerca. Y cuando dentro de cinco años aparezca una arquitectura con un nombre que hoy no existe, no tendrá que aprenderla desde cero: le tomará las dos coordenadas, la situará en el mapa que hoy construyes y sabrá, antes de leer el tutorial, qué le promete y qué le cobra. Las herramientas son el vocabulario de una época; los dos ejes son la gramática, y la gramática no se deprecia.

📝
Lo que viene en el resto del nivel

Con el plano en la mano, las próximas cuatro lecciones lo recorren enteras. La segunda ubica en él todo el ecosistema —signals, stores, máquinas, Redux, Elm, TCA, MVI y CRDTs— para que veas el mapa poblado. La tercera baja al terreno y diseña el estado de una app real, separando clases de estado y eligiendo cada herramienta por su posición. La cuarta cataloga los errores de arquitectura como desajustes entre lo que el problema pedía y la coordenada que elegiste. Y la quinta te convierte en experto: cómo seguir aprendiendo, leer el código de las librerías y mirar al futuro sin perder el norte.

⚔️ Descompón el estado en sus dos ejes
  1. Toma una herramienta de estado que uses a diario y responde por separado sus dos coordenadas: cómo propaga un cambio y qué reglas impone sobre la mutación.
  2. Busca en tu código un ejemplo real de cada una de las cuatro esquinas del plano, y si te falta alguna, razona por qué no aparece.
  3. Argumenta con un par concreto por qué más reactividad no implica más disciplina: nombra algo muy reactivo y poco disciplinado, y algo muy disciplinado y poco reactivo.
  4. Recupera el último bug de estado que depuraste y clasifícalo: ¿fue un fallo de propagación o un fallo de disciplina?
  5. Predice en qué punto del plano cae un store de signals con un reducer encima y justifica las dos coordenadas por separado.
  6. Escribe de memoria la teoría unificada en una sola frase; es la tesis del nivel y la usarás en las cuatro lecciones siguientes.