5 mitos desconstruídos sobre linguagens de programação

Marcelo Camargo
Rung Developers
Published in
6 min readDec 4, 2017

Após essa publicação, provavelmente serei caçado pela Santa Inquisição, mas vejo como algo necessário em virtude da grande quantidade de falácias relacionadas a linguagens de programação e paradigmas que são diariamente disseminadas ─ principalmente entre as pessoas que estão começando a programar ─ e podem tornar-se uma bola de neve de mentiras e, eventualmente, prejudicar o aprendizado.

De antemão, considero positiva a discussão de maneira saudável e argumentativa. Comentários como “você diz isso porque não sabe programar” e “minha linguagem é boa porque paga meu salário” apenas serão sumariamente ignorados 😄!

Prepare-se para ter seus sonhos destruídos!

1. Para programar, preciso ser bom em matemática

Que tal começarmos com algo não tão polêmico? É comum encontrarmos perguntas nos grupos de programação com esse teor; pessoas com desejo de aventurar-se no maravilhoso e depressivo mundo da p̶r̶e̶o̶c̶u̶p̶a̶ç̶ã̶o̶ programação, mas preocupadas se seus conhecimentos matemáticos atuais serão suficientes. Programar não é sobre matemática. Programar é sobre resolver e abstrair problemas. Você não precisa sequer possuir um conhecimento “acima da média” em matemática para isso. De maneira pessoal, a maioria dos excelentes programadores que conheço são péssimos em cálculo (isso não é um incentivo!).

Definitivamente, há modelos computacionais que utilizam a matemática como base, como o cálculo-λ, mas não é a matemática como você imagina. Matemática não é apenas sobre números; os números são apenas a ponta do iceberg.

2. C é baixo nível

“C é baixo nível e próximo do código de máquina” é algo comum de ouvir-se principalmente quando inicia-se um curso na faculdade. Taxonomia, em ciência da computação, é algo realmente problemático e, em muitas situações, não há uma convenção ou universalidade de definição de um termo. Comparar os níveis de abstração de linguagens em relação ao seu modelo computacional é algo absurdamente relativo.

Uma linguagem de baixo nível é uma linguagem de programação que provê pouca ou nenhuma abstração do conjunto de instruções de um computador, onde há um mapeamento direto ou quase direto entre as instruções. Geralmente, costuma-se ter um padrão ao classificar código de máquina ou Assembly dentro desse nível (mas não C). A palavra “baixo” refere-se justamente à abstração, à distância do hardware em questão. Programas escritos em linguagens de baixo nível tendem a não serem portáveis, principalmente devido a detalhes específicos da arquitetura do hardware.

Sumariamente, a linguagem C é considerada uma linguagem de alto nível, mas no baixo nível do espectro das linguagens de alto nível. A linguagem é abstrata o suficiente para expressar algoritmos e estruturas de dados sem preocupação direta com detalhes dependentes de hardware, tornando o código-fonte portável a uma variedade de hardwares, sendo o código escrito com portabilidade em mente. O código final emitido pelo compilador, a depender da arquitetura, pode ser absurdamente diferente do código de específico para a máquina.

Outro fator que permite incluirmos C no grupo das linguagens com maior abstração é o sistema de tipos que, apesar de inseguro, tenta rejeitar em tempo de compilação parte dos programas considerados inválidos, e é geralmente capaz de aplicar otimizações em cima da análise estática do código, que nos provê abstrações que distanciam-se da arquitetura com um foco maior em corretude.

Referências e leituras recomendadas

3. Java é totalmente orientada a objetos

Espero não ser processado pela Oracle por usar o logo de Java aqui.

O título pode parecer um pouco “tendencioso”, mas faz sentido. A orientação a objetos provavelmente não é o que você acha que é ou o que você aprendeu na faculdade. Se quiser detalhes sobre o paradigma, escrevi um artigo com o tema. Ao analisarmos utilizando a taxonomia comum a ciência da computação e a definição de Alan Kay, criador do paradigma, Java implementa orientação a objetos de maneira incompleta; e utiliza programação estruturada para satisfazer a grande parte do “buraco” que fica aberto na falha em implementar a real definição de orientação a objetos. O artigo mencionado acima possui maiores detalhes que vão esclarecer isso, mas posso resumir: orientação a objetos não é sobre classes, é sobre objetos comunicando-se por passagem de mensagens onde todo elemento da linguagem é um objeto (incluindo classes e tipos primitivos, o que não é verdade em Java).

Quando estuda-se orientação a objetos, Java passa longe de ser a melhor linguagem para abordar o paradigma. Smalltalk e até mesmo Ruby seriam mais adequadas.

Referências e leituras recomendadas

4. Linguagens de programação são perfeitas

Projetistas de linguagens de programação não são deuses e linguagens de programação possuem falhas. Quem projetou sua linguagem de programação provavelmente foi um programador como você e eu. É muito comum vermos em grupos de programação as pessoas defendendo suas linguagens com unhas e dentes porque pagam seus salários e aceitarem as falhas técnicas como características não acidentais em virtude disso. A batalha de ego geralmente favorece isso ainda mais. Há uma extensa área dentro de ciência da computação com foco em teoria de linguagens de programação. Há pessoas trabalhando para encontrar falhas em linguagens de programação, corrigi-las e tornar as linguagens do futuro melhores e capazes de resolver com mais eficácia os problemas. Engana-se quem pensa que levantar os pontos negativos das tecnologias é algo negativo ou “coisa de hater”. É assim que as coisas evoluem, é quando as pessoas estão insatisfeitas com soluções atuais e buscam soluções melhoradas.

5. Lógica de programação é universal

Talvez essa seja a seção que faça vocês enviarem cocô via SEDEX para o meu endereço. O termo “lógica de programação” é amplamente utilizado no Brasil, principalmente na academia (universidades em geral) no ensino da programação básica. O engraçado é que “lógica de programação” não é realmente algo que existe. O termo é utilizado somente na nossa literatura e não possui equivalência na literatura estrangeira, e também não é visto como um modelo lógico (como a lógica de predicados, por exemplo). Seríamos nós, os brasileiros, os detentores dessa maravilhosa fonte de conhecimento ou teríamos apenas generalizado e deturpado o termo?

O que referencia-se no Brasil por lógica de programação nada mais é do que a lógica assertiva imperativa, o modelo de algoritmos (sequencial) utilizado para moldar programas em um paradigma específico ─ em 1 paradigma dos mais de 150 existentes. Por causa dessa falha de definição, as pessoas tendem a acreditar que para aprender uma nova linguagem é necessário “apenas a lógica, já que ela é universal”, o que não é verdade. Aprender uma linguagem torna mais fácil o aprendizado de novas linguagens da mesma família e paradigma dela, por exemplo, se você aprender Java, ficará fácil aprender C#, mas você terá a mesma dificuldade para aprender Haskell ou Prolog que alguém que nunca programou, e generalizar programação como programação imperativa é ignorar diversos outros modelos computacionais e linguagens de programação amplamente utilizadas (inclusive para modelar hardware). Engana-se caso acredite que “toda linguagem tem if, toda linguagem tem for”.

Referências e leituras recomendadas

TL;DR

Minha intenção não é causar problemas e plantar baits, mas estimular discussões e questionamentos. Sinta-se à vontade para argumentar e expor seus pontos, ficarei feliz. Quem gostou, bate palma 🎉; quem não gostou, paciência 😞. Obrigado e até próxima, amiguinhos!

--

--