sobota, 5 maja 2012

Przyszłość języków programowania, czyli kiedy i kto wygra nadchodzącą rewolucję?

Kiedyś na blogu Touching the Void przeczytałem ciekawego posta: 30 lat z życia programisty. Zaciekawił mnie ten artykuł i od jakiegoś czasu bacznie obserwuję sytuację, wypatrując następcę programowania obiektowego.

Ogółem z artykułu wynika, że co 8-10 lat jest jakaś globalna rewolucja w świecie programowania, co sprawia, że wszyscy się masowo przerzucają na dany język (czy tez bardziej ogólniej: na inny paradygmat programowania). Java już swoje przeżyła / dożywa...

Jaki język zastąpi Javę?

Ogółem świat dąży do tego, aby stworzyć taki język, że specyfikacja klienta będzie wykonywalnym programem. Niektórzy twierdzą, że wtedy programiści nie będą już potrzebni, ale pewnie nawet jak jakiś tego typu język powstanie, to i tak trzeba będzie zapisać tą specyfikację w odpowiedni sposób (czyli przez programistę). Przejawy dążenia w tym kierunku widzę w Spring Roo i w coraz popularniejszych DSL’ach (np. w Scali). Jednak raczej się nie zapowiada, aby taki kompletny język specyfikacji w najbliższym czasie powstał. Pewnie tęgie głowy na nie jednej wyższej uczelni próbują coś takiego stworzyć (albo chociaż opracować podstawy teoretyczne), ale chyba póki co chyba bez większych sukcesów – przynajmniej ja nie znam.

Wracając jednak do świata komercyjnego, to Java króluje na scenie już ponad 10 lat. Obecnie do głosu powoli dochodzą (wg. mnie i w/w. wpisu) języki funkcyjne. Wystarczy spojrzeć na to ile się o nich mówi na konferencjach. Wydaje się, że niedługo nastąpi ich czas. A może zaskoczy nas coś całkowicie innego? Może coś z kreowane przez konkurencję JVM’a? Może jakiś inny pragdygmat? Może w końcu powstaną komputery kwantowe?

Chcąc analizować popularność języków programowania warto się przyjrzeć statystykom prezentowanym na portalu tiobe.com. Ranking jest ogółem wyliczany na podstawie statystyk wyszukiwania na popularnych stronach takich jak Google, Blogger, Wikipedia, jak i na YouTube i Amazonie. Ważna jeszcze jest wartość „page hits”.

Źródło: tiobe.com, dostęp: 04.05.2012


Pierwszym zaskoczeniem jest język C, który cały czas się trzyma wysoko, a teraz nawet przegonił Javę. Podobno niektóre uczelnie wyższe powoli przestają go uczyć, ale ranking ten wskazuje, że to chyba błąd.

Kolejną ciekawostką jest bardzo szybka rosnąca popularność Objectiv-C. Jednakże język ten jest skierowany do specyficznej grupy odbiorców i nie zapowiada się, aby wyszedł po za nią.

Ciekawy jest też wykres dla Rubiego. Generalnie Wujek Bob mówił, że jakiś czas temu w Stanach było najłatwiej znaleźć pracę programistom rubina, jednakże teraz ta sytuacja się już zmienia i raczej odchodzi się od tego języka. Potwierdza to wykres jego popularności.

Tak można by było jeszcze analizować i analizować, ale zostawiam to Wam do własnej oceny i interpretacji. Wróćmy do głównego wątku, czyli co z tymi językami funkcyjnymi?

Patrząc na tabelki i wykresy można dostrzec, że jeśli chodzi o programowanie funkcyjne, to najwyżej stoi Python (8. miejsce), Perl (10.) i Lisp (15.). Nie są to języki, które są tylko funkcyjne, ale posiadają również cechy innych paradygmatów programowania. Dalej w zestawieniu jest jeszcze kilka języków z paradygmatem funkcyjnym. Natomiast Scala, która jest mocno promowana na konferencjach javowych, jest dopiero 45, a Clojure znalazł się po za pierwszą 50dziesiątką. Fakt faktem Tiobe może niekoniecznie jest najlepszym wskaźnikiem do porównywania popularności języków, ale nie znam innego podobnego zestawienia, pokazującego zmianę w czasie.

Mnie zastanawia dlaczego jeszcze nie pojawił się / jaki będzie język obecnej dekady, na który by się masowo przesiadało większość firm, tworząc oprogramowanie w tym języku, zamiast w Javie. Przyszło mi do głowy kilka przyczyn.

