48 horas para aprender Go

Ou Ruby, JavaScript e Go a 80KM/h os três a 80: o que tu acha?


Apliquei para uma vaga em uma empresa bem bacana do Vale do Silício e com um escritório em Berlim. Na descrição da vaga, só fixei mesmo ao fato que tinha de saber Python, a linguagem que sou menos ruim atualmente. :)

Fiquei muito animada quando o primeiro contato chegou por email.

Hi Ana,
Thank you for your interest in Bla! We would like for you to work on our Coding Exercise. Please let me know some times (indicate your time zone) when you’re available to work on this assignment. You will have 48 hours to complete it. Once you confirm a date with me, I will send it over to you. Please also indicate what you prefer coding in with the following options: JavaScript, Ruby, and Go.
Looking forward to hearing back from you soon!

Ué, gente, cadê o tal do Python?

Confesso que eu reli esse email algumas vezes e fiquei por uns minutos meditando o que seria menos pior pra mim: JavaScript, Ruby ou Go?

Para ser honesta, o primeiro momento foi de frustração. Afinal de contas, como eu poderia mandar bem no exercício de uma linguagem que eu não me sinto ao menos confortável? O pior é que as três tão no mesmo nível pra mim: já fiz um Hello World em todas. Em Go eu até tinha arriscado um gerador de expressões pessoal, muito simples e com coisas que eu abomino, como nomear uma variável com uma letra só. Em JavaScript já fiz uns códigos bem feiosos com jQuery há umas eras atrás e com Ruby apenas uns scripts no melhor estilo Go Horse ou uma participação tímida no Rails Girls.

Claro que acabei indo perguntar nas interwebs, afinal a voz da internet é a voz de Deus (?).

No início da conversa eu ainda estava meio relutante. Quanto Pythonista, me parecia mais fácil mandar um Ruby, pela similaridade entre as duas linguagens. Afinal, eu tenho medo de JS (🤐) e até onde eu lembrava a sintaxe de Go era horrorosa (sim, esse é um texto humildão e honesto).

Então vamos as eliminações: porquê não JS?

O Yan já tinha sugerido Go e nesse tweet ele resume bem a treta. JS é bem flexível e está em tudo. Eu não fazia a menor ideia do que seria o exercício para a seleção. Mas a Thais resumiu bem a ópera e eu realmente risquei JavaScript da lista:

Bem, a essa altura eu já tava surtando: o que será que essa galera vai pedir? Será uma API? Será algoritmos? Será…?

Enquanto isso na sala de justiça, além das indicações dos tweets, pedi indicações a alguns amigos rubistas. Afinal, Python parece com Ruby, né?

Então, esse é o problema.

Nesse meio tempo, fui percebendo que Ruby poderia me iludir com uma auto-confiança que eu não poderia ter. E ia ser um desastre.

Should I stay or should I Go?

pausa para piadinha infame

Então estava decidido, iria de Go.

Eu logo depois que a convicção chegou

Bem, hora de traçar um plano. Afinal, o email chegou, precisava ser respondido e eu teria 48 horas pra estudar e resolver o exercício! Tentei fazer um exercício mental do que eu achava importante aprender em uma linguagem:

  • Criar variáveis, fluxo de controle, iterações
  • Bibliotecas principais
  • Convenções
  • Executar a parada
  • Criar testes
  • Como organizar um projeto

Muitos detalhes para pouco tempo.

Recentemente adquiri uma assinatura na Alura e lá eles tem um curso beeem basicão de Go. Dei uma olhada na proposta e achei interessante: a ideia era criar um monitorador de sites, para atuar tipo um pingdon. Isso ia me permitir ver um pouco da sintaxe básica e ainda a biblioteca http. Detalhe: no site fala que o curso dura 10 horas mas fiz em muito menos, pulando alguns exercícios e usando a velocidade 2x. :)

O curso foi bem legal para sair do zero e aprender Criar variáveis, fluxo de controle, iterações, Executar a parada e algumas Bibliotecas e Convenções. Bacana! Não sei se acrescenta muita coisa para quem desenvolveu uma coisinha mais básica mas para quem estava cega que nem eu, recomendo.

