Quando aprendi pela primeira vez sobre Go, a linguagem de programação muito própria do Google, fiquei intrigado. Desenhada e lançada em 2007, Go, também conhecida como Golang, estava entre uma multidão de novas linguagens – Ferrugem, D, Nim, Scala, Clojure – que geravam um zumbido no início a meados da década de 2010: Na época, os programadores pareciam ansiosos por se afastar da bagagem verbosa das linguagens backend mais antigas (Java, C++), bem como da ineficiência computacional e da falta de segurança das linguagens dinâmicas utilizadas na web (PHP, Ruby, Python). Eles queriam segurança de digitação, o que significava que eles queriam digitação estática. E eles queriam velocidade.
Foi fácil encontrar histórias sobre startups, como IronMQ, que passaram de dezenas de servidores usados para hospedar Rails para um casal que poderia ser hospedado em uma linguagem como Go. E como alguém que estava, na época, mergulhado no PHP5 e todos os seus problemas, eu me contei entre a multidão de interessados.
Quando me deparei com Go pela primeira vez, no meu antigo trabalho como CTO na ActiveCampaign, eu tentei escrever algum código nele. E eu não gostei. Me dava problemas sempre que eu deixava uma variável sem uso ou importava um pacote sem uso. Go era particularmente rígido sobre digitação – eu estava familiarizado com a coerção do tipo PHP, mas eu também estava acostumado com C e C++, que permitiam misturar números inteiros assinados e não assinados, assim como misturar números inteiros (16-bit, 32-bit, 64-bit).
Go não tinha genéricos. Na verdade, um de seus principais linguistas (Rob Pike) era bastante estridente sobre o que faltava no idioma. Como disse Pike, isto foi uma coisa boa, e boa para você. A linguagem foi concebida para os engenheiros “médios” que trabalhavam no Google, se é que se pode chamar-lhes isso. Em certo sentido, o que você leu sobre Go naquela época pareceu um “put-down”. E até hoje, não é difícil encontrar pessoas que continuem a compartilhar essas críticas.
Então o que mudou minha opinião?
Go é simples. A esse respeito, ele se destaca de outras línguas. A simplicidade é uma virtude, e qualquer complexidade que se introduza na língua é cuidadosamente considerada.
Por um longo tempo, se você perguntar a alguém – Faltava um verdadeiro gerenciamento de pacotes. Foi somente em 2018 – após várias rodadas de envolvimento da comunidade e um gerenciador de pacotes experimental não-oficial chamado “dep”- que qualquer suporte oficial para sua solução (“módulos”) foi adicionado à linguagem.
Mas dentro dessa simplicidade você encontra um grande valor. Você pode facilmente escrever alguns one-liners em Ruby que fazem coisas legais, mas escondidos nesses one-liners é muita mágica: É difícil para o desenvolvedor despretensioso sempre entender o processo que acontece nos bastidores. Talvez seja preciso cinco linhas de código para escrever a mesma coisa em Go, mas você sabe o que essas cinco linhas estão fazendo.
Go também tira um dos conceitos clássicos no OOP: herança. Você não pode escrever uma classe base em Go e ter outra classe herdada a partir dela. Na verdade, você não tem “classes” de todo.
No começo, parece uma tremenda restrição ter uma das ferramentas básicas de reutilização e encapsulamento tirada de você. E é natural que sua primeira inclinação seja um sentimento de ressentimento.
Mas, hoje em dia, você muitas vezes não usa herança, mesmo que pudesse. Você usa interfaces, você se concentra no comportamento e abstração – e isso você pode fazer facilmente em Go. Na verdade, é tudo o que você pode fazer em Go. Depois de um tempo, a falta de herança se sente bem porque você está evitando uma camada de dívida técnica por não ter que revisitar o perigoso ninho de relacionamentos que você construiu usando a herança. Talvez Pike estava em algo afinal.
Today, Go esculpiu um espaço definido na linguagem ecosfera. Não está a tentar substituir C++, como uma vez foi pensado (e sugerido). Embora você possa ter pensado que precisava de Java para um certo projeto há 10 anos atrás, hoje em dia, você pode estar melhor alcançando Go.
Languages to LearnEngineering Leaders Discuss Ruby on Rails, C#, Python e JavaScript