Scala – fakty i mity. Prześwietlamy popularny język programowania
Scala to język programowania działający na maszynie wirtualnej Javy (JVM), łączący w sobie cechy języków obiektowych (klasy, dziedziczenie, polimorfizm) i funkcyjnych (funkcje wyższego rzędu, currying, pattern matching). Powstawał od 2001 roku na Politechnice Federalnej w Lozannie (EPFL), częściowo jako odpowiedź na najczęściej wskazywane braki w Javie. Pierwszy raz Scala ujrzała światło dzienne w 2004 roku, z kolei w maju 2021 roku została wydana stabilna wersja Scali 3, która m.in. wprowadziła wiele uproszczeń w składni. Dziś pokażę fakty i mity na temat tego języka.
Jacek Kunicki. Senior Software Engineer w SoftwareMill. Zapalony inżynier oprogramowania działający w obszarze JVM. Wierzy, że software craftsmanship jest agnostyczne technologicznie, więc nigdy nie ogranicza swojego portfolio do kilku technologii. Dzieląc się swoją wiedzą na licznych eventach JVM-owych, zawsze pamięta, że działający przykład jest wart więcej niż tysiąc słów, dlatego często zobaczycie go w akcji kodującego na żywo.
Spis treści
Działanie Scali
Podobnie jak Java – a w odróżnieniu od innych języków działających na JVM jak Groovy czy Clojure – Scala jest językiem statycznie typowanym, co ma swoje plusy i minusy. System typów jest dość złożony, ale dzięki statycznemu typowaniu wiele błędów jest wykrywanych już na etapie kompilacji, co pozwala uniknąć przykrych niespodzianek na produkcji.
Scala wspiera znany z Javy paradygmat programowania obiektowego (OOP), ale równie duży nacisk kładzie na podejście funkcyjne (FP) spotykane w językach takich jak Haskell. Dzięki połączeniu podejść OOP i FP dostajemy język, który z jednej strony przypomina nieco Javę, jednak z drugiej – otwiera wiele nowych możliwości oraz oferuje bardziej zwięzłą składnię.
Dlatego, że Scala działa na JVM i kompiluje się do bytecode’u, jest ona kompatybilna na poziomie binarnym z kodem napisanym w Javie. Pozwala to na wykorzystywanie w Scali wszystkich bibliotek znanych z bogatego ekosystemu Javowego.
Scala – fakty i mity
Każdy język programowania ma swoich zwolenników i przeciwników. Również Scala nie jest w tej kwestii wyjątkiem. Sprawdźmy zatem, co mówi się o tym języku i na ile te opinie są uzasadnione.
1. Scali trudno się nauczyć
Tutaj najlepszym komentarzem będzie inżynierskie “to zależy”. Sama składnia Scali jest dość intuicyjna i nie powinna nastręczać większych trudności.
Bardziej problematyczne może natomiast być przestawienie się na nowy sposób rozumowania na temat kodu, który piszą programiści Scali. Przykładem jest np. wszechobecna w Scali immutability, czyli unikanie używania zmiennych oraz obiektów, których stan można modyfikować. Dla osób, które do tej pory pisały np. w Javie może to być spory “szok kulturowy”, jednak im dalej w las, tym większego sensu nabiera takie podejście.
Kolejna stromizna na krzywej uczenia się czeka w momencie, w którym wchodzimy w świat programowania funkcyjnego z użyciem bibliotek takich jak np. Cats i Cats Effect. Gdy w grę zaczynają wchodzić konstrukcje matematyczne z teorii kategorii, to siłą rzeczy na początku poruszamy się wśród nich trochę po omacku. Dojście do punktu, w którym z ręką na sercu możemy powiedzieć, że intuicyjnie rozumiemy te zagadnienia, zajmuje nieco czasu, ale prędzej czy później ta chwila olśnienia nadchodzi.
2. Scala nie nadaje się do poważnych zastosowań
Nic bardziej mylnego! Scala świetnie sprawdza się w obszarach takich jak Big Data czy Machine Learning oraz wszędzie tam, gdzie chcemy szybko przetwarzać duże ilości danych.
Wiele znanych narzędzi – takich jak Apache Spark (platforma do rozproszonego przetwarzania dużych ilości danych), Apache Kafka (rozproszona platforma do strumieniowego przetwarzania zdarzeń) czy Akka (zestaw bibliotek do budowania systemów rozproszonych w duchu reactive) – jest napisanych w Scali i świetnie sprawdzają się w obszarach, do których zostały stworzone.
3. Scala podzieli losy Pythona
Mimo że Python 3 został wydany dawno temu, w wielu miejscach ciągle można się natknąć na Pythona 2. Dopiero całkiem niedawno (z początkiem 2020) Python 2 całkowicie przestał być rozwijany, wcześniej – przez wiele lat – wersje 2 i 3 funkcjonowały równolegle.
Czy Scala – z niedawno wydaną stabilną wersją 3 – nie wpadnie w podobną pułapkę? Z jednej strony Scala 3 wprowadza sporo ulepszeń i uproszczeń (np. context functions, opaque types czy uproszczone implicits), które powinny zachęcić do migracji na nową wersję. Z drugiej strony – doświadczenie uczy, że migracja na nową wersję języka to rzadko jest bułka z masłem. Z odpowiednim dystansem należy również podchodzić do narzędzi, które obiecują, że automatycznie zmigrują nasz kod ze Scali 2 na 3.
Trzeba ponadto pamiętać, że nasz kod Scalowy nie żyje w próżni, tylko z reguły korzysta z przeróżnych zewnętrznych bibliotek. Możliwość zmigrowania na Scalę 3 zależy więc od tego czy biblioteki, których używamy, również zostaną wcześniej zmigrowane. Patrząc np. na historię Sparka, który bardzo długo wymagał Scali 2.11 i dopiero od niedawna wspiera wersję 2.12, można przypuszczać, że na wsparcie dla Scali 3 trzeba będzie trochę poczekać. Chcesz dowiedzieć się czego programiści Scali oczekują po Scali 3? Zajrzyj do Scala 3 Tech Report, w którym głos zabrało prawie 700 z nich.
4. Scala to “lepsza Java”
Jednym z celów, jakie przyświecały twórcom Scali, było uwzględnienie w nim konstrukcji, których brakowało w Javie. Przykładami mogą być:
- funkcje wyższego rzędu, tj. funkcje, których parametrami mogą być inne funkcje,
- algebraiczne typy danych (ADT) realizowane za pomocą case classes oraz sealed traits i związany z nimi pattern matching,
- lazy evaluation, czyli wartości wyliczane dopiero w momencie użycia,
- uogólniona pętla “for”, tj. for-comprehensions, na którą można patrzeć trochę jak na Javowe “for each” na sterydach.
W efekcie powstał język wspierający zarówno paradygmat obiektowy (OOP), jak i funkcyjny (FP). Czy nazywanie Scali “lepszą Javą” jest uzasadnione? Lepszym określeniem jest raczej “dobra alternatywa dla Javy” – z uwagi na to, że różnic pomiędzy tymi językami jest więcej niż podobieństw a główną cechą wspólną pozostaje JVM, na której oba działają.
5. Scala jest jak Perl
Jedną z cech charakterystycznych Perla jest to, że tę samą rzecz można w nim zakodować na wiele różnych sposobów. Część z nich bardziej przypomina magiczne zaklęcia niż kod, który za miesiąc będzie czytelny dla człowieka.
Scala nie oferuje wprawdzie aż takiej elastyczności jak Perl, ale nadal umożliwia zapisanie tej samej logiki w kodzie w kilku różnych wariantach. Przykładem takiej sytuacji jest obsługiwanie wartości opakowanej w typ Option
– przetworzenie jej lub użycie wartości domyślnej, gdy oryginalna wartość nie istnieje. Można tego dokonać za pomocą pattern matchingu, używając kombinacji metod map()
i getOrElse()
lub posługując się metodą fold()
.
O ile każde z tych podejść zadziała tak samo dobrze i o ile kompilatorowi nie robi żadnej różnicy, które z nich wybierzemy, o tyle dla osób, które w przyszłości będą pracować nad tym kodem (a więc i dla nas samych), ten wybór ma już znaczenie.
Kluczem jest tutaj ustalenie spójnego podejścia i wybranie jednej konstrukcji, którą będziemy stosować do danej kategorii problemów. Dzięki temu nasz kod będzie czytelniejszy dla innych i unikniemy w przyszłości zastanawiania się, dlaczego – wracając do przykładu z Option
w jednym miejscu ktoś użył pattern matchingu a w innym fold()
.
6. Scala umiera
Scala jest na programistycznej scenie od ponad 15 lat i nic nie wskazuje na to, żeby miała z niej zniknąć. Ciągle jest ona w czołówce (pod względem popularności) języków działających na JVM innych niż Java. Również wysokie stawki na rynku usług scalowych dowodzą, że język ma się bardzo dobrze.
Według Scala 3 Tech Report połowa programistów Scali pracuje z tym językiem dłużej niż 5 lat. Z kolei z naszych obserwacji wynika, że rynek pracy dla scalowców w Polsce jest nasycony, tzn. wszyscy gdzieś pracują i ciężko zatrudnić nową zdolną osobę.
Z jednej strony z tego podsumowania wynika, że osoby, które zaczęły programować w Scali jakiś czas temu, nie uciekają od tego języka. Z drugiej strony – te statystyki pokazują, że mniej jest osób, które obecnie dopiero zaczynają swoją przygodę ze Scalą.
Zdjęcie główne artykułu pochodzi z unsplash.com.