Se você trabalha com tecnologia ou tem curiosidade pela área, provavelmente já deve ter ouvido falar sobre programação funcional (ou Functional Programming, em inglês). Não é algo novo, mas tem ganhado cada vez mais atenção pelas mudanças tecnológicas que estamos vivendo.
O que é programação funcional?
Programação funcional é um paradigma de programação.
(Para quem está começando, paradigma nada mais é que a forma de fazer algo. Em programação, é a orientação que os códigos vão ter.)
O paradigma funcional é baseado num modelo computacional bem antigo chamado de Cálculo Lambda. Esse modelo foi criado em 1930 por Alonzo Church (orientador do famoso matemático Allan Turing) e serviu como base para a criação do LISP – uma família de linguagens de programação desenvolvida por John McCarthy em 1958.
Para entender o que é programação funcional, entretanto, é importante entender outros paradigmas de programação famosos: Programação Imperativa e Programação Orientada a Objetos (POO).
Programação Imperativa
É o paradigma de programação mais famoso. Nas linguagens imperativas – como C e PHP –, os códigos são escritos como uma lista de instruções que o computador lê e executa. É como se fossem comandos para a máquina, por isso programação imperativa.
Programação Orientada a Objetos
Já na Programação Orientada a Objetos, em vez de descrever um código, o programador cria um objeto e adiciona comportamentos a ele. "Se fossemos programar um carro, por exemplo, ele seria o objeto e adicionaríamos funções que o manipulam, como abrir a porta, ou que fazem ele interagir com outros objetos", explica Bruno Rodrigues, tech manager do Nubank.
Alguns exemplos de linguagens de programação orientadas a objetos são Java, Python e Ruby. Outras, como JavaScript e PHP, são linguagens com suporte à orientação de objetos.
Programação Funcional
Entendendo outros tipos de paradigmas, fica mais fácil entender o paradigma funcional.
Diferentemente das programações imperativa e orientada a objetos, a funcional parte do princípio de que tudo são funções. Não existe uma lista de instruções ou objetos para o computador realizar, mas uma sequência de funções matemáticas que, juntas, vão resolver um problema.
Isso significa que, no paradigma funcional, você tem uma função, coloca um dado de entrada, aplica várias operações e obtém uma saída. É possível alterar as operações e, consequentemente, a saída, mas a entrada sempre permanecerá a mesma.
"No exemplo do carro, se você pintá-lo usando a programação orientada a objetos, ele vai terminar com uma cor diferente e sem registro de ter tido outra cor antes", conta Bruno. "No paradigma funcional, é como se você terminasse com um carro com a cor nova, mas ainda mantivesse outro com a cor antiga", complementa.
Além disso, no paradigma funcional não existem variáveis, mas constantes. Isso se traduz em códigos mais objetivos com constantes que, de forma geral, não mudam.
Alguns exemplos de linguagens funcionais são Clojure, Haskell e Elixir.
Quais as vantagens da programação funcional?
Como dissemos acima, o código em programação funcional tende a ser mais curto e objetivo do que os de outros tipos de paradigma. Além disso facilitar a manutenção do código e eventuais mudanças, é mais simples adicionar testes e isolar uma função para fazer análises e corrigir falhas.
Outra vantagem é que, por ser baseado em funções matemáticas, o paradigma funcional induz o uso do conceito de imutabilidade. Um exemplo disso seria uma simples função matemática, como f(x) = x + 2. Sempre que utilizarmos o mesmo valor para essa função, ela retornará um resultado igual, imutável.
Pode parecer um detalhe pequeno, mas com a garantia de que o código é imutável, é possível testá-lo em um ambiente de produção com a certeza de que ele não vai se comportar de forma inesperada.
Isso nos leva para outra característica da programação funcional: justamente por induzirem a imutabilidade, os programas desenvolvidos com linguagens funcionais são previsíveis. A gente sabe que, imputando um valor X, o resultado será sempre o mesmo. Por serem previsíveis, se tornam mais fáceis de serem testados.
Além disso, as linguagens funcionais são mais amigáveis para a implementação de computação paralela – ou seja, diferentes pedaços do sistema rodam sem problemas em processadores diferentes. Isso se explica pelo fato de serem códigos previsíveis e sem efeitos colaterais.
O que o Nubank tem a ver com programação funcional?
Quando o Nubank nasceu, em 2013, buscamos tecnologias que poderiam nos ajudar a atingir nossos objetivos de negócio, manter a eficiência e escalar de forma segura e sustentável.
Naquele momento, o paradigma funcional pareceu a melhor opção para os desafios que a gente tinha. Por isso, acabamos adotando Clojure como a linguagem principal para os nossos serviços e Datomic como nosso banco de dados.
"O princípio de imutabilidade do paradigma funcional aliado ao Datomic é crucial para uma instituição financeira, porque temos um registro de todas as informações", diz Bruno. "Além disso, é possível voltar no tempo e recuperá-las caso algo seja computado errado."
O paradigma funcional também ajuda no processo de internacionalização do Nubank. "Como é um paradigma imutável, não precisamos mudar tudo desde o começo", afirma Bruno. "A lógica do sistema financeiro de um país pode ser diferente do de outro, mas conseguimos usar a mesma base para todos", explica.
Segundo Bruno, é como brincar de Lego: "Caso uma peça não encaixe direito, é fácil trocá-la por outra sem perder tudo o que já foi construído."
Dessa forma, conseguimos usar todas as vantagens da programação funcional para construir soluções que devolvem às pessoas o controle sobre o seu dinheiro – independentemente do país.
Se você quer saber mais sobre nossa engenharia, acesse o canal Nubank On The Stage, o blog Building Nubank e os conteúdos abaixo: