Czekałem i wreszcie się doczekałem! Zakończenia książki, zakończenia artykułów o Kotlinie i napisania rzetelnej jak tylko mogę recenzji o samej książce, od której zaczerpnąłem tyle cennych informacji. Interesuje Was zakup książki "Kotlin. Rusz głową!"? Zanim się zdecydujecie, sięgnijcie po opinię człowieka, który przeczytał ją od deski do deski. Wyłapałem kilkanaście nieprawidłowości dlatego tym bardziej zapraszam Was do przeczytania, abyście zweryfikowali swoją decyzję!

O "KOTLIN. RUSZ GŁOWĄ!" BEZ ŚCIEMY

Książka autorstwa wydawnictwa "O’Reilly" raz kolejny dała nam "świeże mięsko" informatycznej wiedzy. Ponad czterysta stron wiadomości na temat składni Kotlina pochłonęło mi ponad 3 miesiące życia, żeby przeczytać każde zdanie ze zrozumieniem. Jednak wcale nie żałuję. Jednym zdaniem, książka absolutnie się nadaje do nauki podstaw języka Kotlin. W ciągu kilku miesięcy każdy z Was może stać się co najmniej świadomym programistą w Kotlinie.

JAK OCENIAM TRUDNOŚĆ KSIĄŻKI?

Większość tematów to same podstawy. Od razu piszę, że jeśli umiecie Javę w stopniu zadowalającym, to pierwszą połowę książki oblecicie na pstryk! Jest co prawda wprowadzenie drobnych nowości czy modyfikacji w składni jednakże wystarczy zwracać uwagę na drobiazgi, a wyjdzie na to że polubicie Kotlina za możliwość "wysłowienia się" w mniejszej ilości kodu, w porównaniu do Javy.

Schody zaczynają się robić od rozdziału dziewiątego, kiedy czytelnik poznaje kolekcje. To od tego momentu musiałem się częściej zatrzymywać, aby ułożyć sobie w głowie przeczytaną treść. Choćby dlatego, że tam kolekcje dzielą się na modyfikowalne i niemodyfikowalne. Javie to "było wszystko jedno" (nie ma tam podziału na "ArrayList" i "MutableArrayList"), a tutaj proszę - wreszcie coś nowego! Dodatkowo miałem troszkę kłopotu z poznawaniem nowych metod oferowanych przez kolekcje. Coś, do czego programiści Javy już się przyzwyczaili kreować samodzielnie, jest dostępne w Kotlinie i chyba ta świadomość że to jest wszystko gotowe, trochę mnie zdezorientowała. Mało tego, część jest już obecnie zdeprecjonowana i nieaktualna, i to tym bardziej mi namieszało w głowie (szczegóły niżej).

Ze wszystkich rozdziałów, największy zawrót głowy dał mi rozdział X ("Odróżniaj wariancję od kontrawariancji"), czyli typy generyczne. Tam jedna strona zajęła mi tyle czasu, co dwadzieścia stron tych pierwszych rozdziałów! Ponadto kilkadziesiąt pisanych kodów źródłowych, tylko po to aby się upewnić że to dobrze rozumiem. To była najtrudniejsza próba!

WYKRYTE BŁĘDY

I tak jak wtedy, tak i teraz zostawię klauzulę informującą, że znalezione błędy w książce "Kotlin. Rusz głową!" i ich przytoczenie nie mają na celu obrażanie albo wyśmiewanie twórców tej wspaniałej książki, dzięki której opanowałem podstawowy zakres wiedzy w kierunku języka Kotlin. To ma mieć jedynie charakter informacyjny!

Zaczynajmy!

NIEAKTUALNY KOD "ANIMALS"

Na stronie 176 jesteśmy świadkami ludzkiej pomyłki odnośnie aktualnego stanu kodu źródłowego. Chodzi mianowicie o to, że prezentowana wersja kodu dotyczy omawianej treści sprzed kilkunastu stron wcześniej. Na stronie 164 podana jest wersja kodu źródłowego już ze zmienionymi słowami kluczowymi danych składowych i metod (zamiast otwartych, są abstrakcyjne), a na wspomnianej 176 stronie są przestarzałe już modyfikatory (miały być abstrakcyjne, a są otwarte), chyba że był to zamiar celowy, aczkolwiek mało prawdopodobne skoro doświadczyłem takiego manewru tylko jeden jedyny raz na całą literaturę.

NIEWIADOMA NAZWA FUNKCJI

Strona 181. Wzmianka o hipotetycznej metodzie interfejsu o nazwie "makeNoise". A nie, przepraszam! "makeItem". Jednak nie, w przykładzie jest inaczej i w treści inaczej. To w końcu "makeNoise" czy "makeItem"?

IDE PRZEDWCZEŚNIE NIE DOPUSZCZA DO KOMPILACJI (I SŁUSZNIE)

