06 kwietnia 2014

O java.util.stream przez przykład(zik) z StackOverflow i Java 8 API

0 komentarzy
Istnieje wiele sposobów na poznanie nowego języka programowania i jednym z moich typów jest aktywność na StackOverflow. Można pokusić się na odpowiadanie na pytania (to stopień najwyższy wtajemniczenia), można “lajkować” (to stopień podstawowy), można edytować pytania i odpowiedzi uzupełniając je o dodatkowe informacje, które pozyskuje się z komentarzy czy wskazywać duplikaty (to stopień średniozaawansowany). Sprawdziło mi się to podczas nauki narzędzia sbt, więc kwiecień i kolejne kilka miesięcy zamierzam współdzielić z aktywnością w obszarze Java 8 (etykieta java-8 na StackOverflow).

W zależności od etykiety i dnia roboty może być na kilka minut aż do wielogodzinnej nasiadówy. Nie jest to zwykle łatwa robota początkowo, ale z czasem idzie coraz łatwiej, a i przyjemności coraz więcej. Aktywność dotyczy w równym stopniu pytań i odpowiedzi. Można również uzupełniać opisy etykiet.

Wszystkie aktywności na StackOverflow są nagradzane punktami reputacji, odznakami i wiedzą w temacie. W zasadzie brak wad.

O StackOverflow (i GitHub, twitterze oraz w promocji reddit) będę mówił podczas mojej prezentacji StackOverflow, GitHub i twitter jako narzędzia profesjonalnego rozwoju programisty na DevCrowd’14. Gorąco zachęcam do udziału.

Wróćmy jednak do nauki nowej wersji Java 8.

Kiedy dzisiaj do mojej skrzynki trafiło zestawienie pytań z etykiety java-8 było w nim tylko jedno pytanie - How to dynamically do filtering in Java 8?. Niefortunnie, nie należy ono do najbardziej pouczających, ale odpowiedź już tak. Stuart Marks, który jest autorem odpowiedzi, postarał się o sporą dawkę wiedzy nt. lambd i "pochodnych" w Java 8. Zdecydowanie warto zapoznać się z odpowiedzią.

Weźmy chociażby "This can't be done with a simple filter(predicate) construct on a stream.”

java.util.Collection<E> jest podstawowym interfejsem w kolekcjach w Javie (od momentu pojawienia się ich, już w Java 1.2!). Dotyczy to struktur danych takich jak zbiory, listy, kolejki i mapy.

Zmianą w Java 8 jest dodanie m.in. metody default Stream<E> stream(), która wprowadza nas w świat strumieni. Kolekcja, na której wywołamy stream(), będzie źródłem danych.
Stream<Integer> ints = Arrays.asList(1,2,3).stream();
Mając Stream jesteśmy w domu. Drzwi “streamowe” otwarte.

Wezmę na tapetę pierwszą metodę z tercetu funkcyjnego - filter (obok map i reduce). Jej sygnatura to filter(Predicate predicate)
ints.filter(...)
Niestety moja wiedza dotycząca wartości przekazywanej do filter jest znikoma, bo pojawia się kolejna klasa z Java 8 - java.util.function.Predicate. Warto zajrzeć do javadoc, w którym napisano:

"This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.”

