dwyl / learn-phoenix-framework

phoenix framework logo

Lær hvordan du bruger Phoenix Framework til athave det sjovt at bygge realtids web/mobilapps
som er hurtige for “slutbrugerne”, pålidelige,skalerbare, vedligeholdbare og (nemt) udvidelige!

Hvorfor?

Som web/mobilappudviklere har vi brug for at udnytte det arbejde, som andre (virkelig kloge) mennesker har udført
i stedet for konstant at bygge ting “fra bunden” hele tiden; det er derfor, vi bruger frameworks til at bygge vores apps!

Se: “Der er mange frameworks at vælge imellem (et par “populære” frameworks er nævnt nedenfor i afsnittet “Spørgsmål”).
Men hvis vi går efter, hvad der er “populært”, ville vi stadig ride på heste (og vogne) overalt, og der ville ikke blive gjort nogen fremskridt.

Bemærk: alle begrundelserne “Hvorfor “for Elixir gælder også for Phoenix!
Se dem: https://github.com/dwyl/learn-elixir#why

Hvad?

En ramme for webapplikationer uden kompromis!

Developer Joy

Den største “begrænsning” i ethvert teknologiprojekt er mennesker.En “Entrepreneur”/”Founder” eller “Product Owner” kan have alle de gode ideer i verden, hvis de ikke er i stand til at omsætte ideen til virkelighed, er det meningsløst.

(Skal jeg bekymre mig om) Benchmarks?

Du bør naturligvis køre dine egne benchmarks på din egen hardware/cloud og træffe informerede beslutninger baseret på kravene til din app/dit produkt, men …. da vi læste statistikkerne for hvor mange samtidige brugere en Phoenix App kan håndtere (med live WebSocket-forbindelser) blev vi blæst væk!Det betyder, at vi kan bygge vores realtids app(s) med 90% færre ressourcer.

Performance Highlights

  • betydeligt lavere latenstid og responstid på forespørgsler end noget andet! (takket være Erlangs letvægtsprocesser og ultraeffektiv netværks-/messagehåndtering)
  • 4x flere anmodninger pr. sekund end den tilsvarende Node.js (Express.js)-app.
  • 9x mere gennemløb end en Python 2.7-baseret app. (blokering stinker virkelig!)
  • 10x – 100x flere forespørgsler håndteret end Ruby-on-Rails(afhængigt af typen af app!)
  • Lignende ydeevne som Go på en enkelt server, men en meget enklere multi-server concurrency model, så horisontal skalering på tværs af flere datacentre (“tilgængelighedszoner”) er meget nemmere! (Erlang administrerer ressourcerne til flere servere/processorer som en enkelt app-“flåde” og uddelegerer anmodninger/behandling til dem på tværs af klynger/zoner!)

Alt dette betyder, at du bruger betydeligt færre penge på Hardware/Cloud-infrastruktur, så din app/virksomhed kan opnå en konkurrencefordel på omkostningerne.

Hvis du er i den heldige position at overveje at bruge noget langt bedre til dit næste projekt, så kig ikke længere end Phoenix!
Læs mere: http://www.phoenixframework.org

Hvem?

Mange mennesker/teams/firmaer bruger allerede Erlang/Elixir og Phoenix og ser fænomenale resultater!
Inklusive: Adobe, BBC, Spotify, Pinterest, Discord (Gamer Chat App), Groupon (Fave), Lonely Planet, Brightcove, Slack …
Se: https://github.com/doomspork/elixir-companies

Hvem bør lære Phoenix?

  • Personer, der ønsker en nem måde at bygge en app på med alle de moderne bekvemmeligheder som “generatorer”, indbygget database-interface (“ORM”) og førsteklasses WebSockets til “realtid” og samtidig få legendarisk pålidelighed.
  • Teams, der har brug for udviklerproduktiviteten eller Ruby-on-Rails eller Django,men som ønsker mindre “magi” (dvs. ønsker at forstå, hvordan det hele fungerer!).
  • Firksomheder, der ønsker at bruge 90 % mindre på både udvikler- og infrastrukturomkostninger,så du kan betjene flere mennesker med færre ressourcer.

