09 lipca 2010

Clojure ponownie na tapecie - jest nowa książka, jest oferta projektu, pozostaje zestawić IDE

Logo Clojure
Jest wiele języków funkcyjnych (na myśl przychodzą chociażby Lisp czy Haskell) i niemało z nich doczekało się odpowiedników działających na wirtualnej maszynie Javy. Mnie zainteresował jeden - Clojure. I trudno powiedzieć dlaczego, ale ma to coś, co sprawia, że mimo moich trudności w myśleniu funkcyjnym, chce mi się go nauczyć. Na razie moje "chce" nie wyszło poza ramy faktycznego "chce", więc jedynie od czasu do czasu coś tam sobie poczytam, czy skrobnę.

Tydzień przed Javarsovią 2010 w księgarniach pojawiła się nowa pozycja o tym języku - Practical Clojure od Apressu. Pamiętam ten dzień, kiedy publikując recenzję na Amazonie zobaczyłem, że ta książka już jest. Postanowiłem ją zdobyć i napisałem do wydawnictwa. Jeszcze tego samego dnia, otrzymałem odpowiedź:

Hey Jacek,

You got it, where would you like the book to be shipped?

Simon Yu
Apress | friends of ED
Public Relations Assistant
Apress


I już ją mam u siebie. Część mojej duszy odpowiedzialna za posiadanie jest już usatysfakcjonowana :]

2 dni temu dostałem wiadomość:

Witaj,

widzialem ze interesujesz sie Clojure, a wlasnie chcialbym zaczac pisac projekt w tym jezyku, tylko szukam kogos kto moglby mi pomoc (oczywiscie nie charytatywnie). Czy masz czas i checi?

Pozdrawiam,
Wojtek


Stwierdziłem, że prośba dotyczy nauki języka, więc bez wahania odpowiedziałem:

Cześć Wojtku,

Czas i chęci to nie problem, bo tego mam wystarczająco wiele, aby się podzielić, jednakże w tym konkretnym przypadku na niewiele by się to zdało - sam poznaję Clojure, a największym problemem nie jest sam język, ale funkcyjne myślenie, którego mi brakuje. Jak widzisz, nie mogę tym samym pomóc Ci, bo składnia języka to prosta sprawa do nauki, jak mniemam.

Jacek


Kilka kolejnych maili i wiedziałem, jak bardzo się myliłem, sądząc, że moja rola miałaby sprowadzić się do roli nauczyciela. Okazało się, że temat dotyczy projektu, który miałby być realizowany z udziałem Clojure i Vaadina:

Jestem w trakcie tworzenia softu do komunikacji w firmie - taki basecamp na sterydach. W tej chwili mam to napisane w Pythonie/Django i jQuery ale rozwazam przejscie na Clojure i Vaadin. Tyle ze zanim sie na to zdecyduje to musze tego Vaadina potestowac (na dniach to pewnie zrobie) no i znalezc kogos kto bedzie mogl pisac ze mna bo chce to zakonczyc w sensownym czasie i wypuscic na rynek (juz mam w paru krajach dograna dystrybucje itp). Jest na to budzet, nie jakis kosmiczny ale jest, no i mozna mowic tez o opcjach na akcje przy dluzszej wspolpracy.

Interesujące, co? Czekam na wymagania funkcjonalne i wtedy okaże się, gdzie byłaby rola dla Clojure i mnie. Gdyby projekt wypalił, byłbym w pierwszym rzędzie, aby się do niego przyłączyć. To byłby mój pierwszy funkcyjny projekt z Clojure. Super!

I znowu myślami przy Clojure, więc rozejrzałem się po grupie dyskusyjnej użytkowników Clojure, aby rozeznać się, jak to teraz stan rozwoju Clojure wygląda. Jakby na żądanie, Sebastian "pedro" Pietrowski pisał o wydaniu Compojure 0.4.0 w swoich podsumowaniach tygodnia - Pedro Newsletter 08.07.2010, więc od razu pobrałem go do przejrzenia kodów źródłowych (nota bene, fajne są te tygodniówki od Pedro - już kilkukrotnie okazały się nieocenione w rozeznaniu się, co nowego w okolicy). Nie tak dawno pobrałem nową wersję Eclipse Helios (3.6), więc postanowiłem dograć do niego wtyczkę Counterclockwise, która udostępnia obsługę Clojure w Eclipse. Instalacja jest niezwykle trywialna - wystarczy wskazać na repozytorium z wtyczką i tyle. Więcej w Getting Started with Eclipse and Counterclockwise.

Clojure w Eclipse z Counterclockwise
Jest możliwość stworzenia nowego projektu z Clojure, są edytory z podświetlaniem składni i jest możliwość uruchamiania programów w Clojure REPL. W zasadzie jest wszystko, aby zacząć swoją przygodę ze światem programowania funkcyjnego z Clojure i Javą.

A pamiętam, jak opierałem się nauce programowania funkcyjnego na studiach. Teraz miałbym prościej...