Jakaś masakra! :) Kompletnie mi to nic nie mówi. Intelekt i wdzięk podpowiadają mi jednak, że gdzieś tam pojawiały się konstrukcje w stylu argument(y) -> ciało funkcji. To właśnie nazywają lambdą (a przynajmniej takie mam wyobrażenie jak taka lambda mogłaby wyglądać mając pewne doświadczenie w innych językach funkcyjnych - Clojure, Scala, F#).

Sprawdzam taką konstrukcję.
Stream<Integer> oddInts = ints.filter(n -> n % 2 != 0);
Powinienem otrzymać strumień liczb nieparzystych. Wciąż to jednak wyłącznie strumień i próba System.out.println na tym zwróci jedynie tekstową reprezentację referencji.
java.util.stream.ReferencePipeline$2@682a0b20
Pora zmaterializować strumień do strawniejszej postaci, np. wyświetlę wszystkie elementy strumienia.

Z pomocą przychodzi mi IntelliJ IDEA. Wystarczy napisać oddInts.forEach i wcisnąć Ctrl+Shift+Spacja, aby pojawiła się jedyna słuszna podpowiedź - o -> {}. I to jest dokładnie to, czego potrzebuję - mam wybór, ale zbiór niezbyt liczny, bo jednego elementu. Próbuję wypisać elementy na ekran z System.out.println.
oddInts.forEach(o -> System.out.println(o));
Ctrl+Shift+F10 w IntelliJ IDEA i dostaję na ekranie wynik:
1
3
Dokładnie taki, jaki oczekiwałem!

Ale to nie koniec. IntelliJ IDEA nie poprzestaje i podpowiada, że warto zamienić tę konstrukcję na...method reference. Nie mam pojęcia, o co chodzi, ale podążam za głosem IDEA. Alt+Enter i już jest.
oddInts.forEach(System.out::println);
Taki sposób nauki lubię. Chciałbym mieć jeszcze możliwość poznawania Java 8 API w środowisku REPL (na wzór Scali, F#, Clojure czy Groovy), ale to raczej pieśń przyszłości. Dobrze, że mam IntelliJ IDEA!

Pełna klasa gotowa do uruchomienia:
package pl.japila.java8;

import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> ints = Arrays.asList(1, 2, 3).stream();
        Stream<Integer> oddInts = ints.filter(n -> n % 2 != 0);
        oddInts.forEach(System.out::println);
    }
}
A jak Tobie idzie poznawanie Java 8 API? Chętnie posłucham rad bardziej wytrwałych, którzy pierwsze dni mają już dawno za sobą.

30 marca 2014

Java Platform, Standard Edition 8 wydane, więc nauki czas ponownie zacząć, co?

0 komentarzy
Java Platform, Standard Edition 8 (w skrócie Java SE 8 czy po prostu Java 8) jest już powszechnie dostępne. Wiele się zmieniło i pewnie nie tylko ja chciałbym wiedzieć, na ile Java 8 jest warta poznania, po tym, kiedy zarzucono ją na rzecz innych języków programowania - Clojure, Scala, Groovy. Ty też chciał(a)byś wiedzieć, co się zmieniło w najnowszej wersji Java 8? Najlepiej zacząć prosto u źródła - JDK 8 Release Notes lub What's New in JDK 8. Jest tego sporo do czytania, co może świadczyć o niemałych zmianach i dłużej nauce. Taka nasza informatyczna dola...

Pierwsza ciekawostka dla mnie to nazewnictwo - Java SE 8 vs JDK 8. Nie było to tak oczywiste, bo Java SE 8 to specyfikacja, a JDK 8 jej implementacją od Oracle. Jakoś wcześniej mi to umykało. Tak przynajmniej napisano w dokumentacji.

Mówi się, że najlepszym sposobem na naukę nowego języka jest po prostu korzystać z niego. Dotyczy to języka mówionego i dobrze sprawdza się również z językiem programowania. W ten sposób właśnie zamierzam poznać Java 8. Na swoim blogu proponuję pracę z IntelliJ IDEA 13. Właśnie kilka dni temu wyszła wersja 13.1.1 i wystarczy pobrać bezpłatną wersję Community Edition.

Przy założeniu, że Java 8 została zainstalowana, w IDEA wybierasz Create New Project, a później Java, wciskasz Next, aż pojawi się panel, w którym po raz pierwszy wybieramy Java 8 jako środowisko pracy.


Po stworzeniu projektu, upewnij się, że Project language level ustawiony jest na 8.0 - Lambdas, type annotations, etc.


Mając projekt można zacząć rozpoznawać Java 8 API. Od czego zaczniemy? Może java.util.stream?! A nie inaczej, skoro jest to (wraz z lambdami) jedna z ważniejszych zmian w tej wersji języka.

Za Collections Framework Enhancements in Java SE 8:

"Classes in the new java.util.stream package provide a Stream API to support functional-style operations on streams of elements. The Stream API is integrated into the Collections API, which enables bulk operations on collections, such as sequential or parallel map-reduce transformations."

Zaczniemy właśnie od Stream API, bo rozpoznając ten kawałek Java 8 nie sposób nie dotknąć innych zmian jak chociażby wspomniane lambdy.

Przez Collections Framework Enhancements in Java SE 8 dochodzimy do…i tu znowu cała masa dokumentacji. Zachęcam do lektury New and Enhanced APIs That Take Advantage of Lambda Expressions and Streams in Java SE 8.