Hvem bør IKKE lære Phoenix?

  • Alle, der har brug for at bruge det “mest populære” framework eller sprog (uanset årsagen).
  • Firksomheder, der allerede har masser af legacy Java/PHP/etc. og ikke kan investere tid til at lære/bruge noget nyt.
  • Udviklere, der ønsker “jobsikkerhed” ved at fejlrette upålidelig kode.

Hvordan?

Forudsætninger/forudsætninger?

Elixir

Du kan ikke bygge en Phoenix App uden at kende Elixir.
Hvis du er ny i Elixir, skal du “stjerne” (bogmærke) this repo(så du kan vende tilbage til det i morgen)
og derefter gå til:github.com/dwyl/learn-elixirlær elixir, indtil du føler, at du forstår syntaksen, og kom derefter tilbage og lær Phoenix!

Specifikt bør du fokusere på at lære Elixir “Basics”:

  • datatyper
  • atomer
  • mønstermatchning
  • maps
  • funktionsdefinitioner
  • moduler

Node.js

Phoenix bruger Node.js til at kompilere aktiver som JavaScript- og CSS-filer (ved hjælp af Webpack).
Du skal blot sikre dig, at du har Node.js installeret. https://nodejs.org
Du behøver ikke at kende Node for at bruge Phoenix.

Installation

Hvis du allerede har lært noget Elixir og installeret Node.js, så er det første skridt for at komme i gang med Phoenix installationen!

Dokumentationen om Phoenix er fantastisk, så vi anbefaler at følge de officielle installationsinstruktioner for Phoenix!

Du skal også installere PostgreSQL, der er en vejledning i hvordan du gør det i Phoenix-installationsvejledningen, der er linket ovenfor, men du kan også tjekke vores learn-postgresql repo for instruktioner, og rejs et problem, hvis du har problemer!

Mens en grundlæggende forståelse af JavaScript kan være nyttig til tider, behøver du ikke at vide, hvordan man bruger Node for at bruge Phoenix.

Hvis du er nysgerrig efter at vide, hvorfor de valgte Brunch.io frem for “alternativer”,
det korte svar er:
Hvis du er nysgerrig efter at vide, hvorfor de valgte Brunch.io frem for “alternativer”, er det korte svar: Simplicity & Speed!se: http://brunch.io/docs/why-brunch
Note: Phoenix v1.4 (ikke udgivet i skrivende stund)bruger WebPack til kompilering af aktiver, se: http://brunch.io/docs/why-brunch
CHANGELOG.md

Næste?

Færdiggør dig selv med “Up and Running” (officiel) vejledning:https://hexdocs.pm/phoenix/up_and_running.html#contentup-and-running

Praktiske eksempler?

Når du har installeret Phoenix og fulgt den officielle “up and running”-vejledning,
kommer du tilbage og prøver disse begyndervenlige eksempler:

  • Tæller (delt realtidstæller ved hjælp af Phoenix LiveView):https://github.com/dwyl/phoenix-liveview-counter-tutorial
  • Todo List (trinvis vejledning, der viser, hvordan du bygger en fuldt funktionel TodoMVC-klon):https://github.com/dwyl/phoenix-todo-list-tutorial
  • Chat (realtime UI/UX ved hjælp af WebSockets):https://github.com/dwyl/phoenix-chat-example
  • Kryptering (sikkerhed):https://github.com/dwyl/phoenix-ecto-encryption-example
  • Append-only Log (hvordan du gemmer din app’s data):https://github.com/dwyl/phoenix-ecto-append-only-log-example

Book?

Vi anbefaler, at folk køber (eller låner)@chrismccord’s bog: “Programming Phoenix”
se: https://pragprog.com/book/phoenix14/programming-phoenix-1-4
phoenix-book-screenshot
Forfatterne er individuelt imponerende og tilsammen dækker de Phoenix på en forståelig måde som ingen andre kan!Chris skabte Phoenix, José skabte Elixirog Bruce er en ultra-erfaren teknisk forfatter med mange succesfulde bøger i sit navn!
(dvs.: bogen er det oplagte valg, når det gælder om at lære Phoenix!)

Video Intro by José Valim (Skaber af Elixir)

Jose Valim - Phoenix a web framework for the new web
https://youtu.be/MD3P7Qan3pw

ElixirConf 2016 - Keynote af José Valim
https://youtu.be/srtMWzyqdp8

