Backend

Elixir – funkcyjny język José Valima w 2020

Elixir language - język funkcyjny w 2020 iEx

Jeśli miałbym opisać Elixira tylko jednym słowem, w 2020 roku najpewniej byłoby to słowo “dojrzały”. W tym artykule postaram się przybliżyć czytelnikom stan rozwoju i środowiska Elixira, jakie umiejętności są na dziś kluczowe, aby programowanie w Elixirze szło sprawnie, oraz jaka jest przyszłość tego języka.

michal buszkiewicz

Michał Buszkiewicz. Współzałożyciel software house Curiosum, doświadczony dev i trener programowania. Entuzjasta programowania funkcyjnego i twardo stąpający po ziemi użytkownik Elixira. Na gitarze nawala tak, że trzęsą się ściany.


Elixir lang is complete!

Siódmego dnia, Jose Valim wreszcie odpoczął

Elixir jest pod jednym względem dość wyjątkowy – jest właściwie “ukończony”. Skala pracy wykonanej w ostatnich latach przez Jose Valima i społeczność jest naprawdę imponująca. Według informacji o releasie 1.9 (z końca 2019 roku), wszystkie kluczowe funkcjonalności są już gotowe [tłumaczenia od autora]:

Nie zostały nam już do zrobienia żadne znaczące funkcjonalności dla użytkowników, ani też żadnych nie planujemy. Wiemy, że wielu uzna ten fakt za najbardziej ekscytującą część tego ogłoszenia!

Parę zdań później znajdziemy jednak dodatkowe zapewnienie, że ewolucja Elixira nie została tym samym zatrzymana:

Oczywiście, nie oznacza to, że v1.9 jest ostatnią wersją Elixira. Będziemy dostarczać nowe releasy co 6 miesięcy, z poprawkami, usprawnieniami i ulepszeniami.

José Valim i zespół Elixira dotrzymują obietnicy

Obietnicy dotrzymano. Rok 2020 przyniósł dwie nowe wersje Elixira (1.10 i 1.11), które wniosły kolejne istotne funkcje:

  • Ułatwienia określania kierunku sortowania w module Enum (skróty :asc, :desc),
  • Przejrzystsze rozróżnienie między konfiguracją czasu kompilacji i czasu wykonania,
  • Śledzenie kompilatora – nowe możliwości reagowania na zdarzenia kompilacji,
  • Ściślejsza integracja z Erlangiem w zakresie logowania i dostępu do dokumentacji,
  • Dodatkowe weryfikacje w czasie kompilacji: śledzenie rozgraniczenia aplikacji, weryfikacja poprawności użycia pól struktur,
  • Szybsza kompilacja dzięki usprawnionemu śledzeniu zależności między modułami.

Te i wiele innych, mniejszych poprawek stanowią dobry znak dla przyszłości programowania w Elixirze. Jest to w końcu język wyspecjalizowany, potężny w swojej niszy, który do rozwoju potrzebuje aktywnego community i wymagających użytkowników. Twórcy Elixira od samego początku jego istnienia byli bardzo otwarci i aktywni, a co najważniejsze, responsywni na feedback od developerów.

Niezbędnik Junior Elixir Developera w 2020

Skoro więc Elixir żyje i ma się dobrze, warto zrobić szybki przegląd kluczowych dla developerów w tym języku umiejętności. Oto moja subiektywna piątka, która powinna być silnym fundamentem dla Elixirowca:

Adapt or die!

Truizm, prawda? W świecie Elixira popyt na starszych specjalistów wciąż przewyższa podaż, a wiele firm ma problemy z rekrutacją. Niektóre z nich zupełnie zmieniły strategię rekrutacyjną i szukają specjalistów z innych technologii (np. Ruby czy React) do przeszkolenia. To zdarza się nawet dla wyższych poziomów seniority!

Biegłość w bazach danych

Ta umiejętność będzie kluczowa nawet dla początkujących. Prawie każdy Elixir developer będzie rozwijać aplikacje używające jakiejś formy SQLa do przechowywania danych. Ważnym uzupełnieniem będzie tu Ecto, podstawowa biblioteka używana do dostępu do danych.

HTTP i infrastruktura serwerowa

