Por que me interessei por programação funcional
Neste artigo compartilho os motivos que despertaram meu interesse em estudar programação funcional. Talvez alguns de vocês se identifiquem e espero que também sintam-se motivados para aprender mais sobre este paradigma de programação.
Consigo citar o exato momento em que decidi estudar mais sobre este assunto, mas antes preciso contextualizar um pouco sobre meus primeiros anos aprendendo programação.
Programação imperativa
Vinte e poucos anos atrás, quando tinha por volta de 14 anos de idade, comecei a aprender o básico sobre desenvolvimento de software em um computador Gradiente Expert MSX 1, utilizando a linguagem de programação BASIC. Hoje existem versões bastante avançadas desta linguagem, mas na época era muito limitada. Um dos primeiros códigos que aprendi foi algo como:
10 X = 1
20 PRINT X
30 X = X + 1
40 GOTO 20
Sim! Nesta época ainda usávamos o famoso GOTO. E o padrão era numerar as linhas de 10 em 10. Como deve imaginar, este programa imprimi uma sequencia numérica indefinidamente.
Um amigo alguns anos mais velho me ensinava os primeiros comandos de programação e lembro claramente dele tentando explicar a linha 30 e eu falando: mas se X é igual a 1, então X não pode ser igual a 2!
Já estava aprendendo a resolver equações simples na escola e foi natural tentar associar este código com o que estava aprendendo na matemática, que seria algo como:
Este sistema de equações é impossível (não tem solução). E foi preciso muita explicação deste meu amigo para que eu conseguisse aceitar que o código estava correto e desassociá-lo do que estava aprendendo na matemática. Lembro dele cobrindo com a mão o X mais à esquerda na linha 30 e perguntando: quanto é X + 1? E eu respondendo: dois, mas X não pode ser 2 porque na linha 10 está afirmando que X é 1! Aquilo simplesmente não entrava na minha cabeça.
Conversei com algumas professoras de programação recentemente e este parece ser realmente o primeiro ponto de dificuldade ao ensinar algoritmos. Todo mundo consegue entender quando escrevemos “x = 1”, mas quando chega no “x = x + 1” começam a ter problemas. Este conceito de redefinir uma variável é difícil de absorver.
Quando estamos programando de forma imperativa parece que precisamos brigar contra a matemática para conseguirmos expressar nossas intenções! Será que não existe uma forma mais natural de codificar nossos programas?
Primeiros contatos com imutabilidade
Ao longo dos anos fui aprendendo várias linguagens de programação, mas sempre primariamente procedurais ou orientadas a objetos. Tive algum contato com o conceito de imutabilidade nestes paradigmas, mas era bastante superficial. Foi só muitos anos depois que descobri que existiam linguagens em que quando um valor era atribuído a uma expressão, ela não poderia mais ser alterada. A primeira que aprendi que trabalhava desta forma foi Elm, uma linguagem funcional pura e tipada, focada em desenvolvimento de front-end web.
Ao ler que em Elm todas as variáveis eram imutáveis, minha primeira reação foi digitar novamente aquele primeiro programa que havia aprendido há mais de vinte anos:
x = 1
x = x + 1
E ao tentar executar este código, recebi o seguinte erro:
This file has multiple `x` declarations. One here: x = 1
^ And another one here: x = x + 1
^ How can I know which one you want? Rename one of them!
Nunca fiquei tão feliz em ver um erro de compilação! Na hora lembrei daquele dia, mais de vinte anos antes, que tive muita dificuldade em entender como x poderia ser igual a x + 1 e pensei: finalmente uma linguagem que faz sentido! Se x é igual a 1, então x não pode ser igual a 2!
Mas ao mesmo tempo foi muito confuso. Parecia que tudo que eu havia aprendido até aquele momento sobre programação era uma grande mentira. E a pergunta seguinte foi, claro, como seria possível desenvolver software sem poder redefinir o valor de uma variável? A partir deste dia decidi tentar encontrar resposta para esta pergunta. Comecei com Elm e depois de alguns anos fui parar no Haskell.
Descobrindo mais sobre programação funcional
Aprender um novo paradigma é sempre muito difícil. É preciso se libertar dos vícios anteriores e abrir a cabeça para uma nova forma de pensar e encarar os problemas. Isso pode ser bem frustrante, já que até mesmo algoritmos triviais de repente passam a se tornar grandes obstáculos: como percorrer uma lista sem manter estado em uma variável auxiliar? Como atualizar determinada estrutura de dados de acordo com um cenário específico? Como consolidar uma informação a partir de uma estrutura de dados? Como manter o estado da aplicação? Como tratar uma situação de falha sem variável nula ou lançar uma exception?
Reaprender a programar utilizando outro paradigma pode ser difícil, mas existem recompensas! A programação funcional me fez encarar os problemas sob uma nova perspectiva, o que pode ser muito útil em vários cenários. E como cada vez mais os conceitos por trás da programação funcional estão ganhando espaço também nas linguagens multiparadigmas, tudo que aprendi estudando linguagens funcionais pode ser aplicado (com algumas restrições) também em linguagens como Java, C#, JavaScript, Ruby, Python, Rust e praticamente todas as demais linguagens atuais. E muitos frameworks famosos, como o React, também se beneficiam fortemente de vários princípios que nasceram no universo funcional.
E entender este paradigma abriu uma porta para um universo paralelo da computação e da matemática. Quando me dei conta estava lendo livros sobre teoria das categorias, cálculo lambda, além de tentar me aventurar em entender outros conceitos bem abstratos da computação.
Talvez isso tudo não tenha uma aplicação direta no meu dia a dia (que atualmente é bastante focado em desenvolver softwares em Java) mas com certeza me ajudou a ser capaz de escrever códigos mais limpos, testáveis e menos propensos a desencadearem erros em tempo de execução.
Obrigado por ler até aqui! Se gostou deste texto, tenho mais alguns publicados em minha página do medium e também mantenho um podcast onde falo sobre livros que impactaram na minha carreira.