Nasza strona używa cookies. Dowiedz się więcej o celu ich używania i zmianie ustawień w przeglądarce. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Dlaczego warto nauczyć się Clojure

Sprawdź, jak Clojure pomoże Ci w projekcie, dlaczego powinienieś się go nauczyć i jak to zrobić.
28 01 2019

Tym razem napiszę o tym, dlaczego warto sięgnąć po Clojure. Przedstawię mnóstwo materiałów, a na koniec pokażę narzędzia, z których korzystam, pracując z Clojurem. W kolejnych tekstach wspólnie napiszemy jakiś mały program, abyś mógł zasmakować pracy z tym wspaniałym językiem (który jako koncept jest już bardzo dojrzały).


Dlaczego Clojure?

W jednym z poprzednich moich tekstów zachęcałem do sięgnięcia po LISP. Dziś zachęcam do wybrania Clojure'a jako implementacji Lispu wartej nauki i przynoszącej najszybsze korzyści.

Co więc takiego interesującego jest w Clojure? Zakładam (na podstawie danych z raportu o branży IT), że z dużym prawdopodobieństwem nie jest Ci obca Java i Java Virtual Machine. Clojure to otwarta implementacja Lispu, działająca przede wszystkim na JVM. Ale działa także na CLR (.NET) oraz dzięki ClojureScriptowi - w przegladarce (po transpilacji/kompilacji do JavaScriptu). Świetnie! Jeden język (do tego potężny) i trzy docelowe platformy.

Oczywiście wiem, że dzięki NodeJS możemy używać JavaScriptu (a także TypeScriptu) po stronie serwerowej i backendowej aplikacji webowych, ale gdy spojrzymy na Clojure (backend) i ClojureScript (frontend), to okaże się, że jest to bardziej spójna platforma do rozwijania. I to jest oczywiście jeden z powodów, dla których warto zainwestować swój czas w naukę tego języka.

Skupmy się przez chwilę na JVM (chociaż w jakiś sposób wywód prawdziwy jest także dla pozostałych platform). Java to dojrzały już język z ogromną ilością doświadczenia swoich użytkowników oraz jeszcze większą ilością dostępnych wspaniałych bibliotek doskonałej jakości (jest też oczywiście mnóstwo bubli, ale spuśćmy na nie zasłonę milczenia). Wymieńmy choćby apache-*, spring-*, hibernate itd. Korzystając z Clojure, możemy z tych wszystkich wspaniałości dość łatwo korzystać, dzięki wygodnym mechanizmom języka do tego stworzonym.

Co jeszcze takiego daje Clojure? Wspominałem w poprzednim tekście, że ułatwia mocno implementowanie języków dziedzinowych (sqlkorma, midje), udostępnia potężny system makr, który w połączeniu z bogactwem JVM, daje niemalże nieskończone możliwości. Zachęca nas do tworzenie DSLi (polecam książkę "DLSs in Action") i używanie ich do rozwiązywania problemów. To prowadzi do kolejnego punktu.


Dostosuj język do swoich potrzeb, a nie odwrotnie


Zgodnie z "filozofią" Lispu - to język ma się dostosować do potrzeb użytkownika, a nie użytkownik do języka. Świetnym przykładem właściwego wdrożenia tej idei w życie jest wspomniana już biblioteka do testowania midje oraz biblioteka wspomagająca dostęp do baz danych sql - sqlkorma.

Bardzo dobrą praktyką jest takie modelowanie aplikacji, aby najpierw stworzyć język dziedzinowy problemu, który rozwiązujemy, a później dopiero wykorzystując go, rozwiązać zagadnienie. Pracy jest więcej, ale korzyści są duże. Takie programy jest znacznie łatwiej utrzymywać w długim okresie i wtedy również pojawiają się oszczędności.


Zwięzłość ponad wszystko

Z moich obserwacji wynika, że programy pisane w Clojure (idiomatycznie) są nieco krótsze od tych pisanych w Javie (dla mnie to średnio około 30% mniej kodu, ale niektórzy osiągają wyższe rezultaty). Jeśli weźmiemy pod uwagę oczywistą korelację pomiędzy liczbą linii kodu a liczbą błędów, szybko dochodzimy do narzucającego się wniosku - mniej znaczy lepiej. Tak jest w rzeczywistości. Coraz więcej firm korzysta z Clojure (chwaląc się tym bądź nie) właśnie z tego powodu - piszą mniej kodu, dostarczają szybciej rozwiązania zawierające mniejszą ilość błędów. A co za tym idzie - jest taniej.


