Elixir - Easy fun for busy developers @ Devoxx 2016

Post on 16-Apr-2017

245 views 1 download

Transcript of Elixir - Easy fun for busy developers @ Devoxx 2016

#Devoxx #AwesomeElixir @koenighotze

Bootstrap |> Elixir

EASY FUN FOR BUSY DEVELOPERS

#Devoxx #AwesomeElixir @koenighotze

@koenighotze / David Schmitz

Senacor Technologies Programmer!

Bad, bad fighter!

#Devoxx #AwesomeElixir @koenighotze

WET YOUR APPETITE FOR ELIXIR SHOW OFF SOME COOL FEATURES

CODE A DISTRIBUTED PIZZA PARLOUR

#Devoxx #AwesomeElixir @koenighotze

学⼀一⻔门语⾔言,就是多⼀一个观察世界的窗户。To learn a language is to have one more window from which to look at the world

#Devoxx #AwesomeElixir @koenighotze

Two minor caveats

#Devoxx #AwesomeElixir @koenighotze

I AM THE JON SNOW OF ELIXIR AND ERLANG/OTP

#Devoxx #AwesomeElixir @koenighotze

THIS IS NOT A README!

#Devoxx #AwesomeElixir @koenighotze

YET ANOTHER PROGRAMMING LANGUANGE?

Y A P L

#Devoxx #AwesomeElixir @koenighotze

Elixir in a Nutshell

+Elixir in a Nutshell

+

#Devoxx #AwesomeElixir @koenighotze

Principle of Conciseness Principle of Consistency Principle of Flexibility

Why Ruby is awesome

#Devoxx #AwesomeElixir @koenighotze

Battle-proven BEAM and OTP

Ever seen WhatsApp crash?

Reactive before Reactive-is-HipTm

Actors before Actors-are—HipTm

Why Erlang is awesome

#Devoxx #AwesomeElixir @koenighotze

Why Clojure is awesome

Because Rich Hickey is always right

#Devoxx #AwesomeElixir @koenighotze

WHY NOT JUST USE RUBY, ERLANG OR CLOJURE?

#Devoxx #AwesomeElixir @koenighotze

It didn't take long, but pretty soon my gut feeling kicked in. This is good $hit. …, they both compile to instructions for the EVM

- Joe Armstrong (Creator of Erlang)

#Devoxx #AwesomeElixir @koenighotze

Programmer focussed OTP Power + Ruby Love Functional but pragmatic

Standard Toolset

Why Elixir is awesome

#Devoxx #AwesomeElixir @koenighotze

#Devoxx #AwesomeElixir @koenighotze

Erlang/OTP

ERLANG/BEAM TOOLS

LIBRARIES PATTERNS

#Devoxx #AwesomeElixir @koenighotze

Elixir

ERLANG/BEAM TOOLS

LIBRARIES PATTERNS

#Devoxx #AwesomeElixir @koenighotze

Pizza Parlour - Version 1“Take my money! I want a salami pizza!”

“I am hungry!!”

“3 €, please!”

#Devoxx #AwesomeElixir @koenighotze

Pizza Parlour - Version 1 Demo

#Devoxx #AwesomeElixir @koenighotze

WHAT ABOUT 99.9999999?

#Devoxx #AwesomeElixir @koenighotze

Pillars of Resilience and ReliabilityMessage-passing between

isolated processes Automatic recovery and

monitoring Transparent distribution

#Devoxx #AwesomeElixir @koenighotze

Elixir Power Tools

Messaging with GenServer modules Supervisor for transparent resilience

#Devoxx #AwesomeElixir @koenighotze

Shared resources Shared state Shared stability

SHARED STATE

COMPUTATION COMPUTATION COMPUTATION

HEAVY WEIGHT PROCESS

COMPUTATION COMPUTATION COMPUTATION

#Devoxx #AwesomeElixir @koenighotze

Light Weight Processes

MAILBOX

STATE

COMPUTATION

AsynchronousSynchronous

GENSERVER

#Devoxx #AwesomeElixir @koenighotze

GenericServer in a Nutshell

loop(current_state): wait for message handle message send reply loop(new_state)

#Devoxx #AwesomeElixir @koenighotze

