A W H I R LW I N D TO U R O F E L I X I R B U F F E R “S N AC K C H AT ” 📬⚗ PIPES, MAILBOXES, & THE ZEN OF JUST LETTING YOUR APP CRASH ☠🚀

BACKGROUND

BACKGROUND A B I T O F I N F O A B O U T T H E TA L K A N D C O N T E X T

BACKGROUND B R O O K LY N Z E L E N K A

BACKGROUND B R O O K LY N Z E L E N K A

BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite

BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite •PLT & VM enthusiast

BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite •PLT & VM enthusiast •Ethereum Core Developer

BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite •PLT & VM enthusiast •Ethereum Core Developer •Previously a FT Elixir developer •Exceptional •Witchcraft Suite •https://github.com/witchcrafters •Keynotes •Elixir.LDN 2017 / Empex 2018 / ElixirConf 2019

BACKGROUND GOALS

BACKGROUND GOALS • Situate Elixir • Main characteristics & concepts • Briefly touch on Phoenix

BACKGROUND WHY ELIXIR?

BACKGROUND WHY ELIXIR? • According to the 2019 Stack Overflow developer survey: • Developers who work with Rust, WebAssembly, and Elixir contribute to open source at the highest rates • Globally, respondents who use Clojure, F#, Elixir, and Rust earn the highest salaries

BACKGROUND FUNCTIONAL PROGRAMMING

BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church

BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church Imperative instructions Expressions & analytic truths

BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church Imperative instructions Expressions & analytic truths Global state — “memory” Manual, localized state — “stateless”

BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church Imperative instructions Expressions & analytic truths Global state — “memory” Manual, localized state — “stateless” Mechanistic, Turing machines Semantic, mathematical models

ERLANG & ELIXIR

ERLANG & ELIXIR A B R I E F H I S T O R Y O F T H E B E A M & O P E N T E L E C O M P L AT F O R M

BEAM ERLANG

BEAM ERLANG

BEAM ● ERLANG HIGH LEVEL

BEAM ● ERLANG HIGH LEVEL • Name • Agner Krarup Erlang • “Ericsson Language” • High performance 1980s telecom switches • Prolog-ish syntax • Same VM as Elixir (BEAM) • Full introp • Actor model

BEAM ELIXIR

BEAM ELIXIR

BEAM ● ELIXIR HIGH LEVEL

BEAM ● ELIXIR HIGH LEVEL • Released in 2011 • BDFL José Valim & co • Several Rails core members • Runs on Erlang’s BEAM VM • Fully interoperable with Erlang • Concurrent, fault tolerant, &c

BEAM ● ELIXIR P H I LO S O P H Y

BEAM ● ELIXIR P H I LO S O P H Y • Readability • Consistency • Fault tolerance • Light weight processes • Soft realtime • Modernity (ex. UTF-8 support out of the box) • Extension / metaprogarmming

BEAM ● ELIXIR RUBY INFLUENCE 💎

BEAM ● ELIXIR RUBY INFLUENCE 💎 • Philosophy • Superficial aesthetics • Friendly • do blocks • Pragmatic • Dot syntax • Readable (“like English”) • Truthiness • Permissive • Dynamic

BEAM IN THE WILD

BEAM IN THE WILD • WhatsApp (2 million connections on a single node) • “Every phone call since 1986” • Discord • Amazon • Facebook • Motorola • Ericsson (obviously) • Heroku • RabbitMQ • Nerves • Parallela

BEAM M O T I VAT I N G C A S E S

BEAM M O T I VAT I N G C A S E S • Performance free lunch is over • Soft realtime • Networking (ie: internet) • Fault tolerant • High availability • Concurrency • “Nine nines” of uptime • Distributed computing • 99.9999999% • Hot code reloading • ~32ms total downtime per year • Clustering

S A L I E N T S Y N TA X

S A L I E N T S Y N TA X F I R S T T H I N G S T H AT Y O U ’ L L N O T I C E

S A L I E N T S Y N TA X PAT T E R N M AT C H I N G & M U LT I P L E F U N C T I O N H E A D S

S A L I E N T S Y N TA X VA R I A D I C F U N C T I O N S

S A L I E N T S Y N TA X PIPES

S A L I E N T S Y N TA X PIPES • Reorder the flow of functions • Linearize function calls for readability • Goes into the first argument position of the next function • Conceptually there is a “subject”

S A L I E N T S Y N TA X P ROTO C O LS

S A L I E N T S Y N TA X P ROTO C O LS

CONCURRENCY

CONCURRENCY THE BEAM’S RAISON D’ÊTRE

CONCURRENCY LIGHTWEIGHT

CONCURRENCY LIGHTWEIGHT • Lightweight virtual green threads • Spin up millions of processes easily • spawn ~ fork

CONCURRENCY “ WAR & PEACE” WORD FREQUENCY

CONCURRENCY “ WAR & PEACE” WORD FREQUENCY

CONCURRENCY 1 0 0 , 0 0 0 + C O N C U R R E N T TA S K S ( O N A L A P T O P )

CONCURRENCY 1 0 0 , 0 0 0 + C O N C U R R E N T TA S K S ( O N A L A P T O P )

CONCURRENCY 1 0 0 , 0 0 0 + C O N C U R R E N T TA S K S ( O N A L A P T O P )

THE ACTOR MODEL

THE ACTOR MODEL A SANE MODEL OF CONCURRENCY & A CLEANER O.O.

THE ACTOR MODEL STO RY T I M E 📖

THE ACTOR MODEL STO RY T I M E 📖 ‘