Zanim wgryziesz się głębiej w Phoenixa, Absinthe czy dowolny web framework, należałoby dowiedzieć się kilku rzeczy. Co to jest cykl request-response, czym różnią się POST i PUT, co to są 4xx i 5xx? Nowoczesny internet to nie tylko HTTP (ważne są też np. WebSockety, używane również w Phoenixie), ale niemal zawsze jest głównym fundamentem.

Wraz z rosnącym seniority, zrozumienie praktyk DevOps może być bardzo przydatne – niezależnie od tego, czy samodzielnie wykonuje się zadania operacyjne, czy pracuje z zespołem DevOpsów.

Operowanie na danych na wzór potoku

Elixir to język funkcyjny. Jako taki, mocno naciska na przetwarzanie danych dające się opisać jako “potok”, czyli złożenie funkcji, z których każda kolejna przekształca jedne dane w drugie – pamiętając, że co do zasady dane w Elixirze mają cechę immutable. Jeśli taki styl pracy na danych Ci odpowiada, witaj w domu. Z odrobiną doświadczenia biblioteki takie jak GenStage i Flow pozwolą na sprawne działanie w środowisku rozproszonym, co jest jedną z głównych zalet Elixira.

Ogarnij współbieżność

Kiedy inne języki właściwie symulują współbieżność stosując obliczeniowe sztuczki, Elixir jest prawdziwie współbieżny. Dzięki oparciu współbieżności o model aktorów, poszczególne procesy współdzielą dane przez przekazywanie wiadomości, zamiast przekazywać wiadomości przez współdzielenie danych (np. współdzieląc zmienne między wątkami). To ogromna różnica.

Ambitni juniorzy (oraz właściwie każdy doświadczony Elixir developer) powinni dobrze rozumieć różnicę pomiędzy tym modelem a threadingiem. Jeśli tak jest, przejście od systemów współbieżnych do rozproszonych powinno być łatwe.

Elixir 2.0? Skąd potęga tego języka?

Jose Valim wyjaśnił ostatnio dlaczego twórcy Elixira mogą pozwolić sobie na “pusty backlog”:

Po pierwsze, Elixir jest zbudowany na Erlangu/OTP, więc po prostu korzystamy z całej pracy wykonywanej przez Ericssona i zespół OTP w kwestii runtime’u i maszyny wirtualnej.

Po drugie, Elixira projektowaliśmy jako język rozszerzalny. Te same narzędzia i abstrakcje, z których korzystamy, żeby tworzyć i ulepszać język są również dostępne dla bibliotek i frameworków. Dzięki temu społeczność może rozwijać ekosystem bez potrzeby grzebania w samym języku, dzięki czemu nie jest on wąskim gardłem w rozwoju.

Tym samym na dzień dzisiejszy Elixir 2.0 jest raczej pieśnią odległej przyszłości. To nie powinno być jednak traktowane jako deficyt Elixira. Cytując znów Jose:

To, co czyni Elixira tak potężnym, to jego zdolność do bycia rozszerzanym. Naszym celem jest dawać możliwości.

To, co uznaje się za powszechny przypadek użycia języka zmienia się z czasem. To, co dzisiaj jest standardem w społeczności może jutro być przestarzałe czy nieużyteczne. Wystarczy porównać, co jest dziś użyteczne dla Phoenixa, a co dla Nerves [biblioteka dla systemów wbudowanych].

Do tego kod dodawany do Elixira nie może być łatwo usunięty, trzeba go utrzymywać przez naprawdę długi czas. Nie chcę spojrzeć wstecz na Elixira za 10 lat i zobaczyć, że te wszystkie bajery, które dodaliśmy, nie służą już do niczego.

Elixir – Phoenix wskazuje filozofię

Reasumując, wszystko, co nie musi być w rdzeniu języka, powinno znaleźć się w odrębnych pakietach. Taka filozofia ma swoje pozytywne konsekwencje – uzmysławia twórcom bibliotek, jak kluczowe jest ograniczanie rozdęcia języka i napychania do niego dodatków. Jeden pakiet – jeden problem do rozwiązania. Dobrym przykładem narzędzi, które podążają za tą filozofią, będą tu popularne biblioteki, Ecto i Phoenix.

Tym samym wskakując teraz do pociągu Elixira, mamy właściwie gwarancję stabilnego, długoterminowo utrzymywanego języka, który nie wprowadzi nazajutrz pracochłonnej z naszego punktu widzenia rewolucji. Twój linter nie będzie jutro łamać sobie głowy nad jakimś nowym udziwnieniem w składni.

