{"id":35901,"date":"2026-01-19T07:00:00","date_gmt":"2026-01-19T10:00:00","guid":{"rendered":"https:\/\/building.nu.com\/?p=35901"},"modified":"2026-01-27T11:43:32","modified_gmt":"2026-01-27T14:43:32","slug":"diseno-de-sistemas-reales-con-datos-inmutables-en-clojure","status":"publish","type":"post","link":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/","title":{"rendered":"Dise\u00f1o de sistemas reales con datos inmutables en Clojure"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Durante su charla en Clojure South, Alex Miller, Ingeniero Principal de Software en Nubank, abord\u00f3 un problema que est\u00e1 en el coraz\u00f3n del trabajo diario de todo desarrollador: las formas tan dolorosas en las que solemos manejar los datos. Nuestra industria est\u00e1 plagada de formatos fr\u00e1giles, objetos cargados de c\u00f3digo repetitivo (como getters y setters) y las constantes complejidades del estado mutable que exigen capa tras capa de protecci\u00f3n. Esta fricci\u00f3n no es solo deuda t\u00e9cnica; es un impuesto a nuestra creatividad y a nuestro entusiasmo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure ofrece una alternativa poderosa a este paradigma. Coloca los datos simples e inmutables y las funciones puras en el n\u00facleo mismo de su filosof\u00eda. Se trata de una forma de pensar el software fundamentalmente distinta, m\u00e1s all\u00e1 de ser solo una sintaxis diferente. Al adoptar este modelo, podemos construir modelos mentales m\u00e1s limpios, m\u00e1s matem\u00e1ticos e incre\u00edblemente poderosos. Este enfoque, como demostr\u00f3 Alex, conduce a sistemas que no solo son m\u00e1s robustos, sino tambi\u00e9n m\u00e1s gratificantes de crear.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El camino hacia esta forma de programar m\u00e1s simple y potente comienza por repensar una palabra que usamos todos los d\u00edas: \u00abvalor\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Volviendo a lo b\u00e1sico: \u00bfqu\u00e9 es realmente un \u00abvalor\u00bb?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque la programaci\u00f3n implica manipular diversas entidades, el poder de Clojure proviene de una definici\u00f3n rigurosa de los \u00abvalores\u00bb. Esta distinci\u00f3n est\u00e1 lejos de ser una trivialidad sem\u00e1ntica; es el principio de dise\u00f1o central que le otorga al lenguaje su elegancia caracter\u00edstica. En este contexto, un valor representa una categor\u00eda espec\u00edfica de datos, definida por propiedades inmutables que cambian la forma en que razonamos sobre el estado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seg\u00fan Alex, para que algo sea considerado un verdadero valor, debe poseer cuatro caracter\u00edsticas clave:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inmutable<\/strong>: Un valor no se puede cambiar. El n\u00famero 100 no se convierte m\u00e1gicamente en 50. Una vez creado, es constante para siempre.<\/li>\n\n\n\n<li><strong>Comparable<\/strong>: Puedes tomar dos valores y determinar si son iguales. Esta propiedad permite ordenar, indexar y razonar sobre la igualdad de forma directa.<\/li>\n\n\n\n<li><strong>Compartible<\/strong>: Un valor se puede pasar a otro hilo de ejecuci\u00f3n, enviar por una red o escribir en un disco y volver a leerlo sin temor a que sea alterado. Su integridad est\u00e1 garantizada.<\/li>\n\n\n\n<li><strong>Preciso<\/strong>: Para ser compartible y comparable, un valor debe tener una representaci\u00f3n concreta y precisa; en \u00faltima instancia, como una secuencia espec\u00edfica de bits.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esta definici\u00f3n aclara qu\u00e9 no es un valor. Cosas como los sockets de red, los manejadores de archivos (file handles), los streams y los objetos mutables no pasan esta prueba.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u00abEsas cosas no son valores&#8230; No puedes compararlas ni escribirlas con precisi\u00f3n\u00bb. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Ingeniero Principal de Software en Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Son procesos o recursos, no hechos. Aqu\u00ed existe una distinci\u00f3n sutil pero importante: la ruta de un archivo (file path) puede tratarse como un valor, ya que es una descripci\u00f3n inmutable y precisa. Sin embargo, un manejador de archivos, que representa una conexi\u00f3n activa a un recurso cambiante, no puede serlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los beneficios de la inmutabilidad<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adoptar la inmutabilidad para todos los valores, incluyendo las colecciones, tiene consecuencias profundas que simplifican enormemente el dise\u00f1o de sistemas:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin necesidad de bloqueos (locks) para lectura: Dado que un valor nunca cambia, puedes leerlo desde cualquier n\u00famero de hilos sin necesidad de bloqueos o sincronizaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compartir sin miedo: Puedes pasar estructuras de datos libremente entre procesos concurrentes o sistemas distribuidos, con la confianza de que est\u00e1s compartiendo informaci\u00f3n y no una fuente potencial de errores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cach\u00e9 e historial sin esfuerzo: El almacenamiento en cach\u00e9 se vuelve trivial cuando los datos nunca cambian. Tambi\u00e9n permite funciones potentes como pilas de \u00abdeshacer\u00bb (undo) o depuraci\u00f3n de \u00abviaje en el tiempo\u00bb, ya que simplemente puedes mantener referencias a estados anteriores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este dise\u00f1o no est\u00e1 exento de costos; es una elecci\u00f3n de ingenier\u00eda consciente hecha para obtener beneficios inmensos.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u00abEstas son propiedades asombrosas. No son gratis&#8230; pero la inmutabilidad definitivamente vale el precio que pagas por ella\u00bb. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Ingeniero Principal de Software en Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Esta poderosa filosof\u00eda no es solo para n\u00fameros individuales o cadenas de texto; en Clojure, se extiende a las colecciones mismas que estructuran nuestros datos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La base fundamental: simplicidad en cuatro colecciones principales<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si Clojure South tuvo un protagonista silencioso, fue el humilde mapa. Esto no es casualidad. Clojure rechaza deliberadamente un ecosistema disperso de tipos de colecciones en favor de una base peque\u00f1a y poderosa de cuatro estructuras fundamentales. Esta elecci\u00f3n estrat\u00e9gica de priorizar un conjunto m\u00ednimo de estructuras de datos fomenta una reutilizaci\u00f3n y claridad inmensas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure se basa en cuatro tipos de colecciones primarias, cada una con un prop\u00f3sito estructural distinto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Listas<\/strong>: Colecciones secuenciales donde los valores se agregan eficientemente al principio.<\/li>\n\n\n\n<li><strong>Vectores<\/strong>: Colecciones secuenciales indexadas donde puedes acceder r\u00e1pidamente a cualquier elemento por su posici\u00f3n.<\/li>\n\n\n\n<li><strong>Mapas<\/strong>: Colecciones desordenadas de asociaciones clave-valor.<\/li>\n\n\n\n<li><strong>Conjuntos (Sets)<\/strong>: Colecciones desordenadas de valores \u00fanicos.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Lo que hace que estas colecciones sean tan poderosas no es solo que son inmutables, sino que todas son accesibles a trav\u00e9s de un vocabulario \u00fanico y universal de funciones. En muchos lenguajes orientados a objetos, \u00abcada clase inventa un nuevo lenguaje\u00bb. Para obtener el nombre de un usuario, llamas a user.getFirstName(); para el total de un pedido, order.getTotal(). Esta es una fuente importante de fricci\u00f3n: los desarrolladores deben cambiar de contexto constantemente, aprendiendo un nuevo mini-protocolo para cada objeto que encuentran.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure rechaza esta complejidad personalizada. En su lugar, proporciona un conjunto unificado de funciones \u2014get, keys, vals, seq, count\u2014 que funcionan con todos los datos. Este vocabulario com\u00fan reduce dr\u00e1sticamente la carga cognitiva. Como se\u00f1al\u00f3 Alex Miller, una vez que:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u00abAprendes a usar map, filter y remove, ya sabes c\u00f3mo navegar por todo tu conjunto de datos\u00bb.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Ingeniero Principal de Software en Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Las mismas herramientas funcionan en todas partes, haciendo que los datos se sientan cercanos, transparentes y f\u00e1ciles de transformar. Este lenguaje com\u00fan para manipular datos es la llave que desbloquea el algoritmo central, y notablemente simple, de Clojure para resolver problemas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El algoritmo central de la programaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En el coraz\u00f3n mismo de la charla, Alex present\u00f3 la diapositiva clave: un algoritmo simple de dos pasos que resume toda la filosof\u00eda de desarrollo de Clojure. Es una idea tan poderosa que puede transformar fundamentalmente la manera en que uno aborda la construcci\u00f3n de software.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u00abExiste un algoritmo muy simple para programar en Clojure: representa tu dominio como datos y escribe funciones que transformen esos datos. Eso es todo\u00bb.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Ingeniero Principal de Software en Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Este modelo de dos pasos de \u00abdatos entran, datos salen\u00bb es profundamente eficaz por varias razones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Predecible y testeable<\/strong>: Las funciones puras que operan sobre valores inmutables son la base de la predictibilidad. Dado el mismo aporte (input), siempre producir\u00e1n el mismo resultado (output), lo que hace que sea trivial razonar sobre ellas, probarlas de forma aislada y depurarlas.<\/li>\n\n\n\n<li><strong>Composable (Combinable)<\/strong>: Las funciones puras y peque\u00f1as son como piezas de Lego. Pueden combinarse y componerse en funciones m\u00e1s grandes y complejas que conservan las mismas propiedades deseables de predictibilidad y capacidad de prueba.<\/li>\n\n\n\n<li><strong>Seguro para la concurrencia<\/strong>: Al eliminar el estado mutable compartido, este modelo evita toda una clase de errores de concurrencia notoriamente dif\u00edciles. No existen condiciones de carrera (race conditions) ni bloqueos mutuos (deadlocks) cuando las funciones simplemente est\u00e1n transformando datos inmutables.<\/li>\n\n\n\n<li><strong>Estable y evolutivo<\/strong>: Los sistemas construidos de esta manera son notablemente estables y f\u00e1ciles de evolucionar. Agregar una nueva funcionalidad a menudo solo significa agregar una nueva clave a un mapa. Las funciones existentes que no conocen la nueva clave seguir\u00e1n funcionando sin verse afectadas en absoluto. Esto permite que los sistemas crezcan por adici\u00f3n en lugar de por modificaci\u00f3n, reduciendo el riesgo de romper el c\u00f3digo existente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esto puede sonar elegante en teor\u00eda, pero su verdadero poder se vuelve evidente cuando se aplica a problemas del mundo real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De listas de tareas a la m\u00fasica: datos en acci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para demostrar el algoritmo central en la pr\u00e1ctica, Alex present\u00f3 una serie de ejemplos diversos, mostrando c\u00f3mo cualquier dominio puede ser modelado como datos y manipulado mediante funciones.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Una lista de tareas simple<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Una tarea no es un objeto con m\u00e9todos; es simplemente un mapa que contiene claves como :task (tarea), :errand (recado) y :duration (duraci\u00f3n). El consejo de Miller aqu\u00ed es una piedra angular del dise\u00f1o pragm\u00e1tico en Clojure:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u00abTen siempre una capa de datos base que llegue al fondo y usa mapas descriptivos; me lo agradecer\u00e1s despu\u00e9s\u00bb. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Ingeniero Principal de Software en Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A partir de esta base, surge un patr\u00f3n com\u00fan: escribir una funci\u00f3n peque\u00f1a para manejar un solo elemento y luego otra para manejar la colecci\u00f3n. La tarea de transformar elementos de una lista en HTML sigue esto a la perfecci\u00f3n, con una funci\u00f3n que convierte un solo mapa en una estructura de datos de Hiccup, y una segunda que aplica esa funci\u00f3n (mapping) sobre una colecci\u00f3n. Este \u00e9nfasis en funciones peque\u00f1as de prop\u00f3sito \u00fanico es omnipresente. Como observ\u00f3 Miller: \u00abno es raro mirar un c\u00f3digo base de Clojure y ver que&#8230; el tama\u00f1o promedio de una funci\u00f3n es de cinco l\u00edneas\u00bb.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">El Juego de la Vida de Conway<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">La cuadr\u00edcula infinita del Juego de la Vida de Conway se representa elegantemente no con una matriz masiva bidimensional de ceros y unos, sino con una representaci\u00f3n dispersa: un conjunto (set) simple que contiene las coordenadas [x, y] de las celdas \u00abvivas\u00bb. Esta elecci\u00f3n de modelado de datos es incre\u00edblemente poderosa. Toda la l\u00f3gica del juego se convierte en un flujo (pipeline) de funciones puras que recibe un conjunto de coordenadas como entrada y produce el siguiente conjunto como salida, implementando las reglas del juego con claridad matem\u00e1tica.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Gr\u00e1ficos y m\u00fasica como datos<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">El patr\u00f3n se extiende incluso a dominios creativos. Un c\u00edrculo en una pantalla puede representarse como un mapa con las claves :x, :y, :radius y :color. Del mismo modo, una nota musical puede ser un mapa con :pitch (tono), :octave (octava) y :duration. Al modelar estas entidades como datos, Alex Miller pudo construir un mini-sintetizador en el escenario, utilizando una secuencia de mapas para tocar el ic\u00f3nico tema de cinco notas de \u00abEncuentros cercanos del tercer tipo\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En cada caso, la soluci\u00f3n no se encontr\u00f3 dise\u00f1ando jerarqu\u00edas de clases complejas, sino pregunt\u00e1ndose primero: \u00ab\u00bfCu\u00e1l es la estructura de datos m\u00e1s simple que puede representar este problema?\u00bb, y luego aplicando funciones simples y combinables para transformarla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si bien este modelo cubre la gran mayor\u00eda de las tareas de programaci\u00f3n, Clojure tambi\u00e9n proporciona un enfoque basado en principios para esos raros momentos en los que los valores realmente necesitan cambiar con el tiempo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gestionando cambios: un enfoque basado en principios para el estado<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Inevitablemente, algunas partes de una aplicaci\u00f3n necesitan cambiar. La sesi\u00f3n de un usuario, una conexi\u00f3n de base de datos, el estado de un componente de interfaz; todo esto requiere gestionar cambios a lo largo del tiempo. Para estos escenarios, Clojure ofrece una respuesta clara que evita el caos de la mutabilidad no gestionada. El objetivo es crear una \u00abidentidad l\u00f3gica estable que tendr\u00e1 diferentes valores inmutables a lo largo del tiempo\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure ofrece un conjunto peque\u00f1o de constructos de estado para este fin, principalmente atoms, refs y agents. En lugar de mutar directamente el valor que contienen, se les proporciona una funci\u00f3n pura que calcula el pr\u00f3ximo estado a partir del actual. Este dise\u00f1o significa que los desarrolladores no realizan bloqueos manuales (locking); las lecturas siempre est\u00e1n disponibles sin coordinaci\u00f3n y las escrituras son gestionadas de forma segura por el entorno de ejecuci\u00f3n (runtime) de Clojure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo m\u00e1s revelador es c\u00f3mo esto se aplica en la pr\u00e1ctica. Cuando se cre\u00f3 Clojure, su sistema de Memoria Transaccional de Software (STM), construido alrededor de las refs, era visto como una caracter\u00edstica fundamental. Sin embargo, tras a\u00f1os de uso en producci\u00f3n, surgi\u00f3 una verdad sorprendente. Como observ\u00f3 Miller, los desarrolladores descubrieron que \u00abes posible sobrevivir con una cantidad incre\u00edblemente peque\u00f1a de estado en tu sistema\u00bb. El enfoque disciplinado, que prioriza los datos, conduce naturalmente a arquitecturas donde la gran mayor\u00eda del c\u00f3digo es puro y sin estado, reforzando la filosof\u00eda central del lenguaje.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n: construir sobre la roca, no sobre la arena<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El mensaje central de la charla de Alex es un llamado al retorno a la simplicidad. La filosof\u00eda es clara: construye sistemas sobre una base de valores inmutables y funciones puras, y gestiona el estado solo cuando sea absolutamente necesario. Este enfoque da como resultado programas m\u00e1s f\u00e1ciles de entender, evolucionar y mantener.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Miller concluy\u00f3 con una met\u00e1fora poderosa que captura perfectamente la diferencia entre este enfoque y los paradigmas convencionales, cargados de estados mutables. Seguir esta filosof\u00eda es como \u00abconstruir sobre la roca en lugar de construir sobre la arena\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La estabilidad y la claridad que surgen de esta base no son solo logros t\u00e9cnicos; son la fuente de una verdadera satisfacci\u00f3n profesional. Esto permite que los desarrolladores se concentren en resolver problemas en lugar de luchar contra la complejidad accidental de sus herramientas. La ovaci\u00f3n de pie que recibi\u00f3 Alex no fue solo por una charla bien ejecutada, sino por articular una filosof\u00eda que devuelve la alegr\u00eda al oficio de la programaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/vKyJfLFLJ14?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es-ES&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones<\/p>\n","protected":false},"author":178110103,"featured_media":35888,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2499,2589],"tags":[],"class_list":["post-35901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering-es","category-software-engineering-es"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dise\u00f1o de sistemas reales con datos inmutables en Clojure - Building Nubank<\/title>\n<meta name=\"description\" content=\"Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dise\u00f1o de sistemas reales con datos inmutables en Clojure - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/\" \/>\n<meta property=\"og:site_name\" content=\"Building Nubank\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-19T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-27T14:43:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858-1024x683.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Nubank Editorial\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nubank Editorial\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/\"},\"author\":{\"name\":\"Nubank Editorial\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"headline\":\"Dise\u00f1o de sistemas reales con datos inmutables en Clojure\",\"datePublished\":\"2026-01-19T10:00:00+00:00\",\"dateModified\":\"2026-01-27T14:43:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/\"},\"wordCount\":2348,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/Nubank-858.jpg?fit=3120%2C2080&ssl=1\",\"articleSection\":[\"Engineering\",\"Software Engineering\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/\",\"url\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/\",\"name\":\"Dise\u00f1o de sistemas reales con datos inmutables en Clojure - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/Nubank-858.jpg?fit=3120%2C2080&ssl=1\",\"datePublished\":\"2026-01-19T10:00:00+00:00\",\"dateModified\":\"2026-01-27T14:43:32+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"description\":\"Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/Nubank-858.jpg?fit=3120%2C2080&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/Nubank-858.jpg?fit=3120%2C2080&ssl=1\",\"width\":3120,\"height\":2080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nu.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dise\u00f1o de sistemas reales con datos inmutables en Clojure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/building.nu.com\\\/es\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nu.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\",\"name\":\"Nubank Editorial\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"caption\":\"Nubank Editorial\"},\"url\":\"https:\\\/\\\/building.nu.com\\\/es\\\/author\\\/editorial\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dise\u00f1o de sistemas reales con datos inmutables en Clojure - Building Nubank","description":"Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/","og_locale":"es_ES","og_type":"article","og_title":"Dise\u00f1o de sistemas reales con datos inmutables en Clojure - Building Nubank","og_description":"Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones","og_url":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/","og_site_name":"Building Nubank","article_published_time":"2026-01-19T10:00:00+00:00","article_modified_time":"2026-01-27T14:43:32+00:00","og_image":[{"width":1024,"height":683,"url":"https:\/\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858-1024x683.jpg","type":"image\/jpeg"}],"author":"Nubank Editorial","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Nubank Editorial","Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#article","isPartOf":{"@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/"},"author":{"name":"Nubank Editorial","@id":"https:\/\/building.nu.com\/es\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"headline":"Dise\u00f1o de sistemas reales con datos inmutables en Clojure","datePublished":"2026-01-19T10:00:00+00:00","dateModified":"2026-01-27T14:43:32+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/"},"wordCount":2348,"commentCount":0,"image":{"@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858.jpg?fit=3120%2C2080&ssl=1","articleSection":["Engineering","Software Engineering"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/","url":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/","name":"Dise\u00f1o de sistemas reales con datos inmutables en Clojure - Building Nubank","isPartOf":{"@id":"https:\/\/building.nu.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#primaryimage"},"image":{"@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858.jpg?fit=3120%2C2080&ssl=1","datePublished":"2026-01-19T10:00:00+00:00","dateModified":"2026-01-27T14:43:32+00:00","author":{"@id":"https:\/\/building.nu.com\/es\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"description":"Lecciones sobre el modelado de estado, cambio y complejidad con valores y funciones","breadcrumb":{"@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#primaryimage","url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858.jpg?fit=3120%2C2080&ssl=1","contentUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858.jpg?fit=3120%2C2080&ssl=1","width":3120,"height":2080},{"@type":"BreadcrumbList","@id":"https:\/\/building.nu.com\/es\/diseno-de-sistemas-reales-con-datos-inmutables-en-clojure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nu.com\/es\/"},{"@type":"ListItem","position":2,"name":"Dise\u00f1o de sistemas reales con datos inmutables en Clojure"}]},{"@type":"WebSite","@id":"https:\/\/building.nu.com\/es\/#website","url":"https:\/\/building.nu.com\/es\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nu.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/building.nu.com\/es\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4","name":"Nubank Editorial","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","caption":"Nubank Editorial"},"url":"https:\/\/building.nu.com\/es\/author\/editorial\/"}]}},"jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-9l3","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/01\/Nubank-858.jpg?fit=3120%2C2080&ssl=1","_links":{"self":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts\/35901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/users\/178110103"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/comments?post=35901"}],"version-history":[{"count":8,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts\/35901\/revisions"}],"predecessor-version":[{"id":36097,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts\/35901\/revisions\/36097"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/media\/35888"}],"wp:attachment":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/media?parent=35901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/categories?post=35901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/tags?post=35901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}