16 lutego 2013

Scala i programowanie funkcyjne. Wprowadzenie cz. 2

Nie spodziewałem się, że ów "concise, elegant, type-safe programming language that integrates object-oriented and functional features", którego zwią Scala może mnie tak zmęczyć umysłowo. Kiedy dzisiaj wróciłem do domu po drugiej części szkolenia "Scala i programowanie funkcyjne. Wprowadzenie" Grześka Balcerka miałem wszystkiego serdecznie dość.

Scala trywialnym językiem zdecydowanie nie jest.

Tydzień temu ruszyliśmy z tematem nauki Scali i w 11 osób plus prowadzący Grzesiek popróbowaliśmy się z kilkoma problemami programistycznymi. Dzisiaj kontynuacja - dosłownie i w przenośni. Kiedy pojawiło się zadanie z kontynuacjami (przy realizacji zadania z trampoline), już byliśmy po zadaniu stworzenia listy bez listy i innych mniej lub bardziej intensywnych umysłowo zadankach. Czuję, że dzisiejszy dzień był wartościowy "emocjonalnie", bo Covariance and contravariance w Scali oraz górne i dolne ograniczania akceptowalnych typów w parametryzowanych typach nie pozostawiły we mnie nadziei na szybkie wejście w temat zrozumienia systemu typów w Scali. Będzie trzeba jeszcze posiedzieć i podumać. I to z pewnością nie będą dni, a całe tygodnie, jeśli nie miesiące!

Wspólne męki ze zrozumieniem tematu jednoczą i grupa podejmowała wyzwania implementacji typów w sposób godny i z wysoko podniesioną głową :-)

Dzisiaj wdrożyliśmy podejście, w którym najpierw zmagamy się z zadaniem samodzielnie, aby po kilku upadkach i, przynajmniej dla niektórych, szczęśliwym Happy Endem, wspólnie podjąć się jego rozwiązania i tym samym uzupełnienia braków. W końcu co dwie...tzn. jedenaście głów, to nie jedna i zawsze ktoś z czymś wyskoczy i rozwinie się dyskusja.

Ten aspekt właśnie najbardziej mi się spodobał. Już dawno nie uczestniczyłem w sobotnim "zgrupowaniu" programistycznym i widzę, jak bardzo pomocne jest poznawanie języka (Scala) wspólnie. Ktoś coś zapyta, ktoś coś zarzuci i już jest dyskusja. Możliwość spędzenia z językiem całej soboty i w gronie innych zapaleńców uważam za bezcenne. Dziękuję Panowie za miłą atmosferę. Warto było poświęcić dwie soboty z Wami i z nią! :-)

Trudno powiedzieć, czy to zasługa prowadzącego - Grzegorza Balcerka - czy grupy, czy materiałów, języka, czy jeszcze czegoś innego, ale udział w tym projekcie szkoleniowym dał mi tak wiele, że trudno mi teraz pisać o niedociągnięciach (jeśli w ogóle takowe były). Za bardzo jestem podekscytowany, aby pamiętać o nich. Przyjmijmy, że jeśli były, to stanowiły tak niezauważalną część, że szkoda byłoby się silić na ich wypisywanie. Błahostka.

Najbardziej utkwiła mi część związana z Covariance and contravariance w Scali. Pewnie dlatego, że jest to nowe i na pierwszy rzut oka niezwykle skomplikowane. Cały system typów w Scali może przyprawić o ból głowy! Ale mnie to nakręca i skoro jest trudno, ja w to wchodzę!

Podczas wyjaśniania +T czy -T w połączeniu z >: i <: w Scali nietrudno było dostrzec biegłość Grześka w posługiwaniu się tymi "narzędziami". Nie była to wiedza ze slajdów, ale bardziej projektowa (chociaż Grzegorz nie wspominał o jakimkolwiek projekcie scalowym, w którym brałby udział, a jedynie wspominał o intensywnej pracy umysłowej - niektórym jakoś tak łatwiej przychodzi rozumienie problemów niekoniecznie rozwiązanych na placu boju). Fascynuje mnie ta mnogość niespotykanych wcześniej konstrukcji programistycznych. Przy każdym spotkaniu z Clojure co krok olśniewa mnie, jak można ciekawie rozwiązywać problemy przy pomocy programowania funkcyjnego. Teraz procentuje to łatwiejszym przyswajaniem funkcyjnej części Scali - wiele rzeczy, które sprawiały trudność grupie, dla mnie była oczywista. Dziękuję Clojure za twórczą znajomość.

Jak napisałem wcześniej - Scala jest trudna i pewnie dużo jeszcze upłynie czasu zanim rozważę zmianę zdania. Chylę czoła przed osobami, które śmiało przyznają się do porażki w jej poznaniu, a jeszcze bardziej przed tymi, którzy wiedzą, co w trawie piszczy. Szczęśliwie mnie to nie zraża i nie zamierzam składać broni. Bynajmniej. Po szkoleniu Grześka Scala wchodzi na plan pierwszy językowo (wybacz Clojure, niedługo wrócę do Ciebie, ale teraz są ważniejsze sprawy do poznania). Wciąż patrzę na Scalę przede wszystkim przez jej funkcyjne oblicze i w ten sposób utrzymuję kurs obrany kilka lat temu, kiedy postanowiłem zrozumieć zalety programowania funkcyjnego jako uzupełnienie lub nawet alternatywę dla programowania imperatywno-obiektowego. Teraz jeszcze dochodzi bagaż systemu typów (który Gilad Bracha określił jako...dokumentację i mniej nieistotny przy projektowaniu nowego języka Dart!)

Co mnie w tym wszystkim zdumiewa, to wszechobecna akceptacja Scali, który pomimo trudów okiełznania systemu typów i składni Scali, staję się coraz częściej językiem alternatywnym u programistów javowych, zamiast wejścia w...Clojure, który, przyznaję, wprowadza inną składnię, ale twierdzę, że mimo wszystko jest duuuużo prostszym językiem?!

Wracam do projektu scala-exercises. Zachęcam do udziału i wspólnej zabawy.

p.s. Dwa dni temu wyszła Scala 2.10.1-RC1, które ma być "designed to be a drop-in replacement for 2.10.0." Wciąż jeszcze mam wybór wersji języka, więc szybko uaktualniam. I Ty również nie czekaj, zanim nie będzie za późno.

1 komentarz:

  1. Jeśli chcesz "posiedzieć i podumać" nad typami ogólnymi to proponuję takie zadanie:
    Weźmy typ funkcji jednoparametrowej: A => B.
    Jak zdefiniować każdy z tych dwóch parametrów typu: jako kowariantny? kontrawariantn? ani taki ani taki?
    Jak byś je zdefiniował? A +A -A B +B -B ?
    Weźmy na przykład typ AnyVal => AnyVal.
    Czy w miejscu gdzie jest on wymagany możemy użyć funkcji mających następujące typy:
    Any => AnyVal
    AnyVal => Any
    Int => AnyVal
    AnyVal => Int
    Int => Any
    Any => Int
    ?
    Jak chcesz to podumaj sobie nad tym :)

    OdpowiedzUsuń