SlideShare una empresa de Scribd logo
1 de 78
Descargar para leer sin conexión
Três anos de Scala no
NewsMonitor
Felipe Hummel
• Site profissional para monitoramento de notícias em
tempo real
• 170M de notícias
• 5M/mês
• 2 Devs Backend + 3 Devs PHP/Frontend
• ~30K linhas de código Scala
Como escolhemos Scala
• busk.com
• Fechado e pivotado
para o NewsMonitor
• Decisão de reaproveitar
código legado em Ruby
ou criar novo
• Aplicação ficou em
PHP
• Backend em Scala
Elastic
Search
Elastic
Search
Crawlers
Arquitetura Geral
Stark Indexer
MySQLMySQL Redis
Search API
Elastic
Search
autocomplete
Arquitetura
Coleta de Notícias
SocialCrawler
Feed
Crawler
Article
Crawler
Site
Crawler
Fila de Coleta
Article
Crawler
Article
Crawler
…
Article
Crawler
SeedCrawler
SeedCrawler
SeedCrawler
Scala
Scala
é muito boa como dizem
Scala, por quê?
• Concisão de código sem perca de legibilidade
• Inferência de tipos
• Sintaxe extremamente sucinta para funções anônimas
• Coleções: List, Array, Map, Seq, Set, String
• map, filter, groupBy, sortBy, distinct
• Quase tudo faz parte da biblioteca e não é sintaxe
especial da linguagem
Scala, por quê?
val idsDeAlunos = List(1423, 23245, 5343)

val cursosPorNome =

Map("Computação" -> 1234,

"Matemática" -> 423,

"Física" -> 5322,

"Biologia" -> 1312)
Scala, por quê?
val idsDeAlunos = List(1423, 23245, 5343)

val cursosPorNome =

Map("Computação" -> 1234,

"Matemática" -> 423,

"Física" -> 5322,

"Biologia" -> 1312)
Inferência de tipos
Scala, por quê?
val idsDeAlunos = List(1423, 23245, 5343)

val cursosPorNome =

Map("Computação" -> 1234,

"Matemática" -> 423,

"Física" -> 5322,

"Biologia" -> 1312)
Inferência de tipos
Scala, por quê?
val idsDeAlunos = List(1423, 23245, 5343)

val cursosPorNome =

Map("Computação" -> 1234,

"Matemática" -> 423,

"Física" -> 5322,

"Biologia" -> 1312)
Não é sintaxe
especial
Scala, por quê?
val idsDeAlunos = List(1423, 23245, 5343)

val cursosPorNome =

Map("Computação" -> 1234,

"Matemática" -> 423,

"Física" -> 5322,

"Biologia" -> 1312)
Scala, por quê?
case class Aluno(id: Int, curso: Curso, idade: Int)



val alunosPorIdade =

idsDeAlunos.map( id => carregaAluno(id) )





Scala, por quê?
case class Aluno(id: Int, curso: Curso, idade: Int)



val alunosPorIdade =

idsDeAlunos.map( id => carregaAluno(id) )

.filter(_.curso.nome == "Computação")



Scala, por quê?
case class Aluno(id: Int, curso: Curso, idade: Int)



val alunosPorIdade =

idsDeAlunos.map( id => carregaAluno(id) )

.filter(_.curso.nome == "Computação")

.filter(_.idade > 18)

Scala, por quê?
case class Aluno(id: Int, curso: Curso, idade: Int)



val alunosPorIdade =

idsDeAlunos.map( id => carregaAluno(id) )

.filter(_.curso.nome == "Computação")

.filter(_.idade > 18)

.groupBy(_.idade)
Scala, por quê?
case class Aluno(id: Int, curso: Curso, idade: Int)



val alunosPorIdade: Map[Int, List[Aluno]] =

idsDeAlunos.map( id => carregaAluno(id) )

.filter(_.curso.nome == "Computação")

.filter(_.idade > 18)

.groupBy(_.idade)
Scala, por quê?
case class Aluno(id: Int, curso: Curso, idade: Int)



val alunosPorIdade: Map[Int, List[Aluno]] =

idsDeAlunos.map( id => carregaAluno(id) )

.filter(_.curso.nome == "Computação")

