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

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

583e920a7e9238a1c21e923025f8f641?s=128

Elaine Naomi

August 29, 2019
Tweet

Transcript

  1. além da programação funcional

  2. twitter.com/elaine_nw speakerdeck.com/elainenaomi Elaine Naomi Watanabe Desenvolvedora de Software (Plataformatec) Mestrado

    em Ciência da Computação (USP)
  3. num passado não tão distante Python ~ 6 meses Java

    ~ 1 ano C++ ~ 1 ano PHP ~ 3 anos
  4. no momento Elixir 2 meses Ruby 3,5 anos

  5. 1996

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

    meio tempo
  7. no meio tempo Modelagem de domínio Modelos transacionais Bancos de

    dados distribuídos NoSQL
  8. no momento Elixir 2 meses Ruby 3,5 anos

  9. None
  10. Compartilhar minha jornada em uma nova linguagem

  11. Parte I Conhecendo Elixir Parte II Migrando para Elixir Parte

    III Entregando valor com Elixir
  12. vamos nessa?

  13. PARTE I

  14. Conhecendo Elixir

  15. None
  16. None
  17. ...

  18. Linguagem nova Paradigma funcional

  19. Linguagem nova Paradigma funcional Muitas pessoas de Ruby comentando

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

  21. None
  22. criadora das gems:

  23. ELIXIR BRASIL 2018

  24. ...

  25. None
  26. Erlang Erlang/OTP Processos Macros

  27. Erlang Erlang/OTP Processos Macros

  28. Erlang Erlang/OTP Processos Macros

  29. Erlang Erlang/OTP Processos Supervisors

  30. None
  31. ...

  32. TERMOS MÁGICOS

  33. Entendendo o idioma Entendendo concorrência Utilizando todos os cores Distribuindo

    minha aplicação Lidando com falhas
  34. None
  35. +30 anos

  36. telefonia

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

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

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

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

  41. erlang BEAM bytecode

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

  43. BEAM BEAM bytecode processes scheduler CPU Core processes scheduler CPU

    Core
  44. Erlang/OTP: Erlang/Open Telecom Platform

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

  46. erlang BEAM process scheduler core process scheduler core Erlang/OTP +

    Bibliotecas + Princípios de design
  47. ElixirConf 2018 - Erlang OTP What's in the Box -

    João Britto youtube.com/watch?v=CozSfI-Zepw
  48. Entendendo o idioma Entendendo concorrência Utilizando todos os cores Distribuindo

    minha aplicação Lidando com falhas
  49. BEAM process process process process process process process process process

  50. None
  51. None
  52. BEAM process process process process process process process process process

  53. Entendendo o idioma Entendendo concorrência Utilizando todos os cores Distribuindo

    minha aplicação Lidando com falhas
  54. BEAM process process process process process process process process process

  55. BEAM process process process process process process process process process

    CPU 2 CPU 1
  56. Entendendo o idioma Entendendo concorrência Utilizando todos os cores Distribuindo

    minha aplicação Lidando com falhas
  57. BEAM process process process process process process process process process

    10.0.1.2 10.0.1.1 BEAM
  58. Entendendo o idioma Entendendo concorrência Utilizando todos os cores Distribuindo

    minha aplicação Lidando com falhas
  59. BEAM process process process process process process process process process

  60. supervisor BEAM process process process process process process process process

    process supervisor
  61. supervisor BEAM process process process process process process process process

    process supervisor
  62. supervisor BEAM process process process process process process process process

    supervisor
  63. supervisor BEAM process process process process process process process process

    process supervisor
  64. ...

  65. web

  66. None
  67. None
  68. None
  69. None
  70. None
  71. ERLANG

  72. ERLANG

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

  74. ...

  75. O MUNDO CONCORRENTE

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

  77. Lei de Moore O número de transistores em um processador

    dobrava a cada 2 anos 1975
  78. 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
  79. 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
  80. multi-cores threads concorrência paralelismo etc

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

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

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

    esse foi o objetivo desde o início
  84. blog.whatsapp.com/196/1-million-is-so-2011 ERLANG 2 milhões de conexões em um único nó

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

  86. ELIXIR + ERLANG VM

  87. BEAM bytecode

  88. BEAM bytecode

  89. None
  90. POR QUE ELIXIR?

  91. None
  92. PRODUTIVIDADE

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

  94. $ 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
  95. defmodule Hello do def world do IO.puts "Hello, world" end

    end ELIXIR
  96. $ 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
  97. Execução paralela

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

  99. Compilação Carregamento Testes Tarefas

  100. None
  101. None
  102. hex.pm

  103. elixir-lang.org/getting-started

  104. COMPATIBILIDADE

  105. EXTENSIBILIDADE

  106. Macros!

  107. defmacro unless(expr, opts) do quote do if(!unquote(expr), unquote(opts)) end end

    unless(is_number(x), do: raise("oops") ELIXIR
  108. Representar domínios diferentes

  109. defmodule MathTest do use ExUnit.Case test "basic operations" do assert

    1 + 1 == 2 end end ELIXIR
  110. None
  111. blog.whatsapp.com/196/1-million-is-so-2011 ERLANG 2 milhões de conexões em um único nó

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

  113. Sintaxe parecida com Ruby Focado em tolerância a falhas Paralelismo

    Documentação
  114. 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
  115. 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
  116. Programação funcional é um meio para conseguir distribuir sua aplicação

  117. PARTE II

  118. Migrando para Elixir

  119. None
  120. Funcional vs POO

  121. Imutabilidade Funções anônimas Pattern matching Recursão Tail Call Optimization Pipelines

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

    Lazy evaluation Funções puras vs impuras
  123. Aprender a lidar estados explícitos

  124. 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
  125. 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
  126. Imutabilidade Transformações de dados

  127. ["elixir", "is", "fun"] |> Enum.join(" ") # "elixir is fun"

    |> String.upcase() # "ELIXIR IS FUN"
  128. Pattern matching

  129. case {:ok, "Hello World"} do {:ok, result} -> result {:error}

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

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

    -> "Uh oh!" _ -> "Catch all" end
  132. case {:error, "Invalid credit card"} do {:ok, result} -> result

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

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

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

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

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

    "Oh no!" _ -> "Catch all" end
  138. Sensação de re-aprender a programar

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

  140. GOTO 2018 - Functional Programming in 40 Minutes - Russ

    Olsen youtube.com/watch?v=0if71HOyVjY
  141. Um bom livro para quem vem do Rails

  142. ...

  143. Olhando para minha carreira

  144. Sou apaixonada por Ruby <3

  145. None
  146. as mais populares

  147. None
  148. Elixir

  149. Ruby

  150. as mais amadas

  151. None
  152. Elixir

  153. Ruby

  154. as mais temidas

  155. Elixir

  156. Ruby

  157. as mais procuradas

  158. Elixir

  159. Ruby

  160. as mais bem pagas

  161. Clojure

  162. Scala

  163. Elixir

  164. Ruby

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

  166. E tem uma comunidade incrível

  167. None
  168. t.me/elixirbr

  169. None
  170. plataformatec.com.br/elixir-radar

  171. ...

  172. PARTE III

  173. Entregando valor com Elixir

  174. None
  175. OOP vs FP Consultar a doc sempre

  176. Rever fundamentos! <3

  177. Estou gostando da jornada Desenvolvimento web Sistemas distribuídos Paralelismo e

    concorrência
  178. Consigo trabalhar com Ruby/Elixir OOP + FP

  179. Elixir + Ruby

  180. Amo a comunidade de Ruby

  181. None
  182. t.me/rubybrasil

  183. ...

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

  185. None
  186. None
  187. None
  188. None
  189. The free lunch is over

  190. Arquiteturas multi-cores

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

  192. Concorrência Processamento distribuído

  193. ESCALABILIDADE

  194. ESCALABILIDADE

  195. Escalar produtos digitais Escalar times de desenvolvimento Ser uma empresa

    de grande impacto
  196. É sobre performance É sobre alta disponibilidade

  197. É sobre performance É sobre alta disponibilidade

  198. ...

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

  200. A gente deveria usar todos os cores Em todos os

    ambientes Em dev também
  201. ...

  202. Cases de sucesso

  203. Discord, Pinterest, Moz and Bleacher Report ELIXIR

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

  205. 150 servidores para apenas 5 ELIXIR

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

  207. Desempenho Tolerância a Falhas Produtividade ELIXIR

  208. PARTE IV: BONUS

  209. None
  210. Real Time Web

  211. ELIXIR

  212. Exemplo do LiveView

  213. Internet das Coisas

  214. Sistemas embarcados ELIXIR

  215. ...

  216. Mas faz sentido usar elixir pra tudo?

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

  218. Depende :p

  219. como começar?

  220. elixir-lang.org

  221. elixirschool.com

  222. None
  223. None
  224. 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/
  225. 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
  226. 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
  227. Inside - Programação Funcional youtube.com/watch?v=zHzEBLyJvJg

  228. ...

  229. Quanto do seu código é concorrente?

  230. muito obrigada speakerdeck.com/elainenaomi