além da
programação funcional
twitter.com/elaine_nw
speakerdeck.com/elainenaomi
Elaine Naomi Watanabe
Desenvolvedora de Software (Plataformatec)
Mestrado em Ciência da Computação (USP)
num passado não tão distante
Python ~ 6 meses
Java ~ 1 ano
C++ ~ 1 ano
PHP ~ 3 anos
no momento
Elixir 2 meses
Ruby 3,5 anos
1996
Sistemas distribuídos
Concorrência e paralelismo
Aplicações intensivas em dados
no meio tempo
no meio tempo
Modelagem de domínio
Modelos transacionais
Bancos de dados distribuídos
NoSQL
no momento
Elixir 2 meses
Ruby 3,5 anos
Compartilhar minha jornada
em uma nova linguagem
Parte I Conhecendo Elixir
Parte II Migrando para Elixir
Parte III Entregando valor com Elixir
vamos nessa?
PARTE I
Conhecendo Elixir
...
Linguagem nova
Paradigma funcional
Linguagem nova
Paradigma funcional
Muitas pessoas de Ruby comentando
José Valim
Co-fundador da Plataformatec
Criador do Elixir
criadora das gems:
ELIXIR BRASIL 2018
...
Erlang
Erlang/OTP
Processos
Macros
Erlang
Erlang/OTP
Processos
Macros
Erlang
Erlang/OTP
Processos
Macros
Erlang
Erlang/OTP
Processos
Supervisors
...
TERMOS MÁGICOS
Entendendo o idioma
Entendendo concorrência
Utilizando todos os cores
Distribuindo minha aplicação
Lidando com falhas
+30 anos
telefonia
Concorrência e distribuição
Alta disponibilidade
Hot code swapping
Erlang: linguagem
Erlang: máquina virtual
Erlang: plataforma
Erlang: linguagem
Erlang: máquina virtual
Erlang: plataforma
Erlang: linguagem
Erlang: máquina virtual
Erlang: plataforma
erlang BEAM
bytecode
BEAM:
Björn's Erlang Abstract Machine
BEAM
BEAM
bytecode
processes
scheduler
CPU Core
processes
scheduler
CPU Core
Erlang/OTP:
Erlang/Open Telecom Platform
erlang
BEAM
process
scheduler
core
process
scheduler
core
Erlang/OTP
erlang
BEAM
process
scheduler
core
process
scheduler
core
Erlang/OTP+ Bibliotecas
+ Princípios de design
ElixirConf 2018 - Erlang OTP What's in the Box - João Britto
youtube.com/watch?v=CozSfI-Zepw
Entendendo o idioma
Entendendo concorrência
Utilizando todos os cores
Distribuindo minha aplicação
Lidando com falhas
BEAM
process
process process
process
process
process
process
process
process
BEAM
process
process process
process
process
process
process
process
process
Entendendo o idioma
Entendendo concorrência
Utilizando todos os cores
Distribuindo minha aplicação
Lidando com falhas
BEAM
process
process process
process
process
process
process
process
process
BEAM
process
process process
process
process
process
process
process
process CPU 2CPU 1
Entendendo o idioma
Entendendo concorrência
Utilizando todos os cores
Distribuindo minha aplicação
Lidando com falhas
BEAM
process
process process
process
process
process
process
process
process 10.0.1.210.0.1.1
BEAM
Entendendo o idioma
Entendendo concorrência
Utilizando todos os cores
Distribuindo minha aplicação
Lidando com falhas
BEAM
process
process process
process
process
process
process
process
process
supervisor
BEAM
process
process process
process
process
process
process
process
process
supervisor
supervisor
BEAM
process
process process
process
process
process
process
process
process
supervisor
supervisor
BEAM
process
process process
process
process
process
process
process
supervisor
supervisor
BEAM
process
process process
process
process
process
process
process
process
supervisor
...
web
ERLANG
ERLANG
Por que não juntar os dois mundos?
...
O MUNDO CONCORRENTE
gotw.ca/publications/concurrency-ddj.htm
2005
Lei de Moore
O número de transistores em
um processador dobrava a
cada 2 anos
1975
Free lunch
O software ficava mais rápido
com o avanço das CPUs
Não era necessário fazer nada
além de atualizar o hardware
Free lunch is over
A partir de ~2003, o clock
speed parou de crescer como
antes. Se continuasse, seria
comum ter CPUs com 10GHz,
por ex.
Em 2005, surgiu o primeiro
processador dual-core
multi-cores
threads
concorrência
paralelismo
etc
multi-cores
threads
concorrência
paralelismo
etc
nem sempre é fácil
Erlang foi criado para ser
distribuído e tolerante a falhas
Erlang foi criado para ser
distribuído e tolerante a falhas
esse foi o objetivo desde o início
blog.whatsapp.com/196/1-million-is-so-2011
ERLANG
2 milhões de conexões
em um único nó
http://stackoverflow.com/questions/1636455/where-is-erlang-used-and-why
ELIXIR + ERLANG VM
BEAM
bytecode
BEAM
bytecode
POR QUE ELIXIR?
PRODUTIVIDADE
-module(hello).
-export([world/0]).
world() -> io:format("Hello, worldn").
hello.erl
ERLANG
$ erl
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4]
[ds:4:4:10] [async-threads:1] [hipe]
Eshell V10.4.3 (abort with ^G)
1> c(hello).
{ok,hello}
2> hello:world().
Hello, world
ok
ERLANG
defmodule Hello do
def world do
IO.puts "Hello, world"
end
end
ELIXIR
$ iex
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4]
[ds:4:4:10] [async-threads:1] [hipe]
Interactive Elixir (1.8.2) - press Ctrl+C to exit (type h()
ENTER for help)
iex(1)> # copia e cola o código
iex(2)> Hello.world
Hello, world
:ok
ELIXIR
Execução paralela
First-class documentation
Tooling (ExUnit, IEx, Mix)
Hex packages
Code formatter
Compilação
Carregamento
Testes
Tarefas
hex.pm
elixir-lang.org/getting-started
COMPATIBILIDADE
EXTENSIBILIDADE
Macros!
defmacro unless(expr, opts) do
quote do
if(!unquote(expr), unquote(opts))
end
end
unless(is_number(x), do: raise("oops")
ELIXIR
Representar domínios diferentes
defmodule MathTest do
use ExUnit.Case
test "basic operations" do
assert 1 + 1 == 2
end
end
ELIXIR
blog.whatsapp.com/196/1-million-is-so-2011
ERLANG
2 milhões de conexões
em um único nó
2 milhões de conexões
em um único nó
phoenixframework.org/blog/the-road-to-2-million-websocket-connections
ELIXIR
Sintaxe parecida com Ruby
Focado em tolerância a falhas
Paralelismo
Documentação
Até seu relógio tem mais de um processador.
concorrência não é mais a exceção, é regra.
blog.plataformatec.com.br/2017/07/the-fallacies-of-web-application-performance/
2017
Até seu relógio tem mais de um processador.
Concorrência não é mais a exceção, é regra.
blog.plataformatec.com.br/2017/07/the-fallacies-of-web-application-performance/
2017
Programação funcional é um meio para
conseguir distribuir sua aplicação
PARTE II
Migrando para Elixir
Funcional vs POO
Imutabilidade
Funções anônimas
Pattern matching
Recursão
Tail Call Optimization
Pipelines
Lazy evaluation
Funções puras vs impuras
Imutabilidade
Funções anônimas
Pattern matching
Recursão
Tail Call Optimization
Pipelines
Lazy evaluation
Funções puras vs impuras
Aprender a lidar estados explícitos
class Counter
def initialize
@count = 0
end
def increment
@count = @count + 1
end
end
c = Counter.new
c.increment # @count = 1
c.increment # @count = 2
c.increment # @count = 3
OOP
defmodule Counter do
def increment(count) do
count + 1
end
end
Counter.increment(1) # 2
Counter.increment(1) # 2
Counter.increment(1) # 2
Pure FP
Imutabilidade
Transformações de dados
["elixir", "is", "fun"]
|> Enum.join(" ") # "elixir is fun"
|> String.upcase() # "ELIXIR IS FUN"
Pattern matching
case {:ok, "Hello World"} do
{:ok, result} -> result
{:error} -> "Uh oh!"
_ -> "Catch all"
end
case {:ok, "Hello World"} do
{:ok, result} -> result
{:error} -> "Uh oh!"
_ -> "Catch all"
end
case {:ok, "Hello World"} do
{:ok, result} -> result
{:error} -> "Uh oh!"
_ -> "Catch all"
end
case {:error, "Invalid credit card"} do
{:ok, result} -> result
{:error} -> "Oh no!"
_ -> "Catch all"
end
case {:error, "Invalid credit card"} do
{:ok, result} -> result
{:error} -> "Oh no!"
_ -> "Catch all"
end
case {:error, "Invalid credit card"} do
{:ok, result} -> result
{:error} -> "Oh no!"
_ -> "Catch all"
end
case {"unexpected error"} do
{:ok, result} -> result
{:error} -> "Oh no!"
_ -> "Catch all"
end
case {"unexpected error"} do
{:ok, result} -> result
{:error} -> "Oh no!"
_ -> "Catch all"
end
case {"unexpected error"} do
{:ok, result} -> result
{:error} -> "Oh no!"
_ -> "Catch all"
end
Sensação de re-aprender a programar
Sensação de re-aprender tudo
mas é só um pouco
GOTO 2018 - Functional Programming in 40 Minutes - Russ Olsen
youtube.com/watch?v=0if71HOyVjY
Um bom livro para
quem vem do Rails
...
Olhando para minha carreira
Sou apaixonada por Ruby <3
as mais populares
Elixir
Ruby
as mais amadas
Elixir
Ruby
as mais temidas
Elixir
Ruby
as mais procuradas
Elixir
Ruby
as mais bem pagas
Clojure
Scala
Elixir
Ruby
Sou apaixonada por Ruby <3
Elixir lembra Ruby (um pouquinho)
E tem uma comunidade incrível
t.me/elixirbr
plataformatec.com.br/elixir-radar
...
PARTE III
Entregando valor com Elixir
OOP vs FP
Consultar a doc sempre
Rever fundamentos! <3
Estou gostando da jornada
Desenvolvimento web
Sistemas distribuídos
Paralelismo e concorrência
Consigo trabalhar com Ruby/Elixir
OOP + FP
Elixir + Ruby
Amo a comunidade de Ruby
t.me/rubybrasil
...
por que todo mundo
só fala de funcional?
The free lunch is over
Arquiteturas multi-cores
threads
processamento assíncrono
arquitetura orientada a eventos
microsserviços
etc
Concorrência
Processamento distribuído
ESCALABILIDADE
ESCALABILIDADE
Escalar produtos digitais
Escalar times de desenvolvimento
Ser uma empresa de grande impacto
É sobre performance
É sobre alta disponibilidade
É sobre performance
É sobre alta disponibilidade
...
Até seu smartphone tem mais
de um core.
A gente deveria usar todos os cores
Em todos os ambientes
Em dev também
...
Cases de sucesso
Discord, Pinterest,
Moz and Bleacher Report
ELIXIR
techworld.com/apps-wearables/how-elixir-helped-bleacher-report-handle-8x-more-traffic-3653957/
ELIXIR
150 servidores para apenas 5
ELIXIR
The RealReal - Elixir adoption story
youtube.com/watch?v=sTs_4T1ufLY
ELIXIR
Desempenho
Tolerância a Falhas
Produtividade
ELIXIR
PARTE IV: BONUS
Real Time Web
ELIXIR
Exemplo do LiveView
Internet das Coisas
Sistemas embarcados
ELIXIR
...
Mas faz sentido usar elixir pra tudo?
Equipe
Sistemas Legados
Distribuição
Integração
Deploy
Métricas
Depende :p
como começar?
elixir-lang.org
elixirschool.com
Como uma empresa brasileira criou uma linguagem que é usada no
mundo inteiro. O case da Plataformatec com o Elixir - Hugo Baraúna
infoq.com/br/presentations/como-uma-empresa-brasileira-criou-uma-linguagem-que-e-usada-
no-mundo-inteiro/
RubyElixirConfTaiwan 2018: Idioms for building distributed
fault-tolerant applications with Elixir- José Valim
youtube.com/watch?v=01UB1DaX1Uc
Como concorrência funciona em Elixir? - Amanda Sposito
en.eventials.com/locaweb/como-concorrencia-funciona-em-elixir-com-amanda-sposito/
Software Verification - José Valim
en.eventials.com/locaweb/software-verification-com-jose-valim/
GOTO 2018 - SOLID Elixir - Georgina McFadyen
youtube.com/watch?v=rmftOs2BzgU
GOTO 2018 - The Do's and Don'ts of Error Handling - Joe Armstrong
youtube.com/watch?v=TTM_b7EJg5E
RailsConf 2014 - All the Little Things by Sandi Metz
youtube.com/watch?v=8bZh5LMaSmE
Mocks and explicit contracts - José Valim
blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/
Elixir, processos e esse tal de OTP - Amanda Sposito
blog.plataformatec.com.br/2018/04/elixir-processos-e-esse-tal-de-otp/
Starting with Elixir, the Study Guide - Rafael Rocha
blog.plataformatec.com.br/2018/11/starting-with-elixir-the-study-guide/
Tail Call Optimization: The Musical!! - Anjana Vakil & Natalia Margolis
youtube.com/watch?v=-PX0BV9hGZY
Inside - Programação Funcional
youtube.com/watch?v=zHzEBLyJvJg
...
Quanto do seu código
é concorrente?
muito obrigada
speakerdeck.com/elainenaomi

Além da programação funcional com Elixir e Erlang