Według mnie największym mankamentem nowych języków programowania, jest brak narzędzi. Brakuje dobrych, rozwiniętych i stabilnych środowisk IDE. W Javie mamy IntelliJ Idea, gdzie automatyczny refaktoring jest bezbolesny, narzędzie podpowiada składnie zależnie od kontekstu i wie co chcemy napisać. Eclipse jest trochę słabszym narzędziem, ale znam takich co są z niego zadowoleni. Obecne dostępne IDE tak nas rozpieściły swoimi możliwościami, że aż nie chcemy siadać do jakiegoś języka, gdzie nie ma porządnego wsparcia ze strony środowiska programistycznego. Dla tego ja osobiście mocno kibicuję Kotlin’owi, który powstaje od razu ze wspierającym go IDE - aby mu się udało.

Inną bolączką nowych języków, jest brak (lub niewielka wciąż ilość) informacji, o dużych projektach, które się udały w nowopowstałych językach. Dla przykładu Twitter z Ruby’iego przenosi swoje główne elementy na JVM’a (Więcej na ten temat we wpisie: 33 degree 2012 dzień 1). To na pewno nie przystworzyło to Rubiemu popularności, co widać na wykresie.

Innym tematem, który sam doswiadczyłem na przykładzie Scali, jest ewolucja składni w przypadku nowych języków. Niby było zapowiadane, że Scala do kiedyś tam może być niekompatybilna wstecz, ale się odechciewa, gdy uruchamiając przykłady z tutoriala / książki na nowszej wersji, starsza składnia nie jest akceptowana.

Kolejną sprawą jest to, co się obecnie uczy młodych adeptów sztuki programowania na studiach informatycznych i pokrewnych. Cały czas wiodące języki, od których się zaczyna, to C/C++ i Java. Co do języków funkcyjnych, to kojarzę że na jakimś kursie w połowie studiów był Lisp, ale do tego czasu większość już się nauczyła nie chodzić na zajęcia, a i tak mimo tego zaliczać. Zresztą jaką tu mieć motywację do nauki czegoś, gdzie nie bardzo się widzi, aby którykolwiek pracodawca wymagał tego wynalazku przy rekrutacji?

Teraz każda firma / instytucja / przedsiębiorstwo, chce mieć jakieś oprogramowanie. Najlepiej szybko dostarczone, aby móc wyprzedzić konkurencję i aby zastąpić człowieka tam gdzie się da. Powoduje to, że projektów jest coraz więcej, a na to potrzeba więcej ludzi. Kiedyś (podobno – słyszałem z opowieści starszych), na studia informatyczne było o wiele ciężej się dostać, ale przez to trafiali na nie tylko zapaleńcy. Obecnie dalej nie jest łatwo, ale miejsc jest trochę więcej i mamy alternatywę po za uczelniami państwowymi. Potrzbujemy więcej zasobów ludzkich, ale jak fajnie zuaważyl Michał Bartyzel (autor bloga od którego rozpocząłem ten wpis) w poście: Craftsmanship nie dla wszystkich?, nie potrzebujemy w projektach samych wymiataczy. Wystarczy kilku rzemieslników, a reszta to moga być przeciętniaki, którzy robią od 8 do 16 i są niereformowalni.

Tak więc mamy grupę ludzi, która chce podążać za zmianami, być na bieżąco i nie skończyć jako dinozaury. Mamy też przeciętniaków którzy będą niechętni na całkowitą zmianę języka, lub jego wprowadzenie do projektu obok Javy. Musieli by oni wówczas poznać nowa składnię, przez co poczucie ich bezpieczeńswa / pewności zostałoby zaburzone. Niby nauka nowego języka nie powinna być dla nas problemem (w końcu podczas studiow się pisało w różnych dziwnych rzeczach), ale niektórzy mają ku temu spore opory w swojej pracy.

Co do samej ilości programistów, to problem z wyszkoleniem (wyprodukowaniem) odpowiedniej ich liczby, dobrze widać na zachodzie. Przykładowo w Niemczech, powstały już takie Hochfachschule (nazwałbym to wyższą zawodówką), które szkolą osoby pod konkretne technologie. Tzn. trwają one krócej niż normalne studia, a nacisk kładą na praktykę, ograniczając teorię do minimum. Bo i po co to komu? Na studiach to jest potrzebne, bo liczy się na to, że jednak ktoś z grona studentów pójdzie w stronę doktoratu, zostanie na uczelni i będzie przekazywał zdobytej wiedzy kolejnym pokoleniom studentów, a także rozwijał dalej teorię. Wspomniani absolwenci wyższych zawodówek idą do pracy, robią co do nich należy i jakiejś szczególnej wagi do dalszego rozwoju nie przykładają.