Na tej stronie można doświadczyć pierwszego spotkania ze zmianami w Java 8:
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List listOfIntegers =
    new ArrayList<>(Arrays.asList(intArray));
    System.out.println("Sum of integers: " +
        listOfIntegers
            .stream()
            .reduce(Integer::sum).get());
Zacznijmy od tego kawałka.

Na początku rzuciło mi się, dlaczego new ArrayList<>(Arrays.asList(intArray)) zamiast po prostu Arrays.asList(intArray)? Pewnie jakaś ukryta wiedza magiczna.

Dla adeptów Java 8 nową metodą w java.util.List<t>, a dokładniej java.util.Collection jest default Stream stream(), który (za javadoc):

"Returns a sequential Stream with this collection as its source."

  1. Po pierwsze, co oznacza default przy sygnaturze?
  2. Po drugie, czym jest Stream?
  3. Po trzecie, skoro stream() zwraca “a sequential Stream”, to czy istnieje inny rodzaj Stream, np. non-sequential?
Wrócimy do tego niebawem.

29 marca 2014

IT Maverick Needed = DevOp to manage and evolve Polidea’s infra

0 komentarzy
Wierzę i wspieram możliwymi sposobami polskie firmy informatyczne. Szczególnie leżą mi na sercu firmy, które nie próbują być aktywne, ale faktycznie takimi są i mają wpływ na lokalne społeczności informatyczne.

Tym wpisem zaczynam pewien cykl promocji firm, z którymi warto zamienić słowo, kiedy poszukuje się pracy (albo nawet wcześniej, aby dowiedzieć się, jak wiele się traci siedząc, gdzie się siedzi obecnie). Taką firmą jest Polidea i kiedy +Jarek Potiuk zapytał mnie o możliwe znajomości w branży na stanowisko DevOp/SysOp, postanowiłem wesprzeć jego poszukiwania.

Panie i Panowie...oto ono...miejsce dla najlepszych w temacie zarządzania infrastrukturą. Zachęcam do kontaktu. Ja jestem za słaby, więc można mnie śmiało wykreślić z listy potencjalnych kandydatów na to stanowisko. Powodzenia życzę!



24 marca 2014

#Scalania 14 w @Javeo_eu - wirtualno-stacjonar­ne spotkanie z językiem #Scala w ramach @WarszawScala

0 komentarzy
Kolejne, 14-te spotkanie scalowe - scalania - pod sztandarami grupy Warszawa Scala User Group za nami.

Wspaniałym podsumowaniem spotkania jest komentarz +Anity Fronczak na meetupie:

"Fajnie, że cały czas usiłujemy stworzyć spotkania, na których uczymy się poprzez kodowanie, a nie prelekcje."
Przez chwilę tylko pomyślałem, aby pokusić się i nazwać to tradycją, ale...tradycją nazwać niczego nie możesz, bo...to co dookoła powstaje, od nowa, to jest nasza codzienność, w której my żyjemy. I to mnie cieszy, i to właśnie nazwałbym...naszą scalową codziennością. Nie brzmi zachęcająco, co? Bynajmniej! Można już mówić o stałych spotkaniach środowych w Warszawie, których celem jest wspólna nauka programowania w języku Scala. Firma Javeo ma znaczący udział w promowaniu Scali w Warszawie, a dzięki dostępowi do sieci i korzystaniu z Google Hangouts on Air, również i w każdym zakątku naszego globu.


W kanonie spotkań jest rozwiązywanie zadań z zestawu S-99: Ninety-Nine Scala Problems - dwa, czasami nawet trzy zadania. Czasami idzie nam sprawniej, a czasami trochę się przedłuża. Zawsze mam z tym problem, aby przydzielić temu czas, bo nawet stali bywalcy, którzy niejednokrotnie już rozwiązywali te zadania - ukłon w stronę +Rafała Krzewskiego czy +Grzegorza Kubiaka czy +Piotra Trzpila - mają z tym niemały problem. I to jest dobre! Każdy może dołączyć do nas, do bywalców i tych rzadziej uczestniczących w spotkaniach w dowolnym momencie i liczyć, że będzie mógł odnaleźć się w towarzystwie. Klimat spotkań zachęca do dyskusji i aktywniejszego udziału (nieprawdaż +Dominiko Biel, nieprawdaż +Dominiku Wiernicki?)


