Por que decidi aprender (e ensinar) Clojure
Tags: clojure, functional, java
Published: 2021-10-26 15:35:31

Em 2017 comecei a me aprofundar no universo da Programação Funcional. Este paradigma já ganhava bastante popularidade e cada vez mais as principais linguagens de programação orientadas a objetos incluíam recursos inspirados neste paradigma, inclusive a linguagem que eu mais utilizava: Java.

Após o lançamento da versão 8 da JDK, em março de 2014, passou a ser cada vez mais comum ouvir as pessoas desenvolvedoras Java usando termos como: programação funcional, _streams_, _optional_, _map_, _flat map_, etc. Mas muitas pessoas em meu entorno ainda ignoravam estes novos recurso e, confesso, demorei para adotar essas novidades. As ideias pareciam muita interessantes, mas colocá-las em prática se mostrou mais difícil do que eu esperava.

Depois de muita tentativa e erro, resolvi me aprofundar nos conceitos. O livro [Functional Thinking](https://www.oreilly.com/library/view/functional-thinking/9781449365509/) me ajudou a dar os primeiros passos na direção correta.

Em paralelo decidi que iria aprender uma linguagem funcional mais pura ao invés de tentar aplicar o paradigma funcional em uma linguagem orientada a objetos. Depois de pesquisar bastante, optei por aprender [Elm](https://elm-lang.org). O fato de ser uma linguagem funcional pura e imutável me chamou atenção. Alem disso, ela é focada no desenvolvimento de _webapps_ e, até então, eu não havia encontrado nenhuma solução para desenvolvimento de páginas web que me agradasse. 

Depois de passar por todo [Guia de introdução à linguagem Elm](https://guide.elm-lang.org) e ler o livro [Elm in Action](https://www.manning.com/books/elm-in-action), já me sentia bastante confortável em desenvolver _webapps_ neste paradigma. Gostei tanto de Elm que iniciei um projeto para ensinar programação para iniciantes usando esta linguagem e disponibilizei as primeiras aulas no site [elm.dev.br](https://elm.dev.br). 

Mas havia um problema sério que ainda precisava encarar: Elm é uma linguagem concebida para desenvolvimento de _webapps_ e funciona muito bem para isso, mas eu buscava uma solução de uso geral, que pudesse ser utilizada também no desenvolvimento de _backends_. Por isso voltei a estudar as alternativas.

Elm é uma linguagem estaticamente tipada e inspirada em [Haskell](https://www.haskell.org). O passo natural seria utilizar Elm no _frontend_ e Haskell no _backend_. E foi o que tentei fazer. Li com certa dificuldade o livro _Learn You a Haskell for Great Good!_ (disponível gratuitamente [aqui](http://learnyouahaskell.com)) e aprendi muita coisa legal. Mas criar um _backend_ completo usando Haskell mostrou-se um passo maior do que eu conseguiria dar naquele momento. Resolvi então procurar outras alternativas...

Durante todo esse processo a palavra [Lisp](https://pt.wikipedia.org/wiki/Lisp) não saía da minha cabeça! De tempos em tempos esbarrava em algum vídeo de alguma pessoa influente na comunidade falando sobre ela (como [este vídeo](https://www.youtube.com/watch?v=Uooh0Y9fC_M#t=4876ab_channel=IGN) ou [este twit](https://twitter.com/ID_AA_Carmack/status/577877590070919168) do [John Carmack](https://pt.wikipedia.org/wiki/John_Carmack), fundador da _id Software_). Parecia algo místico. E o fato do [Nubank ter adotado Clojure](https://building.nubank.com.br/working-with-clojure-at-nubank) trouxe um estudo de caso bastante real e pragmático do uso de um dialeto de Lisp no Brasil. 

Até então estava postergando estudá-la pois estava priorizando linguagens estaticamente tipadas e os dialetos mais famosos de Lisp são linguagens dinâmicas. Mas no começo de 2021 resolvi finalmente dar uma chance. Escolhi a linguagem [Clojure](https://clojure.org|Clojure) e comecei a ler o livro [Getting Clojure](https://pragprog.com/titles/roclojure/getting-clojure). Ao contrário dos meus estudos de Haskell, consegui ler este livro em poucos dias! Em paralelo comecei a fazer as aulas da [Formação Clojure da Alura](https://www.alura.com.br/formacao-clojure), que me ajudaram a ver mais na prática como programar nesta linguagem. Foi uma boa combinação: no livro eu aprendia mais a fundo os conceitos da linguagem e no curso revisava estes conceitos e aprendia a parte um pouco mais prática.

## Principais características de Clojure

Lisp não é uma linguagem de programação, mas uma família de linguagens com diversos *dialetos*. Os dialetos mais famosos incluem a [Common Lisp](https://lisp-lang.org), [Clojure](https://clojure.org), [Scheme](https://groups.csail.mit.edu/mac/projects/scheme) e [Racket](https://racket-lang.org). Desta forma, após decidir que iria aprender Lisp, precisaria escolher um de seus dialetos.

[Clojure](https://clojure.org) se destacou para mim por duas razões:  
- ela utiliza a máquina virtual do Java, possibilitando interoperabilidade com aplicações Java (que como disse no início do artigo, é a linguagem que costumo utilizar no _backend_).
- ela utiliza predominantemente o paradigma funcional. Alguns dialetos de Lisp (como o Common Lisp, por exemplo) são multiparadigma, mas como minha intenção era me aprofundar no universo da programação funcional, fazia mais sentido adotar um dialeto que desse preferência para este paradigma.

A experiência de programar em Clojure foi bastante libertadora. Praticar [TDD](https://pt.wikipedia.org/wiki/Test-driven_development) junto com o [REPL Driven Development](https://practical.li/clojure/repl-driven-devlopment.html) (técnica bastante difundida dentro da
comunidade Clojure) faz com que o ciclo de _feedback_ seja muito rápido. O fato de Clojure ser uma linguagem dinâmica também contribui para isso.

Outra característica de Clojure é ser uma linguagem *impura*, ou seja, podemos efetuar *efeitos colaterais* a qualquer momento. A principal vantagem disso é que torna a linguagem mais fácil de aprender (embora traga junto uma série de outros problemas que não acontecem em linguagens mais puras, como Elm ou Haskell). Escrevi [um artigo sobre Funções Puras](https://segunda.tech/posts/2019-08-26-funcoes-puras) onde explico melhor este tema. Também [gravei um vídeo](https://www.youtube.com/watch?v=QenAR_3XtXU&t=1189s&ab_channel=segunda.tech) explicando o que são Função Puras.

Embora seja uma linguagem impura, ela incentiva uma série de boas práticas que fazem com que os potenciais problemas dessa abordagem sejam significativamente reduzidos.

## Como dar os primeiros passos em Clojure

Todas essas características que citei ao longo do artigo fazem com que Clojure, embora tenha uma aparência um pouco intimidadora no começo, seja na verdade bastante fácil de utilizar. Por isso escolhi também esta linguagem para compartilhar com outras pessoas desenvolvedoras os fundamentos básicos da *programação funcional*. 

Para quem gosta de livros, recomendo iniciar pelo [Getting Clojure](https://pragprog.com/titles/roclojure/getting-clojure), que como disse é uma ótima forma de entender os princípios básicos por trás do Clojure, ou se preferir uma opção gratuita pode começar pela versão online do livro [Clojure for Brave and True](https://www.braveclojure.com). Outra opção mais focada nos fundamentos do paradigma e que aborda outras linguagens além de Clojure é o livro [Functional Thinking](https://www.oreilly.com/library/view/functional-thinking/9781449365509/), do Neal Ford. Gravei um [podcast](https://segunda.tech/posts/2019-06-17-functional-thinking) onde falo um pouco sobre esta obra. Estes 3 livros são em inglês. Se quiser uma leitura em português a editora Casa do Código tem disponível o livro [Programação Funcional: Uma introdução em Clojure](https://www.casadocodigo.com.br/products/livro-programacao-funcional-clojure).

Se preferir estudar através de *cursos _online_*, você pode se inscrever no meu curso [Clojure: Introdução à Programação Funcional](https://segundatech.teachable.com).

-----
E você, qual seu paradigma preferido? Já tentou programar utilizando o paradigma funcional? Quais foram suas principais dificuldades? Compartilhe suas experiências nos comentários!

Se você gostou deste texto talvez goste dos meus outros artigos, vídeos e podcasts disponíveis em [segunda.tech](segunda.tech).