Iceberg do Desenvolvimento
- #Ruby
- #GoLang
- #Elixir
Publicação no LinkedIn:
Você provavelmente já viu vídeos no YouTube dizendo qual é a linguagem de programação número um para aprender agora, se você quer ficar rico. Isso não é o que faremos hoje. Em vez disso, vamos mergulhar nas profundezas mais obscuras do campo da engenharia de software para descobrir as linguagens de programação que são amadas, odiadas, bonitas, feias, compiladas, interpretadas, úteis, estranhas e tudo mais. Se você chegar até o final, terá um roteiro com tudo o que precisa saber para conseguir um emprego como desenvolvedor júnior em 2023. Ou talvez isso só te deixe extremamente deprimido, porque esse iceberg é apenas a ponta do iceberg do que você realmente precisa aprender.
Escolha qualquer linguagem e você encontrará outro iceberg dentro deste iceberg que se estende infinitamente, como um conjunto de Mandelbrot, o que, ironicamente, você pode representar em código com qualquer uma das linguagens que estamos prestes a ver. Antes de começarmos, há muitos icebergs de programação por aí, mas este classifica as linguagens com base onde acredito que você possa encontrá-las. Como iniciante aprendendo a programar desde o início, cada nível tem seu próprio tema. Então, vamos direto ao assunto com linguagens projetadas para facilitar a programação o máximo possível. Se você não sabe absolutamente nada sobre programação, o melhor lugar para começar, na minha opinião, é o Scratch. Foi desenvolvido no MIT, assim como algumas outras linguagens desta lista, mas em vez de digitar código, você arrasta e solta esses blocos juntos como peças de Lego para representar coisas como variáveis, controle de fluxo e operadores.
Isso torna o processo de pensamento por trás da programação muito mais acessível, e você pode se surpreender com o que realmente pode construir com ele. Muito antes do Scratch, tínhamos o Basic, ou Beginners All-purpose Symbolic Instruction Code, que surgiu em Dartmouth em 1964. Na época, o Fortran estava na moda, mas não era amigável para iniciantes. O Basic fornece um conjunto básico de comandos como Print, Goto e For, e foi incluído na maioria dos computadores pessoais, o que o tornou a opção preferida para pessoas aprendendo a programar nos próximos 50 anos. Agora, passando para o próximo nível, temos as linguagens de alto nível dinâmicas extremamente populares.
A linguagem com a qual a maioria das pessoas começa hoje é o Python, principalmente por causa de sua sintaxe mínima. Não requer chaves, ponto e vírgula e coisas do tipo, e usa a indentação para representar diferentes blocos de código. A outra linguagem de alto nível popular é o JavaScript. Sintaticamente, é bem feio, mas é necessário se você quiser fazer desenvolvimento web, e quase todo desenvolvedor terá que lidar com ele em algum momento de sua carreira. Qualquer aplicativo que possa ser escrito em JavaScript eventualmente será escrito em JavaScript.
Agora, depois de aprender uma dessas linguagens, você será capaz de construir praticamente qualquer coisa que possa imaginar, e poderia ter uma carreira inteira como engenheiro de software sem ir mais fundo no iceberg. Mas você não quer estar em seu leito de morte se perguntando se deveria ter experimentado o PHP. Neste próximo nível, temos linguagens extremamente populares, mas um pouco mais especializadas. Os programadores gostam de fazer as coisas pelo terminal, e há linguagens de script como o Bash e o PowerShell que permitem interagir com o computador de forma programática. Em vez de digitar os mesmos comandos repetidamente, escreva um script Bash para torná-lo reproduzível.
Agora, se você se envolver no desenvolvimento web, também precisará aprender HTML e CSS, que, quando combinados, formam, argumentavelmente, uma linguagem de programação completa em termos de Turing. Eles não são usados para programação no sentido tradicional, mas sim para definir a estrutura e o estilo de um site. E se eu disser que o HTML não é uma linguagem de programação, serei imediatamente cancelado pela comunidade técnica. Além disso, a maioria dos aplicativos precisa de um banco de dados, e a linguagem mais comum para trabalhar com bancos de dados é a Linguagem de Consulta Estruturada. Você pode chamá-la de SQL.
Isso é Turing completo, embora não seja usado para programação regular, mas sim para ler e escrever dados em um banco de dados relacional. Agora, o Python é ótimo e tudo mais, mas existem muitas outras linguagens dinâmicas que podem ser mais adequadas para determinados projetos. Como o PHP, que facilita a criação de aplicativos web do lado do servidor e ainda é muito popular hoje.
Lua é mais fácil e mais rápido que o Python e está embutido em muitas engines como o Roblox e o World of Warcraft. Ruby é uma linguagem orientada a objetos fácil de aprender, também usada comumente para construir aplicativos web com o framework Rails. Se você trabalha em ciência de dados, encontrará o R, usado para estatísticas e visualização de dados, ou Julia, uma opção mais moderna também usada para computação científica. A coisa em comum entre todas essas linguagens é um sistema de tipos dinâmicos. No entanto, à medida que você constrói software mais complexo, pode perceber que precisa de uma estrutura mais rígida, e uma maneira de alcançar isso é com um sistema de tipos estáticos.
Esta camada compõe a maior parte do código de produção existente no mundo. Primeiro, temos o Java, que revolucionou a programação com uma máquina virtual Java. Ele é compilado para bytecode que é executado na JVM e permite que os desenvolvedores atinjam qualquer arquitetura de computador a partir de um único código base. Sintaticamente, é uma verdadeira bagunça para iniciantes.
Java é lendário, mas a Microsoft lançou o C#. É semelhante ao Java de muitas maneiras, mas recebe muito mais amor de seus usuários. É usado para construir jogos com o Unity, bem como aplicativos web e desktop com o framework .NET. Outra ferramenta muito querida da Microsoft é o TypeScript. Ele pega o JavaScript e adiciona um sistema de tipos por cima, tornando muito mais fácil trabalhar em projetos grandes e complexos.
Se você está construindo um aplicativo móvel hoje, provavelmente estará trabalhando com Kotlin para Android, Swift para iOS ou Dart com o framework Flutter. Essas linguagens são todas de tipagem estática, mas seguem uma abordagem mais moderna e concisa, com recursos como inferência de tipos que minimizam o código repetitivo. Em seguida, temos o Go, que é uma linguagem de alto desempenho desenvolvida pelo Google para construir sistemas de baixo nível. Foi projetado como um substituto para o C, e Ken Thompson, um dos criadores originais do C, ajudou a projetá-lo.
A sintaxe é agradável e concisa, o que a torna acessível para iniciantes, e ela possui um garbage collector, o que significa que, ao contrário do C, os desenvolvedores não precisam se preocupar com o gerenciamento manual de memória.
Ok, agora chegamos ao nível do iceberg em que a maioria das pessoas tem medo de ir mais fundo. As coisas vão ficar estranhas. O que acontece é que muitos desenvolvedores ficam desencantados com essas grandes e pesadas linguagens orientadas a objetos e saem em busca de um caminho melhor. Nesse nível, temos as linguagens funcionais, a mais famosa das quais é o Haskell.
Em vez de classes, herança e todos os tipos de padrões de design malucos, a única abstração de que você realmente precisa é a função. Ele foi inspirado na linguagem Miranda e recebeu o nome do matemático Haskell Curry. O mais importante é que as variáveis são imutáveis e as funções não têm efeitos colaterais. Surpreendentemente, é possível construir quase qualquer coisa com essas limitações. Embora a maioria do código de produção não seja funcional, a maioria de nós encontra problemas ao tentar entender o que é um monad, que, em termos leigos, é apenas um monóide.
Na categoria de não funtores, o Haskell é ótimo, mas a Microsoft desenvolveu uma linguagem funcional semelhante ao C# chamada F#. Ao contrário do Haskell, que é puramente funcional, o F# também é imperativo e orientado a objetos, o que o torna mais acessível para desenvolvedores que estão mais acima no iceberg. Agora, se você não gosta do Java, uma boa alternativa é o Scala. Assim como o F#, ele suporta tanto programação orientada a objetos quanto funcional, mas é executado na JVM. Ele é de tipagem estática, mas há outra linguagem na JVM chamada Clojure, que é ao mesmo tempo funcional e dinâmica.
Isso a torna mais adequada para realizar tarefas rapidamente, com a desvantagem da falta de segurança de tipos. Outras linguagens funcionais populares incluem OCaml, que é usado extensivamente pelo Facebook, e Elixir, que possui uma sintaxe muito boa semelhante à do Ruby e é usado para construir aplicativos web em escala com a plataforma Phoenix. Há também o Elm, que é uma linguagem puramente funcional que compila para JavaScript e pode criar interfaces de usuário front-end sem erros de tempo de execução.
Mas agora é hora de ir um nível mais profundo, ao coração do iceberg. Elas são linguagens de sistemas de baixo nível que podem gerenciar e otimizar manualmente a memória e são usadas para construir coisas como kernels de sistemas operacionais e compiladores que tornam possíveis todas as outras linguagens, a mais lendária das quais é o C. Ele foi usado para construir os kernels dos sistemas operacionais Windows, Mac e Linux, e sua sintaxe de chaves inspirou muitas outras linguagens nesta lista. Surpreendentemente, não é tão difícil de aprender e possui um conjunto relativamente pequeno de palavras-chave para memorizar. No entanto, para usá-lo efetivamente, é necessário um conhecimento extenso de algoritmos e arquitetura de computadores. Por exemplo, o C não possui hash, maps ou dicionários, então você terá que aprender como criar essa estrutura de dados por conta própria.
O C era a linguagem de programação perfeita quando foi lançado em 1969, mas ela só suportava programação procedural e, eventualmente, os desenvolvedores queriam mais. O C++ era originalmente um superset do C, projetado para estendê-lo com padrões de programação orientada a objetos, como classes e herança. Ao contrário do C, é extremamente difícil de aprender e oferece muitas oportunidades não apenas de atirar no próprio pé, mas de arrancar a perna inteira. Isso se refere ao gerenciamento manual de memória com ponteiros, que recebeu esse nome porque é tão perigoso quanto apontar uma arma para alguém. Apesar de sua curva de aprendizado, é uma linguagem extremamente prolífica, usada para construir software altamente otimizado, como motores de jogos, compiladores e assim por diante.
C e C++ ainda são extremamente relevantes hoje, mas o programador destemido moderno tende a preferir Rust. Para programação de baixo nível, ele não possui um garbage collector, mas, ao contrário de C e C++, usa uma técnica chamada "borrow checking" em vez de ponteiros para gerenciamento de memória. Isso torna muito mais fácil escrever programas seguros em relação à memória e consistentemente é classificada como a linguagem mais amada do mundo.
As linguagens deste nível são extremamente populares, mas agora descemos ainda mais para as linguagens modernas que você provavelmente nunca ouviu falar. Primeiro, temos o V, que é uma linguagem de sistemas de alto desempenho que se parece muito com o Go, mas, ao contrário do Go, não usa um garbage collector, e, ao contrário do Rust, não faz "borrow checking".
No entanto, ela ainda pode criar aplicativos seguros em termos de memória com sua própria inovação de liberação automática (auto free), onde o compilador basicamente cuida de tudo. Não tenho ideia de como isso funciona, mas parece legal.
Outra substituição moderna para o C é o Zig. Ele foi projetado para simplificar a programação de baixo nível, eliminando recursos como macros e metaprogramação, sendo muito explícito em relação ao gerenciamento de memória. Além disso, ele pode compilar tanto C quanto C++, assim como o Clang. O Zig não deve ser confundido com o Nim, outra linguagem de alto desempenho que é muito expressiva, assim como o Python, mas é tipada estaticamente. Interessantemente, o Zig possui um garbage collector ajustável que pode ser desativado para permitir o gerenciamento manual de memória. Recentemente, o Google anunciou o Carbon, projetado para ser um sucessor do C++. O que o torna especial é a capacidade de interoperar totalmente com uma base de código legado em C++. Outra linguagem de baixo nível especializada é o Solidity. É uma linguagem orientada a objetos e tipada estaticamente, mas projetada para implementar contratos inteligentes, especialmente na blockchain Ethereum. Em seguida, temos o Hack, do Facebook, que foi projetado para interoperar com o PHP.
O site original foi construído com PHP, mas eles precisavam de uma linguagem com melhor desempenho e um sistema de tipos para escalá-lo até o monstro que é hoje. Existem muitas outras boas linguagens modernas neste ponto do iceberg, como Crystal, Hack e Pharaoh, para citar apenas algumas.
Mas agora é hora de descer para o próximo nível, onde vamos analisar as linguagens ainda amplamente usadas ou historicamente importantes, mas que você provavelmente não escolheria para programar. O Fortran foi a primeira linguagem de programação de alto nível e foi de longe a mais popular durante muitos anos, até o surgimento do C logo após o Fortran. O Lisp foi inventado em 1958 e pioneirou muitas ideias que hoje consideramos como garantidas na ciência da computação, como tipagem dinâmica, funções de ordem superior, recursão e REPL. Inspirou muitas outras linguagens como Racket, Scheme, Closure e, até certo ponto, o JavaScript. Outra linguagem altamente influente que surgiu neste ano foi a Algol. É uma linguagem grande e complexa que não se tornou tão popular quanto o Fortran, mas seu sistema de tipos e uso de expressões tiveram uma influência significativa no desenvolvimento do C e do C++ no ano seguinte. Em 1959, nasceu o COBOL. Se você quiser ganhar dinheiro na década de 2020, aprenda COBOL, pois mais de 40% dos sistemas bancários ainda o utilizam, com mais de 200 bilhões de linhas de código em produção. Em 1962, o APL apareceu pela primeira vez, que significa "A Programming Language". Ele implementa álgebra linear diretamente na linguagem, com uma matriz multidimensional sendo o tipo de dados central.
Isso leva a um código extremamente conciso que se assemelha a notação matemática e faz uso intenso do alfabeto grego. Em 1970, foi inventado o Pascal e ele tomou de assalto o mundo da programação. É uma linguagem procedural com uma sintaxe familiar e também tinha tempos de compilação muito rápidos. Eventualmente, tornou-se a linguagem mais popular no início dos anos 1980, antes do surgimento do C alguns anos depois. Existem muitas outras linguagens importantes deste período, como o Simula, a primeira linguagem orientada a objetos que inspirou o Smalltalk, que por sua vez inspirou muitas outras linguagens orientadas a objetos como Python, Java e Ruby. Em seguida, temos o Erlang, uma linguagem funcional concorrente que basicamente impulsionou toda a indústria de telecomunicações e ainda é usada hoje. Temos também o ADA, uma linguagem de propósito geral nomeada em homenagem a Ada Lovelace, geralmente considerada a primeira programadora de computador do mundo. Ela foi extremamente popular nos anos 1980 e ainda é usada hoje pelo Departamento de Defesa para fins bélicos. Além disso, devemos mencionar o Prolog, a linguagem que pioneirou a programação lógica, e o ML, que pioneirou o sistema de tipos polimórficos usado por outras linguagens funcionais de tipagem estática, como Haskell.
Existem muitas outras linguagens históricas sobre as quais poderíamos falar, mas agora é hora de entrar no reino do esotérico, onde encontramos linguagens raras e bizarras que se parecem mais com obras de arte do que ferramentas de engenharia. A primeira linguagem esotérica conhecida surgiu em 1972 e chamava-se Intercal, que significa "linguagem compiladora sem acrônimo pronunciável".
Ela foi projetada como uma paródia para ridicularizar as linguagens da época, como Algol e Fortran. Possui um manual de referência paradoxal que não faz sentido algum e tem uma escolha interessante de palavras-chave, como "Please" (Por favor) e "Mingle" (Misturar). "Please" na verdade não faz nada, mas torna você um programador mais educado. Em seguida, temos o Brainfuck. Brainfuck é mais conhecido por ser extremamente minimalista. Urban Mueller criou o Brainfuck na faculdade e ele funciona inicializando uma matriz, fornecendo um ponteiro e oito caracteres diferentes para manipular a memória dessa matriz. Isso resulta em uma base de código que vai confundir sua mente. Ele inspirou outra linguagem chamada Malbolge, ou talvez seja Malbolge, que recebe o nome do oitavo círculo do Inferno na Divina Comédia de Dante. Se você achou o Brainfuck difícil, essa linguagem leva as coisas a um nível totalmente diferente. Ela torna a programação tão difícil que não consigo resumir como ela funciona em uma única frase. Se isso for um pouco sombrio demais, uma linguagem muito mais divertida é o Chef, que é baseada em pilha e é projetada para fazer com que seu código se pareça com uma receita de culinária em vez de palavras-chave concisas. Ela usa frases como "put ingredient into mixing bowl" (coloque o ingrediente na tigela de mistura) para empurrar um valor para a pilha. Junte esses comandos para criar um "Hello world souffle" e especifique a quantidade de porções para escrevê-lo na saída padrão.
Isso é bastante legal, mas pode parecer um pouco bobo para um intelectual. A linguagem de programação Shakespeare fará com que seu código pareça uma peça teatral de Shakespeare. Ela oferece o controle de baixo nível da linguagem assembly com a verbosidade da poesia do século XVI. Mas se palavras não são realmente sua praia, então uma boa escolha de linguagem seria o P, que recebe o nome de Piet Mondrian. Também é baseada em pilha, mas você escreve código utilizando padrões de 20 cores diferentes em uma imagem bitmap. O resultado final é uma base de código que se parece com arte abstrata. Emoji code é uma linguagem em que a sintaxe é totalmente baseada em emojis. Os desenvolvedores modernos gostam de usar tantos emojis em sua documentação que essa linguagem apenas simplificaria todo o processo. É uma linguagem orientada a objetos totalmente funcional, na qual você pode definir blocos de código com uvas e melancias, classes com coelhos e genéricos com conchas e berinjelas. Outra linguagem que não é necessariamente esotérica é o C—. Ela é projetada como uma linguagem de montagem portátil que se baseia muito no C, mas omite muitos de seus recursos.
No entanto, o dialeto final do C é o Holy C, que foi criado por Terry Davis e usado para construir o Temple OS, um sistema operacional escrito sob a direção de Deus. O Holy C é realmente legal porque funciona como C, mas é compilado em tempo de execução no sistema operacional, o que significa que você pode usá-lo como uma linguagem de script que pode interagir diretamente com o kernel do sistema operacional.
E isso nos leva ao último nível, o nível mais baixo absoluto que você pode alcançar em seu aprendizado como engenheiro de software. A linguagem Assembly tem muitas variações que correspondem diretamente à arquitetura do processador. Arquiteturas diferentes de CPU, como x86 e ARM, requerem diferentes instruções de código de máquina. A linguagem Assembly permite representar esse código com comandos simples que manipulam valores nos registradores da CPU. Agora, se isso parecer fácil demais, o próximo nível abaixo é o código de máquina. Nesse ponto, estamos falando de uns e zeros ou código binário puro, geralmente representado em formato hexadecimal. Nesse nível, você precisa ter um conhecimento íntimo da arquitetura do computador e também ser capaz de contar em binário. Mas se avançarmos além do código de máquina, estaremos falando de bilhões de transistores em um processador. Um único transistor representa um bit, um um ou um zero. Controlando a quantidade de eletricidade que flui através desses transistores, podemos representar informações digitais. E a partir desse nível, chegamos ao coração dos computadores e à base de todo o software moderno que usamos hoje.
Em suma, a jornada através das linguagens de programação é vasta e diversificada, oferecendo opções para cada tipo de projeto e preferência pessoal. Desde linguagens modernas e populares até linguagens históricas e esotéricas, cada uma tem seu lugar e propósito no mundo da programação. Cabe a você explorar e escolher as ferramentas certas para o seu trabalho, de acordo com os requisitos do projeto, eficiência, produtividade e outros fatores relevantes. E lembre-se, independentemente da linguagem que você escolher, o mais importante é o seu domínio dos conceitos de programação e a capacidade de resolver problemas de maneira eficaz e eficiente.