Firma Javeo zapewnia miejsce z dostępem do sieci oraz napoje i pizze (w tym wegetariańską). W ten sposób mamy zagwarantowane 20 minut na przerwę, w której dyskutujemy o rzeczach ważnych i mniej ważnych. Zwykle przeciąga się to do 30, a nawet 40 minut. Wcale nie traci na tym wiedza scalowa, bo jest to moment, w którym wciąż dyskutujemy o sprawach scalowych, w mniej formalnej atmosferze - poza czasem antenowym, tj. poza Google Hangouts on Air.


Ogromne podziękowania należą się +Grzegorzowi Kubiakowi, Magdzie i szefostwu Javeo za udostępnienie nam miejsca i zapewnienie wyżywienia podczas naszych scalań.


Na ostatnim spotkaniu, zaraz po przerwie żywieniowej, "dorobiliśmy" się nowej pozycji w ramówce spotkań - 15-minutówce o szkielecie aplikacyjnym Akka. Tym razem +Andrzej Goławski wprowadził nas w temat jak się zabrać za Akkę. I to jemu również należą się brawa za pomysł! To kolejne wystąpienie Andrzeja podczas spotkań scalowych i widać, że za niedługo będzie z uśmiechem wspominał pierwsze kroki w wystąpieniach publicznych. Idzie mu zupełnie dobrze i tylko czekać, aż się weźmie za dłuższe i bardziej zaawansowane tematy podczas swoich prezentacji. Uważam go za ciekawą personę na scenie społecznościowej w Warszawie (hint: warto zaprosić go na jakąś prezentację już teraz zanim...nie dopchasz się do niego!).


Po Acce, zaproponowałem kolejne potyczki scalowe ze Scala API. Na tapetę wzięliśmy napisanie od zera metod Seq.takeWhile oraz Seq.grouped. Co ciekawe, przy ich pisaniu można było nauczyć się innych. Duże brawa dla +Grzegorza Kossakowskiego za kompetentną pomoc przy ich pisaniu. Udział Grzegorza jest zawsze witany z dużym aplauzem, bo nietrudno zauważyć jego nieprzeciętną wiedzę w obszarze zachowania kompilatora Scali. Bardzo podoba mi się taki sposób poznawania samego języka oraz biblioteki standardowej Scala API i to z pewnością będzie stałym elementem spotkań. Zawsze weźmiemy sobie jedną-dwie metody na tapetę i wspólnymi siłami spróbujemy je napisać od zera.


Tak zeszło nam do końca spotkania, które zakończyło się wyjątkowo o 20:30. Późno, ale szukać ze świecą tego, komu mogło się nudzić (przynajmniej ja takowych nie zauważyłem, a że specjalnie nie szukałem, więc...nieważne).


Zachęcam do udziału w spotkaniu w biurze Javeo lub zdalnie. Proszę o kontakt osoby zainteresowane udziałem zdalnym, którzy jednocześnie chcieliby mieć możliwość zabrania głosu podczas spotkania. Google Hangouts on Air pozwala na to, jedynie specjalnie zaproszonym osobom. Dziękuję dotychczasowym zdalnym. Pracuję nad większym Waszym udziałem, ale bez Twojej pomocy będzie mi znacznie trudniej.

Nagrania ze spotkań - przed i po lunchu - dostępne są na stronie spotkania - #Scalania 14 at #Javeo (formerly Javart) - part ONE oraz #Scalania 14 at #Javeo (formerly Javart) - part TWO (właśnie udało mi się odkryć, że można przypisywać zdjęcia jako tło do nagłówka spotkania - cudnie!)

Zapraszam wszystkich na kolejne spotkanie, które odbędzie się 2 kwietnia w siedzibie Javeo na Postępu. Podczas spotkania będziemy mieli okazję wysłuchać +Ewę Waliczek, która wprowadzi nas w tajniki Akki. Będzie to pierwsze żeńskie wystąpienie na deskach Warszawa Scala UG! Poza tym, gwarantowana dobra zabawa ze sporą dawką scalania.

Do zobaczenia!

19 marca 2014

O sbt dla SilesiaScala zdalnie (via Hangouts on Air)

0 komentarzy
Prace nad odpaleniem zdalnej prezentacji o sbt (narzędziu do zarządzania budowaniem projektu z użyciem języka Scala) trwały od 18 stycznia, kilka dni po tym, kiedy +Silesia Scala oznajmiła na twitterze, że przyjmuje zgłoszenia tematów związanych ze Scalą.