GenericServer in a Nutshell

loop(current_state): wait for message handle message send reply loop(new_state)

#Devoxx #AwesomeElixir @koenighotze

GenericServer in a Nutshell

loop(current_state): wait for message handle message send reply loop(new_state)

#Devoxx #AwesomeElixir @koenighotze

GenericServer in a Nutshell

loop(current_state): wait for message handle message send reply loop(new_state)

#Devoxx #AwesomeElixir @koenighotze

Architecture build around tiny Processes

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

PROCESS

HEAVY WEIGHT PROCESS

#Devoxx #AwesomeElixir @koenighotze

Message driven Pizza - The request{:pizza, “Salami”}

handle_call({:pizza, “Salami”}, from, state)

#Devoxx #AwesomeElixir @koenighotze

%{order_number: 123, price: 10.50}

Message driven Pizza - The reply

#Devoxx #AwesomeElixir @koenighotze

Pizza Parlour - Version 2 Demo

#Devoxx #AwesomeElixir @koenighotze

NOW REALLY, WHAT ABOUT

RESILIENCE???

#Devoxx #AwesomeElixir @koenighotze

“HAVE YOU TRIED TURNING IT OFF AND ON AGAIN?”

#Devoxx #AwesomeElixir @koenighotze

The WHAT IF scenario

{:pizza, “Salami”}

#Devoxx #AwesomeElixir @koenighotze

Risk at the Bottom of the Supervision TreeAPPLICATION

SUPERVISOR

Here be dragons…

#Devoxx #AwesomeElixir @koenighotze

APPLICATION

SUPERVISOR

Supervisors watch their Children

#Devoxx #AwesomeElixir @koenighotze

APPLICATION

SUPERVISOR

Supervisors watch their Children

#Devoxx #AwesomeElixir @koenighotze

APPLICATION

SUPERVISOR

Supervisors watch their Children

#Devoxx #AwesomeElixir @koenighotze

Pizza Parlour - Version 3 Demo

#Devoxx #AwesomeElixir @koenighotze

There is so much more

#Devoxx #AwesomeElixir @koenighotze

Protocols for polymorphism

defimpl String.Chars do def to_string(bitmap), for: [Bitmap] do … end end

#Devoxx #AwesomeElixir @koenighotze

Hygienic Macrosdefmacro unless(clause, do:expression) do quote do if(!unquote(clause) do unquote(expression)) end end end

#Devoxx #AwesomeElixir @koenighotze

Hygienic Macrosdefmacro unless(clause, do:expression) do quote do if(!unquote(clause) do unquote(expression)) end end end

#Devoxx #AwesomeElixir @koenighotze

Zero downtime Hot code replacement

def code_change(ver, old_state, extra) do new_state = … {:ok, new_state} end

#Devoxx #AwesomeElixir @koenighotze

Real-time apps with Ecto and Phoenix

defmodule Video do def alphabetical(query) do from q in query, order_by: q.name end end

#Devoxx #AwesomeElixir @koenighotze

Real-time apps with Ecto and Phoenix

def alphabetical(query) do …

Video |> Video.alphabetical |> Repo.all

#Devoxx #AwesomeElixir @koenighotze

SHOULD WE ALL START BUILDING EVERYTHING

WITH ELIXIR?

#Devoxx #AwesomeElixir @koenighotze

#Devoxx #AwesomeElixir @koenighotze

WELL….MAYBE NOT?!

#Devoxx #AwesomeElixir @koenighotze

AND OF COURSE…

#Devoxx #AwesomeElixir @koenighotze

MICROSERVICE AND CLOUD READY ;)

#Devoxx #AwesomeElixir @koenighotze

New insights and ideas Clean patterns as part of the core Architecture and Tooling for IoT Vibrant and friendly Community

Come for OTP, stay for…

#Devoxx #AwesomeElixir @koenighotze

Elixir Homepage, http://elixir-lang.org/

Dave Thomas, Programming Elixir

Fred Hebert, Stuff Goes Bad: Erlang in Anger

Do you want to know more?

#Devoxx #AwesomeElixir @koenighotze

Thank you very much!<david.schmitz@senacor.com>