Fiz alguns exercícios no Exercism.io para dar aquela afiada na resolução de problemas. Tentei fazer algum projetinho no meio do final de semana mas sem sucesso; não tive tanto tempo quanto eu queria.

Mas dediquei muito tempo a leitura e encontrei algumas coisinhas bacanas, como:

E mais:

www.gobyexample.com

www.awesome-go.com

https://codegangsta.gitbooks.io/building-web-apps-with-go/content/

https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1

https://golang.org/doc/code.html

https://github.com/buduchail/go-skeleton

https://golang.org/doc/effective_go.html

https://github.com/tmrts/go-patterns

https://blog.golang.org/

O Avelino colaborou bastante para essa lista (valeuzão, Avelino! 👍🏽).

Essa palestra eu achei bem interessante. Como eu poderia estar pensando em Anti-Patterns se eu mal tenho algum Pattern em Go? Por incrível que pareça, eu já tinha cometido alguns dos erros nas minhas curtas horas de vida em Go. Bem legal vê-la pra entender mais da linguagem!

Para quem usa TDD e quer vê-lo na prática com Go, recomendo o Desenvolvimento passo a passo do exemplo "sinais" em Go. Bastante prático e didático!

Mas… eu vi a fundo 100% de tudo isso? Claro que não

Mas todos os conteúdos colaboraram com pelo menos um pouquinho do que veio depois. Comecei o desafio apenas morta de medo mas eu já não estava mais escrevendo variáveis com snake_case e sim em camelCase ou PascalCase. :)

No meio disso tudo, ainda me apareceu uma viagem de 26 horas pela frente. Para continuar a codagem offline, investi no e-book Programando em Go, da Casa do Código. Estou na metade do livro mas achei interessante ter como exemplo um encurtador de URLs. Me incomoda um pouco ser uma leitura descritiva do código mas recomendaria mesmo assim.

Coisas diferentes em Go

Assim como sair de Português para Alemão, tem muitas coisas que a gente acha diferentão quando muda de linguagem. Em Go, por exemplo:

  • Dá erro de compilação em variáveis não utilizadas 👍🏽
  • Variáveis sem valor setado são, por padrão, "", false, 0, 0.0 👍🏽
  • Tem apenas 25 palavras reservadas 👍🏽
  • Não tem try/catch 👍🏽
  • A herança é a diferentona do rolê — tentar implementar conceitos como classes abstratas pode ser burocrático no início 🤔
  • Não tem while, apenas for 👍🏽
  • Você pode criar quantos tipos quiser 👍🏽
  • Comentários são recomendados quando você tem funções públicas 👀
  • Burocrático para algo simples como ler e escrever arquivos 🙄
  • É bizarro o jeito de formatar datas 💣

Bem, eu poderia listar outras coisas mas acho que essas foram as que mais chamaram atenção. E, como iniciante, posso estar falando várias abobrinhas. Faz parte.

Bônus: usei o VSCode para o meu aprendizado e fiquei muito surpresa com o quanto me ajudou a aprender e a manter a qualidade do meu código. Fiz uma rápida pesquisa no maior-buscador-atual e muitas pessoas também recomendaram. Os plugins para Go estão bem maduros e a IDE é bem rápida.

Considerações Finais

Pois é, pessoal, essa foi a odisséia de aprender Go. Sobre o desafio? Acabei de submeter e eu consegui por em prática todos os pontinhos que listei acima. Partindo para a parte de design de software, tive grandes surpresas com Go. Pelo que entendi a linguagem é estruturada mas pude ver que existe um suporte a quem quiser usá-la orientada a objetos.

Pra mim foi bem interessante poder relembrar coisas como alocação de memória e ao mesmo tempo fazer exercícios de design para entender como usar os recursos da linguagem ao meu favor.

Foi muito bom poder aprender algo novo, apesar do frio na barriga/medão inicial. Quero agradecer aos tweets deixados e todas as dicas. Agora é cruzar os dedos para um resultado positivo! 🤞🏽

Até a próxima!

os.Exit(0)