15 komentarzy:

  1. Zastanawia mnie po co używać języka który jest stworzony do radzenia sobie z problemami wielowątkowości do tworzenia aplikacji RIA (bo to tego chyba Vaadin służy). To raz, dwa to sama dojrzałość języka - nawet ze skalą (która ma już prawie wersję 2.8) są problemy (http://codemonkeyism.com/scala-unfit-development/) a co dopiero z Clojure.

    OdpowiedzUsuń
  2. Mnie też to zastanawia i chociażby dlatego warto się przekonać na własnej skórze.

    A tak po prawdzie - Clojure to Java z dodatkami funkcyjnymi i na moją obecną wiedzę nie służy przede wszystkim rozwiązaniu problemów wielowątkowości, a jedynie temu sprzyja. Na chwilę obecną widzę zastosowanie dla jawnego określenie miejsc zmiany stanu aplikacji, co powinno pozytywnie wpłynąć na testowanie i tropienie błędów (ogólnie programowanie funkcyjne polega na wykonywaniu funkcji, więc zmierza do jak najbardziej wąskiego miejsca przechowywania stanu), opóźnionego wczytywania danych (np. listy są inicjowane w momencie ich użycia, co zmniejsza pamięć, a czas działania ten sam, bo czy na początku wyliczamy, czy później nie musi mieć znaczenia), aby podsumować to systemem agentowym upraszczającym programowanie współbieżne.

    RIA to jedynie interfejs użytkownika, a ktoś musi obsługiwać logikę aplikacji. Vaadina nie znam, ale traktuję go jako zestaw kontrolek (widgetów) do tworzenia UI, a Clojure będzie odpowiedzialny za wnętrze. Dla mnie wszystko składa się należycie.

    OdpowiedzUsuń
  3. O, byłby kolejny startup oparty na Clojure. My jesteśmy jak na razie bardzo zadowoleni; więcej tutaj: http://jan.rychter.com/blog/2010/7/5/clojure-w-fablo.html

    OdpowiedzUsuń
  4. @jeździec - jakieś konkretne zarzuty?

    OdpowiedzUsuń
  5. Ja mam pytanie trochę z innej beczki. Na stronie pluginu Clojure do Eclipse napisane jest: "Grab a recent version of eclipse". Czy to znaczy, że plugin wspiera Eclipse Helios i nie ma z nim problemów? Większość pluginów, których używam nie daje takiego wsparcia i dlatego na jakiś czas musiałem odstawić wersję 3.6, a szkoda :(

    OdpowiedzUsuń
  6. @Daniel, już kiedyś udostępniałem Twój wpis z komentarzem - skąd pomysł, że to będzie w Clojure. Możesz wyjawić nam sekret?

    @Łukasz, ja próbowałem się z Heliosem i działa. Nie był to bogaty funkcjonalnie projekt, bo jedynie pojedynczy skrypt w Clojure, więc nie wiem, czy i jak dobrze idzie CCW z Heliosem. Spróbuj i raportuj!

    OdpowiedzUsuń
  7. @Jacek: ale nie jestem pewien o co pytasz. Czy o to, dlaczego postanowiliśmy użyć Clojure w Fablo?

    OdpowiedzUsuń
  8. @Daniel, dokładnie - skąd pomysł na Clojure w Fablo, kiedy jest tyle języków programowania? Czy wciąż uważacie go za dobry wybór? Dlaczego?

    OdpowiedzUsuń
  9. @Jacek -- zajrzyj na stronę, którą podlinkowałem; tam jest dobre streszczenie.

    Od siebie mogę dodać, że jeśli chodzi o Clojure, to zanim się ono pojawiło, mieliśmy sporo doświadczenia w pisaniu i wdrażaniu systemów w Common Lispie; znaliśmy więc dobrze mocne strony CL (makra, niesamowita elastyczność) i słabe (trudne wdrażanie, skomplikowanie, stosunkowo mało bibliotek).

    Clojure rozwiązuje większość naszych problemów z CL, zachowując prawie wszystkie jego zalety oraz wprowadzając mnóstwo nowych, jak STM. Jesteśmy bardzo zadowoleni. W żadnym innym języku nie bylibyśmy w stanie tak szybko i naturalnie zaimplementować tak istotnych cech naszego oprogramowania jak przełączanie w locie wersji bazy; Clojurowy mechanizm agentów czyni to niemal trywialnym.

    OdpowiedzUsuń
  10. Po pierwsze: link, który podał jeździec to zwykły troll.
    Po drugie: nie widzę przeciwwskazań w używaniu języków funkcyjnych i hybrydowych do tworzenia tego typu aplikacji.

    OdpowiedzUsuń
  11. @Jacek - na razie zostaje przy Galileo, ale w okolicach wrzesień/październik będę zajmować się Clojure z uwagi na moją pracę inżynierską i wtedy chętnie wrócę do tematu Clojure + Eclipse Helios i podzielę się wrażeniami :) Ale dobrze wiedzieć, że jak będę miał z czymś problem, to mogę się do Ciebie zgłosić - "Czas i chęci to nie problem, bo tego mam wystarczająco wiele, aby się podzielić" :)

    OdpowiedzUsuń
  12. @Daniel, @Jacek: Zaznaczę od razu że nie znam Clojure. Moje ewentualne uwagi (absolutnie nie oskarżenia/zarzuty) wynikały z mojego dotychczasowego doświadczenia ze Scalą:

    1) brak narzędzi - żadne z testowanych przeze mnie pluginów (Eclipse, Netbeans - chyba najlepszy, IntellJ) nie był na tyle stabilny/dojrzały żeby oferować funkcjonalność zbliżoną do tej znanej z Javy lub chociaż z Groovy

    2) składnia - być może pozwala na tworzenie pięknego, zwartego kodu. Nie zgodzę się jednak ze zdaniem (pomimo że dotyczy Clojure, może być użyty jako argument na tak dla Scali):

    "Mamy niezmiernie krótki kod. Każda linia kodu to koszt: może w niej być błąd, ktoś musi ją dostosowywać gdy rozwija się kod i środowisko, ktoś musi ją czytać i rozumieć, zaczynając pracę nad kodem, ktoś musi zadbać o testy do niej. Dlatego im mniej kodu tym lepiej."

    Jest jakaś granica przy której kod staje się po prostu nie czytelny. Co z tego, że w 1 linijce zostanie wykonane to do czego innego języki potrzebują 10, skoro trzeba dopisać 10 linii komentarza aby "przyszłe pokolenia" programistów zrozumieli co tam się właściwie wyprawia

    3) problem z ludźmi - możemy sobie tłumaczyć, że ludzie mają problem z przestawieniem się z myślenia obiektowego na funkcyjne, dlatego języki te nie odniosły jeszcze sukcesu. Moim zdaniem są one po prostu zdecydowanie trudniejsze w nauce/zrozumieniu. Co z tego, że mój nowy projekt zostanie napisany w użyciem cool technologii, skoro zatrudnienie nowego, dobrego programisty z doświadczeniem znającego ten język będzie raz że kosztowne a dwa prawie że nie możliwe bo na rynku jest bardzo mało ludzi którzy znają tą technologie.

    Właściwie żaden z tych zarzutów nie dotyczy samego języka a bardziej biznesowej strony użycia go. Z pewnością są to świetne, dobrze rokujące technologie, jednak na tym etapie nie nazwał bym ich jeszcze dojrzałymi i osobiście długo bym się zastanawiał nad użyciem Clojure/Scali w projekcie. Być może żadna z tych uwag nie dotyczy Clojure - jeżeli tak prosił bym o sprostowanie.

    @Michał J: Po pierwsze proszę nie nazywać linku do Codemonkeyism.com trollowaniem. Wydaje mi się, żę Stephan Schmidt na to nie zasłużył. Po drugie ja też nie widzę przeciwwskazań. Pozostaje pytanie jaka jest ich zaleta/przewaga w stosunku do Javy/Groovy w przypadku aplikacji typowo klienckich (Vaadin) i gdzie trzeba konkurować z takim technologiami jak Php/Python/Ruby.

    OdpowiedzUsuń
  13. @Paweł Gdula:

    ad1. wydaje mi się, że jest wersja SLIME dla Clojure, chociaż przyznam się, że jej nie używałem... Korzystałem trochę z pluginu dla Community Edition IDEI i Eclipse i można było w tym normalnie pracować (nawet debugowanie działało).

    ad2. Scala to nie Lisp (chociaż wydaje mi się, że mylisz tutaj Lispa raczej z Perlem ;) - na tym polega urok dialektów Lispa (Common Lisp, Scheme, Clojure), że w rękach sprawnego programisty kod jest i krótki i czytelny.
    Ale to musisz sam sprawdzić żeby się przekonać - polecam na początek lekturę "ANSI Common Lisp" Paula Grahama.

    ad3. Fakt - Lisp nie jest językiem dla "average Joe programmer" jak np. Java. Jednakże, dobry programista, z radością nauczy się programować w języku, który sprawi, że będzie bardziej produktywny. Clojure robi się coraz bardziej popularne, także w Polsce. 20-kilka lat temu, było sporo programistów Lispa, więc to nie jest tak, że nie da się go nauczyć.

    OdpowiedzUsuń
  14. @t -- jak najbardziej jest SLIME dla Clojure. Bardzo używalne i bardzo wygodne. Korzystam na co dzień.

    OdpowiedzUsuń
  15. @Daniel - czyli można bardzo fajnie podmieniać kod też w rozwiązaniu z Vaadinem opisywanym powyżej... bo właśnie tego tam brakowało - jakiejś dobrej metodyki żeby nie robić co chwila redeploy'a aplikacji webowej.

    OdpowiedzUsuń