Back-End

19 mar, 2018

Como fazer para aprender novas linguagens?

Publicidade

A carreira de desenvolvimento de software é complicada. Tanto em saber como começar ou como continuar crescendo. E uma das dúvidas mais frequentes, tanto de novatos quanto de profissionais experientes, é sobre qual linguagem ou plataforma escolher.

A motivação para essa questão é que quem faz faculdade ou tem um emprego, se encontra na posição de ter “pouco tempo” para aprender alguma coisa nova. E quando você é continuamente bombardeado com coisas novas, fica com a sensação de que está ficando para trás. E a ansiedade só aumenta à medida que você fica paralisado escolhendo o que aprender agora.

Antes de mais nada, respire fundo. O maior problema não é o que escolher. O problema é dar o primeiro passo. A grande maioria que passou por uma educação formal e depois entra num emprego, fica com a impressão de que a faculdade já deveria ter ensinado o que precisava e que qualquer coisa nova que o empregador precise é responsabilidade da empresa pagar o treinamento. Errado.

Esse modelo ficou para trás. Desenvolvimento de software é uma carreira que sempre esteve em constante evolução e continuará sendo assim pelas próximas décadas. Durante sua carreira, você verá dezenas de linguagens, plataformas e produtos nascendo e morrendo. E muito do que você aprender nesse caminho vai se tornar obsoleto antes de você se aposentar. Portanto, você precisa se manter em constante movimento. E o único responsável pela sua própria evolução é você mesmo.

Dito isso, ainda fica a questão: “mas onde vou arranjar tempo para aprender tanta coisa?”. Você não vai. É impossível aprender tudo sobre tudo. Quando alguma coisa é impossível, você não desiste nem fica parado. Você muda a estratégia. Então reformule. Não imagine tentar aprender 100% de alguma coisa. Coloque como meta aprender 10% ou 5% de tudo que for novo. É para isso que servem os inúmeros portais de tutoriais, screencasts ou cursos online disponíveis hoje.

Não pegue um tema e ache que você precisa ler os livros de capa a capa. Em vez disso, familiarize-se com tudo. Quando achar um tema que chame sua atenção, seja por gosto pessoal, ou seja porque entendeu que pode ajudar no seu dia a dia, aprofunde-se. Esse é o caminho para otimizar seu tempo. Mas não fique parado, o importante é tornar isso uma rotina. Todo dia aprendendo algo novo, fora do que você usa no dia a dia.

Embora toda linguagem sirva para fazer basicamente tudo que outras linguagens fazem, elas normalmente têm alguns casos de uso principais, nos quais mostram melhor suas forças. Por exemplo, embora seja possível fazer um website com C++ puro (em vez de PHP ou Ruby), acho que ninguém faria isso no dia a dia. Dito isso, vamos entender alguns casos especiais das novas linguagens que apareceram nos últimos anos para ter um pequeno contexto desses casos de uso.

Rust

Foi criado – e é mantido – pela Mozilla (mesma do Firefox). É uma linguagem que se aproxima mais do metal (o que costumamos chamar de “baixo-nível”). Não chega a ser um C, mas está próximo de um C++. Idealmente, você poderia usá-lo para criar bibliotecas que precisam de performance de execução e gerenciamento fino de memória sem comprometer a segurança.

Quanto mais uma linguagem gerencia automaticamente a memória, teoricamente tem mais meios de apertar a segurança; por outro lado, no geral, precisa consumir mais memória total e pode ter períodos de pausa para fazer a limpeza. São aspectos inadequados para bibliotecas de sistemas ou programas que precisam rodar em baixo-nível. Por isso uma linguagem como Rust pode ser uma boa alternativa nesses casos.

Go

Criado e mantido pela Google, inicialmente pensado para aumentar a produtividade do desenvolvimento de seus próprios sistemas em vez de usar Java ou C++. Em termos simples, é uma linguagem para aplicações. Ele encontrou seu “killer-app” no ecossistema Docker e devops. Muitas novas ferramentas de linha de comando, daemons, estão sendo feitos em Go. Se você já programou em Java, C++, C# ou similares, a sintaxe de Go não será tão mais complicada, e seu chamariz é ter um garbage collector para facilitar o gerenciamento de memória e executar tarefas em paralelo (as famosas `gofunc`). No geral, ele é mais “pesado” em uso de recursos do que Rust, por exemplo.

Elixir

É uma nova linguagem sobre uma antiga, o Erlang. A sintaxe de Erlang é derivada de Prolog e, para a maioria de nós, parecerá muito exótica, mas Elixir “moderniza” essa sintaxe e cria uma biblioteca padrão mais rica e mais parecida com o que estamos acostumados em Ruby ou Python.

