Elixir @ iMasters Intercon 2016

Elixir @ iMasters Intercon 2016

Elixir: a linguagem, sua concepção e a volta da computação funcional

-- George Guimarães

7c12adb8b5521c060ab4630360a4fa27?s=128

Plataformatec

October 22, 2016
Tweet

Transcript

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

  2. GEORGE GUIMARÃES

  3. consulting and software engineering

  4. None
  5. None
  6. NOSSA GERAÇÃO TEM UM PROBLEMA. Desenvolvedores web tem que lidar

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

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

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

  10. None
  11. None
  12. THREADS E EVENT LOOP. Modelos primitivos para lidar com concorrência.

  13. “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. ”
  14. None
  15. — ROBERT VIRDING “Any sufficiently complicated concurrent program in another

    language contains an ad hoc informally-specified bug-ridden slow implementation of half of Erlang.”
  16. PLATAFORMA ELIXIR. Erlang and OTP, now with modern tooling.

  17. 30 anos

  18. Switch Switch

  19. Switch Browser Endpoint Server

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

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

  22. None
  23. FERRAMENTAL EMBUTIDO. Hex, Mix, ExUnit.

  24. None
  25. None
  26. LINGUAGEM FUNCIONAL. Não temos classes nem objetos.

  27. IMUTABILIDADE. “Isso muda tudo”

  28. NÃO TENHO LOOPS!

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

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

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

  34. shell Counter.start(10) spawn

  35. shell 11 increment

  36. shell 12 increment

  37. shell 13 increment

  38. shell 13 :get, self 13

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

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

  42. Sequential code elixir

  43. elixir

  44. elixir

  45. None
  46. FAULT-TOLERANT. DISTRIBUTED. O objetivo não era concorrência.

  47. Switch Switch

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

    em uma máquina.
  49. elixir

  50. 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
  51. None
  52. ERROS ACONTECEM. Let it crash.

  53. MAS SERÁ QUE FUNCIONA MESMO?

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

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

    Using 40% of CPU and Memory
  56. None
  57. USO EFICIENTE!. Usa todos os cores da máquina, não só

    pra processar requests web, mas até pra rodar testes
  58. None
  59. None
  60. None
  61. None
  62. None
  63. MICROSERVIÇOS EM UM MUNDO ELIXIR. Precisamos sempre de APIs HTTP?

  64. elixir

  65. node@srv2 node@srv1 elixir

  66. None
  67. OUTRAS VANTAGENS. • Garbage Collector por processo • Latência previsível

    • Separação de dados e comportamento (FP)
  68. ONDE APRENDER?.

  69. None
  70. None
  71. http://plataformatec.com.br/elixir-radar

  72. https://elixirforum.com

  73. OBRIGADO!! 
 @plataformatec
 @georgeguimaraes

  74. @elixirlang / elixir-lang.org