Jak zacząć?

To jest świetne pytanie. Odpowiedź wcale nie jest prosta. Co prawda oficjalna dokumentacja na  stronie clojure.org pozostawia wiele do życzenia, ale jest wiele innych źródeł.

Książki

Pierwszym (dość popularnym) jest dostępna online książka "Clojure for the Brave and True" - można oczywiście wesprzeć autora i kupić ją w wersji papierowej. Książka to dobre wprowadzenie do języka, jego idei i narzędzi, z którym przyjdzie nam pracować.

Pozostała książki:
- Living Clojure (O'Reilly)
- Clojure programming (O'Reilly)
- Clojure in Action
Programowanie w języku Clojure (Pragmatic Programmers, Helion)
- Clojure. The Essential Reference (Manning)

Książek jest jeszcze trochę. Większość przedstawia wysoką jakość merytoryczną, niektóre zorientowane są na konkretne dziedziny użycia, część jest dość ogólna. Nie potrafię wskazać jakiejś wyjątkowo słabej, aczkolwiek na pewno takie się znajdą :)

Inne źródła

- “Poczytaj mi Clojure” - polski materiał autorstwa Pawła Wilka, który chyba w ostatnim czasie jest odświeżany. Bardzo zgrabnie napisany, z punktu widzenia osoby uczącej się języka
- kurs Erica Normanda - Clojure.tv - w odróżnieniu od poprzednich materiałów ten kurs jest płatny. Miły jednak jest ukłon ze strony Erica, który dla Polaków (chyba nie tylko) na starcie daje 50% rabatu :)
- szkolenie Clojure'a od NexonIT - w założeniach jest to szkolenie połączone z warszatatem, łącznie na 38h. Aktualnie w przygotowaniu, dostępne będzie wiosną (koniec marca, kwiecień) w kilku miastach Polski

REPL

Read Eval Print Loop oraz REPL Driven Development, czyli coś, czego twórcy Javy (i nie tylko) tak bardzo zazdrościli Lispowi, że zaimplementowali to w JDK (chociaż moim zdaniem Java jest takim językiem, w którym REPL wydaje się kompletnie nieprzydatny). REPL to zwykle pierwszy kontakt z Clojurem. Pozwala bardzo szybko zanurzyć się w programowanie i poznawanie języka. Jak się za to zabrać? Jest więcej niż jeden sposób, ale użyjmy najprostszego. Ściągamy plik clojure{version}.jar i uruchamiamy poleceniem:

$ java -jar clojure.jar

Po krótkiej chwili pojawi się coś podobnego:

Clojure 1.8.0
user=>

Jesteśmy w REPLu! Brawo. Czas wyjaśnić co to takiego ten REPL. To coś takiego jak systemowy shell (bash, sh, zsh itd), za którego pośrednictwem komunikujemy się z uruchomioną sesją Clojure'a. Brzmi skomplikowanie, ale to dość proste. Pisząc program w Clojure, po prostu rozszerzamy sam język (brzmi dziwnie) i dostając się do REPLa, robimy to samo, tylko w "czasie rzeczywistym".

Spróbujmy rozszerzyć naszą instancję Clojure'a o niezbędną dla świata funkcję hello:

(defn hello [whom]
  (println (str "Hello " whom "!")))

Po wpisaniu jej w REPLu możemy ją wywołać:

user=> (hello "World")
Hello World!
nil
user=>

Pięknie! Mamy wzbogaconą wersję Clojure'a. Oczywiście po zrestartowaniu sesji ta nowa i ważna funkcjonalność znikną. Na razie nie będziemy się jednak zajmować jej zachowaniem na dłużej. Wrócimy do tego w przyszłości.

W tej chwili wspomnę jednak o pewnej ważnej właściwości REPLa, mianowicie nREPLu - narzędziu, które dodane do uruchomionej instancji Clojure'a, pozwala się do niego podłączać i operować na "żywym organizmie". To jest coś zdecydowanie odmiennego od tego, do czego przyzwyczaiły nas konwencjonalne języki programowania, w których kontrolę nad programem tracimy właściwie zaraz po etapie kompilacji i w trakcie działania nic już właściwie nie możemy z nim zrobić. Clojure (jako Lisp) dzięki nREPL pozwala nam na kontrolowanie programu także, po uruchomieniu.


