Olá 🙂 ✧!
Neste post, vamos abordar um conceito teórico imprescindível do mundo da programação: paradigmas. Há muita discussão sobre qual linguagem ou framework é melhor, mas pouco se fala sobre paradigmas, que é algo crucial para o desenvolvimento. Mas, se é tão importante assim, por que cursos online quase não falam sobre? É uma pergunta que eu também faço. Boa parte dos cursos, bootcamps e materiais online focam em ensinar uma tecnologia, mas raramente mencionam paradigmas. Porém, é uma matéria que é muito comum aparecer logo nos primeiros semestres de qualquer faculdade de TI.
Principalmente para iniciantes, pode ser um tanto quanto perigoso aprender a programar e ir para o mercado de trabalho sem entender a base teórica de paradigmas. Isso pode atrasá-lo em algum ponto da carreira, por exemplo, quando encontrar algum problema que exija outra forma de solução. Também já vi casos de iniciantes que aprenderam a programar uma tecnologia do hype e tiveram dificuldade no primeiro emprego: “o projeto da vida real é muito antigo (na verdade, não é que é antigo, é que não segue o padrão que aprendi online) e é impossível de dar manutenção!”. Saber um único paradigma pode nos deixar pouco adaptáveis no desenvolvimento de software.
O que é um paradigma?
É um modelo ou um padrão a ser seguido. Em programação, um paradigma representa o tipo de estrutura que vai ser usada para definir como vai ser a construção de um projeto.
Os paradigmas de programação são agrupados em dois principais grupos: imperativo e declarativo, como ilustrado no diagrama acima. A partir deles, os mais conhecidos e usados hoje são orientação a objetos, funcional e procedural. Nesse post não vou ensinar sobre cada um, a intenção é aqui é relembrar a diversidade de paradigmas!
Note que é comum algumas linguagens de programação terem paradigmas marcados, por exemplo, Java e C#, que trazem consigo recursos que favorecem a programar utilizando o paradigma imperativo, através da programação orientação a objetos. Já Haskell é uma linguagem nativamente da programação funcional, do paradigma declarativo. Javascript é uma linguagem multi-paradigma, mas apesar da sua versatilidade, ela tem sido muito usada também para programação funcional. Há também linguagens que não possuem nenhum paradigma muito marcado, como é o caso de rust. Fortran e Pascal são exemplos de linguagens bem adaptadas para a programação procedural, também do paradigma imperativo.
Existe paradigma melhor que outro?
Nesse ponto, já podemos entender que favoritismos e guerrinhas entre linguagens é pura bobeira: não tem como dizer que uma linguagem é melhor quando cada uma é de um paradigma diferente. É a mesma coisa que comparar roupas de banho e pijamas: cada uma é usada numa ocasião diferente, é impossível definir qual é a melhor sem definir o objetivo e onde serão usadas! Cada uma tem suas vantagens e depende do uso.
Isso me lembrou de uma história, que vai servir de gancho para os próximos sub-tópico. Quando eu estava na faculdade, era bem fluente em Java e Programação Orientada a Objetos. Fiz estágio também como programadora Java e de repente surtei e fui para uma área que se utilizava outro tipo de programação, a funcional. Mudar o paradigma de imperativo para declarativo fritou meu cérebro nos primeiros meses. O pessoal nessa nova empresa tinha aquele ar de “descolado” e quase todos os dias diziam o quão velho Java era. Eram resistentes a qualquer documentação, “diagramas UML” era um insulto pesado que jamais deveria ser dito em voz alta. Até meu gestor dessa época gostava de brincar comigo dizendo para eu me atualizar e perceber que Java só era usado por empresas antigas. “O mundo agora é javascript” – diziam.
É muito delicado definir o que o mundo é, mas espero que até o final do post, você consiga entender um pouco das raízes de tudo isso.
Por que Programação Funcional ficou mais popular do que POO?
Por que será que Programação Funcional de repente ficou mais popular que Programação Orientada a Objetos? É por que é mais nova? Não. Na verdade, orientação a objetos é mais recente do que o paradigma funcional. Na história, paradigma imperativo veio depois do paradigma declarativo. Aqui vai um pouco de cultura: a primeira linguagem funcional foi criada na década de 30 e se chamava lambda calculus, ou cálculo-λ. Já a POO ((Programação Orientada a Objetos) vou escrever só “POO” a partir de agora para ficar mais fácil para mim) foi criado na década de 60 e a primeira linguagem fluente em POO, só veio lá em 1970.
Espera aí, POO é mais novo que Funcional? Sim! O motivo disso vai te ajudar ainda mais a analisar linguagens de programação: evolução de hardware. Exatamente, programação funcional consome muito mais processamento do que POO. Na época em que foi criada, os computadores ainda não eram tão potentes como os de hoje e os códigos saiam pouco performáticos, o que mudou com o paradigma imperativo e POO, pois é um paradigma que traz muito o conceito de reuso de código.
Além disso, é comum linguagens do paradigma imperativo serem um pouco mais “fáceis” para a máquina processar do que declarativo. Observe essa tabela que vi neste site, indicando o quanto as linguagens de programação consomem de energia, tempo e memória. Compare Java (nativamente imperativo) com javascript (muito usado para declarativo hoje) por exemplo:
A tabela acima representa uma média acerca da energia consumida por paradigma. Vemos aqui que Java só é pesado para você programador, porque para o computador, é bem mais fácil de executar. 🙂
O que aprender primeiro?
Sabemos que linguagens podem ou não serem nativas de um paradigma. Mas no meio de tudo isso, por onde começar? Ou ainda, existe uma ordem certa a ser seguida? Um iniciante precisa começar aprendendo um paradigma?
Antes de mais nada, a gente sempre começa com lógica de programação. Esse é o começo universal em programação. Depois vem a primeira linguagem de programação – sem nenhum paradigma, apenas aplicando o que aprendeu em lógica de programação. Na minha época, na ETEC, comecei aprendendo com linguagem C. Algumas pessoas escolhem python e até javascript. É interessante, nessa etapa, não ser uma linguagem muito verbosa, por isso alguma das três é uma boa ideia.
Aprender o primeiro paradigma é adequado como terceira etapa e tanto faz qual você vai aprender primeiro. Aqui tenho um aviso: aprender um paradigma é muito mais complexo do que aprender uma linguagem de programação nova. Porém, é mais difícil esquecer um paradigma, uma vez aprendido, do que uma linguagem de programação.
Aprender uma linguagem de programação é como aprender um idioma novo, depende da prática. Se você fica um tempo sem praticar, acaba esquecendo algumas coisas, nisso deduzimos que a memória é um agente importante aqui. Já aprender um paradigma, vai além da memória, é um aprendizado de algo estrutural. Seria como aprender a conviver em certa configuração social, por exemplo, um grupo familiar ou até uma religião: há padrões de regras, eventos e rotinas que é necessário seguir, ou seja, um paradigma. Se ficar um tempo longe disso e voltar, vai ser mais fácil lembrar.
Voltando um pouco na história da empresa que mencionei anteriormente: foi muito difícil para eu aprender programação funcional. Meu cérebro estava a quase 5 anos só em orientação a objetos. Demorei cerca de um ano para entender as sapecagens do javascript na programação funcional. Obviamente, não quer dizer que você terá que demorar tudo isso para aprender um segundo paradigma! Essa demora foi culpa minha, que pode ser história para outro post. Mas é só para exemplificar que pode ser um pouco complexo no começo.
É interessante aprender o paradigma juntamente com uma linguagem nativa daquele paradigma. Qual paradigma aprender primeiro vai depender um pouco de qual área você se interessa mais. É mais comum usar POO num back-end e Funcional no front-end. Porém, não é regra. Independente de qual paradigma comece, eu recomendo fortemente que aprenda mais de um!
Depois de aprender paradigmas, normalmente a gente aprende padrões arquiteturais e a partir daí, as coisas vão ficando cada vez mais específicas, a gente aprende padrão de projeto, que vai variar muito de empresa e de projeto. É muito assunto que não dá para eu abordar num post só, mas vou deixar um livro recomendado: Uma Linguagem de Padrões – de Christopher Alexander.
O melhor dos dois mundos
Algo que vale a pena reforçar é que paradigmas não são tão estáticos assim: eles sofrem pequenas mudanças conforme a evolução das coisas.
Mesmo a linguagem Java, nativamente de POO, acabou adquirindo com o tempo elementos da programação funcional, como algumas funcionalidades do paradigma declarativo. E mesmo o javascript, muito usado atualmente para programação funcional, deu luz ao Typescript, que é basicamente um javascript tipado. Nem as linguagens ficam fechadas para sempre num único paradigma, então não há motivo algum para fazermos isso.
Diferentes paradigmas podem ser usados para construir um mesmo projeto, assim como para construir um prédio, é necessário definir as diferentes arquiteturas: hidráulica, elétrica, drenagem, etc. Portanto, o ideal é usar o melhor dos dois mundos ao construir um projeto, mesclando paradigmas. Claro que essa mescla nem sempre vai ser necessária, mas prepare-se para atender a essa demanda se ela surgir. Seu papel como programador é escolher a melhor solução para cada problema.
Esse foi um post mais teórico, mas muito importante. Em breve falaremos melhor e mais na prática sobre cada paradigma e alguns padrões.
Obrigada por ter chegado até aqui!