THE ACTOR MODEL STO RY T I M E 📖 📈 ‘

THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ) 📊

THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ 🤔 ) 📊

THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ 🤔 ✉ ✉ ) 📨 📊

THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ 🤔 . ✨ ✉ ✉ ) 📨 📊

THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ ✉ ✉ 🤔 📚 ✉ ✉📨 ✉ . ✨ ) 📨 📊

THE ACTOR MODEL STO RY T I M E 📖 📈 ✉ ✉ ✉ 🤔 ’ ✨ ✉ 📚 ✉📨 ✉ . ✨ ✉ ) 📨 📊

THE ACTOR MODEL STO RY T I M E 📖 📈 ✉ ✉ ’ 📨 ✉ ✉ ✉ 🤔 ✨ ✉ 📚 ✉📨 ✉ . ✨ ✉ ) 📨 📊

THE ACTOR MODEL ABILITIES

THE ACTOR MODEL ABILITIES 📈 ’ ✉ ✉ 📨

THE ACTOR MODEL ABILITIES ✉ 🤔 📈 ’ ✉ ✉ 📨 2 👶👶👶 ✉ 🔥

THE ACTOR MODEL MAILBOXES

THE ACTOR MODEL MAILBOXES • Literally what it sounds like • Elixir is async, so message passing needs a message queue buffer • Message queue • Optional timeout

SUPERVISION

SUPERVISION WHEN GOOD CODE GOES BAD 😈

SUPERVISION LET IT CRASH 🤯

SUPERVISION LET IT CRASH 🤯 • Don’t defensively program for extreme edge cases 😊 • Does not mean that you can sidestep error handling completely 😡 • Can ignore unknown unknowns • High load, concurrent systems • 1/1,000,000 bug may happen every few seconds

SUPERVISION D E C L A R AT I V E C O N F I G U R AT I O N

SUPERVISION D E C L A R AT I V E C O N F I G U R AT I O N

SUPERVISION D E C L A R AT I V E C O N F I G U R AT I O N

SUPERVISION R E S TA R T S T R AT E G I E S ♻

SUPERVISION R E S TA R T S T R AT E G I E S ♻

SUPERVISION R E S TA R T S T R AT E G I E S ♻ • :one_for_one • :simple_one_for_one • :one_for_all • :rest_for_one

SUPERVISION :ONE_FOR_ONE . 👷 ; 👷 💀

SUPERVISION :ONE_FOR_ONE . 👷 ; 💀

SUPERVISION :ONE_FOR_ONE . 💀 👷 ;

SUPERVISION :ONE_FOR_ONE . 💀 👷 ; 👷

SUPERVISION :ONE_FOR_ALL . 👷 💀 ; 💀 👷 💀

SUPERVISION :ONE_FOR_ALL . 👷 💀 ; 💀 💀

SUPERVISION :ONE_FOR_ALL . 💀 👷 💀 ; 💀

SUPERVISION :ONE_FOR_ALL . 💀 💀 💀

SUPERVISION :ONE_FOR_ALL . 💀 👷 💀 ; 💀 👷

SUPERVISION :REST_FOR_ONE . ; 1 👷 💀 2 👷 💀 3 ; 💀 4

SUPERVISION :REST_FOR_ONE . 💀 ; 1 👷 💀 2 3 ; 💀 4

SUPERVISION :REST_FOR_ONE . 💀 ; 1 2 💀 💀 3 4

SUPERVISION :REST_FOR_ONE . 💀 ; 1 👷 2 👷 💀 3 ; 💀 4

PHOENIX 🐣🔥

PHOENIX 🐣🔥 A H I G H U P T I M E , B AT T E R I E S - I N C L U D E D W E B F R A M E W O R K

PHOENIX STRENGTHS

PHOENIX STRENGTHS • All of the OTP goodness (concurrent, fault tolerant, &c) • Generally no need for external queuing systems like Sidekiq or RabbitMQ • Convenient, Rails-y APIs • Familiar layout & style • Clean(er) MVC architecture • “A bunch of libraries”, rather than a monolithic system

PHOENIX T H E R A I L S P H O E N I X W AY

PHOENIX T H E R A I L S P H O E N I X W AY • Opinionated! • [M]VC+ • Explicit > automagic • …for the parts that you touch • Safe defaults • Consistency • Focus on • Developer experience & ease of use • Sockets • Performance

PHOENIX EXAMPLE REQUEST

PHOENIX EXAMPLE REQUEST

PHOENIX EXAMPLE REQUEST

PHOENIX EXAMPLE REQUEST

PHOENIX EXAMPLE REQUEST

PHOENIX FA M I L I A R S T R U C T U R E

PHOENIX FA M I L I A R S T R U C T U R E

PHOENIX FA M I L I A R S T R U C T U R E

PHOENIX EXAMPLE CONTROLLER

PHOENIX EXAMPLE CONTROLLER

FURTHER READING

FURTHER READING WHERE TO GO FROM HERE

FURTHER READING G E T T I N G S TA R T E D & I N T E R E S T R E A D I N G

FURTHER READING G E T T I N G S TA R T E D & I N T E R E S T R E A D I N G • https://elixir-lang.org • IEx & Mix • GenServer • Broadway • Phoenix LiveView • https://hex.pm & https://hexdocs.pm • http://blog.plataformatec.com.br/tag/elixir/ • https://github.com/expede/up_run • https://github.com/expede/todo-example • https://github.com/expede/quick_chat • Twitter’s #MyElixirStatus

🎉 THANK YOU, BUFFER! ✨ hello@brooklynzelenka.com g i t h u b . c o m /e x p e d e @expede