Narzędzia spoza samego języka

Wspomniany REPL jest częścią języka, ale nie samym REPLem programista żyje. Do wygodnej pracy potrzeba co najmniej kilku dodatkowych narzędzi.

Narzędzia do budowania projektu i zarządzania zależnościami

Pierwotnie do kompilowania kodu Clojure służył Ant i Maven (klasyka!). Po jakimś czasie kiełkująca społeczność zdecydowała napisać oddzielne narzędzie, oddające ducha języka. W taki sposób powstał `leiningen`. Oczywiście zgodnie z duchem Clojure'a jest to DSL opisujący projekt, katalogi źródłowe, metody testowania, wersje samego Clojure'a (ten służący do kompilacji może być w innej wersji niż ten, który służy do uruchomienia leiningena) oraz zależności projektu. Po szczegóły (a jest ich mnóstwo) odsyłam na stronę leiningen.org.

Kolejnym coraz popularniejszym narzędziem do kompilacji jest clj-boot, który oprócz zdecydowanie przyjemniejszej nazwy, ma także kompletnie inną "filozofię" działania. Tutaj także po szczegóły odsyłam na stronę projektu - boot-clj.com. Póki co, wsparcie wśród edytorów zdecydowanie lepsze ma leiningen, ale myślę, że będzie się to zmieniać z czasem.

Edytory

Tutaj jest ciekawie, bo wydawałoby się, że Clojure to dość niszowy język. Okazuje się jednak, że ma wsparcie dla wszystkich wiodących edytorów (vim, emacs) oraz tych bardziej niszowych (Eclipse, Netbeans, IntelliJ Idea), czy nawet kompletnej hipsterki - VS Code, Atom, Sublime. Oczywiście kategoryzowania dokonałem trochę przewrotnie, ale istotą jest to, że właściwie bez względu na używany edytor, jest jakieś wsparcie dla pracy z Clojure.

Tradycyjnie edytorem pierwszego wyboru jest Emacs (+Cider), ale jeśli ktoś nie jest z nim zaznajomiony, to polecam się trzymać ulubionego narzędzia. Nauka nowego języka bywa wystarczająco frustrująca i nie warto wzbogacać tych doznać poznawaniem kolejnego edytora (w szczególności takiego jak Vim czy Emacs).

Dodatkowe biblioteki

Jest co najmniej kilka źródeł doskonałych bibliotek dla języka Clojure. Najważniejsze dziś to clojars.org i tutaj właściwie znajdziemy wszystko, czego nam potrzeba. Oczywiście z Clojurem działają także "normalne" biblioteki javowe, co stanowi również o jego sile. Zatem szukamy ich tak, jak standardowych bibliotek dla Javy. Wspomnę też o clojurewerkz.org, ale te biblioteki znajdziemy po prostu na stronie clojars.org.

Dodatkowa dokumentacja

Wspominałem, że oficjalna strona clojure.org nie dostarcza zadowalającej czy wyczerpującej dokumentacji. Ten stan jest dość stary i sprawił, że pojawiły się strony z dokumentacją robione przez społeczność (co zapewne sprawi, że oficjalna strona nie doczeka się takiej dokumentacji). Zachęcam do dodania do zakładek adresu clojuredocs.org, gdzie znajdziemy dość wyczerpującą dokumentację dla biblioteki standardowej. Świetnym źródłem na jej temat jest książka Renzo Borgattiego o Clojure, wspomniana nieco wcześniej.


Podsumowanie

W kolejnej odsłonie pokażę najciekawsze - moim zdaniem - filmy dostępne w sieci, pokazujące użycie Clojure'a w praktyce. W ostatniej - trzeciej części - spróbuję przedstawić konkretne kawałki kodu, ukazujące Clojure w codziennej pracy.

Słowo na koniec

Przy okazji jednego z poprzednich tekstów ogłosiliśmy konkurs, w którym nagrodą był egzemplarz (a właściwie trzy) książki “Programowanie w języku Clojure”. Dziękuję za liczne odpowiedzi, wszystkie bardzo inspirujące. Troje zwycięzców zostało już wyłonionych, nagrody przygotowane i wyruszają w drogę.