Enquanto linguagens como Go trazem uma pequena infraestrutura para executar milhares de pequenas tarefas em paralelo, há muito pouco controle. Erlang/Elixir, ao contrário, é como se fosse um pequeno “sistema operacional” a mais do que só uma linguagem. Somente conseguir ter concorrência (como Go) não é suficiente se você não conseguir controlar essa concorrência.

Esse controle não é simples e nem é trivial. Seu caso de uso principal são sistemas altamente distribuídos que querem atingir máximo grau de confiabilidade (um erro; um bug não corrompe o sistema e não exige reiniciar tudo). Se você planeja algo como um novo WhatsApp, Waze, Discord, ou mesmo criar coisas como um banco de dados distribuído (por exemplo, Riak), essa é a melhor escolha.

Clojure

Em parte do seu apelo em ter primitivas de concorrência como Go, permite atingir níveis de confiabilidade como Erlang/Elixir, mas exige que você abandone paradigmas de sintaxe derivadas de C++ (Java, C#, Go, e até mesmo Elixir) e debruce totalmente em sintaxe derivada de Lisp. Portanto, você precisa gostar de programar com muitos parênteses.

Ele não chega a ser “puramente” funcional como Haskell, mas é o mais próximo que você vai chegar do Haskell, com a vantagem de integrar com o ecossistema existente de Java. No Brasil, o principal case é o Nubank, que usa Clojure e Clojurescript (que compila em JavaScript) ostensivamente.

Scala

É outra nova linguagem que visa substituir a sintaxe clássica de Java, mantendo a compatibilidade com o bytecode Java (para ter acesso ao ecossistema) e ir um pouco além. Ele tem uma origem mais “acadêmica”, e isso aparece no ecossistema e na evolução da linguagem. Até hoje ele não tem compatibilidade binária entre versões diferentes de Scala, isso porque ele cria bytecodes extras que não existem no Java (para coisas que ele quer ter como “traits”, que funcionam meio como interfaces).

Ele não é tão novo assim, tendo aparecido em 2004, e a principal novidade foi ter trazido a infraestrutura de “Actors” (como no framework Akka), que é derivado da infraestrutura que Erlang oferece. Portanto, ele é muito bom para casos parecidos do Elixir.

Kotlin

Também não é novo, tendo sido criado pela JetBrains (que faz a famosa IDE IntelliJ, que também vem gratuitamente como Android Studio no SDK do Android). Atualmente, seu foco tem sido mais para ser um Java mais moderno que compila para o mesmo bytecode.

Diferente de Clojure ou Scala, ele tem “zero” overhead. Uma classe Kotlin é um-para-um uma classe de Java, e você pode misturar código-fonte em Kotlin e Java no mesmo projeto, o que garante uma migração bem mais suave. Sua sintaxe é muito mais moderna e mais prazerosa de desenvolver no dia a dia do que Java clássico.

Elm

Uma das linguagens da enorme família de “transpilers” para JavaScript. Linguagens como Elm mudam completamente o paradigma de programação (no caso, indo para uma linha mais “Haskell” puramente funcional) e também oferecem uma plataforma completa (em vez de você escolher quais bibliotecas/frameworks usar).

Ele é feito especificamente para desenvolver front-end Web com código-fonte mais confiável, mais estruturado, seguindo as mesmas convenções para aplicações web ricas e performáticas. É uma excelente opção, mas representa um nicho, e você não tem a opção de entrar aos poucos: é meio “tudo ou nada”.

Swift

É obrigatório se você quer desenvolver aplicações nativas para iOS. Ele representa a culminação de uma tecnologia chamada LLVM (também utilizada por Rust e Kotlin). LLVM, de forma simplificada, é um framework para compiladores que separa a compilação de diversas linguagens numa linguagem intermediária única que pode gerar binários para diferentes arquiteturas (ARM, Intel, e até mesmo outras linguagens como JavaScript com emscripten). Sendo Swift e Objective-C compilados usando LLVM e gerando binários compatíveis, há uma garantia de que você pode misturar as duas linguagens e obter um binário que rode em Macs, iPhones e iPads.

Existem ainda diversas outras novas linguagens. No mundo .NET, por exemplo, você pode ir além de C# e escolher F#. Cada uma das linguagens acima representa todo um ecossistema de ferramentas, bibliotecas e serviços.

Mas o importante é que você não precisa escolher apenas uma e ignorar as outras. Você pode – e deve – estudar o máximo possível. Mas comece pequeno, um screencast de cada linguagem. Saiba configurar o ambiente de desenvolvimento de cada uma. Compile binários, faça deploys em produção. Comece a se sentir confortável com o ambiente de cada uma. Só então comece a ir mais fundo em conceitos e técnicas mais avançadas.

***

Artigo publicado na revista iMasters, edição #24: https://issuu.com/imasters/docs/24