Elixir 2020 - language - rozszerzalny - mem

Użytkownicy Elixira nie muszą się tym przejmować w 2020

Elixir, będąc rozszerzalnym i posiadając potężne możliwości metaprogramowania, pozwala na dodawanie do projektu najróżniejszych składniowych smaczków. Rzecz jasna, co za dużo, to niezdrowo, ale dla przykładu (jeśli klasyczny syntax Elixira nam nie odpowiada):

%{foo: foo, bar: bar, baz: baz} = map

… po czym wystarczy użyć prostej, opartej na makrach biblioteki, żeby wprowadzić składnię podobną do JSowego destructuringu:

~M{foo, bar, baz} = map

To przykład ulepszenia, które najpewniej nie zasługuje na włączenie do rdzenia Elixira, ale może pomóc dopasować nam do własnych preferencji środowisko pracy. Nie będzie też zapewne wielkiej presji na takie zmiany ze strony developerów. A nawet jeśli – taka zmiana nadal nie byłaby wśród krytycznych cech w oczach twórców.

Niemniej, zgodnie z filozofią Elixira, jeśli potrzebujesz takiej funkcjonalności… po prostu to sobie napisz i zrób.

Elixir vs Erlang/OTP – konkurencja, czy symbioza?

Przyszłość Elixira to przyszłość Erlanga/OTP

Parę zdań z zeszłorocznego wystąpienia Jamesa Fisha na Code BEAM SF jest wartych przytoczenia. James jest członkiem zespołów Elixira i Ecto:

Elixir prawdopodobnie jest już w swoim dojrzałym stadium, nie ma już dużo oczywistych zadań do ukończenia, jest już bardzo stabilny. Jeśli chcesz poprawiać Elixira, wciąż są sprawy do rozwiązania, jak szybsza kompilacja, lepsze raportowanie o błędach – ale do ich poprawy pewnie trzeba by się udzielać w OTP, a nie Elixirze. Jeśli chciałbyś usprawnić działanie Elixira w BEAMie, to zapewne należałoby kontrybuować w środowisku Erlanga, nie Elixira.

Właśnie dzięki symbiotycznej relacji z Erlangiem, Elixir jest tak wydajny. Powoduje to jednak pewną zależność od Erlanga w kwestii kierunku całego projektu i jego dalszego rozwoju. Na szczęście, to bardzo stabilny fundament – Erlang jest kluczowy w nowoczesnych sieciach telekomunikacyjnych, gdzie wciąż zachowuje potężną użyteczność.

Stopy na ziemi i mocny łyk Elixira

Zadomowienie się w świecie developerskim zajęło Elixirowi parę lat. W 2020 zajmuje on jednak ciekawą niszę, a w niektórych wyspecjalizowanych aplikacjach pokazuje pazury i rozstawia konkurencję po kątach. Wraz z Phoenixem jest podstawą wielu potężnych aplikacji webowych. Wciąż jest jednym z najlepszych wyborów dla embedded software’u. Potrzebujesz skalowalnego MVP? Elixir to może być strzał w dziesiątkę.

To po stronie pozytywów – ale trzeba mieć też stopy mocno na ziemi. Elixir najpewniej nie zdobędzie nigdy ogromnej popularności, jego rywale mają większe community i przewagę w dostępnych bibliotekach. To nie Ruby, gdzie połowę rozwiązań można zwinąć ze Stack Overflow. Testowanie Elixira wymaga doświadczenia i umiejętności. Jeśli projekt ma bardzo niski poziom skomplikowania i spodziewanego ruchu, Elixir może być niepotrzebnie “za silny” – po co nam Tesla do jeżdżenia po ogródku. Może potrzebujesz szalonej wydajności tylko dla kawałka swojego projektu, i tam jedynie warto pisać w Elixirze?

Elixir nie jest panaceum na wszystkie bóle. Ale jest bardzo wydajnym, ciekawym językiem, który warto zbadać – i kto wie – być może się nauczyć. Powodzenia!


Zdjęcie główne artykułu pochodzi z unsplash.com.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://justjoin.it/blog/elixir-funkcyjny-jezyk-jose-valima-w-2020" order_type="social" width="100%" count_of_comments="8" ]