Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Elaine Naomi

August 29, 2019
Tweet

More Decks by Elaine Naomi

Other Decks in Programming

Transcript

  1. além da
    programação funcional

    View full-size slide

  2. twitter.com/elaine_nw
    speakerdeck.com/elainenaomi
    Elaine Naomi Watanabe
    Desenvolvedora de Software (Plataformatec)
    Mestrado em Ciência da Computação (USP)

    View full-size slide

  3. num passado não tão distante
    Python ~ 6 meses
    Java ~ 1 ano
    C++ ~ 1 ano
    PHP ~ 3 anos

    View full-size slide

  4. no momento
    Elixir 2 meses
    Ruby 3,5 anos

    View full-size slide

  5. Sistemas distribuídos
    Concorrência e paralelismo
    Aplicações intensivas em dados
    no meio tempo

    View full-size slide

  6. no meio tempo
    Modelagem de domínio
    Modelos transacionais
    Bancos de dados distribuídos
    NoSQL

    View full-size slide

  7. no momento
    Elixir 2 meses
    Ruby 3,5 anos

    View full-size slide

  8. Compartilhar minha jornada
    em uma nova linguagem

    View full-size slide

  9. Parte I Conhecendo Elixir
    Parte II Migrando para Elixir
    Parte III Entregando valor com Elixir

    View full-size slide

  10. vamos nessa?

    View full-size slide

  11. Conhecendo Elixir

    View full-size slide

  12. Linguagem nova
    Paradigma funcional

    View full-size slide

  13. Linguagem nova
    Paradigma funcional
    Muitas pessoas de Ruby comentando

    View full-size slide

  14. José Valim
    Co-fundador da Plataformatec
    Criador do Elixir

    View full-size slide

  15. criadora das gems:

    View full-size slide

  16. ELIXIR BRASIL 2018

    View full-size slide

  17. Erlang
    Erlang/OTP
    Processos
    Macros

    View full-size slide

  18. Erlang
    Erlang/OTP
    Processos
    Macros

    View full-size slide

  19. Erlang
    Erlang/OTP
    Processos
    Macros

    View full-size slide

  20. Erlang
    Erlang/OTP
    Processos
    Supervisors

    View full-size slide

  21. TERMOS MÁGICOS

    View full-size slide

  22. Entendendo o idioma
    Entendendo concorrência
    Utilizando todos os cores
    Distribuindo minha aplicação
    Lidando com falhas

    View full-size slide

  23. Concorrência e distribuição
    Alta disponibilidade
    Hot code swapping

    View full-size slide

  24. Erlang: linguagem
    Erlang: máquina virtual
    Erlang: plataforma

    View full-size slide

  25. Erlang: linguagem
    Erlang: máquina virtual
    Erlang: plataforma

    View full-size slide

  26. Erlang: linguagem
    Erlang: máquina virtual
    Erlang: plataforma

    View full-size slide

  27. erlang BEAM
    bytecode

    View full-size slide

  28. BEAM:
    Björn's Erlang Abstract Machine

    View full-size slide

  29. BEAM
    BEAM
    bytecode
    processes
    scheduler
    CPU Core
    processes
    scheduler
    CPU Core

    View full-size slide

  30. Erlang/OTP:
    Erlang/Open Telecom Platform

    View full-size slide

  31. erlang
    BEAM
    process
    scheduler
    core
    process
    scheduler
    core
    Erlang/OTP

    View full-size slide

  32. erlang
    BEAM
    process
    scheduler
    core
    process
    scheduler
    core
    Erlang/OTP
    + Bibliotecas
    + Princípios de design

    View full-size slide

  33. ElixirConf 2018 - Erlang OTP What's in the Box - João Britto
    youtube.com/watch?v=CozSfI-Zepw

    View full-size slide

  34. Entendendo o idioma
    Entendendo concorrência
    Utilizando todos os cores
    Distribuindo minha aplicação
    Lidando com falhas

    View full-size slide

  35. BEAM
    process
    process process
    process
    process
    process
    process
    process
    process

    View full-size slide

  36. BEAM
    process
    process process
    process
    process
    process
    process
    process
    process

    View full-size slide

  37. Entendendo o idioma
    Entendendo concorrência
    Utilizando todos os cores
    Distribuindo minha aplicação
    Lidando com falhas

    View full-size slide

  38. BEAM
    process
    process process
    process
    process
    process
    process
    process
    process

    View full-size slide

  39. BEAM
    process
    process process
    process
    process
    process
    process
    process
    process CPU 2
    CPU 1

    View full-size slide

  40. Entendendo o idioma
    Entendendo concorrência
    Utilizando todos os cores
    Distribuindo minha aplicação
    Lidando com falhas

    View full-size slide

  41. BEAM
    process
    process process
    process
    process
    process
    process
    process
    process 10.0.1.2
    10.0.1.1
    BEAM

    View full-size slide

  42. Entendendo o idioma
    Entendendo concorrência
    Utilizando todos os cores
    Distribuindo minha aplicação
    Lidando com falhas

    View full-size slide

  43. BEAM
    process
    process process
    process
    process
    process
    process
    process
    process

    View full-size slide

  44. supervisor
    BEAM
    process
    process process
    process
    process
    process
    process
    process
    process
    supervisor

    View full-size slide

  45. supervisor
    BEAM
    process
    process process
    process
    process
    process
    process
    process
    process
    supervisor

    View full-size slide

  46. supervisor
    BEAM
    process
    process process
    process
    process
    process
    process
    process
    supervisor

    View full-size slide

  47. supervisor
    BEAM
    process
    process process
    process
    process
    process
    process
    process
    process
    supervisor

    View full-size slide

  48. Por que não juntar os dois mundos?

    View full-size slide

  49. O MUNDO CONCORRENTE

    View full-size slide

  50. gotw.ca/publications/concurrency-ddj.htm
    2005

    View full-size slide

  51. Lei de Moore
    O número de transistores em
    um processador dobrava a
    cada 2 anos
    1975

    View full-size slide

  52. 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

    View full-size slide

  53. 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

    View full-size slide

  54. multi-cores
    threads
    concorrência
    paralelismo
    etc

    View full-size slide

  55. multi-cores
    threads
    concorrência
    paralelismo
    etc
    nem sempre é fácil

    View full-size slide

  56. Erlang foi criado para ser
    distribuído e tolerante a falhas

    View full-size slide

  57. Erlang foi criado para ser
    distribuído e tolerante a falhas
    esse foi o objetivo desde o início

    View full-size slide

  58. blog.whatsapp.com/196/1-million-is-so-2011
    ERLANG
    2 milhões de conexões
    em um único nó

    View full-size slide

  59. http://stackoverflow.com/questions/1636455/where-is-erlang-used-and-why

    View full-size slide

  60. ELIXIR + ERLANG VM

    View full-size slide

  61. BEAM
    bytecode

    View full-size slide

  62. BEAM
    bytecode

    View full-size slide

  63. POR QUE ELIXIR?

    View full-size slide

  64. PRODUTIVIDADE

    View full-size slide

  65. -module(hello).
    -export([world/0]).
    world() -> io:format("Hello, world\n").
    hello.erl
    ERLANG

    View full-size slide

  66. $ 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

    View full-size slide

  67. defmodule Hello do
    def world do
    IO.puts "Hello, world"
    end
    end
    ELIXIR

    View full-size slide

  68. $ 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

    View full-size slide

  69. Execução paralela

    View full-size slide

  70. First-class documentation
    Tooling (ExUnit, IEx, Mix)
    Hex packages
    Code formatter

    View full-size slide

  71. Compilação
    Carregamento
    Testes
    Tarefas

    View full-size slide

  72. elixir-lang.org/getting-started

    View full-size slide

  73. COMPATIBILIDADE

    View full-size slide

  74. EXTENSIBILIDADE

    View full-size slide

  75. defmacro unless(expr, opts) do
    quote do
    if(!unquote(expr), unquote(opts))
    end
    end
    unless(is_number(x), do: raise("oops")
    ELIXIR

    View full-size slide

  76. Representar domínios diferentes

    View full-size slide

  77. defmodule MathTest do
    use ExUnit.Case
    test "basic operations" do
    assert 1 + 1 == 2
    end
    end
    ELIXIR

    View full-size slide

  78. blog.whatsapp.com/196/1-million-is-so-2011
    ERLANG
    2 milhões de conexões
    em um único nó

    View full-size slide

  79. 2 milhões de conexões
    em um único nó
    phoenixframework.org/blog/the-road-to-2-million-websocket-connections
    ELIXIR

    View full-size slide

  80. Sintaxe parecida com Ruby
    Focado em tolerância a falhas
    Paralelismo
    Documentação

    View full-size slide

  81. 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

    View full-size slide

  82. 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

    View full-size slide

  83. Programação funcional é um meio para
    conseguir distribuir sua aplicação

    View full-size slide

  84. Migrando para Elixir

    View full-size slide

  85. Funcional vs POO

    View full-size slide

  86. Imutabilidade
    Funções anônimas
    Pattern matching
    Recursão
    Tail Call Optimization
    Pipelines
    Lazy evaluation
    Funções puras vs impuras

    View full-size slide

  87. Imutabilidade
    Funções anônimas
    Pattern matching
    Recursão
    Tail Call Optimization
    Pipelines
    Lazy evaluation
    Funções puras vs impuras

    View full-size slide

  88. Aprender a lidar estados explícitos

    View full-size slide

  89. 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

    View full-size slide

  90. 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

    View full-size slide

  91. Imutabilidade
    Transformações de dados

    View full-size slide

  92. ["elixir", "is", "fun"]
    |> Enum.join(" ") # "elixir is fun"
    |> String.upcase() # "ELIXIR IS FUN"

    View full-size slide

  93. Pattern matching

    View full-size slide

  94. case {:ok, "Hello World"} do
    {:ok, result} -> result
    {:error} -> "Uh oh!"
    _ -> "Catch all"
    end

    View full-size slide

  95. case {:ok, "Hello World"} do
    {:ok, result} -> result
    {:error} -> "Uh oh!"
    _ -> "Catch all"
    end

    View full-size slide

  96. case {:ok, "Hello World"} do
    {:ok, result} -> result
    {:error} -> "Uh oh!"
    _ -> "Catch all"
    end

    View full-size slide

  97. case {:error, "Invalid credit card"} do
    {:ok, result} -> result
    {:error} -> "Oh no!"
    _ -> "Catch all"
    end

    View full-size slide

  98. case {:error, "Invalid credit card"} do
    {:ok, result} -> result
    {:error} -> "Oh no!"
    _ -> "Catch all"
    end

    View full-size slide

  99. case {:error, "Invalid credit card"} do
    {:ok, result} -> result
    {:error} -> "Oh no!"
    _ -> "Catch all"
    end

    View full-size slide

  100. case {"unexpected error"} do
    {:ok, result} -> result
    {:error} -> "Oh no!"
    _ -> "Catch all"
    end

    View full-size slide

  101. case {"unexpected error"} do
    {:ok, result} -> result
    {:error} -> "Oh no!"
    _ -> "Catch all"
    end

    View full-size slide

  102. case {"unexpected error"} do
    {:ok, result} -> result
    {:error} -> "Oh no!"
    _ -> "Catch all"
    end

    View full-size slide

  103. Sensação de re-aprender a programar

    View full-size slide

  104. Sensação de re-aprender tudo
    mas é só um pouco

    View full-size slide

  105. GOTO 2018 - Functional Programming in 40 Minutes - Russ Olsen
    youtube.com/watch?v=0if71HOyVjY

    View full-size slide

  106. Um bom livro para
    quem vem do Rails

    View full-size slide

  107. Olhando para minha carreira

    View full-size slide

  108. Sou apaixonada por Ruby <3

    View full-size slide

  109. as mais populares

    View full-size slide

  110. as mais amadas

    View full-size slide

  111. as mais temidas

    View full-size slide

  112. as mais procuradas

    View full-size slide

  113. as mais bem pagas

    View full-size slide

  114. Sou apaixonada por Ruby <3
    Elixir lembra Ruby (um pouquinho)

    View full-size slide

  115. E tem uma comunidade incrível

    View full-size slide

  116. t.me/elixirbr

    View full-size slide

  117. plataformatec.com.br/elixir-radar

    View full-size slide

  118. Entregando valor com Elixir

    View full-size slide

  119. OOP vs FP
    Consultar a doc sempre

    View full-size slide

  120. Rever fundamentos! <3

    View full-size slide

  121. Estou gostando da jornada
    Desenvolvimento web
    Sistemas distribuídos
    Paralelismo e concorrência

    View full-size slide

  122. Consigo trabalhar com Ruby/Elixir
    OOP + FP

    View full-size slide

  123. Elixir + Ruby

    View full-size slide

  124. Amo a comunidade de Ruby

    View full-size slide

  125. t.me/rubybrasil

    View full-size slide

  126. por que todo mundo
    só fala de funcional?

    View full-size slide

  127. The free lunch is over

    View full-size slide

  128. Arquiteturas multi-cores

    View full-size slide

  129. threads
    processamento assíncrono
    arquitetura orientada a eventos
    microsserviços
    etc

    View full-size slide

  130. Concorrência
    Processamento distribuído

    View full-size slide

  131. ESCALABILIDADE

    View full-size slide

  132. ESCALABILIDADE

    View full-size slide

  133. Escalar produtos digitais
    Escalar times de desenvolvimento
    Ser uma empresa de grande impacto

    View full-size slide

  134. É sobre performance
    É sobre alta disponibilidade

    View full-size slide

  135. É sobre performance
    É sobre alta disponibilidade

    View full-size slide

  136. Até seu smartphone tem mais
    de um core.

    View full-size slide

  137. A gente deveria usar todos os cores
    Em todos os ambientes
    Em dev também

    View full-size slide

  138. Cases de sucesso

    View full-size slide

  139. Discord, Pinterest,
    Moz and Bleacher Report
    ELIXIR

    View full-size slide

  140. techworld.com/apps-wearables/how-elixir-helped-bleacher-report-handle-8x-more-traffic-3653957/
    ELIXIR

    View full-size slide

  141. 150 servidores para apenas 5
    ELIXIR

    View full-size slide

  142. The RealReal - Elixir adoption story
    youtube.com/watch?v=sTs_4T1ufLY
    ELIXIR

    View full-size slide

  143. Desempenho
    Tolerância a Falhas
    Produtividade
    ELIXIR

    View full-size slide

  144. PARTE IV: BONUS

    View full-size slide

  145. Real Time Web

    View full-size slide

  146. Exemplo do LiveView

    View full-size slide

  147. Internet das Coisas

    View full-size slide

  148. Sistemas embarcados
    ELIXIR

    View full-size slide

  149. Mas faz sentido usar elixir pra tudo?

    View full-size slide

  150. Equipe
    Sistemas Legados
    Distribuição
    Integração
    Deploy
    Métricas

    View full-size slide

  151. como começar?

    View full-size slide

  152. elixir-lang.org

    View full-size slide

  153. elixirschool.com

    View full-size slide

  154. 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/

    View full-size slide

  155. 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

    View full-size slide

  156. 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

    View full-size slide

  157. Inside - Programação Funcional
    youtube.com/watch?v=zHzEBLyJvJg

    View full-size slide

  158. Quanto do seu código
    é concorrente?

    View full-size slide

  159. muito obrigada
    speakerdeck.com/elainenaomi

    View full-size slide