Od kilku miesięcy siedzę przy sbt i szukam różnych miejsc sprawdzenia się w boju z moją znajomością tematu. Chciałbym móc pochwalić się wieloma projektami, ale poza jednym produkcyjnym projektem w mojej firmie z użyciem sbt, moim głównym źródłem wiedzy są pytania na StackOverflow pod szyldem sbt. Właśnie wczoraj otrzymałem odznakę sbt za uzyskanie 100 punktów za 20 odpowiedzi, co jest dla mnie istotnym osobistym osiągnięciem.

Moją aktywność na SO traktuję jako swego rodzaju projekt, w którym dotykam problemów, z którymi mógłbym nawet nie mieć styczności podczas swoich (projektów). Zrozumienie opisów przedstawionych problemów jest dla mnie samo w sobie wyzwaniem, a co tu mówić o znajomości sbt na poziomie umożliwiającym podanie rozwiązania. Doszło już do tego, że nierzadko zaglądam do kodów źródłowych narzędzia, aby zrozumieć jego zachowanie, a że znajomość Scali wciąż u mnie na poziomie podstawowym, więc nie jest lekko.

Wszystko to sprawiło, że pomyślałem, że mógłbym spróbować swoich sił w roli prelegenta na +Silesia Scala i przedstawić (swoje rozumienie) sbt. Chwyciło!

I tak się zaczęło, a wczoraj zrealizowało.

Zawsze byłem i jeszcze długo będę orędownikiem takich aktywności zdobywania wiedzy, a że nigdy tego za mało, przypomnę się ponownie. Zachęcam do takich inicjatyw każdego, komu leży na sercu dzielenie się wiedzą pro publico bono (z oczywistym zyskiem podniesienia swojego rozpoznania danego tematu). Warto potraktować publiczne wystąpienie jako inny rodzaj projektu, w którym wiedzy z pewnością nigdy za wiele. Zawsze znajdzie się pytanie, na które odpowiedź będzie przyczynkiem do przekroczenia bariery swojej znajomości tematu. I to jest dobre!

Osoby, które mają ze mną bliższy kontakt doświadczyły niejednokrotnie realizacji mojego motto, które brzmi:

"Każdy ma wystarczająco dużo wiedzy, aby móc się nią podzielić z innymi"

Innymi słowy, nie trzeba być ekspertem w wybranym obszarze, aby móc podzielić się już pozyskaną wiedzą.

Niestety, doświadczyłem niejednokrotnie na własnej skórze, że oczekiwanie jest zwykle, że prelegent wie więcej niż wszyscy słuchacze lub co najmniej od większości na sali. To niestety ma tę wadę, że nie zachęca do prezentacji swojej wiedzy, którą zwykle (zawsze?) uważamy za niewystarczającą do publicznej ekspozycji. Z drugiej strony słabe przygotowanie tematyczne może spotkać się z dezaprobatą i brakiem zainteresowania kolejnymi prezentacjami tej osoby w przyszłości, do której przylgnie nalepka "nauczyć się od niej raczej niemożliwe". Trzeba znaleźć balans między doskonałością a przeciętnością. Przykre to o tyle, że tworzy się impas i trzeba dużej odwagi i samooceny, aby w końcu zechcieć wystąpić publicznie. Nie wspominając, że Ci, którzy mają wiedzę, zwykle nie mają czasu lub ochoty lub po prostu nie widzą sensu dla takich praktyk. I to też jest problemem, bo nie ma wielu do wzięcia na siebie brzemienia krzewienia wiedzy i pracy u podstaw. "Wszystkich nie zadowolisz" jak mawiają.

Dla mnie wczorajsze spotkanie było niezwykłym sprawdzianem swojej wiedzy z sbt. Starałem się zachować umiar w moich ochach i echach odnośnie sbt oraz zachować ogólny spokój w sposobie przedstawiania tematu. Mam tendencję do przedobrzania i zbytniego entuzjazmu w podejmowaniu się wyzwań podczas prezentacji, głównie w postaci podejmowania się rozwiązywania problemów, z którymi nie miałem do czynienia wcześniej podczas publicznych wystąpień, co ma tę wadę, że nierzadko prowadzi do wpadek, które źle poprowadzone kończą się niższymi ocenami uczestników. Trzeba być ostrożnym. Wpadłem bodaj trzykrotnie, aczkolwiek odpuściłem wyłącznie, aby nie zajmować uczestników rozwiązaniami, których wartość merytoryczna była znikoma, a czas poświęcony ogromny. Lubię stąpać po obrzeżach swojej wiedzy, ale zbytnia frywolność związana z czasem "antenowym" jest niewskazana.

