Dla niektórych osób zgłębianie tajników nowego języka programowania to zadanie, którego z chęcią by uniknęli. „Po co nam kolejny język?” – pytają, argumentując, że obecna paleta narzędzi jest wystarczająca.
Czy nie mamy już dość tej ciągłej gonitwy?
Czy to, czym dysponujemy, nie spełnia już naszych potrzeb?
Z drugiej strony, są entuzjaści, którzy z zapałem podchodzą do każdej nowości, traktując ją jako szansę na odkrycie czegoś wyjątkowego. Nauka to dla nich cel sam w sobie, nie potrzebują dodatkowych bodźców, by poświęcić weekendy na tworzenie na przykład karcianej gry konsolowej w jakimś mało znanym, świeżo powstałym języku.
Niezależnie od tego, do której grupy się zaliczasz, jedno jest pewne: wszyscy chcemy inwestować czas w to, co ma przed sobą obiecującą przyszłość.
Ci, którzy są przywiązani do tradycyjnych rozwiązań, uważają, że ich ulubione języki mają solidne fundamenty i nadal będą popularne. Warto jednak przypomnieć, że kiedyś te dojrzałe, cenione dziś narzędzia programistyczne również były nowinkami, które nie wszyscy chcieli zaakceptować. Dzisiaj sytuacja się powtarza – powstają nowe technologie, które mają rozwiązywać nowe problemy lub ułatwiać proces tworzenia oprogramowania.
Jeśli jakaś nowa technologia wprowadza znaczące zmiany, ma szansę zyskać popularność i osiągnąć szczyt. W takim przypadku, nie warto pozostawać w tyle.
Natomiast entuzjastom nowych rozwiązań należy przypomnieć, że choć zabawa jest ważna, musimy unikać bezcelowego marnowania energii.
Jasne, Brainfuck to język o zagmatwanej, łamigłówkowej strukturze, który może być interesujący, ale raczej nie przyniesie nam korzyści, jeśli będziemy się nim zajmować na poważnie. Warto szukać czegoś nowego, rozsądnego, o mocnych podstawach.
Kryteria wyboru języków
Wybór języka programowania, zwłaszcza gdy myślimy o przyszłej karierze i satysfakcji, może być trudnym zadaniem. Twórcy każdego języka są przekonani, że stworzyli idealne narzędzie, które rozwiązuje wszystkie problemy. Jak więc dokonać właściwego wyboru?
W tym artykule skupiłem się na kilku kryteriach, aby ograniczyć zakres poszukiwań.
Data premiery
Unikałem języków, które są bardzo, bardzo nowe.
Za nowe uznałem języki, które w momencie pisania tego tekstu miały mniej niż 5-6 lat, a zwłaszcza te, które nie osiągnęły stabilności (czyli wersji 1.0). To wyklucza kilka perełek, takich jak Crystal. Mam jednak nadzieję, że kiedyś do niego wrócę i opiszę jego sukces.
Fragment kodu w Crystal („Szybki jak C, Zgrabny jak Ruby”)
Uważam, że najlepszym okresem dla języka jest 5-12 lat od premiery, kiedy to jest już stabilny, a jego twórcy ciągle go ulepszają. Oczywiście, od tej reguły zdarzają się wyjątki, które będą przeze mnie uwzględniane.
To kryterium jest oczywiste, ale często ignorowane, kiedy ekscytujemy się nowościami. Wsparcie dużej firmy jest dla wielu wystarczającym dowodem na sukces, ale nie zawsze tak jest.
Tak, Objective-C, a teraz Swift od Apple, rozwijają się, ponieważ są jedynymi opcjami w ściśle kontrolowanym ekosystemie, ale Facebook D i Hack (który uważam za niezbyt udane podejście do i tak nieładnego języka) pozostają jedynie eksperymentami.
Idealną sytuacją byłby język wspierany przez dużą, stabilną firmę, który jednocześnie zyskuje popularność (jak React).
Jednak kluczowa jest społeczność. Jeśli język nie wzbudza zainteresowania i nie ma wystarczającej liczby programistów, którzy by go promowali, nie zyska on popularności.
To kryterium eliminuje dojrzałe, fascynujące języki, takie jak Racket i Erlang, ponieważ ich wzrost jest na stałym, niskim poziomie.
Skoncentrowane, jasno zdefiniowane unikalne cechy
Trzecią rzeczą, na którą zwracam uwagę, jest jasny cel danego języka. Na przykład, ulepszona wersja PHP, która naprawia problemy z nazewnictwem i kompiluje się do natywnego PHP, nie jest dla mnie interesująca.
Korzyści są zbyt małe, aby zachęcić ludzi do przesiadki na ten język. Z tego powodu odrzucam języki takie jak CoffeeScript i wiele innych języków kompilowanych do JavaScript.
Szczerze mówiąc, natychmiast odrzucam ulepszenia dotyczące tylko składni. Historia pokazuje, że użyteczność jest ważniejsza niż łatwość obsługi. Jeśli nowy język skupia się na przyjemniejszym doświadczeniu programowania, obawiam się, że nie znajdzie się na mojej liście.
Przejrzysta i spójna składnia
Wiem, mówiłem, że składnia nie ma znaczenia. A dokładniej, że ulepszenia dotyczące tylko składni nie mają znaczenia. Mimo to, składnia ma duży wpływ na produktywność i łatwość utrzymania kodu, więc biorę ją pod uwagę przy ocenie języka.
Ważna jest również spójność. Nazewnictwo funkcji, struktura modułów itp. to kluczowe kwestie, w których język nie może sobie pozwolić na błędy. Mamy rok 2018, na litość boską, kolejny projekt języka w stylu PHP byłby dla nas wszystkich wstydem. Bez zbędnego gadania, przejdźmy do moich pięciu rekomendacji.
1. Julia
Osobom z MIT, języki używane do analizy danych wydawały się kompromisem. Python, mimo swojej przejrzystości i popularności, nie miał wbudowanych struktur do obsługi obiektów danych. Ponadto, jako język interpretowany, był stosunkowo wolny (nie licząc bibliotek, które w większości są napisane w C).
Największym ograniczeniem był jednak nieporadny model współbieżności i brak modelu obliczeń równoległych, który jest podstawą superkomputerów.
W odpowiedzi na te problemy narodziła się Julia.
Julia w stabilnej wersji ukazała się 29 września 2018 roku, zaledwie kilka dni przed napisaniem tego artykułu. Jak opisuje ją oficjalna strona internetowa:
Julia specjalizuje się w obliczeniach numerycznych. Jej składnia jest przyjazna dla matematyki, obsługuje wiele numerycznych typów danych i ma wbudowaną obsługę współbieżności. Mechanizm wielokrotnego wywoływania funkcji w zależności od typów argumentów jest naturalnym sposobem definiowania liczb i struktur danych.
Pod względem składni Julia przypomina połączenie Pythona i C. Jest to chyba pierwszy język, który z sukcesem połączył obie te cechy.
Julia jest szybka i nie narzuca ścisłego typowania. Poniżej kilka wyników testów porównawczych:
Oficjalne testy Julii
Jak widać, Julia jest nieco wolniejsza od C, ale znacznie szybsza od Javy i Pythona. A co oferuje Julia w kwestii składni?
Oto implementacja funkcji obliczającej przeciwprostokątną trójkąta prostokątnego:
Większość ekosystemu Julii skupia się na obliczeniach matematycznych, ale uważam, że ma ona potencjał do wykorzystania w ogólnym zastosowaniu.
Według mojej wiedzy, jest to pierwszy język, który od samego początku ma wsparcie dla obliczeń równoległych, więc nie zdziwię się, jeśli zyska popularność w obszarze internetu i IoT.
2. Rust
Jeśli korzystasz z najnowszych wersji przeglądarki Firefox, wiesz, że po latach starań, ma ona szansę na odebranie części rynku Chrome’owi.
Ta lekkość i szybkość przeglądarki to zasługa języka Rust, specjalnie opracowanego przez Mozillę.
Mówienie o obiecującej przyszłości Rusta to niedopowiedzenie; ten język jest już ogromnym sukcesem. Jeśli o nim nie słyszałeś, to dlatego, że jego obszar zastosowań jest specjalistyczny, a cel ambitny: zastąpienie C++! W końcu mamy język, który jest w stanie to zrobić i już to robi.
Dla osób sfrustrowanych rozbudowanymi projektami i problemami z zarządzaniem pamięcią w C++, Rust jest jak powiew świeżego powietrza.
Tak wygląda kod w Rust:
Uważam, że jest zwięzły i elegancki. Rust stosuje podejście programowania funkcyjnego, które sprawia, że kod jest łatwiejszy w modyfikacji. Nie ma również hierarchii obiektów, z którymi trzeba się zmagać.
Co daje Rustowi pewność, że może zastąpić C++? Nowy model zarządzania pamięcią. Zamiast korzystać ze starych metod new()/delete(), Rust wprowadza ideę własności.
Zamiast bezpośrednio przydzielać i uzyskiwać dostęp do pamięci, zmienne w Rust „pożyczają” ją od siebie, przy czym kompilator nakłada pewne ograniczenia. Wyjaśnienie tej koncepcji jest zbyt skomplikowane na ten artykuł, dlatego zachęcam do zapoznania się z oficjalną dokumentacją.
W efekcie, uzyskujemy 100% bezpieczeństwo pamięci bez potrzeby stosowania garbage collectora, co jest dużą zaletą.
Rust szybko zdobywa świat programowania systemowego. Jest już wspierany na wielu platformach, zasila przeglądarki i silniki renderujące, zastępuje kod C/C++ w systemach produkcyjnych i jest używany do pisania systemów operacyjnych.
Tworzenie kolejnej przeglądarki lub sterownika urządzenia nie jest dla każdego, ale Rust rozprzestrzenia się na inne obszary. Mamy już kilka w pełni funkcjonalnych, bardzo szybkich frameworków internetowych w Rust, a coraz więcej bibliotek aplikacji jest w trakcie opracowywania.
Jeśli interesuje Cię ekscytująca przyszłość, Rust jest idealnym językiem, a teraz jest na to idealny czas. Rust wystartował, ale wciąż masz szansę do niego dołączyć!
Ucz się Rust od Dymitra Nesteruka.
3. Elixir
Wśród języków, które koncentrują się na wygodzie programistów, pierwsze miejsce od dawna zajmuje Ruby. Jest to język, który czyta się jak poezję i ma wiele skrótów, dzięki którym można zredukować mentalne obciążenie o rząd wielkości.
Nic więc dziwnego, że framework Rails nadal dominuje w tworzeniu kompleksowych aplikacji dla programistów i startupów. Nie wszyscy są jednak zadowoleni z Rails, zwłaszcza jeden z jego głównych programistów – José Valim. Uważam, że sam twórca najlepiej wyjaśni genezę tego języka w wywiadzie:
To długa historia, ale postaram się ją skrócić. W 2010 roku pracowałem nad poprawą wydajności Rails podczas pracy z systemami wielordzeniowymi, ponieważ nasze maszyny i systemy produkcyjne są wyposażone w coraz większą liczbę rdzeni. Jednak całe doświadczenie było dość frustrujące, ponieważ Ruby nie zapewnia odpowiednich narzędzi do rozwiązywania problemów związanych ze współbieżnością. Wtedy zacząłem przyglądać się innym technologiom i ostatecznie zakochałem się w wirtualnej maszynie Erlanga.
Zacząłem coraz częściej używać Erlanga i z doświadczenia zauważyłem, że brakuje mi niektórych konstrukcji dostępnych w wielu innych językach, w tym funkcjonalnych. Wtedy zdecydowałem się stworzyć Elixir, jako próbę wprowadzenia różnych konstrukcji i doskonałego środowiska pracy na wirtualnej maszynie Erlang.
I tak oto narodził się Elixir!
Podobnie jak Scala ulepsza Javę, ale korzysta z tej samej maszyny wirtualnej (JVM), Elixir wykorzystuje wieloletnią, sprawdzoną w boju maszynę wirtualną Erlanga.
Dyskusja o Erlangu wykracza poza zakres tego artykułu, ale ważne jest, żebyś wiedział, że jest to najlepiej strzeżona tajemnica branży telekomunikacyjnej. Nasze sieci telefoniczne są znacznie bardziej niezawodne od systemów internetowych, a to wszystko dzięki Erlangowi.
Oznacza to, że jeśli tworzysz system czasu rzeczywistego, taki jak czat, Elixir zużywa znacznie mniej pamięci RAM i jest bardziej stabilny niż Ruby (lub PHP, Python i Java).
Serwer, który obsługuje Rubiego i maksymalnie 10 000 jednoczesnych połączeń, z łatwością obsłuży 200 000 podczas korzystania z Elixira, mając jednocześnie wystarczająco dużo pamięci RAM, aby uruchamiać gry 2D!
Fragment kodu w Elixir
Pod względem składni Elixir naśladuje Ruby, a jego dominujący framework sieciowy, Phoenix, naśladuje Rails. Uważam, że to dobrze, ponieważ wraz z Laravel, Grails, Masonite itp., doszliśmy do punktu, w którym wszystkie języki mają frameworki podobne do Rails, co ułatwia przesiadkę. Niektórych może to denerwować, ale mnie to nie przeszkadza.
W końcu, Elixir to technologia, która jest odświeżająca, przyjemna i niezwykle praktyczna. Coraz więcej firm przechodzi z Ruby (i nie tylko) na Elixir, a duże firmy, takie jak Pinterest, korzystają z niego w swoich systemach produkcyjnych, osiągając znakomite rezultaty.
Wiele osób uważa, że Node.js był tylko doraźnym rozwiązaniem w kwestii współbieżności i wkrótce zostanie zastąpiony przez Elixir. Muszę przyznać, że się z nimi zgadzam.
4. Kotlin
W 2017 roku podczas I/O Google ogłosiło niespodziewaną wiadomość. Firma formalnie uznała Kotlin za podstawowy język programowania dla Androida, wywołując szok w branży.
Nie jest zaskoczeniem, że Google aktywnie szuka zastępstwa dla Javy po tym, jak został pozwany przez Oracle. Jednak przyjęcie Kotlina było niespodziewane i nadal istnieje szansa, że Google wkrótce wyda swoją własną maszynę wirtualną. Na razie jednak Kotlin przeżywa rozkwit.
Kotlin został stworzony przez JetBrains, firmę znaną z doskonałych edytorów kodu. Jednym z nich, IntelliJ IDEA, jest podstawą Android Studio. Kotlin ma być bezpieczny, zwięzły i w 100% kompatybilny z Javą.
Przede wszystkim kompilator Kotlina stara się wyeliminować błędy NullPointerException, które są tak powszechne w Javie. Kotlin jest również mniej rozbudowany od Javy, co dla wielu będzie ulgą.
Poniżej porównanie kodu w Javie i Kotlinie:
Źródło obrazu: hype.codes
Kod w Kotlinie jest znacznie krótszy i łatwiejszy do zrozumienia.
Kotlin raczej nie zastąpi Javy, chociaż szybko zyskuje popularność. Myślę, że za dziesięć lat małe i średnie zespoły będą wybierać Kotlina, a duże będą nadal używać Javy ze względu na starsze projekty.
Kotlin ma bardzo obiecującą przyszłość, ponieważ robi wszystko to, co Java, może bezproblemowo współpracować z kodem Java i jest znacznie przyjemniejszy w użyciu!
5. TypeScript
Trudno mi było się powstrzymać! Najchętniej umieściłbym tu „Vaz! Elm!”, ale bez względu na to, jak rewolucyjne są jego pomysły i boska składnia, Elm nie jest jeszcze postrzegany jako popularna alternatywa dla front-endu. Przejdźmy więc do głównego nurtu: TypeScript.
JavaScript jest jak dzikie jagody: brzydki i niesmaczny, ale musisz to znosić, jeśli chcesz przetrwać w dżungli front-endu. Podjęto wiele prób, aby go zastąpić (i jest bardzo prawdopodobne, że nowy standard WebAssembly odniesie sukces), ale tym, co naprawdę przykuło uwagę wszystkich, jest superzbiór opracowany przez Microsoft.
Jest duża szansa, że słyszałeś o TypeScript: Angular był pierwszym frameworkiem, który go wykorzystał od wersji 2, a ludzie szybko to zauważyli. TypeScript dodaje bardzo potrzebne i fantastyczne supermoce do najpopularniejszego języka programowania na świecie.
W końcu można pisać kod JavaScript bez cierpienia!
Oto ulepszenia, które oferuje TypeScript:
✓ Silne typowanie: W końcu string nie jest liczbą, a liczba nie jest obiektem, który nie jest pustą tablicą!
✓ Sprawdzanie typów podczas kompilacji: Jeśli kod skompiluje się poprawnie, jest mniej więcej pewne, że jest wolny od błędów.
✓ Klasy i moduły: Tak, klasy są standardem w ES6, ale są też w TypeScript, a dodatkowo mają system modułów.
✓ Wnioskowanie o typach: W przypadku typów złożonych kompilator może łatwo rozpoznać typ, co oszczędza pracy.
✓ Async/await: Słowa kluczowe async/await są bardzo ważne, więc nie trzeba już bawić się obietnicami i funkcjami zwrotnymi!
Przestrzenie nazw, generyki, krotki… Mógłbym mówić i mówić, ale wystarczy powiedzieć, że TypeScript zmienia jedno z najgorszych doświadczeń programowania w jedno z najlepszych.
Fragment kodu TypeScript
Nie da się zaprzeczyć wpływowi TypeScript. Wyparł podobne próby, takie jak Dart od Google i otworzył oczy programistom JavaScript na korzyści płynące z silniejszego typowania.
W rezultacie, ważne biblioteki, takie jak React, D3, Vue (a nawet jQuery!) mają teraz wersję TypeScript, a w najlepszych firmach oprogramowania na świecie, cały kod JavaScript jest pisany w TypeScript. Interfejsy TypeScript są dostępne również dla Node.js (jeśli Node poprawi swoją historię współbieżności i słabe zarządzanie pamięcią, będzie istniał wiecznie).
Możesz być zaskoczony, gdy dowiesz się, że twórca Node.js, po żałowaniu swojego dzieła, pracuje nad nowym środowiskiem uruchomieniowym (na razie nie ma oficjalnej strony internetowej, tylko repozytorium GitHub), w którym podstawowym językiem jest TypeScript.
Najlepsza wiadomość? TypeScript jest łatwy do nauczenia, a jego znajomość przyniesie ci wiele korzyści w przyszłości. Jeśli jesteś średnio zaawansowanym programistą JavaScript, w ciągu dwóch dni nauczysz się wystarczająco dużo TypeScriptu, by przerobić cały swój dotychczasowy kod!
Podsumowanie i wyłączenie odpowiedzialności
Inne języki również zyskują na popularności, ale z różnych powodów nie znalazły się na tej liście. Oto krótki przegląd:
- Golang: Ugruntowany język, ale nie bardzo popularny. Uważam, że Golang ma teraz wielu konkurentów, którzy utrzymają jego niski udział w rynku.
- R: R jest popularny wśród naukowców danych i raczej nie przyciągnie wielu programistów aplikacji. Ponadto, nie możemy zapominać, że biblioteki uczenia maszynowego powoli pojawiają się we wszystkich popularnych językach, więc to tylko kwestia czasu.
- Swift: Apple ma silną kontrolę nad swoim ekosystemem, a Swift jest jedynym dostępnym w nim językiem. Kiedyś celem był C, teraz Swift. Uważam to za nieuczciwe, więc nie umieściłem go tutaj.
Przyszłość jest niepewna, a jednym ze sposobów na rozwój kariery jest trzymanie się tego, co już się sprawdziło. Jeśli tak zrobisz, Java, PHP, Python, Ruby itp. to doskonałe języki, których możesz się trzymać. Jednak niektórzy z nas nie są zadowoleni z normy. Chcą odkrywać, eksperymentować i stawiać na przyszłość. Jeśli należysz do tej drugiej grupy, powinieneś rozważyć naukę jednego z pięciu języków z mojej listy.
Ocena języka nie jest tak trudna, jak się wydaje. Jeśli znasz już kilka języków programowania, możesz nauczyć się każdego z nich w ciągu maksymalnie dwóch miesięcy, poświęcając 5-6 godzin tygodniowo. W zamian zyskasz szczęście i pieniądze w przyszłości.
Czy pominąłem jakiś ważny język? A może nie zgadzasz się z moją listą? Jeśli tak, zostaw komentarz i pomóż mi się poprawić.
newsblog.pl