{"id":35895,"date":"2026-01-19T07:00:00","date_gmt":"2026-01-19T10:00:00","guid":{"rendered":"https:\/\/building.nu.com\/?p=35895"},"modified":"2026-01-27T11:13:16","modified_gmt":"2026-01-27T14:13:16","slug":"projetando-sistemas-reais-com-dados-imutaveis-em-clojure","status":"publish","type":"post","link":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/","title":{"rendered":"Projetando sistemas reais com dados imut\u00e1veis em Clojure"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Durante sua palestra no Clojure South, Alex Miller, Engenheiro de Software Principal no Nubank, abordou um problema que est\u00e1 no cerne do trabalho di\u00e1rio de todo desenvolvedor: as formas dolorosas como frequentemente lidamos com dados. Nossa ind\u00fastria est\u00e1 repleta de formatos fr\u00e1geis, objetos sobrecarregados com c\u00f3digo repetitivo (boilerplate) como getters e setters, e as complexidades onipresentes do estado mut\u00e1vel que exigem camada ap\u00f3s camada de prote\u00e7\u00e3o. Esse atrito n\u00e3o \u00e9 apenas uma d\u00edvida t\u00e9cnica; \u00e9 um imposto sobre nossa criatividade e nossa alegria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure oferece uma alternativa poderosa a esse paradigma. A linguagem coloca dados simples e imut\u00e1veis e fun\u00e7\u00f5es puras no centro de sua filosofia. Trata-se de uma forma fundamentalmente diferente de pensar sobre software, e n\u00e3o apenas uma sintaxe distinta. Ao adotar esse modelo, podemos construir modelos mentais mais limpos, mais matem\u00e1ticos e incrivelmente poderosos. Essa abordagem, como Alex demonstrou, leva a sistemas que n\u00e3o s\u00e3o apenas mais robustos, mas tamb\u00e9m mais prazerosos de criar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A jornada para essa maneira mais simples e poderosa de programar come\u00e7a ao repensarmos uma palavra que usamos todos os dias: &#8220;valor&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De volta ao b\u00e1sico: o que \u00e9 realmente um &#8220;valor&#8221;?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Embora a programa\u00e7\u00e3o envolva a manipula\u00e7\u00e3o de v\u00e1rias entidades, o poder de Clojure deriva de uma defini\u00e7\u00e3o rigorosa de &#8220;valores&#8221;. Essa distin\u00e7\u00e3o est\u00e1 longe de ser uma trivialidade sem\u00e2ntica; \u00e9 o princ\u00edpio central de design que confere \u00e0 linguagem sua eleg\u00e2ncia caracter\u00edstica. Neste contexto, um valor representa uma categoria espec\u00edfica de dados, definida por propriedades imut\u00e1veis que mudam a forma como raciocinamos sobre o estado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Segundo Alex, para que algo seja considerado um valor real, deve possuir quatro caracter\u00edsticas fundamentais:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Imut\u00e1vel<\/strong>: Um valor n\u00e3o pode ser alterado. O n\u00famero 100 n\u00e3o se torna magicamente 50. Uma vez criado, ele \u00e9 constante para todo o sempre.<\/li>\n\n\n\n<li><strong>Compar\u00e1vel<\/strong>: Voc\u00ea pode pegar dois valores e determinar se s\u00e3o iguais. Essa propriedade permite a ordena\u00e7\u00e3o, indexa\u00e7\u00e3o e o racioc\u00ednio sobre igualdade de forma direta.<\/li>\n\n\n\n<li><strong>Compartilh\u00e1vel<\/strong>: Um valor pode ser passado para outra thread, enviado por uma rede ou gravado no disco e lido de volta sem o medo de ser alterado. Sua integridade \u00e9 garantida.<\/li>\n\n\n\n<li><strong>Preciso<\/strong>: Para ser compartilh\u00e1vel e compar\u00e1vel, um valor deve ter uma representa\u00e7\u00e3o precisa e concreta \u2014 em \u00faltima an\u00e1lise, como uma sequ\u00eancia espec\u00edfica de bits.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esta defini\u00e7\u00e3o esclarece o que n\u00e3o \u00e9 um valor. Itens como sockets de rede, manipuladores de arquivos (file handles), streams e objetos mut\u00e1veis falham nesse teste.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A base: simplicidade em quatro cole\u00e7\u00f5es fundamentais<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se o Clojure South teve um protagonista silencioso, foi o humilde mapa (map). Isso n\u00e3o \u00e9 por acaso. Clojure rejeita deliberadamente um ecossistema disperso de tipos de cole\u00e7\u00e3o em favor de uma base pequena e poderosa de quatro estruturas fundamentais. Essa escolha estrat\u00e9gica de priorizar um conjunto m\u00ednimo de estruturas de dados promove uma imensa clareza e reutiliza\u00e7\u00e3o de c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure \u00e9 constru\u00edda sobre quatro tipos principais de cole\u00e7\u00e3o, cada um servindo a um prop\u00f3sito estrutural distinto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lists (Listas)<\/strong>: Cole\u00e7\u00f5es sequenciais onde os valores s\u00e3o adicionados eficientemente ao in\u00edcio.<\/li>\n\n\n\n<li><strong>Vectors (Vetores)<\/strong>: Cole\u00e7\u00f5es sequenciais indexadas, onde voc\u00ea pode acessar rapidamente qualquer elemento por sua posi\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong>Maps (Mapas)<\/strong>: Cole\u00e7\u00f5es n\u00e3o ordenadas de associa\u00e7\u00f5es chave-valor.<\/li>\n\n\n\n<li><strong>Sets (Conjuntos)<\/strong>: Cole\u00e7\u00f5es n\u00e3o ordenadas de valores \u00fanicos.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">O que torna essas cole\u00e7\u00f5es t\u00e3o poderosas n\u00e3o \u00e9 apenas o fato de serem imut\u00e1veis, mas sim que todas s\u00e3o acess\u00edveis atrav\u00e9s de um vocabul\u00e1rio \u00fanico e universal de fun\u00e7\u00f5es. Em muitas linguagens orientadas a objetos, &#8220;cada classe inventa uma nova linguagem&#8221;. Para obter o nome de um usu\u00e1rio, voc\u00ea chama user.getFirstName(); para o total de um pedido, order.getTotal(). Essa \u00e9 uma grande fonte de atrito; os desenvolvedores precisam constantemente trocar de contexto, aprendendo um novo &#8220;mini-protocolo&#8221; para cada objeto que encontram.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clojure rejeita essa complexidade sob medida. Em vez disso, a linguagem fornece um conjunto unificado de fun\u00e7\u00f5es \u2014 get, keys, vals, seq, count \u2014 que funcionam em todos os dados. Esse vocabul\u00e1rio comum reduz drasticamente a carga cognitiva. Como observou Alex Miller:<\/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\">\u201cAprenda a usar map, filter, remove e voc\u00ea saber\u00e1 como navegar por todo o seu conjunto de dados.\u201d  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Engenheiro de Software Principal no Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">As mesmas ferramentas funcionam em qualquer lugar, fazendo com que os dados pare\u00e7am pr\u00f3ximos, transparentes e f\u00e1ceis de remodelar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa linguagem comum para manipular dados \u00e9 a chave que desbloqueia o algoritmo central \u2014 e notavelmente simples \u2014 de Clojure para resolver problemas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O algoritmo central da programa\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No cora\u00e7\u00e3o da palestra, Alex apresentou o slide principal \u2014 um algoritmo simples de dois passos que resume toda a filosofia de desenvolvimento em Clojure. \u00c9 uma ideia t\u00e3o poderosa que pode remodelar fundamentalmente a maneira como se aborda a constru\u00e7\u00e3o 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\">&#8220;Existe um algoritmo muito simples para programar em Clojure: represente seu dom\u00ednio como dados e escreva fun\u00e7\u00f5es que transformam esses dados. S\u00f3 isso.&#8221; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Engenheiro de Software Principal no Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Este modelo de dois passos de &#8220;dados entram, dados saem&#8221; \u00e9 profundamente eficaz por v\u00e1rios motivos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Previs\u00edvel e Test\u00e1vel<\/strong>: Fun\u00e7\u00f5es puras que operam sobre valores imut\u00e1veis s\u00e3o a base da previsibilidade. Dada a mesma entrada, elas sempre produzir\u00e3o a mesma sa\u00edda, o que as torna triviais de raciocinar, testar isoladamente e depurar.<\/li>\n\n\n\n<li><strong>Compon\u00edvel<\/strong>: Fun\u00e7\u00f5es puras e pequenas s\u00e3o como blocos de Lego. Elas podem ser combinadas e compostas em fun\u00e7\u00f5es maiores e mais complexas que mant\u00eam as mesmas propriedades desej\u00e1veis de previsibilidade e testabilidade.<\/li>\n\n\n\n<li><strong>Seguro para Concorr\u00eancia<\/strong>: Ao eliminar o estado mut\u00e1vel compartilhado, este modelo evita toda uma classe de bugs de concorr\u00eancia notoriamente dif\u00edceis. N\u00e3o existem condi\u00e7\u00f5es de corrida (race conditions) ou impasses (deadlocks) quando as fun\u00e7\u00f5es est\u00e3o simplesmente transformando dados imut\u00e1veis.<\/li>\n\n\n\n<li><strong>Est\u00e1vel e Evolu\u00edvel<\/strong>: Sistemas constru\u00eddos desta forma s\u00e3o notavelmente est\u00e1veis e f\u00e1ceis de evoluir. Adicionar uma nova funcionalidade muitas vezes significa apenas adicionar uma nova chave a um mapa. As fun\u00e7\u00f5es existentes que n\u00e3o conhecem a nova chave continuar\u00e3o funcionando, completamente inalteradas. Isso permite que os sistemas cres\u00e7am por adi\u00e7\u00e3o, em vez de modifica\u00e7\u00e3o, reduzindo o risco de quebrar o c\u00f3digo existente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Isso pode soar elegante na teoria, mas seu verdadeiro poder fica claro quando aplicado a problemas do mundo real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De listas de tarefas a m\u00fasica: dados em a\u00e7\u00e3o&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para demonstrar o algoritmo central na pr\u00e1tica, Alex percorreu uma s\u00e9rie de exemplos diversos, mostrando como qualquer dom\u00ednio pode ser modelado como dados e manipulado com fun\u00e7\u00f5es.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Uma simples lista de tarefas<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Um item de uma lista de tarefas n\u00e3o \u00e9 um objeto com m\u00e9todos; \u00e9 simplesmente um mapa contendo chaves como :task (tarefa), :errand (recado) e :duration (dura\u00e7\u00e3o). O conselho de Miller aqui \u00e9 um pilar do design pragm\u00e1tico em 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\">&#8220;Tenha sempre uma camada de dados base que chegue ao fundo, e use mapas verbosos \u2014 voc\u00ea vai me agradecer depois.&#8221; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alex Miller, Engenheiro de Software Principal no Nubank<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A partir dessa base, surge um padr\u00e3o comum: escrever uma pequena fun\u00e7\u00e3o para lidar com um \u00fanico item e, em seguida, outra para lidar com a cole\u00e7\u00e3o. A tarefa de transformar itens de uma lista em HTML segue isso perfeitamente, com uma fun\u00e7\u00e3o convertendo um \u00fanico mapa em uma estrutura de dados Hiccup, e uma segunda aplicando essa fun\u00e7\u00e3o (mapping) sobre a cole\u00e7\u00e3o. Essa \u00eanfase em fun\u00e7\u00f5es pequenas e de prop\u00f3sito \u00fanico \u00e9 onipresente. Como observou Miller: &#8220;n\u00e3o \u00e9 incomum olhar para uma base de c\u00f3digo Clojure e ver que&#8230; o tamanho m\u00e9dio de uma fun\u00e7\u00e3o \u00e9 de cinco linhas&#8221;.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">O Jogo da Vida de Conway<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">A grade infinita do Jogo da Vida de Conway \u00e9 representada elegantemente n\u00e3o com uma matriz bidimensional massiva de zeros e uns, mas com uma representa\u00e7\u00e3o esparsa: um simples conjunto (set) contendo as coordenadas [x, y] das c\u00e9lulas &#8220;vivas&#8221;. Essa escolha de modelagem de dados \u00e9 incrivelmente poderosa. Toda a l\u00f3gica do jogo torna-se um pipeline de fun\u00e7\u00f5es puras que recebe um conjunto de coordenadas como entrada e produz o pr\u00f3ximo conjunto como sa\u00edda, implementando as regras do jogo com clareza matem\u00e1tica.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Gr\u00e1ficos e m\u00fasica como dados<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">O padr\u00e3o se estende at\u00e9 mesmo para dom\u00ednios criativos. Um c\u00edrculo em uma tela pode ser representado como um mapa com as chaves :x, :y, :radius (raio) e :color. Da mesma forma, uma nota musical pode ser um mapa com :pitch (tom), :octave (oitava) e :duration. Ao modelar essas entidades como dados, Alex Miller foi capaz de construir um mini-sintetizador no palco, usando uma sequ\u00eancia de mapas para tocar o ic\u00f4nico tema de cinco notas de &#8220;Contatos Imediatos do Terceiro Grau&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em todos os casos, a solu\u00e7\u00e3o foi encontrada n\u00e3o pelo design de hierarquias complexas de classes, mas perguntando primeiro: &#8220;Qual \u00e9 a estrutura de dados mais simples que pode representar este problema?&#8221;, e ent\u00e3o aplicando fun\u00e7\u00f5es simples e compos\u00e1veis para transform\u00e1-la.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Embora esse modelo cubra a grande maioria das tarefas de programa\u00e7\u00e3o, Clojure tamb\u00e9m oferece uma abordagem baseada em princ\u00edpios para os raros momentos em que os valores realmente precisam mudar ao longo do tempo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gerenciando mudan\u00e7as: uma abordagem baseada em princ\u00edpios para o estado<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Inevitavelmente, algumas partes de uma aplica\u00e7\u00e3o precisam mudar. A sess\u00e3o de um usu\u00e1rio, uma conex\u00e3o de banco de dados, o estado de um componente de interface \u2014 tudo isso exige o gerenciamento de mudan\u00e7as ao longo do tempo. Para esses cen\u00e1rios, o Clojure oferece uma resposta clara que evita o caos da mutabilidade n\u00e3o gerenciada. O objetivo \u00e9 criar uma &#8220;identidade l\u00f3gica est\u00e1vel que ter\u00e1 diferentes valores imut\u00e1veis ao longo do tempo&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O Clojure oferece um pequeno conjunto de construtos de estado para esse fim, principalmente atoms, refs e agents. Em vez de sofrerem muta\u00e7\u00e3o direta do valor que cont\u00eam, voc\u00ea fornece a eles uma fun\u00e7\u00e3o pura que calcula o pr\u00f3ximo estado a partir do atual. Esse design significa que os desenvolvedores n\u00e3o realizam travamentos manuais (locking); as leituras est\u00e3o sempre dispon\u00edveis sem coordena\u00e7\u00e3o, e as escritas s\u00e3o gerenciadas com seguran\u00e7a pelo runtime do Clojure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O que \u00e9 mais revelador \u00e9 como isso se desenrola na pr\u00e1tica. Quando o Clojure foi criado, seu sistema de Mem\u00f3ria Transacional de Software (STM), constru\u00eddo em torno de refs, era visto como um recurso fundamental. No entanto, ap\u00f3s anos de uso em produ\u00e7\u00e3o, uma verdade surpreendente surgiu. Como Miller observou, os desenvolvedores descobriram que &#8220;\u00e9 poss\u00edvel sobreviver com uma quantidade incrivelmente pequena de estado no seu sistema&#8221;. A abordagem disciplinada, priorizando os dados, leva naturalmente a arquiteturas onde a grande maioria do c\u00f3digo \u00e9 pura e sem estado, refor\u00e7ando a filosofia central da linguagem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o: construindo sobre a rocha, n\u00e3o sobre a areia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A mensagem central da palestra de Alex \u00e9 um chamado para o retorno \u00e0 simplicidade. A filosofia \u00e9 clara: construa sistemas sobre uma base de valores imut\u00e1veis e fun\u00e7\u00f5es puras, e gerencie o estado apenas quando for absolutamente necess\u00e1rio. Essa abordagem resulta em programas mais f\u00e1ceis de entender, evoluir e manter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Miller concluiu com uma met\u00e1fora poderosa que captura perfeitamente a diferen\u00e7a entre essa abordagem e os paradigmas convencionais, carregados de estados mut\u00e1veis. Seguir essa filosofia \u00e9 como &#8220;construir sobre a rocha em vez de construir sobre a areia&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A estabilidade e a clareza que adv\u00eam dessa base n\u00e3o s\u00e3o apenas conquistas t\u00e9cnicas; elas s\u00e3o a fonte de uma verdadeira satisfa\u00e7\u00e3o profissional. Isso permite que os desenvolvedores se concentrem em resolver problemas em vez de lutar contra a complexidade acidental de suas ferramentas. A ova\u00e7\u00e3o de p\u00e9 que Alex recebeu n\u00e3o foi apenas por uma palestra bem proferida, mas por articular uma filosofia que traz a alegria de volta ao of\u00edcio da programa\u00e7\u00e3o.<\/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\" title=\"YouTube video 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=pt-BR&#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>Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es<\/p>\n","protected":false},"author":178110103,"featured_media":35887,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_eb_attr":"","_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_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2497,2586],"tags":[],"class_list":["post-35895","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering-pt-br","category-software-engineering-pt-br"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Projetando sistemas reais com dados imut\u00e1veis em Clojure - Building Nubank<\/title>\n<meta name=\"description\" content=\"Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es\" \/>\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\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Projetando sistemas reais com dados imut\u00e1veis em Clojure - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-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:13:16+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=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/\"},\"author\":{\"name\":\"Nubank Editorial\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"headline\":\"Projetando sistemas reais com dados imut\u00e1veis em Clojure\",\"datePublished\":\"2026-01-19T10:00:00+00:00\",\"dateModified\":\"2026-01-27T14:13:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/\"},\"wordCount\":2084,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/\",\"url\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/\",\"name\":\"Projetando sistemas reais com dados imut\u00e1veis em Clojure - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-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:13:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"description\":\"Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-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\\\/pt-br\\\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Projetando sistemas reais com dados imut\u00e1veis em Clojure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#website\",\"url\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\",\"name\":\"Nubank Editorial\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\\\/pt-br\\\/author\\\/editorial\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Projetando sistemas reais com dados imut\u00e1veis em Clojure - Building Nubank","description":"Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es","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\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/","og_locale":"pt_BR","og_type":"article","og_title":"Projetando sistemas reais com dados imut\u00e1veis em Clojure - Building Nubank","og_description":"Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es","og_url":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/","og_site_name":"Building Nubank","article_published_time":"2026-01-19T10:00:00+00:00","article_modified_time":"2026-01-27T14:13:16+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","Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/#article","isPartOf":{"@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/"},"author":{"name":"Nubank Editorial","@id":"https:\/\/building.nu.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"headline":"Projetando sistemas reais com dados imut\u00e1veis em Clojure","datePublished":"2026-01-19T10:00:00+00:00","dateModified":"2026-01-27T14:13:16+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/"},"wordCount":2084,"commentCount":0,"image":{"@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-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":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/","url":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/","name":"Projetando sistemas reais com dados imut\u00e1veis em Clojure - Building Nubank","isPartOf":{"@id":"https:\/\/building.nu.com\/pt-br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/#primaryimage"},"image":{"@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-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:13:16+00:00","author":{"@id":"https:\/\/building.nu.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"description":"Li\u00e7\u00f5es sobre a modelagem de estado, mudan\u00e7a e complexidade com valores e fun\u00e7\u00f5es","breadcrumb":{"@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/building.nu.com\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-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\/pt-br\/projetando-sistemas-reais-com-dados-imutaveis-em-clojure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nu.com\/pt-br\/"},{"@type":"ListItem","position":2,"name":"Projetando sistemas reais com dados imut\u00e1veis em Clojure"}]},{"@type":"WebSite","@id":"https:\/\/building.nu.com\/pt-br\/#website","url":"https:\/\/building.nu.com\/pt-br\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nu.com\/pt-br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/building.nu.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4","name":"Nubank Editorial","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/pt-br\/author\/editorial\/"}]}},"jetpack_likes_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-9kX","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\/pt-br\/wp-json\/wp\/v2\/posts\/35895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/users\/178110103"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/comments?post=35895"}],"version-history":[{"count":6,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts\/35895\/revisions"}],"predecessor-version":[{"id":36092,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts\/35895\/revisions\/36092"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/media\/35887"}],"wp:attachment":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/media?parent=35895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/categories?post=35895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/tags?post=35895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}