$30 off During Our Annual Pro Sale. View Details »

Elixir: Programação Funcional e Pragmática @ 2º Tech Day Curitiba

Elixir: Programação Funcional e Pragmática @ 2º Tech Day Curitiba

Plataformatec

August 20, 2016
Tweet

More Decks by Plataformatec

Other Decks in Programming

Transcript

  1. @georgeguimaraes / @plataformatec
    ELIXIR.
    PROGRAMAÇÃO
    FUNCIONAL E
    PRAGMÁTICA

    View Slide

  2. GEORGE
    GUIMARÃES

    View Slide

  3. consulting and software engineering

    View Slide

  4. POLÊMICAS.
    QUEM NUNCA?

    View Slide

  5. MICROSERVIÇOS !=
    HTTP API REST.

    View Slide

  6. INTEGRAÇÃO
    CONTÍNUA.
    Provavelmente vc não faz e provavelmente
    não deveria estar fazendo mesmo.

    View Slide

  7. MONOREPO.
    Repo consistente com a organização

    View Slide

  8. View Slide

  9. View Slide

  10. NOSSA GERAÇÃO TEM
    UM PROBLEMA.
    Desenvolvedores web tem que lidar com
    concorrência. Não há escapatória.

    View Slide

  11. CONCORRÊNCIA.
    Capacidade de lidar com várias coisas (ao
    mesmo tempo, ou serialmente).

    View Slide

  12. PARALELISMO.
    Capacidade de fazer várias coisas ao mesmo
    tempo.

    View Slide

  13. CONCORRÊNCIA.
    Websockets, HTTP2, Alta quantidade de
    requests, demanda instável.

    View Slide

  14. View Slide

  15. View Slide

  16. THREADS E EVENT
    LOOP.
    Modelos primitivos para lidar com
    concorrência.

    View Slide

  17. “what makes multithreaded
    programming difficult is not
    that writing it is hard, but
    that testing it is hard. It’s not
    the pitfalls that you can fall
    into; it’s the fact that you
    don’t necessarily know
    whether you’ve fallen into
    one of them. ”

    View Slide

  18. View Slide

  19. — ROBERT VIRDING
    “Any sufficiently complicated concurrent
    program in another language contains an
    ad hoc informally-specified bug-ridden
    slow implementation of half of Erlang.”

    View Slide

  20. PLATAFORMA
    ELIXIR.
    Erlang and OTP, now with modern tooling.

    View Slide

  21. View Slide

  22. 30 anos

    View Slide

  23. View Slide

  24. View Slide

  25. Switch

    View Slide

  26. Switch

    View Slide

  27. Switch

    View Slide

  28. Switch

    View Slide

  29. Switch
    Switch

    View Slide

  30. Switch
    Browser
    Endpoint
    Server

    View Slide

  31. — ELIXIR DEVELOPER
    “We stand in the shoulders of giants”

    View Slide

  32. #
    #MYELIXIRSTATUS

    View Slide

  33. DOCUMENTAÇÃO DE
    ALTO NÍVEL.
    Documentação ruim é bug.

    View Slide

  34. View Slide

  35. FERRAMENTAL
    EMBUTIDO.
    Hex, Mix, ExUnit.

    View Slide

  36. View Slide

  37. View Slide

  38. LINGUAGEM
    FUNCIONAL.

    View Slide

  39. IMUTABILIDADE.
    “Isso muda tudo”

    View Slide

  40. user = %{name: "George", interests: ["Elixir",
    "Ruby", "Integração Discreta"]}
    Suggest.to_user(user)
    Analytics.save_interests(user.interests)
    user
    # => %{name: "George", interests: ["Elixir",
    "Ruby", "Integração Discreta"]}

    View Slide

  41. NÃO TENHO LOOPS!

    View Slide

  42. defmodule Fibonacci do
    def calc(0), do: 0
    def calc(1), do: 1
    def calc(n), do: calc(n-1) + calc(n-2)
    end
    Fibonacci.calc(10)
    # => 55

    View Slide

  43. MAS, E COMO FAZER
    UM CONTADOR?
    Não é possível mudar o conteúdo de uma
    variável????

    View Slide

  44. defmodule Counter do
    def start(value) do
    receive do
    :increment -> start(value + 1)
    {:get, pid} -> send(pid, value)
    end
    end
    end

    View Slide

  45. defmodule Counter do
    def start(value) do
    receive do
    :increment -> start(value + 1)
    {:get, caller} -> send(caller, value)
    end
    end
    end
    pid = spawn(fn -> Counter.start(10) end)
    send(pid, :increment)
    send(pid, :increment)
    send(pid, :increment)
    send(pid, {:get, self})
    flush
    # => 13

    View Slide

  46. shell

    View Slide

  47. shell Counter.start(10)
    spawn

    View Slide

  48. shell 11
    increment

    View Slide

  49. shell 12
    increment

    View Slide

  50. shell 13
    increment

    View Slide

  51. shell 13
    :get, self
    13

    View Slide

  52. defmodule Counter do
    def start(value) do
    receive do
    :increment -> start(value + 1)
    {:get, caller} -> send(caller, value)
    end
    end
    end
    pid = spawn(fn -> Counter.start(10) end)
    send(pid, :increment)
    send(pid, :increment)
    send(pid, :increment)
    send(pid, {:get, self})
    flush
    # => 13

    View Slide

  53. ACTOR MODEL.
    1. Enviar mensagens para outros atores;
    2. Criar novos atores;
    3. Especificar o comportamento para as
    próximas mensagens.

    View Slide

  54. Sequential
    code

    View Slide

  55. Sequential
    code
    elixir

    View Slide

  56. Sequential
    code
    elixir

    View Slide

  57. elixir

    View Slide

  58. elixir

    View Slide

  59. View Slide

  60. View Slide

  61. FAULT-TOLERANT.
    DISTRIBUTED.
    O objetivo não era concorrência.

    View Slide

  62. Switch
    Switch

    View Slide

  63. CONCORRÊNCIA É UM
    CASO DE DISTRIBUIÇÃO.
    Tá distribuído, mas apenas em uma máquina.

    View Slide

  64. elixir

    View Slide

  65. elixir

    View Slide

  66. elixir

    View Slide

  67. defmodule MyApp do
    use Application
    def start(_type, _args) do
    import Supervisor.Spec, warn: false
    children = [
    supervisor(Playfair.Repo, []),
    worker(Playfair.Mailer, []),
    worker(Playfair.FileWriter, []),
    ]
    opts = [strategy: :one_for_one, name: Playfair.Supervisor]
    Supervisor.start_link(children, opts)
    end
    end

    View Slide

  68. View Slide

  69. ERROS ACONTECEM.
    Let it crash.

    View Slide

  70. ESTADO CORRUPTO
    PODE OCORRER.
    Let it crash. O processo vai voltar com um
    estado limpo.

    View Slide

  71. MAS SERÁ QUE
    FUNCIONA MESMO?

    View Slide

  72. http://blog.whatsapp.com/index.php/
    2012/01/1-million-is-so-2011/
    2 million connections
    on a single node

    View Slide

  73. Intel Xeon CPU X5675 @ 3.07GHz
    24 CPU - 96GB
    Using 40% of CPU and Memory

    View Slide

  74. View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. View Slide

  79. MICROSERVIÇOS EM
    UM MUNDO ELIXIR.
    Precisamos sempre de APIs HTTP?

    View Slide

  80. elixir

    View Slide

  81. node@srv2
    node@srv1
    elixir

    View Slide

  82. View Slide

  83. View Slide

  84. ONDE APRENDER?.

    View Slide

  85. View Slide

  86. View Slide

  87. View Slide

  88. View Slide

  89. OBRIGADO!!

    @plataformatec

    @georgeguimaraes

    View Slide

  90. @elixirlang / elixir-lang.org

    View Slide