Ressourcer

  • Elixir vs Ruby Showdown – Phoenix vs Rails: https://littlelines.com/blog/2014/07/08/elixir-vs-ruby-showdown-phoenix-vs-rails
  • Benchmark: https://github.com/mroth/phoenix-showdown

Vores 10 bedste grunde til at vælge Phoenix

“Phoenix giver Ruby-on-Rails’ produktivitet
med Erlang’s samtidighed og fejltolerance.”

  1. Beyond all the (fantastic) technical benefits,what attracts us to Phoenix is the Great Communityof people around the world who are excited about making Phoenixan amazing tool for building web apps!
    At have velkomne mennesker, der vil
  • hjælpe dig, når du sidder fast, tålmodigt forklare ting
  • besvare spørgsmål (både “noob “og “avancerede”) og
  • åbent diskutere (dine) ideer til forbedringer.se: https://elixirforum.com/t/phoenix-v1-3-0-rc-0-released/3947

  1. Phoenix bruger programmeringssproget Elixir, hvilket betyder, at din app er kompileret og køres på Erlang Virtual Machine “BEAM”.
    Erlang er en gennemtestet og meget fejltolerant VM, der bruges af mange teleselskaber

  2. WebSockets (“kanaler”) er indbygget i rammen, hvilket betyder, at det er meget nemmere at bygge apps med “realtids”-kommunikation og -interaktion end stort set alle andre rammer/platforme (der er ikke brug for et tredjeparts magic modul! alt, hvad du har brug for, er der allerede, klar til, at du kan betjene millioner af mennesker!)
    se: http://www.phoenixframework.org/docs/channels

  3. En nem asynkronisering, fordi al programmering i Phoenix (Elixir) er funktionel!Det betyder, at det er virkelig nemt at abstrahere nyttig funktionalitet som f.eks. anmodningsautentifikation, logning og behandling i “piplines”, der er let læselige for mennesker! (ingen tredjepartsmodul async er påkrævet! ingen “promises”, “generatorer” eller “observables”, der skal administreres!!)

  4. Sikkerhed & Resilience Mindset er den default.Kryptering (SSL) er let i Phoenix/Elixir, og både afbødning af SQL-injektion, Cross-site Scripting (XSS) og CSRF-beskyttelse er indbygget (aktiveret af default), så det er praktisk talt umuligt for en “nybegynder” programmør at indføre denne type sikkerhedsfejl.

  5. Concise Code kan ikke undervurderes! Vi kan skrive langt færre linjer end i den tilsvarende Node.js/Java/Rails/Go-app, hvilket betyder, at udviklerne er mere produktive, og at der er mindre kode at vedligeholde!

  6. Testbarhed på grund af funktionel programmering af alle controllere!

  7. Nemt at udrulle: http://www.phoenixframework.org/docs/heroku

  8. Deployering uden nedetid er gratis! (igen på grund af Erlang). Erlang klarer overgangen af “levende/aktive” brugere fra den gamle til den nye version af din app, uden at de overhovedet opdager, at den er blevet opgraderet/opdateret!!!

  9. Inbygget overvågning/styring af din app via Erlang supervisors betyder, at du ved præcis, hvordan din app fungerer, hvilke dele der er gået ned/genstartet og hvorfor! Dette er en funktion, som vi betaler (meget) for i andre frameworks, og her er den gratis!!

Kan du komme på en anden grund til, hvorfor det er fantastisk at bruge Phoenix?!
Del dine tanker i denne tråd:https://github.com/dwyl/learn-phoenix-framework/issues/13

Spørgsmål?

Skal jeg lære Elixir, før jeg prøver/bruger Phoenix?

Ja. se: https://github.com/dwyl/learn-elixir

Skal jeg kende Erlang for at bruge Elixir & Phoenix…?

Nej. Du kan begynde at lære/bruge Elixir i dag og kalde Erlang-funktioner, når det er nødvendigt,
men du behøver ikke at kende Erlangbefore du kan bruge Phoenix!

Men Phoenix er ikke “Mainstream” … Skal jeg/vi bruge det…?

Der er mange webapplikationsframeworks, du/vi kan vælge imellem:https://en.wikipedia.org/wiki/Comparison_of_web_frameworks
Så hvorfor skulle nogen vælge et framework skrevet i et programmeringssprog, der ikke er “mainstream”…?