Co uważam za największe osiągnięcie wirtualnej prezentacji sbt, to panowanie nad czasem poszczególnych kawałków prezentacji, między którymi pozwoliłem sobie na angażowanie publiczności do zadawania pytań, czy po prostu zajmowania stanowiska. Było ciekawie i pytania publiczności pozwoliły mi uzupełnić prezentację sbt o elementy, których nie miałem w planach i nie uważałem za istotne.


Pełne nagranie spotkania znajduje się na kanale YouTube grupy Silesia Scala. Zachęcam do obejrzenia i przesłaniu swoich uwag, które wykorzystam do uzupełnienia swoich braków prezentacyjnych oraz w sbt. Bardzo, bardzo proszę o przesłanie uwag, bo moje ego nie pozwala mi dostrzec wad, nad którymi powinienem popracować. Bez Twojej pomocy będzie mi ciężko, jeśli w ogóle możliwe.

Dziękuję grupie +Silesia Scala, a w szczególności panom +Henryk Konsek, Pawłowi Sołtyskowi za organizację spotkania i umożliwienie poprowadzenia sesji na temat sbt. Dodatkowe podziękowania należą się Andrzejowi za pytania dotyczące sbt 0.13.0 oraz Marcinowi Kubale za zdalny udział w spotkaniu i zadawanie pytań. Dziękuję pozostałym uczestnikom za wytrwanie do końca, co pozwala mi sądzić, że prezentacja mogła być wartościowa chociaż dla części. Dziękuję!

Więcej informacji, w tym zdjęcia ze spotkania, znajdują się na stronie spotkania na meetupie grupy Silesia Scala User Group. Wierzę, że to nie jest moje ostatnie wystąpienie na deskach SSUGa i chętnie wystąpię u innych grup scalowych i javowych w Polsce.

01 marca 2014

Jamie Allen about Effective Akka po angielsku

0 komentarzy
W nadchodzący poniedziałek, 3 marca 2014 od godziny 18:00 na Wydziale Matematyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego (MIMUW) w sali 5440 odbędzie się spotkanie warszawskiego grupy scalowej, w którym gwiazdą wieczoru będzie pracownik Typesafe (firmy stojącej za językiem Scala) - Jamie Allen, który opowie o szkielecie aplikacyjnym Akka.

Więcej bieżących informacji znajduje się na meetupie Jamie Allen about Effective Akka.

Udział w spotkaniu na chwilę obecną potwierdziło 28 uczestników oraz trzech sponsorów, którzy zadbają o oprawę spotkania - strawę, napoje oraz książki o Acce. Kiedy tylko pomyślisz o Scali w Polsce, powinno być już dużo łatwiej zdecydować, do których firm należy skierować swoje kroki w poszukiwaniu interesujących projektów z tym językiem.




Dziękuję w imieniu swoim i uczestników!

25 lutego 2014

Jak zacząć naukę programowania w języku Scala

0 komentarzy
Zostałem zapytany, co ze stron lub książek polecałbym na początek nauki programowania w języku Scala. Pomyślałem, że jest to dobry materiał na wpis, a że nie mam weny, będzie krótko (niech to stanowi pożywkę do dalszych pytań, do których gorąco zachęcam).

Teoria

Polecam zapoznać się z dokumentacją, która dostępna jest na oficjalnej stronie języka - LEARN. Na pewno GETTING STARTED oraz Tutorials. Dla polskojęzycznych polecałbym książkę mojego kolegi +Grzegorz Balcerek Język programowania Scala. Wydanie 2 oraz Programming in Scala, First Edition (bo jest dostępna bezpłatnie i pisana przez samego autora).

Praktyka

Po tej dawce niezbędnej wiedzy programistycznej z języka Scala proponuję trochę praktyki - mój projekt scalania.

Podsumowanie

W pakiecie jest sporo wiedzy teoretycznej i nie mniej praktycznej. Powinien zaspokoić najbardziej wybrednych. Dla bardziej wymagających mam zadanie odpowiadania (pewnie początkowo "moderowania") na pytania na StackOverflow w kategorii scala.

Potrzebujesz więcej? Skontaktuj się ze mną na priv. Chętnie poprowadzę.