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

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

7c12adb8b5521c060ab4630360a4fa27?s=128

Plataformatec

August 20, 2016
Tweet

Transcript

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

  2. GEORGE GUIMARÃES

  3. consulting and software engineering

  4. POLÊMICAS. QUEM NUNCA?

  5. MICROSERVIÇOS != HTTP API REST.

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

    estar fazendo mesmo.
  7. MONOREPO. Repo consistente com a organização

  8. None
  9. None
  10. NOSSA GERAÇÃO TEM UM PROBLEMA. Desenvolvedores web tem que lidar

    com concorrência. Não há escapatória.
  11. CONCORRÊNCIA. Capacidade de lidar com várias coisas (ao mesmo tempo,

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

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

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

  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. ”
  18. None
  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.”
  20. PLATAFORMA ELIXIR. Erlang and OTP, now with modern tooling.

  21. None
  22. 30 anos

  23. None
  24. None
  25. Switch

  26. Switch

  27. Switch

  28. Switch

  29. Switch Switch

  30. Switch Browser Endpoint Server

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

  32. # #MYELIXIRSTATUS

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

  34. None
  35. FERRAMENTAL EMBUTIDO. Hex, Mix, ExUnit.

  36. None
  37. None
  38. LINGUAGEM FUNCIONAL.

  39. IMUTABILIDADE. “Isso muda tudo”

  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"]}
  41. NÃO TENHO LOOPS!

  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
  43. MAS, E COMO FAZER UM CONTADOR? Não é possível mudar

    o conteúdo de uma variável????
  44. defmodule Counter do def start(value) do receive do :increment ->

    start(value + 1) {:get, pid} -> send(pid, value) end end end
  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
  46. shell

  47. shell Counter.start(10) spawn

  48. shell 11 increment

  49. shell 12 increment

  50. shell 13 increment

  51. shell 13 :get, self 13

  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
  53. ACTOR MODEL. 1. Enviar mensagens para outros atores; 2. Criar

    novos atores; 3. Especificar o comportamento para as próximas mensagens.
  54. Sequential code

  55. Sequential code elixir

  56. Sequential code elixir

  57. elixir

  58. elixir

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

  62. Switch Switch

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

    em uma máquina.
  64. elixir

  65. elixir

  66. elixir

  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
  68. None
  69. ERROS ACONTECEM. Let it crash.

  70. ESTADO CORRUPTO PODE OCORRER. Let it crash. O processo vai

    voltar com um estado limpo.
  71. MAS SERÁ QUE FUNCIONA MESMO?

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

  73. Intel Xeon CPU X5675 @ 3.07GHz 24 CPU - 96GB

    Using 40% of CPU and Memory
  74. None
  75. None
  76. None
  77. None
  78. None
  79. MICROSERVIÇOS EM UM MUNDO ELIXIR. Precisamos sempre de APIs HTTP?

  80. elixir

  81. node@srv2 node@srv1 elixir

  82. None
  83. None
  84. ONDE APRENDER?.

  85. None
  86. None
  87. None
  88. None
  89. OBRIGADO!! 
 @plataformatec
 @georgeguimaraes

  90. @elixirlang / elixir-lang.org