🇮🇪 Read in English

Minha saga aprendendo Scala - Parte 1

Eu decidi que eu precisava aprender uma nova linguagem e a linguagem que escolhi foi Scala. Eu adicionei como meta para 2020 eu, pelo menos, me sentir um pouco confortável com essa linguagem, então aqui estou.

Até agora, minha história com Scala tem sido… frustrante (para dizer o mínimo). Eu estava tentando aprender sozinha e sem muito alarde - porque é muito difícil - mas decidi escrever o que aprendi e o que foi difícil no processo. Isso pode ser útil para outra pessoa, mas principalmente isso é para mim. Eu utilizo artigos como esse para me ajudar a estudar e ajudar a sentir que estou evoluindo:

Então vou me forçar nesses artigos a organizar meus pensamentos, compartilhar coisas interessantes que encontrei e encontrar algum uso para as minhas frustrações. Essas postagens não pretendem ser um tutorial, mas uma forma de deixar registrado o que eu aprendi (conhecido em inglês como brain dump, despejo cerebral).

Porque Scala?

Para ser sincera, eu não escolhi Scala, Scala me escolheu 😅. Em geral, minhas razões foram:

  • ✅ É uma linguagem orientada a objetos e funcional ao mesmo tempo. Isso vai me fazer questionar minhas suposições e mudar a maneira como eu desenvolvo. Todo desenvolvedor incrível que eu conheço recomendou que eu aprendesse uma linguagem funcional para mudar o estilo de programar. Eu poderia escolher qualquer uma, Scala serve como qualquer outra.
  • ✅ É uma linguagem que está sendo altamente utilizada para análises de grandes conjuntos de dados e, portanto, super útil no mundo da ciência de dados. Eu adoro ciência de dados e adoro processar dados. Se eu quiser ir para um idioma útil para ciência de dados e big data, Scala é uma excelente opção.
  • ✅ É uma linguagem JVM de fortemente tipada. Algo que pode me ajudar a apresentar esse mundo e seguir uma direção diferente do que eu vi até agora com Python.
  • ✅ É uma das principais tecnologias do meu trabalho atual. No ano passado, tive que trabalhar numa base que usa Scala e isso exigiu muita ajuda de colegas, porque eu não fazia a menor ideia de como resolver o problema. É uma oportunidade de aprender alguma coisa… então por que não apenas parar, estudar e parar de sofrer?

Mais sobre a linguagem

Da wikipedia:

Scala é uma linguagem de programação de uso geral que fornece suporte para programação funcional e um sistema estático fortemente tipado. Projetado para serem conciso, muitas das decisões de design de Scala visavam abordar as principais críticas feitas a Java.

Scala é uma linguagem compilada, o que significa que todo o código que você escreve é compilado em um arquivo binário que é então processado pela JVM (Java Virtual Machine). A parte interessante é que o arquivo binário gerado é o mesmo tipo de arquivo gerado pelo compilador do Java.

Eu pensei que Scala era uma linguagem nova (~2010), mas sua criação foi iniciada em 2001 por Martin Odersky, em a primeira versão foi lançada em 2003. Há algumas entrevistas com Martin falando sobre como ele surgiu com a ideia de criar uma linguagem melhor que Java, mas que ainda usasse a infraestrutura Java. E isso é algo particularmente estranho: você pode usar o código Java e importar bibliotecas Java dentro do seu código Scala. E isso não é algo raro, muitas coisas em Scala são na verdade objetos Java e podem ser usados em conjunto com as bibliotecas Java padrão. Isso é incrível se você está tentando mudar um projeto de uma linguagem para outra, mas se você não sabe nada sobre Java, parece que na verdade está aprendendo duas linguagens ao mesmo tempo.

Eu também queria ver como as pessoas estão vendo Scala no mercado de trabalho. Meu lugar natural de busca é a pesquisa do Stack Overflow que eles fazem todos os anos. Como o relatório de 2020 ainda não foi publicado, verifiquei o relatório de 2019. Em 2019, Scala foi listada como a 20º das 25 linguagens mais populares, 58% das desenvolvedoras que trabalham com Scala adoram e é a 17a linguagem mais desejada.