Wydaje mi się, że przez to robi się okopy w projektach, aby na wszelki wypadek się zabezpieczyć przed niedoświadczonymi świeżakami (lub przeciętniakami), którzy potencjalnie mogą używać powierzonych im narzędzi w niewłaściwy sposób. Moim ulubionym przykładem, jest dopisywanie w Javie, podczas zachowywania modyfikowanego pliku, słowa final, w prawie wszystkich możliwych miejscach (to jest do pól klasy, argumentów metod i zmiennych lokalnych). Kiedyś może to i miało sens, jak chcieliśmy trochę na wydajności zyskać, ale obecnie zaciemnia to kod i słowo final traci przez to swoje znaczenie. Oczywiście jest to sensowne, aby przy deklaracji pól klasy używać final, jeśli tylko raz przypisujemy im wartość, ale w pozostałych przypadkach nie ma to sensu. Po prostu próbujemy się zabezpieczyć przed tego typu kodem:

public static void main(String[] args) {
    int x = 5;
    System.out.println(x);
    half(x);
    System.out.println(x);
}

private static void half(int x) {
    x = x / 2;
}

Czyli ktoś chciał zmienić wartość x, zapomniał jednak jak działa przekazywanie prymitywów do metod.

Innym przykładem który lubię, jest konkatenacja Stringów za pomocą plusa. Kiedyś twierdzono, że to zło, gdyż były tworzone spore ilości chwilowych obiektów, aby zbudować jakiś dłuższy tekst. Zastępowano więc plusa takimi łańcuszkami ze StringBuilder'em. Obecnie kompilator robi to za nas, zamieniając plusa na StringBuilder’a automatycznie, a my zystujemy trochę na czytelności. I nie miał bym nic przeciwko, jeśli po takim uargumentowaniu, reguła ta, została by usunięta z findbugs’a. Jeśli jednak osoba mająca władzę, odnośnie konfiguracji tego typu narzędzi, jest niereformowalna (albo jakaś polityka jej nie pozwala), to trzeba się z tym pogodzić. A to hamuje nasz / projektu rozwój. Sprawia, że nie walczymy o zmiany, tylko z pokorą przyjmujemy na siebie to co kiedyś ktoś wymyślił i wprowadził do projektu.

A gdyby zamiast całych tych śmieszny regół, nauczyć ludzi pisać czysty kod – czy świat nie byłby lepszy? Niestety nie wszystkie firmy / projekty da się do tego przekonać (w myśl zasady nie piszesz to nie wytwarzasz wartości dodanej). Po za tym findbugs i checkstyle to swoiste baty na programistów, za pomocą których można im pokazać, że coś jest z ich kodem nie tak. Czasem pomaga to zmusić kogoś opornego do refaktoringu. Czy nowe języki programowania posiadają tego typu narzędzia? Z pewnością pomogły by im one zaistnieć.

To chyba tyle z mojej strony, jeśli chodzi o zbilżającą się rewolucję w programowaniu. Pewnie jeszcze jakieś interesujące powody by się znalazły, dlaczego ciężko jest się wybić innym językom na tyle, aby aktualny świat programowania obiektowego, wywrócić do góry nogami. Czekam na Wasze komentarze, jakie Wy macie poglądy na ten temat, jak i bacznie wypatruję następcę Javy. Jak będziecie wiedzieć, kto będzie następny, koniecznie dajcie znać!

3 komentarze:

  1. Sam nieraz się zastanawiam co będzie następne.
    Programowanie obiektowe sprawiło, że kod stał się bardziej zrozumiały, ponieważ powinien on w pewnym stopniu odzwierciedlać rzeczywistość.
    Wydaje mi się, że w tym kierunku będzie to szło tzn. usunięcie jak największej liczby elementów czysto programistycznych, a co za tym idzie - programisty. Idealny język programowania powinien być tak naturalny, jak język mówiony, a więc zrozumiały dla wszystkich.

    OdpowiedzUsuń
  2. Sam nieraz się zastanawiam co będzie następne.
    Programowanie obiektowe sprawiło, że kod stał się bardziej zrozumiały, ponieważ powinien on w pewnym stopniu odzwierciedlać rzeczywistość.
    Wydaje mi się, że w tym kierunku będzie to szło tzn. usunięcie jak największej liczby elementów czysto programistycznych, a co za tym idzie - programisty. Idealny język programowania powinien być tak naturalny, jak język mówiony, a więc zrozumiały dla wszystkich.

    OdpowiedzUsuń
    Odpowiedzi
    1. @sebastian
      Kiedyś próbowano zrobić język zbliżony do naturalnego i wyszedł COBOL.

      Usuń