.filter(_.idade > 18)

.groupBy(_.idade)
funções anônimas
sucintas
Scala, por quê?
• Várias pequenas funcionalidades que ajudam muito no
dia a dia
• Default e named parameters
• case classes: syntactic sugar que vale a pena
• Pattern Matching: switch case+++
• Preferência por imutabilidade mas sempre dando
opção por mutabilidade (quando necessária)
Scala é isso
80% de Scala é isso
Scala
pode ser complicada como dizem
__ _ _ _ Placeholder __ __ _ _
val lista = List(“maria”, “José”, “joão”, “Carlos")



lista.map( n => n.toUpperCase ) // List(“MARIA”, …)

lista.map( _.toUpperCase ) // List(“MARIA”, …)





__ _ _ _ Placeholder __ __ _ _
val lista = List(“maria”, “José”, “joão”, “Carlos")



lista.map( n => n.toUpperCase ) // List(“MARIA”, …)

lista.map( _.toUpperCase ) // List(“MARIA”, …)



lista.map( _.map(_.toUpper)) // List(“MARIA”, …)

__ _ _ _ Placeholder __ __ _ _
val lista = List(“maria”, “José”, “joão”, “Carlos")



lista.map( n => n.toUpperCase ) // List(“MARIA”, …)

lista.map( _.toUpperCase ) // List(“MARIA”, …)



lista.map( _.map(_.toUpper)) // List(“MARIA”, …)

lista.map { str =>

str.map( c => c.toUpper)

} // List(“MARIA”, …)
Implicits conversions






10.seconds // Int não tem o método seconds

^~~~~~ erro de compilação

Implicits conversions


import scala.concurrent.duration.DurationInt



10.seconds // Int agora “tem" o método seconds
Implicits conversions






import scala.concurrent.duration.DurationInt



val time: Duration = 10.seconds





import org.scalatest.Matchers._
val resultado: String = …

resultado should equal ("42")

Implicits conversions
import wildcard
implicit conversions
• Conceito similar ao que dá pra fazer em Ruby ou
Javascript, estendendo classes mas com tipagem
estática!
• Você precisa importar explicitamente a conversão
• Cuidado para não abusar
• Melhor usado em DSLs
Interoperabilidade com Java
• Em geral funciona bem
• Mas alguns conceitos de Java e Scala são
irreconciliáveis
• Na prática as 3 maiores dores são:
• Código Java que acha legal retornar null
• Código Scala que usa coleções Java e vice-versa
• Tipos primitivos: Integer e int (Java) <-> Int (Scala)
Scala
é complicada como dizem
Scala
é complicada como dizem
em poucas coisas
Compilador
• Poderoso mas “lento”
• Pra quem vem de Java, Go e linguagens
dinâmicas
• Rápido pra quem vem de C++
• Na prática: sbt ~compile ou sbt ~test
Estilos de Scala
• Muitas formas de escrever o mesmo código
• Um mais cool, outro mais funcional, outro mais
imperativo
• Qual usar?
Estilos de Scala
val lista = List(0, 1, 2, 3, 4)



lista.map( n => n + 1 )



Estilos de Scala
val lista = List(0, 1, 2, 3, 4)



lista.map { n => n + 1 }



Estilos de Scala
val lista = List(0, 1, 2, 3, 4)



lista map { n => n + 1 }



Estilos de Scala
val lista = List(0, 1, 2, 3, 4)



lista.map { _ + 1 }



Estilos de Scala
val lista = List(0, 1, 2, 3, 4)



lista.map ( _ + 1 )



Estilos de Scala




val lista = List(0, 1, 2, 3, 4)



def add1(n: Int) = n + 1



lista.map (add1)



Estilos de Scala




val lista = List(0, 1, 2, 3, 4)



def add1(n: Int) = n + 1



lista map add1



Estilos de Scala
lista.map ( n => n + 1 ) <—- Usamos

lista.map { n => n + 1 } <—- Usamos

lista map { n => n + 1 }

lista.map { _ + 1 } 

lista.map ( _ + 1 ) <—- Usamos 

lista.map (add1) <—- Usamos

lista map add1



Uso de memória e
tempo de startup
• Estar na JVM tem vantagens e desvantagens
• Uso de memória
• Scala piora um pouquinho a situação
• Queremos structs! Value Types (Java 9?)
• Go e Rust podem ser alternativas em casos que isso
é crítico
Scala Avançado e
Curva de Aprendizado
• Algumas partes da comunidade enveredam demais pelo caminho funcional
• Você não é obrigado a usar. Mas a divisão da comunidade não é legal
• Com grandes poderes vem grandes responsabilidades
• Abuso de features (overloading de operadores)
• <o> <!> <<! ># >! >:> >|> (NÃAO, só DSLs onde operador já faz sentido)
• Aprendizado
• Muito fácil fazer Scala “javado” (mas é um início fácil)
• Traz conceitos novos e não familiares para quem vem da linhagem de C:
implicits, pattern matching, typeclasses
Scala
mudou a forma
como programamos
Parar de acessar
o que não está lá
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no
attribute (Python)
• Call to a member function on a non-object
(PHP)
Parar de acessar
o que não está lá
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no
attribute (Python)
• Call to a member function on a non-object
(PHP)
Null Pointer Exc… NÃO
• NullPointerException (Java)
• undefined is not a function (Javascript)
• AttributeError: 'NoneType' object has no
attribute (Python)
• Call to a member function on a non-object
(PHP)
SCALA
NÃO TEM
!!!!!!!!!
Null Pointer Exc… NÃO
• Uso de Option[MeuTipo] quando necessário
Tipagem Estática!
• Linguagens com tipagem estáticas pegaram fama de serem
verbosas
• Não necessariamente
• Scala consegue ser tão concisa quanto as linguagens dinâmicas
• Tendência de adicionar tipos opcionais nas linguagens
dinâmicas
• Javascript, PHP, Python
• Difícil viver sem um compilador me ajudando
Imutabilidade
• Coisas a menos pra guardar na sua cabeça
• Não me preocupo se alguém pode ou vai mudar meu objeto
• Você pode passar objetos imutáveis pra lá e pra cá de boa
• Thread-safe por padrão
• Meio que obrigatório para chaves de Map, valores dentro de
Set ou Caches em geral
• Se você observa um valor numa variável, você sabe que ela foi
sempre aquilo
public class Person {

private final String firstName;

private final String lastName;
String getFirstName() { return firstName; }

String getLastName() { return lastName; }



public Person(String first, String last) {

this.firstName = first;

this.lastName = last;

}



public int hashCode() {

return goodHashCode(firstName, lastName);

}

public boolean equals(Object o) {

if ( this == aThat ) return true;

if ( !(aThat instanceof Person) ) return false;

Person that = (Person)aThat;

return EqualsUtil.areEqual(this.firstName, that.firstName) &

EqualsUtil.areEqual(this.lastName, that.lastName);

}

}
case class Person(firstName: String, lastName: String)
imutável é a palavra
Scala é a melhor coisa do
mundo?
Scala é a melhor coisa do
mundo?
$escapedName = mysql_escape_string($u)

$escapedCurso = mysql_real_escape_string($c)

$sql =

“SELECT * FROM usuarios

WHERE name LIKE '%”.$escapedName."%’ AND

curso = ‘“.$escapedCurso;
A minha
linguagem/framework/biblioteca
não é a melhor possível
Mais conciso e expressivo
que Scala é impossível
Mais conciso e expressivo
que Haskell é impossível
Programação é sempre um
comando seguido do outro
Programação pode ser só
(funções (chamando (funções ‘!’)))
em Clojure
Programar interfaces é ter que lidar
com estado mutável o tempo todo
Programar interfaces é isolar o
estado mutável com ReactJS
Ou damos free() na mão
ou usamos Garbage Collector
Ou damos free() na mão
ou usamos Garbage Collector
ou usamos Rust
e o seu sistema de ownership
Sempre dá pra melhorar
Obrigado!
Dúvidas?
@felipehummel
felipe.hummel@newsmonitor.com.br
Akka
Akka :)
• Simplifica muito o modelo mental para trabalhar com concorrência
• Cria "bolhas" onde você pode ser mutável à vontade (com moderação)
• Muito bom quando você tem Actors de vida longa e com estado
mutável
• Não precisa lidar com criação/manutenção de filas (na maior parte do
tempo)
• Tunar threadpools (dispatchers) não é necessário no início e é bem fácil
(via config)
• O código do Actor não contém (quase) nada de lógica lidando com
concorrência, threads ou threadpool
Akka :(
• Toma conta do código (framework)
• A relação entre actors não é tão óbvia no código quanto a relação entre objetos
num código tradicional (perca de tipagem)
• Você pode acabar tunando ExecutionContexts e ThreadPool de qualquer forma.
E não é trivial (independente do Akka).
• Mais "difícil" de testar
• Dá pra isolar algumas coisas e criar determinismo
• No final das contas tudo é concorrente
• Debugar é bem diferente
• Rastrear de onde uma coisa veio, pra onde vai…

Más contenido relacionado

La actualidad más candente

Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptTDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptRogério Moraes de Carvalho
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...tdc-globalcode
 
Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisLuiz Borba
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: IntroduçãoWesley R. Bezerra
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 

La actualidad más candente (12)

Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Curso ruby on rails
Curso ruby on railsCurso ruby on rails
Curso ruby on rails
 
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptTDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionais
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: Introdução
 
Objective-C
Objective-CObjective-C
Objective-C
 
Seminário: Lua
Seminário: LuaSeminário: Lua
Seminário: Lua
 
Javafx Introdução
Javafx IntroduçãoJavafx Introdução
Javafx Introdução
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Cap10
Cap10Cap10
Cap10
 

Similar a Três anos de Scala no NewsMonitor

Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaFelipe Hummel
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Eduardo Carvalho
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Linguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesLinguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesOziel Moreira Neto
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptRodrigo Branas
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Railsismaelstahelin
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Desenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on RailsDesenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on RailsLucas Caton
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Criando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDKCriando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDKLeonardo Dalmina
 
Curso de Java (Parte 2)
 Curso de Java (Parte 2) Curso de Java (Parte 2)
Curso de Java (Parte 2)Mario Sergio
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Daniel Sobral
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHPPaulo Dayvson
 
Orientação a Objetos para Desenvolvedores Android
Orientação a Objetos para Desenvolvedores AndroidOrientação a Objetos para Desenvolvedores Android
Orientação a Objetos para Desenvolvedores AndroidIury Teixeira
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordtchandy
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 

Similar a Três anos de Scala no NewsMonitor (20)

Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Linguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesLinguagem de Programação Java para Iniciantes
Linguagem de Programação Java para Iniciantes
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 
Linguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação JavaLinguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação Java
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Desenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on RailsDesenvolvimento ágil de software com Ruby on Rails
Desenvolvimento ágil de software com Ruby on Rails
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Criando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDKCriando Jogos 2D com Lua + Corona SDK
Criando Jogos 2D com Lua + Corona SDK
 
Curso de Java (Parte 2)
 Curso de Java (Parte 2) Curso de Java (Parte 2)
Curso de Java (Parte 2)
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
 
Orientação a Objetos para Desenvolvedores Android
Orientação a Objetos para Desenvolvedores AndroidOrientação a Objetos para Desenvolvedores Android
Orientação a Objetos para Desenvolvedores Android
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecord
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 

Três anos de Scala no NewsMonitor

  • 1. Três anos de Scala no NewsMonitor Felipe Hummel
  • 2. • Site profissional para monitoramento de notícias em tempo real • 170M de notícias • 5M/mês • 2 Devs Backend + 3 Devs PHP/Frontend • ~30K linhas de código Scala
  • 3. Como escolhemos Scala • busk.com • Fechado e pivotado para o NewsMonitor • Decisão de reaproveitar código legado em Ruby ou criar novo • Aplicação ficou em PHP • Backend em Scala
  • 5. Arquitetura Coleta de Notícias SocialCrawler Feed Crawler Article Crawler Site Crawler Fila de Coleta Article Crawler Article Crawler … Article Crawler SeedCrawler SeedCrawler SeedCrawler
  • 6.
  • 8. Scala é muito boa como dizem
  • 9. Scala, por quê? • Concisão de código sem perca de legibilidade • Inferência de tipos • Sintaxe extremamente sucinta para funções anônimas • Coleções: List, Array, Map, Seq, Set, String • map, filter, groupBy, sortBy, distinct • Quase tudo faz parte da biblioteca e não é sintaxe especial da linguagem
  • 10. Scala, por quê? val idsDeAlunos = List(1423, 23245, 5343)
 val cursosPorNome =
 Map("Computação" -> 1234,
 "Matemática" -> 423,
 "Física" -> 5322,
 "Biologia" -> 1312)
  • 11. Scala, por quê? val idsDeAlunos = List(1423, 23245, 5343)
 val cursosPorNome =
 Map("Computação" -> 1234,
 "Matemática" -> 423,
 "Física" -> 5322,
 "Biologia" -> 1312) Inferência de tipos
  • 12. Scala, por quê? val idsDeAlunos = List(1423, 23245, 5343)
 val cursosPorNome =
 Map("Computação" -> 1234,
 "Matemática" -> 423,
 "Física" -> 5322,
 "Biologia" -> 1312) Inferência de tipos
  • 13. Scala, por quê? val idsDeAlunos = List(1423, 23245, 5343)
 val cursosPorNome =
 Map("Computação" -> 1234,
 "Matemática" -> 423,
 "Física" -> 5322,
 "Biologia" -> 1312) Não é sintaxe especial
  • 14. Scala, por quê? val idsDeAlunos = List(1423, 23245, 5343)
 val cursosPorNome =
 Map("Computação" -> 1234,
 "Matemática" -> 423,
 "Física" -> 5322,
 "Biologia" -> 1312)
  • 15. Scala, por quê? case class Aluno(id: Int, curso: Curso, idade: Int)
 
 val alunosPorIdade =
 idsDeAlunos.map( id => carregaAluno(id) )
 
 

  • 16. Scala, por quê? case class Aluno(id: Int, curso: Curso, idade: Int)
 
 val alunosPorIdade =
 idsDeAlunos.map( id => carregaAluno(id) )
 .filter(_.curso.nome == "Computação")
 

  • 17. Scala, por quê? case class Aluno(id: Int, curso: Curso, idade: Int)
 
 val alunosPorIdade =
 idsDeAlunos.map( id => carregaAluno(id) )
 .filter(_.curso.nome == "Computação")
 .filter(_.idade > 18)

  • 18. Scala, por quê? case class Aluno(id: Int, curso: Curso, idade: Int)
 
 val alunosPorIdade =
 idsDeAlunos.map( id => carregaAluno(id) )
 .filter(_.curso.nome == "Computação")
 .filter(_.idade > 18)
 .groupBy(_.idade)
  • 19. Scala, por quê? case class Aluno(id: Int, curso: Curso, idade: Int)
 
 val alunosPorIdade: Map[Int, List[Aluno]] =
 idsDeAlunos.map( id => carregaAluno(id) )
 .filter(_.curso.nome == "Computação")
 .filter(_.idade > 18)
 .groupBy(_.idade)
  • 20. Scala, por quê? case class Aluno(id: Int, curso: Curso, idade: Int)
 
 val alunosPorIdade: Map[Int, List[Aluno]] =
 idsDeAlunos.map( id => carregaAluno(id) )
 .filter(_.curso.nome == "Computação")
 .filter(_.idade > 18)
 .groupBy(_.idade) funções anônimas sucintas
  • 21. Scala, por quê? • Várias pequenas funcionalidades que ajudam muito no dia a dia • Default e named parameters • case classes: syntactic sugar que vale a pena • Pattern Matching: switch case+++ • Preferência por imutabilidade mas sempre dando opção por mutabilidade (quando necessária)
  • 23. 80% de Scala é isso
  • 25. __ _ _ _ Placeholder __ __ _ _ val lista = List(“maria”, “José”, “joão”, “Carlos")
 
 lista.map( n => n.toUpperCase ) // List(“MARIA”, …)
 lista.map( _.toUpperCase ) // List(“MARIA”, …)
 
 

  • 26. __ _ _ _ Placeholder __ __ _ _ val lista = List(“maria”, “José”, “joão”, “Carlos")
 
 lista.map( n => n.toUpperCase ) // List(“MARIA”, …)
 lista.map( _.toUpperCase ) // List(“MARIA”, …)
 
 lista.map( _.map(_.toUpper)) // List(“MARIA”, …)

  • 27. __ _ _ _ Placeholder __ __ _ _ val lista = List(“maria”, “José”, “joão”, “Carlos")
 
 lista.map( n => n.toUpperCase ) // List(“MARIA”, …)
 lista.map( _.toUpperCase ) // List(“MARIA”, …)
 
 lista.map( _.map(_.toUpper)) // List(“MARIA”, …)
 lista.map { str =>
 str.map( c => c.toUpper)
 } // List(“MARIA”, …)
  • 28. Implicits conversions 
 
 
 10.seconds // Int não tem o método seconds
 ^~~~~~ erro de compilação

  • 31. 
 import org.scalatest.Matchers._ val resultado: String = …
 resultado should equal ("42")
 Implicits conversions import wildcard
  • 32. implicit conversions • Conceito similar ao que dá pra fazer em Ruby ou Javascript, estendendo classes mas com tipagem estática! • Você precisa importar explicitamente a conversão • Cuidado para não abusar • Melhor usado em DSLs
  • 33. Interoperabilidade com Java • Em geral funciona bem • Mas alguns conceitos de Java e Scala são irreconciliáveis • Na prática as 3 maiores dores são: • Código Java que acha legal retornar null • Código Scala que usa coleções Java e vice-versa • Tipos primitivos: Integer e int (Java) <-> Int (Scala)
  • 35. Scala é complicada como dizem em poucas coisas
  • 36. Compilador • Poderoso mas “lento” • Pra quem vem de Java, Go e linguagens dinâmicas • Rápido pra quem vem de C++ • Na prática: sbt ~compile ou sbt ~test
  • 37. Estilos de Scala • Muitas formas de escrever o mesmo código • Um mais cool, outro mais funcional, outro mais imperativo • Qual usar?
  • 38. Estilos de Scala val lista = List(0, 1, 2, 3, 4)
 
 lista.map( n => n + 1 )
 

  • 39. Estilos de Scala val lista = List(0, 1, 2, 3, 4)
 
 lista.map { n => n + 1 }
 

  • 40. Estilos de Scala val lista = List(0, 1, 2, 3, 4)
 
 lista map { n => n + 1 }
 

  • 41. Estilos de Scala val lista = List(0, 1, 2, 3, 4)
 
 lista.map { _ + 1 }
 

  • 42. Estilos de Scala val lista = List(0, 1, 2, 3, 4)
 
 lista.map ( _ + 1 )
 

  • 43. Estilos de Scala 
 
 val lista = List(0, 1, 2, 3, 4)
 
 def add1(n: Int) = n + 1
 
 lista.map (add1)
 

  • 44. Estilos de Scala 
 
 val lista = List(0, 1, 2, 3, 4)
 
 def add1(n: Int) = n + 1
 
 lista map add1
 

  • 45. Estilos de Scala lista.map ( n => n + 1 ) <—- Usamos
 lista.map { n => n + 1 } <—- Usamos
 lista map { n => n + 1 }
 lista.map { _ + 1 } 
 lista.map ( _ + 1 ) <—- Usamos 
 lista.map (add1) <—- Usamos
 lista map add1
 

  • 46. Uso de memória e tempo de startup • Estar na JVM tem vantagens e desvantagens • Uso de memória • Scala piora um pouquinho a situação • Queremos structs! Value Types (Java 9?) • Go e Rust podem ser alternativas em casos que isso é crítico
  • 47. Scala Avançado e Curva de Aprendizado • Algumas partes da comunidade enveredam demais pelo caminho funcional • Você não é obrigado a usar. Mas a divisão da comunidade não é legal • Com grandes poderes vem grandes responsabilidades • Abuso de features (overloading de operadores) • <o> <!> <<! ># >! >:> >|> (NÃAO, só DSLs onde operador já faz sentido) • Aprendizado • Muito fácil fazer Scala “javado” (mas é um início fácil) • Traz conceitos novos e não familiares para quem vem da linhagem de C: implicits, pattern matching, typeclasses
  • 49. Parar de acessar o que não está lá • NullPointerException (Java) • undefined is not a function (Javascript) • AttributeError: 'NoneType' object has no attribute (Python) • Call to a member function on a non-object (PHP)
  • 50. Parar de acessar o que não está lá • NullPointerException (Java) • undefined is not a function (Javascript) • AttributeError: 'NoneType' object has no attribute (Python) • Call to a member function on a non-object (PHP)
  • 51. Null Pointer Exc… NÃO • NullPointerException (Java) • undefined is not a function (Javascript) • AttributeError: 'NoneType' object has no attribute (Python) • Call to a member function on a non-object (PHP) SCALA NÃO TEM !!!!!!!!!
  • 52. Null Pointer Exc… NÃO • Uso de Option[MeuTipo] quando necessário
  • 53. Tipagem Estática! • Linguagens com tipagem estáticas pegaram fama de serem verbosas • Não necessariamente • Scala consegue ser tão concisa quanto as linguagens dinâmicas • Tendência de adicionar tipos opcionais nas linguagens dinâmicas • Javascript, PHP, Python • Difícil viver sem um compilador me ajudando
  • 54. Imutabilidade • Coisas a menos pra guardar na sua cabeça • Não me preocupo se alguém pode ou vai mudar meu objeto • Você pode passar objetos imutáveis pra lá e pra cá de boa • Thread-safe por padrão • Meio que obrigatório para chaves de Map, valores dentro de Set ou Caches em geral • Se você observa um valor numa variável, você sabe que ela foi sempre aquilo
  • 55. public class Person {
 private final String firstName;
 private final String lastName; String getFirstName() { return firstName; }
 String getLastName() { return lastName; }
 
 public Person(String first, String last) {
 this.firstName = first;
 this.lastName = last;
 }
 
 public int hashCode() {
 return goodHashCode(firstName, lastName);
 }
 public boolean equals(Object o) {
 if ( this == aThat ) return true;
 if ( !(aThat instanceof Person) ) return false;
 Person that = (Person)aThat;
 return EqualsUtil.areEqual(this.firstName, that.firstName) &
 EqualsUtil.areEqual(this.lastName, that.lastName);
 }
 }
  • 56. case class Person(firstName: String, lastName: String)
  • 57. imutável é a palavra
  • 58.
  • 59.
  • 60.
  • 61.
  • 62. Scala é a melhor coisa do mundo?
  • 63. Scala é a melhor coisa do mundo?
  • 64. $escapedName = mysql_escape_string($u)
 $escapedCurso = mysql_real_escape_string($c)
 $sql =
 “SELECT * FROM usuarios
 WHERE name LIKE '%”.$escapedName."%’ AND
 curso = ‘“.$escapedCurso;
  • 66. Mais conciso e expressivo que Scala é impossível
  • 67. Mais conciso e expressivo que Haskell é impossível
  • 68. Programação é sempre um comando seguido do outro
  • 69. Programação pode ser só (funções (chamando (funções ‘!’))) em Clojure
  • 70. Programar interfaces é ter que lidar com estado mutável o tempo todo
  • 71. Programar interfaces é isolar o estado mutável com ReactJS
  • 72. Ou damos free() na mão ou usamos Garbage Collector
  • 73. Ou damos free() na mão ou usamos Garbage Collector ou usamos Rust e o seu sistema de ownership
  • 74. Sempre dá pra melhorar
  • 76. Akka
  • 77. Akka :) • Simplifica muito o modelo mental para trabalhar com concorrência • Cria "bolhas" onde você pode ser mutável à vontade (com moderação) • Muito bom quando você tem Actors de vida longa e com estado mutável • Não precisa lidar com criação/manutenção de filas (na maior parte do tempo) • Tunar threadpools (dispatchers) não é necessário no início e é bem fácil (via config) • O código do Actor não contém (quase) nada de lógica lidando com concorrência, threads ou threadpool
  • 78. Akka :( • Toma conta do código (framework) • A relação entre actors não é tão óbvia no código quanto a relação entre objetos num código tradicional (perca de tipagem) • Você pode acabar tunando ExecutionContexts e ThreadPool de qualquer forma. E não é trivial (independente do Akka). • Mais "difícil" de testar • Dá pra isolar algumas coisas e criar determinismo • No final das contas tudo é concorrente • Debugar é bem diferente • Rastrear de onde uma coisa veio, pra onde vai…