Quais materiais estou usando para estudar?

Primeiro, comecei a procurar alguns livros recomendados. Em seguida, esbarrei no meu primeiro problema ao tentar passar do Python para o Scala: todos os livros e tutoriais assumem que eu sei Java. E, como você pode imaginar, eu não sei nada de Java!

O primeiro livro que alguém me recomendou, Functional Programming in Scala, era muito confuso e comparava tudo ao Java. Em vez de explicar os recursos, só falava “isso aqui é igual no Java”. E era isso. Ótimo! Agora eu preciso aprender uma linguagem para aprender uma outra linguagem? Que??

Depois disso, comecei a procurar alguns recursos online. O Tutorials Point foi uma boa maneira de começar a entender variáveis, um pouco de classes e como escrever código. Mas senti que algo estava faltando. Eu não estava satisfeita e decidi continuar procurando um material que me fosse adequado

Finalmente, encontrei um link dos Principais Tutoriais para Aprender Scala e encontrei um curso chamado Scala & Functional Programming for Beginners do Daniel Ciocîrlan. Foi um alívio ver as aulas gratuitas e decidiu comprá-lo. Os cursos não pressupõem que você conheça Java e explica as maneiras de pensar e escrever código de uma maneira mais funcional. Até agora, estou gostando muito e recomendo totalmente.

Também recebi uma recomendação impressionante da maravilhosa Dani Petruzalek que ainda não estou estudando por completo: uma aula do Coursera e um livro de Martin Odersky, o criador do Scala, e essa palestra:

O que eu aprendi até agora

Tipos

Scala tem tipos, mas eles não são obrigatórios para conseguir fazer o código compilar. Assim, semelhante ao Python, se eu fizer val x = 2, o compilador entenderá que 2 é um número inteiro e, portanto, x também é um número inteiro. O mesmo é válido para os tipos retornados por funções. Exemplo:

def umaFuncao(a: Int) = a

// mesma coisa que

def umaFuncaoExplicita(a: Int): Int = a

Isso é verdade, exceto nas funções recursivas. Funções recursivas exigem que a saída seja explícita, caso contrário, o compilador gerará um erro.

Compilador esperto

Da mesma forma que o compilador deduz o tipo com base no que você colocou, ele também pode fazer alterações com base nesses mesmos tipos. Por exemplo, você acha que o código a seguir funcionará?

val x = 2 + " bananas"

Sim, vai! O compilador verá que você está adicionando um número inteiro a uma string e vai chamar a função 2.toString para converter o número inteiro em uma string e evitar um erro de compilação. O mesmo é válido para:

val x = 2 + "3"

O que retornará a string “23”. Ainda não sei como isso é definido, se strings tem prioridade sobre inteiros ou não (parece que sim), mas vou tentar descobrir mais sobre isso 🙂

Uma função retorna a última coisa

Quando você escreve uma função, não precisa usar return para explicitar o que a função vai retornar. Uma função sempre retornará a última coisa que está dentro de um bloco. No exemplo abaixo, temos um valor que é um número inteiro, mas o retorno da função é uma string.

def umaFuncao(a: Int) = {
  val x = 123 + 456
  "Alguma coisa"
}

Muitas coisas não são obrigatórias!

Parênteses em funções que não recebem parâmetros também não são obrigatórios. Portanto, "Hello".sorted() é o mesmo que "Hello".sorted.

O mesmo vale para colchetes para definir o bloco de uma função!

def outraFuncao(n: Int): Int =
  if (n == 1) 1
  else 2

// mesma coisa que 

def outraFuncao(n: Int): Int = {
  if (n == 1) 1
  else 2
}

Métodos são… diferentes

Os métodos podem ter qualquer nome, incluindo caracteres especiais como + ou %. E como a gente viu se uma função recebe apenas um parâmetro, você não precisa adicionar os parênteses. Então, basicamente, quando você faz a + b, está realmente chamando o método + na instância a com b como parâmetro!

a + b 

//  mesma coisa que

a.+(b)

É isso por hoje 🙂 Vejo você na Parte 2!


Abraço!
Letícia

Comments