Po przepisaniu kodu ze strony 236, nie mogłem go nawet skompilować. Ze względów dydaktycznych celowo prowokuje się zgłoszenie wyjątku po skorzystaniu z asercji wartości niepustej na wartości "null". Bardzo słusznie, że nie dopuszcza się do kompilacji tylko książka mogła "uprzedzić", że tak się stanie gdyż powstaje zakłamanie odbiorcy. Zamiast spowodowanie zgłoszenia wyjątku o którym jest napisane, nie dojdzie do niczego ze względu na śmierdzącą instrukcję podstawiającą wartość "null", która nie pasuje kompilatorowi. Możliwe, że w czasie pisania książki "Kotlin. Rusz głową!", program akceptował ten stan rzeczy i robił swoje jak zwykle, i dopiero po jej wypuszczeniu ulepszono wykrywanie takich "kwiatków".

MYŚLĘ O "HASHCODE", PISZĘ O "EQUALS"

Na stronie 267 natrafiłem na kolejny błąd. Komuś się pomyliły funkcje "hashCode" z "equals". Tam pada takie zdanie:

"Domyślne działanie funkcji »equals« polega na zwracaniu unikalnej liczby całkowitej dla każdego obiektu."

Czy przypadkiem nie chodziło o "hashCode"? Przecież kod mieszający jest liczbą całkowitą, a "equals" z tego co wiem, to zwraca wartość boolowską (prawdę lub fałsz). To już bym potraktował jak żółtą kartkę, bo książka w tym momencie "wrabia" czytelnika, że funkcja robi coś, co robi inna. Niech za dodatkowy dowód posłuży to, iż w kolejnym podpunkcie jest powtórzenie tej samej nazwy "equals" i tam jest już napisane poprawnie co ona robi.

ZMIENNA TAKA CZY OWAKA?

Znowu pomyłka w nazewnictwie. Na stronie 319 mamy dwie nazwy tej samej zmiennej na przedstawianym kodzie źródłowym do przepisania. Jest utworzona zmienna "petVet" jednak później do listy dodawana jest zmienna "petVal", ale taka nie istnieje!

BRAK SPOLSZCZONEJ NAZWY PRZEKAZYWANEGO ŁAŃCUCHA ZNAKÓW JAKO PARAMETRU FUNKCJI

To już prawdopodobnie błąd tłumacza. W treści jednego z kodów źródłowych dotyczących lambd, znajduje się przykładowe użycie funkcji, która w efekcie końcowym ma zamienić kilogramy na funty. Oczekując parametru w postaci łańcucha znaków, została podana oryginalna nazwa "KgsToPounds" gdzie w całej reszcie jest już spolszczona ("KgNaFunty"), w efekcie czego funkcja po uruchomieniu nie zadziała jak powinna, bo działanie jest uzależnione od wartości literału. Wspomniana usterka zauważona na stronie 355.

NIERÓWNOŚĆ W NIERÓWNOŚCIACH

Tak delikatna różnica trudna do wychwycenia, natomiast mnie udało się ją wykryć. Kierując się do strony 373, możemy ujrzeć warunek w wyrażeniu lambda, w którym znajduje się znak "większy bądź równy od" (nie chcę za dużo spoilerować). Co ciekawe, stronę wcześniej jest ten sam warunek tylko znak jest już typu "większy od". Dla informacji, chodzi mi o właściwość o nazwie "unitPrice". Taką bzdurę można jednak całkowicie darować, gdyż pojawiła się tylko jeden raz (strona 372).

NADGORLIWOŚĆ NA WYJŚCIU

Strona 378 prezentuje treść na strumieniu wyjściowym po uruchomieniu programu (w tej książce nazywa się to "Jazda próbna"). Problem polega na tym, że jest tego za dużo niż być powinno! Jak do tego doszło? Książka "nakazuje" usunąć stary kod i zastąpić go nowym, ale zaprezentowane wyniki są połączeniem obu tych kodów, w wyniku czego powstaje więcej niż jest w rzeczywistości. Błąd średniej wagi a nie lekkiej (moim zdaniem), gdyż trzeba było zmniejszyć czcionkę tekstu, aby zmieściły się treści wyników obu kodów naraz, przez co staje się mniej czytelny. Na szczęście to tylko cztery wiersze na wyrost, zatem...pół biedy.

PLĄTANINA W ZEZNANIACH

Ostatni "bug" znaleziony przeze mnie to strona 423 i kolejne poplątanie nazw zmiennych pomiędzy kodem źródłowym, a wspomnieniem o niej w tekście stanowiącym podpowiedź albo informację. W kodzie jest zmienna "myMessage", a w opisie po prawej stronie jest mowa o "myMessageType" (występuje taka zmienna tuż przed wyżej wymienioną więc prawdopodobnie stąd doszło do pomyłki). Ponieważ nazwy są do siebie podobne, da się to jeszcze tolerować. Być może chodziło o odniesienie się do tej poprzedniej zmiennej, jednak uznałem to za pomyłkę ze względu na pogrubienie zmiennej "myMessage", a nie "myMessageType", a w "Kotlin. Rusz głową!" pogrubia się fragmenty kodów, na które chce się zwrócić uwagę czytelnika.

LITERÓWKI

