O que acham da linguagem Clojure e programação funcional? A linguagem é complicada? É boa de se trabalhar?
Uma linguagem bacana. Sem muito uso ainda, mas bacana.
Um paradigma interessante.
Se você não está acostumado, toda linguagem é complicada.
Só conheço um caso de sucesso, o Nubank. Recomendo o Hipsters.tech #1.
Fantásticos. As estruturas de dados imutáveis e as primitivas de multithread do Clojure são fenomenais. Eu achava que sabia o que era programação funcional, mas quando comecei a mexer com Clojure vi que não sabia de nada. O esforço mental que temos que fazer para entender conceitos como Estado x Identidade, referential transparency, homoiconicity, e outros é considerável, mas aprender isso nos dá um domínio muito maior sobre a programação num geral, não só em paradigmas funcionais.
Outro aspecto muito massa da linguagem é o mecanismo de macros. Como a linguagem é escrita como uma estrutura de dados que a própria linguagem sabe interpretar, você consegue escrever código que gera código, de forma recursiva. Isso faz com que você possa adicionar funcionalidade à linguagem sem precisar de um patch, apenas com código mesmo, em runtime.
A curiosidade para dominar esse paradigma acabou me levando a estudar um monte de fundamentos que eu nem fazia noção que existiam. Acabei chegando no Structure and Interpretation of Computer Programs, o melhor livro de programação que já li.
A comunidade é extremamente amigavel. Tem um Slack chamado “Clojurians”, onde sempre tem gente disposta a ajudar iniciantes e experientes.
Outro detalhe importante é que Clojure é uma linguagem “hospedada”. Ela roda ja JVM, no Browser (ClojureScript) ou no runtime do C#. A vantagem disso é que você consegue misturar código clojure com Java, por exemplo, usando as bibliotecas do Java no Clojure e vice-versa.
Clojure é um dialeto de LISP. A sintaxe dessas linguagens é extremamente simples. Não existem, por exemplo, ambiguidades de precedência de operadores, nem sintaxes especiais de nenuhm tipo: são só parêntesis, funções e valores. É meio difícil reaprender a programar dessa forma quando estamos acostumados com as sintaxes de linguagens como C, Java, etc., mas é só persistir por um tempinho que vira algo natural.
É uma das linguagens mais fáceis e produtivas que já usei até hoje. Você abre o editor, sobe um REPL integrado com o próprio editor e sai escrevendo código e testando “ao vivo” (sem precisar compilar).
Tem ferramentas de TDD, como o Midje, que ficam observando o diretório do projeto e toda vez que você faz alguma alteração no código, elas rodam todos os unit tests que estão relacionados com a mudança que você fez. É o ciclo de feedback mais rápido que vi até hoje, e esse é um dos maiores elogios que o pessoal que usa a linguagem cita.
Cara, tem muita coisa legal. O criador da linguagem é um gênio, tem várias palestras dele no youtube sobre vários temas diferentes. Dá pra aprender muito com ele. O pior que vai acontecer se você aprender a programar em Clojure é que você vai se tornar um programador melhor.
Tem várias empresas no mundo contratando programadores Clojure full-time (https://clojure.org/community/companies). No Brasil a maior é o NuBank. Eu uso no dia a dia pra automatizar minhas tarefas e dos meus colegas no trabalho.
Já conversei com um engenheiro do NuBank e ele me falou que a empresa não espera que você saiba Clojure quando vai fazer o processo seletivo. Saber é definitivamente um plus.
Se precisar de ajuda, é só perguntar!
Cara, essa sua resposta me fez ficar com vontade de aprender sobre essa linguagem. Valeu!
hahahaha é show demais. Eu decidi aprender Clojure porque estava cansado de ficar aprendendo linguagens “diferentes” (php, c#, go, Python) que pareciam ser exatamente a mesma coisa. Mudava apenas as bibliotecas e o nome dos conceitos. No final era tudo igual, e estava muito chato ficar gastando tempo e esforço pra reaprender a mesma coisa de novo e de novo.
O paradigma funcional apresenta formas diferentes de resolver os problemas. Você é forçado a pensar de forma imutável. Seus sistemas passam a ser “processadores de sinais” que aplicam transformações nos dados, ao invés de objetos com estado interno interagindo entre si. Usar threads passa a ser algo divertido e eficiente ao invés de ser um pesadelo se você não sabe usar locks e as primitivas de concorrência direito. Clojure traz todas essas ideias de forma nativa na linguagem. Tem um mundo de coisas, eu ainda estou explorando. Todo dia aprendo algo novo.
Interessante. Como você acha que Clojure se compara a linguagens “meio funcionais”, como Lua e Python (que é funcional, apesar de todo mundo querer usar como OO)?
Abraço.
Eu estava na pira de aprender Clojure também. Mas não achei nenhum path de ensino que me agradasse, ou então material bom. Eu acredito que seria interessante você deixar links para coisas que te ajudaram.
[]'s
Nunca programei em Lua, só posso falar por Python. A principal característica de uma linguagem funcional não é o fato de funções serem tratadas como valores (e poderem ser passadas por parâmetro, criadas durante o runtime, e etc), como muita gente acha (e eu também achava). Não sei porque se criou esse consenso no meio dos desenvolvedores. Funções como “cidadãos de primeira classe” é sim uma feature muito importante, mas a principal característica de uma linguagem funcional é a restrição ao uso do operador de atribuição.
O que caracteriza um paradigma são restrições, e não features. A parte II do livro Clean Architecture (caps 3, 4, 5 e 6) descreve isso muito bem. Uma outra citação legal é do SICP, na seção 3.1.3 chamada de “O custo de introduzir atribuições”, que diz
[…]
So long as we do not use assignments, two evaluations of the same procedure with the same arguments will produce the same result. so that procedures can be viewed as computing mathematical functions. Programming without any use of assignments, as we did throughout the first two chapters of this book, is accordingly known as functional programming.
[…]
Atribuição, é geralmente usada não no sentido de inicializar uma variável com o sinal de =
(ou qualquer que seja), mas no sentido de alterar o valor contido por uma variável após ela ser inicializada. Seria como transformar tudo em final
no Java. Essa é uma separação muito forte que a programação funcional traz, a distinção do que é identidade e o que é estado. Tem uma palestra (em inglês) espetacular do Rich Hickey sobre isso.
O preço que você paga por deixar de usar atribuição pode ser difícil a princípio, mas os benefícios são enormes. Na minha opinião, o melhor de todos é que acabam os problemas de estado compartilhado: como é tudo imutável, você não precisa se preocupar com thread-safety, porque o programa não vai alterar os objetos que você tem em mãos pelas suas costas e deixá-los em estados inconsistentes. Dessa forma fica muito fácil fazer programas multi-threaded.
Tem como fazer tudo isso em Python, JavaScript, Java, etc. Mas não é nada fácil, porque a linguagem não te ajuda a fazer isso. Se você não quer usar mutabilidade, você não pode usar as estruturas de dados da linguagem, porque elas usam mutabilidade internamente. Você precisa das suas próprias estruturas de dados persistentes/imutáveis. Não pode mais alterar os estados dos objetos “in-place”.
É isso que Clojure faz, em contraste: disponibiliza na própria linguagem todas as estruturas de dados persistentes e primitivas de identidade que você precisa para programar sem o uso de atribuição. Tem como alterar o dado de uma variável in-place em Clojure, mas é tão mais fácil (e menos problemático) não fazer isso que raramente a feature é usada. É um mundo de coisas novas (se comparado à programação mainstream), que vale a pena explorar.
Não lembro exatamente a ordem de leitura, mas vou tentar ordenar de iniciante para avançado:
- Clojure for the Brave and True (livro online grátis);
- Clojure Programming (livro);
- Clojure Applied (livro);
- The Joy of Clojure (livro);
- Structure and Interpretation of Computer Programs (livro online grátis, tem pra comprar também);
- Elements of Clojure (ebook). Esse foi definitivamente o livro mais difícil que eu já li até hoje. Li ele recentemente. Fiquei boiando com muita coisa, e acho que o nome do livro deveria ser “Elements of Programming”, porque Clojure é apenas um detalhe nas explicações filosóficas do livro sobre programação. Quero voltar e ler esse de novo mais tarde.
Tem muitos outros recursos: vídeos no YouTube (aqui tem muitas), tutoriais na internet, explicações no site da linguagem, tem o slack Clojurians, tem um site parecido com o guj chamado ClojureVerse que tem muitas discussões produtivas, etc. Já passei por muitos recursos e infelizmente não fui marcando o caminho do aprendizado, mas não foge muito desses que citei.
Uma dificuldade minha foi com os editores de código. Tem plugin pra praticamente todos os editores mainstream (atom, vscode, sublime). Tem uma IDE baseada nas da JetBrains chamada Cursive.
No final, eu segui o conselho do pessoal mais experiente e aprendi a usar o Emacs. Como o Emacs usa LISP internamente (ele é um interpretador de LISP, na verdade), e como Clojure é um dialeto de LISP, os dois se mesclam muito bem. Foi o que eu acabei gostando mais, por causa da facilidade de misturar os dois. Demorei pra aprender (até hoje eu apanho as vezes), mas hoje sou bem produtivo nele. Eu não recomendaria aprender Emacs e Clojure ao mesmo tempo como eu fiz, porque eu acho que perdi tempo. Deveria ter focado na linguagem e depois no editor. Se fosse hoje, eu começaria usando o plugin do Atom ou a Cursive.
Boa explicação. Eu parei meus estudos de linguagens funcionais antes de entrar na parte profunda da coisa, então tinha uma noção dessa mudança de mentalidade necessária, e da questão da imutabilidade ser sempre presente, por isso coloquei “meio funcionais” entre aspas. Não sei se volto a esses estudos, mas é bom saber o que há por aí.
Abraço.