Hvorfor bruger vi ikke Hapi.js mere…?

Dette er misinformation. Vi bruger stadig Hapi.js til en række projekter, hvor det er hensigtsmæssigt.
Det omfatter flere kundeprojekter og interne dwyl-apps/værktøjer.

Vi besluttede at bruge Phoenix til vores nye projekter af disse simple grunde:

  • Elixir er et pænere sprog end JavaScript.#LessIsMore #LessButBetter #SmallIsBeautiful #SyntaxMatters
  • JS kan være funktionelt, mens Elixir (altid) er funktionelt!Den forskel gør hele forskellen!
    Med “funktionel” programmering er programmerne meget nemmere at tænke over, mens du skriver/vedligeholder dem!
  • Elixir bruger Erlang VM, som er langt mere effektiv/kraftig end “V8”
  • Den Erlang VM skalerer meget nemmere til multi-core multi-server multi-data-center end Node.js
    (eller stort set alt andet for den sags skyld!!)

For vores nye projekter har vi brug for multi-data-center fejltolerance!
vi får det “gratis” ved at bruge Erlang – Elixir – Phoenix!!!

I vores mening er Hapi.js stadig “det bedste” Node.js framework, og vi vil continue bruge og anbefale det
til folk, der har brug for simple apps, der skalerer og er nemme at vedligeholde.
Se: https://github.com/dwyl/learn-hapi

Og vi bruger også stadig JavaScript til alle vores AWS Lambda Micro-Services, og det vil ikke ændre sig.
De er enkle, effektive og skalerer rigtig godt!
Se: https://github.com/dwyl/learn-aws-lambda

Hvad er “forkert” ved at bruge Rails eller Django?

De oprindelige “produktive” webframeworks var “Ruby-on-Rails” og “Django” (python) tilbage i 2005!
(Vi brugte begge disse i perioder i vores “rejse” og kan tale om fordelene ved hver af dem!)

Der er “intet galt” med at bruge Rails eller Django.
Vi mener, at der stadig er masser af use-cases for begge frameworks.
Vi ved bare, at det er (meget) nemmere at bygge “real-time”
med Phoenix, fordi “Channels” (WebSockets) er bagt ind,
og Elixir/Erlang concurrency er en helt anden boldgade!
Erlang (og dermed Phoenix) kan håndteremillioner af samtidige brugere på en enkelt server,
hvorimod en Rails/Django server kun kan håndtere et par tusinde (i bedste fald!)
hvis din app kun betjener et par tusinde mennesker på en gang, så er du fint!!

Vi elsker det faktum, at Erlang bruger “lighweight long-lived” processer,
hvilket betyder, at vi kan forbinde millioner af (IoT) enheder …For IoT Erlang er (ubestrideligt) the Answer!
For enklere webapps, hvor du kun forventer et par brugere om dagen, er Rails/Django stadig levedygtige.

Men hvorfor gå på kompromis, hvis du ikke er nødt til det?
Hvis du kan få en Tesla til “prisen” af en Ford Focus, hvorfor skulle du så ikke?!?
Hvorfor nøjes med det gode, når du nemt kan få/bruge det bedste?

Men GitHub bruger stadig Rails … GitHub er vel “skalerbar”?

Ja, GitHub bruger stadig Rails til deres Web App/Site.
Men spørg en af GitHubs kerneteam, om de (hvis de fik chancen for at starte forfra) ville vælge Rails
til at bygge GitHub i 2017, og se hvor mange af dem der siger “ja, selvfølgelig” (med et ærligt ansigt…)!

Derudover gør GitHub en masse ting for at skalere Rails i baggrunden.
Og mange af deres nyere (klient-side) funktioner er skrevet i JavaScript!se: https://github.com/github

Bottom line er: Alt kan gøres til at skalere ved hjælp af “DevOps”,
men Phoenix er gjort til at skalere af defaultfordi Erlang (blev) opfundet (til) at skalere!

Hvorfor IKKE bruge Go?

“Der er to slags programmeringssprog – dem, som ingen bruger, og dem, som alle brokker sig over” ~ Bjarne Stroustrup(skaberen af C++)