A teraz mały "kalejdoskop" znalezionych przeze mnie literówek, o których wiedza przyda się najbardziej tym, którzy będą odpowiedzialni za ewentualne kolejne wydanie książki.

  1. "[...] w odróżnieniu do [...]", zamiast "[...] w odróżnieniu od [...]" (strona 185)
  2. dwukrotny zapis "Scenariusz A", zamiast "Scenariusz A" i "Scenariusz B" (strona 225)
  3. "[...] od zakresu do 0 do 100", zamiast "[...] od zakresu od 0 do 100" (strona 244)
  4. "[...] która nie dopuszcza występowania duplikatów.", zamiast "[...] która nie dopuszcza do występowania duplikatów." (strona 264)
  5. "mutableListOf<", zamiast "mutableListOf(" (strona 293, nawias kątowy zamiast okrągłego)
  6. "Mam jeden parametr typ Int [...]", zamiast "Mam jeden parametr typu Int [...]" (strona 327)
  7. "gorceries", zamiast "groceries" (strona 372)
  8. "To jest początkowa list »groceries«", zamiast "To jest początkowa lista »groceries«" (strona 373)
  9. "Smutno nam, że już nasz [...]", zamiast "Smutno nam, że już nas [...]" (strona 395)
  10. "[...], by reszta kodu czkała [...]", zamiast "[...], by reszta kodu czekała [...]" (strona 397)
  11. "powinna oddawać [...]", zamiast "powinna dodawać [...]" (strona 412)

KSIĄŻKA POWOLI SIĘ DEZAKTUALIZUJE…

To nie wszystkie wady książki "Kotlin. Rusz głową!"! Niestety muszę jeszcze podzielić się z Wami taką prawdą, że niewielka część informacji jest już nieaktualna i kod w chwili obecnej jest traktowany jako zdeprecjonowany (nieaktualny, zastąpiony nową treścią). Na szczęście tak było tylko w niewielkiej części przypadków. Oto znalezione przeze mnie "grzechy główne":

  1. funkcje wyższego rzędu
    1. minBy (zdeprecjonowana - teraz używa się "minByOrNull")
    2. maxBy (zdeprecjonowana - teraz używa się "maxByOrNull")
    3. sumBy (zdeprecjonowana - teraz używa się "sumOf")
    4. sumByDouble (zdeprecjonowana - teraz używa się "sumOf")
  2. uruchamianie koprocedury za pomocą wywołania "GlobalScope.launch"; wyszło w jednym z blogów twórców, że funkcja może prowokować wycieki pamięci (sam "IntelliJIDEA" to zgłaszał)!
  3. "KotlinTest"
    1. nie istnieje już ta sama wtyczka o tej nazwie – teraz brzmi ona "Kotest"
    2. brak informacji na temat instalacji w narzędziu "Gradle" przez co miałem trudności w prawidłowym zainstalowaniu i ostatecznie nie udało mi się skompilować przykładowego kodu

Twórcy Kotlina wyjątkowo szybko zapylają z aktualizowaniem języka, bo książka wcale nie jest jeszcze taka stara (polskie wydanie pochodzi z 2020 roku, a oryginał powstał w 2019 roku), a już powstały problemy w wyżej wymienionych podpunktach przez dezaktualizację.

CZY KSIĄŻKA JEST WARTA ZAKUPU?

A teraz odpowiedź na pytanie, na którą każdy z Was czeka. Czy książka "Kotlin. Rusz głową!" jest warta uwagi? Moja odpowiedź brzmi: TAK!!! Mimo tych błędów, mimo literówek i mimo pewnych nieaktualnych już informacji stanowiących może jakieś 5% całości, nadal mogę rekomendować tę książkę każdemu, kto po prostu chce umieć Kotlina. Co prawda, doświadczeni w języku Java będą się trochę nudzić gdyż zawarte zostały informacje teoretyczne o tym, czym jest polimorfizm, klasa abstrakcyjna i tak dalej, natomiast warto się poświęcić dla fragmentów "premierowych", których nie ma w Javie. Znajdziecie tu wystarczającą ilość informacji, żeby poznać podstawy, przejść do tematów zaawansowanych i zapoznać się powierzchownie z paroma rzeczami, które zostały tylko wspomniane w dodatku na końcu. Ja w każdym razie jestem zadowolony po jej przeczytaniu i wierzę, że też będziecie.

Kotlin. Rusz głową!

"Kotlin. Rusz głową!" to ponad czterysta stron wiedzy merytorycznej na temat języka Kotlin podzielonych na 12 rozdziałów i trzy dodatki.


Finito! Tym artykułem zamykam na cztery spusty kategorię artykułów Kotlina. Nie przypuszczałem, że wyjdzie ich ponad siedemdziesiąt sztuk niemniej jednak uważam, że poszło całkiem sprawnie mimo przerw po wyczerpaniu organizmu i przebytej chorobie. Niech te materiały dobrze Wam służą, a w przyszłości pomyślimy o dalszym rozwinięciu, bo nadal jest o czym napisać!

PODOBNE ARTYKUŁY