Go er meget populært. I høj grad på grund af det faktum, at Google “sponsorerer” det.
Det var meningen at forenkle (erstatte) C++ og Java i Google …
og det er for det meste lykkedes!

Vi kan virkelig godt lide Go. Det var vores “nummer to”-valg, da vi skulle beslutte, hvilket programmeringssprog
(efter Elixir) i vores “post JS stack” …Beslutningen om at bruge elixir i stedet for noget else var let:

  • Elixir er funktionelt (meget enklere at læse/skrive/vedligeholde/udbygge)
  • Elixir-funktioner sammensættes på en virkelig elegant måde som “plugs”/”pipelines”
  • Data er uforanderlige, hvilket gør applikationstilstand forudsigelig (ingen gætterier!
  • Typer er dynamiske og udledte (ingen grund til manuelt at deklarere dem)men der er regler, som forenkler tingene, og compileren kontrollerer dem og giver en passende advarsel.
  • Erlang gør distribuerede apps meget nemmere, og vores plan er at bygge IoT-systemer, som vil betyde at forbinde mange (millioner) enheder med vedvarende forbindelser, Erlang er skabt til dette!
  • Phoenix indeholder mange nyttige ting out-of-the box, herunder fleresikkerhedsfunktioner, som de fleste mennesker ikke engang tænker på.

Videre læsning:

  • Hvorfor Go ikke er godt: http://yager.io/programming/go.html
  • Go Web Frameworks: http://yager.io/programming/go.html
  • Go Web Frameworks: https://medium.com/code-zen/why-i-don-t-use-go-web-frameworks-1087e1facfa4
  • Hvorfor alle hader Go: https://medium.com/code-zen/why-i-don-t-use-go-web-frameworks-1087e1facfa4
  • https://npf.io/2014/10/why-everyone-hates-go/(click-bait titel, nogle gyldige punkter…)
  • Diskussion:
  • Diskussion: https://www.reddit.com/r/elixir/comments/3c8yfz/how_does_go_compare_to_elixir

(`Hjælp ønskes` for at udvide dette svar…)

Hvorfor IKKE bruge Scala + Play Framework i stedet…?

Hvis du allerede er vant til at skrive Java eller udrulle til JVM’en, er Play Framework et fremragende valg: https://www.playframework.com
Scala er et godt programmeringssprog, og alle bør lære det!https://www.scala-lang.org/what-is-scala.html

Vi har brugt Play et par gange (før vi overtog Node.js)og kunne virkelig godt lide det!
Men Scala er et “køkkenvask” (multi-paradigme)programmeringssprog, der giver folk mulighed for at bruge “hele Java” …
Vi mener, at Scala’s “Java Interoperability” betyder, at det er “for nemt” at tillade kompleksitet i din kodebase. Specifikt “OOP-mutation” …

Så hvorfor bruger vi (DWYL) ikke længere “Play” til nye projekter?For det første gik vi over til Hapi.js (Node.js) for et par år siden, fordi det var mere “let” og gav os mulighed for at skrive små programmer, der kun brugte et par megabyte RAM (hvor vores Play-apps var meget ressourcekrævende)..!har du nogensinde prøvet at køre en Scala-app på en “simpel” bærbar computer som en Chromebook…?)

Summary of “reasons” for Phoenix instead of Play:

  • Vi fastholder, at Play/Scala stadig har masser af gyldige use-cases.
  • Elixir er langt mere simpelt end Scala.
  • Erlang VM er langt bedre til samtidighed end JVM.
  • Vi elsker det faktum, at alle data er uforanderlige i Elixir.
  • Vi elsker, hvor få ressourcer det kræver at køre en Phoenix-app(f.eks. på en Raspberry Pi!!!)

Vi mener bare, at til vores projekt(er) fungerer Erlang’s Concurrency-model bedre og funktionel kode, der omdanner Immutable data, er nemmere at teste og vedligeholde.

Hvis du har beviser for, at “Scala er enklere “vil vi gerne høre fra dig!
Fortæl os: https://github.com/dwyl/learn-phoenix-web-development/issues

Hvorfor ikke bruge Haskell?

Hvis du kan lide funktionel programmering (FP) så meget, hvorfor så ikke bruge Haskell?

Stil flere spørgsmål: https://github.com/dwyl/learn-phoenix-framework/issues

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.